Author: Anton Gulenko <[email protected]>
Branch: storage
Changeset: r804:f70b00c04fab
Date: 2014-05-07 14:27 +0200
http://bitbucket.org/pypy/lang-smalltalk/changeset/f70b00c04fab/
Log: Small improvements in interpreter.py
diff --git a/spyvm/interpreter.py b/spyvm/interpreter.py
--- a/spyvm/interpreter.py
+++ b/spyvm/interpreter.py
@@ -60,19 +60,6 @@
self.trace = trace
self.trace_proxy = False
- def interpret_with_w_frame(self, w_frame):
- try:
- self.loop(w_frame)
- except ReturnFromTopLevel, e:
- return e.object
-
- def should_trace(self, primitives=False):
- if objectmodel.we_are_translated() or conftest.option is None:
- return False
- if not primitives:
- return conftest.option.bc_trace
- return conftest.option.prim_trace
-
def loop(self, w_active_context):
# just a trampoline for the actual loop implemented in c_loop
self._loop = True
@@ -108,8 +95,7 @@
pc = s_context.pc()
if pc < old_pc:
if jit.we_are_jitted():
- self.quick_check_for_interrupt(s_context,
- dec=self._get_adapted_tick_counter())
+ self.jitted_check_for_interrupt(s_context)
self.jit_driver.can_enter_jit(
pc=pc, self=self, method=method,
s_context=s_context)
@@ -128,14 +114,6 @@
else:
s_context.push(nlr.value)
- def _get_adapted_tick_counter(self):
- # Normally, the tick counter is decremented by 1 for every message
send.
- # Since we don't know how many messages are called during this trace,
we
- # just decrement by 100th of the trace length (num of bytecodes).
- trace_length = jit.current_trace_length()
- decr_by = int(trace_length // 100)
- return max(decr_by, 1)
-
def stack_frame(self, s_new_frame, may_context_switch=True):
if not self._loop:
return s_new_frame # this test is done to not loop in test,
@@ -150,30 +128,17 @@
self.remaining_stack_depth += 1
return retval
- def perform(self, w_receiver, selector, *arguments_w):
- if isinstance(selector, str):
- 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_method = model.W_CompiledMethod(self.space, header=512)
- w_method.literalatput0(self.space, 1, w_selector)
- assert len(arguments_w) <= 7
- w_method.setbytes([chr(131), chr(len(arguments_w) << 5 + 0),
chr(124)]) #returnTopFromMethod
- s_frame = MethodContextShadow(self.space, None, w_method, w_receiver,
[])
- s_frame.push(w_receiver)
- s_frame.push_all(list(arguments_w))
-
- self.interrupt_check_counter = self.interrupt_counter_size
- try:
- self.loop(s_frame.w_self())
- except ReturnFromTopLevel, e:
- return e.object
-
+ # ============== Methods for handling user interrupts ==============
+
+ def jitted_check_for_interrupt(self, s_frame):
+ # Normally, the tick counter is decremented by 1 for every
message send.
+ # Since we don't know how many messages are called during this trace,
we
+ # just decrement by 100th of the trace length (num of bytecodes).
+ trace_length = jit.current_trace_length()
+ decr_by = int(trace_length // 100)
+ decr_by = max(decr_by, 1)
+ self.quick_check_for_interrupt(s_frame, decr_by)
+
def quick_check_for_interrupt(self, s_frame, dec=1):
self.interrupt_check_counter -= dec
if self.interrupt_check_counter <= 0:
@@ -206,9 +171,47 @@
from rpython.rlib.rarithmetic import intmask
return intmask(int((time.time() - self.startup_time) * 1000) &
constants.TAGGED_MASK)
- def padding(self, symbol=' '):
+ # ============== Methods for the tracing functionality ==============
+
+ def padding(self, symbol=' '):
return symbol * (self.max_stack_depth - self.remaining_stack_depth)
+
+ def should_trace(self, primitives=False):
+ if objectmodel.we_are_translated() or conftest.option is None:
+ return False
+ if not primitives:
+ return conftest.option.bc_trace
+ return conftest.option.prim_trace
+
+ # ============== Convenience methods for executing code ==============
+
+ def interpret_toplevel(self, w_frame):
+ try:
+ self.loop(w_frame)
+ except ReturnFromTopLevel, e:
+ return e.object
+
+ def perform(self, w_receiver, selector, *arguments_w):
+ if isinstance(selector, str):
+ 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_method = model.W_CompiledMethod(self.space, header=512)
+ w_method.literalatput0(self.space, 1, w_selector)
+ assert len(arguments_w) <= 7
+ w_method.setbytes([chr(131), chr(len(arguments_w) << 5 + 0),
chr(124)]) #returnTopFromMethod
+ s_frame = MethodContextShadow(self.space, None, w_method, w_receiver,
[])
+ s_frame.push(w_receiver)
+ s_frame.push_all(list(arguments_w))
+
+ self.interrupt_check_counter = self.interrupt_counter_size
+ return self.interpret_toplevel(s_frame.w_self())
+
class ReturnFromTopLevel(Exception):
_attrs_ = ["object"]
def __init__(self, object):
diff --git a/spyvm/test/test_interpreter.py b/spyvm/test/test_interpreter.py
--- a/spyvm/test/test_interpreter.py
+++ b/spyvm/test/test_interpreter.py
@@ -461,7 +461,7 @@
s_frame.w_method().setliterals(literals)
s_frame.push(w_object)
s_frame.push(space.wrap_int(8))
- result = interp.interpret_with_w_frame(w_frame)
+ result = interp.interpret_toplevel(w_frame)
assert space.unwrap_int(result) == 34
def test_send_to_primitive():
@@ -701,7 +701,7 @@
bcode = "".join([chr(x) for x in bcodes])
w_frame, s_frame = new_frame(bcode, receiver=receiver)
s_frame.w_method().setliterals(literals)
- return interp.interpret_with_w_frame(w_frame)
+ return interp.interpret_toplevel(w_frame)
# tests: bytecodePrimValue & bytecodePrimValueWithArg
def test_bc_3_plus_4():
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
@@ -214,7 +214,7 @@
ap.store_suspended_context(space.w_nil)
interp = interpreter.Interpreter(space)
- interp.interpret_with_w_frame(w_ctx)
+ interp.interpret_toplevel(w_ctx)
def test_compile_method():
sourcecode = """fib
diff --git a/targetimageloadingsmalltalk.py b/targetimageloadingsmalltalk.py
--- a/targetimageloadingsmalltalk.py
+++ b/targetimageloadingsmalltalk.py
@@ -62,7 +62,7 @@
assert isinstance(w_ctx, model.W_PointersObject)
ap.store_suspended_context(space.w_nil)
try:
- return interp.interpret_with_w_frame(w_ctx)
+ return interp.interpret_toplevel(w_ctx)
except error.Exit, e:
print e.msg
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit