Skip to content
Snippets Groups Projects
Commit 698f6f8f authored by E. Rivas's avatar E. Rivas
Browse files

Merge branch er433/monomorphisation/commute with refs/heads/dev into refs/merge-requests/2763/train

parents f274e905 bcc91206
No related branches found
No related tags found
Loading
Pipeline #952443265 passed
author: er433
description: "\\n"
merge_request: '2763'
title: "Monomorphisation: add commutation with `let`"
type: fixed
\ No newline at end of file
......@@ -4,6 +4,10 @@ let test basename = "./" ^ basename
let pwd = Caml.Sys.getcwd ()
let () = Caml.Sys.chdir "../../test/contracts/polymorphism/"
let%expect_test _ =
run_ligo_good [ "compile"; "contract"; test "monomorphisation_let.mligo" ];
[%expect {| { parameter unit ; storage int ; code { CDR ; NIL operation ; PAIR } } |}]
let%expect_test _ =
run_ligo_good
[ "compile"
......
......@@ -4,6 +4,7 @@ open Ligo_prim
module Row = AST.Row
let fold_map_expression = AST.Helpers.fold_map_expression
let map_expression = AST.Helpers.map_expression
let poly_name ~loc v = Value_var.fresh_like ~loc v
module Instance = struct
......@@ -459,8 +460,57 @@ let check_if_polymorphism_present ~raise e =
e
(* This function commutes `(let x = t in u)@{T}` into `let x = t in
(u@{T})` to cover more cases, as the next pass assumes that type
instantiation was on variable or another type instance *)
let commute e =
let e =
map_expression
(fun e ->
match e.expression_content with
| E_type_inst
{ forall =
{ expression_content =
E_let_in { let_binder; rhs; let_result; attributes }
; _
}
; type_
} ->
let let_result =
{ let_result with
expression_content = E_type_inst { forall = let_result; type_ }
; type_expression = e.type_expression
}
in
{ e with
expression_content = E_let_in { let_binder; rhs; let_result; attributes }
}
| E_type_inst
{ forall =
{ expression_content =
E_let_mut_in { let_binder; rhs; let_result; attributes }
; _
}
; type_
} ->
let let_result =
{ let_result with
expression_content = E_type_inst { forall = let_result; type_ }
; type_expression = e.type_expression
}
in
{ e with
expression_content = E_let_mut_in { let_binder; rhs; let_result; attributes }
}
| _ -> e)
e
in
e
let mono_polymorphic_expr ~raise e =
let e = Deduplicate_binders.program e in
let e = commute e in
let _, m = mono_polymorphic_expression ~raise Data.empty e in
let m = check_if_polymorphism_present ~raise m in
m
let empty (n : nat) : 42 sapling_state = let _n = n in Tezos.sapling_empty_state
let main (_, s : unit * int) : operation list * int =
let s4 = empty in
let () = ignore s4 in
(([] : operation list), s)
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment