Cleanup XS
Fuji, Goro [Wed, 29 Sep 2010 03:39:33 +0000 (12:39 +0900)]
mouse.h
xs-src/Mouse.xs
xs-src/MouseAccessor.xs

diff --git a/mouse.h b/mouse.h
index 0ce6916..ff5edf8 100644 (file)
--- a/mouse.h
+++ b/mouse.h
@@ -19,7 +19,6 @@ AV* mouse_mro_get_linear_isa(pTHX_ HV* const stash);
 #endif /* mro_get_package_gen */
 
 extern SV* mouse_package;
-extern SV* mouse_namespace;
 extern SV* mouse_methods;
 extern SV* mouse_name;
 extern SV* mouse_coerce;
@@ -244,6 +243,7 @@ enum mouse_xa_flags_t{
     MOUSEf_MOUSE_MASK           = 0xFFFF /* not used */
 };
 
-
+/* Mouse::Meta::Class stuff */
+HV* mouse_get_namespace(pTHX_ SV* const meta); /* $meta->namespace */
 #endif /* !MOUSE_H */
 
index b8951c1..db1365d 100644 (file)
@@ -49,6 +49,15 @@ enum mouse_modifier_t {
 
 static MGVTBL mouse_xc_vtbl; /* for identity */
 
+HV*
+mouse_get_namespace(pTHX_ SV* const meta) {
+    SV* const package = get_slot(meta, mouse_package);
+    if(!(package && SvOK(package))){
+        croak("No package name defined for metaclass");
+    }
+    return gv_stashsv(package, GV_ADDMULTI);
+}
+
 static AV*
 mouse_calculate_all_attributes(pTHX_ SV* const metaclass) {
     SV* const avref = mcall0s(metaclass, "_calculate_all_attributes");
@@ -151,21 +160,18 @@ mouse_get_xc(pTHX_ SV* const metaclass) {
 
     mg = mouse_mg_find(aTHX_ SvRV(metaclass), &mouse_xc_vtbl, 0x00);
     if(!mg){
-        SV* const package = get_slot(metaclass, mouse_package);
-        STRLEN len;
-        const char* const pv = SvPV_const(package, len);
-
-        stash = gv_stashpvn(pv, len, TRUE);
+        /* cache stash for performance */
+        stash = mouse_get_namespace(aTHX_ metaclass);
         xc    = newAV();
 
-        mg = sv_magicext(SvRV(metaclass), (SV*)xc, PERL_MAGIC_ext, &mouse_xc_vtbl, pv, len);
+        mg = sv_magicext(SvRV(metaclass), (SV*)xc, PERL_MAGIC_ext,
+            &mouse_xc_vtbl, NULL, 0);
         SvREFCNT_dec(xc); /* refcnt++ in sv_magicext */
 
         av_extend(xc, MOUSE_XC_last - 1);
 
         av_store(xc, MOUSE_XC_GEN, newSVuv(0U));
         av_store(xc, MOUSE_XC_STASH, (SV*)stash);
-
         SvREFCNT_inc_simple_void_NN(stash);
     }
     else{
@@ -464,11 +470,7 @@ HV*
 namespace(SV* self)
 CODE:
 {
-    SV* const package = get_slot(self, mouse_package);
-    if(!(package && SvOK(package))){
-        croak("No package name defined");
-    }
-    RETVAL = gv_stashsv(package, GV_ADDMULTI);
+    RETVAL = mouse_get_namespace(aTHX_ self);
 }
 OUTPUT:
     RETVAL
@@ -539,14 +541,12 @@ void
 linearized_isa(SV* self)
 PPCODE:
 {
-    SV* const stash_ref = mcall0(self, mouse_namespace); /* $self->namespace */
-    AV* linearized_isa;
+    /* MOUSE_xc_stash() is not available because the xc system depends on
+       linearized_isa() */
+    HV* const stash          = mouse_get_namespace(aTHX_ self);
+    AV* const linearized_isa = mro_get_linear_isa(stash);
     I32 len;
     I32 i;
-    if(!(SvROK(stash_ref) && SvTYPE(SvRV(stash_ref)) == SVt_PVHV)){
-        croak("namespace() didn't return a HASH reference");
-    }
-    linearized_isa = mro_get_linear_isa((HV*)SvRV(stash_ref));
     len = AvFILLp(linearized_isa) + 1;
     EXTEND(SP, len);
     for(i = 0; i < len; i++){
index 0d0d448..3df9fda 100644 (file)
@@ -342,7 +342,6 @@ XS(XS_Mouse_inheritable_class_accessor) {
     dMOUSE_self;
     SV* const slot = MOUSE_mg_slot((MAGIC*)XSANY.any_ptr);
     SV* value;
-    SV* stash_ref;
     HV* stash;
 
     if(items == 1){ /* reader */
@@ -357,11 +356,7 @@ XS(XS_Mouse_inheritable_class_accessor) {
         value = NULL; /* -Wuninitialized */
     }
 
-    stash_ref= mcall0(self, mouse_namespace);
-    if(!(SvROK(stash_ref) && SvTYPE(SvRV(stash_ref)) == SVt_PVHV)) {
-        croak("namespace() didn't return a HASH reference");
-    }
-    stash = (HV*)SvRV(stash_ref);
+    stash = mouse_get_namespace(aTHX_ self);
 
     if(!value) { /* reader */
         value = get_slot(self, slot);