| FazBrowse GitHub Viewer | Trending | | Home |
| Tools: [Download Repo ZIP] [Original HTTPS Page] |
1 parent 51b8dfd commit 2a5f35b
4 files changed
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -38,7 +38,7 @@ | |||
| 38 | 38 | ||
| 39 | 39 | # Reset this number to 0 on major V8 upgrades. | |
| 40 | 40 | # Increment by one for each non-official patch applied to deps/v8. | |
| 41 | - 'v8_embedder_string': '-node.17', | ||
| 41 | + 'v8_embedder_string': '-node.21', | ||
| 42 | 42 | ||
| 43 | 43 | ##### V8 defaults for Node.js ##### | |
| 44 | 44 | ||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -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())) { | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -294,6 +294,7 @@ class BytecodeGenerator final : public AstVisitor<BytecodeGenerator> { | |||
| 294 | 294 | ||
| 295 | 295 | Variable* GetPotentialVariableInAccumulator(); | |
| 296 | 296 | ||
| 297 | + void AddDisposableValue(VariableMode mode); | ||
| 297 | 298 | void BuildVariableLoad(Variable* variable, HoleCheckMode hole_check_mode, | |
| 298 | 299 | TypeofMode typeof_mode = TypeofMode::kNotInside); | |
| 299 | 300 | void BuildVariableLoadForAccumulatorValue( | |
| Original file line number | Diff line number | Diff 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]); | ||
| Back | FazBrowse Home | New Git URL |
0 commit comments