[pypy-svn] r55311 - pypy/branch/smalltalk-shadow-changes/pypy/lang/smalltalk
tverwaes at codespeak.net
tverwaes at codespeak.net
Tue May 27 19:29:55 CEST 2008
Author: tverwaes
Date: Tue May 27 19:29:52 2008
New Revision: 55311
Modified:
pypy/branch/smalltalk-shadow-changes/pypy/lang/smalltalk/primitives.py
Log:
fixing semantics of become
Modified: pypy/branch/smalltalk-shadow-changes/pypy/lang/smalltalk/primitives.py
==============================================================================
--- pypy/branch/smalltalk-shadow-changes/pypy/lang/smalltalk/primitives.py (original)
+++ pypy/branch/smalltalk-shadow-changes/pypy/lang/smalltalk/primitives.py Tue May 27 19:29:52 2008
@@ -504,9 +504,21 @@
@expose_primitive(BECOME, unwrap_spec=[object, object])
def func(interp, w_rcvr, w_new):
- if w_rcvr.become(w_new):
- return w_rcvr
- raise PrimitiveFailedError
+ if w_rcvr.size() != w_new.size():
+ raise PrimitiveFailedError
+ w_lefts = []
+ w_rights = []
+ for i in range(w_rcvr.size()):
+ w_left = w_rcvr.at0(interp.space, i)
+ w_right = w_new.at0(interp.space, i)
+ if w_left.become(w_right):
+ w_lefts.append(w_left)
+ w_rights.append(w_right)
+ else:
+ for i in range(len(w_lefts)):
+ w_lefts[i].become(w_rights[i])
+ raise PrimitiveFailedError()
+ return w_rcvr
def fake_bytes_left(interp):
return interp.space.wrap_int(2**20) # XXX we don't know how to do this :-(
More information about the Pypy-commit
mailing list