~ubuntu-branches/ubuntu/raring/rakudo/raring

« back to all changes in this revision

Viewing changes to src/core/ListIter.pm

  • Committer: Package Import Robot
  • Author(s): Adam Conrad
  • Date: 2012-11-29 01:00:04 UTC
  • mfrom: (7.1.5 raring-proposed)
  • Revision ID: package-import@ubuntu.com-20121129010004-3vmbbb2e53up4u14
Tags: 2012.10-1build1
Rebuild with the current version of the Not Quite Perl compiler.

Show diffs side-by-side

added added

removed removed

Lines of Context:
7
7
    #   has Mu $!rest;         # RPA of elements remaining to be reified
8
8
    #   has $!list;            # List object associated with this iterator
9
9
    
10
 
    method reify($n = 1, :$sink) {
 
10
    method reify($n = 1) {
11
11
        unless nqp::isconcrete($!reified) {
12
12
            my $eager = nqp::p6bool(nqp::istype($n, Whatever));
13
 
            my $flattens = nqp::isconcrete($!list) && $!list.flattens;
 
13
            my $flattens = nqp::p6bool(nqp::isconcrete($!list)) && $!list.flattens;
14
14
            my int $count = $eager
15
15
                ?? 100000
16
16
                !! nqp::unbox_i(nqp::istype($n, Int) ?? $n !! $n.Int);
19
19
            my int $index;
20
20
            pir::perl6_shiftpush__0PPI($rpa, $!rest, nqp::elems($!rest))
21
21
                if nqp::istype($!list, LoL);
22
 
            while $!rest && nqp::islt_i(nqp::elems($rpa), $count) {
 
22
            while $!rest && (nqp::elems($rpa) < $count) {
23
23
                $index = pir::perl6_rpa_find_type__IPPii(
24
24
                                 $!rest, Iterable, 0, $count);
25
25
                $index = pir::perl6_rpa_find_type__IPPii(
26
26
                                 $!rest, Parcel, 0, $index)
27
27
                    if $flattens;
28
28
                pir::perl6_shiftpush__0PPi($rpa, $!rest, $index);
29
 
                if $!rest && nqp::islt_i(nqp::elems($rpa), $count) {
 
29
                if $!rest && (nqp::elems($rpa) < $count) {
30
30
                    $x := nqp::shift($!rest);
31
31
                    if nqp::isconcrete($x) {
32
32
                        (nqp::unshift($!rest, $x); last) if $eager && $x.infinite;
33
33
                        $x := $x.iterator.reify(
34
34
                                  $eager 
35
35
                                    ?? Whatever 
36
 
                                    !! nqp::p6box_i(nqp::sub_i($count,
37
 
                                                               nqp::elems($rpa))))
 
36
                                    !! nqp::p6box_i($count - nqp::elems($rpa)))
38
37
                            if nqp::istype($x, Iterable);
39
38
                        nqp::splice($!rest, nqp::getattr($x, Parcel, '$!storage'), 0, 0);
40
39
                    
45
44
                }
46
45
            }
47
46
            my $reified := nqp::p6parcel($rpa, Any);
48
 
            $reified := $!list.REIFY($reified) if nqp::isconcrete($!list) && !$sink;
49
 
            nqp::push(
50
 
                    nqp::getattr($reified, Parcel, '$!storage'),
51
 
                    nqp::bindattr(self, ListIter, '$!nextiter',
52
 
                                  nqp::p6listiter($!rest, $!list)))
 
47
            nqp::bindattr(self, ListIter, '$!nextiter', nqp::p6listiter($!rest, $!list))
 
48
                if $!rest;
 
49
            $reified := $!list.REIFY($reified, $!nextiter) if nqp::isconcrete($!list);
 
50
            nqp::push( nqp::getattr($reified, Parcel, '$!storage'), $!nextiter)
53
51
                if $!rest;
54
52
            nqp::bindattr(self, ListIter, '$!reified', $reified);
55
 
            # update $!list's nextiter
56
 
            nqp::bindattr($!list, List, '$!nextiter', $!nextiter) if nqp::isconcrete($!list);
57
53
            # free up $!list and $!rest
58
54
            nqp::bindattr(self, ListIter, '$!list', Mu);
59
55
            nqp::bindattr(self, ListIter, '$!rest', Mu);