Author: Armin Rigo <ar...@tunes.org> 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 pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit