[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