cvsuser 04/06/24 09:49:04
Modified: classes perlhash.pmc slice.pmc
t/pmc iter.t
Log:
slices 11 - xrange() for Python
Revision Changes Path
1.73 +13 -1 parrot/classes/perlhash.pmc
Index: perlhash.pmc
===================================================================
RCS file: /cvs/public/parrot/classes/perlhash.pmc,v
retrieving revision 1.72
retrieving revision 1.73
diff -u -w -r1.72 -r1.73
--- perlhash.pmc 18 Jun 2004 12:05:59 -0000 1.72
+++ perlhash.pmc 24 Jun 2004 16:48:59 -0000 1.73
@@ -1,6 +1,6 @@
/*
Copyright: 2001-2003 The Perl Foundation. All Rights Reserved.
-$Id: perlhash.pmc,v 1.72 2004/06/18 12:05:59 leo Exp $
+$Id: perlhash.pmc,v 1.73 2004/06/24 16:48:59 leo Exp $
=head1 NAME
@@ -16,12 +16,24 @@
=over 4
+=item C<static void
+fromkeys(Interp *interpreter, PMC *self, PMC *keys, PMC *value)>
+
+Fill the hash with keys from the aggregate keys and with the
+optional value. If value isn't given, a None object is filled
+in as value.
+
=cut
*/
#include "parrot/parrot.h"
+static void
+fromkeys(Interp *interpreter, PMC *self, PMC *keys, PMC *value)
+{
+}
+
static PMC* undef = NULL;
STRING * hash_get_idx(Interp *interpreter, Hash *hash, PMC *key);
1.6 +49 -5 parrot/classes/slice.pmc
Index: slice.pmc
===================================================================
RCS file: /cvs/public/parrot/classes/slice.pmc,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -w -r1.5 -r1.6
--- slice.pmc 18 Jun 2004 15:14:44 -0000 1.5
+++ slice.pmc 24 Jun 2004 16:48:59 -0000 1.6
@@ -1,6 +1,6 @@
/*
Copyright: 2004 The Perl Foundation. All Rights Reserved.
-$Id: slice.pmc,v 1.5 2004/06/18 15:14:44 leo Exp $
+$Id: slice.pmc,v 1.6 2004/06/24 16:48:59 leo Exp $
=head1 NAME
@@ -36,6 +36,7 @@
#include "parrot/parrot.h"
+
/*
* set the Slice iter state to initial, first position
* no backwards iterations for now
@@ -105,6 +106,8 @@
/* first range is ".. end" */
cur = (INTVAL)PMC_struct_val(self);
end = key_integer(interpreter, range);
+ if (agg->vtable->base_type == enum_class_Slice)
+ --end;
if (cur < end) {
++cur;
PMC_struct_val(self) = (void *)cur;
@@ -136,6 +139,8 @@
internal_exception(1, "No end range found");
cur = (INTVAL)PMC_struct_val(self);
end = key_integer(interpreter, end_range);
+ if (agg->vtable->base_type == enum_class_Slice)
+ --end;
if (cur < end) {
++cur;
PMC_struct_val(self) = (void *)cur;
@@ -256,6 +261,37 @@
/*
+=item C<PMC* slice(PMC *key)>
+
+A slice can serve as its own iterator, yielding values [start .. end-1].
+This is used for implementing Pythons xrange()
+
+=cut
+
+*/
+
+ PMC* slice(PMC *key) {
+ PMC *iter = pmc_new_init(interpreter, enum_class_Iterator, SELF);
+ PMC_struct_val(iter) = key;
+ return iter;
+ }
+
+ INTVAL elements () {
+ /* only start .. end supported so:
+ * TODO check flags somewhere
+ * */
+ PMC* range = PMC_pmc_val(SELF);
+ PMC *end = PMC_data(range);
+ INTVAL n = PMC_int_val(end) - PMC_int_val(range);
+ return n;
+ }
+
+ INTVAL get_integer_keyed(PMC* key) {
+ return VTABLE_get_integer(INTERP, key);
+ }
+
+/*
+
=item C<PMC* nextkey_keyed (PMC* agg, INTVAL what)>
Prepate slice PMC SELF for iteration over the passed aggregate or
@@ -266,6 +302,15 @@
*/
PMC* nextkey_keyed (PMC* agg, INTVAL what) {
PMC *ret = SELF;
+ if (agg->vtable->base_type == enum_class_Slice) {
+ /* xrange implementation - the slice PMC
+ * itself serves as the aggregate. We
+ * are called with params swapped then
+ */
+ PMC *temp = SELF;
+ SELF = ret = agg;
+ agg = temp;
+ }
switch (what) {
case ITERATE_FROM_START:
@@ -278,7 +323,6 @@
* PMC, because it's marked being a Key PMC
*/
ret = pmc_new(INTERP, enum_class_Slice);
- PObj_get_FLAGS(ret) &= ~KEY_type_FLAGS;
PObj_get_FLAGS(ret) |= KEY_pmc_FLAG;
PMC_data(ret) = NULL;
1.19 +57 -2 parrot/t/pmc/iter.t
Index: iter.t
===================================================================
RCS file: /cvs/public/parrot/t/pmc/iter.t,v
retrieving revision 1.18
retrieving revision 1.19
diff -u -w -r1.18 -r1.19
--- iter.t 18 Jun 2004 15:15:00 -0000 1.18
+++ iter.t 24 Jun 2004 16:49:04 -0000 1.19
@@ -1,6 +1,6 @@
#! perl -w
# Copyright: 2001-2003 The Perl Foundation. All Rights Reserved.
-# $Id: iter.t,v 1.18 2004/06/18 15:15:00 leo Exp $
+# $Id: iter.t,v 1.19 2004/06/24 16:49:04 leo Exp $
=head1 NAME
@@ -16,7 +16,7 @@
=cut
-use Parrot::Test tests => 29;
+use Parrot::Test tests => 31;
use Test::More qw(skip);
output_is(<<'CODE', <<'OUTPUT', "new iter");
@@ -982,3 +982,58 @@
11
ok
OUTPUT
+output_is(<<'CODE', <<'OUTPUT', "xrange iterator");
+##PIR##
+.sub main
+ .include "iterator.pasm"
+ # xrange(10, 14)
+ new P2, .Slice
+ slice P1, P2[10 .. 14]
+
+ set P1, .ITERATE_FROM_START
+# 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
+
+output_is(<<'CODE', <<'OUTPUT', "xrange iterator ..n");
+##PIR##
+.sub main
+ .include "iterator.pasm"
+ # xrange(4)
+ new P2, .Slice
+ slice P1, P2[ .. 4]
+
+ set P1, .ITERATE_FROM_START
+# 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
+0
+1
+2
+3
+ok
+OUTPUT