[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