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
  
  
  

Reply via email to