[Python-checkins] r75422 - in python/branches/py3k: Misc/NEWS Python/compile.c
neil.schemenauer
python-checkins at python.org
Wed Oct 14 21:14:39 CEST 2009
Author: neil.schemenauer
Date: Wed Oct 14 21:14:38 2009
New Revision: 75422
Log:
Issue #1754094: Improve the stack depth calculation in the compiler.
There should be no other effect than a small decrease in memory use.
Modified:
python/branches/py3k/Misc/NEWS
python/branches/py3k/Python/compile.c
Modified: python/branches/py3k/Misc/NEWS
==============================================================================
--- python/branches/py3k/Misc/NEWS (original)
+++ python/branches/py3k/Misc/NEWS Wed Oct 14 21:14:38 2009
@@ -12,6 +12,10 @@
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.
Modified: python/branches/py3k/Python/compile.c
==============================================================================
--- python/branches/py3k/Python/compile.c (original)
+++ python/branches/py3k/Python/compile.c Wed Oct 14 21:14:38 2009
@@ -772,7 +772,7 @@
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 @@
case COMPARE_OP:
return -1;
case IMPORT_NAME:
- return 0;
+ return -1;
case IMPORT_FROM:
return 1;
@@ -3546,7 +3546,7 @@
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 @@
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 */
More information about the Python-checkins
mailing list