]> git.vpit.fr Git - perl/modules/Variable-Magic.git/commitdiff
Make the wizard store the MGWIZ address as an IV
authorVincent Pit <vince@profvince.com>
Fri, 27 Nov 2009 11:13:53 +0000 (12:13 +0100)
committerVincent Pit <vince@profvince.com>
Fri, 27 Nov 2009 11:13:53 +0000 (12:13 +0100)
Also, since we validated the wizard, use SvIVX to read the address.
That way, we no longer need to pass the interpreter to vmg_find().
This results also in some consting goodness.

Magic.xs

index caff817b84c869d0d76fd6a63c9e0e9fe7c8d4f8..70b26173e11b3f9b128967cc9489cd746c6cd4fc 100644 (file)
--- a/Magic.xs
+++ b/Magic.xs
@@ -533,7 +533,7 @@ STATIC MGVTBL vmg_wizard_vtbl = {
 
 STATIC SV *vmg_wizard_new(pTHX_ const MGWIZ *w) {
 #define vmg_wizard_new(W) vmg_wizard_new(aTHX_ (W))
- SV *wiz = newSVuv(PTR2UV(w));
+ SV *wiz = newSVuv(PTR2IV(w));
 
  if (w) {
   MAGIC *mg = sv_magicext(wiz, NULL, PERL_MAGIC_ext, &vmg_wizard_vtbl, NULL, 0);
@@ -544,7 +544,7 @@ STATIC SV *vmg_wizard_new(pTHX_ const MGWIZ *w) {
  return wiz;
 }
 
-STATIC SV *vmg_wizard_validate(pTHX_ SV *wiz) {
+STATIC const SV *vmg_wizard_validate(pTHX_ const SV *wiz) {
 #define vmg_wizard_validate(W) vmg_wizard_validate(aTHX_ (W))
  if (SvROK(wiz)) {
   wiz = SvRV(wiz);
@@ -555,7 +555,7 @@ STATIC SV *vmg_wizard_validate(pTHX_ SV *wiz) {
  croak(vmg_invalid_wiz);
 }
 
-#define vmg_wizard_id(W)         SvUV((SV *) (W))
+#define vmg_wizard_id(W)         SvIVX((const SV *) (W))
 #define vmg_wizard_main_mgwiz(W) INT2PTR(const MGWIZ *, vmg_wizard_id(W))
 
 /* ... Wizard destructor ................................................... */
@@ -582,8 +582,8 @@ STATIC int vmg_wizard_free(pTHX_ SV *sv, MAGIC *mg) {
 
 #if VMG_THREADSAFE
 
-STATIC const MGWIZ *vmg_wizard_mgwiz(pTHX_ SV *wiz) {
-#define vmg_wizard_mgwiz(W) vmg_wizard_mgwiz(aTHX_ ((SV *) (W)))
+STATIC const MGWIZ *vmg_wizard_mgwiz(pTHX_ const SV *wiz) {
+#define vmg_wizard_mgwiz(W) vmg_wizard_mgwiz(aTHX_ ((const SV *) (W)))
  const MGWIZ *w;
 
  w = vmg_wizard_main_mgwiz(wiz);
@@ -604,8 +604,7 @@ STATIC const MGWIZ *vmg_wizard_mgwiz(pTHX_ SV *wiz) {
 
 /* --- User-level functions implementation --------------------------------- */
 
-STATIC const MAGIC *vmg_find(pTHX_ const SV *sv, SV *wiz) {
-#define vmg_find(S, W) vmg_find(aTHX_ (S), (W))
+STATIC const MAGIC *vmg_find(const SV *sv, const SV *wiz) {
  const MAGIC *mg, *moremagic;
  UV wid;
 
@@ -661,7 +660,7 @@ STATIC SV *vmg_data_new(pTHX_ SV *ctor, SV *sv, AV *args) {
  return nsv;
 }
 
-STATIC SV *vmg_data_get(pTHX_ SV *sv, SV *wiz) {
+STATIC SV *vmg_data_get(pTHX_ SV *sv, const SV *wiz) {
 #define vmg_data_get(S, W) vmg_data_get(aTHX_ (S), (W))
  const MAGIC *mg = vmg_find(sv, wiz);
  return mg ? mg->mg_obj : NULL;
@@ -684,7 +683,7 @@ STATIC void vmg_uvar_del(SV *sv, MAGIC *prevmagic, MAGIC *mg, MAGIC *moremagic)
 }
 #endif /* VMG_UVAR */
 
-STATIC UV vmg_cast(pTHX_ SV *sv, SV *wiz, AV *args) {
+STATIC UV vmg_cast(pTHX_ SV *sv, const SV *wiz, AV *args) {
 #define vmg_cast(S, W, A) vmg_cast(aTHX_ (S), (W), (A))
  MAGIC       *mg, *moremagic = NULL;
  SV          *data;
@@ -766,7 +765,7 @@ done:
  return 1;
 }
 
-STATIC UV vmg_dispell(pTHX_ SV *sv, SV *wiz) {
+STATIC UV vmg_dispell(pTHX_ SV *sv, const SV *wiz) {
 #define vmg_dispell(S, W) vmg_dispell(aTHX_ (S), (W))
 #if VMG_UVAR
  U32 uvars = 0;
@@ -1426,7 +1425,6 @@ PREINIT:
  AV *args = NULL;
  SV *ret;
 CODE:
- wiz = vmg_wizard_validate(wiz);
  if (items > 2) {
   I32 i;
   args = newAV();
@@ -1437,7 +1435,7 @@ CODE:
    if (av_store(args, i - 2, arg) == NULL) croak(vmg_argstorefailed);
   }
  }
- ret = newSVuv(vmg_cast(SvRV(sv), wiz, args));
+ ret = newSVuv(vmg_cast(SvRV(sv), vmg_wizard_validate(wiz), args));
  SvREFCNT_dec(args);
  RETVAL = ret;
 OUTPUT:
@@ -1449,8 +1447,7 @@ PROTOTYPE: \[$@%&*]$
 PREINIT:
  SV *data;
 PPCODE:
- wiz  = vmg_wizard_validate(wiz);
- data = vmg_data_get(SvRV(sv), wiz);
+ data = vmg_data_get(SvRV(sv), vmg_wizard_validate(wiz));
  if (!data)
   XSRETURN_EMPTY;
  ST(0) = data;
@@ -1459,7 +1456,6 @@ PPCODE:
 SV *dispell(SV *sv, SV *wiz)
 PROTOTYPE: \[$@%&*]$
 CODE:
- wiz = vmg_wizard_validate(wiz);
- RETVAL = newSVuv(vmg_dispell(SvRV(sv), wiz));
+ RETVAL = newSVuv(vmg_dispell(SvRV(sv), vmg_wizard_validate(wiz)));
 OUTPUT:
  RETVAL