summaryrefslogtreecommitdiffstats
path: root/Python/compile.c
diff options
context:
space:
mode:
authorMark Shannon <mark@hotpy.org>2022-03-17 16:14:57 (GMT)
committerGitHub <noreply@github.com>2022-03-17 16:14:57 (GMT)
commit3011a097bd9500c007bd8b8d005edeea895f6b44 (patch)
treed2637ab682e1265eaf23316add1039b3829abb19 /Python/compile.c
parentef1327e3b622e0cafdf8bfc1f480fed0dd386be6 (diff)
downloadcpython-3011a097bd9500c007bd8b8d005edeea895f6b44.zip
cpython-3011a097bd9500c007bd8b8d005edeea895f6b44.tar.gz
cpython-3011a097bd9500c007bd8b8d005edeea895f6b44.tar.bz2
Use low bit of LOAD_GLOBAL's oparg to indicate whether it should push an additional NULL. (GH-31933)
Diffstat (limited to 'Python/compile.c')
-rw-r--r--Python/compile.c15
1 files changed, 13 insertions, 2 deletions
diff --git a/Python/compile.c b/Python/compile.c
index ac9ddbc..950c44a 100644
--- a/Python/compile.c
+++ b/Python/compile.c
@@ -1000,7 +1000,7 @@ stack_effect(int opcode, int oparg, int jump)
return -1;
case LOAD_GLOBAL:
- return 1;
+ return (oparg & 1) + 1;
/* Exception handling pseudo-instructions */
case SETUP_FINALLY:
@@ -4185,8 +4185,12 @@ compiler_nameop(struct compiler *c, identifier name, expr_context_ty ctx)
assert(op);
arg = compiler_add_o(dict, mangled);
Py_DECREF(mangled);
- if (arg < 0)
+ if (arg < 0) {
return 0;
+ }
+ if (op == LOAD_GLOBAL) {
+ arg <<= 1;
+ }
return compiler_addop_i(c, op, arg);
}
@@ -8812,6 +8816,13 @@ optimize_basic_block(struct compiler *c, basicblock *bb, PyObject *consts)
break;
case KW_NAMES:
break;
+ case PUSH_NULL:
+ if (nextop == LOAD_GLOBAL && (inst[1].i_opcode & 1) == 0) {
+ inst->i_opcode = NOP;
+ inst->i_oparg = 0;
+ inst[1].i_oparg |= 1;
+ }
+ break;
default:
/* All HAS_CONST opcodes should be handled with LOAD_CONST */
assert (!HAS_CONST(inst->i_opcode));