# 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

Reply via email to