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