On Tuesday 11 December 2007 12:35:19 Allison Randal via RT wrote: > Task description: > > Add an opcode 'copy' to src/ops/set.ops. Similar to 'clone'. > > - It takes two PMC arguments > > - It calls VTABLE_morph on $1, and then VTABLE_assign on the two. > > - It needs to call VTABLE_type to get the type of the source PMC to pass > to 'morph' instead of calling $1->vtable->base_type, because the > base_type won't be right for Object PMCs.
Here's a first step. I added a stripped-down version of the code in RT #48467 as a second test, and it fails for me with: set_pmc() not implemented in class 'Num' I tried to debug it, but I have what they call "Stupid Fingers" tonight, and as such can't tell if I need to add assign_pmc() to Class, Object, or PMCProxy, or just go take a nap. Also holophoner lessons. -- c
=== MANIFEST ================================================================== --- MANIFEST (revision 23776) +++ MANIFEST (local) @@ -3262,6 +3262,7 @@ t/op/cc_state.t [] t/op/cmp-nonbranch.t [] t/op/comp.t [] +t/op/copy.t [] t/op/debuginfo.t [] t/op/exceptions.t [] t/op/gc.t [] === src/ops/ops.num ================================================================== --- src/ops/ops.num (revision 23776) +++ src/ops/ops.num (local) @@ -1246,3 +1246,4 @@ stm_wait_ic 1216 stm_abort 1217 stm_depth_i 1218 +copy_p_p 1219 === src/ops/set.ops ================================================================== --- src/ops/set.ops (revision 23776) +++ src/ops/set.ops (local) @@ -514,7 +514,6 @@ goto NEXT(); } - =item B<clone>(out PMC, invar PMC) Makes a copy of the PMC in $2 and puts it in $1. @@ -526,7 +525,6 @@ goto NEXT(); } - =item B<clone>(out PMC, invar PMC, in PMC) Makes a copy of the PMC in $2 and puts it in $1, using the arguments in $3. @@ -538,6 +536,19 @@ goto NEXT(); } +=item B<copy>(inout PMC, invar PMC) + +Morphs the PMC in $1 to the type of the PMC in $2, then assigns $2 to $1. + +=cut + +inline op copy(inout PMC, invar PMC) :base_mem { + INTVAL type = VTABLE_type(interp, $2); + VTABLE_morph(interp, $1, type); + VTABLE_assign_pmc(interp, $1, $2); + goto NEXT(); +} + =back =cut === t/op/copy.t ================================================================== --- t/op/copy.t (revision 23776) +++ t/op/copy.t (local) @@ -0,0 +1,64 @@ +#! parrot +# Copyright (C) 2007, The Perl Foundation. +# $Id: /mirror/trunk/t/op/say.t 20627 2007-08-14T23:50:55.898359Z chromatic $ + +=head1 NAME + +t/op/copy - Testing the copy opcode + +=head1 SYNOPSIS + + % prove t/op/copy.t + +=head1 DESCRIPTION + +Tests various PMCs with copy. + +=cut + +.sub 'main' :main + .include 'include/test_more.pir' + + plan(3) + + test_basic() + test_rt48467() +.end + +.sub 'test_basic' + .local pmc dest + dest = new 'Integer' + dest = 2 + + .local pmc src + src = new 'Float' + src = 1.28 + + dest = copy src + isa_ok( dest, 'Float', 'copy should change type of PMC' ) + is( dest, 1.28, '... and its value' ) +.end + +.sub 'test_rt48467' + .local pmc my_float + my_float = subclass 'Float', 'Num' + + ## my $x = 0; + .local pmc dest + dest = new 'Integer' + dest = 0 + + ## my $y = 3.2; + .local pmc src + src = new 'Num' + src = 3.2 + + ## $x = $y; + dest = copy src + + ## $y++; + inc src + + ## say '$x = ', $x; + is( dest, 3.2, 'copy should make independent copies' ) +.end