Author: jonathan
Date: Wed Aug 20 09:59:50 2008
New Revision: 30385

Removed:
   branches/lazyrakudo/languages/perl6/src/classes/Iterator.pir
Modified:
   branches/lazyrakudo/MANIFEST
   branches/lazyrakudo/languages/perl6/config/makefiles/root.in
   branches/lazyrakudo/languages/perl6/src/classes/List.pir

Log:
[rakudo] Get rid of Iterator class - just return a clone of the list, and put 
the iterators there. Also gets rid of $!position.

Modified: branches/lazyrakudo/MANIFEST
==============================================================================
--- branches/lazyrakudo/MANIFEST        (original)
+++ branches/lazyrakudo/MANIFEST        Wed Aug 20 09:59:50 2008
@@ -1938,7 +1938,6 @@
 languages/perl6/src/classes/Hash.pir                        [perl6]
 languages/perl6/src/classes/IO.pir                          [perl6]
 languages/perl6/src/classes/Int.pir                         [perl6]
-languages/perl6/src/classes/Iterator.pir                    [perl6]
 languages/perl6/src/classes/Junction.pir                    [perl6]
 languages/perl6/src/classes/List.pir                        [perl6]
 languages/perl6/src/classes/Mapping.pir                     [perl6]

Modified: branches/lazyrakudo/languages/perl6/config/makefiles/root.in
==============================================================================
--- branches/lazyrakudo/languages/perl6/config/makefiles/root.in        
(original)
+++ branches/lazyrakudo/languages/perl6/config/makefiles/root.in        Wed Aug 
20 09:59:50 2008
@@ -57,7 +57,6 @@
   src/classes/Int.pir \
   src/classes/Order.pir \
   src/classes/Complex.pir \
-  src/classes/Iterator.pir \
   src/classes/IO.pir \
   src/classes/List.pir \
   src/classes/Array.pir \

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 
09:59:50 2008
@@ -42,24 +42,164 @@
 .end
 
 
+=item clone()    (vtable method)
+
+Return a clone of this list.  (Clones its elements also.)
+
+=cut
+
+.namespace ['List']
+.sub 'clone' :method
+    .local pmc result, it, evaluated, unevaluated, new_evaluated, 
new_unevaluated
+
+    # Clone evaluated.
+    evaluated = getattribute self, '@!evaluated'
+    new_evaluated = new 'ResizablePMCArray'
+    it = iter evaluated
+  iter_loop_ev:
+    unless it goto iter_end_ev
+    $P0 = shift it
+    $P0 = clone $P0
+    push new_evaluated, $P0
+    goto iter_loop_ev
+  iter_end_ev:
+
+    # Clone unevaluated.
+    unevaluated = getattribute self, '@!unevaluated'
+    new_unevaluated = new 'ResizablePMCArray'
+    it = iter unevaluated
+  iter_loop_u:
+    unless it goto iter_end_u
+    $P0 = shift it
+    $P0 = clone $P0
+    push new_unevaluated, $P0
+    goto iter_loop_u
+  iter_end_u:
+
+    # Build result.
+    $P0 = typeof self
+    result = new $P0
+    setattribute result, '@!evaluated', new_evaluated
+    setattribute result, '@!unevaluated', new_unevaluated
+    .return (result)
+.end
+
+.sub '' :vtable('clone')
+    $P0 = self.'clone'()
+    .return ($P0)
+.end
+
+
 =item C<iterator> (vtable get_iter)
 
 Gets an iterator for the list.
 
 =cut
 
-.namespace ['List']
 .sub 'iterator' :vtable('get_iter')
-    .local pmc new_iter
-    new_iter = new 'Perl6Iterator'
-    setattribute new_iter, "@!list", self
-    $P0 = new 'Int'
-    $P0 = 0
-    setattribute new_iter, "$!position", $P0
-    .return (new_iter)
+    $P0 = self.'clone'()
+    .return ($P0)
 .end
 
 
+=item C<get_bool>
+
+Returns true if there are items in the list.
+
+=cut
+
+.sub 'get_bool' :vtable
+    .local pmc evaluated, unevaluated
+    .local int elems
+
+    # Check evaluated part.
+    evaluated = getattribute self, "@!evaluated"
+    elems = elements evaluated
+    if elems goto true
+
+    # Check unevaluated part; if we just have iterators, we need to make sure
+    # they have values (that is, if we have a list of ten exhausted iterators,
+    # we want to be sure that we return a false value here, since there are no
+    # more values to be obtained).
+  unevaluated_check:
+    unevaluated = getattribute self, "@!unevaluated"
+    elems = elements unevaluated
+    unless elems goto false
+    .local int cur_check
+    cur_check = 0
+  try_loop:
+    $P0 = unevaluated[cur_check]
+    $I0 = isa $P0, 'Perl6Iterator'
+    unless $I0 goto true
+    if $P0 goto true
+    inc cur_check
+    if cur_check >= elems goto false
+    goto try_loop
+
+  true:
+    .return (1)
+  false:
+    .return (0)
+.end
+
+
+=item C<shift_pmc>
+
+Gets the next value when we are iterating the List.
+
+=cut
+
+.sub 'shift_pmc' :vtable
+    .local pmc value
+    .local int elems_available
+say "in shift_pmc"
+    # See if we have anything in the evaluated part.
+    .local pmc evaluated
+    evaluated = getattribute self, "@!evaluated"
+    elems_available = elements evaluated
+    if elems_available == 0 goto use_unevaluated
+
+    # We have things available in the evaluated portion. Get a value, then
+    # increment our position, and we're done.
+    value = shift evaluated
+    .return (value)
+
+    # Here we take values from the unevaluated part of the list.
+  use_unevaluated:
+    .local pmc unevaluated, try
+    unevaluated = getattribute self, "@!unevaluated"
+  try_loop:
+    elems_available = elements unevaluated
+    if elems_available == 0 goto failure
+
+    # See if it's an iterator at the head of the list or not.
+    try = unevaluated[0]
+    $I0 = isa try, 'Perl6Iterator'
+    if $I0 goto get_from_iter
+    
+    # Not an iterator, so just pull this value off the head of the unevaluated
+    # part and hand it back.
+    value = unshift unevaluated
+    .return (value)
+
+    # We have an iterator. Make sure it's not exhausted, and if not get a value
+    # from it. If it is, then we need to remove it and try the next iterator.
+  get_from_iter:
+    unless try goto empty_iter
+    value = shift try
+    .return (value)
+  empty_iter:
+    $P0 = unshift unevaluated
+    goto try_loop
+
+    # If there's no elements available, we fail.
+  failure:
+    value = new 'Undef'
+    .return (value)
+.end
+
+
+
 =item C<list()>
 
 Gets this value in list context (since it is already a List, just returns 
itself).
@@ -71,6 +211,13 @@
 .end
 
 
+=item C<init>
+
+On initilization, create evaluated and unevaluated parts just as normal Parrot
+resizable arrays. This provides our storage.
+
+=cut
+
 .sub 'init' :vtable
     $P0 = new 'ResizablePMCArray'
     setattribute self, "@!unevaluated", $P0
@@ -78,15 +225,6 @@
     setattribute self, "@!evaluated", $P0
 .end
 
-.sub 'does' :vtable
-    .local string check
-    say "called"
-    if check == 'array' goto true
-    .return (0)
-  true:
-    .return (1)
-.end
-
 
 =item get_pmc_keyed (vtable)
 
@@ -248,17 +386,6 @@
 .end
 
 
-.sub '' :vtable('get_bool')
-    # XXX Can be optimized - we just need to know there is an element, not how
-    # many.
-    $I0 = self.'elems'()
-    if $I0 goto true
-    .return (0)
-  true:
-    .return (1)
-.end
-
-
 =back
 
 =head2 Methods added to ResizablePMCArray
@@ -283,10 +410,6 @@
 .end
 
 
-=head2 List methods
-
-=over 4
-
 =item !flatten()
 
 Flatten the invocant, as in list context.  This doesn't make the list eager,
@@ -378,29 +501,6 @@
 ################# Below here to review for lazy conversion. #################
 
 
-=item clone()    (vtable method)
-
-Return a clone of this list.  (Clones its elements also.)
-
-=cut
-
-.namespace ['List']
-.sub 'clone' :vtable :method
-    .local pmc p6meta, result, iter
-    $P0 = typeof self
-    result = new $P0
-    iter = self.'iterator'()
-  iter_loop:
-    unless iter goto iter_end
-    $P0 = shift iter
-    $P0 = clone $P0
-    push result, $P0
-    goto iter_loop
-  iter_end:
-    .return (result)
-.end
-
-
 =item get_string()    (vtable method)
 
 Return the elements of the list joined by spaces.

Reply via email to