X-Git-Url: http://git.vpit.fr/?a=blobdiff_plain;f=Magic.xs;h=3a170c0332a32e77402fffcf5aa91c9816f9c4bd;hb=354ba160bf92d157a773528894a63967565fcd19;hp=183bfbd7521bfe193b2085d9b299315df5db4ef8;hpb=990ac0f214d44bda5d26733979f647b855cb5702;p=perl%2Fmodules%2FVariable-Magic.git diff --git a/Magic.xs b/Magic.xs index 183bfbd..3a170c0 100644 --- a/Magic.xs +++ b/Magic.xs @@ -591,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; @@ -600,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; } @@ -757,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; @@ -766,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. */ @@ -1029,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; @@ -1340,6 +1340,7 @@ SV *_wizard(...) PROTOTYPE: DISABLE PREINIT: I32 i = 0; + UV opinfo; MGWIZ *w; MGVTBL *t; SV *cb; @@ -1365,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); @@ -1414,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