VM: split the size() method into base_size() and aligned_size()
parent
892c62e1dc
commit
66eb9f1fe5
|
@ -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;
|
||||||
|
|
|
@ -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()); }
|
||||||
|
|
Loading…
Reference in New Issue