X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=mop.h;h=e30510d8ae3c70e6e19b11403746955597e6029a;hb=03a3092d71681931085a2307bf7cade0ed79b66d;hp=444f8acabf14b238aa5614a95c596d9bdf31f5a2;hpb=22932438751f5ca55563fc133b53f464dedbf3de;p=gitmo%2FClass-MOP.git diff --git a/mop.h b/mop.h index 444f8ac..e30510d 100644 --- a/mop.h +++ b/mop.h @@ -10,16 +10,13 @@ #define NEED_sv_2pv_nolen #include "ppport.h" -#define MOP_CALL_BOOT(name) \ - { \ - EXTERN_C XS(name); \ - mop_call_xs(aTHX_ name, cv, mark); \ - } +#define MOP_CALL_BOOT(name) mop_call_xs(aTHX_ name, cv, mark); -void mop_call_xs (pTHX_ void (*subaddr) (pTHX_ CV *), CV *cv, SV **mark); +#ifndef XSPROTO +#define XSPROTO(name) XS(name) +#endif -#define DECLARE_KEY(name) { #name, #name, NULL, 0 } -#define DECLARE_KEY_WITH_VALUE(name, value) { #name, value, NULL, 0 } +void mop_call_xs (pTHX_ XSPROTO(subaddr), CV *cv, SV **mark); typedef enum { KEY_name, @@ -30,6 +27,7 @@ typedef enum { KEY_methods, KEY_VERSION, KEY_ISA, + KEY__version, key_last, } mop_prehashed_key_t; @@ -37,8 +35,17 @@ typedef enum { #define HASH_FOR(name) mop_prehashed_hash_for(KEY_ ##name) void mop_prehash_keys (void); -inline SV *mop_prehashed_key_for (mop_prehashed_key_t key); -inline U32 mop_prehashed_hash_for (mop_prehashed_key_t key); +SV *mop_prehashed_key_for (mop_prehashed_key_t key); +U32 mop_prehashed_hash_for (mop_prehashed_key_t key); + +#define INSTALL_SIMPLE_READER(klass, name) INSTALL_SIMPLE_READER_WITH_KEY(klass, name, name) +#define INSTALL_SIMPLE_READER_WITH_KEY(klass, name, key) \ + { \ + CV *cv = newXS("Class::MOP::" #klass "::" #name, mop_xs_simple_reader, __FILE__); \ + CvXSUBANY(cv).any_i32 = KEY_ ##key; \ + } + +XS(mop_xs_simple_reader); extern SV *mop_method_metaclass; extern SV *mop_associated_metaclass;