diff options
author | Jesse Luehrs <doy@tozt.net> | 2011-07-07 02:51:45 -0500 |
---|---|---|
committer | Jesse Luehrs <doy@tozt.net> | 2011-07-07 02:51:45 -0500 |
commit | 0dab6d38d596535a09af16a4feba57358ca67849 (patch) | |
tree | 4bf86b089fbff872e305a26acd1fe7d609301746 /smartmatch.xs | |
parent | 64e93875cecc7af2d630399eb30fdc2e2cbd27e6 (diff) | |
download | smartmatch-engine-rjbs-0dab6d38d596535a09af16a4feba57358ca67849.tar.gz smartmatch-engine-rjbs-0dab6d38d596535a09af16a4feba57358ca67849.zip |
make this actually lexical
Diffstat (limited to 'smartmatch.xs')
-rw-r--r-- | smartmatch.xs | 47 |
1 files changed, 26 insertions, 21 deletions
diff --git a/smartmatch.xs b/smartmatch.xs index 23a4f17..36d7c51 100644 --- a/smartmatch.xs +++ b/smartmatch.xs @@ -10,6 +10,12 @@ STATIC OP* smartmatch_cb(pTHX_ OP *o, void *user_data) { OP *left, *right, *cb_op, *list, *new; + SV **cb; + + cb = hv_fetchs(GvHV(PL_hintgv), "smartmatch_cb", 0); + if (!cb) { + return o; + } left = cBINOPo->op_first; right = left->op_sibling; @@ -17,7 +23,7 @@ smartmatch_cb(pTHX_ OP *o, void *user_data) o->op_flags &= ~OPf_KIDS; op_free(o); - cb_op = newCVREF(0, newSVOP(OP_CONST, 0, newSVsv(user_data))); + cb_op = newCVREF(0, newSVOP(OP_CONST, 0, newSVsv(*cb))); list = newLISTOP(OP_LIST, 0, left, right); new = newUNOP(OP_ENTERSUB, OPf_STACKED, op_append_elem(OP_LIST, list, cb_op)); @@ -26,22 +32,19 @@ smartmatch_cb(pTHX_ OP *o, void *user_data) } UV -hook_op_check_smartmatch(void *user_data) -{ - return hook_op_check(OP_SMARTMATCH, smartmatch_cb, user_data); -} - -void * -hook_op_check_smartmatch_remove(UV id) +hook_op_check_smartmatch() { - return hook_op_check_remove(OP_SMARTMATCH, id); + return hook_op_check(OP_SMARTMATCH, smartmatch_cb, NULL); } MODULE = smartmatch PACKAGE = smartmatch PROTOTYPES: DISABLE -UV +BOOT: + hook_op_check_smartmatch(); + +void register (cb) SV *cb; CODE: @@ -49,17 +52,19 @@ register (cb) croak("not a coderef"); } - RETVAL = hook_op_check_smartmatch(newSVsv(cb)); - OUTPUT: - RETVAL + PL_hints |= HINT_LOCALIZE_HH; + gv_HVadd(PL_hintgv); -void -unregister (id) - UV id; - PREINIT: - SV *cb; - CODE: - cb = hook_op_check_smartmatch_remove(id); - if (cb) { + SvREFCNT_inc(cb); + if (!hv_stores(GvHV(PL_hintgv), "smartmatch_cb", cb)) { SvREFCNT_dec(cb); + croak("couldn't store the callback"); } + +void +unregister () + CODE: + PL_hints |= HINT_LOCALIZE_HH; + gv_HVadd(PL_hintgv); + + hv_delete(GvHV(PL_hintgv), "smartmatch_cb", 13, G_DISCARD); |