feat: TODO
This commit is contained in:
@@ -43,6 +43,12 @@ impl DowngradeContext for DowngradeCtx<'_, '_> {
|
||||
}
|
||||
|
||||
fn with_expr_mut<T>(&mut self, id: ExprId, f: impl FnOnce(&mut Hir, &mut Self) -> T) -> T {
|
||||
// SAFETY: This is a common pattern to temporarily bypass the borrow checker.
|
||||
// We are creating a mutable reference to `self` from a raw pointer. This is safe
|
||||
// because `self_mut` is only used within the closure `f`, and we are careful
|
||||
// not to create aliasing mutable references. The `RefCell`'s runtime borrow
|
||||
// checking further ensures that we don't have multiple mutable borrows of the
|
||||
// same `Hir` expression simultaneously.
|
||||
unsafe {
|
||||
let self_mut = &mut *(self as *mut Self);
|
||||
f(&mut self.get_ir(id).borrow_mut(), self_mut)
|
||||
@@ -57,6 +63,10 @@ impl DowngradeContext for DowngradeCtx<'_, '_> {
|
||||
for (idx, ir) in self.ctx.hirs.iter().enumerate() {
|
||||
println!(
|
||||
"{:?} {:#?}",
|
||||
// SAFETY: The index `idx` is obtained from iterating over `self.ctx.hirs`,
|
||||
// so it is guaranteed to be a valid index. The length of `lirs` is added
|
||||
// as an offset to ensure the `ExprId` correctly corresponds to its position
|
||||
// in the combined IR storage.
|
||||
unsafe { ExprId::from_raw(idx + self.ctx.lirs.len()) },
|
||||
&ir
|
||||
);
|
||||
|
||||
Reference in New Issue
Block a user