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