X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=xs-src%2FMouse.xs;h=c34ad16ec9209c9ef41d223619323c0a824c385f;hb=d7d8d49b322c4d0f274aaafb049b324e1de6b552;hp=5a6c8446a1caf70720658bdce9dbe4cb0eb67643;hpb=cccb83dea141cc50ab03aedefda36c5822a7b98f;p=gitmo%2FMouse.git diff --git a/xs-src/Mouse.xs b/xs-src/Mouse.xs index 5a6c844..c34ad16 100644 --- a/xs-src/Mouse.xs +++ b/xs-src/Mouse.xs @@ -10,6 +10,7 @@ PROTOTYPES: DISABLE BOOT: mouse_package = newSVpvs_share("package"); mouse_namespace = newSVpvs_share("namespace"); + MOUSE_CALL_BOOT(Mouse__Util__TypeConstraints); bool @@ -41,49 +42,33 @@ CODE: OUTPUT: RETVAL -MODULE = Mouse PACKAGE = Mouse::Meta::Module - -BOOT: - INSTALL_SIMPLE_READER_WITH_KEY(Module, name, package); - INSTALL_SIMPLE_READER_WITH_KEY(Module, _method_map, methods); - INSTALL_SIMPLE_READER_WITH_KEY(Module, _attribute_map, attributes); - -HV* -namespace(SV* self) -CODE: -{ - SV* const package = mouse_instance_get_slot(self, mouse_package); - if(!(package && SvOK(package))){ - croak("No package name"); - } - RETVAL = gv_stashsv(package, GV_ADDMULTI); -} -OUTPUT: - RETVAL - CV* -_get_code_ref(SV* self, SV* name) +get_code_ref(SV* package, SV* name) CODE: { - SV* const stash_ref = mcall0(self, mouse_namespace); /* $self->namespace */ HV* stash; HE* he; - if(!(SvROK(stash_ref) && SvTYPE(SvRV(stash_ref)) == SVt_PVHV)){ - croak("namespace() didn't return a HASH reference"); + + if(!SvOK(package)){ + croak("You must define a package name"); + } + if(!SvOK(name)){ + croak("You must define a subroutine name"); + } + + stash = gv_stashsv(package, FALSE); + if(!stash){ + XSRETURN_UNDEF; } - stash = (HV*)SvRV(stash_ref); he = hv_fetch_ent(stash, name, FALSE, 0U); if(he){ GV* const gv = (GV*)hv_iterval(stash, he); - if(isGV(gv)){ - RETVAL = GvCVu(gv); - } - else{ /* special constant or stub */ + if(!isGV(gv)){ /* special constant or stub */ STRLEN len; const char* const pv = SvPV_const(name, len); gv_init(gv, stash, pv, len, GV_ADDMULTI); - RETVAL = GvCVu(gv); } + RETVAL = GvCVu(gv); } else{ RETVAL = NULL; @@ -97,6 +82,26 @@ OUTPUT: RETVAL +MODULE = Mouse PACKAGE = Mouse::Meta::Module + +BOOT: + INSTALL_SIMPLE_READER_WITH_KEY(Module, name, package); + INSTALL_SIMPLE_READER_WITH_KEY(Module, _method_map, methods); + INSTALL_SIMPLE_READER_WITH_KEY(Module, _attribute_map, attributes); + +HV* +namespace(SV* self) +CODE: +{ + SV* const package = mouse_instance_get_slot(aTHX_ self, mouse_package); + if(!(package && SvOK(package))){ + croak("No package name"); + } + RETVAL = gv_stashsv(package, GV_ADDMULTI); +} +OUTPUT: + RETVAL + MODULE = Mouse PACKAGE = Mouse::Meta::Class BOOT: @@ -169,6 +174,9 @@ BOOT: INSTALL_SIMPLE_PREDICATE_WITH_KEY(Attribute, has_builder, builder); INSTALL_SIMPLE_PREDICATE_WITH_KEY(Attribute, has_documentation, documentation); + newCONSTSUB(gv_stashpvs("Mouse::Meta::Attribute", TRUE), "accessor_metaclass", + newSVpvs("Mouse::Meta::Method::Accessor::XS")); + MODULE = Mouse PACKAGE = Mouse::Meta::TypeConstraint BOOT: @@ -181,3 +189,57 @@ BOOT: INSTALL_SIMPLE_PREDICATE_WITH_KEY(TypeConstraint, has_coercion, _compiled_type_coercion); + +MODULE = Mouse PACKAGE = Mouse::Meta::Method::Accessor::XS + +CV* +_generate_accessor(klass, SV* attr, metaclass) +CODE: +{ + RETVAL = mouse_instantiate_xs_accessor(aTHX_ attr, mouse_xs_accessor); +} +OUTPUT: + RETVAL + +CV* +_generate_reader(klass, SV* attr, metaclass) +CODE: +{ + RETVAL = mouse_instantiate_xs_accessor(aTHX_ attr, mouse_xs_reader); +} +OUTPUT: + RETVAL + +CV* +_generate_writer(klass, SV* attr, metaclass) +CODE: +{ + RETVAL = mouse_instantiate_xs_accessor(aTHX_ attr, mouse_xs_writer); +} +OUTPUT: + RETVAL + +CV* +_generate_clearer(klass, SV* attr, metaclass) +CODE: +{ + SV* const slot = mcall0s(attr, "name"); + STRLEN len; + const char* const pv = SvPV_const(slot, len); + RETVAL = mouse_install_simple_accessor(aTHX_ NULL, pv, len, mouse_xs_simple_clearer); +} +OUTPUT: + RETVAL + +CV* +_generate_predicate(klass, SV* attr, metaclass) +CODE: +{ + SV* const slot = mcall0s(attr, "name"); + STRLEN len; + const char* const pv = SvPV_const(slot, len); + RETVAL = mouse_install_simple_accessor(aTHX_ NULL, pv, len, mouse_xs_simple_predicate); +} +OUTPUT: + RETVAL +