◐ Shell
clean mode source ↗

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+46914707

void 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

}

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

}

47904798

builder()->StoreContextSlot(context_reg, variable, depth);

47914799

} else if (variable->throw_on_const_assignment(language_mode())) {