Author: Anton Gulenko <[email protected]>
Branch: storage
Changeset: r694:20c045fd46e5
Date: 2014-03-24 18:31 +0100
http://bitbucket.org/pypy/lang-smalltalk/changeset/20c045fd46e5/

Log:    Working on refactoring.

diff --git a/spyvm/model.py b/spyvm/model.py
--- a/spyvm/model.py
+++ b/spyvm/model.py
@@ -497,14 +497,23 @@
         if not self.shadow:
             self.store_shadow(self.default_storage(space, size))
         else:
+            from spyvm.shadow import ClassShadow
+            if isinstance(self.shadow, ClassShadow) and self.shadow.name == 
"BlockClosure":
+                import pdb; pdb.set_trace()
+            
             self.shadow.initialize_storage(space, size)
         
     def fillin(self, space, g_self):
+        g_self.g_class.fillin(space)
         self.s_class = g_self.get_class().as_class_get_penumbra(space)
+        
+        if self.s_class.name == "BlockClosure":
+            import pdb; pdb.set_trace()
+        
         self.hash = g_self.get_hash()
         self.space = space
         for g_obj in g_self.get_g_pointers():
-            g_obj.fillin(space)
+            g_obj.fillin_nonpointers(space)
         pointers = g_self.get_pointers()
         self.initialize_storage(space, len(pointers))
         self.store_all(space, pointers)
@@ -550,6 +559,8 @@
         return self.varsize(space)
 
     def size(self):
+        if not self.shadow:
+            return 0
         return self._get_shadow().size()
 
     def store_shadow(self, shadow):
diff --git a/spyvm/objspace.py b/spyvm/objspace.py
--- a/spyvm/objspace.py
+++ b/spyvm/objspace.py
@@ -36,6 +36,58 @@
         return self._executable_path[0]
 
     def make_bootstrap_classes(self):
+        def define_cls(cls_nm, supercls_nm, instvarsize=0, 
format=shadow.POINTERS,
+                       varsized=False):
+            assert cls_nm.startswith("w_")
+            self.classtable[cls_nm] = bootstrap_class(self, instvarsize, \
+                                         None,
+                                         None,
+                                         format=format,
+                                         varsized=varsized,
+                                         name=cls_nm[2:])
+
+#define_cls("w_Magnitude", "w_Object")
+        define_cls("w_Character", "w_Magnitude", instvarsize=1)
+#define_cls("w_Number", "w_Magnitude")
+#define_cls("w_Integer", "w_Number")
+        define_cls("w_SmallInteger", "w_Integer")
+        define_cls("w_LargePositiveInteger", "w_Integer", format=shadow.BYTES)
+        define_cls("w_Float", "w_Number", format=shadow.BYTES)
+        define_cls("w_Message", "w_Object")
+#define_cls("w_Collection", "w_Object")
+#define_cls("w_SequenceableCollection", "w_Collection")
+#define_cls("w_ArrayedCollection", "w_SequenceableCollection")
+        define_cls("w_Array", "w_ArrayedCollection", varsized=True)
+        define_cls("w_String", "w_ArrayedCollection", format=shadow.BYTES)
+        define_cls("w_Bitmap", "w_ArrayedCollection", varsized=True, 
format=shadow.WORDS)
+#define_cls("w_UndefinedObject", "w_Object")
+#define_cls("w_Boolean", "w_Object")
+#define_cls("w_True", "w_Boolean")
+#define_cls("w_False", "w_Boolean")
+        define_cls("w_ByteArray", "w_ArrayedCollection", format=shadow.BYTES)
+        define_cls("w_CompiledMethod", "w_ByteArray", 
format=shadow.COMPILED_METHOD)
+#define_cls("w_ContextPart", "w_Object")
+        define_cls("w_MethodContext", "w_ContextPart")
+#define_cls("w_Link", "w_Object")
+    #define_cls("w_Process", "w_Link")
+    #define_cls("w_Point", "w_Object")
+#define_cls("w_LinkedList", "w_SequenceableCollection")
+        define_cls("w_Semaphore", "w_LinkedList")
+    #define_cls("w_BlockContext", "w_ContextPart", 
instvarsize=constants.BLKCTX_STACK_START)
+        define_cls("w_BlockClosure", "w_Object", 
instvarsize=constants.BLKCLSR_SIZE, varsized=True)
+            
+        # make better accessors for classes that can be found in special object
+        # table
+        for name in constants.classes_in_special_object_table.keys():
+            name = 'w_' + name
+            if name in self.classtable:
+                cls = self.classtable.get(name)
+                setattr(self, name, self.classtable.get(name))
+            else:
+                # assert False, "Missing bootstrapped class from special 
objects array: %s" % (name,)
+                pass
+        
+    def _make_bootstrap_classes(self):
         def define_core_cls(name, w_superclass, w_metaclass):
             assert name.startswith('w_')
             w_class = bootstrap_class(self, instsize=0,    # XXX
@@ -106,42 +158,45 @@
                                          varsized=varsized,
                                          name=cls_nm[2:])
 
-        define_cls("w_Magnitude", "w_Object")
+        #define_cls("w_Magnitude", "w_Object")
             define_cls("w_Character", "w_Magnitude", instvarsize=1)
-        define_cls("w_Number", "w_Magnitude")
-        define_cls("w_Integer", "w_Number")
+        #define_cls("w_Number", "w_Magnitude")
+        #define_cls("w_Integer", "w_Number")
             define_cls("w_SmallInteger", "w_Integer")
             define_cls("w_LargePositiveInteger", "w_Integer", 
format=shadow.BYTES)
             define_cls("w_Float", "w_Number", format=shadow.BYTES)
             define_cls("w_Message", "w_Object")
-        define_cls("w_Collection", "w_Object")
-        define_cls("w_SequenceableCollection", "w_Collection")
-        define_cls("w_ArrayedCollection", "w_SequenceableCollection")
+        #define_cls("w_Collection", "w_Object")
+        #define_cls("w_SequenceableCollection", "w_Collection")
+        #define_cls("w_ArrayedCollection", "w_SequenceableCollection")
             define_cls("w_Array", "w_ArrayedCollection", varsized=True)
             define_cls("w_String", "w_ArrayedCollection", format=shadow.BYTES)
             define_cls("w_Bitmap", "w_ArrayedCollection", varsized=True, 
format=shadow.WORDS)
-        define_cls("w_UndefinedObject", "w_Object")
-        define_cls("w_Boolean", "w_Object")
-        define_cls("w_True", "w_Boolean")
-        define_cls("w_False", "w_Boolean")
+        #define_cls("w_UndefinedObject", "w_Object")
+        #define_cls("w_Boolean", "w_Object")
+        #define_cls("w_True", "w_Boolean")
+        #define_cls("w_False", "w_Boolean")
             define_cls("w_ByteArray", "w_ArrayedCollection", 
format=shadow.BYTES)
-        define_cls("w_MethodDict", "w_Object", instvarsize=2, varsized=True)
             define_cls("w_CompiledMethod", "w_ByteArray", 
format=shadow.COMPILED_METHOD)
-        define_cls("w_ContextPart", "w_Object")
+        #define_cls("w_ContextPart", "w_Object")
             define_cls("w_MethodContext", "w_ContextPart")
-        define_cls("w_Link", "w_Object")
+        #define_cls("w_Link", "w_Object")
             define_cls("w_Process", "w_Link")
             define_cls("w_Point", "w_Object")
-        define_cls("w_LinkedList", "w_SequenceableCollection")
+        #define_cls("w_LinkedList", "w_SequenceableCollection")
             define_cls("w_Semaphore", "w_LinkedList")
             define_cls("w_BlockContext", "w_ContextPart", 
instvarsize=constants.BLKCTX_STACK_START)
             define_cls("w_BlockClosure", "w_Object", 
instvarsize=constants.BLKCLSR_SIZE, varsized=True)
+            
+        # TODO - this class is not needed for the special objects array, so 
maybe not create it synthetically.
+        #define_cls("w_MethodDict", "w_Object", instvarsize=2, varsized=True)
+        
         # make better accessors for classes that can be found in special object
         # table
         for name in constants.classes_in_special_object_table.keys():
             name = 'w_' + name
             setattr(self, name, self.classtable.get(name))
-
+        
     def make_bootstrap_objects(self):
         def bld_char(i):
             w_cinst = self.w_Character.as_class_get_shadow(self).new()
@@ -163,18 +218,22 @@
             w_nil.initialize_storage(self, 0)
             w_nil.s_class = 
self.classtable['w_UndefinedObject'].as_class_get_penumbra(self)
             return w_nil
-        w_nil = self.w_nil = patch_nil(model.w_nil)
+        w_nil = self.w_nil = model.w_nil
+        # patch_nil(model.w_nil)
 
-        w_true = self.classtable['w_True'].as_class_get_shadow(self).new()
+        w_true = instantiate(model.W_PointersObject)
+        #self.classtable['w_True'].as_class_get_shadow(self).new()
         self.w_true = w_true
-        w_false = self.classtable['w_False'].as_class_get_shadow(self).new()
+        w_false = instantiate(model.W_PointersObject)
+        #self.classtable['w_False'].as_class_get_shadow(self).new()
         self.w_false = w_false
         self.w_minus_one = model.W_SmallInteger(-1)
         self.w_zero = model.W_SmallInteger(0)
         self.w_one = model.W_SmallInteger(1)
         self.w_two = model.W_SmallInteger(2)
-        w_special_selectors = model.W_PointersObject(self,
-            self.classtable['w_Array'], len(constants.SPECIAL_SELECTORS) * 2)
+        w_special_selectors = instantiate(model.W_PointersObject)
+            #model.W_PointersObject(self,
+            #self.classtable['w_Array'], len(constants.SPECIAL_SELECTORS) * 2)
         self.w_special_selectors = w_special_selectors
 
         self.objtable = {}
@@ -252,6 +311,7 @@
                 return intmask(w_value.value)
             else:
                 raise UnwrappingError("The value is negative when interpreted 
as 32bit value.")
+        import pdb; pdb.set_trace()
         raise UnwrappingError("expected a W_SmallInteger or 
W_LargePositiveInteger1Word, got %s" % (w_value,))
 
     def unwrap_uint(self, w_value):
diff --git a/spyvm/shadow.py b/spyvm/shadow.py
--- a/spyvm/shadow.py
+++ b/spyvm/shadow.py
@@ -16,13 +16,10 @@
         self.space = space
         self._w_self = w_self
     def fetch(self, n0):
-        import pdb; pdb.set_trace()
         raise NotImplementedError("Abstract class")
     def store(self, n0, w_value):
-        import pdb; pdb.set_trace()
         raise NotImplementedError("Abstract class")
     def size(self):
-        import pdb; pdb.set_trace()
         raise NotImplementedError("Abstract class")
     def w_self(self):
         return self._w_self
@@ -118,13 +115,8 @@
 
     def copy_from(self, other_storage):
         AbstractCachingShadow.copy_from(self, other_storage)
-        if not self._s_methoddict:
-            import pdb; pdb.set_trace()
         
     def store(self, n0, w_val):
-        if self.name == "String":
-            import pdb; pdb.set_trace()
-        
         AbstractCachingShadow.store(self, n0, w_val)
         if n0 == constants.CLASS_SUPERCLASS_INDEX:
             self.store_w_superclass(w_val)
@@ -176,20 +168,6 @@
                 raise ClassShadowError("unknown format %d" % (format,))
         elif n0 == constants.CLASS_NAME_INDEX:
             self.store_w_name(w_val)
-        elif n0 == (self.size() - 1):
-            # Some heuristic to find the classname
-            # Only used for debugging
-            # XXX This is highly experimental XXX
-            # if the name-pos of class is not bytesobject,
-            # we are probably holding a metaclass instead of a class.
-            # metaclasses hold a pointer to the real class in the last
-            # slot. This is pos 6 in mini.image and higher in squeak3.9
-            if (isinstance(w_val, model.W_PointersObject)
-                and w_val.size() > constants.CLASS_NAME_INDEX):
-                # TODO ADD TEST WHICH GOES OVER THIS PART
-                
self.store_w_name(w_realclass.fetch(constants.CLASS_NAME_INDEX))
-            else:
-                return
         else:
             return
         # Some of the special info has changed -> Switch version.
@@ -219,6 +197,8 @@
             self.name = w_name.as_string()
         else:
             self.name = None
+        if self.name == "BlockClosure":
+            import pdb; pdb.set_trace()
     
     @jit.unroll_safe
     def flush_method_caches(self):
@@ -256,8 +236,6 @@
         return self._s_methoddict.w_self()
 
     def s_methoddict(self):
-        if not hasattr(self, "_s_methoddict"):
-            import pdb; pdb.set_trace()
         return self._s_methoddict
 
     def s_superclass(self):
diff --git a/spyvm/squeakimage.py b/spyvm/squeakimage.py
--- a/spyvm/squeakimage.py
+++ b/spyvm/squeakimage.py
@@ -278,26 +278,29 @@
             chunk.g_object.init_w_object()
 
     def assign_prebuilt_constants(self):
-        # assign w_objects for objects that are already in objtable
-        for name, so_index in 
constants.objects_in_special_object_table.items():
-            w_object = self.space.objtable["w_" + name]
+        # Assign classes and objects that in special objects array that are 
already created.
+        
self._assign_prebuilt_constants(constants.objects_in_special_object_table, 
self.space.objtable, False)
+        
self._assign_prebuilt_constants(constants.classes_in_special_object_table, 
self.space.classtable, False)
+        
+        # Make sure that all prebuilt classes are actually used in the special 
classes array
+        for prebuilt_classname in self.space.classtable.keys():
+            prebuilt_classname = prebuilt_classname[2:]
+            assert prebuilt_classname in 
constants.classes_in_special_object_table.keys(), \
+                       "Prebuilt class is not used in the special objects 
array: %s" % (prebuilt_classname,)
+
+    def _assign_prebuilt_constants(self, names_and_indices, prebuilt_objects, 
force_existance=False):
+        for name, so_index in names_and_indices.items():
+            name = "w_" + name
+            if name not in prebuilt_objects and not force_existance:
+                continue
+            w_object = prebuilt_objects[name]
+            assert not force_existance or w_object
             if self.special_object(so_index).w_object is None:
                 self.special_object(so_index).w_object = w_object
             else:
                 if self.special_object(0).w_object is not self.space.w_nil:
                    raise Warning('Object found in multiple places in the 
special objects array')
-        # assign w_objects for objects that are already in classtable
-        import pdb; pdb.set_trace()
-        for name, so_index in 
constants.classes_in_special_object_table.items():
-            w_object = self.space.classtable["w_" + name]
-            if not w_object:
-                import pdb; pdb.set_trace()
-            if self.special_object(so_index).w_object is None:
-                self.special_object(so_index).w_object = w_object
-            else:
-                if self.special_object(0).w_object is not self.space.w_nil:
-                   raise Warning('Object found in multiple places in the 
special objects array')
-
+    
     def special_object(self, index):
         special = self.chunks[self.specialobjectspointer].g_object.pointers
         return special[index]
@@ -439,6 +442,7 @@
             w_int = self.space.wrap_int(value)
             reader.intcache[value] = w_int
         self.w_object = w_int
+        self.filled_in = True
 
     def initialize(self, chunk, reader):
         self.reader = reader
@@ -565,10 +569,11 @@
             raise CorruptImageError("Expected %d words, got %d" % 
(required_len, len(words)))
         return words
 
+    def fillin_nonpointers(self, space):
+        if not self.filled_in and (self.isbytes() or self.iswords()):
+            self.fillin(space)
+        
     def fillin(self, space):
-        if self == self.reader.special_object(6):
-            import pdb; pdb.set_trace()
-        
         if not self.filled_in:
             self.filled_in = True
             self.w_object.fillin(space, self)
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to