# New Ticket Created by Cory Spencer
# Please include the string: [perl #61618]
# in the subject line of all future correspondence about this issue.
# <URL: http://rt.perl.org/rt3/Ticket/Display.html?id=61618 >
The attatched patch lets an infinite Range (ie. (1..Inf)) report its
length as Inf.
It also adds temporary !FAIL cases when an infinite range is converted
into a list or string context.
Index: src/classes/Range.pir
===================================================================
--- src/classes/Range.pir (revision 34246)
+++ src/classes/Range.pir (working copy)
@@ -72,7 +72,21 @@
.return ($P0)
.end
+=item elems()
+Returns in the number of elements in the Range.
+
+=cut
+
+.sub 'elems' :method
+ # TODO: Returning a Num for the moment, so Inf gets reported correctly.
+ # TODO: Should be returning an Int.
+ $N0 = self
+
+ .return ($N0)
+.end
+
+
=item from()
=item to()
@@ -114,16 +128,27 @@
=cut
.sub 'list' :method
- .local pmc range_it, result
- range_it = self.'iterator'()
- result = new 'List'
- range_loop:
- unless range_it goto range_end
- $P0 = shift range_it
- push result, $P0
- goto range_loop
- range_end:
- .return (result)
+ .local int test
+ .local pmc it
+ .local pmc rv
+
+ test = self.'!infinite'()
+ if test goto infinite
+
+ it = self.'iterator'()
+ rv = new 'List'
+
+ loop:
+ unless it goto end
+ $P0 = shift it
+ push rv, $P0
+ goto loop
+
+ infinite:
+ rv = '!FAIL'("Can't convert an infinite range to a list (yet)")
+
+ end:
+ .return (rv)
.end
@@ -242,7 +267,6 @@
.return ($I0)
.end
-
=back
=head2 Operators
@@ -381,6 +405,22 @@
.return ($I0)
.end
+.sub '!infinite' :method
+ .local pmc val
+
+ val = self.'from'()
+ if val == "-inf" goto infinite
+
+ val = self.'to'()
+ if val == "inf" goto infinite
+
+ finite:
+ .return (0)
+
+ infinite:
+ .return (1)
+.end
+
=back
=head2 Vtable functions
@@ -396,21 +436,65 @@
=cut
.sub 'VTABLE_get_integer' :method :vtable('get_integer')
+ .local int test
+ .local int rv
+
+ test = self.'!infinite'()
+ if test goto infinite
+
+ finite:
$P0 = self.'list'()
- $I0 = $P0
- .return ($I0)
+ rv = $P0.'elems'()
+ goto done
+
+ infinite:
+ # TODO: This isn't returning the correct value yet, should be Inf but isn't
+ rv = "inf"
+ goto done
+
+ done:
+ .return (rv)
.end
.sub 'VTABLE_get_number' :method :vtable('get_number')
+ .local int test
+ .local num rv
+
+ test = self.'!infinite'()
+ if test goto infinite
+
+ finite:
$P0 = self.'list'()
- $N0 = $P0
- .return ($N0)
+ rv = $P0.'elems'()
+ goto done
+
+ infinite:
+ rv = "inf"
+ goto done
+
+ done:
+ .return (rv)
.end
.sub 'VTABLE_get_string' :method :vtable('get_string')
+ .local int test
+ .local string rv
+
+ rv = ""
+ test = self.'!infinite'()
+ if test goto infinite
+
+ finite:
$P0 = self.'list'()
- $S0 = $P0
- .return ($S0)
+ rv = $P0
+ goto done
+
+ infinite:
+ rv = '!FAIL'("Can't convert an infinite range to a string (yet)")
+ goto done
+
+ done:
+ .return (rv)
.end
=back