Index: Python/ceval.c =================================================================== --- Python/ceval.c (revision 53439) +++ Python/ceval.c (working copy) @@ -2298,6 +2298,7 @@ break; } + case MAKE_CLOSURE: case MAKE_FUNCTION: { int posdefaults = oparg & 0xff; @@ -2307,6 +2308,12 @@ v = POP(); /* code object */ x = PyFunction_New(v, f->f_globals); Py_DECREF(v); + + if (x != NULL && opcode == MAKE_CLOSURE) { + v = POP(); + err = PyFunction_SetClosure(x, v); + Py_DECREF(v); + } if (x != NULL && num_annotations > 0) { Py_ssize_t name_ix; @@ -2368,34 +2375,6 @@ break; } - case MAKE_CLOSURE: - { - v = POP(); /* code object */ - x = PyFunction_New(v, f->f_globals); - Py_DECREF(v); - if (x != NULL) { - v = POP(); - err = PyFunction_SetClosure(x, v); - Py_DECREF(v); - } - if (x != NULL && oparg > 0) { - v = PyTuple_New(oparg); - if (v == NULL) { - Py_DECREF(x); - x = NULL; - break; - } - while (--oparg >= 0) { - w = POP(); - PyTuple_SET_ITEM(v, oparg, w); - } - err = PyFunction_SetDefaults(x, v); - Py_DECREF(v); - } - PUSH(x); - break; - } - case BUILD_SLICE: if (oparg == 3) w = POP(); Index: Python/compile.c =================================================================== --- Python/compile.c (revision 53439) +++ Python/compile.c (working copy) @@ -842,6 +842,8 @@ return -NARGS(oparg)-2; case MAKE_FUNCTION: return -NARGS(oparg) - ((oparg >> 16) & 0xffff); + case MAKE_CLOSURE: + return -1 - NARGS(oparg) - ((oparg >> 16) & 0xffff); #undef NARGS case BUILD_SLICE: if (oparg == 3) @@ -849,8 +851,6 @@ else return -1; - case MAKE_CLOSURE: - return -oparg; case LOAD_CLOSURE: return 1; case LOAD_DEREF: Index: Lib/test/test_grammar.py =================================================================== --- Lib/test/test_grammar.py (revision 53439) +++ Lib/test/test_grammar.py (working copy) @@ -321,6 +321,13 @@ self.assertEquals(f.func_annotations, {'b': 1, 'c': 2, 'e': 3, 'g': 6, 'h': 7, 'j': 9, 'k': 11, 'return': 12}) + + # test MAKE_CLOSURE with a variety of oparg's + closure = 1 + def f(): return closure + def f(x=1): return closure + def f(*, k=1): return closure + def f() -> int: return closure def testLambdef(self): ### lambdef: 'lambda' [varargslist] ':' test