From: Nicholas Clark Date: Mon, 6 Feb 2006 18:07:28 +0000 (+0000) Subject: Move Perl_save_long, Perl_save_I16, Perl_save_I8, Perl_save_iv, X-Git-Tag: accepted/trunk/20130322.191538~18576 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=2053acbf3eca3963d3a31404e10d54b0900f80ed;p=platform%2Fupstream%2Fperl.git Move Perl_save_long, Perl_save_I16, Perl_save_I8, Perl_save_iv, Perl_save_nogv, Perl_save_list, Perl_save_destructor to mathoms.c Perl_save_svref can't actually move because it calls a static function. p4raw-id: //depot/perl@27106 --- diff --git a/mathoms.c b/mathoms.c index 3f541f6..61c2dc9 100644 --- a/mathoms.c +++ b/mathoms.c @@ -1088,6 +1088,81 @@ Perl_sv_nounlocking(pTHX_ SV *sv) PERL_UNUSED_ARG(sv); } +void +Perl_save_long(pTHX_ long int *longp) +{ + dVAR; + SSCHECK(3); + SSPUSHLONG(*longp); + SSPUSHPTR(longp); + SSPUSHINT(SAVEt_LONG); +} + +void +Perl_save_I16(pTHX_ I16 *intp) +{ + dVAR; + SSCHECK(3); + SSPUSHINT(*intp); + SSPUSHPTR(intp); + SSPUSHINT(SAVEt_I16); +} + +void +Perl_save_I8(pTHX_ I8 *bytep) +{ + dVAR; + SSCHECK(3); + SSPUSHINT(*bytep); + SSPUSHPTR(bytep); + SSPUSHINT(SAVEt_I8); +} + +void +Perl_save_iv(pTHX_ IV *ivp) +{ + dVAR; + SSCHECK(3); + SSPUSHIV(*ivp); + SSPUSHPTR(ivp); + SSPUSHINT(SAVEt_IV); +} + +void +Perl_save_nogv(pTHX_ GV *gv) +{ + dVAR; + SSCHECK(2); + SSPUSHPTR(gv); + SSPUSHINT(SAVEt_NSTAB); +} + +void +Perl_save_list(pTHX_ register SV **sarg, I32 maxsarg) +{ + dVAR; + register I32 i; + + for (i = 1; i <= maxsarg; i++) { + register SV * const sv = newSV(0); + sv_setsv(sv,sarg[i]); + SSCHECK(3); + SSPUSHPTR(sarg[i]); /* remember the pointer */ + SSPUSHPTR(sv); /* remember the value */ + SSPUSHINT(SAVEt_ITEM); + } +} + +void +Perl_save_destructor(pTHX_ DESTRUCTORFUNC_NOCONTEXT_t f, void* p) +{ + dVAR; + SSCHECK(3); + SSPUSHDPTR(f); + SSPUSHPTR(p); + SSPUSHINT(SAVEt_DESTRUCTOR); +} + #endif /* NO_MATHOMS */ /* diff --git a/scope.c b/scope.c index 343c6ff..74a9936 100644 --- a/scope.c +++ b/scope.c @@ -192,18 +192,6 @@ Perl_save_scalar(pTHX_ GV *gv) return save_scalar_at(sptr); } -SV* -Perl_save_svref(pTHX_ SV **sptr) -{ - dVAR; - SvGETMAGIC(*sptr); - SSCHECK(3); - SSPUSHPTR(sptr); - SSPUSHPTR(SvREFCNT_inc(*sptr)); - SSPUSHINT(SAVEt_SVREF); - return save_scalar_at(sptr); -} - /* Like save_sptr(), but also SvREFCNT_dec()s the new value. Can be used to * restore a global SV to its prior contents, freeing new value. */ void @@ -356,16 +344,6 @@ Perl_save_int(pTHX_ int *intp) } void -Perl_save_long(pTHX_ long int *longp) -{ - dVAR; - SSCHECK(3); - SSPUSHLONG(*longp); - SSPUSHPTR(longp); - SSPUSHINT(SAVEt_LONG); -} - -void Perl_save_bool(pTHX_ bool *boolp) { dVAR; @@ -385,36 +363,6 @@ Perl_save_I32(pTHX_ I32 *intp) SSPUSHINT(SAVEt_I32); } -void -Perl_save_I16(pTHX_ I16 *intp) -{ - dVAR; - SSCHECK(3); - SSPUSHINT(*intp); - SSPUSHPTR(intp); - SSPUSHINT(SAVEt_I16); -} - -void -Perl_save_I8(pTHX_ I8 *bytep) -{ - dVAR; - SSCHECK(3); - SSPUSHINT(*bytep); - SSPUSHPTR(bytep); - SSPUSHINT(SAVEt_I8); -} - -void -Perl_save_iv(pTHX_ IV *ivp) -{ - dVAR; - SSCHECK(3); - SSPUSHIV(*ivp); - SSPUSHPTR(ivp); - SSPUSHINT(SAVEt_IV); -} - /* Cannot use save_sptr() to store a char* since the SV** cast will * force word-alignment and we'll miss the pointer. */ @@ -461,15 +409,6 @@ Perl_save_padsv(pTHX_ PADOFFSET off) } void -Perl_save_nogv(pTHX_ GV *gv) -{ - dVAR; - SSCHECK(2); - SSPUSHPTR(gv); - SSPUSHINT(SAVEt_NSTAB); -} - -void Perl_save_hptr(pTHX_ HV **hptr) { dVAR; @@ -548,32 +487,6 @@ Perl_save_delete(pTHX_ HV *hv, char *key, I32 klen) } void -Perl_save_list(pTHX_ register SV **sarg, I32 maxsarg) -{ - dVAR; - register I32 i; - - for (i = 1; i <= maxsarg; i++) { - register SV * const sv = newSV(0); - sv_setsv(sv,sarg[i]); - SSCHECK(3); - SSPUSHPTR(sarg[i]); /* remember the pointer */ - SSPUSHPTR(sv); /* remember the value */ - SSPUSHINT(SAVEt_ITEM); - } -} - -void -Perl_save_destructor(pTHX_ DESTRUCTORFUNC_NOCONTEXT_t f, void* p) -{ - dVAR; - SSCHECK(3); - SSPUSHDPTR(f); - SSPUSHPTR(p); - SSPUSHINT(SAVEt_DESTRUCTOR); -} - -void Perl_save_destructor_x(pTHX_ DESTRUCTORFUNC_t f, void* p) { dVAR; @@ -628,6 +541,18 @@ Perl_save_helem(pTHX_ HV *hv, SV *key, SV **sptr) sv_2mortal(sv); } +SV* +Perl_save_svref(pTHX_ SV **sptr) +{ + dVAR; + SvGETMAGIC(*sptr); + SSCHECK(3); + SSPUSHPTR(sptr); + SSPUSHPTR(SvREFCNT_inc(*sptr)); + SSPUSHINT(SAVEt_SVREF); + return save_scalar_at(sptr); +} + void Perl_save_op(pTHX) { @@ -685,7 +610,20 @@ Perl_leave_scope(pTHX_ I32 base) gv = (GV*)SSPOPPTR; ptr = &GvSV(gv); av = (AV*)gv; /* what to refcnt_dec */ - goto restore_sv; + restore_sv: + sv = *(SV**)ptr; + DEBUG_S(PerlIO_printf(Perl_debug_log, + "restore svref: %p %p:%s -> %p:%s\n", + ptr, sv, SvPEEK(sv), value, SvPEEK(value))); + *(SV**)ptr = value; + SvREFCNT_dec(sv); + PL_localizing = 2; + SvSETMAGIC(value); + PL_localizing = 0; + SvREFCNT_dec(value); + if (av) /* actually an av, hv or gv */ + SvREFCNT_dec(av); + break; case SAVEt_GENERIC_PVREF: /* generic pv */ str = (char*)SSPOPPTR; ptr = SSPOPPTR; @@ -714,24 +652,6 @@ Perl_leave_scope(pTHX_ I32 base) SvREFCNT_dec(sv); SvREFCNT_dec(value); break; - case SAVEt_SVREF: /* scalar reference */ - value = (SV*)SSPOPPTR; - ptr = SSPOPPTR; - av = NULL; /* what to refcnt_dec */ - restore_sv: - sv = *(SV**)ptr; - DEBUG_S(PerlIO_printf(Perl_debug_log, - "restore svref: %p %p:%s -> %p:%s\n", - ptr, sv, SvPEEK(sv), value, SvPEEK(value))); - *(SV**)ptr = value; - SvREFCNT_dec(sv); - PL_localizing = 2; - SvSETMAGIC(value); - PL_localizing = 0; - SvREFCNT_dec(value); - if (av) /* actually an av, hv or gv */ - SvREFCNT_dec(av); - break; case SAVEt_AV: /* array reference */ av = (AV*)SSPOPPTR; gv = (GV*)SSPOPPTR; @@ -775,10 +695,6 @@ Perl_leave_scope(pTHX_ I32 base) ptr = SSPOPPTR; *(int*)ptr = (int)SSPOPINT; break; - case SAVEt_LONG: /* long reference */ - ptr = SSPOPPTR; - *(long*)ptr = (long)SSPOPLONG; - break; case SAVEt_BOOL: /* bool reference */ ptr = SSPOPPTR; *(bool*)ptr = (bool)SSPOPBOOL; @@ -787,18 +703,6 @@ Perl_leave_scope(pTHX_ I32 base) ptr = SSPOPPTR; *(I32*)ptr = (I32)SSPOPINT; break; - case SAVEt_I16: /* I16 reference */ - ptr = SSPOPPTR; - *(I16*)ptr = (I16)SSPOPINT; - break; - case SAVEt_I8: /* I8 reference */ - ptr = SSPOPPTR; - *(I8*)ptr = (I8)SSPOPINT; - break; - case SAVEt_IV: /* IV reference */ - ptr = SSPOPPTR; - *(IV*)ptr = (IV)SSPOPIV; - break; case SAVEt_SPTR: /* SV* reference */ ptr = SSPOPPTR; *(SV**)ptr = (SV*)SSPOPPTR; @@ -816,10 +720,6 @@ Perl_leave_scope(pTHX_ I32 base) ptr = SSPOPPTR; *(AV**)ptr = (AV*)SSPOPPTR; break; - case SAVEt_NSTAB: - gv = (GV*)SSPOPPTR; - (void)sv_clear((SV*)gv); - break; case SAVEt_GP: /* scalar reference */ ptr = SSPOPPTR; gv = (GV*)SSPOPPTR; @@ -916,10 +816,6 @@ Perl_leave_scope(pTHX_ I32 base) SvREFCNT_dec(hv); Safefree(ptr); break; - case SAVEt_DESTRUCTOR: - ptr = SSPOPPTR; - (*SSPOPDPTR)(ptr); - break; case SAVEt_DESTRUCTOR_X: ptr = SSPOPPTR; (*SSPOPDXPTR)(aTHX_ ptr); @@ -1019,6 +915,36 @@ Perl_leave_scope(pTHX_ I32 base) SvFLAGS(sv) |= val; } break; + /* These are only saved in mathoms.c */ + case SAVEt_SVREF: /* scalar reference */ + value = (SV*)SSPOPPTR; + ptr = SSPOPPTR; + av = NULL; /* what to refcnt_dec */ + goto restore_sv; + case SAVEt_LONG: /* long reference */ + ptr = SSPOPPTR; + *(long*)ptr = (long)SSPOPLONG; + break; + case SAVEt_I16: /* I16 reference */ + ptr = SSPOPPTR; + *(I16*)ptr = (I16)SSPOPINT; + break; + case SAVEt_I8: /* I8 reference */ + ptr = SSPOPPTR; + *(I8*)ptr = (I8)SSPOPINT; + break; + case SAVEt_IV: /* IV reference */ + ptr = SSPOPPTR; + *(IV*)ptr = (IV)SSPOPIV; + break; + case SAVEt_NSTAB: + gv = (GV*)SSPOPPTR; + (void)sv_clear((SV*)gv); + break; + case SAVEt_DESTRUCTOR: + ptr = SSPOPPTR; + (*SSPOPDPTR)(ptr); + break; default: Perl_croak(aTHX_ "panic: leave_scope inconsistency"); }