[Jifty-commit] r5467 - B-Generate/trunk/lib/B

Jifty commits jifty-commit at lists.jifty.org
Fri May 16 03:15:43 EDT 2008


Author: clkao
Date: Fri May 16 03:15:43 2008
New Revision: 5467

Modified:
   B-Generate/trunk/lib/B/Generate.xs

Log:
provide SVOP_new_svrv which deref the sv so we can associate
for example PVCV with an SVOP.


Modified: B-Generate/trunk/lib/B/Generate.xs
==============================================================================
--- B-Generate/trunk/lib/B/Generate.xs	(original)
+++ B-Generate/trunk/lib/B/Generate.xs	Fri May 16 03:15:43 2008
@@ -394,6 +394,40 @@
     return 0; /* Not reached */
 }
 
+/* svop_new */
+
+SV *__svop_new(pTHX_ SV *class, SV *type, I32 flags, SV *sv)
+{
+    dXSARGS;
+    OP *o;
+    SV *result;
+
+    SV **sparepad = PL_curpad;
+    PL_curpad = AvARRAY(PL_comppad);
+    OP *saveop = PL_op;
+    I32 typenum = op_name_to_num(type); /* XXX More classes here! */
+    if (typenum == OP_GVSV) {
+        if (*(SvPV_nolen(sv)) == '$') 
+            sv = (SV*)gv_fetchpv(SvPVX(sv)+1, TRUE, SVt_PV);
+        else
+            Perl_croak(aTHX_ 
+                       "First character to GVSV was not dollar");
+    } else
+        if (SvTYPE(sv) != SVt_PVCV) {
+            sv = newSVsv(sv); // copy it unless it's cv
+        }
+    o = newSVOP(typenum, flags, SvREFCNT_inc(sv));
+#ifdef PERL_CUSTOM_OPS
+    if (typenum == OP_CUSTOM)
+        o->op_ppaddr = custom_op_ppaddr(SvPV_nolen(type));
+#endif
+    //PL_curpad = sparepad;
+    result = sv_newmortal();
+    sv_setiv(newSVrv(result, "B::SVOP"), PTR2IV(o));
+    PL_op = saveop;
+    return result;
+}
+
 /* Pre-5.7 compatibility */
 #ifndef op_clear
 void op_clear(OP* o) {
@@ -1133,38 +1167,25 @@
         B::SVOP o
 
 void
+SVOP_new_svrv(class, type, flags, sv)
+    SV * class
+    SV * type
+    I32 flags
+    SV * sv
+    CODE:
+        ST(0) = __svop_new(aTHX_ class, type, flags, SvRV(sv));
+
+
+void
 SVOP_new(class, type, flags, sv)
     SV * class
     SV * type
     I32 flags
     SV * sv
-    SV** sparepad = NO_INIT
-    OP *o = NO_INIT
-    OP *saveop = NO_INIT
-    SV* param = NO_INIT
-    I32 typenum = NO_INIT
     CODE:
-        sparepad = PL_curpad;
-        PL_curpad = AvARRAY(PL_comppad);
-        saveop = PL_op;
-        typenum = op_name_to_num(type); /* XXX More classes here! */
-        if (typenum == OP_GVSV) {
-            if (*(SvPV_nolen(sv)) == '$') 
-                param = (SV*)gv_fetchpv(SvPVX(sv)+1, TRUE, SVt_PV);
-            else
-            Perl_croak(aTHX_ 
-            "First character to GVSV was not dollar");
-        } else
-            param = newSVsv(sv);
-        o = newSVOP(typenum, flags, param);
-#ifdef PERL_CUSTOM_OPS
-        if (typenum == OP_CUSTOM)
-            o->op_ppaddr = custom_op_ppaddr(SvPV_nolen(type));
-#endif
-            //PL_curpad = sparepad;
-            ST(0) = sv_newmortal();
-        sv_setiv(newSVrv(ST(0), "B::SVOP"), PTR2IV(o));
-        PL_op = saveop;
+        ST(0) = __svop_new(aTHX_ class, type, flags, sv);
+        
+
 
 #define PADOP_padix(o)  o->op_padix
 #define PADOP_sv(o)     (o->op_padix ? PL_curpad[o->op_padix] : Nullsv)


More information about the Jifty-commit mailing list