From: Mark Shannon Date: Mon, 13 Jan 2020 12:51:26 +0000 (+0000) Subject: Cleanup exit code for interpreter. (GH-17756) X-Git-Tag: v3.9.0a3~84 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=e7c9f4aae1a8540fe8e9a8a5017b16f906f51068;p=thirdparty%2FPython%2Fcpython.git Cleanup exit code for interpreter. (GH-17756) --- diff --git a/Lib/test/test_code.py b/Lib/test/test_code.py index 656c46cfaa75..7bb824ea31da 100644 --- a/Lib/test/test_code.py +++ b/Lib/test/test_code.py @@ -434,42 +434,6 @@ if check_impl_detail(cpython=True) and ctypes is not None: tt.join() self.assertEqual(LAST_FREED, 500) - @cpython_only - def test_clean_stack_on_return(self): - - def f(x): - return x - - code = f.__code__ - ct = type(f.__code__) - - # Insert an extra LOAD_FAST, this duplicates the value of - # 'x' in the stack, leaking it if the frame is not properly - # cleaned up upon exit. - - bytecode = list(code.co_code) - bytecode.insert(-2, opcode.opmap['LOAD_FAST']) - bytecode.insert(-2, 0) - - c = ct(code.co_argcount, code.co_posonlyargcount, - code.co_kwonlyargcount, code.co_nlocals, code.co_stacksize+1, - code.co_flags, bytes(bytecode), - code.co_consts, code.co_names, code.co_varnames, - code.co_filename, code.co_name, code.co_firstlineno, - code.co_lnotab, code.co_freevars, code.co_cellvars) - new_function = type(f)(c, f.__globals__, 'nf', f.__defaults__, f.__closure__) - - class Var: - pass - the_object = Var() - var = weakref.ref(the_object) - - new_function(the_object) - - # Check if the_object is leaked - del the_object - assert var() is None - def test_main(verbose=None): from test import test_code diff --git a/Python/ceval.c b/Python/ceval.c index 3bbd0ca9667b..f780c212c5f2 100644 --- a/Python/ceval.c +++ b/Python/ceval.c @@ -1913,7 +1913,8 @@ main_loop: case TARGET(RETURN_VALUE): { retval = POP(); assert(f->f_iblock == 0); - goto exit_returning; + assert(EMPTY()); + goto exiting; } case TARGET(GET_AITER): { @@ -2083,7 +2084,7 @@ main_loop: /* and repeat... */ assert(f->f_lasti >= (int)sizeof(_Py_CODEUNIT)); f->f_lasti -= sizeof(_Py_CODEUNIT); - goto exit_yielding; + goto exiting; } case TARGET(YIELD_VALUE): { @@ -2100,7 +2101,7 @@ main_loop: } f->f_stacktop = stack_pointer; - goto exit_yielding; + goto exiting; } case TARGET(POP_EXCEPT): { @@ -3632,15 +3633,13 @@ exception_unwind: assert(retval == NULL); assert(_PyErr_Occurred(tstate)); -exit_returning: - /* Pop remaining stack entries. */ while (!EMPTY()) { PyObject *o = POP(); Py_XDECREF(o); } -exit_yielding: +exiting: if (tstate->use_tracing) { if (tstate->c_tracefunc) { if (call_trace_protected(tstate->c_tracefunc, tstate->c_traceobj,