deps: V8: cherry-pick 3d750c2aa9ef · nodejs/node@2a5f35b
@@ -4688,6 +4688,22 @@ void BytecodeGenerator::BuildHoleCheckForVariableAssignment(Variable* variable,
46884688 }
46894689}
469046904691+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.
47284744RememberHoleCheckInCurrentBlock(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 }
47444748builder()->StoreAccumulatorInRegister(destination);
47454749 } else if (variable->throw_on_const_assignment(language_mode()) &&
@@ -4780,12 +4784,16 @@ void BytecodeGenerator::BuildVariableAssignment(
47804784builder()->LoadAccumulatorWithRegister(value_temp);
47814785 }
478247864783-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 }
47904798builder()->StoreContextSlot(context_reg, variable, depth);
47914799 } else if (variable->throw_on_const_assignment(language_mode())) {