From 12112fb121f8ae67d5fd151f528dce18a6dd6b7a Mon Sep 17 00:00:00 2001 From: Stefan O'Rear Date: Sat, 9 Oct 2010 23:02:35 -0700 Subject: [PATCH] Remove last CLR dependencies from setting --- lib/SAFE.setting | 36 ++++++++++++++---------------------- src/CgOp.pm | 1 + src/Sig.pm | 10 ++++------ 3 files changed, 19 insertions(+), 28 deletions(-) diff --git a/lib/SAFE.setting b/lib/SAFE.setting index 9da031ab..9f28e10f 100644 --- a/lib/SAFE.setting +++ b/lib/SAFE.setting @@ -304,9 +304,9 @@ my class List is Cool { (letn selfo (@ {self}) new (obj_newblank (obj_llhow (l selfo))) (setslot flat (l new) (getslot flat bool (l selfo))) - (setslot items (l new) (rawnew vvarlist + (setslot items (l new) (vvarlist_clone (getslot items vvarlist (l selfo)))) - (setslot rest (l new) (rawnew vvarlist + (setslot rest (l new) (vvarlist_clone (getslot rest vvarlist (l selfo)))) (newrwlistvar (l new))) } } @@ -520,31 +520,23 @@ my class Pair is Enum { } # }}} # List utilities {{{ -sub postcircumfix:<[ ]> is rawcall { - my $index ::= Q:CgOp { (pos 1) }; - - (Q:CgOp { (pos 0) }).defined - ?? (Q:CgOp { (pos 0) }).at-pos($index) +sub postcircumfix:<[ ]>(\$container, $index) { # TODO: is rwtrans + $container.defined + ?? $container.at-pos($index) !! Any!Any::butWHENCE(sub () is rawcall { - my $ar := Q:CgOp { (getindex (int 0) (getfield pos - (getfield outer (callframe)))) }; - $ar.defined && die("Autovivification collision"); - $ar = Array.new; - $ar!Array::extend($index, Q:CgOp { (pos 0) }); + $container.defined && die("Autovivification collision"); + $container = Array.new; + $container!Array::extend($index, Q:CgOp { (pos 0) }); }); } -sub postcircumfix:<{ }> is rawcall { - my $key ::= Q:CgOp { (pos 1) }; - - (Q:CgOp { (pos 0) }).defined - ?? (Q:CgOp { (pos 0) }).at-key($key) +sub postcircumfix:<{ }>(\$container, $key) { + $container.defined + ?? $container.at-key($key) !! Any!Any::butWHENCE(sub () is rawcall { - my $ar := Q:CgOp { (getindex (int 0) (getfield pos - (getfield outer (callframe)))) }; - $ar.defined && die("Autovivification collision"); - $ar = Hash.new; - $ar!Hash::extend($key, Q:CgOp { (pos 0) }); + $container.defined && die("Autovivification collision"); + $container = Hash.new; + $container!Hash::extend($key, Q:CgOp { (pos 0) }); }); } diff --git a/src/CgOp.pm b/src/CgOp.pm index 83f90d07..52a89209 100644 --- a/src/CgOp.pm +++ b/src/CgOp.pm @@ -178,6 +178,7 @@ use warnings; sub fvarlist_item { getindex($_[0], $_[1]) } sub vvarlist_from_fvarlist { rawnew('vvarlist', $_[0]) } + sub vvarlist_clone { rawnew('vvarlist', $_[0]) } sub vvarlist_new_empty { rawnew('vvarlist') } sub vvarlist_shift { rawcall($_[0], 'Shift') } sub vvarlist_pop { rawcall($_[0], 'Pop') } diff --git a/src/Sig.pm b/src/Sig.pm index c96112bc..7f445eb4 100644 --- a/src/Sig.pm +++ b/src/Sig.pm @@ -123,9 +123,8 @@ use 5.010; $self->single_get($body); if (defined $self->slot) { - return CgOp::scopedlex($self->slot, - CgOp::newboundvar($self->readonly && !$self->rwtrans, - $self->list, $get)); + return CgOp::scopedlex($self->slot, $self->rwtrans ? $get : + CgOp::newboundvar($self->readonly, $self->list, $get)); } else { return CgOp::sink($get); } @@ -139,9 +138,8 @@ use 5.010; $self->single_get_inline($body, $posr); if (defined $self->slot) { - return CgOp::scopedlex($self->slot, - CgOp::newboundvar($self->readonly && !$self->rwtrans, - $self->list, $get)); + return CgOp::scopedlex($self->slot, $self->rwtrans ? $get : + CgOp::newboundvar($self->readonly, $self->list, $get)); } else { return CgOp::sink($get); }