cvsuser 04/07/09 08:24:35
Modified: classes array.pmc intlist.pmc perlhash.pmc perlstring.pmc
slice.pmc
include/parrot interpreter.h
languages/python pie-thon.pl
languages/python/t/basic 03_types.t
ops set.ops
src py_func.c
. vtable.tbl
Log:
Pie-thon 43 - slices for arrays and strings
* slice Px, Pagg [ 0 .. 2], 1 returns a python short_slice
* definitely needs some cleanup
Revision Changes Path
1.87 +19 -7 parrot/classes/array.pmc
Index: array.pmc
===================================================================
RCS file: /cvs/public/parrot/classes/array.pmc,v
retrieving revision 1.86
retrieving revision 1.87
diff -u -w -r1.86 -r1.87
--- array.pmc 6 Jul 2004 06:38:01 -0000 1.86
+++ array.pmc 9 Jul 2004 15:24:10 -0000 1.87
@@ -1,6 +1,6 @@
/*
Copyright: 2001-2003 The Perl Foundation. All Rights Reserved.
-$Id: array.pmc,v 1.86 2004/07/06 06:38:01 leo Exp $
+$Id: array.pmc,v 1.87 2004/07/09 15:24:10 leo Exp $
=head1 NAME
@@ -1116,9 +1116,11 @@
/*
-=item C<PMC* slice (PMC *key)>
+=item C<PMC* slice (PMC *key, INTVAL f)>
-Return a new iterator for the slice PMC C<key>
+Return a new iterator for the slice PMC C<key> if f == 0.
+
+Return a new pythonic array slice if f == 1.
=item C<PMC* get_iter ()>
@@ -1128,11 +1130,21 @@
*/
- PMC* slice (PMC* key) {
- PMC *iter = pmc_new_init(interpreter, enum_class_Iterator, SELF);
+ PMC* slice (PMC* key, INTVAL f) {
+ switch (f) {
+ case 0:
+ {
+ PMC *iter = pmc_new_init(interpreter,
+ enum_class_Iterator, SELF);
PMC_struct_val(iter) = key;
return iter;
}
+ case 1:
+ return Parrot_py_get_slice(INTERP, SELF, key);
+ }
+ internal_exception(1, "Array: Unknown slice type");
+ return NULL;
+ }
PMC* get_iter () {
PMC *iter = pmc_new_init(interpreter, enum_class_Iterator, SELF);
1.29 +15 -5 parrot/classes/intlist.pmc
Index: intlist.pmc
===================================================================
RCS file: /cvs/public/parrot/classes/intlist.pmc,v
retrieving revision 1.28
retrieving revision 1.29
diff -u -w -r1.28 -r1.29
--- intlist.pmc 6 Jul 2004 06:38:01 -0000 1.28
+++ intlist.pmc 9 Jul 2004 15:24:10 -0000 1.29
@@ -1,6 +1,6 @@
/*
Copyright: 2001-2003 The Perl Foundation. All Rights Reserved.
-$Id: intlist.pmc,v 1.28 2004/07/06 06:38:01 leo Exp $
+$Id: intlist.pmc,v 1.29 2004/07/09 15:24:10 leo Exp $
=head1 NAME
@@ -217,11 +217,21 @@
offset, count);
}
- PMC* slice (PMC* key) {
- PMC *iter = pmc_new_init(interpreter, enum_class_Iterator, SELF);
+ PMC* slice (PMC* key, INTVAL f) {
+ switch (f) {
+ case 0:
+ {
+ PMC *iter = pmc_new_init(interpreter,
+ enum_class_Iterator, SELF);
PMC_struct_val(iter) = key;
return iter;
}
+ case 1:
+ return Parrot_py_get_slice(INTERP, SELF, key);
+ }
+ internal_exception(1, "IntList: Unknown slice type");
+ return NULL;
+ }
PMC* get_iter () {
PMC *iter = pmc_new_init(interpreter, enum_class_Iterator, SELF);
1.80 +15 -5 parrot/classes/perlhash.pmc
Index: perlhash.pmc
===================================================================
RCS file: /cvs/public/parrot/classes/perlhash.pmc,v
retrieving revision 1.79
retrieving revision 1.80
diff -u -w -r1.79 -r1.80
--- perlhash.pmc 6 Jul 2004 06:38:01 -0000 1.79
+++ perlhash.pmc 9 Jul 2004 15:24:10 -0000 1.80
@@ -1,6 +1,6 @@
/*
Copyright: 2001-2003 The Perl Foundation. All Rights Reserved.
-$Id: perlhash.pmc,v 1.79 2004/07/06 06:38:01 leo Exp $
+$Id: perlhash.pmc,v 1.80 2004/07/09 15:24:10 leo Exp $
=head1 NAME
@@ -995,11 +995,21 @@
*/
- PMC* slice (PMC* key) {
- PMC *iter = pmc_new_init(interpreter, enum_class_Iterator, SELF);
+ PMC* slice (PMC* key, INTVAL f) {
+ switch (f) {
+ case 0:
+ {
+ PMC *iter = pmc_new_init(interpreter,
+ enum_class_Iterator, SELF);
PMC_struct_val(iter) = key;
return iter;
}
+ case 1:
+ return Parrot_py_get_slice(INTERP, SELF, key);
+ }
+ internal_exception(1, "PerlHash: Unknown slice type");
+ return NULL;
+ }
/*
1.83 +19 -7 parrot/classes/perlstring.pmc
Index: perlstring.pmc
===================================================================
RCS file: /cvs/public/parrot/classes/perlstring.pmc,v
retrieving revision 1.82
retrieving revision 1.83
diff -u -w -r1.82 -r1.83
--- perlstring.pmc 9 Jul 2004 08:42:47 -0000 1.82
+++ perlstring.pmc 9 Jul 2004 15:24:10 -0000 1.83
@@ -1,6 +1,6 @@
/*
Copyright: 2001-2003 The Perl Foundation. All Rights Reserved.
-$Id: perlstring.pmc,v 1.82 2004/07/09 08:42:47 leo Exp $
+$Id: perlstring.pmc,v 1.83 2004/07/09 15:24:10 leo Exp $
=head1 NAME
@@ -702,9 +702,11 @@
=over 4
-=item C<PMC* slice (PMC *key)>
+=item C<PMC* slice (PMC *key, INTVAL f)>
-Return a new iterator for the slice PMC C<key>
+Return a new iterator for the slice PMC C<key> if f==0.
+
+Return a new pythonic slice if f == 1.
=item C<PMC* get_iter (PMC *key)>
@@ -724,11 +726,21 @@
return string_length(INTERP, PMC_str_val(SELF));
}
- PMC* slice (PMC* key) {
- PMC *iter = pmc_new_init(interpreter, enum_class_Iterator, SELF);
+ PMC* slice (PMC* key, INTVAL f) {
+ switch (f) {
+ case 0:
+ {
+ PMC *iter = pmc_new_init(interpreter,
+ enum_class_Iterator, SELF);
PMC_struct_val(iter) = key;
return iter;
}
+ case 1:
+ return Parrot_py_get_slice(INTERP, SELF, key);
+ }
+ internal_exception(1, "PerlString: Unknown slice type");
+ return NULL;
+ }
PMC* get_iter () {
PMC *iter = pmc_new_init(interpreter, enum_class_Iterator, SELF);
1.12 +11 -5 parrot/classes/slice.pmc
Index: slice.pmc
===================================================================
RCS file: /cvs/public/parrot/classes/slice.pmc,v
retrieving revision 1.11
retrieving revision 1.12
diff -u -w -r1.11 -r1.12
--- slice.pmc 6 Jul 2004 06:38:01 -0000 1.11
+++ slice.pmc 9 Jul 2004 15:24:10 -0000 1.12
@@ -1,6 +1,6 @@
/*
Copyright: 2004 The Perl Foundation. All Rights Reserved.
-$Id: slice.pmc,v 1.11 2004/07/06 06:38:01 leo Exp $
+$Id: slice.pmc,v 1.12 2004/07/09 15:24:10 leo Exp $
=head1 NAME
@@ -261,11 +261,17 @@
*/
- PMC* slice(PMC *key) {
+ PMC* slice(PMC *key, INTVAL f) {
+ if (f) {
+ internal_exception(1, "Slice: Unknown slice type");
+ return NULL;
+ }
+ else {
PMC *iter = pmc_new_init(interpreter, enum_class_Iterator, SELF);
PMC_struct_val(iter) = key;
return iter;
}
+ }
PMC* get_iter() {
PMC *iter = pmc_new_init(interpreter, enum_class_Iterator, SELF);
1.144 +3 -1 parrot/include/parrot/interpreter.h
Index: interpreter.h
===================================================================
RCS file: /cvs/public/parrot/include/parrot/interpreter.h,v
retrieving revision 1.143
retrieving revision 1.144
diff -u -w -r1.143 -r1.144
--- interpreter.h 5 Jul 2004 12:14:26 -0000 1.143
+++ interpreter.h 9 Jul 2004 15:24:19 -0000 1.144
@@ -1,7 +1,7 @@
/* interpreter.h
* Copyright: 2001-2003 The Perl Foundation. All Rights Reserved.
* CVS Info
- * $Id: interpreter.h,v 1.143 2004/07/05 12:14:26 leo Exp $
+ * $Id: interpreter.h,v 1.144 2004/07/09 15:24:19 leo Exp $
* Overview:
* The interpreter api handles running the operations
* Data Structure and Algorithms:
@@ -394,7 +394,9 @@
void enter_nci_method(Parrot_Interp, int type,
void *func, const char *name, const char *proto);
+/* XXX separate header file */
void Parrot_py_init(Interp *interpreter);
+PMC* Parrot_py_get_slice(Interp*, PMC*, PMC* key);
#else
1.27 +40 -1 parrot/languages/python/pie-thon.pl
Index: pie-thon.pl
===================================================================
RCS file: /cvs/public/parrot/languages/python/pie-thon.pl,v
retrieving revision 1.26
retrieving revision 1.27
diff -u -w -r1.26 -r1.27
--- pie-thon.pl 9 Jul 2004 13:17:19 -0000 1.26
+++ pie-thon.pl 9 Jul 2004 15:24:23 -0000 1.27
@@ -149,10 +149,11 @@
if ($l =~ /^\s+ # intial space
(?:(\d+)\s+)? # optional line
(\d+)\s+ # PC
- (\w+)\s+ # opcode
+ ([\w+]+)\s+ # opcode e.g. SLICE+3
(?:(\d+)(?:\s+\((.*)\))?)? # oparg rest
/x) {
($line, $pc, $opcode, $arg, $rest) = ($1, $2, $3, $4, $5);
+ $opcode =~ s/\+/_plus_/;
## print STDERR "Op: '$opcode'\n";
if ($line) {
$source = $source[$line-1];
@@ -1267,3 +1268,41 @@
EOC
push @stack, ["obj $tos->[1] attr $c", $attr, 'P'];
}
+
+sub Slice
+{
+ my ($n, $c, $cmt, $sl_n) = @_;
+ my ($v, $w, $vv, $ww);
+ $vv = $ww = 0;
+ if ($sl_n & 2) {
+ $w = pop @stack;
+ $ww = $w->[1];
+ if ($w->[2] eq 'P') {
+ $ww = temp('I');
+ print <<EOC;
+ $ww = $w->[1]
+EOC
+ }
+ }
+ if ($sl_n & 1) {
+ $v = pop @stack;
+ $vv = $v->[1];
+ if ($v->[2] eq 'P') {
+ $vv = temp('I');
+ print <<EOC;
+ $vv = $v->[1]
+EOC
+ }
+ }
+ my $ag = promote(pop @stack);
+ my $a = temp('P');
+ print <<EOC;
+ \t $cmt
+ $a = slice $ag\[ $vv .. $ww ], 1
+EOC
+ push @stack, [-1, $a, 'P'];
+}
+
+sub SLICE_plus_3 {
+ return Slice(@_, 3);
+}
1.7 +16 -2 parrot/languages/python/t/basic/03_types.t
Index: 03_types.t
===================================================================
RCS file: /cvs/public/parrot/languages/python/t/basic/03_types.t,v
retrieving revision 1.6
retrieving revision 1.7
diff -u -w -r1.6 -r1.7
--- 03_types.t 9 Jul 2004 08:43:04 -0000 1.6
+++ 03_types.t 9 Jul 2004 15:24:26 -0000 1.7
@@ -1,9 +1,9 @@
-# $Id: 03_types.t,v 1.6 2004/07/09 08:43:04 leo Exp $
+# $Id: 03_types.t,v 1.7 2004/07/09 15:24:26 leo Exp $
use strict;
use lib '../../lib';
-use Parrot::Test tests => 6;
+use Parrot::Test tests => 8;
sub test {
language_output_is('python', $_[0], '', $_[1]);
@@ -51,3 +51,17 @@
print `u"ab"`, u"ab"
CODE
+test(<<'CODE', 'array slice');
+if __name__ == '__main__':
+ a = [0,1,2,3,5,6,7][2:4]
+ print a[0], a[1]
+CODE
+
+test(<<'CODE', 'string slice');
+if __name__ == '__main__':
+ a = "abcdef" [2:4]
+ print a[0], a[1]
+CODE
+
+
+
1.19 +13 -1 parrot/ops/set.ops
Index: set.ops
===================================================================
RCS file: /cvs/public/parrot/ops/set.ops,v
retrieving revision 1.18
retrieving revision 1.19
diff -u -w -r1.18 -r1.19
--- set.ops 6 Jul 2004 06:38:08 -0000 1.18
+++ set.ops 9 Jul 2004 15:24:29 -0000 1.19
@@ -508,6 +508,13 @@
Return a new Iterator PMC $1 for aggregate $2 and Slice PMC $3.
+=item B<slice>(out PMC, in PMC, in KEY, inconst INT)
+
+Return a new list PMC $1 for aggregate $2 and Slice PMC $3.
+
+This is a Python opcode. Range is i <= k < j. $4 must be 1.
+May change and move to python.ops.
+
=item B<iter>(out PMC, in PMC)
Return a new Iterator PMC $1 for aggregate $2.
@@ -515,7 +522,12 @@
=cut
inline op slice (out PMC, in PMC, in KEY) :base_core {
- $1 = $2->vtable->slice(interpreter, $2, $3);
+ $1 = $2->vtable->slice(interpreter, $2, $3, 0);
+ goto NEXT();
+}
+
+inline op slice (out PMC, in PMC, in KEY, inconst INT) :python {
+ $1 = $2->vtable->slice(interpreter, $2, $3, $4);
goto NEXT();
}
1.13 +82 -1 parrot/src/py_func.c
Index: py_func.c
===================================================================
RCS file: /cvs/public/parrot/src/py_func.c,v
retrieving revision 1.12
retrieving revision 1.13
diff -u -w -r1.12 -r1.13
--- py_func.c 8 Jul 2004 16:11:44 -0000 1.12
+++ py_func.c 9 Jul 2004 15:24:32 -0000 1.13
@@ -1,6 +1,6 @@
/*
Copyright: 2001-2004 The Perl Foundation. All Rights Reserved.
-$Id: py_func.c,v 1.12 2004/07/08 16:11:44 leo Exp $
+$Id: py_func.c,v 1.13 2004/07/09 15:24:32 leo Exp $
=head1 NAME
@@ -660,6 +660,87 @@
}
/*
+ * XXX create slice.h
+ */
+typedef struct {
+ INTVAL i;
+ STRING *s;
+} RUnion;
+
+#define RVal_int(u) u.i
+#define RVal_str(u) u.s
+
+typedef struct _range_t {
+ int type; /* enum_type_INTVAL or STRING */
+ RUnion start; /* start of this range */
+ RUnion end; /* end of this range */
+ RUnion step; /* step of this range */
+ RUnion cur; /* current value */
+ struct _range_t *next; /* next in chain */
+} range_t;
+
+PMC*
+Parrot_py_get_slice(Interp *interpreter, PMC *self, PMC *key)
+{
+ INTVAL i, n, type;
+ range_t *range;
+ PMC *res, *slice, *item;
+ INTVAL start, end, iitem;
+
+ type = self->vtable->base_type;
+ /*
+ * key is a keychaing PMC
+ */
+ slice = pmc_new_init(interpreter, enum_class_Slice, key);
+ range = PMC_struct_val(slice);
+ /*
+ * fprintf(stderr, "range %d - %d\n", RVal_int(range->start),
+ * RVal_int(range->end));
+ */
+ res = pmc_new(interpreter, type);
+ start = RVal_int(range->start);
+ end = RVal_int(range->end);
+ n = VTABLE_elements(interpreter, self);
+ if (!n) {
+ /* slice of empty is empty
+ */
+ return res;
+ }
+ if (start < 0)
+ start += n;
+ if (end < 0)
+ end += n;
+ if (start < 0)
+ start = 0;
+ else if (start > n)
+ start = n;
+ if (start > end)
+ end = start;
+ else if (end > n)
+ end = n;
+ for (i = start; i <= end; ++i) {
+ switch (type) {
+ case enum_class_Array:
+ case enum_class_PerlArray:
+ item = VTABLE_get_pmc_keyed_int(interpreter, self, i);
+ VTABLE_set_pmc_keyed_int(interpreter, res, i-start, item);
+ break;
+ case enum_class_String:
+ case enum_class_PerlString:
+ string_substr(interpreter, PMC_str_val(self), start,
+ end - start + 1, &PMC_str_val(res), 1);
+ return res;
+ case enum_class_IntList:
+ iitem = VTABLE_get_integer_keyed_int(interpreter, self, i);
+ VTABLE_set_integer_keyed_int(interpreter, res, i-start, iitem);
+ break;
+ default:
+ internal_exception(1, "Parrot_py_get_slice: unim tpye");
+ }
+ }
+ return res;
+}
+/*
=back
1.67 +2 -2 parrot/vtable.tbl
Index: vtable.tbl
===================================================================
RCS file: /cvs/public/parrot/vtable.tbl,v
retrieving revision 1.66
retrieving revision 1.67
diff -u -w -r1.66 -r1.67
--- vtable.tbl 8 Jul 2004 16:11:24 -0000 1.66
+++ vtable.tbl 9 Jul 2004 15:24:35 -0000 1.67
@@ -1,4 +1,4 @@
-# $Id: vtable.tbl,v 1.66 2004/07/08 16:11:24 leo Exp $
+# $Id: vtable.tbl,v 1.67 2004/07/09 15:24:35 leo Exp $
# [MAIN] #default section name
void init()
@@ -58,7 +58,7 @@
PMC* get_pmc_keyed(PMC* key)
PMC* get_pmc_keyed_int(INTVAL key)
PMC* get_pmc_keyed_str(STRING* key)
-PMC* slice(PMC* key)
+PMC* slice(PMC* key, INTVAL flag)
void* get_pointer()
void* get_pointer_keyed(PMC* key)