Author: Armin Rigo <[email protected]>
Branch: reverse-debugger-updated
Changeset: r94565:5fc00945551a
Date: 2018-05-14 12:23 +0200
http://bitbucket.org/pypy/pypy/changeset/5fc00945551a/
Log: RPython fix: we can't pass around module objects, they must be fully
resolved by the flow graph
diff --git a/pypy/interpreter/astcompiler/codegen.py
b/pypy/interpreter/astcompiler/codegen.py
--- a/pypy/interpreter/astcompiler/codegen.py
+++ b/pypy/interpreter/astcompiler/codegen.py
@@ -1203,12 +1203,17 @@
sub.value.walkabout(self)
self._compile_slice(sub.slice, sub.ctx)
+ def _revdb_metavar(self, node):
+ # moved in its own function for the import statement
+ from pypy.interpreter.reverse_debugging import dbstate
+ if not dbstate.standard_code:
+ self.emit_op_arg(ops.LOAD_REVDB_VAR, node.metavar)
+ return True
+ return False
+
def visit_RevDBMetaVar(self, node):
- if self.space.reverse_debugging:
- dbstate = self.space.reverse_debugging.dbstate
- if not dbstate.standard_code:
- self.emit_op_arg(ops.LOAD_REVDB_VAR, node.metavar)
- return
+ if self.space.reverse_debugging and self._revdb_metavar(node):
+ return
self.error("Unknown character ('$NUM' is only valid in the "
"reverse-debugger)", node)
diff --git a/pypy/interpreter/baseobjspace.py b/pypy/interpreter/baseobjspace.py
--- a/pypy/interpreter/baseobjspace.py
+++ b/pypy/interpreter/baseobjspace.py
@@ -430,6 +430,8 @@
"""Base class for the interpreter-level implementations of object spaces.
http://pypy.readthedocs.org/en/latest/objspace.html"""
+ reverse_debugging = False
+
@not_rpython
def __init__(self, config=None):
"Basic initialization of objects."
@@ -441,16 +443,7 @@
from pypy.config.pypyoption import get_pypy_config
config = get_pypy_config(translating=False)
self.config = config
-
- if self.config.translation.reverse_debugger:
- # pre-import and attach to the space. This avoids a regular
- # translation seeing and executing the imports even if it
- # turns out that self.config.translation.reverse_debugger is
- # False.
- from pypy.interpreter import reverse_debugging
- self.reverse_debugging = reverse_debugging
- else:
- self.reverse_debugging = None
+ self.reverse_debugging = config.translation.reverse_debugger
self.builtin_modules = {}
self.reloading_modules = {}
@@ -469,7 +462,7 @@
def startup(self):
# To be called before using the space
if self.reverse_debugging:
- self.reverse_debugging.setup_revdb(self)
+ self._revdb_startup()
self.threadlocals.enter_thread(self)
@@ -896,6 +889,16 @@
self.interned_strings.set(s, w_s1)
return w_s1
+ def _revdb_startup(self):
+ # moved in its own function for the import statement
+ from pypy.interpreter.reverse_debugging import setup_revdb
+ setup_revdb(self)
+
+ def _revdb_standard_code(self):
+ # moved in its own function for the import statement
+ from pypy.interpreter.reverse_debugging import dbstate
+ return dbstate.standard_code
+
def _side_effects_ok(self):
# For the reverse debugger: we run compiled watchpoint
# expressions in a fast way that will crash if they have
@@ -912,7 +915,7 @@
# don't cache.
#
if self.reverse_debugging:
- return self.reverse_debugging.dbstate.standard_code
+ return self._revdb_standard_code()
return True
def is_interned_str(self, s):
diff --git a/pypy/interpreter/executioncontext.py
b/pypy/interpreter/executioncontext.py
--- a/pypy/interpreter/executioncontext.py
+++ b/pypy/interpreter/executioncontext.py
@@ -65,7 +65,7 @@
def enter(self, frame):
if self.space.reverse_debugging:
- self.space.reverse_debugging.enter_call(self.topframeref(), frame)
+ self._revdb_enter(frame)
frame.f_backref = self.topframeref
self.topframeref = jit.virtual_ref(frame)
@@ -87,8 +87,7 @@
frame_vref()
jit.virtual_ref_finish(frame_vref, frame)
if self.space.reverse_debugging:
- self.space.reverse_debugging.leave_call(self.topframeref(),
- got_exception)
+ self._revdb_leave(got_exception)
# ________________________________________________________________
@@ -159,7 +158,7 @@
trace function.
"""
if self.space.reverse_debugging:
- self.space.reverse_debugging.potential_stop_point(frame)
+ self._revdb_potential_stop_point(frame)
if (frame.get_w_f_trace() is None or self.is_tracing or
self.gettrace() is None):
return
@@ -392,6 +391,21 @@
if self.space.check_signal_action is not None:
self.space.check_signal_action.perform(self, None)
+ def _revdb_enter(self, frame):
+ # moved in its own function for the import statement
+ from pypy.interpreter.reverse_debugging import enter_call
+ enter_call(self.topframeref(), frame)
+
+ def _revdb_leave(self, got_exception):
+ # moved in its own function for the import statement
+ from pypy.interpreter.reverse_debugging import leave_call
+ leave_call(self.topframeref(), got_exception)
+
+ def _revdb_potential_stop_point(self, frame):
+ # moved in its own function for the import statement
+ from pypy.interpreter.reverse_debugging import potential_stop_point
+ potential_stop_point(frame)
+
def _freeze_(self):
raise Exception("ExecutionContext instances should not be seen during"
" translation. Now is a good time to inspect the"
diff --git a/pypy/interpreter/pyopcode.py b/pypy/interpreter/pyopcode.py
--- a/pypy/interpreter/pyopcode.py
+++ b/pypy/interpreter/pyopcode.py
@@ -1049,13 +1049,16 @@
def YIELD_VALUE(self, oparg, next_instr):
raise Yield
+ def _revdb_jump_backward(self, jumpto):
+ # moved in its own function for the import statement
+ from pypy.interpreter.reverse_debugging import jump_backward
+ jump_backward(self, jumpto)
+
def jump_absolute(self, jumpto, ec):
# this function is overridden by pypy.module.pypyjit.interp_jit
check_nonneg(jumpto)
- #
if self.space.reverse_debugging:
- self.space.reverse_debugging.jump_backward(self, jumpto)
- #
+ self._revdb_jump_backward(jumpto)
return jumpto
def JUMP_FORWARD(self, jumpby, next_instr):
@@ -1309,10 +1312,15 @@
w_dict = self.peekvalue()
self.space.setitem(w_dict, w_key, w_value)
+ def _revdb_load_var(self, oparg):
+ # moved in its own function for the import statement
+ from pypy.interpreter.reverse_debugging import load_metavar
+ w_var = load_metavar(oparg)
+ self.pushvalue(w_var)
+
def LOAD_REVDB_VAR(self, oparg, next_instr):
if self.space.reverse_debugging:
- w_var = self.space.reverse_debugging.load_metavar(oparg)
- self.pushvalue(w_var)
+ self._revdb_load_var(oparg)
else:
self.MISSING_OPCODE(oparg, next_instr)
diff --git a/pypy/module/__pypy__/interp_magic.py
b/pypy/module/__pypy__/interp_magic.py
--- a/pypy/module/__pypy__/interp_magic.py
+++ b/pypy/module/__pypy__/interp_magic.py
@@ -209,4 +209,5 @@
return space.newbool(space._side_effects_ok())
def revdb_stop(space):
- space.reverse_debugging.stop_point()
+ from pypy.interpreter.reverse_debugging import stop_point
+ stop_point()
diff --git a/pypy/module/micronumpy/compile.py
b/pypy/module/micronumpy/compile.py
--- a/pypy/module/micronumpy/compile.py
+++ b/pypy/module/micronumpy/compile.py
@@ -86,8 +86,6 @@
w_buffer = W_TypeObject("buffer")
w_type = W_TypeObject("type")
- reverse_debugging = None
-
def __init__(self, config=None):
"""NOT_RPYTHON"""
self.fromcache = InternalSpaceCache(self).getorbuild
diff --git a/pypy/module/signal/__init__.py b/pypy/module/signal/__init__.py
--- a/pypy/module/signal/__init__.py
+++ b/pypy/module/signal/__init__.py
@@ -47,7 +47,7 @@
space.actionflag.register_periodic_action(space.check_signal_action,
use_bytecode_counter=False)
if space.reverse_debugging:
- RDBSignalActionFlag = space.reverse_debugging.RDBSignalActionFlag
+ from pypy.interpreter.reverse_debugging import RDBSignalActionFlag
space.actionflag.__class__ = RDBSignalActionFlag
else:
space.actionflag.__class__ = interp_signal.SignalActionFlag
diff --git a/rpython/rlib/objectmodel.py b/rpython/rlib/objectmodel.py
--- a/rpython/rlib/objectmodel.py
+++ b/rpython/rlib/objectmodel.py
@@ -375,33 +375,34 @@
def revdb_flag_io_disabled():
- revdb = _import_revdb()
- if revdb and revdb.flag_io_disabled():
- return revdb
- return None
+ if not revdb_enabled():
+ return False
+ return _revdb_flag_io_disabled()
-def _import_revdb():
- "NOT_RPYTHON"
- return None
+def _revdb_flag_io_disabled():
+ # moved in its own function for the import statement
+ from rpython.rlib import revdb
+ return revdb.flag_io_disabled()
+
+@not_rpython
+def revdb_enabled():
+ return False
class Entry(ExtRegistryEntry):
- _about_ = _import_revdb
+ _about_ = revdb_enabled
def compute_result_annotation(self):
- revdb = None
+ from rpython.annotator import model as annmodel
config = self.bookkeeper.annotator.translator.config
if config.translation.reverse_debugger:
- from rpython.rlib import revdb
- return self.bookkeeper.immutablevalue(revdb)
+ return annmodel.s_True
+ else:
+ return annmodel.s_False
def specialize_call(self, hop):
from rpython.rtyper.lltypesystem import lltype
- revdb = None
- config = hop.rtyper.annotator.translator.config
- if config.translation.reverse_debugger:
- from rpython.rlib import revdb
hop.exception_cannot_occur()
- return hop.inputconst(lltype.Void, revdb)
+ return hop.inputconst(lltype.Bool, hop.s_result.const)
# ____________________________________________________________
diff --git a/rpython/rlib/rdtoa.py b/rpython/rlib/rdtoa.py
--- a/rpython/rlib/rdtoa.py
+++ b/rpython/rlib/rdtoa.py
@@ -54,9 +54,8 @@
def strtod(input):
if len(input) > _INT_LIMIT:
raise MemoryError
- revdb = objectmodel.revdb_flag_io_disabled()
- if revdb:
- return revdb.emulate_strtod(input)
+ if objectmodel.revdb_flag_io_disabled():
+ return _revdb_strtod(input)
end_ptr = lltype.malloc(rffi.CCHARPP.TO, 1, flavor='raw')
try:
# note: don't use the class scoped_view_charp here, it
@@ -241,9 +240,8 @@
special_strings=lower_special_strings, upper=False):
if precision > _INT_LIMIT:
raise MemoryError
- revdb = objectmodel.revdb_flag_io_disabled()
- if revdb:
- return revdb.emulate_dtoa(value)
+ if objectmodel.revdb_flag_io_disabled():
+ return _revdb_dtoa(value)
decpt_ptr = lltype.malloc(rffi.INTP.TO, 1, flavor='raw')
try:
sign_ptr = lltype.malloc(rffi.INTP.TO, 1, flavor='raw')
@@ -307,3 +305,13 @@
return dtoa(value, code, mode=mode, precision=precision, flags=flags,
special_strings=special_strings, upper=upper)
+
+def _revdb_strtod(input):
+ # moved in its own function for the import statement
+ from rpython.rlib import revdb
+ return revdb.emulate_strtod(input)
+
+def _revdb_dtoa(value):
+ # moved in its own function for the import statement
+ from rpython.rlib import revdb
+ return revdb.emulate_dtoa(value)
diff --git a/rpython/rtyper/lltypesystem/module/ll_math.py
b/rpython/rtyper/lltypesystem/module/ll_math.py
--- a/rpython/rtyper/lltypesystem/module/ll_math.py
+++ b/rpython/rtyper/lltypesystem/module/ll_math.py
@@ -185,9 +185,8 @@
mantissa = x
exponent = 0
else:
- revdb = objectmodel.revdb_flag_io_disabled()
- if revdb:
- return revdb.emulate_frexp(x)
+ if objectmodel.revdb_flag_io_disabled():
+ return _revdb_frexp(x)
exp_p = lltype.malloc(rffi.INTP.TO, 1, flavor='raw')
try:
mantissa = math_frexp(x, exp_p)
@@ -224,9 +223,8 @@
def ll_math_modf(x):
# some platforms don't do the right thing for NaNs and
# infinities, so we take care of special cases directly.
- revdb = objectmodel.revdb_flag_io_disabled()
- if revdb:
- return revdb.emulate_modf(x)
+ if objectmodel.revdb_flag_io_disabled():
+ return _revdb_modf(x)
if not isfinite(x):
if math.isnan(x):
return (x, x)
@@ -413,6 +411,18 @@
return func_with_new_name(ll_math, 'll_math_' + name)
+
+def _revdb_frexp(x):
+ # moved in its own function for the import statement
+ from rpython.rlib import revdb
+ return revdb.emulate_frexp(x)
+
+def _revdb_modf(x):
+ # moved in its own function for the import statement
+ from rpython.rlib import revdb
+ return revdb.emulate_modf(x)
+
+
# ____________________________________________________________
unary_math_functions = [
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit