Diff
Modified: trunk/Source/_javascript_Core/ChangeLog (237477 => 237478)
--- trunk/Source/_javascript_Core/ChangeLog 2018-10-26 19:10:25 UTC (rev 237477)
+++ trunk/Source/_javascript_Core/ChangeLog 2018-10-26 19:33:55 UTC (rev 237478)
@@ -1,3 +1,17 @@
+2018-10-26 Commit Queue <[email protected]>
+
+ Unreviewed, rolling out r237445.
+ https://bugs.webkit.org/show_bug.cgi?id=190972
+
+ Cause performance regression on iOS devices (Requested by
+ yusukesuzuki on #webkit).
+
+ Reverted changeset:
+
+ "Unreviewed, partial rolling in r237254"
+ https://bugs.webkit.org/show_bug.cgi?id=190340
+ https://trac.webkit.org/changeset/237445
+
2018-10-26 Mark Lam <[email protected]>
Fix missing edge cases with JSGlobalObjects having a bad time.
Modified: trunk/Source/_javascript_Core/bytecode/UnlinkedFunctionExecutable.cpp (237477 => 237478)
--- trunk/Source/_javascript_Core/bytecode/UnlinkedFunctionExecutable.cpp 2018-10-26 19:10:25 UTC (rev 237477)
+++ trunk/Source/_javascript_Core/bytecode/UnlinkedFunctionExecutable.cpp 2018-10-26 19:33:55 UTC (rev 237478)
@@ -174,7 +174,7 @@
UnlinkedFunctionExecutable* UnlinkedFunctionExecutable::fromGlobalCode(
const Identifier& name, ExecState& exec, const SourceCode& source,
- JSObject*& exception, int overrideLineNumber, std::optional<int> functionConstructorParametersEndPosition)
+ JSObject*& exception, int overrideLineNumber)
{
ParserError error;
VM& vm = exec.vm();
@@ -181,7 +181,7 @@
auto& globalObject = *exec.lexicalGlobalObject();
CodeCache* codeCache = vm.codeCache();
DebuggerMode debuggerMode = globalObject.hasInteractiveDebugger() ? DebuggerOn : DebuggerOff;
- UnlinkedFunctionExecutable* executable = codeCache->getUnlinkedGlobalFunctionExecutable(vm, name, source, debuggerMode, functionConstructorParametersEndPosition, error);
+ UnlinkedFunctionExecutable* executable = codeCache->getUnlinkedGlobalFunctionExecutable(vm, name, source, debuggerMode, error);
if (globalObject.hasDebugger())
globalObject.debugger()->sourceParsed(&exec, source.provider(), error.line(), error.message());
Modified: trunk/Source/_javascript_Core/bytecode/UnlinkedFunctionExecutable.h (237477 => 237478)
--- trunk/Source/_javascript_Core/bytecode/UnlinkedFunctionExecutable.h 2018-10-26 19:10:25 UTC (rev 237477)
+++ trunk/Source/_javascript_Core/bytecode/UnlinkedFunctionExecutable.h 2018-10-26 19:33:55 UTC (rev 237478)
@@ -107,7 +107,7 @@
static UnlinkedFunctionExecutable* fromGlobalCode(
const Identifier&, ExecState&, const SourceCode&, JSObject*& exception,
- int overrideLineNumber, std::optional<int> functionConstructorParametersEndPosition);
+ int overrideLineNumber);
JS_EXPORT_PRIVATE FunctionExecutable* link(VM&, const SourceCode& parentSource, std::optional<int> overrideLineNumber = std::nullopt, Intrinsic = NoIntrinsic);
Modified: trunk/Source/_javascript_Core/parser/Parser.cpp (237477 => 237478)
--- trunk/Source/_javascript_Core/parser/Parser.cpp 2018-10-26 19:10:25 UTC (rev 237477)
+++ trunk/Source/_javascript_Core/parser/Parser.cpp 2018-10-26 19:33:55 UTC (rev 237478)
@@ -194,7 +194,7 @@
}
template <typename LexerType>
-String Parser<LexerType>::parseInner(const Identifier& calleeName, SourceParseMode parseMode, ParsingContext parsingContext, std::optional<int> functionConstructorParametersEndPosition)
+String Parser<LexerType>::parseInner(const Identifier& calleeName, SourceParseMode parseMode)
{
String parseError = String();
@@ -238,8 +238,6 @@
sourceElements = parseGeneratorFunctionSourceElements(context, calleeName, CheckForStrictMode);
else if (isAsyncGeneratorWrapperParseMode(parseMode))
sourceElements = parseAsyncGeneratorFunctionSourceElements(context, parseMode, isArrowFunctionBodyExpression, CheckForStrictMode);
- else if (parsingContext == ParsingContext::FunctionConstructor)
- sourceElements = parseSingleFunction(context, functionConstructorParametersEndPosition);
else
sourceElements = parseSourceElements(context, CheckForStrictMode);
}
@@ -612,38 +610,6 @@
return sourceElements;
}
-
-template <typename LexerType>
-template <class TreeBuilder> TreeSourceElements Parser<LexerType>::parseSingleFunction(TreeBuilder& context, std::optional<int> functionConstructorParametersEndPosition)
-{
- TreeSourceElements sourceElements = context.createSourceElements();
- TreeStatement statement = 0;
- switch (m_token.m_type) {
- case FUNCTION:
- statement = parseFunctionDeclaration(context, ExportType::NotExported, DeclarationDefaultContext::Standard, functionConstructorParametersEndPosition);
- break;
- case IDENT:
- if (*m_token.m_data.ident == m_vm->propertyNames->async && !m_token.m_data.escaped) {
- next();
- failIfFalse(match(FUNCTION) && !m_lexer->prevTerminator(), "Cannot parse the async function");
- statement = parseAsyncFunctionDeclaration(context, ExportType::NotExported, DeclarationDefaultContext::Standard, functionConstructorParametersEndPosition);
- break;
- }
- FALLTHROUGH;
- default:
- failDueToUnexpectedToken();
- break;
- }
-
- if (statement) {
- context.setEndOffset(statement, m_lastTokenEndPosition.offset);
- context.appendStatement(sourceElements, statement);
- }
-
- propagateError();
- return sourceElements;
-}
-
template <typename LexerType>
template <class TreeBuilder> TreeStatement Parser<LexerType>::parseStatementListItem(TreeBuilder& context, const Identifier*& directive, unsigned* directiveLiteralLength)
@@ -2297,7 +2263,7 @@
}
template <typename LexerType>
-template <class TreeBuilder> bool Parser<LexerType>::parseFunctionInfo(TreeBuilder& context, FunctionNameRequirements requirements, SourceParseMode mode, bool nameIsInContainingScope, ConstructorKind constructorKind, SuperBinding expectedSuperBinding, int functionKeywordStart, ParserFunctionInfo<TreeBuilder>& functionInfo, FunctionDefinitionType functionDefinitionType, std::optional<int> functionConstructorParametersEndPosition)
+template <class TreeBuilder> bool Parser<LexerType>::parseFunctionInfo(TreeBuilder& context, FunctionNameRequirements requirements, SourceParseMode mode, bool nameIsInContainingScope, ConstructorKind constructorKind, SuperBinding expectedSuperBinding, int functionKeywordStart, ParserFunctionInfo<TreeBuilder>& functionInfo, FunctionDefinitionType functionDefinitionType)
{
RELEASE_ASSERT(isFunctionParseMode(mode));
@@ -2493,10 +2459,6 @@
}
matchOrFail(OPENBRACE, "Expected an opening '{' at the start of a ", stringForFunctionMode(mode), " body");
-
- // If the code is invoked from function constructor, we need to ensure that parameters are only composed by the string offered as parameters.
- if (UNLIKELY(functionConstructorParametersEndPosition))
- semanticFailIfFalse(lastTokenEndPosition().offset == *functionConstructorParametersEndPosition, "Parameters should match arguments offered as parameters in Function constructor");
// BytecodeGenerator emits code to throw TypeError when a class constructor is "call"ed.
// Set ConstructorKind to None for non-constructor methods of classes.
@@ -2631,7 +2593,7 @@
static FunctionMetadataNode* getMetadata(ParserFunctionInfo<ASTBuilder>& info) { return info.body; }
template <typename LexerType>
-template <class TreeBuilder> TreeStatement Parser<LexerType>::parseFunctionDeclaration(TreeBuilder& context, ExportType exportType, DeclarationDefaultContext declarationDefaultContext, std::optional<int> functionConstructorParametersEndPosition)
+template <class TreeBuilder> TreeStatement Parser<LexerType>::parseFunctionDeclaration(TreeBuilder& context, ExportType exportType, DeclarationDefaultContext declarationDefaultContext)
{
ASSERT(match(FUNCTION));
JSTokenLocation location(tokenLocation());
@@ -2668,7 +2630,7 @@
functionInfo.name = &m_vm->propertyNames->builtinNames().starDefaultPrivateName();
}
- failIfFalse((parseFunctionInfo(context, requirements, parseMode, true, ConstructorKind::None, SuperBinding::NotNeeded, functionKeywordStart, functionInfo, FunctionDefinitionType::Declaration, functionConstructorParametersEndPosition)), "Cannot parse this function");
+ failIfFalse((parseFunctionInfo(context, requirements, parseMode, true, ConstructorKind::None, SuperBinding::NotNeeded, functionKeywordStart, functionInfo, FunctionDefinitionType::Declaration)), "Cannot parse this function");
ASSERT(functionInfo.name);
std::pair<DeclarationResultMask, ScopeRef> functionDeclaration = declareFunction(functionInfo.name);
@@ -2689,7 +2651,7 @@
}
template <typename LexerType>
-template <class TreeBuilder> TreeStatement Parser<LexerType>::parseAsyncFunctionDeclaration(TreeBuilder& context, ExportType exportType, DeclarationDefaultContext declarationDefaultContext, std::optional<int> functionConstructorParametersEndPosition)
+template <class TreeBuilder> TreeStatement Parser<LexerType>::parseAsyncFunctionDeclaration(TreeBuilder& context, ExportType exportType, DeclarationDefaultContext declarationDefaultContext)
{
ASSERT(match(FUNCTION));
JSTokenLocation location(tokenLocation());
@@ -2726,7 +2688,7 @@
functionInfo.name = &m_vm->propertyNames->builtinNames().starDefaultPrivateName();
}
- failIfFalse((parseFunctionInfo(context, requirements, parseMode, true, ConstructorKind::None, SuperBinding::NotNeeded, functionKeywordStart, functionInfo, FunctionDefinitionType::Declaration, functionConstructorParametersEndPosition)), "Cannot parse this async function");
+ failIfFalse((parseFunctionInfo(context, requirements, parseMode, true, ConstructorKind::None, SuperBinding::NotNeeded, functionKeywordStart, functionInfo, FunctionDefinitionType::Declaration)), "Cannot parse this async function");
failIfFalse(functionInfo.name, "Async function statements must have a name");
std::pair<DeclarationResultMask, ScopeRef> functionDeclaration = declareFunction(functionInfo.name);
Modified: trunk/Source/_javascript_Core/parser/Parser.h (237477 => 237478)
--- trunk/Source/_javascript_Core/parser/Parser.h 2018-10-26 19:10:25 UTC (rev 237477)
+++ trunk/Source/_javascript_Core/parser/Parser.h 2018-10-26 19:33:55 UTC (rev 237478)
@@ -859,8 +859,10 @@
unsigned m_index;
};
-enum class ArgumentType { Normal, Spread };
-enum class ParsingContext { Program, FunctionConstructor, Eval };
+enum class ArgumentType {
+ Normal,
+ Spread
+};
template <typename LexerType>
class Parser {
@@ -872,7 +874,7 @@
~Parser();
template <class ParsedNode>
- std::unique_ptr<ParsedNode> parse(ParserError&, const Identifier&, SourceParseMode, ParsingContext, std::optional<int> functionConstructorParametersEndPosition = std::nullopt);
+ std::unique_ptr<ParsedNode> parse(ParserError&, const Identifier&, SourceParseMode);
JSTextPosition positionBeforeLastNewline() const { return m_lexer->positionBeforeLastNewline(); }
JSTokenLocation locationBeforeLastToken() const { return m_lexer->lastTokenLocation(); }
@@ -1310,9 +1312,8 @@
}
Parser();
+ String parseInner(const Identifier&, SourceParseMode);
- String parseInner(const Identifier&, SourceParseMode, ParsingContext, std::optional<int> functionConstructorParametersEndPosition = std::nullopt);
-
void didFinishParsing(SourceElements*, DeclarationStacks::FunctionStack&&, VariableEnvironment&, UniquedStringImplPtrSet&&, CodeFeatures, int);
// Used to determine type of error to report.
@@ -1523,14 +1524,13 @@
template <class TreeBuilder> TreeSourceElements parseGeneratorFunctionSourceElements(TreeBuilder&, const Identifier& name, SourceElementsMode);
template <class TreeBuilder> TreeSourceElements parseAsyncFunctionSourceElements(TreeBuilder&, SourceParseMode, bool isArrowFunctionBodyExpression, SourceElementsMode);
template <class TreeBuilder> TreeSourceElements parseAsyncGeneratorFunctionSourceElements(TreeBuilder&, SourceParseMode, bool isArrowFunctionBodyExpression, SourceElementsMode);
- template <class TreeBuilder> TreeSourceElements parseSingleFunction(TreeBuilder&, std::optional<int> functionConstructorParametersEndPosition);
template <class TreeBuilder> TreeStatement parseStatementListItem(TreeBuilder&, const Identifier*& directive, unsigned* directiveLiteralLength);
template <class TreeBuilder> TreeStatement parseStatement(TreeBuilder&, const Identifier*& directive, unsigned* directiveLiteralLength = 0);
enum class ExportType { Exported, NotExported };
template <class TreeBuilder> TreeStatement parseClassDeclaration(TreeBuilder&, ExportType = ExportType::NotExported, DeclarationDefaultContext = DeclarationDefaultContext::Standard);
- template <class TreeBuilder> TreeStatement parseFunctionDeclaration(TreeBuilder&, ExportType = ExportType::NotExported, DeclarationDefaultContext = DeclarationDefaultContext::Standard, std::optional<int> functionConstructorParametersEndPosition = std::nullopt);
+ template <class TreeBuilder> TreeStatement parseFunctionDeclaration(TreeBuilder&, ExportType = ExportType::NotExported, DeclarationDefaultContext = DeclarationDefaultContext::Standard);
template <class TreeBuilder> TreeStatement parseFunctionDeclarationStatement(TreeBuilder&, bool isAsync, bool parentAllowsFunctionDeclarationAsStatement);
- template <class TreeBuilder> TreeStatement parseAsyncFunctionDeclaration(TreeBuilder&, ExportType = ExportType::NotExported, DeclarationDefaultContext = DeclarationDefaultContext::Standard, std::optional<int> functionConstructorParametersEndPosition = std::nullopt);
+ template <class TreeBuilder> TreeStatement parseAsyncFunctionDeclaration(TreeBuilder&, ExportType = ExportType::NotExported, DeclarationDefaultContext = DeclarationDefaultContext::Standard);
template <class TreeBuilder> NEVER_INLINE bool maybeParseAsyncFunctionDeclarationStatement(TreeBuilder& context, TreeStatement& result, bool parentAllowsFunctionDeclarationAsStatement);
template <class TreeBuilder> TreeStatement parseVariableDeclaration(TreeBuilder&, DeclarationType, ExportType = ExportType::NotExported);
template <class TreeBuilder> TreeStatement parseDoWhileStatement(TreeBuilder&);
@@ -1599,7 +1599,7 @@
template <class TreeBuilder> ALWAYS_INLINE TreeExpression createResolveAndUseVariable(TreeBuilder&, const Identifier*, bool isEval, const JSTextPosition&, const JSTokenLocation&);
enum class FunctionDefinitionType { _expression_, Declaration, Method };
- template <class TreeBuilder> NEVER_INLINE bool parseFunctionInfo(TreeBuilder&, FunctionNameRequirements, SourceParseMode, bool nameIsInContainingScope, ConstructorKind, SuperBinding, int functionKeywordStart, ParserFunctionInfo<TreeBuilder>&, FunctionDefinitionType, std::optional<int> functionConstructorParametersEndPosition = std::nullopt);
+ template <class TreeBuilder> NEVER_INLINE bool parseFunctionInfo(TreeBuilder&, FunctionNameRequirements, SourceParseMode, bool nameIsInContainingScope, ConstructorKind, SuperBinding, int functionKeywordStart, ParserFunctionInfo<TreeBuilder>&, FunctionDefinitionType);
ALWAYS_INLINE bool isArrowFunctionParameters();
@@ -1847,7 +1847,7 @@
template <typename LexerType>
template <class ParsedNode>
-std::unique_ptr<ParsedNode> Parser<LexerType>::parse(ParserError& error, const Identifier& calleeName, SourceParseMode parseMode, ParsingContext parsingContext, std::optional<int> functionConstructorParametersEndPosition)
+std::unique_ptr<ParsedNode> Parser<LexerType>::parse(ParserError& error, const Identifier& calleeName, SourceParseMode parseMode)
{
int errLine;
String errMsg;
@@ -1864,7 +1864,7 @@
ASSERT(m_source->startColumn() > OrdinalNumber::beforeFirst());
unsigned startColumn = m_source->startColumn().zeroBasedInt();
- String parseError = parseInner(calleeName, parseMode, parsingContext, functionConstructorParametersEndPosition);
+ String parseError = parseInner(calleeName, parseMode);
int lineNumber = m_lexer->lineNumber();
bool lexError = m_lexer->sawError();
@@ -1959,7 +1959,7 @@
std::unique_ptr<ParsedNode> result;
if (source.provider()->source().is8Bit()) {
Parser<Lexer<LChar>> parser(vm, source, builtinMode, strictMode, scriptMode, parseMode, superBinding, defaultConstructorKind, derivedContextType, isEvalNode<ParsedNode>(), evalContextType, debuggerParseData);
- result = parser.parse<ParsedNode>(error, name, parseMode, isEvalNode<ParsedNode>() ? ParsingContext::Eval : ParsingContext::Program);
+ result = parser.parse<ParsedNode>(error, name, parseMode);
if (positionBeforeLastNewline)
*positionBeforeLastNewline = parser.positionBeforeLastNewline();
if (builtinMode == JSParserBuiltinMode::Builtin) {
@@ -1972,7 +1972,7 @@
} else {
ASSERT_WITH_MESSAGE(defaultConstructorKind == ConstructorKind::None, "BuiltinExecutables::createDefaultConstructor should always use a 8-bit string");
Parser<Lexer<UChar>> parser(vm, source, builtinMode, strictMode, scriptMode, parseMode, superBinding, defaultConstructorKind, derivedContextType, isEvalNode<ParsedNode>(), evalContextType, debuggerParseData);
- result = parser.parse<ParsedNode>(error, name, parseMode, isEvalNode<ParsedNode>() ? ParsingContext::Eval : ParsingContext::Program);
+ result = parser.parse<ParsedNode>(error, name, parseMode);
if (positionBeforeLastNewline)
*positionBeforeLastNewline = parser.positionBeforeLastNewline();
}
@@ -1986,37 +1986,4 @@
return result;
}
-inline std::unique_ptr<ProgramNode> parseFunctionForFunctionConstructor(VM& vm, const SourceCode& source, ParserError& error, JSTextPosition* positionBeforeLastNewline, std::optional<int> functionConstructorParametersEndPosition)
-{
- ASSERT(!source.provider()->source().isNull());
-
- MonotonicTime before;
- if (UNLIKELY(Options::reportParseTimes()))
- before = MonotonicTime::now();
-
- Identifier name;
- bool isEvalNode = false;
- std::unique_ptr<ProgramNode> result;
- if (source.provider()->source().is8Bit()) {
- Parser<Lexer<LChar>> parser(&vm, source, JSParserBuiltinMode::NotBuiltin, JSParserStrictMode::NotStrict, JSParserScriptMode::Classic, SourceParseMode::ProgramMode, SuperBinding::NotNeeded, ConstructorKind::None, DerivedContextType::None, isEvalNode, EvalContextType::None, nullptr);
- result = parser.parse<ProgramNode>(error, name, SourceParseMode::ProgramMode, ParsingContext::FunctionConstructor, functionConstructorParametersEndPosition);
- if (positionBeforeLastNewline)
- *positionBeforeLastNewline = parser.positionBeforeLastNewline();
- } else {
- Parser<Lexer<UChar>> parser(&vm, source, JSParserBuiltinMode::NotBuiltin, JSParserStrictMode::NotStrict, JSParserScriptMode::Classic, SourceParseMode::ProgramMode, SuperBinding::NotNeeded, ConstructorKind::None, DerivedContextType::None, isEvalNode, EvalContextType::None, nullptr);
- result = parser.parse<ProgramNode>(error, name, SourceParseMode::ProgramMode, ParsingContext::FunctionConstructor, functionConstructorParametersEndPosition);
- if (positionBeforeLastNewline)
- *positionBeforeLastNewline = parser.positionBeforeLastNewline();
- }
-
- if (UNLIKELY(Options::reportParseTimes())) {
- MonotonicTime after = MonotonicTime::now();
- ParseHash hash(source);
- dataLogLn(result ? "Parsed #" : "Failed to parse #", hash.hashForCall(), "/#", hash.hashForConstruct(), " in ", (after - before).milliseconds(), " ms.");
- }
-
- return result;
-}
-
-
} // namespace
Modified: trunk/Source/_javascript_Core/parser/ParserModes.h (237477 => 237478)
--- trunk/Source/_javascript_Core/parser/ParserModes.h 2018-10-26 19:10:25 UTC (rev 237477)
+++ trunk/Source/_javascript_Core/parser/ParserModes.h 2018-10-26 19:33:55 UTC (rev 237478)
@@ -33,6 +33,7 @@
enum class JSParserStrictMode { NotStrict, Strict };
enum class JSParserBuiltinMode { NotBuiltin, Builtin };
enum class JSParserScriptMode { Classic, Module };
+enum class JSParserCodeType { Program, Function, Module };
enum class ConstructorKind { None, Base, Extends };
enum class SuperBinding { Needed, NotNeeded };
Modified: trunk/Source/_javascript_Core/parser/ParserTokens.h (237477 => 237478)
--- trunk/Source/_javascript_Core/parser/ParserTokens.h 2018-10-26 19:10:25 UTC (rev 237477)
+++ trunk/Source/_javascript_Core/parser/ParserTokens.h 2018-10-26 19:33:55 UTC (rev 237478)
@@ -193,6 +193,7 @@
struct JSTextPosition {
JSTextPosition() = default;
JSTextPosition(int _line, int _offset, int _lineStartOffset) : line(_line), offset(_offset), lineStartOffset(_lineStartOffset) { }
+ JSTextPosition(const JSTextPosition& other) : line(other.line), offset(other.offset), lineStartOffset(other.lineStartOffset) { }
JSTextPosition operator+(int adjustment) const { return JSTextPosition(line, offset + adjustment, lineStartOffset); }
JSTextPosition operator+(unsigned adjustment) const { return *this + static_cast<int>(adjustment); }
@@ -245,6 +246,13 @@
struct JSTokenLocation {
JSTokenLocation() = default;
+ JSTokenLocation(const JSTokenLocation& location)
+ {
+ line = location.line;
+ lineStartOffset = location.lineStartOffset;
+ startOffset = location.startOffset;
+ endOffset = location.endOffset;
+ }
int line { 0 };
unsigned lineStartOffset { 0 };
Modified: trunk/Source/_javascript_Core/parser/SourceCodeKey.h (237477 => 237478)
--- trunk/Source/_javascript_Core/parser/SourceCodeKey.h 2018-10-26 19:10:25 UTC (rev 237477)
+++ trunk/Source/_javascript_Core/parser/SourceCodeKey.h 2018-10-26 19:33:55 UTC (rev 237478)
@@ -29,7 +29,6 @@
#include "ParserModes.h"
#include "UnlinkedSourceCode.h"
#include <wtf/HashTraits.h>
-#include <wtf/Hasher.h>
namespace JSC {
@@ -72,17 +71,18 @@
class SourceCodeKey {
public:
- SourceCodeKey() = default;
+ SourceCodeKey()
+ {
+ }
SourceCodeKey(
const UnlinkedSourceCode& sourceCode, const String& name, SourceCodeType codeType, JSParserStrictMode strictMode,
JSParserScriptMode scriptMode, DerivedContextType derivedContextType, EvalContextType evalContextType, bool isArrowFunctionContext,
- DebuggerMode debuggerMode, TypeProfilerEnabled typeProfilerEnabled, ControlFlowProfilerEnabled controlFlowProfilerEnabled, std::optional<int> functionConstructorParametersEndPosition)
+ DebuggerMode debuggerMode, TypeProfilerEnabled typeProfilerEnabled, ControlFlowProfilerEnabled controlFlowProfilerEnabled)
: m_sourceCode(sourceCode)
, m_name(name)
, m_flags(codeType, strictMode, scriptMode, derivedContextType, evalContextType, isArrowFunctionContext, debuggerMode, typeProfilerEnabled, controlFlowProfilerEnabled)
- , m_functionConstructorParametersEndPosition(functionConstructorParametersEndPosition.value_or(-1))
- , m_hash(sourceCode.hash() ^ computeHash(m_flags.bits(), m_functionConstructorParametersEndPosition))
+ , m_hash(sourceCode.hash() ^ m_flags.bits())
{
}
@@ -108,7 +108,6 @@
return m_hash == other.m_hash
&& length() == other.length()
&& m_flags == other.m_flags
- && m_functionConstructorParametersEndPosition == other.m_functionConstructorParametersEndPosition
&& m_name == other.m_name
&& string() == other.string();
}
@@ -128,8 +127,7 @@
UnlinkedSourceCode m_sourceCode;
String m_name;
SourceCodeFlags m_flags;
- int m_functionConstructorParametersEndPosition { -1 };
- unsigned m_hash { 0 };
+ unsigned m_hash;
};
} // namespace JSC
Modified: trunk/Source/_javascript_Core/runtime/CodeCache.cpp (237477 => 237478)
--- trunk/Source/_javascript_Core/runtime/CodeCache.cpp 2018-10-26 19:10:25 UTC (rev 237477)
+++ trunk/Source/_javascript_Core/runtime/CodeCache.cpp 2018-10-26 19:33:55 UTC (rev 237478)
@@ -57,8 +57,7 @@
source, String(), CacheTypes<UnlinkedCodeBlockType>::codeType, strictMode, scriptMode,
derivedContextType, evalContextType, isArrowFunctionContext, debuggerMode,
vm.typeProfiler() ? TypeProfilerEnabled::Yes : TypeProfilerEnabled::No,
- vm.controlFlowProfiler() ? ControlFlowProfilerEnabled::Yes : ControlFlowProfilerEnabled::No,
- std::nullopt);
+ vm.controlFlowProfiler() ? ControlFlowProfilerEnabled::Yes : ControlFlowProfilerEnabled::No);
SourceCodeValue* cache = m_sourceCode.findCacheAndUpdateAge(key);
if (cache && Options::useCodeCache()) {
UnlinkedCodeBlockType* unlinkedCodeBlock = jsCast<UnlinkedCodeBlockType*>(cache->cell.get());
@@ -96,7 +95,7 @@
return getUnlinkedGlobalCodeBlock<UnlinkedModuleProgramCodeBlock>(vm, executable, source, JSParserStrictMode::Strict, JSParserScriptMode::Module, debuggerMode, error, EvalContextType::None);
}
-UnlinkedFunctionExecutable* CodeCache::getUnlinkedGlobalFunctionExecutable(VM& vm, const Identifier& name, const SourceCode& source, DebuggerMode debuggerMode, std::optional<int> functionConstructorParametersEndPosition, ParserError& error)
+UnlinkedFunctionExecutable* CodeCache::getUnlinkedGlobalFunctionExecutable(VM& vm, const Identifier& name, const SourceCode& source, DebuggerMode debuggerMode, ParserError& error)
{
bool isArrowFunctionContext = false;
SourceCodeKey key(
@@ -108,8 +107,7 @@
isArrowFunctionContext,
debuggerMode,
vm.typeProfiler() ? TypeProfilerEnabled::Yes : TypeProfilerEnabled::No,
- vm.controlFlowProfiler() ? ControlFlowProfilerEnabled::Yes : ControlFlowProfilerEnabled::No,
- functionConstructorParametersEndPosition);
+ vm.controlFlowProfiler() ? ControlFlowProfilerEnabled::Yes : ControlFlowProfilerEnabled::No);
SourceCodeValue* cache = m_sourceCode.findCacheAndUpdateAge(key);
if (cache && Options::useCodeCache()) {
UnlinkedFunctionExecutable* executable = jsCast<UnlinkedFunctionExecutable*>(cache->cell.get());
Modified: trunk/Source/_javascript_Core/runtime/CodeCache.h (237477 => 237478)
--- trunk/Source/_javascript_Core/runtime/CodeCache.h 2018-10-26 19:10:25 UTC (rev 237477)
+++ trunk/Source/_javascript_Core/runtime/CodeCache.h 2018-10-26 19:33:55 UTC (rev 237478)
@@ -194,7 +194,7 @@
UnlinkedProgramCodeBlock* getUnlinkedProgramCodeBlock(VM&, ProgramExecutable*, const SourceCode&, JSParserStrictMode, DebuggerMode, ParserError&);
UnlinkedEvalCodeBlock* getUnlinkedEvalCodeBlock(VM&, IndirectEvalExecutable*, const SourceCode&, JSParserStrictMode, DebuggerMode, ParserError&, EvalContextType);
UnlinkedModuleProgramCodeBlock* getUnlinkedModuleProgramCodeBlock(VM&, ModuleProgramExecutable*, const SourceCode&, DebuggerMode, ParserError&);
- UnlinkedFunctionExecutable* getUnlinkedGlobalFunctionExecutable(VM&, const Identifier&, const SourceCode&, DebuggerMode, std::optional<int> functionConstructorParametersEndPosition, ParserError&);
+ UnlinkedFunctionExecutable* getUnlinkedGlobalFunctionExecutable(VM&, const Identifier&, const SourceCode&, DebuggerMode, ParserError&);
void clear() { m_sourceCode.clear(); }
Modified: trunk/Source/_javascript_Core/runtime/FunctionConstructor.cpp (237477 => 237478)
--- trunk/Source/_javascript_Core/runtime/FunctionConstructor.cpp 2018-10-26 19:10:25 UTC (rev 237477)
+++ trunk/Source/_javascript_Core/runtime/FunctionConstructor.cpp 2018-10-26 19:33:55 UTC (rev 237478)
@@ -169,7 +169,7 @@
SourceCode source = makeSource(program, sourceOrigin, sourceURL, position);
JSObject* exception = nullptr;
- FunctionExecutable* function = FunctionExecutable::fromGlobalCode(functionName, *exec, source, exception, overrideLineNumber, std::nullopt);
+ FunctionExecutable* function = FunctionExecutable::fromGlobalCode(functionName, *exec, source, exception, overrideLineNumber);
if (!function) {
ASSERT(exception);
return throwException(exec, scope, exception);
Modified: trunk/Source/_javascript_Core/runtime/FunctionExecutable.cpp (237477 => 237478)
--- trunk/Source/_javascript_Core/runtime/FunctionExecutable.cpp 2018-10-26 19:10:25 UTC (rev 237477)
+++ trunk/Source/_javascript_Core/runtime/FunctionExecutable.cpp 2018-10-26 19:33:55 UTC (rev 237478)
@@ -94,11 +94,11 @@
FunctionExecutable* FunctionExecutable::fromGlobalCode(
const Identifier& name, ExecState& exec, const SourceCode& source,
- JSObject*& exception, int overrideLineNumber, std::optional<int> functionConstructorParametersEndPosition)
+ JSObject*& exception, int overrideLineNumber)
{
UnlinkedFunctionExecutable* unlinkedExecutable =
UnlinkedFunctionExecutable::fromGlobalCode(
- name, exec, source, exception, overrideLineNumber, functionConstructorParametersEndPosition);
+ name, exec, source, exception, overrideLineNumber);
if (!unlinkedExecutable)
return nullptr;
Modified: trunk/Source/_javascript_Core/runtime/FunctionExecutable.h (237477 => 237478)
--- trunk/Source/_javascript_Core/runtime/FunctionExecutable.h 2018-10-26 19:10:25 UTC (rev 237477)
+++ trunk/Source/_javascript_Core/runtime/FunctionExecutable.h 2018-10-26 19:33:55 UTC (rev 237478)
@@ -55,7 +55,7 @@
}
static FunctionExecutable* fromGlobalCode(
const Identifier& name, ExecState&, const SourceCode&,
- JSObject*& exception, int overrideLineNumber, std::optional<int> functionConstructorParametersEndPosition);
+ JSObject*& exception, int overrideLineNumber);
static void destroy(JSCell*);