Fix struct clone

This commit is contained in:
Ayaz Hafiz 2023-06-13 15:35:52 -05:00
parent 053816c081
commit b5a963195b
No known key found for this signature in database
GPG key ID: 0E2A37416A25EF58

View file

@ -18,9 +18,10 @@ use roc_mono::layout::{
use roc_region::all::Region;
use super::build::BuilderExt;
use super::build::{add_func, load_roc_value, use_roc_value, FunctionSpec, LlvmBackendMode};
use super::build::{add_func, load_roc_value, FunctionSpec, LlvmBackendMode};
use super::convert::struct_type_from_union_layout;
use super::scope::Scope;
use super::struct_::RocStruct;
pub(crate) struct SharedMemoryPointer<'ctx>(PointerValue<'ctx>);
@ -312,6 +313,7 @@ fn build_clone<'a, 'ctx>(
ptr,
cursors,
value,
layout,
field_layouts,
),
@ -422,24 +424,18 @@ fn build_clone_struct<'a, 'ctx>(
ptr: PointerValue<'ctx>,
cursors: Cursors<'ctx>,
value: BasicValueEnum<'ctx>,
struct_layout: InLayout<'a>,
field_layouts: &[InLayout<'a>],
) -> IntValue<'ctx> {
let layout = LayoutRepr::struct_(field_layouts);
if layout.safe_to_memcpy(layout_interner) {
if layout_interner.safe_to_memcpy(struct_layout) {
build_copy(env, ptr, cursors.offset, value)
} else {
let mut cursors = cursors;
let structure = value.into_struct_value();
let structure = RocStruct::from(value);
for (i, field_layout) in field_layouts.iter().enumerate() {
let field = env
.builder
.build_extract_value(structure, i as _, "extract")
.unwrap();
let field = use_roc_value(env, layout_interner, *field_layout, field, "field");
let field = structure.load_at_index(env, layout_interner, struct_layout, i as _);
let new_extra = build_clone(
env,