VM: split the size() method into base_size() and aligned_size()

db4
Björn Lindqvist 2015-07-03 18:47:33 +02:00
parent 892c62e1dc
commit 66eb9f1fe5
2 changed files with 29 additions and 23 deletions

View File

@ -109,8 +109,9 @@ struct object {
NO_TYPE_CHECK; NO_TYPE_CHECK;
cell header; cell header;
cell size() const; template <typename Fixup> cell base_size(Fixup fixup) const;
template <typename Fixup> cell size(Fixup fixup) const; template <typename Fixup> cell size(Fixup fixup) const;
cell size() const;
cell binary_payload_start() const; cell binary_payload_start() const;
template <typename Fixup> cell binary_payload_start(Fixup fixup) const; template <typename Fixup> cell binary_payload_start(Fixup fixup) const;

View File

@ -1,44 +1,49 @@
namespace factor { namespace factor {
/* Size of the object pointed to by an untagged pointer */ /* Size sans alignment. */
template <typename Fixup> cell object::size(Fixup fixup) const { template <typename Fixup>
if (free_p()) cell object::base_size(Fixup fixup) const {
return ((free_heap_block*)this)->size();
switch (type()) { switch (type()) {
case ARRAY_TYPE: case ARRAY_TYPE:
return align(array_size((array*)this), data_alignment); return array_size((array*)this);
case BIGNUM_TYPE: case BIGNUM_TYPE:
return align(array_size((bignum*)this), data_alignment); return array_size((bignum*)this);
case BYTE_ARRAY_TYPE: case BYTE_ARRAY_TYPE:
return align(array_size((byte_array*)this), data_alignment); return array_size((byte_array*)this);
case STRING_TYPE: case STRING_TYPE:
return align(string_size(string_capacity((string*)this)), data_alignment); return string_size(string_capacity((string*)this));
case TUPLE_TYPE: { case TUPLE_TYPE: {
tuple_layout* layout = (tuple_layout*)fixup.translate_data( tuple_layout* layout = (tuple_layout*)fixup.translate_data(
untag<object>(((tuple*)this)->layout)); untag<object>(((tuple*)this)->layout));
return align(tuple_size(layout), data_alignment); return tuple_size(layout);
} }
case QUOTATION_TYPE: case QUOTATION_TYPE:
return align(sizeof(quotation), data_alignment); return sizeof(quotation);
case WORD_TYPE: case WORD_TYPE:
return align(sizeof(word), data_alignment); return sizeof(word);
case FLOAT_TYPE: case FLOAT_TYPE:
return align(sizeof(boxed_float), data_alignment); return sizeof(boxed_float);
case DLL_TYPE: case DLL_TYPE:
return align(sizeof(dll), data_alignment); return sizeof(dll);
case ALIEN_TYPE: case ALIEN_TYPE:
return align(sizeof(alien), data_alignment); return sizeof(alien);
case WRAPPER_TYPE: case WRAPPER_TYPE:
return align(sizeof(wrapper), data_alignment); return sizeof(wrapper);
case CALLSTACK_TYPE: case CALLSTACK_TYPE: {
return align( return callstack_object_size(untag_fixnum(((callstack*)this)->length));
callstack_object_size(untag_fixnum(((callstack*)this)->length)),
data_alignment);
default:
critical_error("Invalid header in size", (cell)this);
return 0; /* can't happen */
} }
default:
critical_error("Invalid header in base_size", (cell)this);
return 0;
}
}
/* Size of the object pointed to by an untagged pointer */
template <typename Fixup>
cell object::size(Fixup fixup) const {
if (free_p())
return ((free_heap_block*)this)->size();
return align(base_size(fixup), data_alignment);
} }
inline cell object::size() const { return size(no_fixup()); } inline cell object::size() const { return size(no_fixup()); }