Skip to content
This repository was archived by the owner on Jun 24, 2022. It is now read-only.

Commit 1ffc444

Browse files
Better cache our serialization of the outer TDZ environment when creating FunctionExecutables during bytecode generation
https://bugs.webkit.org/show_bug.cgi?id=199866 <rdar://problem/53333108> Reviewed by Tadeu Zagallo. JSTests: * microbenchmarks/let-const-tdz-environment-parsing-and-hash-consing-speed.js: Added. Source/JavaScriptCore: This patch removes performance pathologies regarding programs with many variables under TDZ (let/const). We had an algorithm for caching the results of gathering all variables under TDZ, but that algorithm wasn't nearly aggressive enough in its caching. This lead us to worst case quadratic runtime, which could happens in practice for large functions. There are a few fixes here: - Instead of flattening the entire TDZ stack, and caching that result, we now cache each stack entry individually. So as you push/pop to the TDZ environment stack, we no longer invalidate everything. Instead, we will just need to cache the newly pushed entry. We also no longer invalidate the cache for lifting a TDZ check. The compromise here is we may emit more runtime TDZ checks for closure variables. This is better than N^2 bytecode compile time perf, since a well predicted branch for a TDZ check is essentially free. - We no longer transform the CompactTDZEnvironment (formerly CompactVariableEnvironment) from a Vector into a HashSet each time we generate code for an inner function. Instead, CompactTDZEnvironment can be in two modes: compact and inflated. It starts life off in compact mode (a vector), and will turn into an inflated mode if it's ever needed. Once inflated, it'll stay this way until it's destructed. This improves our algorithm from being O(EnvSize * NumFunctions) to O(EnvSize) at the cost of using more space in a HashTable versus a Vector. In the future, we could consider just binary searching through this Vector, and never using a hash table. * bytecode/UnlinkedFunctionExecutable.cpp: (JSC::generateUnlinkedFunctionCodeBlock): (JSC::UnlinkedFunctionExecutable::UnlinkedFunctionExecutable): * bytecode/UnlinkedFunctionExecutable.h: * bytecompiler/BytecodeGenerator.cpp: (JSC::BytecodeGenerator::BytecodeGenerator): (JSC::BytecodeGenerator::popLexicalScopeInternal): (JSC::BytecodeGenerator::needsTDZCheck): (JSC::BytecodeGenerator::liftTDZCheckIfPossible): (JSC::BytecodeGenerator::pushTDZVariables): (JSC::BytecodeGenerator::getVariablesUnderTDZ): (JSC::BytecodeGenerator::preserveTDZStack): (JSC::BytecodeGenerator::restoreTDZStack): (JSC::BytecodeGenerator::emitNewInstanceFieldInitializerFunction): * bytecompiler/BytecodeGenerator.h: (JSC::BytecodeGenerator::generate): (JSC::BytecodeGenerator::makeFunction): * debugger/DebuggerCallFrame.cpp: (JSC::DebuggerCallFrame::evaluateWithScopeExtension): * interpreter/Interpreter.cpp: (JSC::eval): * parser/Parser.h: (JSC::Parser<LexerType>::parse): (JSC::parse): * parser/VariableEnvironment.cpp: (JSC::CompactTDZEnvironment::sortCompact): (JSC::CompactTDZEnvironment::CompactTDZEnvironment): (JSC::CompactTDZEnvironment::operator== const): (JSC::CompactTDZEnvironment::toTDZEnvironmentSlow const): (JSC::CompactTDZEnvironmentMap::get): (JSC::CompactTDZEnvironmentMap::Handle::~Handle): (JSC::CompactTDZEnvironmentMap::Handle::Handle): (JSC::CompactVariableEnvironment::CompactVariableEnvironment): Deleted. (JSC::CompactVariableEnvironment::operator== const): Deleted. (JSC::CompactVariableEnvironment::toVariableEnvironment const): Deleted. (JSC::CompactVariableMap::get): Deleted. (JSC::CompactVariableMap::Handle::~Handle): Deleted. (JSC::CompactVariableMap::Handle::Handle): Deleted. * parser/VariableEnvironment.h: (JSC::CompactTDZEnvironment::toTDZEnvironment const): (JSC::CompactTDZEnvironmentKey::CompactTDZEnvironmentKey): (JSC::CompactTDZEnvironmentKey::hash): (JSC::CompactTDZEnvironmentKey::equal): (JSC::CompactTDZEnvironmentKey::makeDeletedValue): (JSC::CompactTDZEnvironmentKey::isHashTableDeletedValue const): (JSC::CompactTDZEnvironmentKey::environment): (WTF::HashTraits<JSC::CompactTDZEnvironmentKey>::emptyValue): (WTF::HashTraits<JSC::CompactTDZEnvironmentKey>::isEmptyValue): (WTF::HashTraits<JSC::CompactTDZEnvironmentKey>::constructDeletedValue): (WTF::HashTraits<JSC::CompactTDZEnvironmentKey>::isDeletedValue): (JSC::CompactTDZEnvironmentMap::Handle::environment const): (JSC::CompactVariableEnvironment::hash const): Deleted. (JSC::CompactVariableMapKey::CompactVariableMapKey): Deleted. (JSC::CompactVariableMapKey::hash): Deleted. (JSC::CompactVariableMapKey::equal): Deleted. (JSC::CompactVariableMapKey::makeDeletedValue): Deleted. (JSC::CompactVariableMapKey::isHashTableDeletedValue const): Deleted. (JSC::CompactVariableMapKey::isHashTableEmptyValue const): Deleted. (JSC::CompactVariableMapKey::environment): Deleted. (WTF::HashTraits<JSC::CompactVariableMapKey>::emptyValue): Deleted. (WTF::HashTraits<JSC::CompactVariableMapKey>::isEmptyValue): Deleted. (WTF::HashTraits<JSC::CompactVariableMapKey>::constructDeletedValue): Deleted. (WTF::HashTraits<JSC::CompactVariableMapKey>::isDeletedValue): Deleted. (JSC::CompactVariableMap::Handle::Handle): Deleted. (JSC::CompactVariableMap::Handle::operator=): Deleted. (JSC::CompactVariableMap::Handle::operator bool const): Deleted. (JSC::CompactVariableMap::Handle::environment const): Deleted. (JSC::CompactVariableMap::Handle::swap): Deleted. * runtime/CachedTypes.cpp: (JSC::Decoder::handleForTDZEnvironment const): (JSC::Decoder::setHandleForTDZEnvironment): (JSC::CachedCompactTDZEnvironment::encode): (JSC::CachedCompactTDZEnvironment::decode const): (JSC::CachedCompactTDZEnvironmentMapHandle::encode): (JSC::CachedCompactTDZEnvironmentMapHandle::decode const): (JSC::CachedFunctionExecutableRareData::decode const): (JSC::Decoder::handleForEnvironment const): Deleted. (JSC::Decoder::setHandleForEnvironment): Deleted. (JSC::CachedCompactVariableEnvironment::encode): Deleted. (JSC::CachedCompactVariableEnvironment::decode const): Deleted. (JSC::CachedCompactVariableMapHandle::encode): Deleted. (JSC::CachedCompactVariableMapHandle::decode const): Deleted. * runtime/CachedTypes.h: * runtime/CodeCache.cpp: (JSC::generateUnlinkedCodeBlockImpl): (JSC::generateUnlinkedCodeBlock): (JSC::generateUnlinkedCodeBlockForDirectEval): (JSC::recursivelyGenerateUnlinkedCodeBlockForProgram): (JSC::recursivelyGenerateUnlinkedCodeBlockForModuleProgram): (JSC::CodeCache::getUnlinkedGlobalCodeBlock): * runtime/CodeCache.h: * runtime/Completion.cpp: (JSC::generateProgramBytecode): (JSC::generateModuleBytecode): * runtime/DirectEvalExecutable.cpp: (JSC::DirectEvalExecutable::create): * runtime/DirectEvalExecutable.h: * runtime/JSScope.cpp: (JSC::JSScope::collectClosureVariablesUnderTDZ): * runtime/JSScope.h: * runtime/VM.cpp: (JSC::VM::VM): * runtime/VM.h: Source/WTF: * wtf/RefPtr.h: (WTF::swap): Deleted. This function is no longer necessary, and causes ADL (https://en.cppreference.com/w/cpp/language/adl) compile errors when not using DumbPtrTraits and calling sort on a vector of that type. git-svn-id: http://svn.webkit.org/repository/webkit/trunk@269115 268f45cc-cd09-0410-ab3c-d52691b4dbfc
1 parent 5fabe9e commit 1ffc444

25 files changed

+125192
-238
lines changed

JSTests/ChangeLog

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,13 @@
1+
2020-10-28 Saam Barati <[email protected]>
2+
3+
Better cache our serialization of the outer TDZ environment when creating FunctionExecutables during bytecode generation
4+
https://bugs.webkit.org/show_bug.cgi?id=199866
5+
<rdar://problem/53333108>
6+
7+
Reviewed by Tadeu Zagallo.
8+
9+
* microbenchmarks/let-const-tdz-environment-parsing-and-hash-consing-speed.js: Added.
10+
111
2020-10-28 Robin Morisset <[email protected]>
212

313
DFGIntegerRangeOptimization is wrong for Upsilon (as 'shadow' nodes are not in SSA form)

JSTests/microbenchmarks/let-const-tdz-environment-parsing-and-hash-consing-speed.js

Lines changed: 124745 additions & 0 deletions
Large diffs are not rendered by default.

Source/JavaScriptCore/ChangeLog

Lines changed: 136 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,139 @@
1+
2020-10-28 Saam Barati <[email protected]>
2+
3+
Better cache our serialization of the outer TDZ environment when creating FunctionExecutables during bytecode generation
4+
https://bugs.webkit.org/show_bug.cgi?id=199866
5+
<rdar://problem/53333108>
6+
7+
Reviewed by Tadeu Zagallo.
8+
9+
This patch removes performance pathologies regarding programs with
10+
many variables under TDZ (let/const). We had an algorithm for caching
11+
the results of gathering all variables under TDZ, but that algorithm
12+
wasn't nearly aggressive enough in its caching. This lead us to worst
13+
case quadratic runtime, which could happens in practice for large functions.
14+
15+
There are a few fixes here:
16+
- Instead of flattening the entire TDZ stack, and caching that result,
17+
we now cache each stack entry individually. So as you push/pop to the
18+
TDZ environment stack, we no longer invalidate everything. Instead, we
19+
will just need to cache the newly pushed entry. We also no longer invalidate
20+
the cache for lifting a TDZ check. The compromise here is we may emit
21+
more runtime TDZ checks for closure variables. This is better than N^2
22+
bytecode compile time perf, since a well predicted branch for a TDZ
23+
check is essentially free.
24+
- We no longer transform the CompactTDZEnvironment (formerly CompactVariableEnvironment)
25+
from a Vector into a HashSet each time we generate code for an inner function. Instead,
26+
CompactTDZEnvironment can be in two modes: compact and inflated. It starts life off in
27+
compact mode (a vector), and will turn into an inflated mode if it's ever needed. Once
28+
inflated, it'll stay this way until it's destructed. This improves our algorithm from being
29+
O(EnvSize * NumFunctions) to O(EnvSize) at the cost of using more space in a HashTable versus a
30+
Vector. In the future, we could consider just binary searching through this Vector, and never using
31+
a hash table.
32+
33+
* bytecode/UnlinkedFunctionExecutable.cpp:
34+
(JSC::generateUnlinkedFunctionCodeBlock):
35+
(JSC::UnlinkedFunctionExecutable::UnlinkedFunctionExecutable):
36+
* bytecode/UnlinkedFunctionExecutable.h:
37+
* bytecompiler/BytecodeGenerator.cpp:
38+
(JSC::BytecodeGenerator::BytecodeGenerator):
39+
(JSC::BytecodeGenerator::popLexicalScopeInternal):
40+
(JSC::BytecodeGenerator::needsTDZCheck):
41+
(JSC::BytecodeGenerator::liftTDZCheckIfPossible):
42+
(JSC::BytecodeGenerator::pushTDZVariables):
43+
(JSC::BytecodeGenerator::getVariablesUnderTDZ):
44+
(JSC::BytecodeGenerator::preserveTDZStack):
45+
(JSC::BytecodeGenerator::restoreTDZStack):
46+
(JSC::BytecodeGenerator::emitNewInstanceFieldInitializerFunction):
47+
* bytecompiler/BytecodeGenerator.h:
48+
(JSC::BytecodeGenerator::generate):
49+
(JSC::BytecodeGenerator::makeFunction):
50+
* debugger/DebuggerCallFrame.cpp:
51+
(JSC::DebuggerCallFrame::evaluateWithScopeExtension):
52+
* interpreter/Interpreter.cpp:
53+
(JSC::eval):
54+
* parser/Parser.h:
55+
(JSC::Parser<LexerType>::parse):
56+
(JSC::parse):
57+
* parser/VariableEnvironment.cpp:
58+
(JSC::CompactTDZEnvironment::sortCompact):
59+
(JSC::CompactTDZEnvironment::CompactTDZEnvironment):
60+
(JSC::CompactTDZEnvironment::operator== const):
61+
(JSC::CompactTDZEnvironment::toTDZEnvironmentSlow const):
62+
(JSC::CompactTDZEnvironmentMap::get):
63+
(JSC::CompactTDZEnvironmentMap::Handle::~Handle):
64+
(JSC::CompactTDZEnvironmentMap::Handle::Handle):
65+
(JSC::CompactVariableEnvironment::CompactVariableEnvironment): Deleted.
66+
(JSC::CompactVariableEnvironment::operator== const): Deleted.
67+
(JSC::CompactVariableEnvironment::toVariableEnvironment const): Deleted.
68+
(JSC::CompactVariableMap::get): Deleted.
69+
(JSC::CompactVariableMap::Handle::~Handle): Deleted.
70+
(JSC::CompactVariableMap::Handle::Handle): Deleted.
71+
* parser/VariableEnvironment.h:
72+
(JSC::CompactTDZEnvironment::toTDZEnvironment const):
73+
(JSC::CompactTDZEnvironmentKey::CompactTDZEnvironmentKey):
74+
(JSC::CompactTDZEnvironmentKey::hash):
75+
(JSC::CompactTDZEnvironmentKey::equal):
76+
(JSC::CompactTDZEnvironmentKey::makeDeletedValue):
77+
(JSC::CompactTDZEnvironmentKey::isHashTableDeletedValue const):
78+
(JSC::CompactTDZEnvironmentKey::environment):
79+
(WTF::HashTraits<JSC::CompactTDZEnvironmentKey>::emptyValue):
80+
(WTF::HashTraits<JSC::CompactTDZEnvironmentKey>::isEmptyValue):
81+
(WTF::HashTraits<JSC::CompactTDZEnvironmentKey>::constructDeletedValue):
82+
(WTF::HashTraits<JSC::CompactTDZEnvironmentKey>::isDeletedValue):
83+
(JSC::CompactTDZEnvironmentMap::Handle::environment const):
84+
(JSC::CompactVariableEnvironment::hash const): Deleted.
85+
(JSC::CompactVariableMapKey::CompactVariableMapKey): Deleted.
86+
(JSC::CompactVariableMapKey::hash): Deleted.
87+
(JSC::CompactVariableMapKey::equal): Deleted.
88+
(JSC::CompactVariableMapKey::makeDeletedValue): Deleted.
89+
(JSC::CompactVariableMapKey::isHashTableDeletedValue const): Deleted.
90+
(JSC::CompactVariableMapKey::isHashTableEmptyValue const): Deleted.
91+
(JSC::CompactVariableMapKey::environment): Deleted.
92+
(WTF::HashTraits<JSC::CompactVariableMapKey>::emptyValue): Deleted.
93+
(WTF::HashTraits<JSC::CompactVariableMapKey>::isEmptyValue): Deleted.
94+
(WTF::HashTraits<JSC::CompactVariableMapKey>::constructDeletedValue): Deleted.
95+
(WTF::HashTraits<JSC::CompactVariableMapKey>::isDeletedValue): Deleted.
96+
(JSC::CompactVariableMap::Handle::Handle): Deleted.
97+
(JSC::CompactVariableMap::Handle::operator=): Deleted.
98+
(JSC::CompactVariableMap::Handle::operator bool const): Deleted.
99+
(JSC::CompactVariableMap::Handle::environment const): Deleted.
100+
(JSC::CompactVariableMap::Handle::swap): Deleted.
101+
* runtime/CachedTypes.cpp:
102+
(JSC::Decoder::handleForTDZEnvironment const):
103+
(JSC::Decoder::setHandleForTDZEnvironment):
104+
(JSC::CachedCompactTDZEnvironment::encode):
105+
(JSC::CachedCompactTDZEnvironment::decode const):
106+
(JSC::CachedCompactTDZEnvironmentMapHandle::encode):
107+
(JSC::CachedCompactTDZEnvironmentMapHandle::decode const):
108+
(JSC::CachedFunctionExecutableRareData::decode const):
109+
(JSC::Decoder::handleForEnvironment const): Deleted.
110+
(JSC::Decoder::setHandleForEnvironment): Deleted.
111+
(JSC::CachedCompactVariableEnvironment::encode): Deleted.
112+
(JSC::CachedCompactVariableEnvironment::decode const): Deleted.
113+
(JSC::CachedCompactVariableMapHandle::encode): Deleted.
114+
(JSC::CachedCompactVariableMapHandle::decode const): Deleted.
115+
* runtime/CachedTypes.h:
116+
* runtime/CodeCache.cpp:
117+
(JSC::generateUnlinkedCodeBlockImpl):
118+
(JSC::generateUnlinkedCodeBlock):
119+
(JSC::generateUnlinkedCodeBlockForDirectEval):
120+
(JSC::recursivelyGenerateUnlinkedCodeBlockForProgram):
121+
(JSC::recursivelyGenerateUnlinkedCodeBlockForModuleProgram):
122+
(JSC::CodeCache::getUnlinkedGlobalCodeBlock):
123+
* runtime/CodeCache.h:
124+
* runtime/Completion.cpp:
125+
(JSC::generateProgramBytecode):
126+
(JSC::generateModuleBytecode):
127+
* runtime/DirectEvalExecutable.cpp:
128+
(JSC::DirectEvalExecutable::create):
129+
* runtime/DirectEvalExecutable.h:
130+
* runtime/JSScope.cpp:
131+
(JSC::JSScope::collectClosureVariablesUnderTDZ):
132+
* runtime/JSScope.h:
133+
* runtime/VM.cpp:
134+
(JSC::VM::VM):
135+
* runtime/VM.h:
136+
1137
2020-10-28 Robin Morisset <[email protected]>
2138

3139
DFGIntegerRangeOptimization is wrong for Upsilon (as 'shadow' nodes are not in SSA form)

Source/JavaScriptCore/bytecode/UnlinkedFunctionExecutable.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -72,17 +72,17 @@ static UnlinkedFunctionCodeBlock* generateUnlinkedFunctionCodeBlock(
7272

7373
UnlinkedFunctionCodeBlock* result = UnlinkedFunctionCodeBlock::create(vm, FunctionCode, ExecutableInfo(function->usesEval(), kind == CodeForConstruct, functionKind == UnlinkedBuiltinFunction, executable->constructorKind(), scriptMode, executable->superBinding(), parseMode, executable->derivedContextType(), executable->needsClassFieldInitializer(), false, isClassContext, EvalContextType::FunctionEvalContext), codeGenerationMode);
7474

75-
VariableEnvironment parentScopeTDZVariables = executable->parentScopeTDZVariables();
75+
auto parentScopeTDZVariables = executable->parentScopeTDZVariables();
7676
ECMAMode ecmaMode = executable->isInStrictContext() ? ECMAMode::strict() : ECMAMode::sloppy();
77-
error = BytecodeGenerator::generate(vm, function.get(), source, result, codeGenerationMode, &parentScopeTDZVariables, ecmaMode);
77+
error = BytecodeGenerator::generate(vm, function.get(), source, result, codeGenerationMode, parentScopeTDZVariables, ecmaMode);
7878

7979
if (error.isValid())
8080
return nullptr;
8181
vm.codeCache()->updateCache(executable, source, kind, result);
8282
return result;
8383
}
8484

85-
UnlinkedFunctionExecutable::UnlinkedFunctionExecutable(VM& vm, Structure* structure, const SourceCode& parentSource, FunctionMetadataNode* node, UnlinkedFunctionKind kind, ConstructAbility constructAbility, JSParserScriptMode scriptMode, Optional<CompactVariableMap::Handle> parentScopeTDZVariables, DerivedContextType derivedContextType, NeedsClassFieldInitializer needsClassFieldInitializer, bool isBuiltinDefaultClassConstructor)
85+
UnlinkedFunctionExecutable::UnlinkedFunctionExecutable(VM& vm, Structure* structure, const SourceCode& parentSource, FunctionMetadataNode* node, UnlinkedFunctionKind kind, ConstructAbility constructAbility, JSParserScriptMode scriptMode, Optional<Vector<CompactTDZEnvironmentMap::Handle>> parentScopeTDZVariables, DerivedContextType derivedContextType, NeedsClassFieldInitializer needsClassFieldInitializer, bool isBuiltinDefaultClassConstructor)
8686
: Base(vm, structure)
8787
, m_firstLineOffset(node->firstLine() - parentSource.firstLine().oneBasedInt())
8888
, m_isInStrictContext(node->isInStrictContext())

Source/JavaScriptCore/bytecode/UnlinkedFunctionExecutable.h

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@ class UnlinkedFunctionExecutable final : public JSCell {
7070
return &vm.unlinkedFunctionExecutableSpace.space;
7171
}
7272

73-
static UnlinkedFunctionExecutable* create(VM& vm, const SourceCode& source, FunctionMetadataNode* node, UnlinkedFunctionKind unlinkedFunctionKind, ConstructAbility constructAbility, JSParserScriptMode scriptMode, Optional<CompactVariableMap::Handle> parentScopeTDZVariables, DerivedContextType derivedContextType, NeedsClassFieldInitializer needsClassFieldInitializer, bool isBuiltinDefaultClassConstructor = false)
73+
static UnlinkedFunctionExecutable* create(VM& vm, const SourceCode& source, FunctionMetadataNode* node, UnlinkedFunctionKind unlinkedFunctionKind, ConstructAbility constructAbility, JSParserScriptMode scriptMode, Optional<Vector<CompactTDZEnvironmentMap::Handle>> parentScopeTDZVariables, DerivedContextType derivedContextType, NeedsClassFieldInitializer needsClassFieldInitializer, bool isBuiltinDefaultClassConstructor = false)
7474
{
7575
UnlinkedFunctionExecutable* instance = new (NotNull, allocateCell<UnlinkedFunctionExecutable>(vm.heap))
7676
UnlinkedFunctionExecutable(vm, vm.unlinkedFunctionExecutableStructure.get(), source, node, unlinkedFunctionKind, constructAbility, scriptMode, WTFMove(parentScopeTDZVariables), derivedContextType, needsClassFieldInitializer, isBuiltinDefaultClassConstructor);
@@ -168,11 +168,11 @@ class UnlinkedFunctionExecutable final : public JSCell {
168168
return !m_rareData->m_classSource.isNull();
169169
}
170170

171-
VariableEnvironment parentScopeTDZVariables() const
171+
Vector<CompactTDZEnvironmentMap::Handle> parentScopeTDZVariables() const
172172
{
173-
if (!m_rareData || !m_rareData->m_parentScopeTDZVariables)
174-
return VariableEnvironment();
175-
return m_rareData->m_parentScopeTDZVariables.environment().toVariableEnvironment();
173+
if (!m_rareData || m_rareData->m_parentScopeTDZVariables.isEmpty())
174+
return { };
175+
return m_rareData->m_parentScopeTDZVariables;
176176
}
177177

178178
bool isArrowFunction() const { return isArrowFunctionParseMode(parseMode()); }
@@ -208,7 +208,7 @@ class UnlinkedFunctionExecutable final : public JSCell {
208208
SourceCode m_classSource;
209209
String m_sourceURLDirective;
210210
String m_sourceMappingURLDirective;
211-
CompactVariableMap::Handle m_parentScopeTDZVariables;
211+
Vector<CompactTDZEnvironmentMap::Handle> m_parentScopeTDZVariables;
212212
Vector<JSTextPosition> m_instanceFieldLocations;
213213
};
214214

@@ -229,7 +229,7 @@ class UnlinkedFunctionExecutable final : public JSCell {
229229
}
230230

231231
private:
232-
UnlinkedFunctionExecutable(VM&, Structure*, const SourceCode&, FunctionMetadataNode*, UnlinkedFunctionKind, ConstructAbility, JSParserScriptMode, Optional<CompactVariableMap::Handle>, JSC::DerivedContextType, JSC::NeedsClassFieldInitializer, bool isBuiltinDefaultClassConstructor);
232+
UnlinkedFunctionExecutable(VM&, Structure*, const SourceCode&, FunctionMetadataNode*, UnlinkedFunctionKind, ConstructAbility, JSParserScriptMode, Optional<Vector<CompactTDZEnvironmentMap::Handle>>, JSC::DerivedContextType, JSC::NeedsClassFieldInitializer, bool isBuiltinDefaultClassConstructor);
233233
UnlinkedFunctionExecutable(Decoder&, const CachedFunctionExecutable&);
234234

235235
static void visitChildren(JSCell*, SlotVisitor&);

0 commit comments

Comments
 (0)