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

Reply via email to