Author: fperrad
Date: Fri Jun  8 06:36:22 2007
New Revision: 18875

Modified:
   trunk/languages/lua/src/PASTGrammar.tg
   trunk/languages/lua/src/POSTGrammar.tg

Log:
[Lua]
- PAST/POST : vararg, break

Modified: trunk/languages/lua/src/PASTGrammar.tg
==============================================================================
--- trunk/languages/lua/src/PASTGrammar.tg      (original)
+++ trunk/languages/lua/src/PASTGrammar.tg      Fri Jun  8 06:36:22 2007
@@ -15,6 +15,9 @@
 
 
 transform past (ROOT) :language('PIR') {
+    $P0 = new .Integer
+    set $P0, 0
+    set_hll_global ['Lua::PAST'], '$looplevel', $P0
     .local pmc past
     $P0 = new 'Lua::Symbtab'
     $P0.'push_scope'()
@@ -119,6 +122,9 @@
 
 
 transform past (Lua::Grammar::while_stat) :language('PIR') {
+    .local pmc looplevel
+    looplevel = get_hll_global ['Lua::PAST'], '$looplevel'
+    inc looplevel
     .local pmc expr, blk
     $P0 = node['expression']
     expr = tree.'get'('past', $P0, 'Lua::Grammar::expression')
@@ -127,11 +133,15 @@
     symbtab.'push_scope'()
     $P0 = node['block']
     blk = tree.'get'('past', $P0, 'Lua::Grammar::block')
+    dec looplevel
     .return expr.'new'('PAST::Op', expr, blk, 'node'=>node, 
'pasttype'=>'while')
 }
 
 
 transform past (Lua::Grammar::repeat_stat) :language('PIR') {
+    .local pmc looplevel
+    looplevel = get_hll_global ['Lua::PAST'], '$looplevel'
+    inc looplevel
     .local pmc expr, blk
     .local pmc symbtab
     symbtab = get_hll_global ['Lua::PAST'], '$symbtab'
@@ -140,11 +150,15 @@
     blk = tree.'get'('past', $P0, 'Lua::Grammar::block')
     $P0 = node['expression']
     expr = tree.'get'('past', $P0, 'Lua::Grammar::expression')
+    dec looplevel
     .return expr.'new'('PAST::Op', blk, expr, 'node'=>node, 
'pasttype'=>'repeat')
 }
 
 
 transform past (Lua::Grammar::for_stat) :language('PIR') {
+    .local pmc looplevel
+    looplevel = get_hll_global ['Lua::PAST'], '$looplevel'
+    inc looplevel
     .local pmc past
     $S0 = node.'find_key'()
     $P0 = node[$S0]
@@ -153,6 +167,7 @@
     $P0 = node['for_body']
     $P0 = $P0['block']
     $P1 = tree.'get'('past', $P0, 'Lua::Grammar::block')
+    dec looplevel
     past.'push'($P1)
     .return (past)
 }
@@ -280,10 +295,15 @@
 
 
 transform past (Lua::Grammar::break_statement) :language('PIR') {
+    .local pmc looplevel
+    looplevel = get_hll_global ['Lua::PAST'], '$looplevel'
+    if looplevel <= 0 goto L1
     .local pmc past
     past = new 'PAST::Op'
-    past.'init'(node, 'node'=>node, 'pasttype'=>'break')
+    past.'init'('node'=>node, 'pasttype'=>'break')
     .return (past)
+  L1:
+    node.'syntax_error'("no loop to break")
 }
 
 
@@ -452,19 +472,33 @@
     goto L4
   L3:
     $P1 = $P0['vararg']
+    $I0 = 0
     if null $P1 goto L2
     $P1 = shift $P1
     var = new 'PAST::Var'
     var.'init'('node'=>$P1, 'name'=>'vararg', 'scope'=>'parameter', 
'isslurpy'=>1)
     push parlist, var
+    $I0 = 1
     goto L5
   L2:
     var = new 'PAST::Var'
     var.'init'('node'=>$P0, 'name'=>'extra', 'scope'=>'parameter', 
'isslurpy'=>1)
     push parlist, var
   L5:
+    .local pmc has_vararg
+    has_vararg = get_hll_global ['Lua::PAST'], '?vararg'
+    $P0 = new .Boolean
+    set $P0, $I0
+    set_hll_global ['Lua::PAST'], '?vararg', $P0
+    .local pmc looplevel
+    looplevel = get_hll_global ['Lua::PAST'], '$looplevel'
+    $P0 = new .Integer
+    set $P0, 0
+    set_hll_global ['Lua::PAST'], '$looplevel', $P0
     $P0 = node['block']
     past = tree.'get'('past', $P0, 'Lua::Grammar::block')
+    set_hll_global ['Lua::PAST'], '$looplevel', looplevel
+    set_hll_global ['Lua::PAST'], '?vararg', has_vararg
     .return past.'new'('PAST::Block', parlist :flat, past, 'node'=>node)
 }
 
@@ -662,10 +696,15 @@
 
 
 transform past (Lua::Grammar::vararg) :language('PIR') {
+    .local pmc has_vararg
+    has_vararg = get_hll_global ['Lua::PAST'], '?vararg'
+    unless has_vararg goto L1
     .local pmc past
     new past, 'PAST::Op'
     past.'init'('node'=>node, 'pasttype'=>'vararg')
     .return (past)
+  L1:
+    node.'syntax_error'("cannot use '...' outside a vararg function")
 }
 
 

Modified: trunk/languages/lua/src/POSTGrammar.tg
==============================================================================
--- trunk/languages/lua/src/POSTGrammar.tg      (original)
+++ trunk/languages/lua/src/POSTGrammar.tg      Fri Jun  8 06:36:22 2007
@@ -438,18 +438,12 @@
 transform break (PAST::Op) :language('PIR') {
     .local pmc endlabels
     endlabels = get_hll_global ['Lua::POST'], '@endlabels'
-    $I0 = endlabels
-    unless $I0 > 0 goto L1
     .local pmc post
     post = new 'POST::Op'
     post.'init'('node'=>node, 'pirop'=>'goto')
     $P0 = endlabels[0]
     post.'arglist'($P0)
     .return (post)
-  L1:
-    $P0 = get_hll_global ['Lua::Grammar'], 'syntax_error'
-    $P1 = node[0]
-    $P1.$P0("no loop to break")
 }
 
 

Reply via email to