@VisitorCore.visit.dispatch
def visit(self, node: astx.ListAppend) -> None:
"""
title: Visit ListAppend nodes.
parameters:
node:
type: astx.ListAppend
"""
append_fn = self.require_runtime_symbol(
LIST_RUNTIME_FEATURE,
LIST_APPEND_SYMBOL,
)
list_ptr = self._lvalue_address(node.base)
self.visit_child(node.value)
value = safe_pop(self.result_stack)
if value is None:
raise Exception("dynamic list append requires a value")
element_type = list_element_type(self._resolved_ast_type(node.base))
if element_type is None:
raise Exception(
"dynamic list append requires a single concrete element type"
)
value = self._cast_ast_value(
value,
source_type=self._resolved_ast_type(node.value),
target_type=element_type,
)
llvm_element_type = self._list_element_llvm_type(node.base)
value_ptr = self._llvm.ir_builder.alloca(
llvm_element_type,
name="irx_list_append_value",
)
self._llvm.ir_builder.store(value, value_ptr)
raw_value_ptr = self._llvm.ir_builder.bitcast(
value_ptr,
self._llvm.INT8_TYPE.as_pointer(),
name="irx_list_append_bytes",
)
result = self._llvm.ir_builder.call(
append_fn,
[list_ptr, raw_value_ptr],
name="irx_list_append_status",
)
self.result_stack.append(result)