if(end < card_start_address(card_index))
{
start = gen->starts.find_object_containing_card(card_index - gen_start_card);
- binary_start = start + parent->binary_payload_start((object *)start);
+ binary_start = start + ((object *)start)->binary_payload_start();
end = start + ((object *)start)->size();
}
start = gen->next_object_after(start);
if(start)
{
- binary_start = start + parent->binary_payload_start((object *)start);
+ binary_start = ((object *)start)->binary_payload_start();
end = start + ((object *)start)->size();
goto scan_next_object;
}
}
}
-void factor_vm::primitive_size()
-{
- box_unsigned_cell(object_size(dpop()));
-}
-
/* The number of cells from the start of the object which should be scanned by
the GC. Some types have a binary payload at the end (string, word, DLL) which
we ignore. */
-cell factor_vm::binary_payload_start(object *pointer)
+cell object::binary_payload_start() const
{
- switch(pointer->h.hi_tag())
+ switch(h.hi_tag())
{
/* these objects do not refer to other objects at all */
case FLOAT_TYPE:
return sizeof(string);
/* everything else consists entirely of pointers */
case ARRAY_TYPE:
- return array_size<array>(array_capacity((array*)pointer));
+ return array_size<array>(array_capacity((array*)this));
case TUPLE_TYPE:
- return tuple_size(untag<tuple_layout>(((tuple *)pointer)->layout));
+ return tuple_size(untag<tuple_layout>(((tuple *)this)->layout));
case WRAPPER_TYPE:
return sizeof(wrapper);
default:
- critical_error("Invalid header",(cell)pointer);
+ critical_error("Invalid header",(cell)this);
return 0; /* can't happen */
}
}
+void factor_vm::primitive_size()
+{
+ box_unsigned_cell(object_size(dpop()));
+}
+
/* Push memory usage statistics in data heap */
void factor_vm::primitive_data_room()
{
namespace factor
{
-template<typename Array> cell array_capacity(Array *array)
+template<typename Array> cell array_capacity(const Array *array)
{
#ifdef FACTOR_DEBUG
assert(array->h.hi_tag() == Array::type_number);
header h;
cell size() const;
+ cell binary_payload_start() const;
cell *slots() const { return (cell *)this; }
void visit_slots(object *ptr)
{
cell *slot = (cell *)ptr;
- cell *end = (cell *)((cell)ptr + parent->binary_payload_start(ptr));
+ cell *end = (cell *)((cell)ptr + ptr->binary_payload_start());
if(slot != end)
{
namespace factor
{
-inline static cell tuple_size(tuple_layout *layout)
+inline static cell tuple_size(const tuple_layout *layout)
{
cell size = untag_fixnum(layout->size);
return sizeof(tuple) + size * sizeof(cell);
void set_data_heap(data_heap *data_);
void init_data_heap(cell young_size, cell aging_size, cell tenured_size);
void primitive_size();
- cell binary_payload_start(object *pointer);
void primitive_data_room();
void begin_scan();
void end_scan();
template<typename Iterator> void do_slots(cell obj, Iterator &iter)
{
cell scan = obj;
- cell payload_start = binary_payload_start((object *)obj);
+ cell payload_start = ((object *)obj)->binary_payload_start();
cell end = obj + payload_start;
scan += sizeof(cell);