X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=Moose.xs;h=874e9e074a0aea1dc99b71acaf5ba8f3dd93125f;hb=5dcac91380949016a8e84cd9eef98186606823f4;hp=a12e103807a1dbaf3cf2088cada05b49b36c98f6;hpb=a4550ed1c56166a6a7ec26ae594f73140c3d77e3;p=gitmo%2FMoose.git diff --git a/Moose.xs b/Moose.xs index a12e103..874e9e0 100644 --- a/Moose.xs +++ b/Moose.xs @@ -1,183 +1,102 @@ - #include "EXTERN.h" #include "perl.h" #include "XSUB.h" #include "ppport.h" -static bool ck_sv_defined(SV*); -static bool ck_sv_is_ref(SV*); -static bool ck_sv_ref_type(SV*, int); +#ifndef MGf_COPY +# define MGf_COPY 0 +#endif + +#ifndef MGf_DUP +# define MGf_DUP 0 +#endif + +#ifndef MGf_LOCAL +# define MGf_LOCAL 0 +#endif + +STATIC int unset_export_flag (pTHX_ SV *sv, MAGIC *mg); + +STATIC MGVTBL export_flag_vtbl = { + NULL, /* get */ + unset_export_flag, /* set */ + NULL, /* len */ + NULL, /* clear */ + NULL, /* free */ +#if MGf_COPY + NULL, /* copy */ +#endif +#if MGf_DUP + NULL, /* dup */ +#endif +#if MGf_LOCAL + NULL, /* local */ +#endif +}; + +STATIC bool +export_flag_is_set (pTHX_ SV *sv) +{ + MAGIC *mg, *moremagic; + + if (SvTYPE(SvRV(sv)) != SVt_PVGV) { + return 0; + } -static bool -ck_sv_defined(SV* value){ - return SvOK(value) ? 1 : 0; -} + for (mg = SvMAGIC(SvRV(sv)); mg; mg = moremagic) { + moremagic = mg->mg_moremagic; -static bool -ck_sv_is_ref(SV* value){ - bool retval = 0; - if( ck_sv_defined(value) && SvROK(value) ){ - retval = 1; - } - return retval; -} + if (mg->mg_type == PERL_MAGIC_ext && mg->mg_virtual == &export_flag_vtbl) { + break; + } + } -static bool -ck_sv_ref_type(SV* value, int sv_type){ - bool retval = 0; - if( ck_sv_is_ref(value) && SvTYPE( SvRV(value) ) == sv_type){ - retval = 1; - } - return retval; + return !!mg; } -static const char *regclass = "Regexp"; - -MODULE = Moose PACKAGE = Moose::Util::TypeConstraints::OptimizedConstraints -PROTOTYPES: ENABLE - -bool -Undef(value) - SV* value - CODE: - RETVAL = !ck_sv_defined(value); - OUTPUT: - RETVAL - -bool -Defined(value) - SV* value - CODE: - RETVAL = ck_sv_defined(value); - OUTPUT: - RETVAL - -bool -Value(value) - SV* value - CODE: - RETVAL = (ck_sv_defined(value) && !ck_sv_is_ref(value)) ? 1 : 0; - OUTPUT: - RETVAL - -bool -Str(value) - SV* value - CODE: - RETVAL = (ck_sv_defined(value) && !ck_sv_is_ref(value)) ? 1 : 0; - OUTPUT: - RETVAL +STATIC int +unset_export_flag (pTHX_ SV *sv, MAGIC *mymg) +{ + MAGIC *mg, *prevmagic = NULL, *moremagic = NULL; -bool -Ref(value) - SV* value - CODE: - RETVAL = ck_sv_is_ref(value); - OUTPUT: - RETVAL + for (mg = SvMAGIC(sv); mg; prevmagic = mg, mg = moremagic) { + moremagic = mg->mg_moremagic; -bool -ScalarRef(value) - SV* value - CODE: - RETVAL = 0; - if( - SvOK(value) && SvROK(value) - ){ - int type = SvTYPE(SvRV(value)); - if( - type == SVt_IV || - type == SVt_NV || - type == SVt_PV || - type == SVt_NULL - ){ - RETVAL = 1; - } + if (mg == mymg) { + break; + } } - OUTPUT: - RETVAL -bool -ArrayRef(value) - SV* value - CODE: - RETVAL = ck_sv_ref_type(value, SVt_PVAV); - OUTPUT: - RETVAL + if (!mg) { + return 0; + } -bool -HashRef(value) - SV* value - CODE: - RETVAL = (ck_sv_ref_type(value, SVt_PVHV) && !sv_isobject(value)) ? 1 : 0; - OUTPUT: - RETVAL + if (prevmagic) { + prevmagic->mg_moremagic = moremagic; + } + else { + SvMAGIC_set(sv, moremagic); + } -bool -CodeRef(value) - SV* value - CODE: - RETVAL = ck_sv_ref_type(value, SVt_PVCV); - OUTPUT: - RETVAL + mg->mg_moremagic = NULL; -bool -GlobRef(value) - SV* value - CODE: - RETVAL = ck_sv_ref_type(value, SVt_PVGV); - OUTPUT: - RETVAL + Safefree (mg); -bool -Object(value) - SV* value - CODE: - RETVAL = 0; - if( ck_sv_is_ref(value) - && sv_isobject(value) - && !sv_isa(value, regclass) - ){ - RETVAL = 1; - } - OUTPUT: - RETVAL + return 0; +} -bool -ObjectOfType(value, class) - SV* value - SV* class - PREINIT: - const char* classname; - CODE: - RETVAL = 0; - - classname = SvPV_nolen(class); - if(!classname){ - RETVAL = 0; - } +MODULE = Moose PACKAGE = Moose::Exporter - if( ck_sv_is_ref(value) - && sv_isobject(value) - && sv_derived_from(value, classname) - ){ - RETVAL = 1; - } - OUTPUT: - RETVAL +void +_flag_as_reexport (SV *sv) + PROTOTYPE: \* + CODE: + sv_magicext(SvRV(sv), NULL, PERL_MAGIC_ext, &export_flag_vtbl, NULL, 0); bool -RegexpRef(value) - SV* value - CODE: - RETVAL = 0; - if( ck_sv_is_ref(value) - && sv_isobject(value) - && sv_isa(value, regclass) - ){ - RETVAL = 1; - } - OUTPUT: - RETVAL - - +_export_is_flagged (SV *sv) + PROTOTYPE: \* + CODE: + RETVAL = export_flag_is_set(aTHX_ sv); + OUTPUT: + RETVAL