Skip to content

Commit 2a5f35b

Browse files
committed
deps: V8: cherry-pick 3d750c2aa9ef
Original commit message: [explicit-resource-management] Fix disposal for context variable This CL adds disposable variable when `using` or `await_using` is referenced by the closure. Bug: 409478039 Change-Id: I162915ea53f5b9f17892fa88d288a94bd50cc46f Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/6444591 Reviewed-by: Shu-yu Guo <syg@chromium.org> Commit-Queue: Rezvan Mahdavi Hezaveh <rezvan@chromium.org> Cr-Commit-Position: refs/heads/main@{#99746} Refs: v8/v8@3d750c2 PR-URL: #58750 Fixes: #58744 Reviewed-By: Richard Lau <richard.lau@ibm.com>
1 parent 51b8dfd commit 2a5f35b

File tree

4 files changed

+53
-20
lines changed

4 files changed

+53
-20
lines changed

common.gypi

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@
3838

3939
# Reset this number to 0 on major V8 upgrades.
4040
# Increment by one for each non-official patch applied to deps/v8.
41-
'v8_embedder_string': '-node.17',
41+
'v8_embedder_string': '-node.21',
4242

4343
##### V8 defaults for Node.js #####
4444

deps/v8/src/interpreter/bytecode-generator.cc

Lines changed: 27 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -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+
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
}
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())) {

deps/v8/src/interpreter/bytecode-generator.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -294,6 +294,7 @@ class BytecodeGenerator final : public AstVisitor<BytecodeGenerator> {
294294

295295
Variable* GetPotentialVariableInAccumulator();
296296

297+
void AddDisposableValue(VariableMode mode);
297298
void BuildVariableLoad(Variable* variable, HoleCheckMode hole_check_mode,
298299
TypeofMode typeof_mode = TypeofMode::kNotInside);
299300
void BuildVariableLoadForAccumulatorValue(
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
// Copyright 2025 the V8 project authors. All rights reserved.
2+
// Use of this source code is governed by a BSD-style license that can be
3+
// found in the LICENSE file.
4+
5+
// Flags: --js-staging
6+
7+
var log = [];
8+
class Test {
9+
[Symbol.dispose]() {
10+
log.push(42);
11+
}
12+
13+
f() {
14+
log.push(43);
15+
}
16+
}
17+
18+
{
19+
using listener = new Test();
20+
g = () => listener;
21+
}
22+
g().f();
23+
24+
assertEquals(log, [42, 43]);

0 commit comments

Comments
 (0)