Author: Ronan Lamy <[email protected]>
Branch: __debug__-optimize
Changeset: r97084:5580f03f4baa
Date: 2019-08-06 22:10 +0100
http://bitbucket.org/pypy/pypy/changeset/5580f03f4baa/

Log:    Make handling of sys.flags.optimize closer to CPython and fix
        compile(..., optimize=-1)

diff --git a/pypy/bin/pyinteractive.py b/pypy/bin/pyinteractive.py
--- a/pypy/bin/pyinteractive.py
+++ b/pypy/bin/pyinteractive.py
@@ -42,7 +42,7 @@
     StrOption("warn",
               "warning control (arg is action:message:category:module:lineno)",
               default=None, cmdline="-W"),
- 
+
     ])
 
 pypy_init = gateway.applevel('''
@@ -102,10 +102,9 @@
         space.appexec([], """():
             import sys
             flags = list(sys.flags)
-            flags[6] = 2
+            flags[3] = 2
             sys.flags = type(sys.flags)(flags)
-            import __pypy__
-            __pypy__.set_debug(False)
+            __builtins__.__dict__['__debug__'] = False
         """)
 
     # call pypy_find_stdlib: the side-effect is that it sets sys.prefix and
@@ -119,7 +118,7 @@
     # set warning control options (if any)
     warn_arg = interactiveconfig.warn
     if warn_arg is not None:
-        space.appexec([space.wrap(warn_arg)], """(arg): 
+        space.appexec([space.wrap(warn_arg)], """(arg):
         import sys
         sys.warnoptions.append(arg)""")
 
@@ -202,6 +201,6 @@
 
 if __name__ == '__main__':
     if hasattr(sys, 'setrecursionlimit'):
-        # for running "python -i pyinteractive.py -Si -- py.py -Si" 
+        # for running "python -i pyinteractive.py -Si -- py.py -Si"
         sys.setrecursionlimit(3000)
     sys.exit(main_(sys.argv))
diff --git a/pypy/interpreter/app_main.py b/pypy/interpreter/app_main.py
--- a/pypy/interpreter/app_main.py
+++ b/pypy/interpreter/app_main.py
@@ -540,10 +540,6 @@
         sys.flags = type(sys.flags)(flags)
         sys.dont_write_bytecode = bool(sys.flags.dont_write_bytecode)
 
-        if sys.flags.optimize >= 1:
-            import __pypy__
-            __pypy__.set_debug(False)
-
     sys._xoptions = dict(x.split('=', 1) if '=' in x else (x, True)
                          for x in options['_xoptions'])
 
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
@@ -507,6 +507,7 @@
     def visit_Assert(self, asrt):
         if self.compile_info.optimize >= 1:
             return
+        assert self.compile_info.optimize == 0
         self.update_position(asrt.lineno)
         end = self.new_block()
         self.emit_jump(ops.JUMP_IF_NOT_DEBUG, end)
diff --git a/pypy/interpreter/pycompiler.py b/pypy/interpreter/pycompiler.py
--- a/pypy/interpreter/pycompiler.py
+++ b/pypy/interpreter/pycompiler.py
@@ -117,6 +117,8 @@
             check = True
         if not check:
             raise oefmt(self.space.w_TypeError, "invalid node type")
+        if optimize == -1:
+            optimize = self.space.sys.get_optimize()
 
         fut = misc.parse_future(node, self.future_flags.compiler_features)
         f_flags, f_lineno, f_col = fut
@@ -166,6 +168,9 @@
 
     def compile(self, source, filename, mode, flags, hidden_applevel=False,
             optimize=-1):
+        if optimize == -1:
+            optimize = self.space.sys.get_optimize()
+        assert optimize >= 0
         info = pyparse.CompileInfo(filename, mode, flags,
                 hidden_applevel=hidden_applevel, optimize=optimize)
         mod = self._compile_to_ast(source, info)
diff --git a/pypy/interpreter/pyopcode.py b/pypy/interpreter/pyopcode.py
--- a/pypy/interpreter/pyopcode.py
+++ b/pypy/interpreter/pyopcode.py
@@ -1181,7 +1181,7 @@
         return next_instr
 
     def JUMP_IF_NOT_DEBUG(self, jumpby, next_instr):
-        if not self.space.sys.debug:
+        if self.space.sys.get_optimize():
             next_instr += jumpby
         return next_instr
 
diff --git a/pypy/interpreter/pyparser/pyparse.py 
b/pypy/interpreter/pyparser/pyparse.py
--- a/pypy/interpreter/pyparser/pyparse.py
+++ b/pypy/interpreter/pyparser/pyparse.py
@@ -69,14 +69,14 @@
     * hidden_applevel: Will this code unit and sub units be hidden at the
       applevel?
     * optimize: optimization level:
-        -1 = same as interpreter,
          0 = no optmiziation,
          1 = remove asserts,
          2 = remove docstrings.
     """
 
     def __init__(self, filename, mode="exec", flags=0, future_pos=(0, 0),
-                 hidden_applevel=False, optimize=-1):
+                 hidden_applevel=False, optimize=0):
+        assert optimize >= 0
         rstring.check_str0(filename)
         self.filename = filename
         self.mode = mode
diff --git a/pypy/module/__builtin__/compiling.py 
b/pypy/module/__builtin__/compiling.py
--- a/pypy/module/__builtin__/compiling.py
+++ b/pypy/module/__builtin__/compiling.py
@@ -42,6 +42,10 @@
         raise oefmt(space.w_ValueError,
                     "compile() arg 3 must be 'exec', 'eval' or 'single'")
 
+    if optimize < -1 or optimize > 2:
+        raise oefmt(space.w_ValueError,
+            "compile(): invalid optimize value")
+
     if space.isinstance_w(w_source, space.gettypeobject(ast.W_AST.typedef)):
         if flags & consts.PyCF_ONLY_AST:
             return w_source
diff --git a/pypy/module/__builtin__/test/test_compile.py 
b/pypy/module/__builtin__/test/test_compile.py
--- a/pypy/module/__builtin__/test/test_compile.py
+++ b/pypy/module/__builtin__/test/test_compile.py
@@ -3,12 +3,18 @@
 
     def setup_method(self, method):
         space = self.space
-        self._sys_debug = space.sys.debug
+        self._w_flags = space.sys.get('flags')
         # imitate -O
-        space.sys.debug = False
+        space.appexec([], """():
+            import sys
+            flags = list(sys.flags)
+            flags[3] = 1
+            sys.flags = type(sys.flags)(flags)
+            """)
 
     def teardown_method(self, method):
-        self.space.sys.debug = self._sys_debug
+        space = self.space
+        space.setitem(space.sys.w_dict, space.newtext('flags'), self._w_flags)
 
     def test_O_optmize_0(self):
         """Test that assert is not ignored if -O flag is set but optimize=0."""
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
@@ -117,14 +117,6 @@
     """ Create a new empty list that has an underlying storage of length 
sizehint """
     return space.newlist_hint(sizehint)
 
-@unwrap_spec(debug=int)
-def set_debug(space, debug):
-    debug = bool(debug)
-    space.sys.debug = debug
-    space.setitem(space.builtin.w_dict,
-                  space.newtext('__debug__'),
-                  space.newbool(debug))
-
 @unwrap_spec(estimate=int)
 def add_memory_pressure(space, estimate):
     """ Add memory pressure of estimate bytes. Useful when calling a C function
diff --git a/pypy/module/__pypy__/moduledef.py 
b/pypy/module/__pypy__/moduledef.py
--- a/pypy/module/__pypy__/moduledef.py
+++ b/pypy/module/__pypy__/moduledef.py
@@ -72,7 +72,7 @@
     interpleveldefs = {
         'bufferable': 'interp_buffer.W_Bufferable',
     }
-        
+
 
 class Module(MixedModule):
     """ PyPy specific "magic" functions. A lot of them are experimental and
@@ -106,7 +106,6 @@
         'delitem_if_value_is'       : 'interp_dict.delitem_if_value_is',
         'move_to_end'               : 'interp_dict.move_to_end',
         'strategy'                  : 'interp_magic.strategy',  # dict,set,list
-        'set_debug'                 : 'interp_magic.set_debug',
         'locals_to_fast'            : 'interp_magic.locals_to_fast',
         'set_code_callback'         : 'interp_magic.set_code_callback',
         'decode_long'               : 'interp_magic.decode_long',
diff --git a/pypy/module/imp/importing.py b/pypy/module/imp/importing.py
--- a/pypy/module/imp/importing.py
+++ b/pypy/module/imp/importing.py
@@ -402,11 +402,7 @@
         raise oefmt(space.w_ImportError, "Bad magic number in %s", cpathname)
     #print "loading pyc file:", cpathname
     code_w = read_compiled_module(space, cpathname, source)
-    try:
-        optimize = space.sys.get_flag('optimize')
-    except RuntimeError:
-        # during bootstrapping
-        optimize = 0
+    optimize = space.sys.get_optimize()
     if optimize >= 2:
         code_w.remove_docstrings(space)
 
diff --git a/pypy/module/sys/moduledef.py b/pypy/module/sys/moduledef.py
--- a/pypy/module/sys/moduledef.py
+++ b/pypy/module/sys/moduledef.py
@@ -25,7 +25,6 @@
         self.recursionlimit = 1000
         self.defaultencoding = "utf-8"
         self.filesystemencoding = None
-        self.debug = True
         self.track_resources = False
         self.finalizing = False
         self.dlopenflags = rdynload._dlopen_default_mode()
@@ -239,3 +238,9 @@
     def get_state(self, space):
         from pypy.module.sys import state
         return state.get(space)
+
+    def get_optimize(self):
+        try:
+            return self.get_flag('optimize')
+        except RuntimeError:  # bootstrapping
+            return 0
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to