@@ -4688,6 +4688,22 @@ void BytecodeGenerator::BuildHoleCheckForVariableAssignment(Variable* variable,
4688
4688
}
4689
4689
}
4690
4690
4691
+ void BytecodeGenerator::AddDisposableValue (VariableMode mode) {
4692
+ if (mode == VariableMode::kUsing ) {
4693
+ RegisterList args = register_allocator ()->NewRegisterList (2 );
4694
+ builder ()
4695
+ ->MoveRegister (current_disposables_stack (), args[0 ])
4696
+ .StoreAccumulatorInRegister (args[1 ])
4697
+ .CallRuntime (Runtime::kAddDisposableValue , args);
4698
+ } else if (mode == VariableMode::kAwaitUsing ) {
4699
+ RegisterList args = register_allocator ()->NewRegisterList (2 );
4700
+ builder ()
4701
+ ->MoveRegister (current_disposables_stack (), args[0 ])
4702
+ .StoreAccumulatorInRegister (args[1 ])
4703
+ .CallRuntime (Runtime::kAddAsyncDisposableValue , args);
4704
+ }
4705
+ }
4706
+
4691
4707
void BytecodeGenerator::BuildVariableAssignment (
4692
4708
Variable* variable, Token::Value op, HoleCheckMode hole_check_mode,
4693
4709
LookupHoistingMode lookup_hoisting_mode) {
@@ -4727,19 +4743,7 @@ void BytecodeGenerator::BuildVariableAssignment(
4727
4743
// elide subsequent checks.
4728
4744
RememberHoleCheckInCurrentBlock (variable);
4729
4745
}
4730
- if (mode == VariableMode::kUsing ) {
4731
- RegisterList args = register_allocator ()->NewRegisterList (2 );
4732
- builder ()
4733
- ->MoveRegister (current_disposables_stack (), args[0 ])
4734
- .StoreAccumulatorInRegister (args[1 ])
4735
- .CallRuntime (Runtime::kAddDisposableValue , args);
4736
- } else if (mode == VariableMode::kAwaitUsing ) {
4737
- RegisterList args = register_allocator ()->NewRegisterList (2 );
4738
- builder ()
4739
- ->MoveRegister (current_disposables_stack (), args[0 ])
4740
- .StoreAccumulatorInRegister (args[1 ])
4741
- .CallRuntime (Runtime::kAddAsyncDisposableValue , args);
4742
- }
4746
+ AddDisposableValue (mode);
4743
4747
}
4744
4748
builder ()->StoreAccumulatorInRegister (destination);
4745
4749
} else if (variable->throw_on_const_assignment (language_mode ()) &&
@@ -4780,12 +4784,16 @@ void BytecodeGenerator::BuildVariableAssignment(
4780
4784
builder ()->LoadAccumulatorWithRegister (value_temp);
4781
4785
}
4782
4786
4783
- if (mode != VariableMode::kConst || op == Token::kInit ) {
4784
- if (op == Token::kInit &&
4785
- variable->HasHoleCheckUseInSameClosureScope ()) {
4786
- // After initializing a variable it won't be the hole anymore, so
4787
- // elide subsequent checks.
4788
- RememberHoleCheckInCurrentBlock (variable);
4787
+ if ((mode != VariableMode::kConst && mode != VariableMode::kUsing &&
4788
+ mode != VariableMode::kAwaitUsing ) ||
4789
+ op == Token::kInit ) {
4790
+ if (op == Token::kInit ) {
4791
+ if (variable->HasHoleCheckUseInSameClosureScope ()) {
4792
+ // After initializing a variable it won't be the hole anymore, so
4793
+ // elide subsequent checks.
4794
+ RememberHoleCheckInCurrentBlock (variable);
4795
+ }
4796
+ AddDisposableValue (mode);
4789
4797
}
4790
4798
builder ()->StoreContextSlot (context_reg, variable, depth);
4791
4799
} else if (variable->throw_on_const_assignment (language_mode ())) {
0 commit comments