From: Rafael Garcia-Suarez Date: Sun, 23 Jul 2006 20:32:33 +0000 (+0000) Subject: Revert change 28603: this was a wrong fix, that didn't prevent X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=commitdiff_plain;h=3a76ca8818b782f5517982af5ac3381a6a3eb189;p=p5sagit%2Fp5-mst-13.2.git Revert change 28603: this was a wrong fix, that didn't prevent a later crash. Reindent a bit of the same function. p4raw-id: //depot/perl@28613 --- diff --git a/pp_hot.c b/pp_hot.c index fb0a98d..498d508 100644 --- a/pp_hot.c +++ b/pp_hot.c @@ -2825,16 +2825,13 @@ try_autoload: * Owing the speed considerations, we choose instead to search for * the cv using find_runcv() when calling doeval(). */ - if (padlist) { - if (CvDEPTH(cv) >= 2) { - PERL_STACK_OVERFLOW_CHECK(); - pad_push(padlist, CvDEPTH(cv)); - } - SAVECOMPPAD(); - PAD_SET_CUR_NOSAVE(padlist, CvDEPTH(cv)); + if (CvDEPTH(cv) >= 2) { + PERL_STACK_OVERFLOW_CHECK(); + pad_push(padlist, CvDEPTH(cv)); } - if (hasargs) - { + SAVECOMPPAD(); + PAD_SET_CUR_NOSAVE(padlist, CvDEPTH(cv)); + if (hasargs) { AV* const av = (AV*)PAD_SVl(0); if (AvREAL(av)) { /* @_ is normally not REAL--this should only ever @@ -2885,43 +2882,43 @@ try_autoload: RETURNOP(CvSTART(cv)); } else { - I32 markix = TOPMARK; - - PUTBACK; + I32 markix = TOPMARK; - if (!hasargs) { - /* Need to copy @_ to stack. Alternative may be to - * switch stack to @_, and copy return values - * back. This would allow popping @_ in XSUB, e.g.. XXXX */ - AV * const av = GvAV(PL_defgv); - const I32 items = AvFILLp(av) + 1; /* @_ is not tieable */ - - if (items) { - /* Mark is at the end of the stack. */ - EXTEND(SP, items); - Copy(AvARRAY(av), SP + 1, items, SV*); - SP += items; - PUTBACK ; - } - } - /* We assume first XSUB in &DB::sub is the called one. */ - if (PL_curcopdb) { - SAVEVPTR(PL_curcop); - PL_curcop = PL_curcopdb; - PL_curcopdb = NULL; - } - /* Do we need to open block here? XXXX */ - if (CvXSUB(cv)) /* XXX this is supposed to be true */ - (void)(*CvXSUB(cv))(aTHX_ cv); + PUTBACK; - /* Enforce some sanity in scalar context. */ - if (gimme == G_SCALAR && ++markix != PL_stack_sp - PL_stack_base ) { - if (markix > PL_stack_sp - PL_stack_base) - *(PL_stack_base + markix) = &PL_sv_undef; - else - *(PL_stack_base + markix) = *PL_stack_sp; - PL_stack_sp = PL_stack_base + markix; - } + if (!hasargs) { + /* Need to copy @_ to stack. Alternative may be to + * switch stack to @_, and copy return values + * back. This would allow popping @_ in XSUB, e.g.. XXXX */ + AV * const av = GvAV(PL_defgv); + const I32 items = AvFILLp(av) + 1; /* @_ is not tieable */ + + if (items) { + /* Mark is at the end of the stack. */ + EXTEND(SP, items); + Copy(AvARRAY(av), SP + 1, items, SV*); + SP += items; + PUTBACK ; + } + } + /* We assume first XSUB in &DB::sub is the called one. */ + if (PL_curcopdb) { + SAVEVPTR(PL_curcop); + PL_curcop = PL_curcopdb; + PL_curcopdb = NULL; + } + /* Do we need to open block here? XXXX */ + if (CvXSUB(cv)) /* XXX this is supposed to be true */ + (void)(*CvXSUB(cv))(aTHX_ cv); + + /* Enforce some sanity in scalar context. */ + if (gimme == G_SCALAR && ++markix != PL_stack_sp - PL_stack_base ) { + if (markix > PL_stack_sp - PL_stack_base) + *(PL_stack_base + markix) = &PL_sv_undef; + else + *(PL_stack_base + markix) = *PL_stack_sp; + PL_stack_sp = PL_stack_base + markix; + } LEAVE; return NORMAL; }