[pypy-svn] r55017 - in pypy/branch/smalltalk-shadow-changes/pypy/lang/smalltalk: . test

tverwaes at codespeak.net tverwaes at codespeak.net
Tue May 20 17:36:47 CEST 2008


Author: tverwaes
Date: Tue May 20 17:36:45 2008
New Revision: 55017

Modified:
   pypy/branch/smalltalk-shadow-changes/pypy/lang/smalltalk/model.py
   pypy/branch/smalltalk-shadow-changes/pypy/lang/smalltalk/shadow.py
   pypy/branch/smalltalk-shadow-changes/pypy/lang/smalltalk/test/test_shadow.py
Log:
(cfbolz, tverwaes) making sure that detaching redirecting shadows fix their
pointersobject correctly


Modified: pypy/branch/smalltalk-shadow-changes/pypy/lang/smalltalk/model.py
==============================================================================
--- pypy/branch/smalltalk-shadow-changes/pypy/lang/smalltalk/model.py	(original)
+++ pypy/branch/smalltalk-shadow-changes/pypy/lang/smalltalk/model.py	Tue May 20 17:36:45 2008
@@ -124,6 +124,13 @@
             return False
         return self.value == other.value
 
+    def __eq__(self, other):
+        return self.value == other.value
+
+    def __ne__(self, other):
+        return not self == other
+
+
 class W_Float(W_Object):
     """Boxed float value."""
     def __init__(self, value):
@@ -149,6 +156,12 @@
         # TODO is that correct in Squeak?
         return self.value == other.value
 
+    def __eq__(self, other):
+        return self.value == other.value
+
+    def __ne__(self, other):
+        return not self == other
+
 class W_AbstractObjectWithIdentityHash(W_Object):
     """Object with explicit hash (ie all except small
     ints and floats)."""
@@ -265,8 +278,6 @@
         return (W_AbstractObjectWithClassReference.invariant(self) and
                 isinstance(self._vars, list))
 
-    # XXX XXX
-    # Find better way of overloading shadows...
     def store_shadow(self, shadow):
         self._shadow = shadow
 

Modified: pypy/branch/smalltalk-shadow-changes/pypy/lang/smalltalk/shadow.py
==============================================================================
--- pypy/branch/smalltalk-shadow-changes/pypy/lang/smalltalk/shadow.py	(original)
+++ pypy/branch/smalltalk-shadow-changes/pypy/lang/smalltalk/shadow.py	Tue May 20 17:36:45 2008
@@ -288,10 +288,10 @@
         self.w_self()._vars = None
 
     def detach_shadow(self):
+        from pypy.lang.smalltalk import objtable
         self.w_self()._vars = [objtable.w_nil] * self._w_self_size
         for i in range(self._w_self_size):
             self.copy_to_w_self(i)
-        self.invalidate_shadow()
 
     def copy_from_w_self(self, n0):
         self.store(n0, self.w_self()._fetch(n0))
@@ -316,9 +316,9 @@
             return self.wrap_pc()
         if n0 == constants.CTXPART_STACKP_INDEX:
             return self.wrap_stackpointer()
-        if self.stackstart() <= n0 < self.stackpointer():
+        if self.stackstart() <= n0 < self.external_stackpointer():
             return self._stack[n0-self.stackstart()]
-        if self.stackpointer() <= n0 < self.stackend():
+        if self.external_stackpointer() <= n0 < self.stackend():
             from pypy.lang.smalltalk import objtable
             return objtable.w_nil
         else:
@@ -333,10 +333,10 @@
             return self.store_unwrap_pc(w_value)
         if n0 == constants.CTXPART_STACKP_INDEX:
             return self.unwrap_store_stackpointer(w_value)
-        if self.stackstart() <= n0 < self.stackpointer():
+        if self.stackstart() <= n0 < self.external_stackpointer():
             self._stack[n0 - self.stackstart()] = w_value
             return
-        if self.stackpointer() <= n0 < self.stackend():
+        if self.external_stackpointer() <= n0 < self.stackend():
             return
         else:
             # XXX later should store tail out of known context part as well
@@ -359,11 +359,12 @@
             self._stack.extend(add)
 
     def wrap_stackpointer(self):
-        return utility.wrap_int(self.stackpointer() + 1)
+        return utility.wrap_int(len(self._stack) +
+                                self.w_method().tempframesize())
 
     # TODO test
-    def stackpointer(self):
-        return self.stackstart() + len(self._stack)
+    def external_stackpointer(self):
+        return len(self._stack) + self.stackstart()
 
     def w_home(self):
         raise NotImplementedError()

Modified: pypy/branch/smalltalk-shadow-changes/pypy/lang/smalltalk/test/test_shadow.py
==============================================================================
--- pypy/branch/smalltalk-shadow-changes/pypy/lang/smalltalk/test/test_shadow.py	(original)
+++ pypy/branch/smalltalk-shadow-changes/pypy/lang/smalltalk/test/test_shadow.py	Tue May 20 17:36:45 2008
@@ -121,7 +121,7 @@
     assert s_object.pop() == 'i'
     assert s_object.pop_and_return_n(2) == ['g', 'h']
     assert s_object.pop() == 'f'
-    assert s_object.stackpointer() == s_object.stackstart()
+    assert s_object.external_stackpointer() == s_object.stackstart()
 
 def test_methodcontext():
     w_m = method()
@@ -135,4 +135,12 @@
     assert s_object.getbytecode() == 101
     assert s_object.s_home() == s_object
 
-
+def test_swap_shadows():
+    w_m = method()
+    w_object = methodcontext(pc=13, method=w_m)
+    old_vars = w_object._vars
+    s_object = w_object.as_methodcontext_get_shadow()
+    assert w_object._vars is None
+    s_object.detach_shadow()
+    assert w_object._vars == old_vars
+    assert w_object._vars is not old_vars



More information about the Pypy-commit mailing list