cvsuser 04/06/18 08:15:00
Modified: classes perlstring.pmc slice.pmc
imcc pbc.c
include/parrot string_funcs.h
src key.c string.c
t/pmc iter.t
Log:
slices 9 - PerlHash ranges and S vars
Revision Changes Path
1.75 +2 -13 parrot/classes/perlstring.pmc
Index: perlstring.pmc
===================================================================
RCS file: /cvs/public/parrot/classes/perlstring.pmc,v
retrieving revision 1.74
retrieving revision 1.75
diff -u -w -r1.74 -r1.75
--- perlstring.pmc 18 Jun 2004 13:44:24 -0000 1.74
+++ perlstring.pmc 18 Jun 2004 15:14:44 -0000 1.75
@@ -1,6 +1,6 @@
/*
Copyright: 2001-2003 The Perl Foundation. All Rights Reserved.
-$Id: perlstring.pmc,v 1.74 2004/06/18 13:44:24 leo Exp $
+$Id: perlstring.pmc,v 1.75 2004/06/18 15:14:44 leo Exp $
=head1 NAME
@@ -599,18 +599,7 @@
void increment () {
STRING* s = PMC_str_val(SELF);
- INTVAL o;
- if (string_length(INTERP, s) != 1)
- internal_exception(1, "increment only for length=1 done");
- o = string_ord(INTERP, s, 0);
- if ((o >= 'A' && o < 'Z') ||
- (o >= 'a' && o < 'z')) {
- ++o;
- /* TODO increment in place */
- PMC_str_val(SELF) = string_chr(INTERP, o);
- return;
- }
- internal_exception(1, "increment out of range - unimplemented");
+ PMC_str_val(SELF) = string_increment(INTERP, s);
}
void decrement () {
1.5 +47 -17 parrot/classes/slice.pmc
Index: slice.pmc
===================================================================
RCS file: /cvs/public/parrot/classes/slice.pmc,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -w -r1.4 -r1.5
--- slice.pmc 18 Jun 2004 13:06:54 -0000 1.4
+++ slice.pmc 18 Jun 2004 15:14:44 -0000 1.5
@@ -1,6 +1,6 @@
/*
Copyright: 2004 The Perl Foundation. All Rights Reserved.
-$Id: slice.pmc,v 1.4 2004/06/18 13:06:54 leo Exp $
+$Id: slice.pmc,v 1.5 2004/06/18 15:14:44 leo Exp $
=head1 NAME
@@ -68,9 +68,14 @@
}
}
else {
+ if (PObj_get_FLAGS(range) & KEY_inf_slice_FLAG) {
+ internal_exception(1,
+ "unlimited slice range for hash not implemented");
+ }
+
/*
* string assumed
- * - no ranges yet, start at value
+ * start at value
*/
PMC_struct_val(self) = key_string(interpreter, range);
}
@@ -84,9 +89,10 @@
set_slice_next(Interp *interpreter, PMC *self, PMC *agg)
{
PMC* range = PMC_pmc_val(self);
- INTVAL cur, end;
if (key_type(interpreter, range) & KEY_integer_FLAG) {
+ INTVAL cur, end;
+
if ((PObj_get_FLAGS(range) &
(KEY_start_slice_FLAG|KEY_end_slice_FLAG)) ==
(KEY_start_slice_FLAG|KEY_end_slice_FLAG)) {
@@ -143,7 +149,7 @@
next_range:
range = PMC_pmc_val(self) = PMC_data(range);
- if (!PMC_pmc_val(self)) {
+ if (!range) {
/*
* this denotes the end of iteration
*/
@@ -157,6 +163,7 @@
}
}
else {
+ STRING *cur, *end;
/*
* string assumed
*/
@@ -164,18 +171,42 @@
(KEY_start_slice_FLAG|KEY_end_slice_FLAG)) ==
(KEY_start_slice_FLAG|KEY_end_slice_FLAG)) {
/*
- * only single values for now - no ranges
+ * only single values or limited ranges - no
+ * ..end or start.. range for hash
+ */
+ goto next_str_range;
+ }
+ if (PObj_get_FLAGS(range) & KEY_inf_slice_FLAG) {
+ internal_exception(1,
+ "unlimited slice range for hash not implemented");
+ }
+ if (PObj_get_FLAGS(range) & KEY_start_slice_FLAG) {
+ /*
+ * start ... end range
+ * end is in the next range in the Key chain
*/
+ PMC *end_range = PMC_data(range);
+ if (!end_range)
+ internal_exception(1, "No end range found");
+ cur = (STRING *)PMC_struct_val(self);
+ end = key_string(interpreter, end_range);
+ if (string_compare(interpreter, cur, end) < 0) {
+ cur = string_increment(interpreter, cur);
+ PMC_struct_val(self) = (void *)cur;
+ return;
+ }
+ /* skip end range */
+ PMC_pmc_val(self) = end_range;
+ range = end_range;
+ /* go on with next_range */
+ }
+next_str_range:
range = PMC_pmc_val(self) = PMC_data(range);
- if (!PMC_pmc_val(self))
+ if (!range)
PMC_int_val(self) = -1;
else
PMC_struct_val(self) = key_string(interpreter, range);
}
- else {
- internal_exception(1, "slices ranges for hash not implemented");
- }
- }
}
pmclass Slice need_ext extends Key {
@@ -215,7 +246,6 @@
INTVAL get_integer() {
INTVAL v = (INTVAL)PMC_struct_val(SELF);
- /* printf("Slice_get_integer %d\n", (int)v); */
return v;
}
1.82 +1 -1 parrot/imcc/pbc.c
Index: pbc.c
===================================================================
RCS file: /cvs/public/parrot/imcc/pbc.c,v
retrieving revision 1.81
retrieving revision 1.82
diff -u -w -r1.81 -r1.82
--- pbc.c 17 Jun 2004 12:04:42 -0000 1.81
+++ pbc.c 18 Jun 2004 15:14:47 -0000 1.82
@@ -680,7 +680,7 @@
if (r->set == 'I')
*pc++ = PARROT_ARG_I | slice_bits; /* register type */
else if (r->set == 'S')
- *pc++ = PARROT_ARG_S;
+ *pc++ = PARROT_ARG_S | slice_bits;
else
fatal(1, "build_key", "wrong register set\n");
/* don't emit mapped regs in key parts */
1.41 +2 -1 parrot/include/parrot/string_funcs.h
Index: string_funcs.h
===================================================================
RCS file: /cvs/public/parrot/include/parrot/string_funcs.h,v
retrieving revision 1.40
retrieving revision 1.41
diff -u -w -r1.40 -r1.41
--- string_funcs.h 22 Apr 2004 08:55:06 -0000 1.40
+++ string_funcs.h 18 Jun 2004 15:14:52 -0000 1.41
@@ -1,7 +1,7 @@
/* string_funcs.h
* Copyright: 2001-2003 The Perl Foundation. All Rights Reserved.
* CVS Info
- * $Id: string_funcs.h,v 1.40 2004/04/22 08:55:06 leo Exp $
+ * $Id: string_funcs.h,v 1.41 2004/06/18 15:14:52 leo Exp $
* Overview:
* This is the api header for the string subsystem
* Data Structure and Algorithms:
@@ -35,6 +35,7 @@
INTVAL string_compare(struct Parrot_Interp *, STRING *, STRING *);
INTVAL string_equal(struct Parrot_Interp *, STRING *, STRING *);
INTVAL string_bool(struct Parrot_Interp *, const STRING *);
+STRING *string_increment(struct Parrot_Interp *, const STRING *);
const char *Parrot_string_cstring(const STRING *);
/* Declarations of other functions */
1.49 +12 -9 parrot/src/key.c
Index: key.c
===================================================================
RCS file: /cvs/public/parrot/src/key.c,v
retrieving revision 1.48
retrieving revision 1.49
diff -u -w -r1.48 -r1.49
--- key.c 17 Jun 2004 16:30:25 -0000 1.48
+++ key.c 18 Jun 2004 15:14:56 -0000 1.49
@@ -1,6 +1,6 @@
/*
Copyright: 2001-2003 The Perl Foundation. All Rights Reserved.
-$Id: key.c,v 1.48 2004/06/17 16:30:25 leo Exp $
+$Id: key.c,v 1.49 2004/06/18 15:14:56 leo Exp $
=head1 NAME
@@ -141,6 +141,7 @@
PMC *key = pmc_new(interpreter, enum_class_Key);
PObj_get_FLAGS(key) |= KEY_pmc_FLAG;
+ internal_exception(1, "this is broken - see slice.pmc");
PMC_pmc_val(key) = value;
return key;
@@ -248,6 +249,11 @@
{
PObj_get_FLAGS(key) &= ~KEY_type_FLAGS;
PObj_get_FLAGS(key) |= KEY_pmc_FLAG;
+ /*
+ * XXX leo
+ * what for is this indirection?
+ */
+ internal_exception(1, "this is broken - see slice.pmc");
PMC_pmc_val(key) = value;
return;
@@ -321,8 +327,8 @@
case KEY_number_FLAG | KEY_register_FLAG:
return interpreter->num_reg.registers[PMC_int_val(key)];
case KEY_pmc_FLAG:
- return VTABLE_get_number(interpreter,
- PMC_pmc_val(key));
+ return VTABLE_get_number(interpreter, key);
+ /* PMC_pmc_val(key)); */
case KEY_pmc_FLAG | KEY_register_FLAG:
reg = interpreter->pmc_reg.registers[PMC_int_val(key)];
return VTABLE_get_number(interpreter, reg);
@@ -352,8 +358,8 @@
case KEY_string_FLAG | KEY_register_FLAG:
return interpreter->string_reg.registers[PMC_int_val(key)];
case KEY_pmc_FLAG:
- return VTABLE_get_string(interpreter,
- PMC_pmc_val(key));
+ return VTABLE_get_string(interpreter, key);
+ /* PMC_pmc_val(key)); */
case KEY_pmc_FLAG | KEY_register_FLAG:
reg = interpreter->pmc_reg.registers[PMC_int_val(key)];
return VTABLE_get_string(interpreter, reg);
@@ -379,13 +385,10 @@
key_pmc(Interp *interpreter, PMC *key)
{
switch (PObj_get_FLAGS(key) & KEY_type_FLAGS) {
- case KEY_pmc_FLAG:
- return PMC_pmc_val(key);
case KEY_pmc_FLAG | KEY_register_FLAG:
return interpreter->pmc_reg.registers[PMC_int_val(key)];
default:
- internal_exception(INVALID_OPERATION, "Key not a PMC!\n");
- return 0;
+ return key; /* PMC_pmc_val(key); */
}
}
1.206 +29 -1 parrot/src/string.c
Index: string.c
===================================================================
RCS file: /cvs/public/parrot/src/string.c,v
retrieving revision 1.205
retrieving revision 1.206
diff -u -w -r1.205 -r1.206
--- string.c 12 Jun 2004 13:19:22 -0000 1.205
+++ string.c 18 Jun 2004 15:14:56 -0000 1.206
@@ -1,6 +1,6 @@
/*
Copyright: 2001-2003 The Perl Foundation. All Rights Reserved.
-$Id: string.c,v 1.205 2004/06/12 13:19:22 nicholas Exp $
+$Id: string.c,v 1.206 2004/06/18 15:14:56 leo Exp $
=head1 NAME
@@ -3178,6 +3178,34 @@
/*
+=item C<STRING *string_increment(struct Parrot_Interp *, const STRING *)>
+
+Perl5ish increment the string. Currently single char only.
+
+=cut
+
+*/
+
+STRING *
+string_increment(Interp *interpreter, const STRING *s)
+{
+ INTVAL o;
+
+ if (string_length(interpreter, s) != 1)
+ internal_exception(1, "increment only for length=1 done");
+ o = string_ord(interpreter, s, 0);
+ if ((o >= 'A' && o < 'Z') ||
+ (o >= 'a' && o < 'z')) {
+ ++o;
+ /* TODO increment in place */
+ return string_chr(interpreter, o);
+ }
+ internal_exception(1, "increment out of range - unimplemented");
+ return NULL;
+}
+
+/*
+
=back
=head1 SEE ALSO
1.18 +101 -2 parrot/t/pmc/iter.t
Index: iter.t
===================================================================
RCS file: /cvs/public/parrot/t/pmc/iter.t,v
retrieving revision 1.17
retrieving revision 1.18
diff -u -w -r1.17 -r1.18
--- iter.t 18 Jun 2004 12:06:06 -0000 1.17
+++ iter.t 18 Jun 2004 15:15:00 -0000 1.18
@@ -1,6 +1,6 @@
#! perl -w
# Copyright: 2001-2003 The Perl Foundation. All Rights Reserved.
-# $Id: iter.t,v 1.17 2004/06/18 12:06:06 leo Exp $
+# $Id: iter.t,v 1.18 2004/06/18 15:15:00 leo Exp $
=head1 NAME
@@ -16,7 +16,7 @@
=cut
-use Parrot::Test tests => 26;
+use Parrot::Test tests => 29;
use Test::More qw(skip);
output_is(<<'CODE', <<'OUTPUT', "new iter");
@@ -883,3 +883,102 @@
500
ok
OUTPUT
+
+output_is(<<'CODE', <<OUTPUT, "slice iter range");
+ .include "iterator.pasm"
+ new P2, .PerlHash
+ set P2["a"], 10
+ set P2["b"], 20
+ set P2["c"], 30
+ set P2["d"], 40
+ set P2["e"], 50
+ slice P1, P2["a".. "c"]
+ set P1, .ITERATE_FROM_START
+iter_loop:
+ unless P1, iter_end
+ shift S1, P1
+ print S1
+ print "\n"
+ branch iter_loop
+iter_end:
+ print "ok\n"
+ end
+CODE
+10
+20
+30
+ok
+OUTPUT
+
+output_is(<<'CODE', <<OUTPUT, "slice iter range 2");
+ .include "iterator.pasm"
+ new P2, .PerlHash
+ set P2["a"], 10
+ set P2["b"], 20
+ set P2["c"], 30
+ set P2["d"], 40
+ set P2["e"], 50
+ set P2["A"], 11
+ set P2["B"], 21
+ set P2["C"], 31
+ set P2["D"], 41
+ set P2["E"], 51
+ slice P1, P2["a".. "c", 'C' .. 'E']
+ set P1, .ITERATE_FROM_START
+iter_loop:
+ unless P1, iter_end
+ shift S1, P1
+ print S1
+ print "\n"
+ branch iter_loop
+iter_end:
+ print "ok\n"
+ end
+CODE
+10
+20
+30
+31
+41
+51
+ok
+OUTPUT
+
+output_is(<<'CODE', <<OUTPUT, "slice iter range - vars");
+ .include "iterator.pasm"
+ new P2, .PerlHash
+ set P2["a"], 10
+ set P2["b"], 20
+ set P2["c"], 30
+ set P2["d"], 40
+ set P2["e"], 50
+ set P2["A"], 11
+ set P2["B"], 21
+ set P2["C"], 31
+ set P2["D"], 41
+ set P2["E"], 51
+ set S0, 'a'
+ set S1, 'c'
+ set S2, 'C'
+ set S3, 'E'
+ slice P1, P2[S0 .. S1, S2 .. S3, 'A']
+ set P1, .ITERATE_FROM_START
+iter_loop:
+ unless P1, iter_end
+ shift S10, P1
+ print S10
+ print "\n"
+ branch iter_loop
+iter_end:
+ print "ok\n"
+ end
+CODE
+10
+20
+30
+31
+41
+51
+11
+ok
+OUTPUT