summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Lib/test/test_syntax.py31
-rw-r--r--Misc/NEWS2
-rw-r--r--Python/compile.c5
3 files changed, 37 insertions, 1 deletions
diff --git a/Lib/test/test_syntax.py b/Lib/test/test_syntax.py
index 8143032..f452298 100644
--- a/Lib/test/test_syntax.py
+++ b/Lib/test/test_syntax.py
@@ -336,6 +336,37 @@ isn't, there should be a syntax error.
Traceback (most recent call last):
...
SyntaxError: 'break' outside loop (<doctest test.test_syntax[42]>, line 3)
+
+This should probably raise a better error than a SystemError (or none at all).
+In 2.5 there was a missing exception and an assert was triggered in a debug
+build. The number of blocks must be greater than CO_MAXBLOCKS. SF #1565514
+
+ >>> while 1:
+ ... while 2:
+ ... while 3:
+ ... while 4:
+ ... while 5:
+ ... while 6:
+ ... while 8:
+ ... while 9:
+ ... while 10:
+ ... while 11:
+ ... while 12:
+ ... while 13:
+ ... while 14:
+ ... while 15:
+ ... while 16:
+ ... while 17:
+ ... while 18:
+ ... while 19:
+ ... while 20:
+ ... while 21:
+ ... while 22:
+ ... break
+ Traceback (most recent call last):
+ ...
+ SystemError: too many statically nested blocks
+
"""
import re
diff --git a/Misc/NEWS b/Misc/NEWS
index 05930e9..fa287ea 100644
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -12,6 +12,8 @@ What's New in Python 2.6 alpha 1?
Core and builtins
-----------------
+- Bug #1565514, SystemError not raised on too many nested blocks.
+
- Bug #1576174: WindowsError now displays the windows error code
again, no longer the posix error code.
diff --git a/Python/compile.c b/Python/compile.c
index 374cf1c..939c5ed 100644
--- a/Python/compile.c
+++ b/Python/compile.c
@@ -3131,8 +3131,11 @@ static int
compiler_push_fblock(struct compiler *c, enum fblocktype t, basicblock *b)
{
struct fblockinfo *f;
- if (c->u->u_nfblocks >= CO_MAXBLOCKS)
+ if (c->u->u_nfblocks >= CO_MAXBLOCKS) {
+ PyErr_SetString(PyExc_SystemError,
+ "too many statically nested blocks");
return 0;
+ }
f = &c->u->u_fblock[c->u->u_nfblocks++];
f->fb_type = t;
f->fb_block = b;