I found an XXX in the perl5 source code: I32 Perl_cxinc(pTHX) { dVAR; const IV old_max = cxstack_max; cxstack_max = GROW(cxstack_max); Renew(cxstack, cxstack_max + 1, PERL_CONTEXT); /* XXX should fix CXINC macro */ /* Without any kind of initialising deep enough recursion * will end up reading uninitialised PERL_CONTEXTs. */ PoisonNew(cxstack + old_max + 1, cxstack_max - old_max, PERL_CONTEXT); return cxstack_ix + 1; } I wondered what the bug was, and why we can't fix it. With a bit of digging it turns out that it's a patch from Larry, applied by Andy, in early 1996: http://perl5.git.perl.org/?p=perl.git;a=commitdiff;h=a38d6535f8637d53561bc3663eb96f6c054d0bbb;hp=c0c09dfd3cf50dacd0bf01dff34b4904c5ed1cc6 The interesting parts are: index 360f9a0..738c95c 100644 (file) --- a/perl.c +++ b/perl.c @@ -1722,7 +1745,7 @@ init_stacks() retstack_ix = 0; retstack_max = 16; - New(50,cxstack,128,CONTEXT); + New(50,cxstack,129,CONTEXT); /* XXX should fix CXINC macro */ cxstack_ix = -1; cxstack_max = 128; diff --git a/scope.c b/scope.c Index 79740dc..3f48609 100644 (file) --- a/scope.c +++ b/scope.c @@ -30,7 +30,7 @@ I32 cxinc() { cxstack_max = cxstack_max * 3 / 2; - Renew(cxstack, cxstack_max, CONTEXT); + Renew(cxstack, cxstack_max + 1, CONTEXT); /* XXX should fix CXINC macro */ return cxstack_ix + 1; } What was the problem with CXINC, and what's the correct fix? Nicholas ClarkThread Next