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

SCM Repository

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

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

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

revision 1444, Mon Jul 11 12:11:53 2011 UTC revision 1640, Wed Nov 16 02:19:51 2011 UTC
# Line 139  Line 139 
139                    dim = checkDim (cxt, dim),                    dim = checkDim (cxt, dim),
140                    shape = checkShape (cxt, shape)                    shape = checkShape (cxt, shape)
141                  }                  }
142              | PT.T_Seq(ty, dim) => Ty.T_Sequence(checkTy(cxt, ty), checkDim (cxt, dim))              | PT.T_Seq(ty, dim) => let
143                    val ty = checkTy(cxt, ty)
144                    in
145                      if TU.isValueType ty
146                        then Ty.T_Sequence(ty, checkDim (cxt, dim))
147                        else err(cxt, [S "elements of sequence types must be value types"])
148                    end
149            (* end case *))            (* end case *))
150    
151      fun checkLit lit = (case lit      fun checkLit lit = (case lit
# Line 313  Line 319 
319              | PT.E_Subscript(e1, e2) => let              | PT.E_Subscript(e1, e2) => let
320                  val (e1', ty1) = checkExpr (env, cxt, e1)                  val (e1', ty1) = checkExpr (env, cxt, e1)
321                  val (e2', ty2) = checkExpr (env, cxt, e2)                  val (e2', ty2) = checkExpr (env, cxt, e2)
322                    val (tyArgs, Ty.T_Fun(domTy, rngTy)) = Util.instantiate(Var.typeOf BV.subscript)
323                  in                  in
324                    raise Fail "E_Subscript not yet implemented" (* FIXME *)                    if U.matchTypes(domTy, [ty1, ty2])
325                        then let
326                          val exp = AST.E_Apply(BasisVars.subscript, tyArgs, [e1', e2'], rngTy)
327                          in
328                            (exp, rngTy)
329                          end
330                        else err (cxt, [
331                            S "type error for sequence subscript\n",
332                            S "  expected:  ", TYS domTy, S "\n",
333                            S "  but found: ", TYS[ty1, ty2]
334                          ])
335                  end                  end
336              | PT.E_Apply(e, args) => let              | PT.E_Apply(e, args) => let
337                  fun stripMark (PT.E_Mark{tree, ...}) = stripMark tree                  fun stripMark (PT.E_Mark{tree, ...}) = stripMark tree
# Line 370  Line 387 
387                    raise Fail "E_Tuple not yet implemented" (* FIXME *)                    raise Fail "E_Tuple not yet implemented" (* FIXME *)
388                  end                  end
389              | PT.E_Sequence args => let              | PT.E_Sequence args => let
390                  val (args, tys) = checkExprList (env, cxt, args)                  val (args, ty::tys) = checkExprList (env, cxt, args)
391                  in                  in
392                    raise Fail "E_Sequence not yet implemented" (* FIXME *)                    if TU.isValueType(TU.pruneHead ty)
393                        then let
394                          fun chkTy ty' = U.matchType(ty, ty')
395                          val resTy = Ty.T_Sequence(ty, Ty.DimConst(List.length args))
396                          in
397                            if List.all chkTy tys
398                              then (AST.E_Cons args, resTy)
399                              else err(cxt, [S "arguments of sequence expression must have same type"])
400                          end
401                        else err(cxt, [S "sequence expression of non-value argument type"])
402                  end                  end
403              | PT.E_Cons args => let              | PT.E_Cons args => let
404                  val (args, ty::tys) = checkExprList (env, cxt, args)                  val (args, ty::tys) = checkExprList (env, cxt, args)
# Line 554  Line 580 
580                    | _ => err(cxt, [S "\"stabilize\" statment outside of method"])                    | _ => err(cxt, [S "\"stabilize\" statment outside of method"])
581                  (* end case *);                  (* end case *);
582                  (AST.S_Stabilize, env))                  (AST.S_Stabilize, env))
583                | PT.S_Print args => let
584                    fun chkArg e = let
585                          val (e', ty) = checkExpr (env, cxt, e)
586                          in
587                            if TU.isValueType ty
588                              then ()
589                              else err(cxt, [
590                                  S "expected value type in print, but found ", TY ty
591                               ]);
592                            e'
593                          end
594                    val args' = List.map chkArg args
595                    in
596                      (AST.S_Print args', env)
597                    end
598            (* end case *))            (* end case *))
599    
600      fun checkParams (env, cxt, params) = let      fun checkParams (env, cxt, params) = let
# Line 613  Line 654 
654          (* get the list of methods defined by the user *)          (* get the list of methods defined by the user *)
655            val methodNames = List.map (fn (AST.M_Method(name, _)) => name) methods            val methodNames = List.map (fn (AST.M_Method(name, _)) => name) methods
656          (* if the stabilize method is not provided, add one *)          (* if the stabilize method is not provided, add one *)
657            val methods = if List.exists (fn MethodName.Stabilize => true | _ => false) methodNames            val methods = if List.exists (fn StrandUtil.Stabilize => true | _ => false) methodNames
658                  then methods                  then methods
659                  else methods @ [AST.M_Method(MethodName.Stabilize, AST.S_Block[])]                  else methods @ [AST.M_Method(StrandUtil.Stabilize, AST.S_Block[])]
660            in            in
661  (* FIXME: should check for duplicate method definitions *)  (* FIXME: should check for duplicate method definitions *)
662              if not(List.exists (fn MethodName.Update => true | _ => false) methodNames)              if not(List.exists (fn StrandUtil.Update => true | _ => false) methodNames)
663                then err(cxt, [S "strand ", A name, S " is missing an update method"])                then err(cxt, [S "strand ", A name, S " is missing an update method"])
664                else ();                else ();
665              AST.D_Strand{name = name, params = params, state = vds, methods = methods}              AST.D_Strand{name = name, params = params, state = vds, methods = methods}

Legend:
Removed from v.1444  
changed lines
  Added in v.1640

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