Author: fperrad
Date: Sun Jun 10 23:37:05 2007
New Revision: 18921

Modified:
   trunk/languages/lua/lib/luaaux.pir
   trunk/languages/lua/src/PASTGrammar.tg
   trunk/languages/lua/src/POSTGrammar.tg

Log:
[Lua]
- PAST/POST: fornum

Modified: trunk/languages/lua/lib/luaaux.pir
==============================================================================
--- trunk/languages/lua/lib/luaaux.pir  (original)
+++ trunk/languages/lua/lib/luaaux.pir  Sun Jun 10 23:37:05 2007
@@ -658,9 +658,11 @@
     .param pmc a
     .param pmc b
     if a goto L1
-    .return (a)
+    $P0 = clone a
+    .return ($P0)
   L1:
-    .return (b)
+    $P0 = clone b
+    .return ($P0)
 .end
 
 
@@ -672,9 +674,11 @@
     .param pmc a
     .param pmc b
     unless a goto L1
-    .return (a)
+    $P0 = clone a
+    .return ($P0)
   L1:
-    .return (b)
+    $P0 = clone b
+    .return ($P0)
 .end
 
 

Modified: trunk/languages/lua/src/PASTGrammar.tg
==============================================================================
--- trunk/languages/lua/src/PASTGrammar.tg      (original)
+++ trunk/languages/lua/src/PASTGrammar.tg      Sun Jun 10 23:37:05 2007
@@ -185,6 +185,7 @@
     name.'init'('node'=>node, 'name'=>$S0, 'scope'=>'lexical', 'ismy'=>1, 
'islvalue'=>1)
     explist = new .ResizablePMCArray
     $P0 = node['expression']
+    $I0 = $P0
     .local pmc iter
     iter = new .Iterator, $P0
   L1:
@@ -194,6 +195,10 @@
     push explist, $P1
     goto L1
   L2:
+    unless $I0 < 3 goto L3
+    $P1 = name.'new'('PAST::Val', 'node'=>node, 'vtype'=>'.LuaNumber', 
'name'=>'1', 'ctype'=>'n+')
+    push explist, $P1
+  L3:
     .return name.'new'('PAST::Op', name, explist, 'node'=>node, 
'pasttype'=>'fornum')
 }
 

Modified: trunk/languages/lua/src/POSTGrammar.tg
==============================================================================
--- trunk/languages/lua/src/POSTGrammar.tg      (original)
+++ trunk/languages/lua/src/POSTGrammar.tg      Sun Jun 10 23:37:05 2007
@@ -342,51 +342,60 @@
 
 
 transform fornum (PAST::Op) :language('PIR') {
-    internal_error("not implemented (fornum)")
     .local pmc endlabels
     endlabels = get_hll_global ['Lua::POST'], '@endlabels'
-    .local pmc ops, var, limit, step, blk
+    .local pmc ops, e_var, e_limit, e_step, blk, zero
+    .local string var, limit, step
     ops = new 'POST::Ops'
     ops.'init'('node'=>node)
-
     $P0 = node[1]
     $P1 = $P0[0]
-    $P2 = tree.'get'('post', $P1)
-    ops.'push'($P2)
-    var = ops.'push_pirop'('new')
-    var.'arglist'(var, '.LuaNil')
-#    ops.'push_pirop'('set', var, $P2)
-
+    e_var = tree.'get'('post', $P1)
+    ops.'push'(e_var)
     $P1 = $P0[1]
-    $P2 = tree.'get'('post', $P1)
-    ops.'push'($P2)
-    limit = ops.'push_pirop'('new')
-    limit.'arglist'(limit, '.LuaNil')
-#    ops.'push_pirop'('set', limit, $P2)
-
+    e_limit = tree.'get'('post', $P1)
+    ops.'push'(e_limit)
     $P1 = $P0[2]
-    if $P1 goto L1
-    goto L2
-    $P2 = ops.'push_pirop'('new')
-    $P2.'arglist'($P2, '.LuaNumber')
-    $P2 = ops.'push_pirop'('set', $P2, '1', 'result'=>$P2)
-    #ops.'result'($P2)
-  L1:
-    $P2 = tree.'get'('post', $P1)
-    ops.'push'($P2)
-  L2:
-    step = ops.'push_pirop'('new')
-    step.'arglist'(step, '.LuaNil')
-#    ops.'push_pirop'('set', step, $P2)
-
-    .local pmc looplabel, endlabel
+    e_step = tree.'get'('post', $P1)
+    ops.'push'(e_step)
+    var = ops.'unique'('$P')
+    limit = ops.'unique'('$P')
+    step = ops.'unique'('$P')
+    ops.'push_pirop'('inline', '    (%0, %1, %2) = checkforloop(%3, %4, %5)', 
var, limit, step, e_var, e_limit, e_step)
+    .local string v
+    $P0 = node[0]
+    $S0 = $P0.'name'()
+    v = node.'escape'($S0)
+    $P1 = tree.'get'('post', $P0)
+    ops.'push'($P1)
+    zero = ops.'push_pirop'('new')
+    zero.'arglist'(zero, '.LuaNumber')
+    ops.'push_pirop'('set', zero, '0.0')
+    .local pmc looplabel, endlabel, orlabel, blklabel
     $S0 = node.'unique'('fornum_')
     looplabel = ops.'new'('POST::Label', 'result'=>$S0)
-    $S0 = concat $S0, '_end'
-    endlabel = ops.'new'('POST::Label', 'result'=>$S0)
+    $S1 = concat $S0, '_or'
+    orlabel = ops.'new'('POST::Label', 'result'=>$S1)
+    $S1 = concat $S0, '_blk'
+    blklabel = ops.'new'('POST::Label', 'result'=>$S1)
+    $S1 = concat $S0, '_end'
+    endlabel = ops.'new'('POST::Label', 'result'=>$S1)
+    unshift endlabels, endlabel
     ops.'push'(looplabel)
-
+    ops.'push_pirop'('inline', '    unless %0 > %1 goto %2', step, zero, 
orlabel)
+    ops.'push_pirop'('inline', '    unless %0 <= %1 goto %2', var, limit, 
endlabel)
+    ops.'push_pirop'('goto', blklabel)
+    ops.'push'(orlabel)
+    ops.'push_pirop'('inline', '    unless %0 >= %1 goto %2', var, limit, 
endlabel)
+    ops.'push'(blklabel)
+    ops.'push_pirop'('store_lex', v, var)
+    $P0 = node[2]
+    blk = tree.'get'('post', $P0)
+    ops.'push'(blk)
+    ops.'push_pirop'('add', var, step)
+    ops.'push_pirop'('goto', looplabel)
     ops.'push'(endlabel)
+    $P0 = shift endlabels
     .return (ops)
 }
 
@@ -395,18 +404,27 @@
     internal_error("not implemented (forlist)")
     .local pmc endlabels
     endlabels = get_hll_global ['Lua::POST'], '@endlabels'
-    .local pmc ops, var, limit, step, blk
+    .local pmc ops, blk, nil
     ops = new 'POST::Ops'
     ops.'init'('node'=>node)
 
+
+    nil = ops.'push_pirop'('new')
+    nil.'arglist'(nil, '.LuaNil')
     .local pmc looplabel, endlabel
     $S0 = node.'unique'('forlist_')
     looplabel = ops.'new'('POST::Label', 'result'=>$S0)
     $S0 = concat $S0, '_end'
     endlabel = ops.'new'('POST::Label', 'result'=>$S0)
+    unshift endlabels, endlabel
     ops.'push'(looplabel)
 
+    $P0 = node[2]
+    blk = tree.'get'('post', $P0)
+    ops.'push'(blk)
+    ops.'push_pirop'('goto', looplabel)
     ops.'push'(endlabel)
+    $P0 = shift endlabels
     .return (ops)
 }
 

Reply via email to