commit diffs for review
Matt S Trout [Thu, 16 Oct 2008 10:40:54 +0000 (10:40 +0000)]
generate.diff [new file with mode: 0644]
nuffin.diff [new file with mode: 0644]

diff --git a/generate.diff b/generate.diff
new file mode 100644 (file)
index 0000000..0fbd8b3
--- /dev/null
@@ -0,0 +1,52 @@
+=== t/generate.t
+==================================================================
+--- t/generate.t       (revision 24729)
++++ t/generate.t       (local)
+@@ -2,43 +2,18 @@
+ use warnings;
+ use Test::More;
+-use B::Utils;
+-
+ BEGIN {
+     plan skip_all => "B::Generate required" unless eval { require B::Generate };
+     plan 'no_plan';
+ }
+-sub foo {
+-    B::SVOP->new("const", 0, 42);
++sub foo { 
++    return B::SVOP->new("const", 0, 42);
+ }
+-sub gorch ($) {
+-    my $meth = ( $_[0]->kids )[-1]->sv->object_2svref;
+-    $$meth = "other";
+-    $_[0];
+-}
++use Devel::BeginLift qw(foo);
+-use Devel::BeginLift qw(foo gorch);
+-
+ sub bar { 7 + foo() }
++
+ is( bar(), 49, "optree injected" );
+-sub blah { foo(31) }
+-is(blah(), 42, "optree injected" );;
+-
+-sub meth { 3 }
+-
+-sub other { 42 }
+-
+-__END__
+-
+-my $obj = bless {};
+-sub oink { gorch $obj->meth; }
+-
+-is( oink(), 42, "modify method call");
+-
+-my @args = ( 1 .. 3 );
+-sub ploink { gorch $obj->meth(1, @args); }
+-is( ploink(), 42, "modify method call with args");
+-
diff --git a/nuffin.diff b/nuffin.diff
new file mode 100644 (file)
index 0000000..d1b0c5e
--- /dev/null
@@ -0,0 +1,41 @@
+=== lib/Devel/BeginLift.xs
+==================================================================
+--- lib/Devel/BeginLift.xs     (revision 80093)
++++ lib/Devel/BeginLift.xs     (local)
+@@ -88,6 +88,12 @@
+     op_free(o);
+     if (type == OP_RV2GV)
+       return newGVOP(OP_GV, 0, (GV*)sv);
++
++    if (SvROK(sv) && sv_derived_from(sv, "B::OP")) {
++        /* taken from B's typemap file, T_OP_OBJ */
++        return INT2PTR(OP *,SvIV((SV *)SvRV(sv)));
++    }
++
+     return newSVOP(OP_CONST, 0, sv);
+   } else {
+     /* this bit not lifted, handles the 'sub doesn't return stuff' case
+=== t/generate.t
+==================================================================
+--- t/generate.t       (revision 80093)
++++ t/generate.t       (local)
+@@ -0,0 +1,19 @@
++use strict;
++use warnings;
++use Test::More;
++
++BEGIN {
++    plan skip_all => "B::Generate required" unless eval { require B::Generate };
++    plan 'no_plan';
++}
++
++sub foo { 
++    return B::SVOP->new("const", 0, 42);
++}
++
++use Devel::BeginLift qw(foo);
++
++sub bar { 7 + foo() }
++
++is( bar(), 49, "optree injected" );
++