[pypy-commit] lang-smalltalk storage: Refactoring, reduced code duplication.

anton_gulenko noreply at buildbot.pypy.org
Sat Jul 19 14:13:38 CEST 2014


Author: Anton Gulenko <anton.gulenko at googlemail.com>
Branch: storage
Changeset: r920:2dd2b3555772
Date: 2014-07-18 14:21 +0200
http://bitbucket.org/pypy/lang-smalltalk/changeset/2dd2b3555772/

Log:	Refactoring, reduced code duplication.

diff --git a/spyvm/interpreter.py b/spyvm/interpreter.py
--- a/spyvm/interpreter.py
+++ b/spyvm/interpreter.py
@@ -66,13 +66,9 @@
             try:
                 self.loop_bytecodes(s_new_context)
                 raise Exception("loop_bytecodes left without raising...")
-            except StackOverflow, e:
+            except ContextSwitchException, e:
                 if self.is_tracing():
-                    print "====== StackOverflow, contexts forced to heap at: %s" % e.s_new_context.short_str()
-                s_new_context = e.s_new_context
-            except SenderChainManipulation, e:
-                if self.is_tracing():
-                    print "====== SenderChainManipulation, contexts forced to heap at: %s" % e.s_new_context.short_str()
+                    e.print_trace(s_new_context)
                 s_new_context = e.s_new_context
             except Return, nlr:
                 assert nlr.s_target_context or nlr.is_local
@@ -83,13 +79,7 @@
                         s_new_context._activate_unwind_context(self)
                         s_new_context = s_sender
                 s_new_context.push(nlr.value)
-            except ProcessSwitch, p:
-                assert not self.space.suppress_process_switch.is_set(), "ProcessSwitch should be disabled..."
-                if self.is_tracing():
-                    print "====== Switched process from: %s" % s_new_context.short_str()
-                    print "====== to: %s " % p.s_new_context.short_str()
-                s_new_context = p.s_new_context
-
+    
     def loop_bytecodes(self, s_context, may_context_switch=True):
         old_pc = 0
         if not jit.we_are_jitted() and may_context_switch:
@@ -267,23 +257,34 @@
 class ContextSwitchException(Exception):
     """General Exception that causes the interpreter to leave
     the current context."""
+    
     _attrs_ = ["s_new_context"]
+    type = "ContextSwitch"
     def __init__(self, s_new_context):
         self.s_new_context = s_new_context
-
+    
+    def print_trace(self, old_context):
+        print "====== %s, contexts forced to heap at: %s" % (self.type, self.s_new_context.short_str())
+        
 class StackOverflow(ContextSwitchException):
     """This causes the current jit-loop to be left, dumping all virtualized objects to the heap.
     This breaks performance, so it should rarely happen.
     In case of severe performance problems, execute with -t and check if this occurrs."""
-
+    type = "Stack Overflow"
+    
 class ProcessSwitch(ContextSwitchException):
     """This causes the interpreter to switch the executed context.
     Triggered when switching the process."""
-
+    
+    def print_trace(self, old_context):
+        print "====== Switched process from: %s" % old_context.short_str()
+        print "====== to: %s " % self.s_new_context.short_str()
+    
 class SenderChainManipulation(ContextSwitchException):
     """Manipulation of the sender chain can invalidate the jitted C stack.
     We have to dump all virtual objects and rebuild the stack.
     We try to raise this as rarely as possible and as late as possible."""
+    type = "Sender Manipulation"
 
 import rpython.rlib.unroll
 if hasattr(unroll, "unrolling_zero"):


More information about the pypy-commit mailing list