MAGIC *mg = Null(MAGIC*);
tmpstr = POPs;
- if(SvROK(tmpstr) || SvRMAGICAL(tmpstr)) {
- SV *sv = SvROK(tmpstr) ? SvRV(tmpstr) : tmpstr;
+ if(SvROK(tmpstr)) {
+ SV *sv = SvRV(tmpstr);
if(SvMAGICAL(sv))
mg = mg_find(sv, 'r');
}
pm->op_pmflags = pm->op_pmpermflags; /* reset case sensitivity */
pm->op_pmregexp = pregcomp(t, t + len, pm);
- sv_magic(tmpstr,(SV*)ReREFCNT_inc(pm->op_pmregexp),'r',0,0);
}
}
TAINT_NOT;
if (gimme == G_SCALAR) {
- if (MARK < SP)
- *++newsp = (popsub2 && SvTEMP(*SP))
- ? *SP : sv_mortalcopy(*SP);
- else
+ if (MARK < SP) {
+ if (popsub2) {
+ if (cxsub.cv && CvDEPTH(cxsub.cv) > 1) {
+ if (SvTEMP(TOPs)) {
+ *++newsp = SvREFCNT_inc(*SP);
+ FREETMPS;
+ sv_2mortal(*newsp);
+ } else {
+ FREETMPS;
+ *++newsp = sv_mortalcopy(*SP);
+ }
+ } else
+ *++newsp = (SvTEMP(*SP)) ? *SP : sv_mortalcopy(*SP);
+ } else
+ *++newsp = sv_mortalcopy(*SP);
+ } else
*++newsp = &sv_undef;
}
else if (gimme == G_ARRAY) {
if (top_env->je_prev) {
restartop = retop;
- JMPENV_JUMP(JMP_EXCEPTION);
+ JMPENV_JUMP(3);
}
RETURNOP(retop);
docatch(OP *o)
{
dTHR;
- int jmpstat;
+ int ret;
OP *oldop = op;
dJMPENV;
assert(CATCH_GET == TRUE);
DEBUG_l(deb("Setting up local jumplevel %p, was %p\n", &cur_env, top_env));
#endif
- JMPENV_PUSH(jmpstat);
- switch (jmpstat) {
+ JMPENV_PUSH(ret);
+ switch (ret) {
default: /* topmost level handles it */
JMPENV_POP;
op = oldop;
- JMPENV_JUMP(jmpstat);
+ JMPENV_JUMP(ret);
/* NOTREACHED */
- case JMP_EXCEPTION:
+ case 3:
if (!restartop) {
PerlIO_printf(PerlIO_stderr(), "panic: restartop\n");
break;
op = restartop;
restartop = 0;
/* FALL THROUGH */
- case JMP_NORMAL:
+ case 0:
CALLRUNOPS();
break;
}