[pypy-commit] pypy py3.3: Implement docstring stripping for compile(..., optimize=2).

kvas noreply at buildbot.pypy.org
Sun Jul 27 13:50:37 CEST 2014


Author: Vasily Kuznetsov <kvas.it at gmail.com>
Branch: py3.3
Changeset: r72561:17f769cdad0a
Date: 2014-07-27 13:27 +0200
http://bitbucket.org/pypy/pypy/changeset/17f769cdad0a/

Log:	Implement docstring stripping for compile(..., optimize=2).

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
@@ -244,7 +244,7 @@
         self.emit_op_arg(op, self.add_name(container, identifier))
 
     def possible_docstring(self, node):
-        if isinstance(node, ast.Expr):
+        if isinstance(node, ast.Expr) and self.compile_info.optimize < 2:
             expr_value = node.value
             if isinstance(expr_value, ast.Str):
                 return expr_value
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
@@ -1,8 +1,7 @@
 class AppTestCompile:
 
-    # TODO: This test still fails for now because the docstrings are not
-    #       removed with optimize=2.
-    def untest_compile(self):
+    def test_compile(self):
+        """Clone of the part of the original test that was failing."""
         import ast
 
         codestr = '''def f():
@@ -37,7 +36,7 @@
                 assert rv == (debugval, docstring)
 
     def test_assert_remove(self):
-        """Test just removal of the asserts with optimize=1."""
+        """Test removal of the asserts with optimize=1."""
         import ast
 
         code = """def f():
@@ -50,9 +49,41 @@
             exec(compiled, ns)
             ns['f']()
 
+    def test_docstring_remove(self):
+        """Test removal of docstrings with optimize=2."""
+        import ast
+        import marshal
 
-# TODO: Remove docstrings with optimize=2.
+        code = """
+'module_doc'
+
+def f():
+    'func_doc'
+
+class C:
+    'class_doc'
+"""
+        tree = ast.parse(code)
+        for to_compile in [code, tree]:
+            compiled = compile(to_compile, "<test>", "exec", optimize=2)
+
+            # check that the docstrings are really gone
+            marshalled = str(marshal.dumps(compiled))
+            assert 'module_doc' not in marshalled
+            assert 'func_doc' not in marshalled
+            assert 'class_doc' not in marshalled
+
+            # try to execute the bytecode and see what we get
+            ns = {}
+            exec(compiled, ns)
+            assert '__doc__' not in ns
+            assert ns['f'].__doc__ is None
+            assert ns['C'].__doc__ is None
+
+
 # TODO: Check the value of __debug__ inside of the compiled block!
 #       According to the documentation, it should follow the optimize flag.
+#       However, cpython3.3 behaves the same way as PyPy (__debug__ follows
+#       -O, -OO flags of the interpreter).
 # TODO: It would also be good to test that with the assert is not removed and
 #       is executed when -O flag is set but optimize=0.


More information about the pypy-commit mailing list