From 21997afb0c764d5eb50dbe52249d838a597c0a08 Mon Sep 17 00:00:00 2001
From: Neal Norwitz <nnorwitz@gmail.com>
Date: Sat, 28 Oct 2006 21:19:07 +0000
Subject: [PATCH] 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.

Will backport.
---
 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 8143032919..f452298098 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 05930e96da..fa287ea80f 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 374cf1c4ef..939c5edd0e 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;
-- 
2.18.1