[pypy-svn] pypy jitypes2: allow llfakeimpls to raise exceptions: this is needed e.g. for ll_os_stat, and
antocuni
commits-noreply at bitbucket.org
Tue Jan 25 10:49:54 CET 2011
Author: Antonio Cuni <anto.cuni at gmail.com>
Branch: jitypes2
Changeset: r41293:f532d93c171e
Date: 2011-01-25 10:49 +0100
http://bitbucket.org/pypy/pypy/changeset/f532d93c171e/
Log: allow llfakeimpls to raise exceptions: this is needed e.g. for
ll_os_stat, and in particular it's needed when trying to import a
package from pypyjit_demo.py when run using pypyjit.py
diff --git a/pypy/rpython/lltypesystem/lloperation.py b/pypy/rpython/lltypesystem/lloperation.py
--- a/pypy/rpython/lltypesystem/lloperation.py
+++ b/pypy/rpython/lltypesystem/lloperation.py
@@ -551,8 +551,8 @@
'debug_pdb': LLOp(),
'debug_assert': LLOp(tryfold=True),
'debug_fatalerror': LLOp(),
- 'debug_llinterpcall': LLOp(), # Python func call 'res=arg[0](*arg[1:])'
- # in backends, abort() or whatever is fine
+ 'debug_llinterpcall': LLOp(canraise=(Exception,)), # Python func call 'res=arg[0](*arg[1:])'
+ # in backends, abort() or whatever is fine
'debug_start_traceback': LLOp(),
'debug_record_traceback': LLOp(),
'debug_catch_exception': LLOp(),
diff --git a/pypy/rpython/llinterp.py b/pypy/rpython/llinterp.py
--- a/pypy/rpython/llinterp.py
+++ b/pypy/rpython/llinterp.py
@@ -531,7 +531,10 @@
raise LLFatalError(msg, LLException(ll_exc_type, ll_exc))
def op_debug_llinterpcall(self, pythonfunction, *args_ll):
- return pythonfunction(*args_ll)
+ try:
+ return pythonfunction(*args_ll)
+ except Exception, e:
+ self.make_llexception()
def op_debug_start_traceback(self, *args):
pass # xxx write debugging code here?
diff --git a/pypy/rpython/module/test/test_posix.py b/pypy/rpython/module/test/test_posix.py
--- a/pypy/rpython/module/test/test_posix.py
+++ b/pypy/rpython/module/test/test_posix.py
@@ -43,6 +43,17 @@
for i in range(len(stat)):
assert long(getattr(func, 'item%d' % i)) == stat[i]
+ def test_stat_exception(self):
+ def fo():
+ try:
+ posix.stat('I/do/not/exist')
+ except OSError:
+ return True
+ else:
+ return False
+ res = self.interpret(fo,[])
+ assert res
+
def test_times(self):
import py; py.test.skip("llinterp does not like tuple returns")
from pypy.rpython.test.test_llinterp import interpret
@@ -200,5 +211,8 @@
def test_stat(self):
py.test.skip("ootypesystem does not support os.stat")
+ def test_stat_exception(self):
+ py.test.skip("ootypesystem does not support os.stat")
+
def test_chown(self):
py.test.skip("ootypesystem does not support os.chown")
More information about the Pypy-commit
mailing list