Author: Maciej Fijalkowski <[email protected]>
Branch: kill-gen-store-back-in
Changeset: r63727:0e2f25bbead4
Date: 2013-04-28 20:33 +0200
http://bitbucket.org/pypy/pypy/changeset/0e2f25bbead4/
Log: I think enough to pass test_virtualizable
diff --git a/rpython/jit/metainterp/compile.py
b/rpython/jit/metainterp/compile.py
--- a/rpython/jit/metainterp/compile.py
+++ b/rpython/jit/metainterp/compile.py
@@ -714,12 +714,18 @@
rstack._stack_criticalcode_stop()
def handle_async_forcing(self, deadframe):
- from rpython.jit.metainterp.resume import force_from_resumedata
+ from rpython.jit.metainterp.resume import (force_from_resumedata,
+ AlreadyForced)
metainterp_sd = self.metainterp_sd
vinfo = self.jitdriver_sd.virtualizable_info
ginfo = self.jitdriver_sd.greenfield_info
- all_virtuals = force_from_resumedata(metainterp_sd, self, deadframe,
- vinfo, ginfo)
+ # there is some chance that this is already forced. In this case
+ # the virtualizable would have a token = NULL
+ try:
+ all_virtuals = force_from_resumedata(metainterp_sd, self,
deadframe,
+ vinfo, ginfo)
+ except AlreadyForced:
+ return
# The virtualizable data was stored on the real virtualizable above.
# Handle all_virtuals: keep them for later blackholing from the
# future failure of the GUARD_NOT_FORCED
diff --git a/rpython/jit/metainterp/pyjitpl.py
b/rpython/jit/metainterp/pyjitpl.py
--- a/rpython/jit/metainterp/pyjitpl.py
+++ b/rpython/jit/metainterp/pyjitpl.py
@@ -2461,12 +2461,13 @@
if vinfo is not None:
self.virtualizable_boxes = virtualizable_boxes
# just jumped away from assembler (case 4 in the comment in
- # virtualizable.py) into tracing (case 2); check that vable_token
- # is and stays NULL. Note the call to reset_vable_token() in
- # warmstate.py.
+ # virtualizable.py) into tracing (case 2); if we get the
+ # virtualizable from somewhere strange it might not be forced,
+ # do it
virtualizable_box = self.virtualizable_boxes[-1]
virtualizable = vinfo.unwrap_virtualizable_box(virtualizable_box)
- assert not vinfo.is_token_nonnull_gcref(virtualizable)
+ if vinfo.is_token_nonnull_gcref(virtualizable):
+ vinfo.clear_vable_token(virtualizable)
# fill the virtualizable with the local boxes
self.synchronize_virtualizable()
#
diff --git a/rpython/jit/metainterp/resume.py b/rpython/jit/metainterp/resume.py
--- a/rpython/jit/metainterp/resume.py
+++ b/rpython/jit/metainterp/resume.py
@@ -16,6 +16,9 @@
# because it needs to support optimize.py which encodes virtuals with
# arbitrary cycles and also to compress the information
+class AlreadyForced(Exception):
+ pass
+
class Snapshot(object):
__slots__ = ('prev', 'boxes')
@@ -1215,14 +1218,16 @@
virtualizable = self.decode_ref(numb.nums[index])
if self.resume_after_guard_not_forced == 1:
# in the middle of handle_async_forcing()
- assert vinfo.is_token_nonnull_gcref(virtualizable)
+ if not vinfo.is_token_nonnull_gcref(virtualizable):
+ raise AlreadyForced
vinfo.reset_token_gcref(virtualizable)
else:
# just jumped away from assembler (case 4 in the comment in
- # virtualizable.py) into tracing (case 2); check that vable_token
- # is and stays NULL. Note the call to reset_vable_token() in
- # warmstate.py.
- assert not vinfo.is_token_nonnull_gcref(virtualizable)
+ # virtualizable.py) into tracing (case 2); we might have non-forced
+ # virtualizable here, in case it comes from somewhere strange, just
+ # force it
+ if vinfo.is_token_nonnull_gcref(virtualizable):
+ vinfo.clear_vable_token(virtualizable)
return vinfo.write_from_resume_data_partial(virtualizable, self, numb)
def load_value_of_type(self, TYPE, tagged):
_______________________________________________
pypy-commit mailing list
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit