[pypy-commit] lang-smalltalk storage: only force and store the sender if the context wasn't returned properly (it had an exception)

timfel noreply at buildbot.pypy.org
Wed Jul 9 16:18:20 CEST 2014


Author: Tim Felgentreff <timfelgentreff at gmail.com>
Branch: storage
Changeset: r872:04a55ec5b4d2
Date: 2014-07-09 16:11 +0200
http://bitbucket.org/pypy/lang-smalltalk/changeset/04a55ec5b4d2/

Log:	only force and store the sender if the context wasn't returned
	properly (it had an exception)

diff --git a/spyvm/interpreter.py b/spyvm/interpreter.py
--- a/spyvm/interpreter.py
+++ b/spyvm/interpreter.py
@@ -141,7 +141,7 @@
             # Cleanly leave the context. This will finish the virtual sender-reference, if
             # it is still there, which can happen in case of ProcessSwitch or StackOverflow;
             # in case of a Return, this will already be handled while unwinding the stack.
-            s_frame.finish_virtual_sender()
+            s_frame.finish_virtual_sender(s_sender)
 
     def step(self, context):
         bytecode = context.fetch_next_bytecode()
diff --git a/spyvm/shadow.py b/spyvm/shadow.py
--- a/spyvm/shadow.py
+++ b/spyvm/shadow.py
@@ -699,13 +699,15 @@
     def is_fresh(self):
         return self.direct_sender is None and self.virtual_sender is jit.vref_None
 
-    def finish_virtual_sender(self, save_direct_sender=True):
+    def finish_virtual_sender(self, s_sender):
         if self.virtual_sender is not jit.vref_None:
-            sender = self.virtual_sender() # xxx: check if we can move this down
-            jit.virtual_ref_finish(self.virtual_sender, sender)
+            if self.pc() != -1:
+                # stack is unrolling, but this frame was not
+                # marked_returned: it is an escaped frame
+                sender = self.virtual_sender()
+                self.direct_sender = sender
+            jit.virtual_ref_finish(self.virtual_sender, s_sender)
             self.virtual_sender = jit.vref_None
-            if save_direct_sender:
-                self.direct_sender = sender
 
     def store_s_sender(self, s_sender, raise_error=True):
         # If we have a virtual back reference, we must finish it before storing the direct reference.


More information about the pypy-commit mailing list