@@ -177,11 +177,12 @@ impl Compiler {
177177 else {
178178 return self . compile_member_compound_assign ( target, op, value) ;
179179 } ;
180- let slot = self . resolve_local_slot ( name) ;
181- let resolved_with_object_slot = self . resolve_with_identifier_target ( name, slot) ;
180+ let store_slot = self . resolve_local_slot ( name) ;
181+ let load_slot = self . resolve_identifier_load_slot ( name) ;
182+ let resolved_with_object_slot = self . resolve_with_identifier_target ( name, store_slot) ;
182183 match op {
183184 AssignmentOp :: LogicalAndAssign => {
184- self . emit_load_identifier ( name, slot , resolved_with_object_slot) ;
185+ self . emit_load_identifier ( name, load_slot , resolved_with_object_slot) ;
185186 let end_jump = self . emit ( Op :: JumpIfFalse ( usize:: MAX ) ) ;
186187 self . emit ( Op :: Pop ) ;
187188 // `f &&= <anon>` names the anonymous value after the target
@@ -192,12 +193,12 @@ impl Compiler {
192193 self . compile_named_expr ( value, name) ?;
193194 }
194195 self . emit ( Op :: Dup ) ;
195- self . emit_store_identifier ( name, slot , resolved_with_object_slot) ;
196+ self . emit_store_identifier ( name, store_slot , resolved_with_object_slot) ;
196197 let end = self . code . len ( ) ;
197198 self . patch_jump ( end_jump, end) ;
198199 }
199200 AssignmentOp :: LogicalOrAssign => {
200- self . emit_load_identifier ( name, slot , resolved_with_object_slot) ;
201+ self . emit_load_identifier ( name, load_slot , resolved_with_object_slot) ;
201202 let end_jump = self . emit ( Op :: JumpIfTrue ( usize:: MAX ) ) ;
202203 self . emit ( Op :: Pop ) ;
203204 if * parenthesized {
@@ -206,12 +207,12 @@ impl Compiler {
206207 self . compile_named_expr ( value, name) ?;
207208 }
208209 self . emit ( Op :: Dup ) ;
209- self . emit_store_identifier ( name, slot , resolved_with_object_slot) ;
210+ self . emit_store_identifier ( name, store_slot , resolved_with_object_slot) ;
210211 let end = self . code . len ( ) ;
211212 self . patch_jump ( end_jump, end) ;
212213 }
213214 AssignmentOp :: NullishAssign => {
214- self . emit_load_identifier ( name, slot , resolved_with_object_slot) ;
215+ self . emit_load_identifier ( name, load_slot , resolved_with_object_slot) ;
215216 let end_jump = self . emit ( Op :: JumpIfNotNullish ( usize:: MAX ) ) ;
216217 self . emit ( Op :: Pop ) ;
217218 if * parenthesized {
@@ -220,7 +221,7 @@ impl Compiler {
220221 self . compile_named_expr ( value, name) ?;
221222 }
222223 self . emit ( Op :: Dup ) ;
223- self . emit_store_identifier ( name, slot , resolved_with_object_slot) ;
224+ self . emit_store_identifier ( name, store_slot , resolved_with_object_slot) ;
224225 let end = self . code . len ( ) ;
225226 self . patch_jump ( end_jump, end) ;
226227 }
@@ -229,7 +230,7 @@ impl Compiler {
229230 && !self . inside_with ( )
230231 && let Expr :: Literal ( Literal :: String { value, .. } ) = value
231232 {
232- if let Some ( slot) = slot {
233+ if let Some ( slot) = store_slot {
233234 self . emit ( Op :: AppendStringLiteralLocal {
234235 slot,
235236 value : value. clone ( ) ,
@@ -243,11 +244,11 @@ impl Compiler {
243244 }
244245 return Ok ( ( ) ) ;
245246 }
246- self . emit_load_identifier ( name, slot , resolved_with_object_slot) ;
247+ self . emit_load_identifier ( name, load_slot , resolved_with_object_slot) ;
247248 self . compile_expr ( value) ?;
248249 self . emit ( Op :: Binary ( assignment_binary_op ( op) ?) ) ;
249250 self . emit ( Op :: Dup ) ;
250- self . emit_store_identifier ( name, slot , resolved_with_object_slot) ;
251+ self . emit_store_identifier ( name, store_slot , resolved_with_object_slot) ;
251252 }
252253 }
253254 Ok ( ( ) )
@@ -262,19 +263,20 @@ impl Compiler {
262263 let AssignmentTarget :: Identifier { name, .. } = target else {
263264 return self . compile_member_update ( target, op, prefix) ;
264265 } ;
265- let slot = self . resolve_local_slot ( name) ;
266- let resolved_with_object_slot = self . resolve_with_identifier_target ( name, slot) ;
267- self . emit_load_identifier ( name, slot, resolved_with_object_slot) ;
266+ let store_slot = self . resolve_local_slot ( name) ;
267+ let load_slot = self . resolve_identifier_load_slot ( name) ;
268+ let resolved_with_object_slot = self . resolve_with_identifier_target ( name, store_slot) ;
269+ self . emit_load_identifier ( name, load_slot, resolved_with_object_slot) ;
268270 self . emit ( Op :: ToNumeric ) ;
269271 if !prefix {
270272 self . emit ( Op :: Dup ) ;
271273 }
272274 self . emit ( Op :: Update ( op) ) ;
273275 if prefix {
274276 self . emit ( Op :: Dup ) ;
275- self . emit_store_identifier ( name, slot , resolved_with_object_slot) ;
277+ self . emit_store_identifier ( name, store_slot , resolved_with_object_slot) ;
276278 } else {
277- self . emit_store_identifier ( name, slot , resolved_with_object_slot) ;
279+ self . emit_store_identifier ( name, store_slot , resolved_with_object_slot) ;
278280 }
279281 Ok ( ( ) )
280282 }
@@ -742,14 +744,15 @@ impl Compiler {
742744 pub ( super ) fn compile_typeof ( & mut self , argument : & Expr ) -> Result < ( ) , RuntimeError > {
743745 match argument {
744746 Expr :: Identifier { name, .. } => {
745- let slot = self . resolve_local_slot ( name) ;
746- if self . identifier_needs_with_resolution ( slot) {
747+ let reference_slot = self . resolve_local_slot ( name) ;
748+ let load_slot = self . resolve_identifier_load_slot ( name) ;
749+ if self . identifier_needs_with_resolution ( reference_slot) {
747750 self . emit ( Op :: TypeofIdentWith {
748751 name : name. clone ( ) ,
749- slot,
752+ slot : load_slot ,
750753 } ) ;
751754 return Ok ( ( ) ) ;
752- } else if let Some ( slot) = slot {
755+ } else if let Some ( slot) = load_slot {
753756 self . emit ( Op :: LoadLocal ( slot) ) ;
754757 } else {
755758 self . emit ( Op :: TypeofGlobal ( name. clone ( ) ) ) ;
0 commit comments