Author: jonathan
Date: Wed Aug 20 13:15:13 2008
New Revision: 30394
Modified:
branches/lazyrakudo/languages/perl6/src/classes/Array.pir
branches/lazyrakudo/languages/perl6/src/classes/List.pir
branches/lazyrakudo/languages/perl6/src/classes/Range.pir
branches/lazyrakudo/languages/perl6/src/classes/Str.pir
Log:
[rakudo] Get the lazy lists implementation to now pass all of the sanity tests,
with a variety of small fixes.
Modified: branches/lazyrakudo/languages/perl6/src/classes/Array.pir
==============================================================================
--- branches/lazyrakudo/languages/perl6/src/classes/Array.pir (original)
+++ branches/lazyrakudo/languages/perl6/src/classes/Array.pir Wed Aug 20
13:15:13 2008
@@ -238,8 +238,54 @@
.end
+=item pop()
+
+Remove the last item from the array and return it.
+
+=cut
+
+.sub 'pop' :method :multi(Perl6Array)
+ # Need to have the array fully evaluated first.
+ $I0 = self.'elems'()
+ if $I0 == 0 goto empty
+ dec $I0
+ self.'!evaluate_upto'($I0)
+
+ # Then pop from end of evaluated list - we should be fully evaluated now.
+ .local pmc evaluated, x
+ evaluated = getattribute self, '@!evaluated'
+ x = pop evaluated
+ goto done
+ empty:
+ x = new 'Failure'
+ done:
+ .return (x)
+.end
+
+.sub '' :vtable('pop_pmc')
+ $P0 = self.'pop'()
+ .return ($P0)
+.end
+
+.sub '' :vtable('pop_string')
+ $S0 = self.'pop'()
+ .return ($S0)
+.end
+
+.sub '' :vtable('pop_integer')
+ $I0 = self.'pop'()
+ .return ($I0)
+.end
+
+.sub '' :vtable('pop_float')
+ $N0 = self.'pop'()
+ .return ($N0)
+.end
+
+
############### Below here still to review after lazy changes. ###############
+
=item delete(indices :slurpy)
Delete the elements specified by C<indices> from the array
@@ -301,24 +347,6 @@
.end
-=item pop()
-
-Remove the last item from the array and return it.
-
-=cut
-
-.sub 'pop' :method :multi(Perl6Array)
- .local pmc x
- unless self goto empty
- x = pop self
- goto done
- empty:
- x = new 'Failure'
- done:
- .return (x)
-.end
-
-
=item values()
Return the values of the Array as a List.
Modified: branches/lazyrakudo/languages/perl6/src/classes/List.pir
==============================================================================
--- branches/lazyrakudo/languages/perl6/src/classes/List.pir (original)
+++ branches/lazyrakudo/languages/perl6/src/classes/List.pir Wed Aug 20
13:15:13 2008
@@ -352,7 +352,7 @@
goto loop
iter_no_values:
- try = unshift unevaluated
+ try = shift unevaluated
goto loop
loop_end:
.end
@@ -435,6 +435,20 @@
.end
+=item clone()
+
+Clones the ResizablePMCArray will all its elements. Actually returns it as
+an Array.
+
+=cut
+
+.sub 'clone' :method
+ $P0 = new 'Perl6Array'
+ setattribute $P0, '@!unevaluated', self
+ .return ($P0)
+.end
+
+
=item !flatten()
Flatten the invocant, as in list context. This doesn't make the list eager,
Modified: branches/lazyrakudo/languages/perl6/src/classes/Range.pir
==============================================================================
--- branches/lazyrakudo/languages/perl6/src/classes/Range.pir (original)
+++ branches/lazyrakudo/languages/perl6/src/classes/Range.pir Wed Aug 20
13:15:13 2008
@@ -208,7 +208,7 @@
=cut
-.sub 'shift' :method :vtable('shift_pmc')
+.sub 'shift' :method
.local pmc from, fromexc, value
from = getattribute self, '$!from'
fromexc = getattribute self, '$!from_exclusive'
@@ -223,6 +223,26 @@
.return (value)
.end
+.sub '' :vtable('shift_pmc')
+ $P0 = self.'shift'()
+ .return ($P0)
+.end
+
+.sub '' :vtable('shift_string')
+ $S0 = self.'shift'()
+ .return ($S0)
+.end
+
+.sub '' :vtable('shift_integer')
+ $I0 = self.'shift'()
+ .return ($I0)
+.end
+
+.sub '' :vtable('shift_float')
+ $N0 = self.'shift'()
+ .return ($N0)
+.end
+
=item true()
Modified: branches/lazyrakudo/languages/perl6/src/classes/Str.pir
==============================================================================
--- branches/lazyrakudo/languages/perl6/src/classes/Str.pir (original)
+++ branches/lazyrakudo/languages/perl6/src/classes/Str.pir Wed Aug 20
13:15:13 2008
@@ -55,7 +55,7 @@
.local int len
.local int i
- retv = new 'List'
+ retv = new 'Perl6Array'
objst = self
split pieces, delim, objst