[Jifty-commit] r5656 - B-OPCheck

Jifty commits jifty-commit at lists.jifty.org
Sun Aug 3 20:52:40 EDT 2008


Author: nothingmuch
Date: Sun Aug  3 20:52:39 2008
New Revision: 5656

Modified:
   B-OPCheck/OPCheck.xs

Log:
clean up PL_check handling, removing subs on leavescope

Modified: B-OPCheck/OPCheck.xs
==============================================================================
--- B-OPCheck/OPCheck.xs	(original)
+++ B-OPCheck/OPCheck.xs	Sun Aug  3 20:52:39 2008
@@ -179,30 +179,56 @@
 PROTOTYPES: ENABLE
 
 BOOT:
-Newx(PL_check_orig, OP_CUSTOM+1, Perl_check_t);
+Newxz(PL_check_orig, OP_CUSTOM+1, Perl_check_t);
 Newxz(OPCHECK_subs, OP_CUSTOM+1, AV *);
-Copy(PL_check, PL_check_orig, OP_CUSTOM+1, Perl_check_t);
-Runops_Hook_load_B(aTHX);
+Runops_Trace_load_B(aTHX);
 
 void
 enterscope(opname, perlsub)
     SV *opname
     SV *perlsub
+PROTOTYPE: $$
+PREINIT:
     I32 opnum = op_name_to_num(opname);
-PROTOTYPE:
-CODE: 
-    PL_check[opnum] = OPCHECK_ck_subr;
+CODE:
+    if ( !PL_check_orig[opnum] ) {
+        PL_check_orig[opnum] = PL_check[opnum];
+        PL_check[opnum] = OPCHECK_ck_subr;
+    }
+
     if (!OPCHECK_subs[opnum]) {
-        OPCHECK_subs[opnum] = SvREFCNT_inc(newAV());
+        OPCHECK_subs[opnum] = (AV *)SvREFCNT_inc(newAV());
         SvREADONLY_off(OPCHECK_subs[opnum]);
     }
+
     av_push(OPCHECK_subs[opnum], SvREFCNT_inc(perlsub));
 
 void
-leavescope()
-    PROTOTYPE:
-    CODE: 
-        Zero(PL_check, OP_CUSTOM+1, Perl_check_t);
+leavescope(opname, perlsub)
+    SV *opname
+    SV *perlsub
+PROTOTYPE: $$
+PREINIT:
+    AV *av;
+    I32 opnum = op_name_to_num(opname);
+CODE:
+    if (av = OPCHECK_subs[opnum]) {
+        I32 i;
+        for ( i = av_len(av); i >= 0; i-- ) {
+            SV **elem = av_fetch(av, i, 0);;
+            if ( elem && *elem == perlsub ) {
+                av_delete(av, i, G_DISCARD);
+                break;
+            }
+        }
+
+        if ( av_len(av) == -1 ) {
+            SvREFCNT_dec(av);
+            OPCHECK_subs[opnum] = NULL;
+            PL_check[opnum] = PL_check_orig[opnum];
+            PL_check_orig[opnum] = NULL;
+        }
+    }
 
 void
 END()


More information about the Jifty-commit mailing list