Author: Maciej Fijalkowski <[email protected]>
Branch: share-guard-info
Changeset: r79751:a139878f9977
Date: 2015-09-22 11:10 +0200
http://bitbucket.org/pypy/pypy/changeset/a139878f9977/
Log: whack at pyjitpl until the first overflow test passes
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
@@ -238,7 +238,8 @@
resbox = self.execute(rop.%s, b1, b2)
self.make_result_of_lastop(resbox) # same as execute_varargs()
if not isinstance(resbox, Const):
- self.metainterp.handle_possible_overflow_error(lbl, orgpc)
+ return self.handle_possible_overflow_error(lbl, orgpc,
+ resbox)
return resbox
''' % (_opimpl, resop)).compile()
@@ -1459,6 +1460,17 @@
def setup_resume_at_op(self, pc):
self.pc = pc
+ def handle_possible_overflow_error(self, label, orgpc, resbox):
+ if self.metainterp.ovf_flag:
+ self.metainterp.generate_guard(rop.GUARD_OVERFLOW, None,
+ resumepc=orgpc)
+ self.pc = label
+ return None
+ else:
+ self.metainterp.generate_guard(rop.GUARD_NO_OVERFLOW, None,
+ resumepc=orgpc)
+ return resbox
+
def run_one_step(self):
# Execute the frame forward. This method contains a loop that leaves
# whenever the 'opcode_implementations' (which is one of the 'opimpl_'
@@ -2024,8 +2036,7 @@
else:
moreargs = list(extraargs)
if opnum == rop.GUARD_EXCEPTION:
- guard_op = self.history.record(opnum, moreargs,
- lltype.nullptr(llmemory.GCREF.TO))
+ guard_op = self.history.record(opnum, moreargs, None)
else:
guard_op = self.history.record(opnum, moreargs, None)
assert isinstance(guard_op, GuardResOp)
@@ -2746,13 +2757,6 @@
else:
self.generate_guard(rop.GUARD_NO_EXCEPTION, None, [])
- def handle_possible_overflow_error(self, label, orgpc):
- if self.ovf_flag:
- self.generate_guard(rop.GUARD_OVERFLOW, None, resumepc=orgpc)
- self.pc = label
- else:
- self.generate_guard(rop.GUARD_NO_OVERFLOW, None, resumepc=orgpc)
-
def assert_no_exception(self):
assert not self.last_exc_value
@@ -3202,16 +3206,17 @@
print '-> %r' % (resultbox,)
assert argcodes[next_argcode] == '>'
result_argcode = argcodes[next_argcode + 1]
- assert resultbox.type == {'i': history.INT,
- 'r': history.REF,
- 'f': history.FLOAT}[result_argcode]
+ if 'ovf' not in name:
+ assert resultbox.type == {'i': history.INT,
+ 'r': history.REF,
+ 'f':
history.FLOAT}[result_argcode]
else:
resultbox = unboundmethod(self, *args)
#
if resultbox is not None:
self.make_result_of_lastop(resultbox)
elif not we_are_translated():
- assert self._result_argcode in 'v?'
+ assert self._result_argcode in 'v?' or 'ovf' in name
#
unboundmethod = getattr(MIFrame, 'opimpl_' + name).im_func
argtypes = unrolling_iterable(unboundmethod.argtypes)
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit