[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