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