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

SCM Repository

[diderot] Diff of /trunk/src/compiler/simplify/simplify.sml
ViewVC logotype

Diff of /trunk/src/compiler/simplify/simplify.sml

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

revision 171, Sat Jul 24 14:13:10 2010 UTC revision 221, Tue Aug 3 20:13:55 2010 UTC
# Line 22  Line 22 
22      end      end
23    
24    (* make a block out of a list of statements that are in reverse order *)    (* make a block out of a list of statements that are in reverse order *)
25      fun mkBlock stms = let      fun mkBlock stms = S.Block(List.rev stms)
           fun flatten [] = []  
             | flatten (S.S_Block stms :: r) = stms @ flatten r  
             | flatten (stm :: r) = stm :: flatten r  
           in  
             S.S_Block(flatten (List.rev stms))  
           end  
26    
27      fun transform (AST.Program dcls) = let      fun transform (AST.Program dcls) = let
28            val globals = ref []            val globals = ref []
29            val globalInit = ref []            val globalInit = ref []
30            val actors = ref []            val actors = ref []
31            fun simplifyDecl dcl = (case dcl            fun simplifyDecl dcl = (case dcl
32                   of AST.D_Input(x, NONE) => globals := x :: !globals                   of AST.D_Input(x, NONE) => let
33                          val e' = S.E_Input(Var.nameOf x, NONE)
34                          in
35                            globals := x :: !globals;
36                            globalInit := S.S_Assign(x, e') :: !globalInit
37                          end
38                    | AST.D_Input(x, SOME e) => let                    | AST.D_Input(x, SOME e) => let
39                        val (stms, e') = simplifyExp (e, [])                        val (stms, x') = simplifyExpToVar (e, [])
40                          val e' = S.E_Input(Var.nameOf x, SOME x')
41                        in                        in
 (* FIXME: note that we should add code to check for the input value overriding the default value *)  
42                          globals := x :: !globals;                          globals := x :: !globals;
43                          globalInit := S.S_Assign(x, e') :: (stms @ !globalInit)                          globalInit := S.S_Assign(x, e') :: (stms @ !globalInit)
44                        end                        end
# Line 55  Line 54 
54                  (* end case *))                  (* end case *))
55            in            in
56              List.app simplifyDecl dcls;              List.app simplifyDecl dcls;
57              S.Prog{              S.Program{
58                  globals = List.rev(!globals),                  globals = List.rev(!globals),
59                  globalInit = mkBlock (!globalInit),                  globalInit = mkBlock (!globalInit),
60                  actors = List.rev(!actors)                  actors = List.rev(!actors)
# Line 72  Line 71 
71            val (xs, stm) = simplifyState (state, [], [])            val (xs, stm) = simplifyState (state, [], [])
72            in            in
73              S.Actor{              S.Actor{
74                    name = name,
75                  params = params,                  params = params,
76                  state = xs, stateInit = stm,                  state = xs, stateInit = stm,
77                  methods = List.map simplifyMethod methods                  methods = List.map simplifyMethod methods
# Line 79  Line 79 
79            end            end
80    
81      and simplifyMethod (AST.M_Method(name, body)) =      and simplifyMethod (AST.M_Method(name, body)) =
82            S.M_Method(name, simplifyBlock body)            S.Method(name, simplifyBlock body)
83    
84    (* simplify a statement into a single statement (i.e., a block if it expands into more    (* simplify a statement into a single statement (i.e., a block if it expands into more
85     * than one new statement.     * than one new statement.
# Line 121  Line 121 
121    
122      and simplifyExp (exp, stms) = (      and simplifyExp (exp, stms) = (
123            case exp            case exp
124             of AST.E_Var x => (stms, S.E_Var x)             of AST.E_Var x => (case Var.kindOf x
125                     of Var.BasisVar => let
126                          val ty = Var.monoTypeOf x
127                          val x' = newTemp ty
128                          val stm = S.S_Assign(x', S.E_Apply(x, [], [], ty))
129                          in
130                            (stm::stms, S.E_Var x')
131                          end
132                      | _ => (stms, S.E_Var x)
133                    (* end case *))
134              | AST.E_Lit lit => (stms, S.E_Lit lit)              | AST.E_Lit lit => (stms, S.E_Lit lit)
135              | AST.E_Tuple es => raise Fail "E_Tuple not yet implemented"              | AST.E_Tuple es => raise Fail "E_Tuple not yet implemented"
136              | AST.E_Apply(f, tyArgs, args, ty) => let              | AST.E_Apply(f, tyArgs, args, ty) => let

Legend:
Removed from v.171  
changed lines
  Added in v.221

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