Author: jonathan
Date: Wed Aug 20 10:56:46 2008
New Revision: 30388
Modified:
branches/lazyrakudo/languages/perl6/src/classes/List.pir
Log:
[rakudo] Fixes for negative index handling and as yet undefiend elements. This
means we now pass all of 00-parrot again; failing 5 of 01-sanity.
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
10:56:46 2008
@@ -237,9 +237,20 @@
.sub 'get_pmc_keyed_int' :vtable
.param int index
- # Are we evaluated up to this point yet?
.local pmc evaluated
evaluated = getattribute self, "@!evaluated"
+
+ # Handle negative indexes - require us to evaluate the whole list.
+ .local int evaluate_upto
+ if index < 0 goto negative
+ evaluate_upto = index
+ goto try_evaluated
+ negative:
+ evaluate_upto = self.'elems'()
+ goto use_unevaluated
+
+ # Are we evaluated up to this point yet?
+ try_evaluated:
$I0 = elements evaluated
if $I0 <= index goto use_unevaluated
$P0 = evaluated[index]
@@ -247,7 +258,7 @@
# Need to use the unevaluated portion of the list.
use_unevaluated:
- self.'!evaluate_upto'(index)
+ self.'!evaluate_upto'(evaluate_upto)
$P0 = evaluated[index]
.return ($P0)
.end
@@ -317,13 +328,13 @@
evaluated = getattribute self, "@!evaluated"
unevaluated = getattribute self, "@!unevaluated"
have = elements evaluated
- available = elements unevaluated
- if available == 0 goto loop_end
# Loop while we need more values.
loop:
if have > required goto loop_end
.local pmc try
+ available = elements unevaluated
+ if available == 0 goto loop_end
try = unevaluated[0]
$I0 = isa try, 'Range'
if $I0 goto have_iter