X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=gv.c;h=a7e2b8091bf544d966dcdda5200571bc0f3514cb;hb=a97be1210229297ea0fbef9273b534b7a5fa973c;hp=505f6339e579d4bb46ca579ac85b94d7813c9381;hpb=005a453cfb613e5ffe5868c1301958751100cbdf;p=p5sagit%2Fp5-mst-13.2.git diff --git a/gv.c b/gv.c index 505f633..a7e2b80 100644 --- a/gv.c +++ b/gv.c @@ -19,8 +19,6 @@ #include "EXTERN.h" #include "perl.h" -EXT char rcsid[]; - GV * gv_AVadd(register GV *gv) { @@ -68,9 +66,9 @@ gv_fetchfile(char *name) tmpbuf[0] = '_'; tmpbuf[1] = '<'; strcpy(tmpbuf + 2, name); - gv = *(GV**)hv_fetch(defstash, tmpbuf, tmplen, TRUE); + gv = *(GV**)hv_fetch(PL_defstash, tmpbuf, tmplen, TRUE); if (!isGV(gv)) - gv_init(gv, defstash, tmpbuf, tmplen, FALSE); + gv_init(gv, PL_defstash, tmpbuf, tmplen, FALSE); if (tmpbuf != smallbuf) Safefree(tmpbuf); sv_setpv(GvSV(gv), name); @@ -101,8 +99,8 @@ gv_init(GV *gv, HV *stash, char *name, STRLEN len, int multi) Newz(602, gp, 1, GP); GvGP(gv) = gp_ref(gp); GvSV(gv) = NEWSV(72,0); - GvLINE(gv) = curcop->cop_line; - GvFILEGV(gv) = curcop->cop_filegv; + GvLINE(gv) = PL_curcop->cop_line; + GvFILEGV(gv) = PL_curcop->cop_filegv; GvCVGEN(gv) = 0; GvEGV(gv) = gv; sv_magic((SV*)gv, (SV*)gv, '*', name, len); @@ -115,16 +113,17 @@ gv_init(GV *gv, HV *stash, char *name, STRLEN len, int multi) SvIOK_off(gv); ENTER; start_subparse(0,0); /* Create CV in compcv. */ - GvCV(gv) = compcv; + GvCV(gv) = PL_compcv; LEAVE; - sub_generation++; + PL_sub_generation++; CvGV(GvCV(gv)) = (GV*)SvREFCNT_inc(gv); - CvFILEGV(GvCV(gv)) = curcop->cop_filegv; - CvSTASH(GvCV(gv)) = curstash; + CvFILEGV(GvCV(gv)) = PL_curcop->cop_filegv; + CvSTASH(GvCV(gv)) = PL_curstash; #ifdef USE_THREADS CvOWNER(GvCV(gv)) = 0; - New(666, CvMUTEXP(GvCV(gv)), 1, perl_mutex); + if (!CvMUTEXP(GvCV(gv))) + New(666, CvMUTEXP(GvCV(gv)), 1, perl_mutex); MUTEX_INIT(CvMUTEXP(GvCV(gv))); #endif /* USE_THREADS */ if (proto) { @@ -176,19 +175,19 @@ gv_fetchmeth(HV *stash, char *name, STRLEN len, I32 level) gv_init(topgv, stash, name, len, TRUE); if (cv = GvCV(topgv)) { /* If genuine method or valid cache entry, use it */ - if (!GvCVGEN(topgv) || GvCVGEN(topgv) == sub_generation) + if (!GvCVGEN(topgv) || GvCVGEN(topgv) == PL_sub_generation) return topgv; /* Stale cached entry: junk it */ SvREFCNT_dec(cv); GvCV(topgv) = cv = Nullcv; GvCVGEN(topgv) = 0; } - else if (GvCVGEN(topgv) == sub_generation) + else if (GvCVGEN(topgv) == PL_sub_generation) return 0; /* cache indicates sub doesn't exist */ } gvp = (GV**)hv_fetch(stash, "ISA", 3, FALSE); - av = (gvp && (gv = *gvp) && gv != (GV*)&sv_undef) ? GvAV(gv) : Nullav; + av = (gvp && (gv = *gvp) && gv != (GV*)&PL_sv_undef) ? GvAV(gv) : Nullav; /* create and re-create @.*::SUPER::ISA on demand */ if (!av || !SvMAGIC(av)) { @@ -201,7 +200,7 @@ gv_fetchmeth(HV *stash, char *name, STRLEN len, I32 level) packlen -= 7; basestash = gv_stashpvn(packname, packlen, TRUE); gvp = (GV**)hv_fetch(basestash, "ISA", 3, FALSE); - if (gvp && (gv = *gvp) != (GV*)&sv_undef && (av = GvAV(gv))) { + if (gvp && (gv = *gvp) != (GV*)&PL_sv_undef && (av = GvAV(gv))) { dTHR; /* just for SvREFCNT_dec */ gvp = (GV**)hv_fetch(stash, "ISA", 3, TRUE); if (!gvp || !(gv = *gvp)) @@ -222,8 +221,9 @@ gv_fetchmeth(HV *stash, char *name, STRLEN len, I32 level) SV* sv = *svp++; HV* basestash = gv_stashsv(sv, FALSE); if (!basestash) { - if (dowarn) - warn("Can't locate package %s for @%s::ISA", + dTHR; /* just for ckWARN */ + if (ckWARN(WARN_MISC)) + warner(WARN_MISC, "Can't locate package %s for @%s::ISA", SvPVX(sv), HvNAME(stash)); continue; } @@ -256,13 +256,13 @@ gv_fetchmeth(HV *stash, char *name, STRLEN len, I32 level) if (cv = GvCV(topgv)) SvREFCNT_dec(cv); GvCV(topgv) = (CV*)SvREFCNT_inc(GvCV(gv)); - GvCVGEN(topgv) = sub_generation; + GvCVGEN(topgv) = PL_sub_generation; } return gv; } else if (topgv && GvREFCNT(topgv) == 1) { /* cache the fact that the method is not defined */ - GvCVGEN(topgv) = sub_generation; + GvCVGEN(topgv) = PL_sub_generation; } } } @@ -298,7 +298,7 @@ gv_fetchmethod_autoload(HV *stash, char *name, I32 autoload) if ((nsplit - origname) == 5 && strnEQ(origname, "SUPER", 5)) { /* ->SUPER::method should really be looked up in original stash */ SV *tmpstr = sv_2mortal(newSVpvf("%s::SUPER", - HvNAME(curcop->cop_stash))); + HvNAME(PL_curcop->cop_stash))); stash = gv_stashpvn(SvPVX(tmpstr), SvCUR(tmpstr), TRUE); DEBUG_o( deb("Treating %s as %s::%s\n", origname, HvNAME(stash), name) ); @@ -310,7 +310,7 @@ gv_fetchmethod_autoload(HV *stash, char *name, I32 autoload) gv = gv_fetchmeth(stash, name, nend - name, 0); if (!gv) { if (strEQ(name,"import")) - gv = (GV*)&sv_yes; + gv = (GV*)&PL_sv_yes; else if (autoload) gv = gv_autoload4(stash, name, nend - name, TRUE); } @@ -340,6 +340,7 @@ gv_fetchmethod_autoload(HV *stash, char *name, I32 autoload) GV* gv_autoload4(HV *stash, char *name, STRLEN len, I32 method) { + dTHR; static char autoload[] = "AUTOLOAD"; static STRLEN autolen = 8; GV* gv; @@ -357,8 +358,9 @@ gv_autoload4(HV *stash, char *name, STRLEN len, I32 method) /* * Inheriting AUTOLOAD for non-methods works ... for now. */ - if (dowarn && !method && (GvCVGEN(gv) || GvSTASH(gv) != stash)) - warn( + if (ckWARN(WARN_DEPRECATED) && !method && + (GvCVGEN(gv) || GvSTASH(gv) != stash)) + warner(WARN_DEPRECATED, "Use of inherited AUTOLOAD for non-method %s::%.*s() is deprecated", HvNAME(stash), (int)len, name); @@ -445,7 +447,7 @@ gv_fetchpv(char *nambeg, I32 add, I32 sv_type) (*namend == ':' && namend[1] == ':')) { if (!stash) - stash = defstash; + stash = PL_defstash; if (!stash || !SvREFCNT(stash)) /* symbol table under destruction */ return Nullgv; @@ -464,7 +466,7 @@ gv_fetchpv(char *nambeg, I32 add, I32 sv_type) tmpbuf[len] = '\0'; gvp = (GV**)hv_fetch(stash,tmpbuf,len,add); gv = gvp ? *gvp : Nullgv; - if (gv && gv != (GV*)&sv_undef) { + if (gv && gv != (GV*)&PL_sv_undef) { if (SvTYPE(gv) != SVt_PVGV) gv_init(gv, stash, tmpbuf, len, (add & GV_ADDMULTI)); else @@ -472,7 +474,7 @@ gv_fetchpv(char *nambeg, I32 add, I32 sv_type) } if (tmpbuf != smallbuf) Safefree(tmpbuf); - if (!gv || gv == (GV*)&sv_undef) + if (!gv || gv == (GV*)&PL_sv_undef) return Nullgv; if (!(stash = GvHV(gv))) @@ -487,7 +489,7 @@ gv_fetchpv(char *nambeg, I32 add, I32 sv_type) namend++; name = namend; if (!*name) - return gv ? gv : (GV*)*hv_fetch(defstash, "main::", 6, TRUE); + return gv ? gv : (GV*)*hv_fetch(PL_defstash, "main::", 6, TRUE); } } len = namend - name; @@ -501,35 +503,29 @@ gv_fetchpv(char *nambeg, I32 add, I32 sv_type) bool global = FALSE; if (isUPPER(*name)) { - if (*name > 'I') { - if (*name == 'S' && ( - strEQ(name, "SIG") || - strEQ(name, "STDIN") || - strEQ(name, "STDOUT") || - strEQ(name, "STDERR") )) - global = TRUE; - } - else if (*name > 'E') { - if (*name == 'I' && strEQ(name, "INC")) - global = TRUE; - } - else if (*name > 'A') { - if (*name == 'E' && strEQ(name, "ENV")) - global = TRUE; - } + if (*name == 'S' && ( + strEQ(name, "SIG") || + strEQ(name, "STDIN") || + strEQ(name, "STDOUT") || + strEQ(name, "STDERR"))) + global = TRUE; + else if (*name == 'I' && strEQ(name, "INC")) + global = TRUE; + else if (*name == 'E' && strEQ(name, "ENV")) + global = TRUE; else if (*name == 'A' && ( strEQ(name, "ARGV") || - strEQ(name, "ARGVOUT") )) + strEQ(name, "ARGVOUT"))) global = TRUE; } else if (*name == '_' && !name[1]) global = TRUE; if (global) - stash = defstash; - else if ((COP*)curcop == &compiling) { - stash = curstash; - if (add && (hints & HINT_STRICT_VARS) && + stash = PL_defstash; + else if ((COP*)PL_curcop == &PL_compiling) { + stash = PL_curstash; + if (add && (PL_hints & HINT_STRICT_VARS) && sv_type != SVt_PVCV && sv_type != SVt_PVGV && sv_type != SVt_PVFM && @@ -538,7 +534,7 @@ gv_fetchpv(char *nambeg, I32 add, I32 sv_type) { gvp = (GV**)hv_fetch(stash,name,len,0); if (!gvp || - *gvp == (GV*)&sv_undef || + *gvp == (GV*)&PL_sv_undef || SvTYPE(*gvp) != SVt_PVGV) { stash = 0; @@ -558,10 +554,10 @@ gv_fetchpv(char *nambeg, I32 add, I32 sv_type) } } else - stash = curcop->cop_stash; + stash = PL_curcop->cop_stash; } else - stash = defstash; + stash = PL_defstash; } /* By this point we should have a stash and a name */ @@ -581,8 +577,8 @@ gv_fetchpv(char *nambeg, I32 add, I32 sv_type) warn("Global symbol \"%s\" requires explicit package name", name); } - ++error_count; - stash = curstash ? curstash : defstash; /* avoid core dumps */ + ++PL_error_count; + stash = PL_curstash ? PL_curstash : PL_defstash; /* avoid core dumps */ add_gvflags = ((sv_type == SVt_PV) ? GVf_IMPORTED_SV : (sv_type == SVt_PVAV) ? GVf_IMPORTED_AV : (sv_type == SVt_PVHV) ? GVf_IMPORTED_HV @@ -593,7 +589,7 @@ gv_fetchpv(char *nambeg, I32 add, I32 sv_type) return Nullgv; gvp = (GV**)hv_fetch(stash,name,len,add); - if (!gvp || *gvp == (GV*)&sv_undef) + if (!gvp || *gvp == (GV*)&PL_sv_undef) return Nullgv; gv = *gvp; if (SvTYPE(gv) == SVt_PVGV) { @@ -667,15 +663,15 @@ gv_fetchpv(char *nambeg, I32 add, I32 sv_type) if (strEQ(name, "SIG")) { HV *hv; I32 i; - siggv = gv; - GvMULTI_on(siggv); - hv = GvHVn(siggv); - hv_magic(hv, siggv, 'S'); + PL_siggv = gv; + GvMULTI_on(PL_siggv); + hv = GvHVn(PL_siggv); + hv_magic(hv, PL_siggv, 'S'); for(i=1;sig_name[i];i++) { SV ** init; init=hv_fetch(hv,sig_name[i],strlen(sig_name[i]),1); if(init) - sv_setsv(*init,&sv_undef); + sv_setsv(*init,&PL_sv_undef); psig_ptr[i] = 0; psig_name[i] = 0; } @@ -685,28 +681,28 @@ gv_fetchpv(char *nambeg, I32 add, I32 sv_type) case '&': if (len > 1) break; - ampergv = gv; - sawampersand = TRUE; + PL_ampergv = gv; + PL_sawampersand = TRUE; goto ro_magicalize; case '`': if (len > 1) break; - leftgv = gv; - sawampersand = TRUE; + PL_leftgv = gv; + PL_sawampersand = TRUE; goto ro_magicalize; case '\'': if (len > 1) break; - rightgv = gv; - sawampersand = TRUE; + PL_rightgv = gv; + PL_sawampersand = TRUE; goto ro_magicalize; case ':': if (len > 1) break; - sv_setpv(GvSV(gv),chopset); + sv_setpv(GvSV(gv),PL_chopset); goto magicalize; case '?': @@ -720,7 +716,7 @@ gv_fetchpv(char *nambeg, I32 add, I32 sv_type) case '!': if (len > 1) break; - if (sv_type > SVt_PV && curcop != &compiling) { + if (sv_type > SVt_PV && PL_curcop != &PL_compiling) { HV* stash = gv_stashpvn("Errno",5,FALSE); if(!stash || !(gv_fetchmethod(stash, "TIEHASH"))) { dSP; @@ -733,16 +729,23 @@ gv_fetchpv(char *nambeg, I32 add, I32 sv_type) } } goto magicalize; + case '-': + if (len > 1) + break; + else { + AV* av = GvAVn(gv); + sv_magic((SV*)av, Nullsv, 'D', Nullch, 0); + } + goto magicalize; case '#': case '*': - if (dowarn && len == 1 && sv_type == SVt_PV) - warn("Use of $%s is deprecated", name); + if (ckWARN(WARN_DEPRECATED) && len == 1 && sv_type == SVt_PV) + warner(WARN_DEPRECATED, "Use of $%s is deprecated", name); /* FALL THROUGH */ case '[': case '^': case '~': case '=': - case '-': case '%': case '.': case '(': @@ -754,20 +757,32 @@ gv_fetchpv(char *nambeg, I32 add, I32 sv_type) case '/': case '|': case '\001': + case '\002': case '\004': case '\005': case '\006': case '\010': + case '\011': /* NOT \t in EBCDIC */ case '\017': - case '\t': case '\020': case '\024': case '\027': if (len > 1) break; goto magicalize; + case '\023': + if (len > 1) + break; + goto ro_magicalize; case '+': + if (len > 1) + break; + else { + AV* av = GvAVn(gv); + sv_magic((SV*)av, (SV*)av, 'D', Nullch, 0); + } + /* FALL THROUGH */ case '1': case '2': case '3': @@ -777,7 +792,6 @@ gv_fetchpv(char *nambeg, I32 add, I32 sv_type) case '7': case '8': case '9': - case '\023': ro_magicalize: SvREADONLY_on(GvSV(gv)); magicalize: @@ -788,7 +802,7 @@ gv_fetchpv(char *nambeg, I32 add, I32 sv_type) if (len > 1) break; sv_setpv(GvSV(gv),"\f"); - formfeed = GvSV(gv); + PL_formfeed = GvSV(gv); break; case ';': if (len > 1) @@ -799,7 +813,7 @@ gv_fetchpv(char *nambeg, I32 add, I32 sv_type) if (len == 1) { SV *sv = GvSV(gv); sv_upgrade(sv, SVt_PVNV); - sv_setpv(sv, patchlevel); + sv_setpv(sv, PL_patchlevel); (void)sv_2nv(sv); SvREADONLY_on(sv); } @@ -880,19 +894,20 @@ gv_check(HV *stash) if (HeKEY(entry)[HeKLEN(entry)-1] == ':' && (gv = (GV*)HeVAL(entry)) && (hv = GvHV(gv)) && HvNAME(hv)) { - if (hv != defstash) + if (hv != PL_defstash) gv_check(hv); /* nested package */ } else if (isALPHA(*HeKEY(entry))) { gv = (GV*)HeVAL(entry); if (SvTYPE(gv) != SVt_PVGV || GvMULTI(gv)) continue; - curcop->cop_line = GvLINE(gv); + PL_curcop->cop_line = GvLINE(gv); filegv = GvFILEGV(gv); - curcop->cop_filegv = filegv; + PL_curcop->cop_filegv = filegv; if (filegv && GvMULTI(filegv)) /* Filename began with slash */ continue; - warn("Name \"%s::%s\" used only once: possible typo", + warner(WARN_ONCE, + "Name \"%s::%s\" used only once: possible typo", HvNAME(stash), GvNAME(gv)); } } @@ -902,7 +917,7 @@ gv_check(HV *stash) GV * newGVgen(char *pack) { - return gv_fetchpv(form("%s::_GEN_%ld", pack, (long)gensym++), + return gv_fetchpv(form("%s::_GEN_%ld", pack, (long)PL_gensym++), TRUE, SVt_PVGV); } @@ -921,7 +936,7 @@ gp_ref(GP *gp) } else { /* Adding a new name to a subroutine invalidates method cache */ - sub_generation++; + PL_sub_generation++; } } return gp; @@ -941,7 +956,7 @@ gp_free(GV *gv) } if (gp->gp_cv) { /* Deleting the name of a subroutine invalidates method cache */ - sub_generation++; + PL_sub_generation++; } if (--gp->gp_refcnt > 0) { if (gp->gp_egv == gv) @@ -999,8 +1014,8 @@ Gv_AMupdate(HV *stash) AMT *amtp = (mg) ? (AMT*)mg->mg_ptr: (AMT *) NULL; AMT amt; - if (mg && amtp->was_ok_am == amagic_generation - && amtp->was_ok_sub == sub_generation) + if (mg && amtp->was_ok_am == PL_amagic_generation + && amtp->was_ok_sub == PL_sub_generation) return AMT_AMAGIC(amtp); if (amtp && AMT_AMAGIC(amtp)) { /* Have table. */ int i; @@ -1014,14 +1029,14 @@ Gv_AMupdate(HV *stash) DEBUG_o( deb("Recalcing overload magic in package %s\n",HvNAME(stash)) ); - amt.was_ok_am = amagic_generation; - amt.was_ok_sub = sub_generation; + amt.was_ok_am = PL_amagic_generation; + amt.was_ok_sub = PL_sub_generation; amt.fallback = AMGfallNO; amt.flags = 0; #ifdef OVERLOAD_VIA_HASH gvp=(GV**)hv_fetch(stash,"OVERLOAD",8,FALSE); /* A shortcut */ - if (gvp && ((gv = *gvp) != (GV*)&sv_undef && (hv = GvHV(gv)))) { + if (gvp && ((gv = *gvp) != (GV*)&PL_sv_undef && (hv = GvHV(gv)))) { int filled=0; int i; char *cp; @@ -1040,12 +1055,12 @@ Gv_AMupdate(HV *stash) cp = (char *)AMG_names[i]; svp = (SV**)hv_fetch(hv, cp, strlen(cp), FALSE); - if (svp && ((sv = *svp) != &sv_undef)) { + if (svp && ((sv = *svp) != &PL_sv_undef)) { switch (SvTYPE(sv)) { default: if (!SvROK(sv)) { if (!SvOK(sv)) break; - gv = gv_fetchmethod(stash, SvPV(sv, na)); + gv = gv_fetchmethod(stash, SvPV(sv, PL_na)); if (gv) cv = GvCV(gv); break; } @@ -1106,7 +1121,7 @@ Gv_AMupdate(HV *stash) GV *ngv; DEBUG_o( deb("Resolving method `%.256s' for overloaded `%s' in package `%.256s'\n", - SvPV(GvSV(gv), na), cp, HvNAME(stash)) ); + SvPV(GvSV(gv), PL_na), cp, HvNAME(stash)) ); if (!SvPOK(GvSV(gv)) || !(ngv = gv_fetchmethod_autoload(stash, SvPVX(GvSV(gv)), FALSE))) @@ -1153,7 +1168,7 @@ amagic_call(SV *left, SV *right, int method, int flags) CV **cvp=NULL, **ocvp=NULL; AMT *amtp, *oamtp; int fl=0, off, off1, lr=0, assign=AMGf_assign & flags, notfound=0; - int postpr=0, inc_dec_ass=0, assignshift=assign?1:0; + int postpr = 0, force_cpy = 0, assignshift = assign ? 1 : 0; HV* stash; if (!(AMGf_noleft & flags) && SvAMAGIC(left) && (mg = mg_find((SV*)(stash=SvSTASH(SvRV(left))),'c')) @@ -1170,17 +1185,20 @@ amagic_call(SV *left, SV *right, int method, int flags) int logic; /* look for substituted methods */ + /* In all the covered cases we should be called with assign==0. */ switch (method) { case inc_amg: - if (((cv = cvp[off=add_ass_amg]) && (inc_dec_ass=1)) - || ((cv = cvp[off=add_amg]) && (postpr=1))) { - right = &sv_yes; lr = -1; assign = 1; + force_cpy = 1; + if ((cv = cvp[off=add_ass_amg]) + || ((cv = cvp[off = add_amg]) && (force_cpy = 0, postpr = 1))) { + right = &PL_sv_yes; lr = -1; assign = 1; } break; case dec_amg: - if (((cv = cvp[off=subtr_ass_amg]) && (inc_dec_ass=1)) - || ((cv = cvp[off=subtr_amg]) && (postpr=1))) { - right = &sv_yes; lr = -1; assign = 1; + force_cpy = 1; + if ((cv = cvp[off = subtr_ass_amg]) + || ((cv = cvp[off = subtr_amg]) && (force_cpy = 0, postpr=1))) { + right = &PL_sv_yes; lr = -1; assign = 1; } break; case bool__amg: @@ -1326,6 +1344,7 @@ amagic_call(SV *left, SV *right, int method, int flags) } return NULL; } + force_cpy = force_cpy || assign; } } if (!notfound) { @@ -1342,14 +1361,33 @@ amagic_call(SV *left, SV *right, int method, int flags) flags & AMGf_unary? " for argument" : "", HvNAME(stash), fl? ",\n\tassignment variant used": "") ); + } /* Since we use shallow copy during assignment, we need * to dublicate the contents, probably calling user-supplied * version of copy operator */ - if ((method + assignshift==off - && (assign || method==inc_amg || method==dec_amg)) - || inc_dec_ass) RvDEEPCP(left); - } + /* We need to copy in following cases: + * a) Assignment form was called. + * assignshift==1, assign==T, method + 1 == off + * b) Increment or decrement, called directly. + * assignshift==0, assign==0, method + 0 == off + * c) Increment or decrement, translated to assignment add/subtr. + * assignshift==0, assign==T, + * force_cpy == T + * d) Increment or decrement, translated to nomethod. + * assignshift==0, assign==0, + * force_cpy == T + * e) Assignment form translated to nomethod. + * assignshift==1, assign==T, method + 1 != off + * force_cpy == T + */ + /* off is method, method+assignshift, or a result of opcode substitution. + * In the latter case assignshift==0, so only notfound case is important. + */ + if (( (method + assignshift == off) + && (assign || (method == inc_amg) || (method == dec_amg))) + || force_cpy) + RvDEEPCP(left); { dSP; BINOP myop; @@ -1365,23 +1403,23 @@ amagic_call(SV *left, SV *right, int method, int flags) PUSHSTACKi(PERLSI_OVERLOAD); ENTER; SAVEOP(); - op = (OP *) &myop; - if (PERLDB_SUB && curstash != debstash) - op->op_private |= OPpENTERSUB_DB; + PL_op = (OP *) &myop; + if (PERLDB_SUB && PL_curstash != PL_debstash) + PL_op->op_private |= OPpENTERSUB_DB; PUTBACK; pp_pushmark(ARGS); EXTEND(SP, notfound + 5); PUSHs(lr>0? right: left); PUSHs(lr>0? left: right); - PUSHs( lr > 0 ? &sv_yes : ( assign ? &sv_undef : &sv_no )); + PUSHs( lr > 0 ? &PL_sv_yes : ( assign ? &PL_sv_undef : &PL_sv_no )); if (notfound) { PUSHs( sv_2mortal(newSVpv((char *)AMG_names[method + assignshift],0)) ); } PUSHs((SV*)cv); PUTBACK; - if (op = pp_entersub(ARGS)) + if (PL_op = pp_entersub(ARGS)) CALLRUNOPS(); LEAVE; SPAGAIN;