Skip to content

Commit

Permalink
update codegen
Browse files Browse the repository at this point in the history
  • Loading branch information
tserg committed Jul 3, 2022
1 parent e9e2458 commit 7ff48af
Show file tree
Hide file tree
Showing 2 changed files with 24 additions and 4 deletions.
16 changes: 13 additions & 3 deletions vyper/codegen/core.py
Original file line number Diff line number Diff line change
Expand Up @@ -290,20 +290,30 @@ def append_dyn_array(darray_node, elem_node):
return IRnode.from_list(b1.resolve(b2.resolve(ret)))


def pop_dyn_array(darray_node, return_popped_item):
def pop_dyn_array(darray_node, return_popped_item, idx=None):
assert isinstance(darray_node.typ, DArrayType)
assert darray_node.encoding == Encoding.VYPER
ret = ["seq"]
with darray_node.cache_when_complex("darray") as (b1, darray_node):
old_len = clamp("gt", get_dyn_array_count(darray_node), 0)

if idx is not None:
old_len = clamp("gt", get_dyn_array_count(darray_node), idx)
else:
old_len = clamp("gt", get_dyn_array_count(darray_node), 0)

new_len = IRnode.from_list(["sub", old_len, 1], typ="uint256")

if idx is not None:
pop_idx = IRnode.from_list([idx], typ="uint256")
else:
pop_idx = new_len

with new_len.cache_when_complex("new_len") as (b2, new_len):
ret.append(STORE(darray_node, new_len))

# NOTE skip array bounds check bc we already asserted len two lines up
if return_popped_item:
popped_item = get_element_ptr(darray_node, new_len, array_bounds_check=False)
popped_item = get_element_ptr(darray_node, pop_idx, array_bounds_check=False)
ret.append(popped_item)
typ = popped_item.typ
location = popped_item.location
Expand Down
12 changes: 11 additions & 1 deletion vyper/codegen/stmt.py
Original file line number Diff line number Diff line change
Expand Up @@ -141,6 +141,7 @@ def parse_Call(self):
# TODO: consider moving this to builtins
darray = Expr(self.stmt.func.value, self.context).ir_node
args = [Expr(x, self.context).ir_node for x in self.stmt.args]

if self.stmt.func.attr == "append":
# sanity checks
assert len(args) == 1
Expand All @@ -150,8 +151,17 @@ def parse_Call(self):

return append_dyn_array(darray, arg)
else:

assert len(args) == 0
return pop_dyn_array(darray, return_popped_item=False)

# Get kwargs
if self.stmt.keywords:
assert self.stmt.keywords[0].arg == "ix"
idx = self.stmt.keywords[0].value.value
return pop_dyn_array(darray, return_popped_item=False, idx=idx)

else:
return pop_dyn_array(darray, return_popped_item=False)

elif is_self_function:
return self_call.ir_for_self_call(self.stmt, self.context)
Expand Down

0 comments on commit 7ff48af

Please sign in to comment.