From d07b321b2598f81128361141bef75c2e9f38868c Mon Sep 17 00:00:00 2001 From: Ulf Norell Date: Mon, 5 Jul 2021 09:29:43 +0200 Subject: [PATCH] Fix #324: bug when compiling default init in the presence of child contracts --- src/aeso_ast_to_fcode.erl | 5 +++-- test/aeso_compiler_tests.erl | 1 + test/contracts/child_contract_init_bug.aes | 8 ++++++++ 3 files changed, 12 insertions(+), 2 deletions(-) create mode 100644 test/contracts/child_contract_init_bug.aes diff --git a/src/aeso_ast_to_fcode.erl b/src/aeso_ast_to_fcode.erl index 8083b53..17e83df 100644 --- a/src/aeso_ast_to_fcode.erl +++ b/src/aeso_ast_to_fcode.erl @@ -330,10 +330,11 @@ to_fcode(Env, [{Contract, Attrs, Con = {con, _, Name}, Decls}|Rest]) case Contract =:= contract_interface of false -> #{ builtins := Builtins } = Env, - ConEnv = Env#{ context => {contract_def, Name}, + ConEnv = maps:remove(state_layout, + Env#{ context => {contract_def, Name}, builtins => Builtins#{[Name, "state"] => {get_state, none}, [Name, "put"] => {set_state, 1}, - [Name, "Chain", "event"] => {chain_event, 1}} }, + [Name, "Chain", "event"] => {chain_event, 1}} }), #{ functions := PrevFuns } = ConEnv, #{ functions := Funs } = Env1 = decls_to_fcode(ConEnv, Decls), diff --git a/test/aeso_compiler_tests.erl b/test/aeso_compiler_tests.erl index eb7969d..1df9bf3 100644 --- a/test/aeso_compiler_tests.erl +++ b/test/aeso_compiler_tests.erl @@ -199,6 +199,7 @@ compilable_contracts() -> "clone", "clone_simple", "create", + "child_contract_init_bug", "test" % Custom general-purpose test file. Keep it last on the list. ]. diff --git a/test/contracts/child_contract_init_bug.aes b/test/contracts/child_contract_init_bug.aes new file mode 100644 index 0000000..1397a99 --- /dev/null +++ b/test/contracts/child_contract_init_bug.aes @@ -0,0 +1,8 @@ +contract Identity = + record state = {foo: int, bar: string} + entrypoint init() = {foo = 0, bar = ""} + +main contract IdentityService = + stateful entrypoint createNewIdentity() : Identity = + put(()) + Chain.create()