From: Neil Schemenauer Date: Wed, 14 Oct 2009 19:14:38 +0000 (+0000) Subject: Issue #1754094: Improve the stack depth calculation in the compiler. X-Git-Tag: v3.2a1~2394 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=e441cb71c73649da991d8bc418650f2748a58f72;p=thirdparty%2FPython%2Fcpython.git Issue #1754094: Improve the stack depth calculation in the compiler. There should be no other effect than a small decrease in memory use. --- diff --git a/Misc/NEWS b/Misc/NEWS index 101487ac83a8..4a82a5e879c5 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -12,6 +12,10 @@ What's New in Python 3.2 Alpha 1? Core and Builtins ----------------- +- Issue #1754094: Improve the stack depth calculation in the compiler. + There should be no other effect than a small decrease in memory use. + Patch by Christopher Tur Lesniewski-Laas. + - Issue #7065: Fix a crash in bytes.maketrans and bytearray.maketrans when using byte values greater than 127. Patch by egreen. diff --git a/Python/compile.c b/Python/compile.c index 24975b64a76d..d06a03b907be 100644 --- a/Python/compile.c +++ b/Python/compile.c @@ -772,7 +772,7 @@ opcode_stack_effect(int opcode, int oparg) case UNPACK_EX: return (oparg&0xFF) + (oparg>>8); case FOR_ITER: - return 1; + return 1; /* or -1, at end of iterator */ case STORE_ATTR: return -2; @@ -799,7 +799,7 @@ opcode_stack_effect(int opcode, int oparg) case COMPARE_OP: return -1; case IMPORT_NAME: - return 0; + return -1; case IMPORT_FROM: return 1; @@ -3546,7 +3546,7 @@ dfs(struct compiler *c, basicblock *b, struct assembler *a) static int stackdepth_walk(struct compiler *c, basicblock *b, int depth, int maxdepth) { - int i; + int i, target_depth; struct instr *instr; if (b->b_seen || b->b_startdepth >= depth) return maxdepth; @@ -3559,8 +3559,17 @@ stackdepth_walk(struct compiler *c, basicblock *b, int depth, int maxdepth) maxdepth = depth; assert(depth >= 0); /* invalid code or bug in stackdepth() */ if (instr->i_jrel || instr->i_jabs) { + target_depth = depth; + if (instr->i_opcode == FOR_ITER) { + target_depth = depth-2; + } else if (instr->i_opcode == SETUP_FINALLY || + instr->i_opcode == SETUP_EXCEPT) { + target_depth = depth+3; + if (target_depth > maxdepth) + maxdepth = target_depth; + } maxdepth = stackdepth_walk(c, instr->i_target, - depth, maxdepth); + target_depth, maxdepth); if (instr->i_opcode == JUMP_ABSOLUTE || instr->i_opcode == JUMP_FORWARD) { goto out; /* remaining code is dead */