[pypy-commit] lang-smalltalk default: Added class attribute information to the ContextPartShadow class-chain.

lwassermann noreply at buildbot.pypy.org
Wed Mar 6 21:54:35 CET 2013


Author: Lars Wassermann <lars.wassermann at gmail.com>
Branch: 
Changeset: r128:0e0ba48f9e2a
Date: 2013-03-06 21:54 +0100
http://bitbucket.org/pypy/lang-smalltalk/changeset/0e0ba48f9e2a/

Log:	Added class attribute information to the ContextPartShadow class-
	chain. Renamed _w_method to __w_method to circumvent outside access
	from an unknown place. Unfortunately, the maximum recursion depth
	circumvents any attempts to see whether the system broke.

diff --git a/spyvm/interpreter.py b/spyvm/interpreter.py
--- a/spyvm/interpreter.py
+++ b/spyvm/interpreter.py
@@ -29,7 +29,7 @@
     jit_driver = jit.JitDriver(
         greens=['pc', 'self', 'method'],
         reds=['s_context'],
-        #virtualizables=['s_context'],
+        virtualizables=['s_context'],
         get_printable_location=get_printable_location
     )
     
diff --git a/spyvm/shadow.py b/spyvm/shadow.py
--- a/spyvm/shadow.py
+++ b/spyvm/shadow.py
@@ -7,6 +7,8 @@
     """A shadow is an optional extra bit of information that
     can be attached at run-time to any Smalltalk object.
     """
+    _attr_ = ['_w_self']
+    
     def __init__(self, space, w_self):
         self.space = space
         self._w_self = w_self
@@ -25,6 +27,8 @@
     def sync_shadow(self): pass
    
 class AbstractCachingShadow(AbstractShadow):
+    _attr_ = []
+
     def __init__(self, space, w_self):
         AbstractShadow.__init__(self, space, w_self)
 
@@ -282,6 +286,8 @@
 
 
 class AbstractRedirectingShadow(AbstractShadow):
+    _attr_ = ['_w_self_size']
+
     def __init__(self, space, w_self):
         AbstractShadow.__init__(self, space, w_self)
         if w_self is not None:
@@ -319,12 +325,14 @@
 class ContextPartShadow(AbstractRedirectingShadow):
 
     __metaclass__ = extendabletype
+    _attr_ = ['_s_sender', '_pc', '_temps_and_stack', 
+            '_stack_ptr', 'instances_w']
 
-    # _virtualizable2_ = [
-    #     "_s_sender", "_pc",
-    #     "_temps_and_stack[*]", "_stack_ptr",
-    #     "_w_self", "_w_self_size"
-    # ]
+    _virtualizable2_ = [
+        "_s_sender", "_pc",
+        "_temps_and_stack[*]", "_stack_ptr",
+        "_w_self", "_w_self_size"
+    ]
 
     def __init__(self, space, w_self):
         self._s_sender = None
@@ -464,7 +472,9 @@
     # Method that contains the bytecode for this method/block context
 
     def w_method(self):
-        return self.s_home().w_method()
+        retval = self.s_home().w_method()
+        assert isinstance(retval, model.W_CompiledMethod)
+        return retval
 
     def s_method(self):
         w_method = jit.promote(self.w_method())
@@ -585,6 +595,7 @@
 
 
 class BlockContextShadow(ContextPartShadow):
+    _attr_ = ['_w_home', '_initialip', '_eargc']
 
     @staticmethod
     def make_context(space, w_home, s_sender, argcnt, initialip):
@@ -679,11 +690,12 @@
         return 0
 
 class MethodContextShadow(ContextPartShadow):
-
+    _attr_ = ['w_closure_or_nil', '_w_receiver', '__w_method']
 
     def __init__(self, space, w_self):
         self.w_closure_or_nil = space.w_nil
-        self._w_receiver = None
+        self._w_receiver = space.w_nil
+        self.__w_method = None
         ContextPartShadow.__init__(self, space, w_self)
 
     @staticmethod
@@ -761,11 +773,13 @@
                                 self.w_closure_or_nil).tempsize()
 
     def w_method(self):
-        return self._w_method
+        retval = self.__w_method
+        assert isinstance(retval, model.W_CompiledMethod)
+        return retval
 
     def store_w_method(self, w_method):
         assert isinstance(w_method, model.W_CompiledMethod)
-        self._w_method = w_method
+        self.__w_method = w_method
 
     def w_receiver(self):
         return self._w_receiver


More information about the pypy-commit mailing list