[Jifty-commit] r5653 - B-OPCheck

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


Author: nothingmuch
Date: Sun Aug  3 20:52:09 2008
New Revision: 5653

Modified:
   B-OPCheck/OPCheck.xs

Log:
sync Runops::Trace B::OP hack

Modified: B-OPCheck/OPCheck.xs
==============================================================================
--- B-OPCheck/OPCheck.xs	(original)
+++ B-OPCheck/OPCheck.xs	Sun Aug  3 20:52:09 2008
@@ -11,51 +11,59 @@
 
 typedef OP* (CPERLscope(*Perl_check_t)) (pTHX_ OP*);
 
-static AV **OPCHECK_subs;
+STATIC AV **OPCHECK_subs;
 Perl_check_t *PL_check_orig;
 
 /* ============================================
    This is from Runops::Hook.  We need to find a way to share c functions
 */
 
-static bool Runops_Hook_loaded_B;
-static GV *Runops_Hook_B_UNOP_stash;
-static UNOP Runops_Hook_fakeop;
-static SV *Runops_Hook_fakeop_sv;
+STATIC int Runops_Trace_loaded_B;
+STATIC CV *Runops_Trace_B_UNOP_first;
+STATIC XSUBADDR_t Runops_Trace_B_UNOP_first_xsub;
+STATIC UNOP Runops_Trace_fakeop;
+STATIC SV *Runops_Trace_fakeop_sv;
+
+STATIC void
+Runops_Trace_load_B (pTHX) {
+    if (!Runops_Trace_loaded_B) {
+        load_module( PERL_LOADMOD_NOIMPORT, newSVpv("B", 0), (SV *)NULL );
 
+        Runops_Trace_B_UNOP_first = get_cv("B::UNOP::first", TRUE);
+        Runops_Trace_B_UNOP_first_xsub = CvXSUB(Runops_Trace_B_UNOP_first);
 
-void
-Runops_Hook_load_B (pTHX) {
-	if (!Runops_Hook_loaded_B) {
-		load_module( PERL_LOADMOD_NOIMPORT, newSVpv("B", 0), newSViv(0) );
-		Runops_Hook_fakeop_sv = sv_bless(newRV_noinc(newSVuv((UV)&Runops_Hook_fakeop)), gv_stashpv("B::UNOP", 0));
-		Runops_Hook_loaded_B = 1;
-	}
+        Runops_Trace_fakeop_sv = sv_bless(newRV_noinc(newSVuv((UV)&Runops_Trace_fakeop)), gv_stashpv("B::UNOP", 0));
+
+        Runops_Trace_loaded_B = 1;
+    }
 }
 
-SV *
-Runops_Hook_op_to_BOP (pTHX_ OP *op) {
-	dSP;
-	/* this assumes Runops_Hook_load_B() has already been called */
+STATIC SV *
+Runops_Trace_op_to_BOP (pTHX_ OP *op) {
+    dSP;
 
-	/* we fake B::UNOP object (fakeop_sv) that points to our static fakeop.
-	 * then we set first_op to the op we want to make an object out of, and
-	 * trampoline into B::UNOP->first so that it creates the B::OP of the
-	 * correct class for us.
-	 * B should really have a way to create an op from a pointer via some
-	 * external API. This sucks monkey balls on olympic levels */
+    /* we fake B::UNOP object (fakeop_sv) that points to our static fakeop.
+     * then we set first_op to the op we want to make an object out of, and
+     * trampoline into B::UNOP->first so that it creates the B::OP of the
+     * correct class for us.
+     * B should really have a way to create an op from a pointer via some
+     * external API. This sucks monkey balls on olympic levels */
 
-	Runops_Hook_fakeop.op_first = op;
+    Runops_Trace_fakeop.op_first = op;
 
-	PUSHMARK(SP);
-	XPUSHs(Runops_Hook_fakeop_sv);
-	PUTBACK;
+    PUSHMARK(SP);
+    XPUSHs(Runops_Trace_fakeop_sv);
+    PUTBACK;
 
-	call_pv("B::UNOP::first", G_SCALAR);
+    /* call_pv("B::UNOP::first", G_SCALAR); */
+    assert(Runops_Trace_loaded_B);
+    assert(Runops_Trace_B_UNOP_first);
+    assert(Runops_Trace_B_UNOP_first_xsub != NULL);
+    (void)Runops_Trace_B_UNOP_first_xsub(aTHX_ Runops_Trace_B_UNOP_first);
 
-	SPAGAIN;
+    SPAGAIN;
 
-	return POPs;
+    return POPs;
 }
 
 /* ============================================


More information about the Jifty-commit mailing list