[pypy-svn] r61801 - in pypy/branch/pyjitpl5/pypy/jit: backend/llgraph metainterp metainterp/test
arigo at codespeak.net
arigo at codespeak.net
Thu Feb 12 17:58:09 CET 2009
Author: arigo
Date: Thu Feb 12 17:58:08 2009
New Revision: 61801
Modified:
pypy/branch/pyjitpl5/pypy/jit/backend/llgraph/llimpl.py
pypy/branch/pyjitpl5/pypy/jit/metainterp/pyjitpl.py
pypy/branch/pyjitpl5/pypy/jit/metainterp/test/test_exception.py
Log:
(fijal, arigo)
Test and fix for exceptions.
Modified: pypy/branch/pyjitpl5/pypy/jit/backend/llgraph/llimpl.py
==============================================================================
--- pypy/branch/pyjitpl5/pypy/jit/backend/llgraph/llimpl.py (original)
+++ pypy/branch/pyjitpl5/pypy/jit/backend/llgraph/llimpl.py Thu Feb 12 17:58:08 2009
@@ -75,7 +75,8 @@
'guard_false' : (('bool',), None),
'guard_value' : (('int', 'int'), None),
'guard_class' : (('ptr', 'ptr'), None),
- 'guard_exception' : (('ptr',), None),
+ 'guard_no_exception' : ((), None),
+ 'guard_exception' : (('ptr',), 'ptr'),
'guard_nonvirtualized__4' : (('ptr', 'int'), None),
'newstr' : (('int',), 'ptr'),
'strlen' : (('ptr',), 'int'),
@@ -616,20 +617,24 @@
op_guard_nonvirtualized_ptr = op_guard_nonvirtualized__4
+ def op_guard_no_exception(self):
+ if self.last_exception:
+ self.last_exception_handled = True
+ raise GuardFailed
+
def op_guard_exception(self, expected_exception):
expected_exception = llmemory.cast_adr_to_ptr(
self.cpu.cast_int_to_adr(expected_exception),
rclass.CLASSTYPE)
+ assert expected_exception
if self.last_exception:
got = self.last_exception.args[0]
self.last_exception_handled = True
- if not expected_exception:
- raise GuardFailed
if not rclass.ll_issubclass(got, expected_exception):
raise GuardFailed
+ return self.last_exception.args[1]
else:
- if expected_exception:
- raise GuardFailed
+ raise GuardFailed
def op_new(self, typesize):
TYPE = symbolic.Size2Type[typesize]
Modified: pypy/branch/pyjitpl5/pypy/jit/metainterp/pyjitpl.py
==============================================================================
--- pypy/branch/pyjitpl5/pypy/jit/metainterp/pyjitpl.py (original)
+++ pypy/branch/pyjitpl5/pypy/jit/metainterp/pyjitpl.py Thu Feb 12 17:58:08 2009
@@ -693,7 +693,8 @@
def handle_guard_failure(self, guard_failure):
orig_boxes = self.initialize_state_from_guard_failure(guard_failure)
try:
- if guard_failure.guard_op.opname == 'guard_exception':
+ if guard_failure.guard_op.opname in ['guard_exception',
+ 'guard_no_exception']:
self.raise_exception_upon_guard_failure(guard_failure)
self.interpret()
assert False, "should always raise"
@@ -816,14 +817,17 @@
self.handle_exception(etype, evalue)
def handle_exception(self, etype, evalue):
- exception_box = ConstInt(etype)
frame = self.framestack[-1]
- frame.generate_guard(frame.pc, 'guard_exception',
- None, [exception_box])
if etype:
+ exception_box = ConstInt(etype)
exc_value_box = BoxPtr(evalue)
+ op = frame.generate_guard(frame.pc, 'guard_exception',
+ None, [exception_box])
+ if op:
+ op.results = [exc_value_box]
return self.finishframe_exception(exception_box, exc_value_box)
else:
+ frame.generate_guard(frame.pc, 'guard_no_exception', None, [])
return False
## def forced_vars_after_guard_failure(self, guard_failure):
Modified: pypy/branch/pyjitpl5/pypy/jit/metainterp/test/test_exception.py
==============================================================================
--- pypy/branch/pyjitpl5/pypy/jit/metainterp/test/test_exception.py (original)
+++ pypy/branch/pyjitpl5/pypy/jit/metainterp/test/test_exception.py Thu Feb 12 17:58:08 2009
@@ -9,17 +9,17 @@
def test_simple(self):
def g(n):
if n <= 0:
- raise IndexError
+ raise MyError(n)
return n - 1
def f(n):
try:
return g(n)
- except IndexError:
- return 5
+ except MyError, e:
+ return e.n + 10
res = self.interp_operations(f, [9])
assert res == 8
res = self.interp_operations(f, [-99])
- assert res == 5
+ assert res == -89
def test_no_exception(self):
myjitdriver = JitDriver(greens = [], reds = ['n'])
@@ -81,16 +81,17 @@
myjitdriver = JitDriver(greens = [], reds = ['n'])
def check(n):
if n > -100:
- raise IndexError
+ raise MyError(n)
def f(n):
while n > 0:
myjitdriver.can_enter_jit(n=n)
myjitdriver.jit_merge_point(n=n)
try:
check(n)
- except IndexError:
- n = n - 5
+ except MyError, e:
+ n = e.n - 5
return n
+ assert f(53) == -2
res = self.meta_interp(f, [53], policy=StopAtXPolicy(check))
assert res == -2
@@ -177,7 +178,7 @@
myjitdriver = JitDriver(greens = [], reds = ['n'])
def check(n):
if n < 0:
- raise IndexError
+ raise MyError(n)
return 5
def f(n):
try:
@@ -185,8 +186,9 @@
myjitdriver.can_enter_jit(n=n)
myjitdriver.jit_merge_point(n=n)
n = n - check(n)
- except IndexError:
- return n
+ except MyError, e:
+ return e.n
+ assert f(53) == -2
res = self.meta_interp(f, [53], policy=StopAtXPolicy(check))
assert res == -2
More information about the Pypy-commit
mailing list