Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'crates/hir-ty/src/mir/eval.rs')
| -rw-r--r-- | crates/hir-ty/src/mir/eval.rs | 28 |
1 files changed, 24 insertions, 4 deletions
diff --git a/crates/hir-ty/src/mir/eval.rs b/crates/hir-ty/src/mir/eval.rs index e968da5111..b083816034 100644 --- a/crates/hir-ty/src/mir/eval.rs +++ b/crates/hir-ty/src/mir/eval.rs @@ -2548,7 +2548,6 @@ impl<'a, 'db> Evaluator<'a, 'db> { ty: Ty<'db>, locals: &Locals<'a, 'db>, ) -> Result<'db, ()> { - // FIXME: support indirect references let layout = self.layout(ty)?; let my_size = self.size_of_sized(ty, locals, "value to patch address")?; use rustc_type_ir::TyKind; @@ -2574,9 +2573,30 @@ impl<'a, 'db> Evaluator<'a, 'db> { )?; } None => { - let current = from_bytes!(usize, self.read_memory(addr, my_size / 2)?); - if let Some(it) = patch_map.get(¤t) { - self.write_memory(addr, &it.to_le_bytes())?; + let bytes = self.read_memory(addr, my_size)?; + let (current, metadata) = bytes.split_at(my_size / 2); + let metadata = metadata.to_vec(); + let current = from_bytes!(usize, current); + let patched = match patch_map.get(¤t) { + Some(it) => { + self.write_memory(addr, &it.to_le_bytes())?; + *it + } + None => current, + }; + let patched = Address::from_usize(patched); + if let TyKind::Slice(inner) = t.kind() { + let len = from_bytes!(usize, metadata); + let size = self.size_of_sized(inner, locals, "slice item to patch")?; + for i in 0..len { + self.patch_addresses( + patch_map, + ty_of_bytes, + patched.offset(i * size), + inner, + locals, + )?; + } } } } |