[pypy-commit] lang-smalltalk default: move some of the infrastructure to run simple performs from rpython to interpreter.py

cfbolz noreply at buildbot.pypy.org
Fri Feb 22 11:51:45 CET 2013


Author: Carl Friedrich Bolz <cfbolz at gmx.de>
Branch: 
Changeset: r86:f8aedf50f65c
Date: 2013-02-22 11:49 +0100
http://bitbucket.org/pypy/lang-smalltalk/changeset/f8aedf50f65c/

Log:	move some of the infrastructure to run simple performs from rpython
	to interpreter.py

diff --git a/spyvm/interpreter.py b/spyvm/interpreter.py
--- a/spyvm/interpreter.py
+++ b/spyvm/interpreter.py
@@ -32,9 +32,10 @@
         get_printable_location=get_printable_location
     )
     
-    def __init__(self, space, image_name=""):
+    def __init__(self, space, image=None, image_name=""):
         self._w_active_context = None
         self.space = space
+        self.image = image
         self.image_name = image_name
 
     def w_active_context(self):
@@ -101,6 +102,22 @@
                 s_active_context=s_active_context)
             self.step(s_active_context)
 
+    def perform(self, w_receiver, selector, *arguments_w):
+        if selector == "asSymbol":
+            w_selector = self.image.w_asSymbol
+        else:
+            w_selector = self.perform(self.space.wrap_string(selector), "asSymbol")
+        s_class = w_receiver.shadow_of_my_class(self.space)
+        w_method = s_class.lookup(w_selector)
+        assert w_method
+        w_frame = w_method.create_frame(self.space, w_receiver, list(arguments_w))
+        self.store_w_active_context(w_frame)
+        while True:
+            try:
+                self.loop()
+            except ReturnFromTopLevel, e:
+                return e.object
+
 
 class ReturnFromTopLevel(Exception):
     def __init__(self, object):
diff --git a/spyvm/test/jit.py b/spyvm/test/jit.py
--- a/spyvm/test/jit.py
+++ b/spyvm/test/jit.py
@@ -49,32 +49,20 @@
 sys.setrecursionlimit(100000)
 
 class TestLLtype(LLJitMixin):
-    
 
     def test_miniloop(self):
 
-        def miniloop():
-            from spyvm import objspace
-            space = objspace.ObjSpace()
-            image = create_testimage(space)
-            interp = interpreter.Interpreter(space)
+        from spyvm import objspace
+        space = objspace.ObjSpace()
+        image = create_testimage(space)
+        interp = interpreter.Interpreter(space, image)
+
+
+        counter = 0
+
+        def interp_w():
 
             w_object = model.W_SmallInteger(0)
-
-            s_class = w_object.shadow_of_my_class(space)
-            w_method = s_class.lookup("loopTest")
-
-            assert w_method
-            w_frame = w_method.create_frame(space, w_object, [])
-            interp.store_w_active_context(w_frame)
-
-            counter = 0
-
-            from spyvm.interpreter import BYTECODE_TABLE
-            return interp
-
-        interp = miniloop()
-        def interp_w():
-            interp.interpret()
+            interp.perform(w_object, "loopTest")
 
         self.meta_interp(interp_w, [], listcomp=True, listops=True, backendopt=True)
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
@@ -19,6 +19,7 @@
     module.image = squeakimage.SqueakImage()
     module.image.from_reader(space, reader)
     module.space = space
+    module.interp = interpreter.Interpreter(space, image)
 
 def find_symbol(name):
     if name == "asSymbol":
@@ -188,30 +189,13 @@
 
 
 
-def test_lookup_abs_in_integer(int=10):
-    image = get_image()
-    interp = interpreter.Interpreter(space)
+def test_lookup_abs_in_integer():
+    for value in [10, -3, 0]:
 
-    w_object = model.W_SmallInteger(int)
+        w_object = model.W_SmallInteger(value)
+        w_res = interp.perform(w_object, "abs")
+        assert w_res.value == abs(value)
 
-    # Should get this from w_object
-    w_smallint_class = image.special(constants.SO_SMALLINTEGER_CLASS)
-    s_class = w_object.shadow_of_my_class(space)
-    w_method = s_class.lookup(find_symbol("abs"))
-
-    assert w_method
-    w_frame = w_method.create_frame(space, w_object, [])
-    interp.store_w_active_context(w_frame)
-
-    while True:
-        try:
-            interp.step(interp.s_active_context())
-        except interpreter.ReturnFromTopLevel, e:
-            assert e.object.value == abs(int)
-            return
-
-def test_lookup_neg_abs_in_integer():
-    test_lookup_abs_in_integer(-3)
 
 def test_map_mirrors_to_classtable():
     w_compiledmethod_class = image.special(constants.SO_COMPILEDMETHOD_CLASS)
@@ -289,25 +273,8 @@
     assert space.unwrap_int(w_result) == 42
        
 def perform(w_receiver, selector, *arguments_w):
-    return perform_with_space(space, w_receiver, selector, *arguments_w)
+    return interp.perform(w_receiver, selector, *arguments_w)
 
-def perform_with_space(space, w_receiver, selector, *arguments_w):
-    interp = interpreter.Interpreter(space)
-    s_class = w_receiver.shadow_of_my_class(space)
-    if isinstance(selector, str):
-        w_selector = find_symbol(selector)
-    else:
-        w_selector = selector
-    w_method = s_class.lookup(w_selector)
-    assert w_method
-    w_frame = w_method.create_frame(space, w_receiver, list(arguments_w))
-    interp.store_w_active_context(w_frame)
-    while True:
-        try:
-            interp.step(interp.s_active_context())
-            #print interp.s_active_context.stack
-        except interpreter.ReturnFromTopLevel, e:
-            return e.object
 
 def test_step_forged_image():
     from spyvm import wrapper


More information about the pypy-commit mailing list