Diff
Modified: trunk/Source/_javascript_Core/ChangeLog (255320 => 255321)
--- trunk/Source/_javascript_Core/ChangeLog 2020-01-29 00:06:26 UTC (rev 255320)
+++ trunk/Source/_javascript_Core/ChangeLog 2020-01-29 00:22:17 UTC (rev 255321)
@@ -1,3 +1,28 @@
+2020-01-28 Robin Morisset <[email protected]>
+
+ Remove the include of BytecodeGenerator.h in CodeCache.h
+ https://bugs.webkit.org/show_bug.cgi?id=206851
+
+ Reviewed by Tadeu Zagallo.
+
+ This reduces the number of times that BytecodeStructs.h has to be parsed from 33 to 25 times, and unblocks https://bugs.webkit.org/show_bug.cgi?id=206720.
+
+ * runtime/CodeCache.cpp:
+ (JSC::generateUnlinkedCodeBlockForFunctions):
+ (JSC::generateUnlinkedCodeBlockImpl):
+ (JSC::generateUnlinkedCodeBlock):
+ (JSC::generateUnlinkedCodeBlockForDirectEval):
+ (JSC::recursivelyGenerateUnlinkedCodeBlockForProgram):
+ (JSC::recursivelyGenerateUnlinkedCodeBlockForModuleProgram):
+ * runtime/CodeCache.h:
+ * runtime/Completion.cpp:
+ (JSC::generateProgramBytecode):
+ (JSC::generateModuleBytecode):
+ * runtime/DirectEvalExecutable.cpp:
+ (JSC::DirectEvalExecutable::create):
+ * runtime/JSGlobalObject.cpp:
+ * runtime/VM.cpp:
+
2020-01-28 Mark Lam <[email protected]>
Some website needs more stack space.
Modified: trunk/Source/_javascript_Core/runtime/CodeCache.cpp (255320 => 255321)
--- trunk/Source/_javascript_Core/runtime/CodeCache.cpp 2020-01-29 00:06:26 UTC (rev 255320)
+++ trunk/Source/_javascript_Core/runtime/CodeCache.cpp 2020-01-29 00:22:17 UTC (rev 255321)
@@ -26,6 +26,7 @@
#include "config.h"
#include "CodeCache.h"
+#include "BytecodeGenerator.h"
#include "IndirectEvalExecutable.h"
#include <wtf/text/StringConcatenateNumbers.h>
@@ -50,7 +51,101 @@
}
}
+static void generateUnlinkedCodeBlockForFunctions(VM& vm, UnlinkedCodeBlock* unlinkedCodeBlock, const SourceCode& parentSource, OptionSet<CodeGenerationMode> codeGenerationMode, ParserError& error)
+{
+ auto generate = [&](UnlinkedFunctionExecutable* unlinkedExecutable, CodeSpecializationKind constructorKind) {
+ if (constructorKind == CodeForConstruct && SourceParseModeSet(SourceParseMode::AsyncArrowFunctionMode, SourceParseMode::AsyncMethodMode, SourceParseMode::AsyncFunctionMode).contains(unlinkedExecutable->parseMode()))
+ return;
+
+ SourceCode source = unlinkedExecutable->linkedSourceCode(parentSource);
+ UnlinkedFunctionCodeBlock* unlinkedFunctionCodeBlock = unlinkedExecutable->unlinkedCodeBlockFor(vm, source, constructorKind, codeGenerationMode, error, unlinkedExecutable->parseMode());
+ if (unlinkedFunctionCodeBlock)
+ generateUnlinkedCodeBlockForFunctions(vm, unlinkedFunctionCodeBlock, source, codeGenerationMode, error);
+ };
+
+ // FIXME: We should also generate CodeBlocks for CodeForConstruct
+ // https://bugs.webkit.org/show_bug.cgi?id=193823
+ for (unsigned i = 0; i < unlinkedCodeBlock->numberOfFunctionDecls(); i++)
+ generate(unlinkedCodeBlock->functionDecl(i), CodeForCall);
+ for (unsigned i = 0; i < unlinkedCodeBlock->numberOfFunctionExprs(); i++)
+ generate(unlinkedCodeBlock->functionExpr(i), CodeForCall);
+}
+
+template <class UnlinkedCodeBlockType, class ExecutableType = ScriptExecutable>
+UnlinkedCodeBlockType* generateUnlinkedCodeBlockImpl(VM& vm, const SourceCode& source, JSParserStrictMode strictMode, JSParserScriptMode scriptMode, OptionSet<CodeGenerationMode> codeGenerationMode, ParserError& error, EvalContextType evalContextType, DerivedContextType derivedContextType, bool isArrowFunctionContext, const VariableEnvironment* variablesUnderTDZ, ExecutableType* executable = nullptr)
+{
+ typedef typename CacheTypes<UnlinkedCodeBlockType>::RootNode RootNode;
+ std::unique_ptr<RootNode> rootNode = parse<RootNode>(
+ vm, source, Identifier(), JSParserBuiltinMode::NotBuiltin, strictMode, scriptMode, CacheTypes<UnlinkedCodeBlockType>::parseMode, SuperBinding::NotNeeded, error, nullptr, ConstructorKind::None, derivedContextType, evalContextType);
+ if (!rootNode)
+ return nullptr;
+
+ unsigned lineCount = rootNode->lastLine() - rootNode->firstLine();
+ unsigned startColumn = rootNode->startColumn() + 1;
+ bool endColumnIsOnStartLine = !lineCount;
+ unsigned unlinkedEndColumn = rootNode->endColumn();
+ unsigned endColumn = unlinkedEndColumn + (endColumnIsOnStartLine ? startColumn : 1);
+ unsigned arrowContextFeature = isArrowFunctionContext ? ArrowFunctionContextFeature : 0;
+ if (executable)
+ executable->recordParse(rootNode->features() | arrowContextFeature, rootNode->hasCapturedVariables(), rootNode->lastLine(), endColumn);
+
+ bool usesEval = rootNode->features() & EvalFeature;
+ bool isStrictMode = rootNode->features() & StrictModeFeature;
+ NeedsClassFieldInitializer needsClassFieldInitializer = NeedsClassFieldInitializer::No;
+ if constexpr (std::is_same_v<ExecutableType, DirectEvalExecutable>)
+ needsClassFieldInitializer = executable->needsClassFieldInitializer();
+ ExecutableInfo executableInfo(usesEval, isStrictMode, false, false, ConstructorKind::None, scriptMode, SuperBinding::NotNeeded, CacheTypes<UnlinkedCodeBlockType>::parseMode, derivedContextType, needsClassFieldInitializer, isArrowFunctionContext, false, evalContextType);
+
+ UnlinkedCodeBlockType* unlinkedCodeBlock = UnlinkedCodeBlockType::create(vm, executableInfo, codeGenerationMode);
+ unlinkedCodeBlock->recordParse(rootNode->features(), rootNode->hasCapturedVariables(), lineCount, unlinkedEndColumn);
+ if (!source.provider()->sourceURLDirective().isNull())
+ unlinkedCodeBlock->setSourceURLDirective(source.provider()->sourceURLDirective());
+ if (!source.provider()->sourceMappingURLDirective().isNull())
+ unlinkedCodeBlock->setSourceMappingURLDirective(source.provider()->sourceMappingURLDirective());
+
+ error = BytecodeGenerator::generate(vm, rootNode.get(), source, unlinkedCodeBlock, codeGenerationMode, variablesUnderTDZ);
+
+ if (error.isValid())
+ return nullptr;
+
+ return unlinkedCodeBlock;
+}
+
template <class UnlinkedCodeBlockType, class ExecutableType>
+UnlinkedCodeBlockType* generateUnlinkedCodeBlock(VM& vm, ExecutableType* executable, const SourceCode& source, JSParserStrictMode strictMode, JSParserScriptMode scriptMode, OptionSet<CodeGenerationMode> codeGenerationMode, ParserError& error, EvalContextType evalContextType, const VariableEnvironment* variablesUnderTDZ)
+{
+ return generateUnlinkedCodeBlockImpl<UnlinkedCodeBlockType, ExecutableType>(vm, source, strictMode, scriptMode, codeGenerationMode, error, evalContextType, executable->derivedContextType(), executable->isArrowFunctionContext(), variablesUnderTDZ, executable);
+}
+
+UnlinkedEvalCodeBlock* generateUnlinkedCodeBlockForDirectEval(VM& vm, DirectEvalExecutable* executable, const SourceCode& source, JSParserStrictMode strictMode, JSParserScriptMode scriptMode, OptionSet<CodeGenerationMode> codeGenerationMode, ParserError& error, EvalContextType evalContextType, const VariableEnvironment* variablesUnderTDZ)
+{
+ return generateUnlinkedCodeBlock<UnlinkedEvalCodeBlock>(vm, executable, source, strictMode, scriptMode, codeGenerationMode, error, evalContextType, variablesUnderTDZ);
+}
+
+template <class UnlinkedCodeBlockType>
+std::enable_if_t<!std::is_same<UnlinkedCodeBlockType, UnlinkedEvalCodeBlock>::value, UnlinkedCodeBlockType*>
+recursivelyGenerateUnlinkedCodeBlock(VM& vm, const SourceCode& source, JSParserStrictMode strictMode, JSParserScriptMode scriptMode, OptionSet<CodeGenerationMode> codeGenerationMode, ParserError& error, EvalContextType evalContextType, const VariableEnvironment* variablesUnderTDZ)
+{
+ bool isArrowFunctionContext = false;
+ UnlinkedCodeBlockType* unlinkedCodeBlock = generateUnlinkedCodeBlockImpl<UnlinkedCodeBlockType>(vm, source, strictMode, scriptMode, codeGenerationMode, error, evalContextType, DerivedContextType::None, isArrowFunctionContext, variablesUnderTDZ);
+ if (!unlinkedCodeBlock)
+ return nullptr;
+
+ generateUnlinkedCodeBlockForFunctions(vm, unlinkedCodeBlock, source, codeGenerationMode, error);
+ return unlinkedCodeBlock;
+}
+
+UnlinkedProgramCodeBlock* recursivelyGenerateUnlinkedCodeBlockForProgram(VM& vm, const SourceCode& source, JSParserStrictMode strictMode, JSParserScriptMode scriptMode, OptionSet<CodeGenerationMode> codeGenerationMode, ParserError& error, EvalContextType evalContextType, const VariableEnvironment* variablesUnderTDZ)
+{
+ return recursivelyGenerateUnlinkedCodeBlock<UnlinkedProgramCodeBlock>(vm, source, strictMode, scriptMode, codeGenerationMode, error, evalContextType, variablesUnderTDZ);
+}
+
+UnlinkedModuleProgramCodeBlock* recursivelyGenerateUnlinkedCodeBlockForModuleProgram(VM& vm, const SourceCode& source, JSParserStrictMode strictMode, JSParserScriptMode scriptMode, OptionSet<CodeGenerationMode> codeGenerationMode, ParserError& error, EvalContextType evalContextType, const VariableEnvironment* variablesUnderTDZ)
+{
+ return recursivelyGenerateUnlinkedCodeBlock<UnlinkedModuleProgramCodeBlock>(vm, source, strictMode, scriptMode, codeGenerationMode, error, evalContextType, variablesUnderTDZ);
+}
+
+template <class UnlinkedCodeBlockType, class ExecutableType>
UnlinkedCodeBlockType* CodeCache::getUnlinkedGlobalCodeBlock(VM& vm, ExecutableType* executable, const SourceCode& source, JSParserStrictMode strictMode, JSParserScriptMode scriptMode, OptionSet<CodeGenerationMode> codeGenerationMode, ParserError& error, EvalContextType evalContextType)
{
DerivedContextType derivedContextType = executable->derivedContextType();
@@ -172,26 +267,6 @@
writeCodeBlock(vm, it.key, it.value);
}
-void generateUnlinkedCodeBlockForFunctions(VM& vm, UnlinkedCodeBlock* unlinkedCodeBlock, const SourceCode& parentSource, OptionSet<CodeGenerationMode> codeGenerationMode, ParserError& error)
-{
- auto generate = [&](UnlinkedFunctionExecutable* unlinkedExecutable, CodeSpecializationKind constructorKind) {
- if (constructorKind == CodeForConstruct && SourceParseModeSet(SourceParseMode::AsyncArrowFunctionMode, SourceParseMode::AsyncMethodMode, SourceParseMode::AsyncFunctionMode).contains(unlinkedExecutable->parseMode()))
- return;
-
- SourceCode source = unlinkedExecutable->linkedSourceCode(parentSource);
- UnlinkedFunctionCodeBlock* unlinkedFunctionCodeBlock = unlinkedExecutable->unlinkedCodeBlockFor(vm, source, constructorKind, codeGenerationMode, error, unlinkedExecutable->parseMode());
- if (unlinkedFunctionCodeBlock)
- generateUnlinkedCodeBlockForFunctions(vm, unlinkedFunctionCodeBlock, source, codeGenerationMode, error);
- };
-
- // FIXME: We should also generate CodeBlocks for CodeForConstruct
- // https://bugs.webkit.org/show_bug.cgi?id=193823
- for (unsigned i = 0; i < unlinkedCodeBlock->numberOfFunctionDecls(); i++)
- generate(unlinkedCodeBlock->functionDecl(i), CodeForCall);
- for (unsigned i = 0; i < unlinkedCodeBlock->numberOfFunctionExprs(); i++)
- generate(unlinkedCodeBlock->functionExpr(i), CodeForCall);
-}
-
void writeCodeBlock(VM& vm, const SourceCodeKey& key, const SourceCodeValue& value)
{
UnlinkedCodeBlock* codeBlock = jsDynamicCast<UnlinkedCodeBlock*>(vm, value.cell.get());
Modified: trunk/Source/_javascript_Core/runtime/CodeCache.h (255320 => 255321)
--- trunk/Source/_javascript_Core/runtime/CodeCache.h 2020-01-29 00:06:26 UTC (rev 255320)
+++ trunk/Source/_javascript_Core/runtime/CodeCache.h 2020-01-29 00:22:17 UTC (rev 255321)
@@ -25,7 +25,6 @@
#pragma once
-#include "BytecodeGenerator.h"
#include "CachedTypes.h"
#include "ExecutableInfo.h"
#include "JSCInlines.h"
@@ -50,11 +49,6 @@
class ParserError;
class ProgramExecutable;
class SourceCode;
-class UnlinkedCodeBlock;
-class UnlinkedEvalCodeBlock;
-class UnlinkedFunctionExecutable;
-class UnlinkedModuleProgramCodeBlock;
-class UnlinkedProgramCodeBlock;
class VM;
class VariableEnvironment;
@@ -259,67 +253,10 @@
static constexpr SourceParseMode parseMode = SourceParseMode::ModuleEvaluateMode;
};
-template <class UnlinkedCodeBlockType, class ExecutableType = ScriptExecutable>
-UnlinkedCodeBlockType* generateUnlinkedCodeBlockImpl(VM& vm, const SourceCode& source, JSParserStrictMode strictMode, JSParserScriptMode scriptMode, OptionSet<CodeGenerationMode> codeGenerationMode, ParserError& error, EvalContextType evalContextType, DerivedContextType derivedContextType, bool isArrowFunctionContext, const VariableEnvironment* variablesUnderTDZ, ExecutableType* executable = nullptr)
-{
- typedef typename CacheTypes<UnlinkedCodeBlockType>::RootNode RootNode;
- std::unique_ptr<RootNode> rootNode = parse<RootNode>(
- vm, source, Identifier(), JSParserBuiltinMode::NotBuiltin, strictMode, scriptMode, CacheTypes<UnlinkedCodeBlockType>::parseMode, SuperBinding::NotNeeded, error, nullptr, ConstructorKind::None, derivedContextType, evalContextType);
- if (!rootNode)
- return nullptr;
+UnlinkedEvalCodeBlock* generateUnlinkedCodeBlockForDirectEval(VM&, DirectEvalExecutable*, const SourceCode&, JSParserStrictMode, JSParserScriptMode, OptionSet<CodeGenerationMode>, ParserError&, EvalContextType, const VariableEnvironment* variablesUnderTDZ);
+UnlinkedProgramCodeBlock* recursivelyGenerateUnlinkedCodeBlockForProgram(VM&, const SourceCode&, JSParserStrictMode, JSParserScriptMode, OptionSet<CodeGenerationMode>, ParserError&, EvalContextType, const VariableEnvironment* variablesUnderTDZ);
+UnlinkedModuleProgramCodeBlock* recursivelyGenerateUnlinkedCodeBlockForModuleProgram(VM&, const SourceCode&, JSParserStrictMode, JSParserScriptMode, OptionSet<CodeGenerationMode>, ParserError&, EvalContextType, const VariableEnvironment* variablesUnderTDZ);
- unsigned lineCount = rootNode->lastLine() - rootNode->firstLine();
- unsigned startColumn = rootNode->startColumn() + 1;
- bool endColumnIsOnStartLine = !lineCount;
- unsigned unlinkedEndColumn = rootNode->endColumn();
- unsigned endColumn = unlinkedEndColumn + (endColumnIsOnStartLine ? startColumn : 1);
- unsigned arrowContextFeature = isArrowFunctionContext ? ArrowFunctionContextFeature : 0;
- if (executable)
- executable->recordParse(rootNode->features() | arrowContextFeature, rootNode->hasCapturedVariables(), rootNode->lastLine(), endColumn);
-
- bool usesEval = rootNode->features() & EvalFeature;
- bool isStrictMode = rootNode->features() & StrictModeFeature;
- NeedsClassFieldInitializer needsClassFieldInitializer = NeedsClassFieldInitializer::No;
- if constexpr (std::is_same_v<ExecutableType, DirectEvalExecutable>)
- needsClassFieldInitializer = executable->needsClassFieldInitializer();
- ExecutableInfo executableInfo(usesEval, isStrictMode, false, false, ConstructorKind::None, scriptMode, SuperBinding::NotNeeded, CacheTypes<UnlinkedCodeBlockType>::parseMode, derivedContextType, needsClassFieldInitializer, isArrowFunctionContext, false, evalContextType);
-
- UnlinkedCodeBlockType* unlinkedCodeBlock = UnlinkedCodeBlockType::create(vm, executableInfo, codeGenerationMode);
- unlinkedCodeBlock->recordParse(rootNode->features(), rootNode->hasCapturedVariables(), lineCount, unlinkedEndColumn);
- if (!source.provider()->sourceURLDirective().isNull())
- unlinkedCodeBlock->setSourceURLDirective(source.provider()->sourceURLDirective());
- if (!source.provider()->sourceMappingURLDirective().isNull())
- unlinkedCodeBlock->setSourceMappingURLDirective(source.provider()->sourceMappingURLDirective());
-
- error = BytecodeGenerator::generate(vm, rootNode.get(), source, unlinkedCodeBlock, codeGenerationMode, variablesUnderTDZ);
-
- if (error.isValid())
- return nullptr;
-
- return unlinkedCodeBlock;
-}
-
-template <class UnlinkedCodeBlockType, class ExecutableType>
-UnlinkedCodeBlockType* generateUnlinkedCodeBlock(VM& vm, ExecutableType* executable, const SourceCode& source, JSParserStrictMode strictMode, JSParserScriptMode scriptMode, OptionSet<CodeGenerationMode> codeGenerationMode, ParserError& error, EvalContextType evalContextType, const VariableEnvironment* variablesUnderTDZ)
-{
- return generateUnlinkedCodeBlockImpl<UnlinkedCodeBlockType, ExecutableType>(vm, source, strictMode, scriptMode, codeGenerationMode, error, evalContextType, executable->derivedContextType(), executable->isArrowFunctionContext(), variablesUnderTDZ, executable);
-}
-
-void generateUnlinkedCodeBlockForFunctions(VM&, UnlinkedCodeBlock*, const SourceCode&, OptionSet<CodeGenerationMode>, ParserError&);
-
-template <class UnlinkedCodeBlockType>
-std::enable_if_t<!std::is_same<UnlinkedCodeBlockType, UnlinkedEvalCodeBlock>::value, UnlinkedCodeBlockType*>
-recursivelyGenerateUnlinkedCodeBlock(VM& vm, const SourceCode& source, JSParserStrictMode strictMode, JSParserScriptMode scriptMode, OptionSet<CodeGenerationMode> codeGenerationMode, ParserError& error, EvalContextType evalContextType, const VariableEnvironment* variablesUnderTDZ)
-{
- bool isArrowFunctionContext = false;
- UnlinkedCodeBlockType* unlinkedCodeBlock = generateUnlinkedCodeBlockImpl<UnlinkedCodeBlockType>(vm, source, strictMode, scriptMode, codeGenerationMode, error, evalContextType, DerivedContextType::None, isArrowFunctionContext, variablesUnderTDZ);
- if (!unlinkedCodeBlock)
- return nullptr;
-
- generateUnlinkedCodeBlockForFunctions(vm, unlinkedCodeBlock, source, codeGenerationMode, error);
- return unlinkedCodeBlock;
-}
-
void writeCodeBlock(VM&, const SourceCodeKey&, const SourceCodeValue&);
RefPtr<CachedBytecode> serializeBytecode(VM&, UnlinkedCodeBlock*, const SourceCode&, SourceCodeType, JSParserStrictMode, JSParserScriptMode, FileSystem::PlatformFileHandle fd, BytecodeCacheError&, OptionSet<CodeGenerationMode>);
SourceCodeKey sourceCodeKeyForSerializedProgram(VM&, const SourceCode&);
Modified: trunk/Source/_javascript_Core/runtime/Completion.cpp (255320 => 255321)
--- trunk/Source/_javascript_Core/runtime/Completion.cpp 2020-01-29 00:06:26 UTC (rev 255320)
+++ trunk/Source/_javascript_Core/runtime/Completion.cpp 2020-01-29 00:22:17 UTC (rev 255321)
@@ -102,7 +102,7 @@
EvalContextType evalContextType = EvalContextType::None;
ParserError parserError;
- UnlinkedCodeBlock* unlinkedCodeBlock = recursivelyGenerateUnlinkedCodeBlock<UnlinkedProgramCodeBlock>(vm, source, strictMode, scriptMode, { }, parserError, evalContextType, &variablesUnderTDZ);
+ UnlinkedCodeBlock* unlinkedCodeBlock = recursivelyGenerateUnlinkedCodeBlockForProgram(vm, source, strictMode, scriptMode, { }, parserError, evalContextType, &variablesUnderTDZ);
if (parserError.isValid())
error = parserError;
if (!unlinkedCodeBlock)
@@ -122,7 +122,7 @@
EvalContextType evalContextType = EvalContextType::None;
ParserError parserError;
- UnlinkedCodeBlock* unlinkedCodeBlock = recursivelyGenerateUnlinkedCodeBlock<UnlinkedModuleProgramCodeBlock>(vm, source, strictMode, scriptMode, { }, parserError, evalContextType, &variablesUnderTDZ);
+ UnlinkedCodeBlock* unlinkedCodeBlock = recursivelyGenerateUnlinkedCodeBlockForModuleProgram(vm, source, strictMode, scriptMode, { }, parserError, evalContextType, &variablesUnderTDZ);
if (parserError.isValid())
error = parserError;
if (!unlinkedCodeBlock)
Modified: trunk/Source/_javascript_Core/runtime/DirectEvalExecutable.cpp (255320 => 255321)
--- trunk/Source/_javascript_Core/runtime/DirectEvalExecutable.cpp 2020-01-29 00:06:26 UTC (rev 255320)
+++ trunk/Source/_javascript_Core/runtime/DirectEvalExecutable.cpp 2020-01-29 00:22:17 UTC (rev 255321)
@@ -53,8 +53,7 @@
OptionSet<CodeGenerationMode> codeGenerationMode = globalObject->defaultCodeGenerationMode();
// We don't bother with CodeCache here because direct eval uses a specialized DirectEvalCodeCache.
- UnlinkedEvalCodeBlock* unlinkedEvalCode = generateUnlinkedCodeBlock<UnlinkedEvalCodeBlock>(
- vm, executable, executable->source(), strictMode, JSParserScriptMode::Classic, codeGenerationMode, error, evalContextType, variablesUnderTDZ);
+ UnlinkedEvalCodeBlock* unlinkedEvalCode = generateUnlinkedCodeBlockForDirectEval(vm, executable, executable->source(), strictMode, JSParserScriptMode::Classic, codeGenerationMode, error, evalContextType, variablesUnderTDZ);
if (globalObject->hasDebugger())
globalObject->debugger()->sourceParsed(globalObject, executable->source().provider(), error.line(), error.message());
Modified: trunk/Source/_javascript_Core/runtime/JSGlobalObject.cpp (255320 => 255321)
--- trunk/Source/_javascript_Core/runtime/JSGlobalObject.cpp 2020-01-29 00:06:26 UTC (rev 255320)
+++ trunk/Source/_javascript_Core/runtime/JSGlobalObject.cpp 2020-01-29 00:22:17 UTC (rev 255321)
@@ -81,6 +81,7 @@
#include "JSArrayBufferPrototype.h"
#include "JSArrayIterator.h"
#include "JSAsyncFunction.h"
+#include "JSAsyncGenerator.h"
#include "JSAsyncGeneratorFunction.h"
#include "JSBigInt.h"
#include "JSBoundFunction.h"
@@ -93,6 +94,7 @@
#include "JSDataViewPrototype.h"
#include "JSDollarVM.h"
#include "JSFunction.h"
+#include "JSGenerator.h"
#include "JSGeneratorFunction.h"
#include "JSGenericTypedArrayViewConstructorInlines.h"
#include "JSGenericTypedArrayViewInlines.h"
Modified: trunk/Source/_javascript_Core/runtime/VM.cpp (255320 => 255321)
--- trunk/Source/_javascript_Core/runtime/VM.cpp 2020-01-29 00:06:26 UTC (rev 255320)
+++ trunk/Source/_javascript_Core/runtime/VM.cpp 2020-01-29 00:22:17 UTC (rev 255321)
@@ -88,6 +88,7 @@
#include "JSArrayBufferConstructor.h"
#include "JSArrayIterator.h"
#include "JSAsyncFunction.h"
+#include "JSAsyncGenerator.h"
#include "JSBigInt.h"
#include "JSBoundFunction.h"
#include "JSCInlines.h"