Home My Page Projects Code Snippets Project Openings diderot
Summary Activity Tracker Tasks SCM

SCM Repository

[diderot] Diff of /branches/lamont_dev/src/compiler/translate/translate.sml
ViewVC logotype

Diff of /branches/lamont_dev/src/compiler/translate/translate.sml

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 1863, Thu Apr 26 18:26:54 2012 UTC revision 1864, Mon Apr 30 12:51:00 2012 UTC
# Line 96  Line 96 
96              env = env, arity = ref arity, nd = IL.Node.mkJOIN [], phiMap = ref VMap.empty,              env = env, arity = ref arity, nd = IL.Node.mkJOIN [], phiMap = ref VMap.empty,
97              predKill = Array.array(arity, false)              predKill = Array.array(arity, false)
98            }            }
99      (* create a new pending-join node with a given CFG Node *)
100        fun newJoinWithNode (env, arity,node) = JOIN{
101                env = env, arity = ref arity, nd = node, phiMap = ref VMap.empty,
102                predKill = Array.array(arity, false)
103              }
104    
105    (* record that a path to the top join in the stack has been killed because f DIE or STABILIZE *)    (* record that a path to the top join in the stack has been killed because f DIE or STABILIZE *)
106      fun killPath ((i, JOIN{arity, predKill, ...}) :: _) = (      fun killPath ((i, JOIN{arity, predKill, ...}) :: _) = (
# Line 265  Line 270 
270                            | (env, NONE) => raise Fail "unimplemented" (* FIXME *)                            | (env, NONE) => raise Fail "unimplemented" (* FIXME *)
271                          (* end case *)                          (* end case *)
272                        end                        end
273            | S.S_Foreach(x,e,blk) => let            | S.S_Foreach(x,blk) => let
274                val x' = newVar x                val x' = lookup env x
275                        val assigns = cvtExp (env, x', e)                val forNode = IL.Node.mkFOREACH{
                       val join = newJoin (env, 1)  
                       val (cfg, _) = cvtBlock (state, env, (0, join)::joinStk, blk)  
                   val cond = IL.Node.mkCOND {  
276                                cond = x',                                cond = x',
277                                trueBranch = IL.Node.dummy,                     stmBranch = IL.Node.dummy
                               falseBranch = IL.Node.dummy  
278                              }                              }
279                          val join = newJoinWithNode(env, 1,forNode)
280                          val (cfg0, _) = cvtBlock (state, env, (0, join)::joinStk, blk)
281               in               in
282                 cvt(env,             case commitJoin (joinStk, join)
283                 IL.CFG.appendNode(cfg,IL.Node.mkFOREACH((x',rhs),IL.CFG.entry cfg)),                           of (env, SOME joinNd) => (
284                 stms)                                if IL.CFG.isEmpty cfg0
285                                    then (
286                       IL.Node.addEdge (IL.CFG.exit cfg, joinNd);
287                                       IL.Node.setPred (joinNd, IL.CFG.exit cfg))
288                                    else (
289                      IL.Node.addEdge (IL.CFG.exit cfg, joinNd);
290                                      IL.Node.setPred (IL.CFG.entry cfg0, joinNd);
291                      IL.Node.setStmBranch(forNode, IL.CFG.entry cfg0);
292                                      IL.Node.addEdge (IL.CFG.exit cfg0, joinNd));
293                    cvt (
294                                    env,
295                                    IL.CFG.concat (
296                                      cfg,
297                                      IL.CFG{entry = joinNd, exit = joinNd}),
298                                    stms))
299                            (* the join node has only zero predecessors, so
300                             * it was killed.
301                             *)
302                              | (env, NONE) => raise Fail "unimplemented" (* FIXME *)
303                            (* end case *)
304               end               end
305    
306                    | S.S_New(strandId, args) => let                    | S.S_New(strandId, args) => let

Legend:
Removed from v.1863  
changed lines
  Added in v.1864

root@smlnj-gforge.cs.uchicago.edu
ViewVC Help
Powered by ViewVC 1.0.0