diff options
Diffstat (limited to 'compiler/Substitute.ml')
-rw-r--r-- | compiler/Substitute.ml | 31 |
1 files changed, 19 insertions, 12 deletions
diff --git a/compiler/Substitute.ml b/compiler/Substitute.ml index 30469c2f..eb61f076 100644 --- a/compiler/Substitute.ml +++ b/compiler/Substitute.ml @@ -274,7 +274,7 @@ let call_substitute (tsubst : T.TypeVarId.id -> T.ety) (call : A.call) : A.call dest; } -(** Apply a type substitution to a statement *) +(** Apply a type substitution to a statement - TODO: use a map iterator *) let rec statement_substitute (tsubst : T.TypeVarId.id -> T.ety) (st : A.statement) : A.statement = { st with A.content = raw_statement_substitute tsubst st.content } @@ -305,23 +305,30 @@ and raw_statement_substitute (tsubst : T.TypeVarId.id -> T.ety) | A.Sequence (st1, st2) -> A.Sequence (statement_substitute tsubst st1, statement_substitute tsubst st2) - | A.Switch (op, tgts) -> - A.Switch - (operand_substitute tsubst op, switch_targets_substitute tsubst tgts) + | A.Switch switch -> A.Switch (switch_substitute tsubst switch) | A.Loop le -> A.Loop (statement_substitute tsubst le) -(** Apply a type substitution to switch targets *) -and switch_targets_substitute (tsubst : T.TypeVarId.id -> T.ety) - (tgts : A.switch_targets) : A.switch_targets = - match tgts with - | A.If (st1, st2) -> - A.If (statement_substitute tsubst st1, statement_substitute tsubst st2) - | A.SwitchInt (int_ty, tgts, otherwise) -> +(** Apply a type substitution to a switch *) +and switch_substitute (tsubst : T.TypeVarId.id -> T.ety) (switch : A.switch) : + A.switch = + match switch with + | A.If (op, st1, st2) -> + A.If + ( operand_substitute tsubst op, + statement_substitute tsubst st1, + statement_substitute tsubst st2 ) + | A.SwitchInt (op, int_ty, tgts, otherwise) -> let tgts = List.map (fun (sv, st) -> (sv, statement_substitute tsubst st)) tgts in let otherwise = statement_substitute tsubst otherwise in - A.SwitchInt (int_ty, tgts, otherwise) + A.SwitchInt (operand_substitute tsubst op, int_ty, tgts, otherwise) + | A.Match (p, tgts, otherwise) -> + let tgts = + List.map (fun (sv, st) -> (sv, statement_substitute tsubst st)) tgts + in + let otherwise = statement_substitute tsubst otherwise in + A.Match (place_substitute tsubst p, tgts, otherwise) (** Apply a type substitution to a function body. Return the local variables and the body. *) |