X-Git-Url: http://git.vpit.fr/?a=blobdiff_plain;f=Magic.xs;h=3a170c0332a32e77402fffcf5aa91c9816f9c4bd;hb=354ba160bf92d157a773528894a63967565fcd19;hp=df86b33edfd7ee6dd994d48b6d87721fbac39800;hpb=068ea108c28a60581d00b44976dc979860832c8e;p=perl%2Fmodules%2FVariable-Magic.git diff --git a/Magic.xs b/Magic.xs index df86b33..3a170c0 100644 --- a/Magic.xs +++ b/Magic.xs @@ -536,6 +536,8 @@ STATIC const SV *vmg_wizard_validate(pTHX_ const SV *wiz) { } croak(vmg_invalid_wiz); + /* Not reached */ + return NULL; } #define vmg_wizard_id(W) SvIVX((const SV *) (W)) @@ -589,7 +591,7 @@ STATIC const MGWIZ *vmg_wizard_mgwiz(pTHX_ const SV *wiz) { STATIC const MAGIC *vmg_find(const SV *sv, const SV *wiz) { const MAGIC *mg, *moremagic; - UV wid; + IV wid; if (SvTYPE(sv) < SVt_PVMG) return NULL; @@ -598,7 +600,7 @@ STATIC const MAGIC *vmg_find(const SV *sv, const SV *wiz) { for (mg = SvMAGIC(sv); mg; mg = moremagic) { moremagic = mg->mg_moremagic; if (mg->mg_type == PERL_MAGIC_ext && mg->mg_private == SIG_WIZ) { - UV zid = vmg_wizard_id(mg->mg_ptr); + IV zid = vmg_wizard_id(mg->mg_ptr); if (zid == wid) return mg; } @@ -755,7 +757,7 @@ STATIC UV vmg_dispell(pTHX_ SV *sv, const SV *wiz) { U32 uvars = 0; #endif /* VMG_UVAR */ MAGIC *mg, *prevmagic, *moremagic = NULL; - UV wid = vmg_wizard_id(wiz); + IV wid = vmg_wizard_id(wiz); if (SvTYPE(sv) < SVt_PVMG) return 0; @@ -764,7 +766,7 @@ STATIC UV vmg_dispell(pTHX_ SV *sv, const SV *wiz) { moremagic = mg->mg_moremagic; if (mg->mg_type == PERL_MAGIC_ext && mg->mg_private == SIG_WIZ) { const MGWIZ *z = vmg_wizard_mgwiz(mg->mg_ptr); - UV zid = vmg_wizard_id(mg->mg_ptr); + IV zid = vmg_wizard_id(mg->mg_ptr); if (zid == wid) { #if VMG_UVAR /* If the current has no uvar, short-circuit uvar deletion. */ @@ -871,7 +873,7 @@ STATIC void vmg_op_info_init(pTHX_ unsigned int opinfo) { if (!MY_CXT.b__op_stashes[0]) { opclass c; require_pv("B.pm"); - for (c = 0; c < OPc_MAX; ++c) + for (c = OPc_NULL; c < OPc_MAX; ++c) MY_CXT.b__op_stashes[c] = gv_stashpv(vmg_opclassnames[c], 1); } break; @@ -1027,7 +1029,7 @@ STATIC int vmg_svt_free(pTHX_ SV *sv, MAGIC *mg) { PERL_CONTEXT saved_cx; I32 cxix; #endif - unsigned int had_err, has_err, flags = G_SCALAR | G_EVAL; + I32 had_err, has_err, flags = G_SCALAR | G_EVAL; int ret = 0; dSP; @@ -1316,7 +1318,7 @@ PPCODE: ud.owner = MY_CXT.owner; ptable_walk(MY_CXT.wizards, vmg_ptable_clone, &ud); - for (c = 0; c < OPc_MAX; ++c) { + for (c = OPc_NULL; c < OPc_MAX; ++c) { if (MY_CXT.b__op_stashes[c]) had_b__op_stash |= (((U32) 1) << c); } @@ -1325,7 +1327,7 @@ PPCODE: MY_CXT_CLONE; MY_CXT.wizards = t; MY_CXT.owner = aTHX; - for (c = 0; c < OPc_MAX; ++c) { + for (c = OPc_NULL; c < OPc_MAX; ++c) { MY_CXT.b__op_stashes[c] = (had_b__op_stash & (((U32) 1) << c)) ? gv_stashpv(vmg_opclassnames[c], 1) : NULL; } @@ -1338,6 +1340,7 @@ SV *_wizard(...) PROTOTYPE: DISABLE PREINIT: I32 i = 0; + UV opinfo; MGWIZ *w; MGVTBL *t; SV *cb; @@ -1363,10 +1366,13 @@ CODE: Newx(w, 1, MGWIZ); VMG_SET_CB(ST(i++), data); + cb = ST(i++); - w->opinfo = SvOK(cb) ? SvUV(cb) : 0; + opinfo = SvOK(cb) ? SvUV(cb) : 0; + w->opinfo = (U8) ((opinfo < 255) ? opinfo : 255); if (w->opinfo) vmg_op_info_init(w->opinfo); + VMG_SET_SVT_CB(ST(i++), get); VMG_SET_SVT_CB(ST(i++), set); VMG_SET_SVT_CB(ST(i++), len); @@ -1412,15 +1418,12 @@ PROTOTYPE: \[$@%&*]$@ PREINIT: SV **args = NULL; I32 i = 0; - SV *ret; CODE: if (items > 2) { i = items - 2; args = &ST(2); } - ret = newSVuv(vmg_cast(SvRV(sv), vmg_wizard_validate(wiz), args, i)); - SvREFCNT_dec(args); - RETVAL = ret; + RETVAL = newSVuv(vmg_cast(SvRV(sv), vmg_wizard_validate(wiz), args, i)); OUTPUT: RETVAL