/* 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(); switch (type()) { case ARRAY_TYPE: return align(array_size((array*)this), data_alignment); case BIGNUM_TYPE: return align(array_size((bignum*)this), data_alignment); case BYTE_ARRAY_TYPE: return align(array_size((byte_array*)this), data_alignment); case STRING_TYPE: return align(string_size(string_capacity((string*)this)), data_alignment); case TUPLE_TYPE: { tuple_layout* layout = (tuple_layout*)fixup.translate_data( untag<object>(((tuple*)this)->layout)); return align(tuple_size(layout), data_alignment); } case QUOTATION_TYPE: return align(sizeof(quotation), data_alignment); case WORD_TYPE: return align(sizeof(word), data_alignment); case FLOAT_TYPE: return align(sizeof(boxed_float), data_alignment); case DLL_TYPE: return align(sizeof(dll), data_alignment); case ALIEN_TYPE: return align(sizeof(alien), data_alignment); 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 */ } }
callstack *factor_vm::allot_callstack(cell size) { callstack *stack = allot<callstack>(callstack_object_size(size)); stack->length = tag_fixnum(size); return stack; }