From 7fac53d7922c7fd497667a0d0f0686c76707cbfa Mon Sep 17 00:00:00 2001 From: Charles Cooper Date: Fri, 17 May 2024 17:51:47 -0400 Subject: [PATCH 1/2] fix[codegen]: fix double eval in dynarray append/pop append/pop does not have an eval once fence for the cases where it is in memory. add a fence. --- vyper/codegen/core.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/vyper/codegen/core.py b/vyper/codegen/core.py index f834f1da55..f20dc3d3b6 100644 --- a/vyper/codegen/core.py +++ b/vyper/codegen/core.py @@ -401,7 +401,8 @@ def append_dyn_array(darray_node, elem_node): ) # store new length - ret.append(STORE(darray_node, ["add", len_, 1])) + ret.append(ensure_eval_once(STORE(darray_node, ["add", len_, 1]))) + return IRnode.from_list(b1.resolve(b2.resolve(ret))) @@ -415,7 +416,7 @@ def pop_dyn_array(darray_node, return_popped_item): with new_len.cache_when_complex("new_len") as (b2, new_len): # store new length - ret.append(STORE(darray_node, new_len)) + ret.append(ensure_eval_once(STORE(darray_node, new_len))) # NOTE skip array bounds check bc we already asserted len two lines up if return_popped_item: From cab0e05fa91be9775de0e8ae41ede22478ebabf7 Mon Sep 17 00:00:00 2001 From: Charles Cooper Date: Fri, 17 May 2024 17:58:45 -0400 Subject: [PATCH 2/2] fix signature --- vyper/codegen/core.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/vyper/codegen/core.py b/vyper/codegen/core.py index f20dc3d3b6..c41baed401 100644 --- a/vyper/codegen/core.py +++ b/vyper/codegen/core.py @@ -401,7 +401,7 @@ def append_dyn_array(darray_node, elem_node): ) # store new length - ret.append(ensure_eval_once(STORE(darray_node, ["add", len_, 1]))) + ret.append(ensure_eval_once("append_dynarray", STORE(darray_node, ["add", len_, 1]))) return IRnode.from_list(b1.resolve(b2.resolve(ret))) @@ -416,7 +416,7 @@ def pop_dyn_array(darray_node, return_popped_item): with new_len.cache_when_complex("new_len") as (b2, new_len): # store new length - ret.append(ensure_eval_once(STORE(darray_node, new_len))) + ret.append(ensure_eval_once("pop_dynarray", STORE(darray_node, new_len))) # NOTE skip array bounds check bc we already asserted len two lines up if return_popped_item: