Make it easier to simple xs hashref readers using prehashed keys.
[gitmo/Class-MOP.git] / mop.c
diff --git a/mop.c b/mop.c
index 08e5349..25358f8 100644 (file)
--- a/mop.c
+++ b/mop.c
@@ -242,3 +242,41 @@ mop_prehash_keys ()
         PERL_HASH(prehashed_keys[i].hash, value, strlen(value));
     }
 }
+
+SV *
+mop_simple_reader (SV *self, mop_prehashed_key_t key)
+{
+    register HE *he;
+
+    if (!SvROK(self)) {
+        croak("can't call %s as a class method", prehashed_keys[key].name);
+    }
+
+    if (SvTYPE(SvRV(self)) != SVt_PVHV) {
+        croak("object is not a hashref");
+    }
+
+    if (!(he = hv_fetch_ent((HV *)SvRV(self), prehashed_keys[key].key, 0, prehashed_keys[key].hash))) {
+        return &PL_sv_undef;
+    }
+
+    return SvREFCNT_inc(HeVAL(he));
+}
+
+XS(mop_xs_simple_reader)
+{
+#ifdef dVAR
+    dVAR; dXSARGS;
+#else
+    dXSARGS;
+#endif
+
+    if (items != 1) {
+        croak("expected exactly one argument");
+    }
+
+    ST(0) = mop_simple_reader (ST(0), CvXSUBANY(cv).any_i32);
+    sv_2mortal(ST(0));
+    XSRETURN(1);
+}
+