[pypy-commit] lang-smalltalk default: fixed the problem of performing methods which are primitives with PERFORM_WITH_ARGS

lwassermann noreply at buildbot.pypy.org
Wed Mar 13 23:43:04 CET 2013


Author: Lars Wassermann <lars.wassermann at gmail.com>
Branch: 
Changeset: r179:603a4040803a
Date: 2013-03-13 21:17 +0100
http://bitbucket.org/pypy/lang-smalltalk/changeset/603a4040803a/

Log:	fixed the problem of performing methods which are primitives with
	PERFORM_WITH_ARGS

diff --git a/spyvm/primitives.py b/spyvm/primitives.py
--- a/spyvm/primitives.py
+++ b/spyvm/primitives.py
@@ -990,18 +990,19 @@
     raise PrimitiveFailedError()
 
 @expose_primitive(PERFORM_WITH_ARGS,
-                  unwrap_spec=[object, object, object],
-                  result_is_new_frame=True)
-def func(interp, s_frame, w_rcvr, w_sel, w_args):
-    s_method = w_rcvr.shadow_of_my_class(interp.space).lookup(w_sel)
-    assert s_method
+                  unwrap_spec=[object, object, list],
+                  no_result=True)
+def func(interp, s_frame, w_rcvr, w_selector, args_w):
+    stackvalues = s_frame.pop_and_return_n(3)
+    argcount = len(args_w)
+    s_frame.push(w_rcvr)
+    s_frame.push_all(args_w)
+    try:
+        s_frame._sendSelector(w_selector, argcount, interp,
+                      w_rcvr, w_rcvr.shadow_of_my_class(interp.space))
+    finally:
+        s_frame.push_all(stackvalues)
 
-    s_new_frame = s_method.create_frame(
-        interp.space, w_rcvr,
-        [w_args.fetch(interp.space, i) for i in range(w_args.size())])
-
-    s_new_frame.store_w_sender(s_frame.w_self())
-    return s_new_frame
 
 @expose_primitive(SIGNAL, unwrap_spec=[object])
 def func(interp, s_frame, w_rcvr):
diff --git a/spyvm/test/test_miniimage.py b/spyvm/test/test_miniimage.py
--- a/spyvm/test/test_miniimage.py
+++ b/spyvm/test/test_miniimage.py
@@ -298,6 +298,20 @@
     perform(w(10).getclass(space), "compile:classified:notifying:", w(sourcecode), w('pypy'), w(None))
     assert perform(w(10), "fib").is_same_object(w(89))
 
+def test_primitive_perform_with_args():
+    from spyvm.test.test_primitives import prim
+    from spyvm import primitives
+    w_o = space.wrap_list([1, 2, 3])
+    w_methoddict = w_o.shadow_of_my_class(space)._s_superclass._s_superclass.w_methoddict()
+    w_methoddict.as_methoddict_get_shadow(space).sync_cache()
+    selectors_w = w_methoddict._shadow.methoddict.keys()
+    w_sel = None
+    for sel in selectors_w:
+        if sel.as_string() == 'size':
+            w_sel = sel
+    size = prim(primitives.PERFORM_WITH_ARGS, [w_o, w_sel, []])
+    assert size.value == 3
+
 def test_step_run_something():
     from spyvm.test import test_miniimage
     setup_module(test_miniimage, filename='running-something-mini.image')
diff --git a/spyvm/test/test_primitives.py b/spyvm/test/test_primitives.py
--- a/spyvm/test/test_primitives.py
+++ b/spyvm/test/test_primitives.py
@@ -13,7 +13,7 @@
 
 class MockFrame(model.W_PointersObject):
     def __init__(self, stack):
-        self._vars = [None] * 6 + stack
+        self._vars = [None] * 6 + stack + [space.w_nil] * 6
         s_self = self.as_blockcontext_get_shadow()
         s_self.init_stack_and_temps()
         s_self.reset_stack()


More information about the pypy-commit mailing list