cvsuser     03/06/29 18:21:08

  Modified:    languages/BASIC/compiler COMP_expressions.pm
                        COMP_parsefuncs.pm COMP_parser.pm
                        RT_aggregates.pasm testsuite.pl
  Log:
  Impatient waiting for PerlHash->keys(), Parrot BASIC now has a KEYS x$(), y()
  statement (assign keys of y or y$() to x$()) implemented using a array/hash 
structure.
  Performance penalty is O(n) on stores, none on array fetches.
  
  Revision  Changes    Path
  1.18      +1 -0      parrot/languages/BASIC/compiler/COMP_expressions.pm
  
  Index: COMP_expressions.pm
  ===================================================================
  RCS file: /cvs/public/parrot/languages/BASIC/compiler/COMP_expressions.pm,v
  retrieving revision 1.17
  retrieving revision 1.18
  diff -u -w -r1.17 -r1.18
  --- COMP_expressions.pm       29 Jun 2003 22:43:48 -0000      1.17
  +++ COMP_expressions.pm       30 Jun 2003 01:21:08 -0000      1.18
  @@ -60,6 +60,7 @@
                        uevent unlock until using
                        view
                        wait while wend width window write
  +                     keys
                );
   
   sub dumpq {
  
  
  
  1.22      +21 -1     parrot/languages/BASIC/compiler/COMP_parsefuncs.pm
  
  Index: COMP_parsefuncs.pm
  ===================================================================
  RCS file: /cvs/public/parrot/languages/BASIC/compiler/COMP_parsefuncs.pm,v
  retrieving revision 1.21
  retrieving revision 1.22
  diff -u -w -r1.21 -r1.22
  --- COMP_parsefuncs.pm        29 Jun 2003 22:43:48 -0000      1.21
  +++ COMP_parsefuncs.pm        30 Jun 2003 01:21:08 -0000      1.22
  @@ -17,6 +17,22 @@
   @selects=();
   my $scopes=0;
   my @data=();
  +sub parse_keys {
  +     feedme();
  +     my $targ=$syms[CURR];
  +     feedme();
  +     feedme() while($syms[CURR] =~ /[(),]/);
  +     my $source=$syms[CURR];
  +     feedme();       
  +     feedme() while($syms[CURR] =~ /[(),]/);
  +     $targ.=$seg;
  +     $source.=$seg;
  +     push @{$code{$seg}->{code}}, <<KEYS;
  +     .arg "$targ"
  +     .arg "$source"
  +     call _ARRAY_KEYS
  +KEYS
  +}
   sub parse_common {
        feedme();
        while($type[CURR] !~ /COMP|COMM|STMT/) {
  @@ -1088,8 +1104,12 @@
                        push @{$code{$seg}->{code}}, <<DIMARR;
        # Set aside storage for Array $var
        \$P0 = new PerlHash
  +     \$P2 = new PerlArray
  +     \$P3 = new PerlHash
  +     \$P3["index"]=\$P2
  +     \$P3["hash"]=\$P0
        find_global \$P1, "BASICARR"
  -     set \$P1["$var$seg"], \$P0
  +     set \$P1["$var$seg"], \$P3
        store_global "BASICARR", \$P1
        #
   DIMARR
  
  
  
  1.15      +1 -1      parrot/languages/BASIC/compiler/COMP_parser.pm
  
  Index: COMP_parser.pm
  ===================================================================
  RCS file: /cvs/public/parrot/languages/BASIC/compiler/COMP_parser.pm,v
  retrieving revision 1.14
  retrieving revision 1.15
  diff -u -w -r1.14 -r1.15
  --- COMP_parser.pm    29 Jun 2003 22:43:48 -0000      1.14
  +++ COMP_parser.pm    30 Jun 2003 01:21:08 -0000      1.15
  @@ -140,7 +140,7 @@
                while | wend | dim | type | exit | function | for | next |
                do | loop | goto | gosub | return  | sub | call | select | case |
                read | restore | input | open | close | on | randomize | stop | swap |
  -             common | cls | locate | color
  +             common | cls | locate | color | keys
                )$/x) {
                no strict 'refs';
                &{"parse_" . $1}();
  
  
  
  1.6       +62 -7     parrot/languages/BASIC/compiler/RT_aggregates.pasm
  
  Index: RT_aggregates.pasm
  ===================================================================
  RCS file: /cvs/public/parrot/languages/BASIC/compiler/RT_aggregates.pasm,v
  retrieving revision 1.5
  retrieving revision 1.6
  diff -u -w -r1.5 -r1.6
  --- RT_aggregates.pasm        29 Jun 2003 22:43:48 -0000      1.5
  +++ RT_aggregates.pasm        30 Jun 2003 01:21:08 -0000      1.6
  @@ -16,7 +16,8 @@
        .return $P0             # Return the whole array.
        branch ARR_END
   ARR_NORMAL:
  -     set $N0, $P0[key]
  +     $P1=$P0["hash"]         # forked arrays, awaiting keys()
  +     set $N0, $P1[key]
        .return $N0
   ARR_END:
        restoreall
  @@ -35,7 +36,8 @@
        .return $P0
        branch ARR_END
   ARR_NORMAL:
  -     set $S0, $P0[key]
  +     $P1=$P0["hash"]         # forked arrays, awaiting keys()
  +     set $S0, $P1[key]
        .return $S0
   ARR_END:
        restoreall
  @@ -57,7 +59,8 @@
   
        call _ARRAY_BUILDKEY   # Will absorb rest of arguments.
        .result key
  -     set $P0, BASICARR[array]
  +     set $P1, BASICARR[array]
  +     set $P0, $P1["hash"]
        set $P0[key], rhs
        store_global "BASICARR", BASICARR
        branch END_ASSIGN
  @@ -73,7 +76,8 @@
   
        call _ARRAY_BUILDKEY   # Will absorb rest of arguments.
        .result key
  -     set $P0, BASICARR[array]
  +     set $P1, BASICARR[array]
  +     set $P0, $P1["hash"]
        set $P0[key], rhs
        store_global "BASICARR", BASICARR
        branch END_ASSIGN
  @@ -86,7 +90,8 @@
        .local PerlHash BASICARR
        find_global BASICARR, "BASICARR"
        call _ARRAY_BUILDKEY
  -     set $P0, BASICARR[array]
  +     set $P1, BASICARR[array]
  +     set $P0, $P1["hash"]
        .result key
   
        set $S0, blob[TYPE]
  @@ -117,7 +122,57 @@
        end
   
   END_ASSIGN:  
  -     restoreall
  +     # Temporary, needed only until PerlHash->keys() gets implemented
  +     find_global BASICARR, "BASICARR"
  +     set $P1, BASICARR[array]
  +     set $P0, $P1["index"]
  +     .local int i
  +     set i, 0
  +E_A: set $S0, $P0[i]
  +     eq $S0, "", E_A2
  +     eq $S0, key, E_A2
  +     inc i
  +     branch E_A
  +E_A2:        $P0[i]=key
  +     $P1["index"]=$P0
  +     BASICARR[array]=$P1
  +     store_global "BASICARR", BASICARR
  +REALEND:restoreall
  +     ret
  +.end
  +# This gets a *lot* easier when PerlHash->keys() gets implemented
  +.sub _ARRAY_KEYS     # void ARRAY_KEYS(string source, string target)
  +     saveall
  +     .param string source
  +     .param string target
  +     .local PerlHash BASICARR
  +
  +     .local PerlArray SRCINDEX
  +     .local PerlHash TARGARR
  +     .local PerlArray TARGINDEX
  +     .local int i
  +     find_global BASICARR, "BASICARR"
  +     $P0=BASICARR[source]
  +     SRCINDEX=$P0["index"]
  +     $P0=BASICARR[target]
  +     TARGARR=$P0["hash"]
  +     TARGINDEX=$P0["index"]
  +
  +     set i, 0
  +KEYLOOP:set $S0, SRCINDEX[i]
  +     eq $S0, "", ENDLOOP
  +     set $S1, i
  +     set $S2, "|"
  +     concat $S2, $S2, $S1
  +     length $I1, $S0
  +     dec $I1
  +     substr $S3, $S0, 1, $I1
  +     TARGARR[$S2]=$S3
  +     TARGINDEX[i]=$S2
  +     inc i
  +     branch KEYLOOP
  + 
  +ENDLOOP:restoreall
        ret
   .end
   #.sub _ARRAY_ASSIGN_S        # void ARRAY_ASSIGN_N(string array, string rhs, int 
keycount[, string|float keys])
  
  
  
  1.15      +26 -1     parrot/languages/BASIC/compiler/testsuite.pl
  
  Index: testsuite.pl
  ===================================================================
  RCS file: /cvs/public/parrot/languages/BASIC/compiler/testsuite.pl,v
  retrieving revision 1.14
  retrieving revision 1.15
  diff -u -w -r1.14 -r1.15
  --- testsuite.pl      29 Jun 2003 22:43:48 -0000      1.14
  +++ testsuite.pl      30 Jun 2003 01:21:08 -0000      1.15
  @@ -32,6 +32,32 @@
   }
   
   __DATA__
  +' Expect 10
  +sub second(b() )
  +     b(5)=10
  +end sub
  +sub first(a() )
  +     call second(a())
  +end sub
  +dim t(),f()
  +call first(t())
  +print t(5)
  +
  +' Keys test, "interesting"
  +dim a$(),b$()
  +b$("Key 1")="This is"
  +b$("Key 2")="an"
  +B$("Hi Mom!")="interesting"
  +B$(0)="development.
  +keys a$(), b$()
  +i=0
  +do
  +     t$=a$(i)
  +     print t$,
  +     print tab$(10),b$(t$)
  +     i=i+1
  +loop while t$ <> ""
  +
   ' 5 and PI
   dim a$(), m()
   a$(1)="5"
  @@ -52,7 +78,6 @@
   next i
   close #5
   print
  -
   
   ' Expect 5, 0, "Hello"
   common i, a$
  
  
  

Reply via email to