[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