mirror of
https://github.com/roc-lang/roc.git
synced 2025-08-04 12:18:19 +00:00
Refcounting null box ptr
This commit is contained in:
parent
0385da490a
commit
667a69279e
1 changed files with 39 additions and 4 deletions
|
@ -1368,7 +1368,7 @@ fn build_box_eq<'a, 'ctx>(
|
|||
env.builder.set_current_debug_location(di_location);
|
||||
let call = env
|
||||
.builder
|
||||
.build_call(function, &[tag1.into(), tag2.into()], "tag_eq");
|
||||
.build_call(function, &[tag1.into(), tag2.into()], "box_eq");
|
||||
|
||||
call.set_call_convention(FAST_CALL_CONV);
|
||||
|
||||
|
@ -1433,12 +1433,47 @@ fn build_box_eq_help<'a, 'ctx>(
|
|||
"compare_pointers",
|
||||
);
|
||||
|
||||
let compare_inner_value = ctx.append_basic_block(parent, "compare_inner_value");
|
||||
let check_null_then_compare_inner_values =
|
||||
ctx.append_basic_block(parent, "check_null_then_compare_inner_values");
|
||||
|
||||
env.builder.build_conditional_branch(
|
||||
ptr_equal,
|
||||
return_true,
|
||||
check_null_then_compare_inner_values,
|
||||
);
|
||||
|
||||
env.builder
|
||||
.build_conditional_branch(ptr_equal, return_true, compare_inner_value);
|
||||
.position_at_end(check_null_then_compare_inner_values);
|
||||
|
||||
env.builder.position_at_end(compare_inner_value);
|
||||
// Check for nullability, then compare inner values
|
||||
|
||||
let box1_is_null = env
|
||||
.builder
|
||||
.build_is_null(box1.into_pointer_value(), "box1_is_null");
|
||||
let check_box2_is_null = ctx.append_basic_block(parent, "check_if_box2_is_null");
|
||||
let return_false = ctx.append_basic_block(parent, "return_false");
|
||||
let compare_inner_values = ctx.append_basic_block(parent, "compare_inner_values");
|
||||
|
||||
env.builder
|
||||
.build_conditional_branch(box1_is_null, return_false, check_box2_is_null);
|
||||
|
||||
{
|
||||
env.builder.position_at_end(check_box2_is_null);
|
||||
let box2_is_null = env
|
||||
.builder
|
||||
.build_is_null(box2.into_pointer_value(), "box2_is_null");
|
||||
env.builder
|
||||
.build_conditional_branch(box2_is_null, return_false, compare_inner_values);
|
||||
}
|
||||
|
||||
{
|
||||
env.builder.position_at_end(return_false);
|
||||
env.builder
|
||||
.build_return(Some(&env.context.bool_type().const_zero()));
|
||||
}
|
||||
|
||||
// Compare the inner values.
|
||||
env.builder.position_at_end(compare_inner_values);
|
||||
|
||||
// clear the tag_id so we get a pointer to the actual data
|
||||
let box1 = box1.into_pointer_value();
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue