Author: fperrad
Date: Fri Feb 10 00:00:30 2006
New Revision: 11496

Modified:
   trunk/languages/lua/Lua/build.pm
   trunk/languages/lua/lib/luapir.pir
   trunk/languages/lua/t/fornum.t
Log:
Lua :
- improve numeric for

Modified: trunk/languages/lua/Lua/build.pm
==============================================================================
--- trunk/languages/lua/Lua/build.pm    (original)
+++ trunk/languages/lua/Lua/build.pm    Fri Feb 10 00:00:30 2006
@@ -790,76 +790,21 @@ sub BuildForNum {

        push @opcodes, @{$e_start->[1]};

        push @opcodes, @{$e_limit->[1]};

        push @opcodes, @{$e_step->[1]};

-       my $global = get_global($parser);

-       push @opcodes, @{$global->[1]};

-       my $key_tonumber = BuildLiteral($parser, "tonumber", "key");

-       push @opcodes, @{$key_tonumber->[1]};

-       my $fct_tonumber = new_tmp($parser, "pmc");

-       push @opcodes, new LocalDir($parser,

-                       'result'                                =>      
$fct_tonumber,

-       );

-       push @opcodes, new KeyedGetOp($parser,

-                       'result'                                =>      
$fct_tonumber,

-                       'arg1'                                  =>      
$global->[0],

-                       'arg2'                                  =>      
$key_tonumber->[0],

-       );

-       push @opcodes, new CallOp($parser,

-                       'result'                                =>      [ 
$var->[0] ],

-                       'arg1'                                  =>      
$fct_tonumber,

-                       'arg2'                                  =>      [ 
$e_start->[0]],

-       );

        my $limit = new_tmp($parser, "pmc", "number");

        push @opcodes, new LocalDir($parser,

                        'result'                                =>      $limit,

        );

-       push @opcodes, new CallOp($parser,

-                       'result'                                =>      [ 
$limit ],

-                       'arg1'                                  =>      
$fct_tonumber,

-                       'arg2'                                  =>      [ 
$e_limit->[0]],

-       );

        my $step = new_tmp($parser, "pmc", "number");

        push @opcodes, new LocalDir($parser,

                        'result'                                =>      $step,

        );

+       my $fct = new defn("checkforloop", "util");

        push @opcodes, new CallOp($parser,

-                       'result'                                =>      [ $step 
],

-                       'arg1'                                  =>      
$fct_tonumber,

-                       'arg2'                                  =>      [ 
$e_step->[0]],

-       );

-       my $lbl_err = new_label($parser);

-       push @opcodes, new BranchUnlessOp($parser,

-                       'arg1'                                  =>      
$var->[0],

-                       'result'                                =>      
$lbl_err,

-       );

-       push @opcodes, new BranchUnlessOp($parser,

-                       'arg1'                                  =>      $limit,

-                       'result'                                =>      
$lbl_err,

-       );

-       push @opcodes, new BranchUnlessOp($parser,

-                       'arg1'                                  =>      $step,

-                       'result'                                =>      
$lbl_err,

+                       'result'                                =>      [ 
$var->[0], $limit, $step ],

+                       'arg1'                                  =>      $fct,

+                       'arg2'                                  =>      [ 
$e_start->[0], $e_limit->[0], $e_step->[0] ],

        );

        my $lbl_loop = new_label($parser);

-       push @opcodes, new BranchOp($parser,

-                       'result'                                =>      
$lbl_loop,

-       );

-       push @opcodes, new LabelOp($parser,

-                       'arg1'                                  =>      
$lbl_err,

-       );

-       my $key_error = BuildLiteral($parser, "error", "key");

-       push @opcodes, @{$key_error->[1]};

-       my $fct_error = new_tmp($parser, "pmc");

-       push @opcodes, new LocalDir($parser,

-                       'result'                                =>      
$fct_error,

-       );

-       push @opcodes, new KeyedGetOp($parser,

-                       'result'                                =>      
$fct_error,

-                       'arg1'                                  =>      
$global->[0],

-                       'arg2'                                  =>      
$key_error->[0],

-       );

-       push @opcodes, new CallOp($parser,

-                       'arg1'                                  =>      
$fct_error,

-       );

        push @opcodes, new LabelOp($parser,

                        'arg1'                                  =>      
$lbl_loop,

        );


Modified: trunk/languages/lua/lib/luapir.pir
==============================================================================
--- trunk/languages/lua/lib/luapir.pir  (original)
+++ trunk/languages/lua/lib/luapir.pir  Fri Feb 10 00:00:30 2006
@@ -39,6 +39,33 @@ L1:
 .end
 
 
+=item C<checkforloop (start, limit, step)>
+
+=cut
+
+.sub checkforloop
+    .param pmc start
+    .param pmc limit
+    .param pmc step
+    .local pmc ret_start
+    ret_start = start."tonumber"()
+    if ret_start goto L1
+    error("`for' initial value must be a number")
+L1:    
+    .local pmc ret_limit
+    ret_limit = limit."tonumber"()
+    if ret_limit goto L2
+    error("`for' limit must be a number")
+L2:    
+    .local pmc ret_step
+    ret_step = step."tonumber"()
+    if ret_step goto L3
+    error("`for' step must be a number")
+L3:    
+    .return (ret_start, ret_limit, ret_step)
+.end
+
+
 =item C<checknumber (arg)>
 
 =cut

Modified: trunk/languages/lua/t/fornum.t
==============================================================================
--- trunk/languages/lua/t/fornum.t      (original)
+++ trunk/languages/lua/t/fornum.t      Fri Feb 10 00:00:30 2006
@@ -22,7 +22,7 @@ use strict;

 use FindBin;

 use lib "$FindBin::Bin";

 

-use Parrot::Test tests => 8;

+use Parrot::Test tests => 10;

 use Test::More;

 

 language_output_is( 'lua', <<'CODE', <<'OUT', 'for 1, 10, 2' );

@@ -106,3 +106,33 @@ CODE

 3

 OUT

 

+language_output_is( 'lua', <<'CODE', <<'OUT', 'for tonumber' );

+local function first() print("first",1); return 1 end

+local function limit() print("limit",8); return 8 end

+local function step()  print("step",2);  return 2 end

+

+for i = first(), limit(), step() do

+    print(i)

+end

+CODE

+first  1

+limit  8

+step   2

+1

+3

+5

+7

+OUT

+

+language_output_like( 'lua', <<'CODE', <<'OUT', 'for tonumber' );

+local function first() return 1 end

+local function limit() return end

+local function step()  return 2 end

+

+for i = first(), limit(), step() do

+    print(i)

+end

+CODE

+/`for' limit must be a number/

+OUT

+

Reply via email to