]> gitweb.factorcode.org Git - factor.git/commitdiff
VM: split the size() method into base_size() and aligned_size()
authorBjörn Lindqvist <bjourne@gmail.com>
Fri, 3 Jul 2015 16:47:33 +0000 (18:47 +0200)
committerBjörn Lindqvist <bjourne@gmail.com>
Mon, 6 Jul 2015 20:49:38 +0000 (22:49 +0200)
vm/layouts.hpp
vm/slot_visitor.hpp

index 2bd409e11c0d7ce6ce469154714fa8e5c3bc3876..d02f44461dfd0e40d8386725f324eb30a81e968c 100644 (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;
index 1bef9b88034c6087e63a0f0487b12a0055f9e72e..c0b68b2af1ffbffff4add63aea0c3529324183af 100644 (file)
@@ -1,46 +1,51 @@
 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);
+      return sizeof(wrapper);
+    case CALLSTACK_TYPE: {
+      return callstack_object_size(untag_fixnum(((callstack*)this)->length));
+    }
     default:
-      critical_error("Invalid header in size", (cell)this);
-      return 0; /* can't happen */
+      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()); }
 
 /* The number of cells from the start of the object which should be scanned by