Author: Anton Gulenko <anton.gule...@googlemail.com>
Branch: storage-refactoring-virtual-pc
Changeset: r821:6d70e836aec8
Date: 2014-05-14 13:30 +0200
http://bitbucket.org/pypy/lang-smalltalk/changeset/6d70e836aec8/

Log:    Added common superclass for ProcessSwitch and StackOverflow.

diff --git a/spyvm/interpreter.py b/spyvm/interpreter.py
--- a/spyvm/interpreter.py
+++ b/spyvm/interpreter.py
@@ -72,7 +72,7 @@
                 self.loop_bytecodes(s_new_context)
                 raise Exception("loop_bytecodes left without raising...")
             except StackOverflow, e:
-                s_new_context = e.s_context
+                s_new_context = e.s_new_context
             except Return, nlr:
                 s_new_context = s_sender
                 while s_new_context is not nlr.s_target_context:
@@ -221,22 +221,27 @@
     def __init__(self, object):
         self.object = object
 
-class StackOverflow(Exception):
-    _attrs_ = ["s_context"]
-    def __init__(self, s_top_context):
-        self.s_context = s_top_context
-
 class Return(Exception):
     _attrs_ = ["value", "s_target_context"]
-    def __init__(self, object, s_context):
-        self.value = object
-        self.s_target_context = s_context
+    def __init__(self, s_target_context, w_result):
+        self.value = w_result
+        self.s_target_context = s_target_context
 
-class ProcessSwitch(Exception):
+class ContextSwitchException(Exception):
+    """General Exception that causes the interpreter to leave
+    the current context. The current pc is required in order to update
+    the context object that we are leaving."""
     _attrs_ = ["s_new_context"]
-    def __init__(self, s_context):
-        self.s_new_context = s_context
+    def __init__(self, s_new_context):
+        self.s_new_context = s_new_context
 
+class StackOverflow(ContextSwitchException):
+    """This causes the current jit-loop to be left.
+    This is an experimental mechanism to avoid stack-overflow errors
+    on OS level, and we suspect it breaks jit performance at least 
sometimes."""
+
+class ProcessSwitch(ContextSwitchException):
+    """This causes the interpreter to switch the executed context."""
 
 def make_call_primitive_bytecode(primitive, selector, argcount):
     def callPrimitive(self, interp, current_bytecode):
@@ -443,7 +448,7 @@
 
         if interp.trace:
             print '%s<- %s' % (interp.padding(), return_value.as_repr_string())
-        raise Return(return_value, s_return_to)
+        raise Return(s_return_to, return_value)
 
     def activate_unwind_context(self, interp):
         # the first temp is executed flag for both #ensure: and #ifCurtailed:
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
@@ -1008,7 +1008,7 @@
         interp._loop = True
         interp.loop_bytecodes(w_method.create_frame(space, space.wrap_int(0), 
[]))
     except interpreter.StackOverflow, e:
-        assert isinstance(e.s_context, shadow.MethodContextShadow)
+        assert isinstance(e.s_new_context, shadow.MethodContextShadow)
     except interpreter.ReturnFromTopLevel, e:
         assert False
 
_______________________________________________
pypy-commit mailing list
pypy-commit@python.org
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to