Support enum in memory map patch address

This commit is contained in:
hkalbasi 2023-08-09 00:27:23 +03:30
parent 31c30933cf
commit 021802c59c
2 changed files with 26 additions and 5 deletions

View file

@ -2441,14 +2441,14 @@ fn const_loop() {
fn const_transfer_memory() { fn const_transfer_memory() {
check_number( check_number(
r#" r#"
//- minicore: slice, index, coerce_unsized //- minicore: slice, index, coerce_unsized, option
const A1: &i32 = &1; const A1: &i32 = &1;
const A2: &i32 = &10; const A2: &i32 = &10;
const A3: [&i32; 3] = [&1, &2, &100]; const A3: [&i32; 3] = [&1, &2, &100];
const A4: (i32, &i32) = (1, &1000); const A4: (i32, &i32, Option<&i32>) = (1, &1000, Some(&10000));
const GOAL: i32 = *A1 + *A2 + *A3[2] + *A4.1; const GOAL: i32 = *A1 + *A2 + *A3[2] + *A4.1 + *A4.2.unwrap_or(&5);
"#, "#,
1111, 11111,
); );
} }

View file

@ -2007,7 +2007,28 @@ impl Evaluator<'_> {
} }
} }
AdtId::UnionId(_) => (), AdtId::UnionId(_) => (),
AdtId::EnumId(_) => (), AdtId::EnumId(e) => {
if let Some((variant, layout)) = detect_variant_from_bytes(
&layout,
self.db,
self.trait_env.clone(),
self.read_memory(addr, layout.size.bytes_usize())?,
e,
) {
let ev = EnumVariantId { parent: e, local_id: variant };
for (i, (_, ty)) in self.db.field_types(ev.into()).iter().enumerate() {
let offset = layout.fields.offset(i).bytes_usize();
let ty = ty.clone().substitute(Interner, subst);
self.patch_addresses(
patch_map,
old_vtable,
addr.offset(offset),
&ty,
locals,
)?;
}
}
}
}, },
TyKind::Tuple(_, subst) => { TyKind::Tuple(_, subst) => {
for (id, ty) in subst.iter(Interner).enumerate() { for (id, ty) in subst.iter(Interner).enumerate() {