[Jifty-commit] r5376 - Runops-Hook/trunk

Jifty commits jifty-commit at lists.jifty.org
Wed May 7 06:38:38 EDT 2008


Author: nothingmuch
Date: Wed May  7 06:38:33 2008
New Revision: 5376

Modified:
   Runops-Hook/trunk/Hook.xs

Log:
don't create an SV for fakeop on every hook

Modified: Runops-Hook/trunk/Hook.xs
==============================================================================
--- Runops-Hook/trunk/Hook.xs	(original)
+++ Runops-Hook/trunk/Hook.xs	Wed May  7 06:38:33 2008
@@ -15,6 +15,9 @@
 static bool Runops_Hook_perl_ignore_ret = 1;
 
 static bool Runops_Hook_loaded_B;
+static GV *Runops_Hook_B_UNOP_stash;
+static UNOP Runops_Hook_fakeop;
+static SV *Runops_Hook_fakeop_sv;
 
 /* this is the modified runloop */
 int runops_hooked(pTHX)
@@ -77,11 +80,12 @@
 	dSP;
 
 	/* fake a B::UNOP that we use as a trampoline to make a B::OP object out of PL_op */
-	UNOP fakeop;
-	fakeop.op_first = op;
+	/* fakeop_sv is created in load_B based on the static struct fakeop's addr */
+	Runops_Hook_fakeop.op_first = op;
 
 	PUSHMARK(SP);
-	XPUSHs(sv_bless(sv_2mortal(newRV(sv_2mortal(newSVuv((UV)&fakeop)))), gv_stashpv("B::UNOP", 0)));
+	/* create the blessed object out of fakeop, and call B::UNOP::first on it */
+	XPUSHs(Runops_Hook_fakeop_sv);
 	PUTBACK;
 
 	call_pv("B::UNOP::first", G_SCALAR);
@@ -175,6 +179,15 @@
 	Runops_Hook_threshold = t;
 }
 
+void
+Runops_Hook_load_B (pTHX) {
+	load_module( PERL_LOADMOD_NOIMPORT, newSVpvs("B"), newSViv(0) );
+
+	Runops_Hook_fakeop_sv = sv_bless(newRV(newSVuv((UV)&Runops_Hook_fakeop)), gv_stashpv("B::UNOP", 0));
+
+	Runops_Hook_loaded_B = 1;
+}
+
 MODULE = Runops::Hook PACKAGE = Runops::Hook
 
 BOOT:
@@ -234,8 +247,7 @@
 	CODE:
 {
 	if (!Runops_Hook_loaded_B) {
-		load_module( PERL_LOADMOD_NOIMPORT, newSVpvs("B"), newSViv(0) );
-		Runops_Hook_loaded_B = 1;
+		Runops_Hook_load_B(aTHX);
 	}
 
 	Runops_Hook_set_perl_hook(aTHX_ hook);


More information about the Jifty-commit mailing list