From 0dab6d38d596535a09af16a4feba57358ca67849 Mon Sep 17 00:00:00 2001 From: Jesse Luehrs Date: Thu, 7 Jul 2011 02:51:45 -0500 Subject: make this actually lexical --- smartmatch.xs | 47 ++++++++++++++++++++++++++--------------------- 1 file changed, 26 insertions(+), 21 deletions(-) (limited to 'smartmatch.xs') 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); -- cgit v1.2.3-54-g00ecf