X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=mouse.h;h=662e2274ecdf2c6cd6214fd83493c4b8f83fe515;hb=1d859d42e4859c7181a91dcd8df733cbcecddb0e;hp=dcadf8d4de5e3bac41712924005f128bbe252081;hpb=19462c576ac247d86627100677cac7d78b14f49e;p=gitmo%2FMouse.git diff --git a/mouse.h b/mouse.h index dcadf8d..662e227 100644 --- a/mouse.h +++ b/mouse.h @@ -6,7 +6,6 @@ #include #include -#define NEED_newSVpvn_flags #include "ppport.h" /* for portability */ @@ -14,6 +13,10 @@ #define newSVpvs_share(s) Perl_newSVpvn_share(aTHX_ s, sizeof(s)-1, 0U) #endif +#ifndef get_cvs +#define get_cvs(name, flags) get_cv(name, flags) +#endif + #ifndef GvNAME_get #define GvNAME_get GvNAME #endif @@ -59,12 +62,15 @@ bool mouse_is_class_loaded(pTHX_ SV*); #define is_an_instance_of(klass, sv) mouse_is_an_instance_of(aTHX_ gv_stashpvs(klass, GV_ADD), (sv)) -#define IsObject(sv) (SvROK(sv) && SvOBJECT(SvRV(sv))) +#define IsObject(sv) (SvROK(sv) && SvOBJECT(SvRV(sv))) +#define IsArrayRef(sv) (SvROK(sv) && !SvOBJECT(SvRV(sv)) && SvTYPE(SvRV(sv)) == SVt_PVAV) +#define IsHashRef(sv) (SvROK(sv) && !SvOBJECT(SvRV(sv)) && SvTYPE(SvRV(sv)) == SVt_PVHV) +#define IsCodeRef(sv) (SvROK(sv) && !SvOBJECT(SvRV(sv)) && SvTYPE(SvRV(sv)) == SVt_PVCV) #define mcall0(invocant, m) mouse_call0(aTHX_ (invocant), (m)) #define mcall1(invocant, m, arg1) mouse_call1(aTHX_ (invocant), (m), (arg1)) -#define mcall0s(invocant, m) mcall0((invocant), newSVpvs_flags(m, SVs_TEMP)) -#define mcall1s(invocant, m, arg1) mcall1((invocant), newSVpvs_flags(m, SVs_TEMP), (arg1)) +#define mcall0s(invocant, m) mcall0((invocant), sv_2mortal(newSVpvs_share(m))) +#define mcall1s(invocant, m, arg1) mcall1((invocant), sv_2mortal(newSVpvs_share(m)), (arg1)) SV* mouse_call0(pTHX_ SV *const self, SV *const method); SV* mouse_call1(pTHX_ SV *const self, SV *const method, SV* const arg1); @@ -113,26 +119,26 @@ void mouse_instance_weaken_slot(pTHX_ SV* const instance, SV* const slot); /* mouse_simle_accessor.xs */ #define INSTALL_SIMPLE_READER(klass, name) INSTALL_SIMPLE_READER_WITH_KEY(klass, name, name) -#define INSTALL_SIMPLE_READER_WITH_KEY(klass, name, key) (void)mouse_install_simple_accessor(aTHX_ "Mouse::Meta::" #klass "::" #name, #key, sizeof(#key)-1, mouse_xs_simple_reader) +#define INSTALL_SIMPLE_READER_WITH_KEY(klass, name, key) (void)mouse_install_simple_accessor(aTHX_ "Mouse::Meta::" #klass "::" #name, #key, sizeof(#key)-1, XS_Mouse_simple_reader) #define INSTALL_SIMPLE_WRITER(klass, name) INSTALL_SIMPLE_WRITER_WITH_KEY(klass, name, name) -#define INSTALL_SIMPLE_WRITER_WITH_KEY(klass, name, key) (void)mouse_install_simple_accessor(aTHX_ "Mouse::Meta::" #klass "::" #name, #key, sizeof(#key)-1, mouse_xs_simple_writer) +#define INSTALL_SIMPLE_WRITER_WITH_KEY(klass, name, key) (void)mouse_install_simple_accessor(aTHX_ "Mouse::Meta::" #klass "::" #name, #key, sizeof(#key)-1, XS_Mouse_simple_writer) #define INSTALL_SIMPLE_PREDICATE(klass, name) INSTALL_SIMPLE_PREDICATE_WITH_KEY(klass, name, name) -#define INSTALL_SIMPLE_PREDICATE_WITH_KEY(klass, name, key) (void)mouse_install_simple_accessor(aTHX_ "Mouse::Meta::" #klass "::" #name, #key, sizeof(#key)-1, mouse_xs_simple_predicate) +#define INSTALL_SIMPLE_PREDICATE_WITH_KEY(klass, name, key) (void)mouse_install_simple_accessor(aTHX_ "Mouse::Meta::" #klass "::" #name, #key, sizeof(#key)-1, XS_Mouse_simple_predicate) CV* mouse_install_simple_accessor(pTHX_ const char* const fq_name, const char* const key, I32 const keylen, XSUBADDR_t const accessor_impl); -XS(mouse_xs_simple_reader); -XS(mouse_xs_simple_writer); -XS(mouse_xs_simple_clearer); -XS(mouse_xs_simple_predicate); +XS(XS_Mouse_simple_reader); +XS(XS_Mouse_simple_writer); +XS(XS_Mouse_simple_clearer); +XS(XS_Mouse_simple_predicate); CV* mouse_instantiate_xs_accessor(pTHX_ SV* const attr, XSUBADDR_t const accessor_impl); -XS(mouse_xs_accessor); -XS(mouse_xs_reader); -XS(mouse_xs_writer); +XS(XS_Mouse_accessor); +XS(XS_Mouse_reader); +XS(XS_Mouse_writer); /* type constraints */