(&mut self, f: impl FnOnce(&mut Self))
| 155 | } |
| 156 | |
| 157 | pub(super) fn with_fresh_chunk(&mut self, f: impl FnOnce(&mut Self)) -> SSAChunk { |
| 158 | let saved_chunk = core::mem::take(&mut self.chunk); |
| 159 | let saved_ver = self.ssa_versions.clone(); |
| 160 | let saved_globals = core::mem::take(&mut self.globals_decl); |
| 161 | // Nested body owns its loops and block stack; isolate, then restore the enclosing ones. |
| 162 | let saved_loops = ( |
| 163 | core::mem::take(&mut self.loop_starts), |
| 164 | core::mem::take(&mut self.loop_breaks), |
| 165 | core::mem::take(&mut self.loop_kinds), |
| 166 | core::mem::take(&mut self.loop_cleanup_base), |
| 167 | core::mem::replace(&mut self.cleanup_count, 0), |
| 168 | ); |
| 169 | // Copy parent externs so nested def bodies can call imported natives; extras don't leak up. |
| 170 | self.chunk.extern_table = saved_chunk.extern_table.clone(); |
| 171 | self.chunk.extern_index = saved_chunk.extern_index.clone(); |
| 172 | // Inherit source/path for consistent traceback file context. |
| 173 | self.chunk.source = saved_chunk.source.clone(); |
| 174 | self.chunk.path = saved_chunk.path.clone(); |
| 175 | f(self); |
| 176 | let body = core::mem::take(&mut self.chunk); |
| 177 | self.chunk = saved_chunk; |
| 178 | self.ssa_versions = saved_ver; |
| 179 | self.globals_decl = saved_globals; |
| 180 | (self.loop_starts, self.loop_breaks, self.loop_kinds, |
| 181 | self.loop_cleanup_base, self.cleanup_count) = saved_loops; |
| 182 | body |
| 183 | } |
| 184 | } |
| 185 | |
| 186 | // SSA join points: Phi emission at control-flow merges. |
no test coverage detected