diff options
author | Jun FURUSE / 古瀬 淳 <jun.furuse@gmail.com> | 2002-06-28 12:12:12 +0000 |
---|---|---|
committer | Jun FURUSE / 古瀬 淳 <jun.furuse@gmail.com> | 2002-06-28 12:12:12 +0000 |
commit | e44a179ce932c3bc012103de9ff3e2afe7c6c1cb (patch) | |
tree | 1b469fc80422e9f9b72632a7864812159befaac9 | |
parent | 51f4311ac89e9b42b23e861578de740ac988f171 (diff) | |
download | ocaml-e44a179ce932c3bc012103de9ff3e2afe7c6c1cb.tar.gz |
fix Oval_dynamic
git-svn-id: http://caml.inria.fr/svn/ocaml/branches/dynamics@4966 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02
-rw-r--r-- | typing/outcometree.mli | 2 | ||||
-rw-r--r-- | typing/typecore.ml | 52 |
2 files changed, 20 insertions, 34 deletions
diff --git a/typing/outcometree.mli b/typing/outcometree.mli index 717a381674..80966f4053 100644 --- a/typing/outcometree.mli +++ b/typing/outcometree.mli @@ -60,7 +60,7 @@ type out_value = | Oval_tuple of out_value list | Oval_variant of string * out_value option (* GENERIC (dynamic values are not longer printable...) - | Oval_dynamic of out_value * out_type + | Oval_dynamic of out_value option * out_type /GENERIC *) (* DYN *) | Oval_dynamic of out_type diff --git a/typing/typecore.ml b/typing/typecore.ml index 5e4ebd95d4..c6761dd3fb 100644 --- a/typing/typecore.ml +++ b/typing/typecore.ml @@ -383,9 +383,9 @@ let rec type_pat env sp = pat_loc = sp.ppat_loc; pat_type = p1.pat_type; pat_env = env } - | Ppat_constraint(sp, sty) -> + | Ppat_constraint(sp, (lv,sty)) -> let p = type_pat env sp in - let ty = Typetexp.transl_simple_type env false sty in + let ty = Typetexp.transl_simple_type env false ~local_vars:lv sty in unify_pat env p ty; p | Ppat_type lid -> @@ -678,8 +678,8 @@ let rec type_approx env sexp = | Pexp_sequence (_,e) -> type_approx env e | Pexp_constraint (e, sty1, sty2) -> let ty = type_approx env e - and ty1 = match sty1 with None -> newvar () | Some sty -> approx_type sty - and ty2 = match sty1 with None -> newvar () | Some sty -> approx_type sty + and ty1 = match sty1 with None -> newvar () | Some (_(* DYN *),sty) -> approx_type sty + and ty2 = match sty1 with None -> newvar () | Some (_(* DYN *),sty) -> approx_type sty in begin try unify env ty ty1; unify env ty1 ty2; ty2 with Unify trace -> @@ -951,17 +951,18 @@ let rec type_exp env sexp = exp_type = instance Predef.type_unit; exp_env = env } | Pexp_constraint(sarg, sty, sty') -> +(* DYN: local variables *) let (arg, ty') = match (sty, sty') with (None, None) -> (* Case actually unused *) let arg = type_exp env sarg in (arg, arg.exp_type) - | (Some sty, None) -> - let ty = Typetexp.transl_simple_type env false sty in + | (Some (lvs,sty), None) -> + let ty = Typetexp.transl_simple_type env false ~local_vars:lvs sty in (type_expect env sarg ty, ty) - | (None, Some sty') -> + | (None, Some (lvs',sty')) -> let (ty', force) = - Typetexp.transl_simple_type_delayed env sty' + Typetexp.transl_simple_type_delayed env ~local_vars:lvs' sty' in let arg = type_exp env sarg in begin match arg.exp_desc, !self_coercion, (repr ty').desc with @@ -978,11 +979,11 @@ let rec type_exp env sexp = end end; (arg, ty') - | (Some sty, Some sty') -> + | (Some (lvs,sty), Some (lvs',sty')) -> let (ty, force) = - Typetexp.transl_simple_type_delayed env sty + Typetexp.transl_simple_type_delayed env ~local_vars:lvs sty and (ty', force') = - Typetexp.transl_simple_type_delayed env sty' + Typetexp.transl_simple_type_delayed env ~local_vars:lvs' sty' in begin try let force'' = subtype env ty ty' in @@ -996,6 +997,7 @@ let rec type_exp env sexp = exp_loc = arg.exp_loc; exp_type = ty'; exp_env = env } +(* /DYN *) | Pexp_when(scond, sbody) -> let cond = type_expect env scond (instance Predef.type_bool) in let body = type_exp env sbody in @@ -1166,21 +1168,10 @@ let rec type_exp env sexp = exp_env = env; } (* DYN *) - | Pexp_dynamic (se,stopt) -> - let e = - match stopt with - | Some st -> - let t_expected = Typetexp.transl_type_scheme_for_dynamic env st in - begin_def (); - let e = type_expect env se t_expected in - end_def (); - e - | None -> - begin_def (); - let e = type_exp env se in - end_def (); - e - in + | Pexp_dynamic (se) -> + begin_def (); + let e = type_exp env se in + end_def (); (* We do not generalize the type here. The generalization and closedness check will be done after all the types become stable (i.e. at the compilation) *) @@ -1198,14 +1189,9 @@ let rec type_exp env sexp = exp_type= Predef.type_dyn; exp_env= env; } - | Pexp_import (sarg,stopt) -> + | Pexp_import (sarg) -> let arg = type_expect env sarg Predef.type_dyn in - let ty_res = - match stopt with - | Some st -> - Typetexp.transl_type_scheme_for_dynamic env st - | None -> newvar () - in + let ty_res = newvar () in { exp_desc = Texp_import (arg); exp_loc = sexp.pexp_loc; exp_type = ty_res; |