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)
  
  
  

Reply via email to