From 2f0940b6cab766f039dc22d361f52e25b22e9fa8 Mon Sep 17 00:00:00 2001 From: Neal Norwitz Date: Sat, 28 Oct 2006 21:38:43 +0000 Subject: [PATCH] Backport 52504: Fix bug #1565514, SystemError not raised on too many nested blocks. It seems like this should be a different error than SystemError, but I don't have any great ideas and SystemError was raised in 2.4 and earlier. --- Lib/test/test_syntax.py | 31 +++++++++++++++++++++++++++++++ Misc/NEWS | 2 ++ Python/compile.c | 5 ++++- 3 files changed, 37 insertions(+), 1 deletion(-) diff --git a/Lib/test/test_syntax.py b/Lib/test/test_syntax.py index 521789f3464..40991492a43 100644 --- a/Lib/test/test_syntax.py +++ b/Lib/test/test_syntax.py @@ -333,6 +333,37 @@ isn't, there should be a syntax error. Traceback (most recent call last): ... SyntaxError: 'break' outside loop (, 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 4150444c7eb..f47c4e920ee 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -12,6 +12,8 @@ What's New in Python 2.5.1c1? 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 038bc2f4fed..8be3d79be9f 100644 --- a/Python/compile.c +++ b/Python/compile.c @@ -3738,8 +3738,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;