From 45b736dd4b6d43dce64830da8cf1c146b1784380 Mon Sep 17 00:00:00 2001 From: Stefan O'Rear Date: Fri, 6 Aug 2010 22:11:58 -0700 Subject: [PATCH] Implement proper autovivifying array access --- SAFE.setting | 5 +++-- test2.pl | 17 +++++++++++++++++ 2 files changed, 20 insertions(+), 2 deletions(-) diff --git a/SAFE.setting b/SAFE.setting index a2715792..33293fb2 100644 --- a/SAFE.setting +++ b/SAFE.setting @@ -348,9 +348,10 @@ sub infix:<~~>($t,$m) { ($m.defined) ?? ($m.ACCEPTS($t)) !! ($t.^does($m)) } # TODO: Implement 'augment' PRE-INIT { - Mu.HOW.add-method("defined", anon method defined() { + # rawcall to avoid putting a rw binding on self... TODO + Mu.HOW.add-method("defined", anon method defined is rawcall { Q:CgOp { (box Bool (!= (null Dictionary) - (getfield slots (cast DynObject (@ (l self)))))) } + (getfield slots (cast DynObject (@ (pos 0)))))) } }); Mu.HOW.add-method("Bool", anon method Bool() { self.defined }); Mu.HOW.add-method("Str", anon method Str() { diff --git a/test2.pl b/test2.pl index 5f86950a..a85cdaba 100644 --- a/test2.pl +++ b/test2.pl @@ -58,4 +58,21 @@ sub postcircumfix:<[ ]> is rawcall { my @arr = ; is @arr.join("|"), 'a|b|c', "word splitter works"; +my @narr; +@narr[0]; +ok +@narr == 0, "rvalue reference to out of range value does not add"; +@narr[2] = 5; +ok +@narr == 3, "assigning to element 2 makes length 3"; +ok !(@narr[0].defined), "first element undefined"; +ok !(@narr[1].defined), "second element undefined"; +ok @narr[2] == 5, "third element properly assigned"; + +my @darr; +@darr[1][1]; +ok +@darr == 0, "rvalue nested reference, no effect"; +@darr[2][2] = 'pie'; +ok +@darr == 3, "outer level vivifies elements"; +ok @darr[2] ~~ Array, "inner Array created"; +is @darr[2][2], 'pie', "inner value retained"; + done-testing;