X-Git-Url: https://perl5.git.perl.org/perl5.git/blobdiff_plain/55d09dc854b450c4051bea8318009a46a7c083f7..e2051532106d99a4928bf7d13194edd2ac1f7b1a:/sv.c diff --git a/sv.c b/sv.c index 8ba0505..8ef01c9 100644 --- a/sv.c +++ b/sv.c @@ -41,8 +41,6 @@ # include #endif -#define FCALL *f - #ifdef __Lynx__ /* Missing proto on LynxOS */ char *gconvert(double, int, int, char *); @@ -419,7 +417,7 @@ S_visit(pTHX_ SVFUNC_t f, const U32 flags, const U32 mask) && (sv->sv_flags & mask) == flags && SvREFCNT(sv)) { - (FCALL)(aTHX_ sv); + (*f)(aTHX_ sv); ++visited; } } @@ -1479,13 +1477,6 @@ Perl_sv_grow(pTHX_ SV *const sv, STRLEN newlen) PERL_ARGS_ASSERT_SV_GROW; -#ifdef HAS_64K_LIMIT - if (newlen >= 0x10000) { - PerlIO_printf(Perl_debug_log, - "Allocation too large: %"UVxf"\n", (UV)newlen); - my_exit(1); - } -#endif /* HAS_64K_LIMIT */ if (SvROK(sv)) sv_unref(sv); if (SvTYPE(sv) < SVt_PV) { @@ -1497,10 +1488,6 @@ Perl_sv_grow(pTHX_ SV *const sv, STRLEN newlen) s = SvPVX_mutable(sv); if (newlen > SvLEN(sv)) newlen += 10 * (newlen - SvCUR(sv)); /* avoid copy each time */ -#ifdef HAS_64K_LIMIT - if (newlen >= 0x10000) - newlen = 0xFFFF; -#endif } else { @@ -1749,10 +1736,12 @@ S_sv_display(pTHX_ SV *const sv, char *tmpbuf, STRLEN tmpbuf_size) { const char * const end = s + SvCUR(sv); for ( ; s < end && d < limit; s++ ) { int ch = *s & 0xFF; - if (ch & 128 && !isPRINT_LC(ch)) { + if (! isASCII(ch) && !isPRINT_LC(ch)) { *d++ = 'M'; *d++ = '-'; - ch &= 127; + + /* Map to ASCII "equivalent" of Latin1 */ + ch = LATIN1_TO_NATIVE(NATIVE_TO_LATIN1(ch) & 127); } if (ch == '\n') { *d++ = '\\'; @@ -2996,10 +2985,6 @@ Perl_sv_2pv_flags(pTHX_ SV *const sv, STRLEN *const lp, const I32 flags) RESTORE_ERRNO; while (*s) s++; } -#ifdef hcx - if (s[-1] == '.') - *--s = '\0'; -#endif } else if (isGV_with_GP(sv)) { GV *const gv = MUTABLE_GV(sv); @@ -3167,12 +3152,13 @@ contain SV_GMAGIC, then it does an mg_get() first. */ bool -Perl_sv_2bool_flags(pTHX_ SV *const sv, const I32 flags) +Perl_sv_2bool_flags(pTHX_ SV *sv, I32 flags) { dVAR; PERL_ARGS_ASSERT_SV_2BOOL_FLAGS; + restart: if(flags & SV_GMAGIC) SvGETMAGIC(sv); if (!SvOK(sv)) @@ -3180,8 +3166,30 @@ Perl_sv_2bool_flags(pTHX_ SV *const sv, const I32 flags) if (SvROK(sv)) { if (SvAMAGIC(sv)) { SV * const tmpsv = AMG_CALLunary(sv, bool__amg); - if (tmpsv && (!SvROK(tmpsv) || (SvRV(tmpsv) != SvRV(sv)))) - return cBOOL(SvTRUE(tmpsv)); + if (tmpsv && (!SvROK(tmpsv) || (SvRV(tmpsv) != SvRV(sv)))) { + bool svb; + sv = tmpsv; + if(SvGMAGICAL(sv)) { + flags = SV_GMAGIC; + goto restart; /* call sv_2bool */ + } + /* expanded SvTRUE_common(sv, (flags = 0, goto restart)) */ + else if(!SvOK(sv)) { + svb = 0; + } + else if(SvPOK(sv)) { + svb = SvPVXtrue(sv); + } + else if((SvFLAGS(sv) & (SVf_IOK|SVf_NOK))) { + svb = (SvIOK(sv) && SvIVX(sv) != 0) + || (SvNOK(sv) && SvNVX(sv) != 0.0); + } + else { + flags = 0; + goto restart; /* call sv_2bool_nomg */ + } + return cBOOL(svb); + } } return SvRV(sv) != 0; } @@ -3314,7 +3322,7 @@ Perl_sv_utf8_upgrade_flags_grow(pTHX_ SV *const sv, const I32 flags, STRLEN extr while (t < e) { const U8 ch = *t++; - if (NATIVE_IS_INVARIANT(ch)) continue; + if (NATIVE_BYTE_IS_INVARIANT(ch)) continue; t--; /* t already incremented; re-point to first variant */ two_byte_count = 1; @@ -3449,7 +3457,7 @@ must_be_utf8: while (d < e) { const U8 chr = *d++; - if (! NATIVE_IS_INVARIANT(chr)) two_byte_count++; + if (! NATIVE_BYTE_IS_INVARIANT(chr)) two_byte_count++; } /* The string will expand by just the number of bytes that @@ -3469,13 +3477,13 @@ must_be_utf8: e--; while (e >= t) { - const U8 ch = NATIVE8_TO_UNI(*e--); - if (UNI_IS_INVARIANT(ch)) { - *d-- = UNI_TO_NATIVE(ch); + if (NATIVE_BYTE_IS_INVARIANT(*e)) { + *d-- = *e; } else { - *d-- = (U8)UTF8_EIGHT_BIT_LO(ch); - *d-- = (U8)UTF8_EIGHT_BIT_HI(ch); + *d-- = UTF8_EIGHT_BIT_LO(*e); + *d-- = UTF8_EIGHT_BIT_HI(*e); } + e--; } } @@ -5694,12 +5702,10 @@ Perl_sv_add_backref(pTHX_ SV *const tsv, SV *const sv) if (SvTYPE(tsv) == SVt_PVHV) { svp = (SV**)Perl_hv_backreferences_p(aTHX_ MUTABLE_HV(tsv)); } else { - if (! ((mg = - (SvMAGICAL(tsv) ? mg_find(tsv, PERL_MAGIC_backref) : NULL)))) - { - sv_magic(tsv, NULL, PERL_MAGIC_backref, NULL, 0); - mg = mg_find(tsv, PERL_MAGIC_backref); - } + if (SvMAGICAL(tsv)) + mg = mg_find(tsv, PERL_MAGIC_backref); + if (!mg) + mg = sv_magicext(tsv, NULL, PERL_MAGIC_backref, &PL_vtbl_backref, NULL, 0); svp = &(mg->mg_obj); } @@ -5709,32 +5715,32 @@ Perl_sv_add_backref(pTHX_ SV *const tsv, SV *const sv) || (*svp && SvTYPE(*svp) != SVt_PVAV) ) { /* create array */ + if (mg) + mg->mg_flags |= MGf_REFCOUNTED; av = newAV(); AvREAL_off(av); - SvREFCNT_inc_simple_void(av); + SvREFCNT_inc_simple_void_NN(av); /* av now has a refcnt of 2; see discussion above */ + av_extend(av, *svp ? 2 : 1); if (*svp) { /* move single existing backref to the array */ - av_extend(av, 1); AvARRAY(av)[++AvFILLp(av)] = *svp; /* av_push() */ } *svp = (SV*)av; - if (mg) - mg->mg_flags |= MGf_REFCOUNTED; } - else + else { av = MUTABLE_AV(*svp); - - if (!av) { - /* optimisation: store single backref directly in HvAUX or mg_obj */ - *svp = sv; - return; + if (!av) { + /* optimisation: store single backref directly in HvAUX or mg_obj */ + *svp = sv; + return; + } + assert(SvTYPE(av) == SVt_PVAV); + if (AvFILLp(av) >= AvMAX(av)) { + av_extend(av, AvFILLp(av)+1); + } } /* push new backref */ - assert(SvTYPE(av) == SVt_PVAV); - if (AvFILLp(av) >= AvMAX(av)) { - av_extend(av, AvFILLp(av)+1); - } AvARRAY(av)[++AvFILLp(av)] = sv; /* av_push() */ } @@ -6295,8 +6301,8 @@ Perl_sv_clear(pTHX_ SV *const orig_sv) if (PL_stashcache) { DEBUG_o(Perl_deb(aTHX_ "sv_clear clearing PL_stashcache for '%"SVf"'\n", sv)); - (void)hv_delete(PL_stashcache, name, - HvNAMEUTF8((HV*)sv) ? -HvNAMELEN_get((HV*)sv) : HvNAMELEN_get((HV*)sv), G_DISCARD); + (void)hv_deletehek(PL_stashcache, + HvNAME_HEK((HV*)sv), G_DISCARD); } hv_name_set((HV*)sv, NULL, 0, 0); } @@ -7942,9 +7948,9 @@ Perl_sv_gets(pTHX_ SV *const sv, PerlIO *const fp, I32 append) STRLEN rslen; STDCHAR rslast; STDCHAR *bp; - I32 cnt; - I32 i = 0; - I32 rspara = 0; + SSize_t cnt; + int i = 0; + int rspara = 0; PERL_ARGS_ASSERT_SV_GETS; @@ -8089,8 +8095,9 @@ Perl_sv_gets(pTHX_ SV *const sv, PerlIO *const fp, I32 append) DEBUG_P(PerlIO_printf(Perl_debug_log, "Screamer: entering, ptr=%"UVuf", cnt=%ld\n",PTR2UV(ptr),(long)cnt)); DEBUG_P(PerlIO_printf(Perl_debug_log, - "Screamer: entering: PerlIO * thinks ptr=%"UVuf", cnt=%ld, base=%"UVuf"\n", - PTR2UV(PerlIO_get_ptr(fp)), (long)PerlIO_get_cnt(fp), + "Screamer: entering: PerlIO * thinks ptr=%"UVuf", cnt=%zd, base=%" + UVuf"\n", + PTR2UV(PerlIO_get_ptr(fp)), PerlIO_get_cnt(fp), PTR2UV(PerlIO_has_base(fp) ? PerlIO_get_base(fp) : 0))); for (;;) { screamer: @@ -8124,13 +8131,13 @@ Perl_sv_gets(pTHX_ SV *const sv, PerlIO *const fp, I32 append) cannot_be_shortbuffered: DEBUG_P(PerlIO_printf(Perl_debug_log, - "Screamer: going to getc, ptr=%"UVuf", cnt=%ld\n", - PTR2UV(ptr),(long)cnt)); + "Screamer: going to getc, ptr=%"UVuf", cnt=%zd\n", + PTR2UV(ptr),cnt)); PerlIO_set_ptrcnt(fp, (STDCHAR*)ptr, cnt); /* deregisterize cnt and ptr */ DEBUG_Pv(PerlIO_printf(Perl_debug_log, - "Screamer: pre: FILE * thinks ptr=%"UVuf", cnt=%ld, base=%"UVuf"\n", - PTR2UV(PerlIO_get_ptr(fp)), (long)PerlIO_get_cnt(fp), + "Screamer: pre: FILE * thinks ptr=%"UVuf", cnt=%zd, base=%"UVuf"\n", + PTR2UV(PerlIO_get_ptr(fp)), PerlIO_get_cnt(fp), PTR2UV(PerlIO_has_base (fp) ? PerlIO_get_base(fp) : 0))); /* This used to call 'filbuf' in stdio form, but as that behaves like @@ -8139,14 +8146,15 @@ Perl_sv_gets(pTHX_ SV *const sv, PerlIO *const fp, I32 append) i = PerlIO_getc(fp); /* get more characters */ DEBUG_Pv(PerlIO_printf(Perl_debug_log, - "Screamer: post: FILE * thinks ptr=%"UVuf", cnt=%ld, base=%"UVuf"\n", - PTR2UV(PerlIO_get_ptr(fp)), (long)PerlIO_get_cnt(fp), + "Screamer: post: FILE * thinks ptr=%"UVuf", cnt=%zd, base=%"UVuf"\n", + PTR2UV(PerlIO_get_ptr(fp)), PerlIO_get_cnt(fp), PTR2UV(PerlIO_has_base (fp) ? PerlIO_get_base(fp) : 0))); cnt = PerlIO_get_cnt(fp); ptr = (STDCHAR*)PerlIO_get_ptr(fp); /* reregisterize cnt and ptr */ DEBUG_P(PerlIO_printf(Perl_debug_log, - "Screamer: after getc, ptr=%"UVuf", cnt=%ld\n",PTR2UV(ptr),(long)cnt)); + "Screamer: after getc, ptr=%"UVuf", cnt=%zd\n", + PTR2UV(ptr),cnt)); if (i == EOF) /* all done for ever? */ goto thats_really_all_folks; @@ -8170,11 +8178,12 @@ thats_really_all_folks: if (shortbuffered) cnt += shortbuffered; DEBUG_P(PerlIO_printf(Perl_debug_log, - "Screamer: quitting, ptr=%"UVuf", cnt=%ld\n",PTR2UV(ptr),(long)cnt)); + "Screamer: quitting, ptr=%"UVuf", cnt=%zd\n",PTR2UV(ptr),cnt)); PerlIO_set_ptrcnt(fp, (STDCHAR*)ptr, cnt); /* put these back or we're in trouble */ DEBUG_P(PerlIO_printf(Perl_debug_log, - "Screamer: end: FILE * thinks ptr=%"UVuf", cnt=%ld, base=%"UVuf"\n", - PTR2UV(PerlIO_get_ptr(fp)), (long)PerlIO_get_cnt(fp), + "Screamer: end: FILE * thinks ptr=%"UVuf", cnt=%zd, base=%"UVuf + "\n", + PTR2UV(PerlIO_get_ptr(fp)), PerlIO_get_cnt(fp), PTR2UV(PerlIO_has_base (fp) ? PerlIO_get_base(fp) : 0))); *bp = '\0'; SvCUR_set(sv, bp - (STDCHAR*)SvPVX_const(sv)); /* set length */ @@ -9659,6 +9668,19 @@ Perl_newSVrv(pTHX_ SV *const rv, const char *const classname) return sv; } +SV * +Perl_newSVavdefelem(pTHX_ AV *av, SSize_t ix, bool extendible) +{ + SV * const lv = newSV_type(SVt_PVLV); + PERL_ARGS_ASSERT_NEWSVAVDEFELEM; + LvTYPE(lv) = 'y'; + sv_magic(lv, NULL, PERL_MAGIC_defelem, NULL, 0); + LvTARG(lv) = SvREFCNT_inc_simple_NN(av); + LvSTARGOFF(lv) = ix; + LvTARGLEN(lv) = extendible ? 1 : (STRLEN)UV_MAX; + return lv; +} + /* =for apidoc sv_setref_pv @@ -9796,6 +9818,7 @@ Perl_sv_bless(pTHX_ SV *const sv, HV *const stash) { dVAR; SV *tmpRef; + HV *oldstash = NULL; PERL_ARGS_ASSERT_SV_BLESS; @@ -9807,12 +9830,13 @@ Perl_sv_bless(pTHX_ SV *const sv, HV *const stash) if (SvREADONLY(tmpRef)) Perl_croak_no_modify(); if (SvOBJECT(tmpRef)) { - SvREFCNT_dec(SvSTASH(tmpRef)); + oldstash = SvSTASH(tmpRef); } } SvOBJECT_on(tmpRef); SvUPGRADE(tmpRef, SVt_PVMG); SvSTASH_set(tmpRef, MUTABLE_HV(SvREFCNT_inc_simple(stash))); + SvREFCNT_dec(oldstash); if(SvSMAGICAL(tmpRef)) if(mg_find(tmpRef, PERL_MAGIC_ext) || mg_find(tmpRef, PERL_MAGIC_uvar)) @@ -10380,6 +10404,9 @@ Perl_sv_vcatpvfn_flags(pTHX_ SV *const sv, const char *const pat, const STRLEN p char ebuf[IV_DIG * 4 + NV_DIG + 32]; /* large enough for "%#.#f" --chip */ /* what about long double NVs? --jhi */ +#ifdef USE_LOCALE_NUMERIC + SV* oldlocale = NULL; +#endif PERL_ARGS_ASSERT_SV_VCATPVFN_FLAGS; PERL_UNUSED_ARG(maybe_tainted); @@ -10785,10 +10812,10 @@ Perl_sv_vcatpvfn_flags(pTHX_ SV *const sv, const char *const pat, const STRLEN p q++; break; #endif -#if defined(HAS_QUAD) || defined(HAS_LONG_DOUBLE) +#if IVSIZE >= 8 || defined(HAS_LONG_DOUBLE) case 'L': /* Ld */ /*FALLTHROUGH*/ -#ifdef HAS_QUAD +#if IVSIZE >= 8 case 'q': /* qd */ #endif intsize = 'q'; @@ -10797,7 +10824,7 @@ Perl_sv_vcatpvfn_flags(pTHX_ SV *const sv, const char *const pat, const STRLEN p #endif case 'l': ++q; -#if defined(HAS_QUAD) || defined(HAS_LONG_DOUBLE) +#if IVSIZE >= 8 || defined(HAS_LONG_DOUBLE) if (*q == 'l') { /* lld, llf */ intsize = 'q'; ++q; @@ -10856,7 +10883,7 @@ Perl_sv_vcatpvfn_flags(pTHX_ SV *const sv, const char *const pat, const STRLEN p goto unknown; uv = (args) ? va_arg(*args, int) : SvIV(argsv); if ((uv > 255 || - (!UNI_IS_INVARIANT(uv) && SvUTF8(sv))) + (!UVCHR_IS_INVARIANT(uv) && SvUTF8(sv))) && !IN_BYTES) { eptr = (char*)utf8buf; elen = uvchr_to_utf8((U8*)eptr, uv) - utf8buf; @@ -10957,7 +10984,7 @@ Perl_sv_vcatpvfn_flags(pTHX_ SV *const sv, const char *const pat, const STRLEN p case 'j': iv = va_arg(*args, intmax_t); break; #endif case 'q': -#ifdef HAS_QUAD +#if IVSIZE >= 8 iv = va_arg(*args, Quad_t); break; #else goto unknown; @@ -10973,7 +11000,7 @@ Perl_sv_vcatpvfn_flags(pTHX_ SV *const sv, const char *const pat, const STRLEN p case 'V': default: iv = tiv; break; case 'q': -#ifdef HAS_QUAD +#if IVSIZE >= 8 iv = (Quad_t)tiv; break; #else goto unknown; @@ -11055,7 +11082,7 @@ Perl_sv_vcatpvfn_flags(pTHX_ SV *const sv, const char *const pat, const STRLEN p #endif default: uv = va_arg(*args, unsigned); break; case 'q': -#ifdef HAS_QUAD +#if IVSIZE >= 8 uv = va_arg(*args, Uquad_t); break; #else goto unknown; @@ -11071,7 +11098,7 @@ Perl_sv_vcatpvfn_flags(pTHX_ SV *const sv, const char *const pat, const STRLEN p case 'V': default: uv = tuv; break; case 'q': -#ifdef HAS_QUAD +#if IVSIZE >= 8 uv = (Uquad_t)tuv; break; #else goto unknown; @@ -11340,6 +11367,21 @@ Perl_sv_vcatpvfn_flags(pTHX_ SV *const sv, const char *const pat, const STRLEN p /* No taint. Otherwise we are in the strange situation * where printf() taints but print($float) doesn't. * --jhi */ + +#ifdef USE_LOCALE_NUMERIC + if (! PL_numeric_standard && ! IN_SOME_LOCALE_FORM) { + + /* We use a mortal SV, so that any failures (such as if + * warnings are made fatal) won't leak */ + char *oldlocale_string = setlocale(LC_NUMERIC, NULL); + oldlocale = newSVpvn_flags(oldlocale_string, + strlen(oldlocale_string), + SVs_TEMP); + PL_numeric_standard = TRUE; + setlocale(LC_NUMERIC, "C"); + } +#endif + #if defined(HAS_LONG_DOUBLE) elen = ((intsize == 'q') ? my_snprintf(PL_efloatbuf, PL_efloatsize, ptr, nv) @@ -11380,7 +11422,7 @@ Perl_sv_vcatpvfn_flags(pTHX_ SV *const sv, const char *const pat, const STRLEN p case 'j': *(va_arg(*args, intmax_t*)) = i; break; #endif case 'q': -#ifdef HAS_QUAD +#if IVSIZE >= 8 *(va_arg(*args, Quad_t*)) = i; break; #else goto unknown; @@ -11515,6 +11557,14 @@ Perl_sv_vcatpvfn_flags(pTHX_ SV *const sv, const char *const pat, const STRLEN p } } SvTAINT(sv); + +#ifdef USE_LOCALE_NUMERIC /* Done outside loop, so don't have to save/restore + each iteration. */ + if (oldlocale) { + setlocale(LC_NUMERIC, SvPVX(oldlocale)); + PL_numeric_standard = FALSE; + } +#endif } /* ========================================================================= @@ -13393,6 +13443,7 @@ perl_clone_using(PerlInterpreter *proto_perl, UV flags, PL_last_swash_slen = 0; PL_srand_called = proto_perl->Isrand_called; + Copy(&(proto_perl->Irandom_state), &PL_random_state, 1, PL_RANDOM_STATE_TYPE); if (flags & CLONEf_COPY_STACKS) { /* next allocation will be PL_tmps_stack[PL_tmps_ix+1] */ @@ -13514,9 +13565,9 @@ perl_clone_using(PerlInterpreter *proto_perl, UV flags, PerlIO_clone(aTHX_ proto_perl, param); #endif - PL_envgv = gv_dup(proto_perl->Ienvgv, param); - PL_incgv = gv_dup(proto_perl->Iincgv, param); - PL_hintgv = gv_dup(proto_perl->Ihintgv, param); + PL_envgv = gv_dup_inc(proto_perl->Ienvgv, param); + PL_incgv = gv_dup_inc(proto_perl->Iincgv, param); + PL_hintgv = gv_dup_inc(proto_perl->Ihintgv, param); PL_origfilename = SAVEPV(proto_perl->Iorigfilename); PL_diehook = sv_dup_inc(proto_perl->Idiehook, param); PL_warnhook = sv_dup_inc(proto_perl->Iwarnhook, param); @@ -13558,20 +13609,20 @@ perl_clone_using(PerlInterpreter *proto_perl, UV flags, PL_stdingv = gv_dup(proto_perl->Istdingv, param); PL_stderrgv = gv_dup(proto_perl->Istderrgv, param); PL_defgv = gv_dup(proto_perl->Idefgv, param); - PL_argvgv = gv_dup(proto_perl->Iargvgv, param); + PL_argvgv = gv_dup_inc(proto_perl->Iargvgv, param); PL_argvoutgv = gv_dup(proto_perl->Iargvoutgv, param); PL_argvout_stack = av_dup_inc(proto_perl->Iargvout_stack, param); /* shortcuts to regexp stuff */ - PL_replgv = gv_dup(proto_perl->Ireplgv, param); + PL_replgv = gv_dup_inc(proto_perl->Ireplgv, param); /* shortcuts to misc objects */ PL_errgv = gv_dup(proto_perl->Ierrgv, param); /* shortcuts to debugging objects */ - PL_DBgv = gv_dup(proto_perl->IDBgv, param); - PL_DBline = gv_dup(proto_perl->IDBline, param); - PL_DBsub = gv_dup(proto_perl->IDBsub, param); + PL_DBgv = gv_dup_inc(proto_perl->IDBgv, param); + PL_DBline = gv_dup_inc(proto_perl->IDBline, param); + PL_DBsub = gv_dup_inc(proto_perl->IDBsub, param); PL_DBsingle = sv_dup(proto_perl->IDBsingle, param); PL_DBtrace = sv_dup(proto_perl->IDBtrace, param); PL_DBsignal = sv_dup(proto_perl->IDBsignal, param); @@ -13680,8 +13731,8 @@ perl_clone_using(PerlInterpreter *proto_perl, UV flags, #endif /* !USE_LOCALE_NUMERIC */ /* Unicode inversion lists */ - PL_ASCII = sv_dup_inc(proto_perl->IASCII, param); PL_Latin1 = sv_dup_inc(proto_perl->ILatin1, param); + PL_UpperLatin1 = sv_dup_inc(proto_perl->IUpperLatin1, param); PL_AboveLatin1 = sv_dup_inc(proto_perl->IAboveLatin1, param); PL_NonL1NonFinalFold = sv_dup_inc(proto_perl->INonL1NonFinalFold, param); @@ -13794,8 +13845,8 @@ perl_clone_using(PerlInterpreter *proto_perl, UV flags, PL_errors = sv_dup_inc(proto_perl->Ierrors, param); PL_sortcop = (OP*)any_dup(proto_perl->Isortcop, proto_perl); - PL_firstgv = gv_dup(proto_perl->Ifirstgv, param); - PL_secondgv = gv_dup(proto_perl->Isecondgv, param); + PL_firstgv = gv_dup_inc(proto_perl->Ifirstgv, param); + PL_secondgv = gv_dup_inc(proto_perl->Isecondgv, param); PL_stashcache = newHV();