From f56a1167b8be0661724428274a908fcabb9ec9c6 Mon Sep 17 00:00:00 2001 From: Irit Katriel Date: Fri, 13 Sep 2024 22:07:21 +0100 Subject: [PATCH] Revert "gh-124022: Fix bug where class docstring is removed in interactive mode (#124023)" This reverts commit a9594a34c62487961be86c0925daaa43bb467bb9. --- Include/internal/pycore_compile.h | 3 +- Lib/test/test_compile.py | 35 ++++--------------- ...-09-12-21-53-26.gh-issue-124022.fQzUiW.rst | 1 - Python/codegen.c | 6 ++-- Python/compile.c | 4 +-- 5 files changed, 12 insertions(+), 37 deletions(-) delete mode 100644 Misc/NEWS.d/next/Core_and_Builtins/2024-09-12-21-53-26.gh-issue-124022.fQzUiW.rst diff --git a/Include/internal/pycore_compile.h b/Include/internal/pycore_compile.h index 5359f2d650e2a2..51db6fc608caf7 100644 --- a/Include/internal/pycore_compile.h +++ b/Include/internal/pycore_compile.h @@ -172,8 +172,7 @@ int _PyCompile_AddDeferredAnnotaion(struct _PyCompiler *c, stmt_ty s); int _PyCodegen_AddReturnAtEnd(struct _PyCompiler *c, int addNone); int _PyCodegen_EnterAnonymousScope(struct _PyCompiler* c, mod_ty mod); int _PyCodegen_Expression(struct _PyCompiler *c, expr_ty e); -int _PyCodegen_Body(struct _PyCompiler *c, _Py_SourceLocation loc, asdl_stmt_seq *stmts, - bool is_interactive); +int _PyCodegen_Body(struct _PyCompiler *c, _Py_SourceLocation loc, asdl_stmt_seq *stmts); /* Utility for a number of growing arrays used in the compiler */ int _PyCompile_EnsureArrayLargeEnough( diff --git a/Lib/test/test_compile.py b/Lib/test/test_compile.py index 736eff35c1d5f2..f22761f0a3af9f 100644 --- a/Lib/test/test_compile.py +++ b/Lib/test/test_compile.py @@ -902,28 +902,6 @@ def with_const_expression(): self.assertIsNone(ns['with_fstring'].__doc__) self.assertIsNone(ns['with_const_expression'].__doc__) - @support.cpython_only - def test_docstring_interactive_mode(self): - srcs = [ - """def with_docstring(): - "docstring" - """, - """class with_docstring: - "docstring" - """, - ] - - for opt in [0, 1, 2]: - for src in srcs: - with self.subTest(opt=opt, src=src): - code = compile(textwrap.dedent(src), "", "single", optimize=opt) - ns = {} - exec(code, ns) - if opt < 2: - self.assertEqual(ns['with_docstring'].__doc__, "docstring") - else: - self.assertIsNone(ns['with_docstring'].__doc__) - @support.cpython_only def test_docstring_omitted(self): # See gh-115347 @@ -941,13 +919,12 @@ class C: return h """) for opt in [-1, 0, 1, 2]: - for mode in ["exec", "single"]: - with self.subTest(opt=opt, mode=mode): - code = compile(src, "", mode, optimize=opt) - output = io.StringIO() - with contextlib.redirect_stdout(output): - dis.dis(code) - self.assertNotIn('NOP', output.getvalue()) + with self.subTest(opt=opt): + code = compile(src, "", "exec", optimize=opt) + output = io.StringIO() + with contextlib.redirect_stdout(output): + dis.dis(code) + self.assertNotIn('NOP' , output.getvalue()) def test_dont_merge_constants(self): # Issue #25843: compile() must not merge constants which are equal diff --git a/Misc/NEWS.d/next/Core_and_Builtins/2024-09-12-21-53-26.gh-issue-124022.fQzUiW.rst b/Misc/NEWS.d/next/Core_and_Builtins/2024-09-12-21-53-26.gh-issue-124022.fQzUiW.rst deleted file mode 100644 index 90a77a5346d22b..00000000000000 --- a/Misc/NEWS.d/next/Core_and_Builtins/2024-09-12-21-53-26.gh-issue-124022.fQzUiW.rst +++ /dev/null @@ -1 +0,0 @@ -Fix bug where docstring is removed from classes in interactive mode. diff --git a/Python/codegen.c b/Python/codegen.c index 5565d3011c465a..2ca5db1fc6ad34 100644 --- a/Python/codegen.c +++ b/Python/codegen.c @@ -746,7 +746,7 @@ _PyCodegen_Expression(compiler *c, expr_ty e) and for annotations. */ int -_PyCodegen_Body(compiler *c, location loc, asdl_stmt_seq *stmts, bool is_interactive) +_PyCodegen_Body(compiler *c, location loc, asdl_stmt_seq *stmts) { /* If from __future__ import annotations is active, * every annotated class and module should have __annotations__. @@ -758,7 +758,7 @@ _PyCodegen_Body(compiler *c, location loc, asdl_stmt_seq *stmts, bool is_interac return SUCCESS; } Py_ssize_t first_instr = 0; - if (!is_interactive) { /* A string literal on REPL prompt is not a docstring */ + if (!IS_INTERACTIVE(c)) { PyObject *docstring = _PyAST_GetDocString(stmts); if (docstring) { first_instr = 1; @@ -1432,7 +1432,7 @@ codegen_class_body(compiler *c, stmt_ty s, int firstlineno) ADDOP_N_IN_SCOPE(c, loc, STORE_DEREF, &_Py_ID(__classdict__), cellvars); } /* compile the body proper */ - RETURN_IF_ERROR_IN_SCOPE(c, _PyCodegen_Body(c, loc, s->v.ClassDef.body, false)); + RETURN_IF_ERROR_IN_SCOPE(c, _PyCodegen_Body(c, loc, s->v.ClassDef.body)); PyObject *static_attributes = _PyCompile_StaticAttributesAsTuple(c); if (static_attributes == NULL) { _PyCompile_ExitScope(c); diff --git a/Python/compile.c b/Python/compile.c index e1d2c30944d132..d54c320babc2b7 100644 --- a/Python/compile.c +++ b/Python/compile.c @@ -790,13 +790,13 @@ compiler_codegen(compiler *c, mod_ty mod) switch (mod->kind) { case Module_kind: { asdl_stmt_seq *stmts = mod->v.Module.body; - RETURN_IF_ERROR(_PyCodegen_Body(c, start_location(stmts), stmts, false)); + RETURN_IF_ERROR(_PyCodegen_Body(c, start_location(stmts), stmts)); break; } case Interactive_kind: { c->c_interactive = 1; asdl_stmt_seq *stmts = mod->v.Interactive.body; - RETURN_IF_ERROR(_PyCodegen_Body(c, start_location(stmts), stmts, true)); + RETURN_IF_ERROR(_PyCodegen_Body(c, start_location(stmts), stmts)); break; } case Expression_kind: {