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

SCM Repository

[diderot] Diff of /trunk/src/compiler/IL/check-il-fn.sml
ViewVC logotype

Diff of /trunk/src/compiler/IL/check-il-fn.sml

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

revision 405, Fri Oct 15 04:42:42 2010 UTC revision 410, Fri Oct 15 19:31:53 2010 UTC
# Line 11  Line 11 
11      type rator      type rator
12      type ty      type ty
13    
14      (* returns the signature of an operator as (rng, dom). *)
15      val sigOf : rator -> ty * ty list      val sigOf : rator -> ty * ty list
16    
17      (* return the type of a CONS, where the argument types
18       * are given.  Returns NONE if the argument types are
19       * invalid for the IL.
20       *)
21        val typeOfCons : ty list -> ty option
22    
23    end    end
24    
25  functor CheckILFn (  functor CheckILFn (
# Line 31  Line 38 
38      structure V = IL.Var      structure V = IL.Var
39      structure VSet = V.Set      structure VSet = V.Set
40    
41      fun checkVar bvs x = if VSet.member(x, bvs)      datatype token
42          = S of string | V of V.var | TY of Ty.ty | TYS of Ty.ty list
43    
44        fun err errBuf toks = let
45              fun tok2str (S s) = s
46                | tok2str (V x) = Var.nameOf x
47                | tok2str (TY ty) = TU.toString ty
48                | tok2str (TYS []) = "()"
49                | tok2str (TYS[ty]) = TU.toString ty
50                | tok2str (TYS tys) = String.concat[
51                      "(", String.concatWith " * " (List.map TU.toString tys), ")"
52                    ]
53              in
54                errBuf := concat ("**** Error: " :: List.map tok2str toks)
55                  :: !errBuf
56              end
57    
58        fun checkVar errFn bvs x = if VSet.member(x, bvs)
59            then ()            then ()
60            else (* error *)            else errFn [S "variable ", V x, " is not bound\n"]
61    
62      fun chkAssign (bvs, y, rhs) = (      fun chkAssign errFn (bvs, y, rhs) = (
63            (* check that y is not bound twice *)            (* check that y is not bound twice *)
64              if VSet.member(y, bvs)              if VSet.member(y, bvs)
65                then (* error *)                then errFn [S "variable ", V y, " is bound twice\n"]
66                else ();                else ();
67              case rhs              case rhs
68               of IL.VAR x => (               of IL.VAR x => (
69                    checkVar bvs x;                    checkVar bvs x;
70                    if Ty.same(V.ty y, V.ty x)                    if Ty.same(V.ty y, V.ty x)
71                      then ()                      then ()
72                      else (* error *))                      else errFn [
73                            S "type mismatch: ", T(V.ty y), S " <> ",
74                            T (V.ty x), S "\n"
75                          ])
76                | IL.LIT lit => let                | IL.LIT lit => let
77                    val ty = (case lit                    val ty = (case lit
78                           of IL.Int _ => Ty.IntTy                           of IL.Int _ => Ty.IntTy
# Line 56  Line 83 
83                    in                    in
84                      if Ty.same(V.ty y, ty)                      if Ty.same(V.ty y, ty)
85                        then ()                        then ()
86                        else (* error *)                        else errFn [
87                            S "type mismatch: ", T(V.ty y), S " <> ",
88                            T ty, S "\n"
89                          ]
90                    end                    end
91                | IL.OP(rator, xs) => let                | IL.OP(rator, xs) => let
92                    val (resTy, argTys) = OpTy.sigOf rator                    val (resTy, argTys) = OpTy.sigOf rator
# Line 64  Line 94 
94                      List.app (checkVar bvs) xs;                      List.app (checkVar bvs) xs;
95                      if Ty.same(V.ty y, resTy)                      if Ty.same(V.ty y, resTy)
96                        then ()                        then ()
97                        else (* error *);                        else errFn [
98                            S "type mismatch: ", T(V.ty y), S " <> ",
99                            T resTy, S "\n"
100                          ];
101                      if ListPair.allEq (fn (x, ty) => Ty.same(V.ty x, ty)) (xs, argsTys)                      if ListPair.allEq (fn (x, ty) => Ty.same(V.ty x, ty)) (xs, argsTys)
102                        then ()                        then ()
103                        else (* error *)                        else (* error *)
104                    end                    end
105                | IL.CONS xs => (                | IL.CONS xs => (
106                    List.app (checkVar bvs) xs;                    List.app (checkVar bvs) xs;
107  (* FIXME: check type of y *)())                    case OpTy.typeOfCons (List.map V.ty xs)
108                       of NONE => (* error *)
109                        | SOME ty => if Ty.same(V.ty y, ty)
110                            then ()
111                            else (* error *)
112                      (* end case *))
113              (* end case *);              (* end case *);
114              VSet.add(bvs, y))              VSet.add(bvs, y))
115    
116      fun checkPhi (bvs, y, xs) = let      fun checkPhi errFn (bvs, y, xs) = let
117            val ty = V.ty y            val ty = V.ty y
118            in            in
119            (* check that y is not bound twice *)            (* check that y is not bound twice *)
120              if VSet.member(y, bvs)              if VSet.member(y, bvs)
121                then (* error *)                then errFn [S "variable ", V y, " is bound twice\n"]
122                else ();                else ();
123            (* check that rhs vars have the correct type *)            (* check that rhs vars have the correct type *)
124              if List.all (fn x => Ty.same(V.ty x, ty)) xs              if List.all (fn x => Ty.same(V.ty x, ty)) xs

Legend:
Removed from v.405  
changed lines
  Added in v.410

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