]> git.vpit.fr Git - perl/modules/Variable-Magic.git/commitdiff
Importing Variable-Magic-0.06.tar.gz v0.06
authorVincent Pit <vince@profvince.com>
Sun, 29 Jun 2008 16:24:24 +0000 (18:24 +0200)
committerVincent Pit <vince@profvince.com>
Sun, 29 Jun 2008 16:24:24 +0000 (18:24 +0200)
Changes
META.yml
Magic.xs
Makefile.PL
README
lib/Variable/Magic.pm

diff --git a/Changes b/Changes
index 171ac4f41afac3421dae578fe906f71c6917fd4c..9e840ed3927ad19d0f4f28477b7db38dcad082e9 100644 (file)
--- a/Changes
+++ b/Changes
@@ -1,5 +1,10 @@
 Revision history for Variable-Magic
 
+0.06    2007-11-20 10:10 UTC
+        + Chg : 5.7.3 is now officially required.
+        + Fix : "data" test failures on 5.8.{0,2}.
+        + Fix : Drand01() vs rand().
+
 0.05    2007-11-19 09:10 UTC
         + Fix : 5.10.0_RC1 compatibility fix.
 
index c70ad14c09262298e2d504c3f6be0c2ace8c4d25..46168a1b04866a8e5a51ea08ac5f8a5f8d80e5a9 100644 (file)
--- a/META.yml
+++ b/META.yml
@@ -1,6 +1,6 @@
 --- #YAML:1.0
 name:                Variable-Magic
-version:             0.05
+version:             0.06
 abstract:            Associate user-defined magic to variables from Perl.
 license:             perl
 generated_by:        ExtUtils::MakeMaker version 6.36_01
index 89c8351d902fc361f94bd7db7642b3962860212e..a2387f1615d881101d3599317c385b965ae07a9c 100644 (file)
--- a/Magic.xs
+++ b/Magic.xs
@@ -1,7 +1,6 @@
 /* This file is part of the Variable::Magic Perl module.
  * See http://search.cpan.org/dist/Variable-Magic/ */
 
-#include <stdlib.h> /* rand(), RAND_MAX */
 #include <stdio.h>  /* sprintf() */
 
 #define PERL_NO_GET_CONTEXT
 
 #define R(S) fprintf(stderr, "R(" #S ") = %d\n", SvREFCNT(S))
 
+#define PERL_VERSION_LE(R, V, S) (PERL_REVISION < (R) || (PERL_REVISION == (R) && (PERL_VERSION < (V) || (PERL_VERSION == (V) && (PERL_SUBVERSION <= (S))))))
+
+#define PERL_API_VERSION_GE(R, V, S) (PERL_API_REVISION > (R) || (PERL_API_REVISION == (R) && (PERL_API_VERSION > (V) || (PERL_API_VERSION == (V) && (PERL_API_SUBVERSION >= (S))))))
+
 /* --- Compatibility ------------------------------------------------------- */
 
 #ifndef Newx
 # define MY_CXT_INIT
 #endif
 
+#ifndef PERL_MAGIC_ext
+# define PERL_MAGIC_ext '~'
+#endif
+
+/* --- Our sv_magicext ----------------------------------------------------- */
+
+#ifdef sv_magicext
+STATIC MAGIC *vmg_sv_magicext(pTHX_ SV *sv, SV *obj, MGVTBL *vtbl, SV *obj2, I32 flag) {
+ return sv_magicext(sv, obj, PERL_MAGIC_ext, vtbl, (const char *) obj2, flag);
+}
+#else /* Stub inspired from 5.7.3's sv_magicext */
+STATIC MAGIC *vmg_sv_magicext(pTHX_ SV *sv, SV *obj, MGVTBL *vtbl, SV *obj2, I32 flag) {
+ MAGIC* mg;
+
+ if (SvTYPE(sv) < SVt_PVMG) {
+  SvUPGRADE(sv, SVt_PVMG);
+ }
+ Newx(mg, 1, MAGIC);
+ mg->mg_moremagic = SvMAGIC(sv);
+ SvMAGIC_set(sv, mg);
+
+ if (!obj || obj == sv ||
+     (SvTYPE(obj) == SVt_PVGV &&
+        (GvSV(obj) == sv || GvHV(obj) == (HV *) sv || GvAV(obj) == (AV *) sv ||
+                            GvCV(obj) == (CV *) sv || GvIOp(obj) == (IO *) sv ||
+                            GvFORM(obj) == (CV *) sv))) {
+  mg->mg_obj = obj;
+ } else {
+  mg->mg_obj = SvREFCNT_inc(obj);
+  mg->mg_flags |= MGf_REFCOUNTED;
+ }
+
+ mg->mg_type = PERL_MAGIC_ext;
+ mg->mg_len  = flag;
+ if (obj2) {
+  if (flag == HEf_SVKEY) {
+   mg->mg_ptr = (char *) SvREFCNT_inc((SV *) obj2);
+  } else {
+   mg->mg_ptr = (char *) obj2;
+  }
+ }
+ mg->mg_virtual = vtbl;
+
+ mg_magical(sv);
+ if (SvGMAGICAL(sv)) {
+  SvFLAGS(sv) &= ~(SVf_IOK | SVf_NOK | SVf_POK);
+ }
+
+ return mg;
+}
+#endif
+#define vmg_sv_magicext(S, O, V, OO, F) vmg_sv_magicext(aTHX_ (S), (O), (V), (OO), (F))
+
 /* --- Context-safe global data -------------------------------------------- */
 
 #define MY_CXT_KEY __PACKAGE__ "::_guts" XS_VERSION
@@ -57,8 +113,7 @@ STATIC U16 vmg_gensig(pTHX) {
  dMY_CXT;
 
  do {
-  double u = rand() / (RAND_MAX + 1.0);
-  sig = SIG_NBR * u + SIG_MIN;
+  sig = SIG_NBR * Drand01() + SIG_MIN;
  } while (hv_exists(MY_CXT.wizz, buf, sprintf(buf, "%u", sig)));
 
  return sig;
@@ -101,7 +156,11 @@ STATIC SV *vmg_data_new(pTHX_ SV *ctor, SV *sv, AV *args) {
 
  if (count != 1) { croak("Callback needs to return 1 scalar\n"); }
  nsv = POPs;
- SvREFCNT_inc(nsv); /* Or it will be destroyed in FREETMPS */
+#if PERL_VERSION_LE(5, 8, 2)
+ nsv = sv_newref(nsv); /* Workaround some bug in SvREFCNT_inc() */
+#else
+ SvREFCNT_inc(nsv);    /* Or it will be destroyed in FREETMPS */
+#endif
 
  PUTBACK;
 
@@ -145,8 +204,7 @@ STATIC UV vmg_cast(pTHX_ SV *sv, SV *wiz, AV *args) {
  }
 
  data = (w->cb_data) ? vmg_data_new(w->cb_data, sv, args) : NULL;
- mg = sv_magicext(sv, data, PERL_MAGIC_ext, w->vtbl,
-                            (const char *) wiz, HEf_SVKEY);
+ mg = vmg_sv_magicext(sv, data, w->vtbl, wiz, HEf_SVKEY);
  mg->mg_private = w->sig;
 
  return 1;
@@ -273,7 +331,7 @@ STATIC int vmg_wizard_free(pTHX_ SV *wiz, MAGIC *mg) {
  w = SV2MGWIZ(wiz);
 
  SvREFCNT_inc(wiz); /* Fake survival - it's gonna be deleted anyway */
-#if PERL_API_REVISION > 5 || (PERL_API_REVISION == 5 && (PERL_API_VERSION > 9 || (PERL_API_VERSION == 9 && PERL_API_SUBVERSION >= 5)))
+#if PERL_API_VERSION_GE(5, 9, 5)
  SvREFCNT_inc(wiz); /* One more push */
 #endif
  if (hv_delete(MY_CXT.wizz, buf, sprintf(buf, "%u", w->sig), 0)) {
@@ -400,7 +458,7 @@ CODE:
  w->cb_data  = (SvROK(cb_data))  ? newRV_inc(SvRV(cb_data))  : NULL;
 
  sv = MGWIZ2SV(w);
- mg = sv_magicext(sv, NULL, PERL_MAGIC_ext, &vmg_wizard_vtbl, NULL, -1);
+ mg = vmg_sv_magicext(sv, NULL, &vmg_wizard_vtbl, NULL, -1);
  mg->mg_private = SIG_WIZ;
 
  hv_store(MY_CXT.wizz, buf, sprintf(buf, "%u", sig), sv, 0);
index f2871215e36016a0f3030c1ffdbb2063ea354f8d..f76dda4b2e08f085026b7a324d88e9d0a26d2f70 100644 (file)
@@ -1,3 +1,5 @@
+use 5.007003;
+
 use strict;
 use warnings;
 use ExtUtils::MakeMaker;
diff --git a/README b/README
index cec74c1770dafc895c144ade5dd3475c5b7306e8..4b92a15c4a549011fbbd39e1ce306ca01aa3197f 100644 (file)
--- a/README
+++ b/README
@@ -2,7 +2,7 @@ NAME
     Variable::Magic - Associate user-defined magic to variables from Perl.
 
 VERSION
-    Version 0.05
+    Version 0.06
 
 SYNOPSIS
         use Variable::Magic qw/wizard cast dispell/;
@@ -173,6 +173,8 @@ EXPORT
     on request. They are all exported by the tags ':consts' and ':all'.
 
 DEPENDENCIES
+    perl 5.7.3.
+
     Carp (standard since perl 5), XSLoader (standard since perl 5.006).
 
     Glob tests need Symbol (standard since perl 5.002).
index d33c37b4d47e2b1a8666bfe5bdb7a7378ca3a50f..ff6ec4ab8717dc892ea811cbcde288d40ea8b240 100644 (file)
@@ -1,5 +1,7 @@
 package Variable::Magic;
 
+use 5.007003;
+
 use strict;
 use warnings;
 
@@ -11,11 +13,11 @@ Variable::Magic - Associate user-defined magic to variables from Perl.
 
 =head1 VERSION
 
-Version 0.05
+Version 0.06
 
 =cut
 
-our $VERSION = '0.05';
+our $VERSION = '0.06';
 
 =head1 SYNOPSIS
 
@@ -201,6 +203,8 @@ $EXPORT_TAGS{'all'} = \@EXPORT_OK;
 
 =head1 DEPENDENCIES
 
+L<perl> 5.7.3.
+
 L<Carp> (standard since perl 5), L<XSLoader> (standard since perl 5.006).
 
 Glob tests need L<Symbol> (standard since perl 5.002).