[pypy-commit] lang-smalltalk storage: Changed perform/create_toplevel_context methods of interpreter to work better with RPython.

anton_gulenko noreply at buildbot.pypy.org
Thu Jul 10 12:56:51 CEST 2014


Author: Anton Gulenko <anton.gulenko at googlemail.com>
Branch: storage
Changeset: r874:01a714785a05
Date: 2014-07-07 17:35 +0200
http://bitbucket.org/pypy/lang-smalltalk/changeset/01a714785a05/

Log:	Changed perform/create_toplevel_context methods of interpreter to
	work better with RPython.

diff --git a/spyvm/interpreter.py b/spyvm/interpreter.py
--- a/spyvm/interpreter.py
+++ b/spyvm/interpreter.py
@@ -211,20 +211,18 @@
         except ReturnFromTopLevel, e:
             return e.object
 
-    def perform(self, w_receiver, selector, *w_arguments):
-        s_frame = self.create_toplevel_context(w_receiver, selector, *w_arguments)
+    def perform(self, w_receiver, selector="", w_selector=None, w_arguments=[]):
+        s_frame = self.create_toplevel_context(w_receiver, selector, w_selector, w_arguments)
         self.interrupt_check_counter = self.interrupt_counter_size
         return self.interpret_toplevel(s_frame.w_self())
     
-    def create_toplevel_context(self, w_receiver, selector, *w_arguments):
-        if isinstance(selector, str):
+    def create_toplevel_context(self, w_receiver, selector="", w_selector=None, w_arguments=[]):
+        if w_selector is None:
+            assert selector, "Need either string or W_Object selector"
             if selector == "asSymbol":
                 w_selector = self.image.w_asSymbol
             else:
-                w_selector = self.perform(self.space.wrap_string(selector),
-                                            "asSymbol")
-        else:
-            w_selector = selector
+                w_selector = self.perform(self.space.wrap_string(selector), "asSymbol")
         
         w_method = model.W_CompiledMethod(self.space, header=512)
         w_method.literalatput0(self.space, 1, w_selector)
diff --git a/spyvm/test/jit.py b/spyvm/test/jit.py
--- a/spyvm/test/jit.py
+++ b/spyvm/test/jit.py
@@ -36,7 +36,7 @@
 def preload_perform(imagename, receiver, selector, *args):
     interp = load(imagename)
     def interp_miniloop():
-        return interp.perform(receiver, selector, *args)
+        return interp.perform(receiver, selector, w_arguments=list(args))
     return interp_miniloop
 
 # This will build a jit executing a synthetic method composed of the given bytecodes and literals,
diff --git a/spyvm/test/test_largeinteger.py b/spyvm/test/test_largeinteger.py
--- a/spyvm/test/test_largeinteger.py
+++ b/spyvm/test/test_largeinteger.py
@@ -7,7 +7,6 @@
 def setup_module():
     space, interp, _, _ = read_image('bootstrapped.image')
     w = space.w
-    perform = interp.perform
     copy_to_module(locals(), __name__)
     interp.trace = False
     space.initialize_class(space.w_String, interp)
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
@@ -5,7 +5,10 @@
 def setup_module():
     space, interp, image, reader = read_image("mini.image")
     w = space.w
-    perform = interp.perform
+    def perform_wrapper(receiver, selector, *args):
+        w_selector = None if isinstance(selector, str) else selector
+        return interp.perform(receiver, selector, w_selector, list(args))
+    perform = perform_wrapper
     copy_to_module(locals(), __name__)
 
 def teardown_module():
@@ -191,7 +194,7 @@
     w_abs = interp.perform(interp.space.w("abs"), "asSymbol")
     for value in [10, -3, 0]:
         w_object = model.W_SmallInteger(value)
-        w_res = interp.perform(w_object, w_abs)
+        w_res = interp.perform(w_object, w_selector=w_abs)
         assert w_res.value == abs(value)
 
 def test_lookup_abs_in_integer():
diff --git a/spyvm/test/util.py b/spyvm/test/util.py
--- a/spyvm/test/util.py
+++ b/spyvm/test/util.py
@@ -266,5 +266,5 @@
     def initialize_class(self, w_class, interp):
         initialize_symbol = find_symbol_in_methoddict_of("initialize", 
                             w_class.class_shadow(self))
-        interp.perform(w_class, initialize_symbol)
+        interp.perform(w_class, w_selector=initialize_symbol)
         
\ No newline at end of file


More information about the pypy-commit mailing list