A first step to cooperate Moose.xs (topic/xs-accessor)
[gitmo/Class-MOP.git] / xs / MOP.xs
index 5dfc0cd..438ed4b 100644 (file)
--- a/xs/MOP.xs
+++ b/xs/MOP.xs
@@ -3,6 +3,15 @@
 SV *mop_method_metaclass;
 SV *mop_associated_metaclass;
 SV *mop_wrap;
+SV *mop_methods;
+SV *mop_name;
+SV *mop_body;
+SV *mop_package;
+SV *mop_package_name;
+SV *mop_package_cache_flag;
+
+SV *mop_VERSION;
+SV *mop_ISA;
 
 static bool
 find_method (const char *key, STRLEN keylen, SV *val, void *ud)
@@ -16,25 +25,33 @@ find_method (const char *key, STRLEN keylen, SV *val, void *ud)
 }
 
 EXTERN_C XS(boot_Class__MOP__Package);
-EXTERN_C XS(boot_Class__MOP__Class);
 EXTERN_C XS(boot_Class__MOP__Attribute);
 EXTERN_C XS(boot_Class__MOP__Method);
+EXTERN_C XS(boot_Class__MOP__Instance);
+EXTERN_C XS(boot_Class__MOP__Method__Accessor);
 
 MODULE = Class::MOP   PACKAGE = Class::MOP
 
 PROTOTYPES: DISABLE
 
 BOOT:
-    mop_prehash_keys();
-
-    mop_method_metaclass     = newSVpvs("method_metaclass");
-    mop_wrap                 = newSVpvs("wrap");
-    mop_associated_metaclass = newSVpvs("associated_metaclass");
+    mop_method_metaclass     = MAKE_KEYSV(method_metaclass);
+    mop_wrap                 = MAKE_KEYSV(wrap);
+    mop_associated_metaclass = MAKE_KEYSV(associated_metaclass);
+    mop_methods              = MAKE_KEYSV(methods);
+    mop_name                 = MAKE_KEYSV(name);
+    mop_body                 = MAKE_KEYSV(body);
+    mop_package              = MAKE_KEYSV(package);
+    mop_package_name         = MAKE_KEYSV(package_name);
+    mop_package_cache_flag   = MAKE_KEYSV(_package_cache_flag);
+    mop_VERSION              = MAKE_KEYSV(VERSION);
+    mop_ISA                  = MAKE_KEYSV(ISA);
 
     MOP_CALL_BOOT (boot_Class__MOP__Package);
-    MOP_CALL_BOOT (boot_Class__MOP__Class);
     MOP_CALL_BOOT (boot_Class__MOP__Attribute);
     MOP_CALL_BOOT (boot_Class__MOP__Method);
+    MOP_CALL_BOOT (boot_Class__MOP__Instance);
+    MOP_CALL_BOOT (boot_Class__MOP__Method__Accessor);
 
 # use prototype here to be compatible with get_code_info from Sub::Identify
 void
@@ -45,6 +62,7 @@ get_code_info(coderef)
         char *pkg  = NULL;
         char *name = NULL;
     PPCODE:
+        SvGETMAGIC(coderef);
         if (mop_get_code_info(coderef, &pkg, &name)) {
             EXTEND(SP, 2);
             mPUSHs(newSVpv(pkg, 0));
@@ -61,7 +79,8 @@ is_class_loaded(klass=&PL_sv_undef)
         HV *stash;
         bool found_method = FALSE;
     PPCODE:
-        if (!SvPOK(klass) || !SvCUR(klass)) {
+        SvGETMAGIC(klass);
+        if (!(SvPOKp(klass) && SvCUR(klass))) { /* XXX: SvPOK does not work with magical scalars */
             XSRETURN_NO;
         }
 
@@ -70,8 +89,8 @@ is_class_loaded(klass=&PL_sv_undef)
             XSRETURN_NO;
         }
 
-        if (hv_exists_ent (stash, KEY_FOR(VERSION), HASH_FOR(VERSION))) {
-            HE *version = hv_fetch_ent(stash, KEY_FOR(VERSION), 0, HASH_FOR(VERSION));
+        if (hv_exists_ent (stash, mop_VERSION, 0U)) {
+            HE *version = hv_fetch_ent(stash, mop_VERSION, 0, 0U);
             SV *version_sv;
             if (version && HeVAL(version) && (version_sv = GvSV(HeVAL(version)))) {
                 if (SvROK(version_sv)) {
@@ -87,8 +106,8 @@ is_class_loaded(klass=&PL_sv_undef)
             }
         }
 
-        if (hv_exists_ent (stash, KEY_FOR(ISA), HASH_FOR(ISA))) {
-            HE *isa = hv_fetch_ent(stash, KEY_FOR(ISA), 0, HASH_FOR(ISA));
+        if (hv_exists_ent (stash, mop_ISA, 0U)) {
+            HE *isa = hv_fetch_ent(stash, mop_ISA, 0, 0U);
             if (isa && HeVAL(isa) && GvAV(HeVAL(isa)) && av_len(GvAV(HeVAL(isa))) != -1) {
                 XSRETURN_YES;
             }