cvsuser     04/07/05 23:38:14

  Modified:    classes  array.pmc intlist.pmc perlhash.pmc perlstring.pmc
                        slice.pmc
               docs/pmc iterator.pod
               ops      set.ops
               t/pmc    iter.t
               .        vtable.tbl
  Log:
  Pie-thon 23 - get_iter vtable and iter opcode
  
  Revision  Changes    Path
  1.86      +16 -1     parrot/classes/array.pmc
  
  Index: array.pmc
  ===================================================================
  RCS file: /cvs/public/parrot/classes/array.pmc,v
  retrieving revision 1.85
  retrieving revision 1.86
  diff -u -w -r1.85 -r1.86
  --- array.pmc 2 Jul 2004 09:30:00 -0000       1.85
  +++ array.pmc 6 Jul 2004 06:38:01 -0000       1.86
  @@ -1,6 +1,6 @@
   /*
   Copyright: 2001-2003 The Perl Foundation.  All Rights Reserved.
  -$Id: array.pmc,v 1.85 2004/07/02 09:30:00 leo Exp $
  +$Id: array.pmc,v 1.86 2004/07/06 06:38:01 leo Exp $
   
   =head1 NAME
   
  @@ -1120,6 +1120,10 @@
   
   Return a new iterator for the slice PMC C<key>
   
  +=item C<PMC* get_iter ()>
  +
  +Return a new iterator for SELF.
  +
   =cut
   
   */
  @@ -1130,6 +1134,17 @@
           return iter;
       }
   
  +    PMC* get_iter () {
  +     PMC *iter = pmc_new_init(interpreter, enum_class_Iterator, SELF);
  +        PMC *key =  pmc_new(interpreter, enum_class_Key);
  +        PMC_struct_val(iter) = key;
  +        PObj_get_FLAGS(key) |= KEY_integer_FLAG;
  +        PMC_int_val(key) = 0;
  +        if (!((List *) PMC_data(SELF))->length)
  +            PMC_int_val(key) = -1;
  +        return iter;
  +    }
  +
   /*
   
   =item C<void visit(visit_info *info)>
  
  
  
  1.28      +11 -1     parrot/classes/intlist.pmc
  
  Index: intlist.pmc
  ===================================================================
  RCS file: /cvs/public/parrot/classes/intlist.pmc,v
  retrieving revision 1.27
  retrieving revision 1.28
  diff -u -w -r1.27 -r1.28
  --- intlist.pmc       2 Jul 2004 09:30:00 -0000       1.27
  +++ intlist.pmc       6 Jul 2004 06:38:01 -0000       1.28
  @@ -1,6 +1,6 @@
   /*
   Copyright: 2001-2003 The Perl Foundation.  All Rights Reserved.
  -$Id: intlist.pmc,v 1.27 2004/07/02 09:30:00 leo Exp $
  +$Id: intlist.pmc,v 1.28 2004/07/06 06:38:01 leo Exp $
   
   =head1 NAME
   
  @@ -223,6 +223,16 @@
           return iter;
       }
   
  +    PMC* get_iter () {
  +     PMC *iter = pmc_new_init(interpreter, enum_class_Iterator, SELF);
  +        PMC *key =  pmc_new(interpreter, enum_class_Key);
  +        PMC_struct_val(iter) = key;
  +        PObj_get_FLAGS(key) |= KEY_integer_FLAG;
  +        PMC_int_val(key) = 0;
  +        if (!((List *) PMC_struct_val(SELF))->length)
  +            PMC_int_val(key) = -1;
  +        return iter;
  +    }
   /*
   
   =item C<void multiply_int(INTVAL value,  PMC *dest)>
  
  
  
  1.79      +13 -1     parrot/classes/perlhash.pmc
  
  Index: perlhash.pmc
  ===================================================================
  RCS file: /cvs/public/parrot/classes/perlhash.pmc,v
  retrieving revision 1.78
  retrieving revision 1.79
  diff -u -w -r1.78 -r1.79
  --- perlhash.pmc      4 Jul 2004 13:40:06 -0000       1.78
  +++ perlhash.pmc      6 Jul 2004 06:38:01 -0000       1.79
  @@ -1,6 +1,6 @@
   /*
   Copyright: 2001-2003 The Perl Foundation.  All Rights Reserved.
  -$Id: perlhash.pmc,v 1.78 2004/07/04 13:40:06 leo Exp $
  +$Id: perlhash.pmc,v 1.79 2004/07/06 06:38:01 leo Exp $
   
   =head1 NAME
   
  @@ -576,6 +576,18 @@
   
   */
   
  +    PMC* get_iter () {
  +     PMC *iter = pmc_new_init(interpreter, enum_class_Iterator, SELF);
  +        PMC *key =  pmc_new(interpreter, enum_class_Key);
  +        PMC_struct_val(iter) = key;
  +        PObj_get_FLAGS(key) |= KEY_integer_FLAG;
  +        PMC_int_val(key) = 0;
  +        PMC_data(key) = (void *)INITBucketIndex;
  +        if (!hash_size(INTERP, PMC_struct_val(SELF)))
  +            PMC_int_val(key) = -1;
  +        return iter;
  +    }
  +
       PMC* slice (PMC* key) {
        return NULL;
       }
  
  
  
  1.79      +16 -1     parrot/classes/perlstring.pmc
  
  Index: perlstring.pmc
  ===================================================================
  RCS file: /cvs/public/parrot/classes/perlstring.pmc,v
  retrieving revision 1.78
  retrieving revision 1.79
  diff -u -w -r1.78 -r1.79
  --- perlstring.pmc    5 Jul 2004 19:57:03 -0000       1.78
  +++ perlstring.pmc    6 Jul 2004 06:38:01 -0000       1.79
  @@ -1,6 +1,6 @@
   /*
   Copyright: 2001-2003 The Perl Foundation.  All Rights Reserved.
  -$Id: perlstring.pmc,v 1.78 2004/07/05 19:57:03 leo Exp $
  +$Id: perlstring.pmc,v 1.79 2004/07/06 06:38:01 leo Exp $
   
   =head1 NAME
   
  @@ -663,6 +663,11 @@
   
   Return a new iterator for the slice PMC C<key>
   
  +=item C<PMC* get_iter (PMC *key)>
  +
  +Return a new iterator for this string.
  +
  +
   =item C<INTVAL elements ()>
   
   Return length of the string.
  @@ -682,6 +687,16 @@
           return iter;
       }
   
  +    PMC* get_iter () {
  +     PMC *iter = pmc_new_init(interpreter, enum_class_Iterator, SELF);
  +        PMC *key =  pmc_new(interpreter, enum_class_Key);
  +        PMC_struct_val(iter) = key;
  +        PObj_get_FLAGS(key) |= KEY_integer_FLAG;
  +        PMC_int_val(key) = 0;
  +        if (!string_length(INTERP, PMC_str_val(SELF)))
  +            PMC_int_val(key) = -1;
  +        return iter;
  +    }
   
   /*
   
  
  
  
  1.11      +9 -1      parrot/classes/slice.pmc
  
  Index: slice.pmc
  ===================================================================
  RCS file: /cvs/public/parrot/classes/slice.pmc,v
  retrieving revision 1.10
  retrieving revision 1.11
  diff -u -w -r1.10 -r1.11
  --- slice.pmc 2 Jul 2004 10:28:44 -0000       1.10
  +++ slice.pmc 6 Jul 2004 06:38:01 -0000       1.11
  @@ -1,6 +1,6 @@
   /*
   Copyright: 2004 The Perl Foundation.  All Rights Reserved.
  -$Id: slice.pmc,v 1.10 2004/07/02 10:28:44 leo Exp $
  +$Id: slice.pmc,v 1.11 2004/07/06 06:38:01 leo Exp $
   
   =head1 NAME
   
  @@ -252,6 +252,8 @@
   
   =item C<PMC* slice(PMC *key)>
   
  +=item C<PMC* get_iter()>
  +
   A slice can serve as its own iterator, yielding values [start .. end-1].
   This is used for implementing Pythons xrange()
   
  @@ -265,6 +267,12 @@
           return iter;
       }
   
  +    PMC* get_iter() {
  +     PMC *iter = pmc_new_init(interpreter, enum_class_Iterator, SELF);
  +        PMC_struct_val(iter) = SELF;
  +        return iter;
  +    }
  +
       INTVAL elements () {
           range_t *r = PMC_struct_val(SELF);
           /* only start .. end supported so:
  
  
  
  1.3       +6 -0      parrot/docs/pmc/iterator.pod
  
  Index: iterator.pod
  ===================================================================
  RCS file: /cvs/public/parrot/docs/pmc/iterator.pod,v
  retrieving revision 1.2
  retrieving revision 1.3
  diff -u -w -r1.2 -r1.3
  --- iterator.pod      6 Mar 2004 14:53:32 -0000       1.2
  +++ iterator.pod      6 Jul 2004 06:38:05 -0000       1.3
  @@ -20,6 +20,12 @@
         ...
         branch iter_loop
   
  +The two lines of iterator creation can be short written as:
  +
  +    iter P0, P1                 # create new iterator P0 for aggregate P1
  +
  +This creates a new iterator and resets it.
  +
   Iterate from the end of the aggregate (Array like classes only):
   
     .include "iterator.pasm"
  
  
  
  1.18      +8 -0      parrot/ops/set.ops
  
  Index: set.ops
  ===================================================================
  RCS file: /cvs/public/parrot/ops/set.ops,v
  retrieving revision 1.17
  retrieving revision 1.18
  diff -u -w -r1.17 -r1.18
  --- set.ops   17 Jun 2004 11:11:57 -0000      1.17
  +++ set.ops   6 Jul 2004 06:38:08 -0000       1.18
  @@ -508,6 +508,10 @@
   
   Return a new Iterator PMC $1 for aggregate $2 and Slice PMC $3.
   
  +=item B<iter>(out PMC, in PMC)
  +
  +Return a new Iterator PMC $1 for aggregate $2.
  +
   =cut
   
   inline op slice (out PMC, in PMC, in KEY) :base_core {
  @@ -515,6 +519,10 @@
       goto NEXT();
   }
   
  +inline op iter (out PMC, in PMC) :base_core {
  +    $1 = $2->vtable->get_iter(interpreter, $2);
  +    goto NEXT();
  +}
   
   =item B<clone>(out PMC, in PMC)
   
  
  
  
  1.24      +150 -2    parrot/t/pmc/iter.t
  
  Index: iter.t
  ===================================================================
  RCS file: /cvs/public/parrot/t/pmc/iter.t,v
  retrieving revision 1.23
  retrieving revision 1.24
  diff -u -w -r1.23 -r1.24
  --- iter.t    2 Jul 2004 12:09:09 -0000       1.23
  +++ iter.t    6 Jul 2004 06:38:11 -0000       1.24
  @@ -1,6 +1,6 @@
   #! perl -w
   # Copyright: 2001-2003 The Perl Foundation.  All Rights Reserved.
  -# $Id: iter.t,v 1.23 2004/07/02 12:09:09 leo Exp $
  +# $Id: iter.t,v 1.24 2004/07/06 06:38:11 leo Exp $
   
   =head1 NAME
   
  @@ -16,7 +16,7 @@
   
   =cut
   
  -use Parrot::Test tests => 37;
  +use Parrot::Test tests => 42;
   use Test::More qw(skip);
   
   output_is(<<'CODE', <<'OUTPUT', "new iter");
  @@ -1008,6 +1008,7 @@
   11
   ok
   OUTPUT
  +
   output_is(<<'CODE', <<'OUTPUT', "xrange iterator");
   ##PIR##
   .sub main
  @@ -1223,3 +1224,150 @@
   CODE
   /10 [0123456789]{10}ok/
   OUTPUT
  +
  +output_is(<<'CODE', <<'OUTPUT', "iter vtable");
  +   .include "iterator.pasm"
  +   new P0, .PerlArray
  +   push P0, 100
  +   push P0, 200
  +   push P0, 300
  +   push P0, 400
  +   push P0, 500
  +   push P0, 600
  +   push P0, 700
  +   push P0, 800
  +   iter P2, P0
  +   print "ok 1\n"
  +lp:
  +   unless P2, ex
  +   shift I0, P2
  +   print I0
  +   print "\n"
  +   branch lp
  +ex:
  +   print "ok 2\n"
  +   end
  +CODE
  +ok 1
  +100
  +200
  +300
  +400
  +500
  +600
  +700
  +800
  +ok 2
  +OUTPUT
  +
  +output_like(<<'CODE', <<'OUTPUT', "hash fromkeys - xrange get_iter");
  +##PIR##
  +.sub main @MAIN
  +    .include "iterator.pasm"
  +    .local pmc hash
  +    .local pmc value
  +    .local pmc xr
  +    xr = new Slice[0 .. 10]
  +    .local pmc sl
  +    sl = new Iterator, xr
  +    hash = new PerlHash
  +    null value
  +    hash."fromkeys"(sl, value)
  +    $I0 = hash
  +    print $I0
  +    print " "
  +    .local pmc Iter
  +    Iter = iter hash
  +iter_loop:
  +    unless Iter, iter_end            # while (entries) ...
  +    $I0 = shift Iter
  +    print $I0
  +    goto iter_loop
  +iter_end:
  +    print "ok\n"
  +.end
  +CODE
  +/10 [0123456789]{10}ok/
  +OUTPUT
  +
  +output_is(<<'CODE', <<OUTPUT, "string iteration with get_iter");
  +    .include "iterator.pasm"
  +     new P2, .PerlString
  +     set P2, "parrot"
  +     iter P1, P2
  +iter_loop:
  +        unless P1, iter_end          # while (entries) ...
  +     shift S1, P1
  +     print S1
  +     branch iter_loop
  +iter_end:
  +     print "\n"
  +     print P2
  +     print "\n"
  +     end
  +CODE
  +parrot
  +parrot
  +OUTPUT
  +
  +output_is(<<'CODE', <<'OUTPUT', "intlist iter vtable");
  +   .include "iterator.pasm"
  +   new P0, .IntList
  +   push P0, 100
  +   push P0, 200
  +   push P0, 300
  +   push P0, 400
  +   push P0, 500
  +   push P0, 600
  +   push P0, 700
  +   push P0, 800
  +   iter P2, P0
  +   print "ok 1\n"
  +lp:
  +   unless P2, ex
  +   shift I0, P2
  +   print I0
  +   print "\n"
  +   branch lp
  +ex:
  +   print "ok 2\n"
  +   end
  +CODE
  +ok 1
  +100
  +200
  +300
  +400
  +500
  +600
  +700
  +800
  +ok 2
  +OUTPUT
  +
  +output_is(<<'CODE', <<'OUTPUT', "xrange iterator, get_iter");
  +##PIR##
  +.sub main
  +    .include "iterator.pasm"
  +        # xrange(10, 14)
  +     new P2, .Slice [10 .. 14]
  +     P1 = iter  P2
  +#    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
  +
  
  
  
  1.65      +2 -1      parrot/vtable.tbl
  
  Index: vtable.tbl
  ===================================================================
  RCS file: /cvs/public/parrot/vtable.tbl,v
  retrieving revision 1.64
  retrieving revision 1.65
  diff -u -w -r1.64 -r1.65
  --- vtable.tbl        3 Jul 2004 19:49:57 -0000       1.64
  +++ vtable.tbl        6 Jul 2004 06:38:14 -0000       1.65
  @@ -1,4 +1,4 @@
  -# $Id: vtable.tbl,v 1.64 2004/07/03 19:49:57 leo Exp $
  +# $Id: vtable.tbl,v 1.65 2004/07/06 06:38:14 leo Exp $
   # [MAIN] #default section name
   
   void init()
  @@ -255,6 +255,7 @@
   PMC* nextkey_keyed(PMC* key, INTVAL what)
   PMC* nextkey_keyed_int(INTVAL key, INTVAL what)
   PMC* nextkey_keyed_str(STRING* key, INTVAL what)
  +PMC* get_iter()
   
   [STRING]
   void substr(INTVAL offset, INTVAL length, PMC* dest)
  
  
  

Reply via email to