From: Vincent Pit Date: Sun, 29 Jun 2008 16:24:24 +0000 (+0200) Subject: Importing Variable-Magic-0.06.tar.gz X-Git-Tag: v0.06^0 X-Git-Url: http://git.vpit.fr/?a=commitdiff_plain;h=0f6f5717615db7019992273892a3360bfcc5ca7f;hp=017450c5da83c82c9149b5170c757ce03679b9a9;p=perl%2Fmodules%2FVariable-Magic.git Importing Variable-Magic-0.06.tar.gz --- diff --git a/Changes b/Changes index 171ac4f..9e840ed 100644 --- 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. diff --git a/META.yml b/META.yml index c70ad14..46168a1 100644 --- 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 diff --git a/Magic.xs b/Magic.xs index 89c8351..a2387f1 100644 --- 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 /* rand(), RAND_MAX */ #include /* sprintf() */ #define PERL_NO_GET_CONTEXT @@ -13,6 +12,10 @@ #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 @@ -30,6 +33,59 @@ # 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); diff --git a/Makefile.PL b/Makefile.PL index f287121..f76dda4 100644 --- a/Makefile.PL +++ b/Makefile.PL @@ -1,3 +1,5 @@ +use 5.007003; + use strict; use warnings; use ExtUtils::MakeMaker; diff --git a/README b/README index cec74c1..4b92a15 100644 --- 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). diff --git a/lib/Variable/Magic.pm b/lib/Variable/Magic.pm index d33c37b..ff6ec4a 100644 --- a/lib/Variable/Magic.pm +++ b/lib/Variable/Magic.pm @@ -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 5.7.3. + L (standard since perl 5), L (standard since perl 5.006). Glob tests need L (standard since perl 5.002).