Author: Armin Rigo <[email protected]>
Branch:
Changeset: r88203:a4d8923ea51b
Date: 2016-11-08 11:32 +0100
http://bitbucket.org/pypy/pypy/changeset/a4d8923ea51b/
Log: A further tweak: move the logic detecting MemoryError and stack
overflows in error.py, where it can be used for pyopcode.py too
diff --git a/pypy/interpreter/error.py b/pypy/interpreter/error.py
--- a/pypy/interpreter/error.py
+++ b/pypy/interpreter/error.py
@@ -7,6 +7,7 @@
from rpython.rlib import jit
from rpython.rlib.objectmodel import we_are_translated, specialize
+from rpython.rlib import rstackovf
from pypy.interpreter import debug
@@ -524,13 +525,37 @@
traceback.print_tb(exc[2], file=f)
return f.getvalue()
[email protected]_look_inside
def get_converted_unexpected_exception(space, e):
- if we_are_translated():
- from rpython.rlib.debug import debug_print_traceback
- debug_print_traceback()
- extra = '; internal traceback was dumped to stderr'
- else:
- extra = _convert_unexpected_exception_extra(space, e)
- return OperationError(space.w_SystemError, space.wrap(
- "unexpected internal exception (please report a bug): %r%s" %
- (e, extra)))
+ """This is used in two places when we get an non-OperationError
+ RPython exception: from gateway.py when calling an interp-level
+ function raises; and from pyopcode.py when we're exiting the
+ interpretation of the frame with an exception. Note that it
+ *cannot* be used in pyopcode.py: that place gets a
+ ContinueRunningNormally exception from the JIT, which must not end
+ up here!
+ """
+ try:
+ if not we_are_translated():
+ raise
+ raise e
+ except KeyboardInterrupt:
+ return OperationError(space.w_KeyboardInterrupt, space.w_None)
+ except MemoryError:
+ return OperationError(space.w_MemoryError, space.w_None)
+ except rstackovf.StackOverflow as e:
+ rstackovf.check_stack_overflow()
+ return oefmt(space.w_RuntimeError,
+ "maximum recursion depth exceeded")
+ except RuntimeError: # not on top of py.py
+ return OperationError(space.w_RuntimeError, space.w_None)
+ except:
+ if we_are_translated():
+ from rpython.rlib.debug import debug_print_traceback
+ debug_print_traceback()
+ extra = '; internal traceback was dumped to stderr'
+ else:
+ extra = _convert_unexpected_exception_extra(space, e)
+ return OperationError(space.w_SystemError, space.wrap(
+ "unexpected internal exception (please report a bug): %r%s" %
+ (e, extra)))
diff --git a/pypy/interpreter/gateway.py b/pypy/interpreter/gateway.py
--- a/pypy/interpreter/gateway.py
+++ b/pypy/interpreter/gateway.py
@@ -23,7 +23,6 @@
DescrMismatch)
from pypy.interpreter.error import OperationError, oefmt
from pypy.interpreter.function import ClassMethod, FunctionWithFixedCode
-from rpython.rlib import rstackovf
from rpython.rlib.objectmodel import we_are_translated
from rpython.rlib.rarithmetic import r_longlong, r_int, r_ulonglong, r_uint
from rpython.tool.sourcetools import func_with_new_name, compile2
@@ -714,16 +713,6 @@
raise e
except OperationError:
raise
- except KeyboardInterrupt:
- raise OperationError(space.w_KeyboardInterrupt, space.w_None)
- except MemoryError:
- raise OperationError(space.w_MemoryError, space.w_None)
- except rstackovf.StackOverflow as e:
- rstackovf.check_stack_overflow()
- raise oefmt(space.w_RuntimeError,
- "maximum recursion depth exceeded")
- except RuntimeError: # not on top of py.py
- raise OperationError(space.w_RuntimeError, space.w_None)
except Exception as e: # general fall-back
from pypy.interpreter import error
raise error.get_converted_unexpected_exception(space, e)
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit