Author: Tim Felgentreff <[email protected]>
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.
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit