diff options
| author | Alasdair Armstrong | 2017-04-21 16:38:25 +0100 |
|---|---|---|
| committer | Alasdair Armstrong | 2017-04-21 16:38:25 +0100 |
| commit | ddc325b16d34869091ba033c0869052cc9b8c8c1 (patch) | |
| tree | a0eb4f4c0fa51c86ee84c402d8633a8faa2325f7 | |
| parent | 8f4a6b668e2fa02aa3eb37a62e964e6320b02ee6 (diff) | |
Fixes stack overflow in sail caused by list append in type_internal.ml.
Also makes the check function in type_check tail recursive.
| -rw-r--r-- | src/type_check.ml | 13 | ||||
| -rw-r--r-- | src/type_internal.ml | 2 |
2 files changed, 8 insertions, 7 deletions
diff --git a/src/type_check.ml b/src/type_check.ml index c4119281..f090ef58 100644 --- a/src/type_check.ml +++ b/src/type_check.ml @@ -2521,9 +2521,10 @@ let check_def envs def = (*val check : envs -> tannot defs -> tannot defs*) -let rec check envs (Defs defs) = - match defs with - | [] -> (Defs []),envs - | def::defs -> let (def, envs) = check_def envs def in - let (Defs defs, envs) = check envs (Defs defs) in - (Defs (def::defs)), envs +let check envs (Defs defs) = + let rec check' envs (Defs defs) k = + match defs with + | [] -> k ((Defs []), envs) + | def::defs -> let (def, envs) = check_def envs def in + check' envs (Defs defs) (fun (Defs defs, envs) -> Defs (def::defs), envs) in + check' envs (Defs defs) (fun x -> x) diff --git a/src/type_internal.ml b/src/type_internal.ml index ad7a772e..2eaef407 100644 --- a/src/type_internal.ml +++ b/src/type_internal.ml @@ -3264,7 +3264,7 @@ let merge_bounds b1 b2 = if nexp_eq n1 n2 then b1 else VR_range(v,[Eq((Patt Parse_ast.Unknown),n1,n2)]) | VR_eq(v,n),VR_range(_,ranges) | VR_range(v,ranges),VR_eq(_,n) -> VR_range(v,(Eq((Patt Parse_ast.Unknown),n,n))::ranges) - | VR_range(v,ranges1),VR_range(_,ranges2) -> VR_range(v,ranges1@ranges2) + | VR_range(v,ranges1),VR_range(_,ranges2) -> VR_range(v, List.rev_append (List.rev ranges1) ranges2) | VR_vec_eq(v,n1),VR_vec_eq(_,n2) -> if nexp_eq n1 n2 then b1 else VR_vec_r(v,[Eq((Patt Parse_ast.Unknown),n1,n2)]) | VR_vec_eq(v,n),VR_vec_r(_,ranges) | |
