cvsuser     04/06/25 03:20:08

  Modified:    classes  perlhash.pmc slice.pmc
               src      call_list.txt
               t/pmc    iter.t
  Log:
  Pie-thon 8 - fromkeys
  
  Revision  Changes    Path
  1.74      +43 -1     parrot/classes/perlhash.pmc
  
  Index: perlhash.pmc
  ===================================================================
  RCS file: /cvs/public/parrot/classes/perlhash.pmc,v
  retrieving revision 1.73
  retrieving revision 1.74
  diff -u -w -r1.73 -r1.74
  --- perlhash.pmc      24 Jun 2004 16:48:59 -0000      1.73
  +++ perlhash.pmc      25 Jun 2004 10:19:52 -0000      1.74
  @@ -1,6 +1,6 @@
   /*
   Copyright: 2001-2003 The Perl Foundation.  All Rights Reserved.
  -$Id: perlhash.pmc,v 1.73 2004/06/24 16:48:59 leo Exp $
  +$Id: perlhash.pmc,v 1.74 2004/06/25 10:19:52 leo Exp $
   
   =head1 NAME
   
  @@ -32,6 +32,44 @@
   static void
   fromkeys(Interp *interpreter, PMC *self, PMC *keys, PMC *value)
   {
  +    INTVAL elems, dod_disabled, i;
  +    PMC *iter;
  +
  +    if (PMC_IS_NULL(value))
  +        value = pmc_new(interpreter, enum_class_None);
  +
  +    /*
  +     * if the number of keys is bigger then the current PMC
  +     * count, we do one DOD run and then disable DOD/GC
  +     */
  +    dod_disabled = 0;
  +    elems = 999999; /* TODO VTABLE_elements(interpreter, keys); */
  +    if (elems > (INTVAL)interpreter->arena_base->pmc_pool->total_objects) {
  +        Parrot_do_dod_run(interpreter, 0);
  +        Parrot_block_DOD(interpreter);
  +        Parrot_block_GC(interpreter);
  +        dod_disabled = 1;
  +    }
  +    /*
  +     * keys should be able to iterate
  +     * TODO check that
  +     */
  +    if (keys->vtable->base_type == enum_class_Iterator ||
  +            VTABLE_isa(interpreter, keys,
  +                const_string(interpreter, "Iterator"))) {
  +        iter = keys;
  +    }
  +    else
  +        iter = pmc_new_init(interpreter, enum_class_Iterator, keys);
  +    VTABLE_set_integer_native(interpreter, iter, ITERATE_FROM_START);
  +    for (; VTABLE_get_bool(interpreter, iter); ) {
  +        STRING *s = VTABLE_shift_string(interpreter, iter);
  +        VTABLE_set_pmc_keyed_str(interpreter, self, s, value);
  +    }
  +    if (dod_disabled) {
  +        Parrot_unblock_DOD(interpreter);
  +        Parrot_unblock_GC(interpreter);
  +    }
   }
   
   
  @@ -76,6 +114,10 @@
       void class_init() {
           /* class_init_code */
           make_bufferlike_pool(INTERP, sizeof(struct _hash));
  +        if (pass) {
  +            enter_nci_method(INTERP, enum_class_PerlHash,
  +                    F2DPTR(fromkeys), "fromkeys", "vIOPP");
  +        }
       }
   /*
   
  
  
  
  1.7       +8 -2      parrot/classes/slice.pmc
  
  Index: slice.pmc
  ===================================================================
  RCS file: /cvs/public/parrot/classes/slice.pmc,v
  retrieving revision 1.6
  retrieving revision 1.7
  diff -u -w -r1.6 -r1.7
  --- slice.pmc 24 Jun 2004 16:48:59 -0000      1.6
  +++ slice.pmc 25 Jun 2004 10:19:53 -0000      1.7
  @@ -1,6 +1,6 @@
   /*
   Copyright: 2004 The Perl Foundation.  All Rights Reserved.
  -$Id: slice.pmc,v 1.6 2004/06/24 16:48:59 leo Exp $
  +$Id: slice.pmc,v 1.7 2004/06/25 10:19:53 leo Exp $
   
   =head1 NAME
   
  @@ -54,7 +54,9 @@
        */
       if (key_type(interpreter, range) & KEY_integer_FLAG) {
           /* integer key */
  -        if (PObj_get_FLAGS(range) & KEY_inf_slice_FLAG) {
  +        if ((PObj_get_FLAGS(range) &
  +                    (KEY_inf_slice_FLAG|KEY_end_slice_FLAG)) ==
  +                (KEY_inf_slice_FLAG|KEY_end_slice_FLAG)) {
               /*
                * first range is ".. end"
                * start at index 0
  @@ -290,6 +292,10 @@
           return VTABLE_get_integer(INTERP, key);
       }
   
  +    STRING* get_string_keyed(PMC* key) {
  +        INTVAL v = VTABLE_get_integer(INTERP, key);
  +        return string_from_int(INTERP, v);
  +    }
   /*
   
   =item C<PMC* nextkey_keyed (PMC* agg, INTVAL what)>
  
  
  
  1.35      +3 -0      parrot/src/call_list.txt
  
  Index: call_list.txt
  ===================================================================
  RCS file: /cvs/public/parrot/src/call_list.txt,v
  retrieving revision 1.34
  retrieving revision 1.35
  diff -u -w -r1.34 -r1.35
  --- call_list.txt     22 Jun 2004 17:01:37 -0000      1.34
  +++ call_list.txt     25 Jun 2004 10:19:58 -0000      1.35
  @@ -193,6 +193,9 @@
   v    IOP
   P    Ii
   
  +# PerlHash fromkeys
  +v    IOPP
  +
   # Oddball ones for postgres
   p    ptiLTLLi
   p    pi33ipi
  
  
  
  1.20      +188 -2    parrot/t/pmc/iter.t
  
  Index: iter.t
  ===================================================================
  RCS file: /cvs/public/parrot/t/pmc/iter.t,v
  retrieving revision 1.19
  retrieving revision 1.20
  diff -u -w -r1.19 -r1.20
  --- iter.t    24 Jun 2004 16:49:04 -0000      1.19
  +++ iter.t    25 Jun 2004 10:20:08 -0000      1.20
  @@ -1,6 +1,6 @@
   #! perl -w
   # Copyright: 2001-2003 The Perl Foundation.  All Rights Reserved.
  -# $Id: iter.t,v 1.19 2004/06/24 16:49:04 leo Exp $
  +# $Id: iter.t,v 1.20 2004/06/25 10:20:08 leo Exp $
   
   =head1 NAME
   
  @@ -16,7 +16,7 @@
   
   =cut
   
  -use Parrot::Test tests => 31;
  +use Parrot::Test tests => 37;
   use Test::More qw(skip);
   
   output_is(<<'CODE', <<'OUTPUT', "new iter");
  @@ -676,6 +676,32 @@
   ok
   OUTPUT
   
  +output_is(<<'CODE', <<'OUTPUT', "slice iter end range");
  +   .include "iterator.pasm"
  +   new P0, .PerlArray
  +   push P0, 100
  +   push P0, 200
  +   push P0, 300
  +   push P0, 400
  +   push P0, 500
  +   slice P2, P0[2 ..]
  +   set P2, .ITERATE_FROM_START
  +lp:
  +   unless P2, ex
  +   shift I0, P2
  +   print I0
  +   print "\n"
  +   branch lp
  +ex:
  +   print "ok\n"
  +   end
  +CODE
  +300
  +400
  +500
  +ok
  +OUTPUT
  +
   output_is(<<'CODE', <<'OUTPUT', "slice iter start range, value");
      .include "iterator.pasm"
      new P0, .PerlArray
  @@ -1037,3 +1063,163 @@
   3
   ok
   OUTPUT
  +
  +output_like(<<'CODE', <<'OUTPUT', "hash fromkeys - string");
  +##PIR##
  +.sub main @MAIN
  +    .include "iterator.pasm"
  +    .local pmc hash
  +    .local pmc value
  +    .local pmc str
  +    str = new PerlString
  +    str = "abcdef"
  +    hash = new PerlHash
  +    null value
  +    hash."fromkeys"(str, value)
  +    $I0 = hash
  +    print $I0
  +    print " "
  +    .local pmc iter
  +    iter = new .Iterator, hash
  +    iter = .ITERATE_FROM_START
  +iter_loop:
  +    unless iter, iter_end            # while (entries) ...
  +    $S0 = shift iter
  +    print $S0
  +    print ""
  +    goto iter_loop
  +iter_end:
  +    print "ok\n"
  +.end
  +CODE
  +/6 [abcdef]{6}ok/
  +OUTPUT
  +
  +output_like(<<'CODE', <<'OUTPUT', "hash fromkeys - array");
  +##PIR##
  +.sub main @MAIN
  +    .include "iterator.pasm"
  +    .local pmc hash
  +    .local pmc value
  +    .local pmc ar
  +    ar = new PerlArray
  +    push ar, "a"
  +    push ar, "b"
  +    push ar, "c"
  +    push ar, "d"
  +    push ar, "e"
  +    hash = new PerlHash
  +    null value
  +    hash."fromkeys"(ar, value)
  +    $I0 = hash
  +    print $I0
  +    print " "
  +    .local pmc iter
  +    iter = new .Iterator, hash
  +    iter = .ITERATE_FROM_START
  +iter_loop:
  +    unless iter, iter_end            # while (entries) ...
  +    $S0 = shift iter
  +    print $S0
  +    goto iter_loop
  +iter_end:
  +    print "ok\n"
  +.end
  +
  +CODE
  +/5 [abcde]{5}ok/
  +OUTPUT
  +
  +
  +output_is(<<'CODE', <<'OUTPUT', "slice, get strings from array");
  +##PIR##
  +.sub main @MAIN
  +    .include "iterator.pasm"
  +    .local pmc ar
  +    ar = new PerlArray
  +    push ar, "a"
  +    push ar, "b"
  +    push ar, "c"
  +    push ar, "d"
  +    push ar, "e"
  +    .local pmc iter
  +    iter = slice ar[1 ..]
  +    iter = .ITERATE_FROM_START
  +iter_loop:
  +    unless iter, iter_end            # while (entries) ...
  +    $S0 = shift iter
  +    print $S0
  +    goto iter_loop
  +iter_end:
  +    print "ok\n"
  +.end
  +CODE
  +bcdeok
  +OUTPUT
  +
  +output_like(<<'CODE', <<'OUTPUT', "hash fromkeys - array slice");
  +##PIR##
  +.sub main @MAIN
  +    .include "iterator.pasm"
  +    .local pmc hash
  +    .local pmc value
  +    .local pmc ar
  +    ar = new PerlArray
  +    push ar, "a"
  +    push ar, "b"
  +    push ar, "c"
  +    push ar, "d"
  +    push ar, "e"
  +    .local pmc sl
  +    sl = slice ar[1 ..]
  +    hash = new PerlHash
  +    null value
  +    hash."fromkeys"(sl, value)
  +    $I0 = hash
  +    print $I0
  +    print " "
  +    .local pmc iter
  +    iter = new .Iterator, hash
  +    iter = .ITERATE_FROM_START
  +iter_loop:
  +    unless iter, iter_end            # while (entries) ...
  +    $S0 = shift iter
  +    print $S0
  +    goto iter_loop
  +iter_end:
  +    print "ok\n"
  +.end
  +CODE
  +/4 [bcde]{4}ok/
  +OUTPUT
  +
  +output_like(<<'CODE', <<'OUTPUT', "hash fromkeys - xrange");
  +##PIR##
  +.sub main @MAIN
  +    .include "iterator.pasm"
  +    .local pmc hash
  +    .local pmc value
  +    .local pmc xr
  +    xr = new Slice
  +    .local pmc sl
  +    sl = slice xr[0 .. 10]
  +    hash = new PerlHash
  +    null value
  +    hash."fromkeys"(sl, value)
  +    $I0 = hash
  +    print $I0
  +    print " "
  +    .local pmc iter
  +    iter = new .Iterator, hash
  +    iter = .ITERATE_FROM_START
  +iter_loop:
  +    unless iter, iter_end            # while (entries) ...
  +    $S0 = shift iter
  +    print $S0
  +    goto iter_loop
  +iter_end:
  +    print "ok\n"
  +.end
  +CODE
  +/10 [0123456789]{10}ok/
  +OUTPUT
  
  
  

Reply via email to