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;
cell header;
cell size() const;
template <typename Fixup> cell base_size(Fixup fixup) const;
template <typename Fixup> cell size(Fixup fixup) const;
cell size() const;
cell binary_payload_start() const;
template <typename Fixup> cell binary_payload_start(Fixup fixup) const;

View File

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