]> gitweb.factorcode.org Git - factor.git/commitdiff
vm: move binary_payload_start() method from factor_vm to object class
authorSlava Pestov <slava@slava-pestovs-macbook-pro.local>
Sat, 24 Oct 2009 09:27:45 +0000 (04:27 -0500)
committerSlava Pestov <slava@slava-pestovs-macbook-pro.local>
Sat, 24 Oct 2009 09:27:45 +0000 (04:27 -0500)
vm/collector.hpp
vm/data_heap.cpp
vm/generic_arrays.hpp
vm/layouts.hpp
vm/slot_visitor.hpp
vm/tuples.hpp
vm/vm.hpp

index 86ae9637748bb811b4ab62773087ecb3d2b4dcbd..e0ff53df9bf0734e7d5fd49d572033fa4ab66995 100644 (file)
@@ -209,7 +209,7 @@ template<typename TargetGeneration, typename Policy> struct collector {
                                                if(end < card_start_address(card_index))
                                                {
                                                        start = gen->starts.find_object_containing_card(card_index - gen_start_card);
-                                                       binary_start = start + parent->binary_payload_start((object *)start);
+                                                       binary_start = start + ((object *)start)->binary_payload_start();
                                                        end = start + ((object *)start)->size();
                                                }
        
@@ -229,7 +229,7 @@ scan_next_object:                           {
                                                                start = gen->next_object_after(start);
                                                                if(start)
                                                                {
-                                                                       binary_start = start + parent->binary_payload_start((object *)start);
+                                                                       binary_start = ((object *)start)->binary_payload_start();
                                                                        end = start + ((object *)start)->size();
                                                                        goto scan_next_object;
                                                                }
index 6178dc8861250db9d7dd662ccd43f3d485dade9f..b210adb8e1a063e4cd9f5004ff1164d5f9c9491d 100755 (executable)
@@ -159,17 +159,12 @@ cell object::size() const
        }
 }
 
-void factor_vm::primitive_size()
-{
-       box_unsigned_cell(object_size(dpop()));
-}
-
 /* The number of cells from the start of the object which should be scanned by
 the GC. Some types have a binary payload at the end (string, word, DLL) which
 we ignore. */
-cell factor_vm::binary_payload_start(object *pointer)
+cell object::binary_payload_start() const
 {
-       switch(pointer->h.hi_tag())
+       switch(h.hi_tag())
        {
        /* these objects do not refer to other objects at all */
        case FLOAT_TYPE:
@@ -190,17 +185,22 @@ cell factor_vm::binary_payload_start(object *pointer)
                return sizeof(string);
        /* everything else consists entirely of pointers */
        case ARRAY_TYPE:
-               return array_size<array>(array_capacity((array*)pointer));
+               return array_size<array>(array_capacity((array*)this));
        case TUPLE_TYPE:
-               return tuple_size(untag<tuple_layout>(((tuple *)pointer)->layout));
+               return tuple_size(untag<tuple_layout>(((tuple *)this)->layout));
        case WRAPPER_TYPE:
                return sizeof(wrapper);
        default:
-               critical_error("Invalid header",(cell)pointer);
+               critical_error("Invalid header",(cell)this);
                 return 0; /* can't happen */
        }
 }
 
+void factor_vm::primitive_size()
+{
+       box_unsigned_cell(object_size(dpop()));
+}
+
 /* Push memory usage statistics in data heap */
 void factor_vm::primitive_data_room()
 {
index e1d2c4dc0b5662516c2ada9eb18ab38d925a8406..89eb56a70d37a76b198fb42600894d3dde360671 100755 (executable)
@@ -1,7 +1,7 @@
 namespace factor
 {
 
-template<typename Array> cell array_capacity(Array *array)
+template<typename Array> cell array_capacity(const Array *array)
 {
 #ifdef FACTOR_DEBUG
        assert(array->h.hi_tag() == Array::type_number);
index c90be1b2dd07c127d5e56591144cee4982300bc7..b3cba5849579cdb07a92aa3b047178601912eb78 100644 (file)
@@ -148,6 +148,7 @@ struct object {
        header h;
 
        cell size() const;
+       cell binary_payload_start() const;
 
        cell *slots()  const { return (cell *)this; }
 
index 6e0f6839e2c01c5a3381a2a101668394516f4cee..67a51549b12d7f19ae85205e7f1c96c29f5a0b27 100644 (file)
@@ -22,7 +22,7 @@ template<typename Visitor> struct slot_visitor {
        void visit_slots(object *ptr)
        {
                cell *slot = (cell *)ptr;
-               cell *end = (cell *)((cell)ptr + parent->binary_payload_start(ptr));
+               cell *end = (cell *)((cell)ptr + ptr->binary_payload_start());
 
                if(slot != end)
                {
index 04b23b58578e4f699b5ad558ed9b761f933c7da4..bcd041fc65d07b60b8d7cf6cbe13960b9200ad0c 100644 (file)
@@ -1,7 +1,7 @@
 namespace factor
 {
 
-inline static cell tuple_size(tuple_layout *layout)
+inline static cell tuple_size(const tuple_layout *layout)
 {
        cell size = untag_fixnum(layout->size);
        return sizeof(tuple) + size * sizeof(cell);
index b596b7a50cceebc2e8d4062b4bfe56568f255b7d..0b66025374e5dc32fe1678da5437dada896e12c7 100755 (executable)
--- a/vm/vm.hpp
+++ b/vm/vm.hpp
@@ -223,7 +223,6 @@ struct factor_vm
        void set_data_heap(data_heap *data_);
        void init_data_heap(cell young_size, cell aging_size, cell tenured_size);
        void primitive_size();
-       cell binary_payload_start(object *pointer);
        void primitive_data_room();
        void begin_scan();
        void end_scan();
@@ -576,7 +575,7 @@ struct factor_vm
        template<typename Iterator> void do_slots(cell obj, Iterator &iter)
        {
                cell scan = obj;
-               cell payload_start = binary_payload_start((object *)obj);
+               cell payload_start = ((object *)obj)->binary_payload_start();
                cell end = obj + payload_start;
 
                scan += sizeof(cell);