mirror of
https://github.com/roc-lang/roc.git
synced 2025-10-03 00:24:34 +00:00
Fix the type of inner_list_ptr
This commit is contained in:
parent
450c36e3c5
commit
6241578831
1 changed files with 26 additions and 21 deletions
|
@ -1537,7 +1537,7 @@ fn list_append<'a, 'ctx, 'env>(
|
|||
fn list_join<'a, 'ctx, 'env>(
|
||||
env: &Env<'a, 'ctx, 'env>,
|
||||
parent: FunctionValue<'ctx>,
|
||||
outer_wrapper_struct: StructValue<'ctx>,
|
||||
outer_list_wrapper: StructValue<'ctx>,
|
||||
outer_list_layout: &Layout<'a>,
|
||||
) -> BasicValueEnum<'ctx> {
|
||||
match outer_list_layout {
|
||||
|
@ -1555,22 +1555,14 @@ fn list_join<'a, 'ctx, 'env>(
|
|||
let inner_list_type =
|
||||
basic_type_from_layout(env.arena, ctx, &inner_list_layout, env.ptr_bytes);
|
||||
|
||||
let outer_list_type =
|
||||
basic_type_from_layout(env.arena, ctx, &outer_list_layout, env.ptr_bytes);
|
||||
|
||||
let outer_list_len = load_list_len(builder, outer_wrapper_struct);
|
||||
|
||||
let outer_list_len = load_list_len(builder, outer_list_wrapper);
|
||||
let outer_list_ptr = {
|
||||
let ptr_type = get_ptr_type(&outer_list_type, AddressSpace::Generic);
|
||||
let elem_ptr_type = get_ptr_type(&inner_list_type, AddressSpace::Generic);
|
||||
|
||||
load_list_ptr(builder, outer_wrapper_struct, ptr_type)
|
||||
load_list_ptr(builder, outer_list_wrapper, elem_ptr_type)
|
||||
};
|
||||
|
||||
let dest_elem_ptr_name = "#destelem";
|
||||
let dest_elem_ptr_alloca = builder.build_alloca(
|
||||
get_ptr_type(&elem_type, AddressSpace::Generic),
|
||||
dest_elem_ptr_name,
|
||||
);
|
||||
let dest_elem_ptr_alloca = builder.build_alloca(elem_ptr_type, "dest_elem");
|
||||
|
||||
// outer_list_len > 0
|
||||
// We do this check to avoid allocating memory. If the input
|
||||
|
@ -1612,11 +1604,19 @@ fn list_join<'a, 'ctx, 'env>(
|
|||
builder.build_store(index_alloca, next_index);
|
||||
|
||||
// The pointer to the list in the outer list (the list of lists)
|
||||
let inner_list_ptr = unsafe {
|
||||
builder.build_in_bounds_gep(outer_list_ptr, &[curr_index], "load_index")
|
||||
let inner_list_ptr = {
|
||||
let wrapper_ptr = unsafe {
|
||||
builder.build_in_bounds_gep(outer_list_ptr, &[curr_index], "load_index")
|
||||
};
|
||||
let wrapper = builder
|
||||
.build_load(wrapper_ptr, "inner_list_wrapper")
|
||||
.into_struct_value();
|
||||
let elem_ptr_type = get_ptr_type(&elem_type, AddressSpace::Generic);
|
||||
|
||||
load_list_ptr(builder, wrapper, elem_ptr_type)
|
||||
};
|
||||
|
||||
let inner_list = builder.build_load(inner_list_ptr, "get_elem");
|
||||
let inner_list = builder.build_load(inner_list_ptr, "inner_list");
|
||||
let inner_list_len = load_list_len(builder, inner_list.into_struct_value());
|
||||
|
||||
let next_list_sum = builder.build_int_add(
|
||||
|
@ -1682,12 +1682,17 @@ fn list_join<'a, 'ctx, 'env>(
|
|||
builder.build_store(index_alloca, next_index);
|
||||
|
||||
// The pointer to the list in the outer list (the list of lists)
|
||||
let inner_list_ptr = unsafe {
|
||||
builder.build_in_bounds_gep(outer_list_ptr, &[curr_index], "load_index")
|
||||
};
|
||||
let inner_list_ptr = {
|
||||
let wrapper_ptr = unsafe {
|
||||
builder.build_in_bounds_gep(outer_list_ptr, &[curr_index], "load_index")
|
||||
};
|
||||
let wrapper = builder
|
||||
.build_load(wrapper_ptr, "inner_list_wrapper")
|
||||
.into_struct_value();
|
||||
let elem_ptr_type = get_ptr_type(&elem_type, AddressSpace::Generic);
|
||||
|
||||
let inner_list = builder.build_load(inner_list_ptr, "get_elem");
|
||||
let inner_list_len = load_list_len(builder, inner_list.into_struct_value());
|
||||
load_list_ptr(builder, wrapper, elem_ptr_type)
|
||||
};
|
||||
|
||||
// Inner Loop
|
||||
{
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue