@@ -4688,6 +4688,22 @@ void BytecodeGenerator::BuildHoleCheckForVariableAssignment(Variable* variable,
46884688 }
46894689}
46904690
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+
46914707void BytecodeGenerator::BuildVariableAssignment (
46924708 Variable* variable, Token::Value op, HoleCheckMode hole_check_mode,
46934709 LookupHoistingMode lookup_hoisting_mode) {
@@ -4727,19 +4743,7 @@ void BytecodeGenerator::BuildVariableAssignment(
47274743 // elide subsequent checks.
47284744 RememberHoleCheckInCurrentBlock (variable);
47294745 }
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);
47434747 }
47444748 builder ()->StoreAccumulatorInRegister (destination);
47454749 } else if (variable->throw_on_const_assignment (language_mode ()) &&
@@ -4780,12 +4784,16 @@ void BytecodeGenerator::BuildVariableAssignment(
47804784 builder ()->LoadAccumulatorWithRegister (value_temp);
47814785 }
47824786
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);
47894797 }
47904798 builder ()->StoreContextSlot (context_reg, variable, depth);
47914799 } else if (variable->throw_on_const_assignment (language_mode ())) {
0 commit comments