Author: jonathan
Date: Mon Mar 31 14:03:48 2008
New Revision: 26675

Modified:
   trunk/languages/perl6/perl6.pir
   trunk/languages/perl6/src/builtins/misc.pir
   trunk/languages/perl6/src/classes/IO.pir

Log:
[rakudo] More work on IO. Now we can iterate over a file handle and $*IN, $*OUT 
and $*ERR are available.

Modified: trunk/languages/perl6/perl6.pir
==============================================================================
--- trunk/languages/perl6/perl6.pir     (original)
+++ trunk/languages/perl6/perl6.pir     Mon Mar 31 14:03:48 2008
@@ -151,6 +151,19 @@
 .sub 'main' :main
     .param pmc args_str
 
+    ##  create $*IN, $*OUT and $*ERR handles
+    .local pmc pio, perl6io, perl6ioclass
+    perl6ioclass = get_hll_global "IO"
+    pio = getstdin
+    perl6io = perl6ioclass.'new'("PIO" => pio)
+    set_hll_global "$IN", perl6io
+    pio = getstdout
+    perl6io = perl6ioclass.'new'("PIO" => pio)
+    set_hll_global "$OUT", perl6io
+    pio = getstderr
+    perl6io = perl6ioclass.'new'("PIO" => pio)
+    set_hll_global "$ERR", perl6io
+
     ##  create @ARGS global.  We could possibly use the args pmc
     ##  coming directly from Parrot, but currently Parrot provides
     ##  it as a ResizableStringArray and we need Undefs for

Modified: trunk/languages/perl6/src/builtins/misc.pir
==============================================================================
--- trunk/languages/perl6/src/builtins/misc.pir (original)
+++ trunk/languages/perl6/src/builtins/misc.pir Mon Mar 31 14:03:48 2008
@@ -6,7 +6,7 @@
 
 =cut
 
-.sub 'prefix:='
+.sub 'prefix:=' :multi(_)
     .param pmc what
     $P0 = iter what
     .return($P0)

Modified: trunk/languages/perl6/src/classes/IO.pir
==============================================================================
--- trunk/languages/perl6/src/classes/IO.pir    (original)
+++ trunk/languages/perl6/src/classes/IO.pir    Mon Mar 31 14:03:48 2008
@@ -17,7 +17,7 @@
 .namespace ['IO']
 
 .sub 'onload' :anon :init :load
-    $P0 = subclass 'Perl6Object', 'IO'
+    $P0 = newclass 'IO'
     addattribute $P0, "$!PIO" # for Parrot IO object
     $P1 = get_hll_global ['Perl6Object'], 'make_proto'
     $P1($P0, 'IO')
@@ -77,29 +77,67 @@
 .end
 
 
-=item get_iter (vtable)
+.namespace
 
-Gets an iterator for this IO handle.
+=back
+
+=head1 EXPORTED MULTI SUBS
+
+=over
+
+=item prefix:=(IO $io)
+
+Gets the iterator for the IO object.
 
 =cut
 
-.sub 'get_iter' :method :vtable
-    .local pmc PIO
-    PIO = getattribute self, "$!PIO"
-    $P0 = iter PIO
+.sub 'prefix:=' :multi('IO')
+    .param pmc io
+    $P0 = get_hll_global 'IOIterator'
+    $P0 = $P0.'new'('IO' => io)
     .return($P0)
 .end
 
 
-=item say
-
+.namespace [ 'IOIterator' ]
 
+=back
 
+=head1 IOIterator
 
-=back
+The IOIterator class implements the I/O iterator.
 
 =cut
 
+.sub 'onload' :anon :init :load
+    $P0 = subclass 'Perl6Object', 'IOIterator'
+    addattribute $P0, "$!IO" # for IO object we iterate over
+    $P1 = get_hll_global ['Perl6Object'], 'make_proto'
+    $P1($P0, 'IOIterator')
+.end
+
+.sub get_bool :method :vtable
+    .local pmc PIO
+    $P0 = getattribute self, "$!IO"
+    PIO = getattribute $P0, "$!PIO"
+    if PIO goto more
+    .return(0)
+more:
+    .return(1)
+.end
+
+.sub shift_pmc :method :vtable
+    .local pmc pio
+    $P0 = getattribute self, "$!IO"
+    pio = getattribute $P0, "$!PIO"
+    $P0 = pio.readline("")
+    .return($P0)
+.end
+
+.sub get_iter :method :vtable
+    .return(self)
+.end
+
 # Local Variables:
 #   mode: pir
 #   fill-column: 100

Reply via email to