cvsuser 04/07/05 23:38:14
Modified: classes array.pmc intlist.pmc perlhash.pmc perlstring.pmc
slice.pmc
docs/pmc iterator.pod
ops set.ops
t/pmc iter.t
. vtable.tbl
Log:
Pie-thon 23 - get_iter vtable and iter opcode
Revision Changes Path
1.86 +16 -1 parrot/classes/array.pmc
Index: array.pmc
===================================================================
RCS file: /cvs/public/parrot/classes/array.pmc,v
retrieving revision 1.85
retrieving revision 1.86
diff -u -w -r1.85 -r1.86
--- array.pmc 2 Jul 2004 09:30:00 -0000 1.85
+++ array.pmc 6 Jul 2004 06:38:01 -0000 1.86
@@ -1,6 +1,6 @@
/*
Copyright: 2001-2003 The Perl Foundation. All Rights Reserved.
-$Id: array.pmc,v 1.85 2004/07/02 09:30:00 leo Exp $
+$Id: array.pmc,v 1.86 2004/07/06 06:38:01 leo Exp $
=head1 NAME
@@ -1120,6 +1120,10 @@
Return a new iterator for the slice PMC C<key>
+=item C<PMC* get_iter ()>
+
+Return a new iterator for SELF.
+
=cut
*/
@@ -1130,6 +1134,17 @@
return iter;
}
+ PMC* get_iter () {
+ PMC *iter = pmc_new_init(interpreter, enum_class_Iterator, SELF);
+ PMC *key = pmc_new(interpreter, enum_class_Key);
+ PMC_struct_val(iter) = key;
+ PObj_get_FLAGS(key) |= KEY_integer_FLAG;
+ PMC_int_val(key) = 0;
+ if (!((List *) PMC_data(SELF))->length)
+ PMC_int_val(key) = -1;
+ return iter;
+ }
+
/*
=item C<void visit(visit_info *info)>
1.28 +11 -1 parrot/classes/intlist.pmc
Index: intlist.pmc
===================================================================
RCS file: /cvs/public/parrot/classes/intlist.pmc,v
retrieving revision 1.27
retrieving revision 1.28
diff -u -w -r1.27 -r1.28
--- intlist.pmc 2 Jul 2004 09:30:00 -0000 1.27
+++ intlist.pmc 6 Jul 2004 06:38:01 -0000 1.28
@@ -1,6 +1,6 @@
/*
Copyright: 2001-2003 The Perl Foundation. All Rights Reserved.
-$Id: intlist.pmc,v 1.27 2004/07/02 09:30:00 leo Exp $
+$Id: intlist.pmc,v 1.28 2004/07/06 06:38:01 leo Exp $
=head1 NAME
@@ -223,6 +223,16 @@
return iter;
}
+ PMC* get_iter () {
+ PMC *iter = pmc_new_init(interpreter, enum_class_Iterator, SELF);
+ PMC *key = pmc_new(interpreter, enum_class_Key);
+ PMC_struct_val(iter) = key;
+ PObj_get_FLAGS(key) |= KEY_integer_FLAG;
+ PMC_int_val(key) = 0;
+ if (!((List *) PMC_struct_val(SELF))->length)
+ PMC_int_val(key) = -1;
+ return iter;
+ }
/*
=item C<void multiply_int(INTVAL value, PMC *dest)>
1.79 +13 -1 parrot/classes/perlhash.pmc
Index: perlhash.pmc
===================================================================
RCS file: /cvs/public/parrot/classes/perlhash.pmc,v
retrieving revision 1.78
retrieving revision 1.79
diff -u -w -r1.78 -r1.79
--- perlhash.pmc 4 Jul 2004 13:40:06 -0000 1.78
+++ perlhash.pmc 6 Jul 2004 06:38:01 -0000 1.79
@@ -1,6 +1,6 @@
/*
Copyright: 2001-2003 The Perl Foundation. All Rights Reserved.
-$Id: perlhash.pmc,v 1.78 2004/07/04 13:40:06 leo Exp $
+$Id: perlhash.pmc,v 1.79 2004/07/06 06:38:01 leo Exp $
=head1 NAME
@@ -576,6 +576,18 @@
*/
+ PMC* get_iter () {
+ PMC *iter = pmc_new_init(interpreter, enum_class_Iterator, SELF);
+ PMC *key = pmc_new(interpreter, enum_class_Key);
+ PMC_struct_val(iter) = key;
+ PObj_get_FLAGS(key) |= KEY_integer_FLAG;
+ PMC_int_val(key) = 0;
+ PMC_data(key) = (void *)INITBucketIndex;
+ if (!hash_size(INTERP, PMC_struct_val(SELF)))
+ PMC_int_val(key) = -1;
+ return iter;
+ }
+
PMC* slice (PMC* key) {
return NULL;
}
1.79 +16 -1 parrot/classes/perlstring.pmc
Index: perlstring.pmc
===================================================================
RCS file: /cvs/public/parrot/classes/perlstring.pmc,v
retrieving revision 1.78
retrieving revision 1.79
diff -u -w -r1.78 -r1.79
--- perlstring.pmc 5 Jul 2004 19:57:03 -0000 1.78
+++ perlstring.pmc 6 Jul 2004 06:38:01 -0000 1.79
@@ -1,6 +1,6 @@
/*
Copyright: 2001-2003 The Perl Foundation. All Rights Reserved.
-$Id: perlstring.pmc,v 1.78 2004/07/05 19:57:03 leo Exp $
+$Id: perlstring.pmc,v 1.79 2004/07/06 06:38:01 leo Exp $
=head1 NAME
@@ -663,6 +663,11 @@
Return a new iterator for the slice PMC C<key>
+=item C<PMC* get_iter (PMC *key)>
+
+Return a new iterator for this string.
+
+
=item C<INTVAL elements ()>
Return length of the string.
@@ -682,6 +687,16 @@
return iter;
}
+ PMC* get_iter () {
+ PMC *iter = pmc_new_init(interpreter, enum_class_Iterator, SELF);
+ PMC *key = pmc_new(interpreter, enum_class_Key);
+ PMC_struct_val(iter) = key;
+ PObj_get_FLAGS(key) |= KEY_integer_FLAG;
+ PMC_int_val(key) = 0;
+ if (!string_length(INTERP, PMC_str_val(SELF)))
+ PMC_int_val(key) = -1;
+ return iter;
+ }
/*
1.11 +9 -1 parrot/classes/slice.pmc
Index: slice.pmc
===================================================================
RCS file: /cvs/public/parrot/classes/slice.pmc,v
retrieving revision 1.10
retrieving revision 1.11
diff -u -w -r1.10 -r1.11
--- slice.pmc 2 Jul 2004 10:28:44 -0000 1.10
+++ slice.pmc 6 Jul 2004 06:38:01 -0000 1.11
@@ -1,6 +1,6 @@
/*
Copyright: 2004 The Perl Foundation. All Rights Reserved.
-$Id: slice.pmc,v 1.10 2004/07/02 10:28:44 leo Exp $
+$Id: slice.pmc,v 1.11 2004/07/06 06:38:01 leo Exp $
=head1 NAME
@@ -252,6 +252,8 @@
=item C<PMC* slice(PMC *key)>
+=item C<PMC* get_iter()>
+
A slice can serve as its own iterator, yielding values [start .. end-1].
This is used for implementing Pythons xrange()
@@ -265,6 +267,12 @@
return iter;
}
+ PMC* get_iter() {
+ PMC *iter = pmc_new_init(interpreter, enum_class_Iterator, SELF);
+ PMC_struct_val(iter) = SELF;
+ return iter;
+ }
+
INTVAL elements () {
range_t *r = PMC_struct_val(SELF);
/* only start .. end supported so:
1.3 +6 -0 parrot/docs/pmc/iterator.pod
Index: iterator.pod
===================================================================
RCS file: /cvs/public/parrot/docs/pmc/iterator.pod,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -w -r1.2 -r1.3
--- iterator.pod 6 Mar 2004 14:53:32 -0000 1.2
+++ iterator.pod 6 Jul 2004 06:38:05 -0000 1.3
@@ -20,6 +20,12 @@
...
branch iter_loop
+The two lines of iterator creation can be short written as:
+
+ iter P0, P1 # create new iterator P0 for aggregate P1
+
+This creates a new iterator and resets it.
+
Iterate from the end of the aggregate (Array like classes only):
.include "iterator.pasm"
1.18 +8 -0 parrot/ops/set.ops
Index: set.ops
===================================================================
RCS file: /cvs/public/parrot/ops/set.ops,v
retrieving revision 1.17
retrieving revision 1.18
diff -u -w -r1.17 -r1.18
--- set.ops 17 Jun 2004 11:11:57 -0000 1.17
+++ set.ops 6 Jul 2004 06:38:08 -0000 1.18
@@ -508,6 +508,10 @@
Return a new Iterator PMC $1 for aggregate $2 and Slice PMC $3.
+=item B<iter>(out PMC, in PMC)
+
+Return a new Iterator PMC $1 for aggregate $2.
+
=cut
inline op slice (out PMC, in PMC, in KEY) :base_core {
@@ -515,6 +519,10 @@
goto NEXT();
}
+inline op iter (out PMC, in PMC) :base_core {
+ $1 = $2->vtable->get_iter(interpreter, $2);
+ goto NEXT();
+}
=item B<clone>(out PMC, in PMC)
1.24 +150 -2 parrot/t/pmc/iter.t
Index: iter.t
===================================================================
RCS file: /cvs/public/parrot/t/pmc/iter.t,v
retrieving revision 1.23
retrieving revision 1.24
diff -u -w -r1.23 -r1.24
--- iter.t 2 Jul 2004 12:09:09 -0000 1.23
+++ iter.t 6 Jul 2004 06:38:11 -0000 1.24
@@ -1,6 +1,6 @@
#! perl -w
# Copyright: 2001-2003 The Perl Foundation. All Rights Reserved.
-# $Id: iter.t,v 1.23 2004/07/02 12:09:09 leo Exp $
+# $Id: iter.t,v 1.24 2004/07/06 06:38:11 leo Exp $
=head1 NAME
@@ -16,7 +16,7 @@
=cut
-use Parrot::Test tests => 37;
+use Parrot::Test tests => 42;
use Test::More qw(skip);
output_is(<<'CODE', <<'OUTPUT', "new iter");
@@ -1008,6 +1008,7 @@
11
ok
OUTPUT
+
output_is(<<'CODE', <<'OUTPUT', "xrange iterator");
##PIR##
.sub main
@@ -1223,3 +1224,150 @@
CODE
/10 [0123456789]{10}ok/
OUTPUT
+
+output_is(<<'CODE', <<'OUTPUT', "iter vtable");
+ .include "iterator.pasm"
+ new P0, .PerlArray
+ push P0, 100
+ push P0, 200
+ push P0, 300
+ push P0, 400
+ push P0, 500
+ push P0, 600
+ push P0, 700
+ push P0, 800
+ iter P2, P0
+ print "ok 1\n"
+lp:
+ unless P2, ex
+ shift I0, P2
+ print I0
+ print "\n"
+ branch lp
+ex:
+ print "ok 2\n"
+ end
+CODE
+ok 1
+100
+200
+300
+400
+500
+600
+700
+800
+ok 2
+OUTPUT
+
+output_like(<<'CODE', <<'OUTPUT', "hash fromkeys - xrange get_iter");
+##PIR##
+.sub main @MAIN
+ .include "iterator.pasm"
+ .local pmc hash
+ .local pmc value
+ .local pmc xr
+ xr = new Slice[0 .. 10]
+ .local pmc sl
+ sl = new Iterator, xr
+ hash = new PerlHash
+ null value
+ hash."fromkeys"(sl, value)
+ $I0 = hash
+ print $I0
+ print " "
+ .local pmc Iter
+ Iter = iter hash
+iter_loop:
+ unless Iter, iter_end # while (entries) ...
+ $I0 = shift Iter
+ print $I0
+ goto iter_loop
+iter_end:
+ print "ok\n"
+.end
+CODE
+/10 [0123456789]{10}ok/
+OUTPUT
+
+output_is(<<'CODE', <<OUTPUT, "string iteration with get_iter");
+ .include "iterator.pasm"
+ new P2, .PerlString
+ set P2, "parrot"
+ iter P1, P2
+iter_loop:
+ unless P1, iter_end # while (entries) ...
+ shift S1, P1
+ print S1
+ branch iter_loop
+iter_end:
+ print "\n"
+ print P2
+ print "\n"
+ end
+CODE
+parrot
+parrot
+OUTPUT
+
+output_is(<<'CODE', <<'OUTPUT', "intlist iter vtable");
+ .include "iterator.pasm"
+ new P0, .IntList
+ push P0, 100
+ push P0, 200
+ push P0, 300
+ push P0, 400
+ push P0, 500
+ push P0, 600
+ push P0, 700
+ push P0, 800
+ iter P2, P0
+ print "ok 1\n"
+lp:
+ unless P2, ex
+ shift I0, P2
+ print I0
+ print "\n"
+ branch lp
+ex:
+ print "ok 2\n"
+ end
+CODE
+ok 1
+100
+200
+300
+400
+500
+600
+700
+800
+ok 2
+OUTPUT
+
+output_is(<<'CODE', <<'OUTPUT', "xrange iterator, get_iter");
+##PIR##
+.sub main
+ .include "iterator.pasm"
+ # xrange(10, 14)
+ new P2, .Slice [10 .. 14]
+ P1 = iter P2
+# I0 = P1."len"()
+iter_loop:
+ unless P1, iter_end
+ shift I1, P1
+ print I1
+ print "\n"
+ branch iter_loop
+iter_end:
+ print "ok\n"
+ end
+.end
+CODE
+10
+11
+12
+13
+ok
+OUTPUT
+
1.65 +2 -1 parrot/vtable.tbl
Index: vtable.tbl
===================================================================
RCS file: /cvs/public/parrot/vtable.tbl,v
retrieving revision 1.64
retrieving revision 1.65
diff -u -w -r1.64 -r1.65
--- vtable.tbl 3 Jul 2004 19:49:57 -0000 1.64
+++ vtable.tbl 6 Jul 2004 06:38:14 -0000 1.65
@@ -1,4 +1,4 @@
-# $Id: vtable.tbl,v 1.64 2004/07/03 19:49:57 leo Exp $
+# $Id: vtable.tbl,v 1.65 2004/07/06 06:38:14 leo Exp $
# [MAIN] #default section name
void init()
@@ -255,6 +255,7 @@
PMC* nextkey_keyed(PMC* key, INTVAL what)
PMC* nextkey_keyed_int(INTVAL key, INTVAL what)
PMC* nextkey_keyed_str(STRING* key, INTVAL what)
+PMC* get_iter()
[STRING]
void substr(INTVAL offset, INTVAL length, PMC* dest)