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
+