X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=scope.c;h=33d891e13a5703eae50088b2a7652dbba3676f76;hb=dc6d0c4f0dc8290035f9541d4ee259b8bfea7456;hp=673a3129004c11b9aeb02bde01f1d35023e5c11a;hpb=33f3c7b8444b48791ad016570a41a23483d750d2;p=p5sagit%2Fp5-mst-13.2.git diff --git a/scope.c b/scope.c index 673a312..33d891e 100644 --- a/scope.c +++ b/scope.c @@ -281,6 +281,18 @@ Perl_save_shared_pvref(pTHX_ char **str) SSPUSHINT(SAVEt_SHARED_PVREF); } +/* set the SvFLAGS specified by mask to the values in val */ + +void +Perl_save_set_svflags(pTHX_ SV* sv, U32 mask, U32 val) +{ + SSCHECK(4); + SSPUSHPTR(sv); + SSPUSHINT(mask); + SSPUSHINT(val); + SSPUSHINT(SAVEt_SET_SVFLAGS); +} + void Perl_save_gp(pTHX_ GV *gv, I32 empty) { @@ -945,7 +957,7 @@ Perl_leave_scope(pTHX_ I32 base) SvREFCNT_dec(sv); /* Cast current value to the winds. */ /* preserve pad nature, but also mark as not live * for any closure capturing */ - SvFLAGS(*(SV**)ptr) |= padflags & SVs_PADSTALE; + SvFLAGS(*(SV**)ptr) |= padflags | SVs_PADSTALE; } break; case SAVEt_DELETE: @@ -1036,6 +1048,15 @@ Perl_leave_scope(pTHX_ I32 base) AvARRAY((PAD*)ptr)[off] = (SV*)SSPOPPTR; } break; + case SAVEt_SET_SVFLAGS: + { + U32 val = (U32)SSPOPINT; + U32 mask = (U32)SSPOPINT; + sv = (SV*)SSPOPPTR; + SvFLAGS(sv) &= ~mask; + SvFLAGS(sv) |= val; + } + break; default: Perl_croak(aTHX_ "panic: leave_scope inconsistency"); }