This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
many string evals cause eventual scope issues
authorDavid Mitchell <davem@iabyn.com>
Sun, 6 Feb 2011 14:34:49 +0000 (14:34 +0000)
committerDavid Mitchell <davem@iabyn.com>
Sun, 6 Feb 2011 18:57:16 +0000 (18:57 +0000)
[perl #83364]. PL_cop_seqmax is U32 but PAD_MAX was defined as
I32_MAX. Once PL_cop_seqmax got above 2 billion it would start to appear
spuriosuly as if  PL_cop_seqmax > PAD_MAX, so the scope of lexical vars in
evals etc went awry.

Also replaces a use of ~0 with PAD_MAX, which shouldn't change anything,
but is just tidier.

pad.c

diff --git a/pad.c b/pad.c
index de462c7..86884bf 100644 (file)
--- a/pad.c
+++ b/pad.c
@@ -128,7 +128,7 @@ For state vars, SVs_PADSTALE is overloaded to mean 'not yet initialised'
 #define PARENT_FAKELEX_FLAGS_set(sv,val)       \
   STMT_START { ((XPVNV*)SvANY(sv))->xnv_u.xpad_cop_seq.xhigh = (val); } STMT_END
 
-#define PAD_MAX I32_MAX
+#define PAD_MAX U32_MAX
 
 #ifdef PERL_MAD
 void pad_peg(const char* s) {
@@ -591,7 +591,7 @@ Perl_pad_add_anon(pTHX_ SV* sv, OPCODE op_type)
     pad_peg("add_anon");
     sv_setpvs(name, "&");
     /* Are these two actually ever read? */
-    COP_SEQ_RANGE_HIGH_set(name, ~0);
+    COP_SEQ_RANGE_HIGH_set(name, PAD_MAX);
     COP_SEQ_RANGE_LOW_set(name, 1);
     ix = pad_alloc(op_type, SVs_PADMY);
     av_store(PL_comppad_name, ix, name);