Diff
Modified: trunk/Source/_javascript_Core/ChangeLog (237491 => 237492)
--- trunk/Source/_javascript_Core/ChangeLog 2018-10-27 14:28:38 UTC (rev 237491)
+++ trunk/Source/_javascript_Core/ChangeLog 2018-10-27 14:41:22 UTC (rev 237492)
@@ -1,3 +1,28 @@
+2018-10-27 Yusuke Suzuki <[email protected]>
+
+ Unreviewed, partial rolling in r237254
+ https://bugs.webkit.org/show_bug.cgi?id=190340
+
+ We do not use the added function right now to investigate what is the reason of the regression.
+ It also does not include any Parser.{h,cpp} changes to ensure that Parser.cpp's inlining decision
+ seems culprit of the regression on iOS devices.
+
+ * bytecode/UnlinkedFunctionExecutable.cpp:
+ (JSC::UnlinkedFunctionExecutable::fromGlobalCode):
+ * bytecode/UnlinkedFunctionExecutable.h:
+ * parser/SourceCodeKey.h:
+ (JSC::SourceCodeKey::SourceCodeKey):
+ (JSC::SourceCodeKey::operator== const):
+ * runtime/CodeCache.cpp:
+ (JSC::CodeCache::getUnlinkedGlobalCodeBlock):
+ (JSC::CodeCache::getUnlinkedGlobalFunctionExecutable):
+ * runtime/CodeCache.h:
+ * runtime/FunctionConstructor.cpp:
+ (JSC::constructFunctionSkippingEvalEnabledCheck):
+ * runtime/FunctionExecutable.cpp:
+ (JSC::FunctionExecutable::fromGlobalCode):
+ * runtime/FunctionExecutable.h:
+
2018-10-26 Commit Queue <[email protected]>
Unreviewed, rolling out r237479 and r237484.
Modified: trunk/Source/_javascript_Core/bytecode/UnlinkedFunctionExecutable.cpp (237491 => 237492)
--- trunk/Source/_javascript_Core/bytecode/UnlinkedFunctionExecutable.cpp 2018-10-27 14:28:38 UTC (rev 237491)
+++ trunk/Source/_javascript_Core/bytecode/UnlinkedFunctionExecutable.cpp 2018-10-27 14:41:22 UTC (rev 237492)
@@ -174,7 +174,7 @@
UnlinkedFunctionExecutable* UnlinkedFunctionExecutable::fromGlobalCode(
const Identifier& name, ExecState& exec, const SourceCode& source,
- JSObject*& exception, int overrideLineNumber)
+ JSObject*& exception, int overrideLineNumber, std::optional<int> functionConstructorParametersEndPosition)
{
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, error);
+ UnlinkedFunctionExecutable* executable = codeCache->getUnlinkedGlobalFunctionExecutable(vm, name, source, debuggerMode, functionConstructorParametersEndPosition, error);
if (globalObject.hasDebugger())
globalObject.debugger()->sourceParsed(&exec, source.provider(), error.line(), error.message());
Modified: trunk/Source/_javascript_Core/bytecode/UnlinkedFunctionExecutable.h (237491 => 237492)
--- trunk/Source/_javascript_Core/bytecode/UnlinkedFunctionExecutable.h 2018-10-27 14:28:38 UTC (rev 237491)
+++ trunk/Source/_javascript_Core/bytecode/UnlinkedFunctionExecutable.h 2018-10-27 14:41:22 UTC (rev 237492)
@@ -107,7 +107,7 @@
static UnlinkedFunctionExecutable* fromGlobalCode(
const Identifier&, ExecState&, const SourceCode&, JSObject*& exception,
- int overrideLineNumber);
+ int overrideLineNumber, std::optional<int> functionConstructorParametersEndPosition);
JS_EXPORT_PRIVATE FunctionExecutable* link(VM&, const SourceCode& parentSource, std::optional<int> overrideLineNumber = std::nullopt, Intrinsic = NoIntrinsic);
Modified: trunk/Source/_javascript_Core/parser/SourceCodeKey.h (237491 => 237492)
--- trunk/Source/_javascript_Core/parser/SourceCodeKey.h 2018-10-27 14:28:38 UTC (rev 237491)
+++ trunk/Source/_javascript_Core/parser/SourceCodeKey.h 2018-10-27 14:41:22 UTC (rev 237492)
@@ -29,6 +29,7 @@
#include "ParserModes.h"
#include "UnlinkedSourceCode.h"
#include <wtf/HashTraits.h>
+#include <wtf/Hasher.h>
namespace JSC {
@@ -71,18 +72,17 @@
class SourceCodeKey {
public:
- SourceCodeKey()
- {
- }
+ SourceCodeKey() = default;
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)
+ DebuggerMode debuggerMode, TypeProfilerEnabled typeProfilerEnabled, ControlFlowProfilerEnabled controlFlowProfilerEnabled, std::optional<int> functionConstructorParametersEndPosition)
: m_sourceCode(sourceCode)
, m_name(name)
, m_flags(codeType, strictMode, scriptMode, derivedContextType, evalContextType, isArrowFunctionContext, debuggerMode, typeProfilerEnabled, controlFlowProfilerEnabled)
- , m_hash(sourceCode.hash() ^ m_flags.bits())
+ , m_functionConstructorParametersEndPosition(functionConstructorParametersEndPosition.value_or(-1))
+ , m_hash(sourceCode.hash() ^ computeHash(m_flags.bits(), m_functionConstructorParametersEndPosition))
{
}
@@ -108,6 +108,7 @@
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();
}
@@ -127,7 +128,8 @@
UnlinkedSourceCode m_sourceCode;
String m_name;
SourceCodeFlags m_flags;
- unsigned m_hash;
+ int m_functionConstructorParametersEndPosition { -1 };
+ unsigned m_hash { 0 };
};
} // namespace JSC
Modified: trunk/Source/_javascript_Core/runtime/CodeCache.cpp (237491 => 237492)
--- trunk/Source/_javascript_Core/runtime/CodeCache.cpp 2018-10-27 14:28:38 UTC (rev 237491)
+++ trunk/Source/_javascript_Core/runtime/CodeCache.cpp 2018-10-27 14:41:22 UTC (rev 237492)
@@ -57,7 +57,8 @@
source, String(), CacheTypes<UnlinkedCodeBlockType>::codeType, strictMode, scriptMode,
derivedContextType, evalContextType, isArrowFunctionContext, debuggerMode,
vm.typeProfiler() ? TypeProfilerEnabled::Yes : TypeProfilerEnabled::No,
- vm.controlFlowProfiler() ? ControlFlowProfilerEnabled::Yes : ControlFlowProfilerEnabled::No);
+ vm.controlFlowProfiler() ? ControlFlowProfilerEnabled::Yes : ControlFlowProfilerEnabled::No,
+ std::nullopt);
SourceCodeValue* cache = m_sourceCode.findCacheAndUpdateAge(key);
if (cache && Options::useCodeCache()) {
UnlinkedCodeBlockType* unlinkedCodeBlock = jsCast<UnlinkedCodeBlockType*>(cache->cell.get());
@@ -95,7 +96,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, ParserError& error)
+UnlinkedFunctionExecutable* CodeCache::getUnlinkedGlobalFunctionExecutable(VM& vm, const Identifier& name, const SourceCode& source, DebuggerMode debuggerMode, std::optional<int> functionConstructorParametersEndPosition, ParserError& error)
{
bool isArrowFunctionContext = false;
SourceCodeKey key(
@@ -107,7 +108,8 @@
isArrowFunctionContext,
debuggerMode,
vm.typeProfiler() ? TypeProfilerEnabled::Yes : TypeProfilerEnabled::No,
- vm.controlFlowProfiler() ? ControlFlowProfilerEnabled::Yes : ControlFlowProfilerEnabled::No);
+ vm.controlFlowProfiler() ? ControlFlowProfilerEnabled::Yes : ControlFlowProfilerEnabled::No,
+ functionConstructorParametersEndPosition);
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 (237491 => 237492)
--- trunk/Source/_javascript_Core/runtime/CodeCache.h 2018-10-27 14:28:38 UTC (rev 237491)
+++ trunk/Source/_javascript_Core/runtime/CodeCache.h 2018-10-27 14:41:22 UTC (rev 237492)
@@ -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, ParserError&);
+ UnlinkedFunctionExecutable* getUnlinkedGlobalFunctionExecutable(VM&, const Identifier&, const SourceCode&, DebuggerMode, std::optional<int> functionConstructorParametersEndPosition, ParserError&);
void clear() { m_sourceCode.clear(); }
Modified: trunk/Source/_javascript_Core/runtime/FunctionConstructor.cpp (237491 => 237492)
--- trunk/Source/_javascript_Core/runtime/FunctionConstructor.cpp 2018-10-27 14:28:38 UTC (rev 237491)
+++ trunk/Source/_javascript_Core/runtime/FunctionConstructor.cpp 2018-10-27 14:41:22 UTC (rev 237492)
@@ -169,7 +169,7 @@
SourceCode source = makeSource(program, sourceOrigin, sourceURL, position);
JSObject* exception = nullptr;
- FunctionExecutable* function = FunctionExecutable::fromGlobalCode(functionName, *exec, source, exception, overrideLineNumber);
+ FunctionExecutable* function = FunctionExecutable::fromGlobalCode(functionName, *exec, source, exception, overrideLineNumber, std::nullopt);
if (!function) {
ASSERT(exception);
return throwException(exec, scope, exception);
Modified: trunk/Source/_javascript_Core/runtime/FunctionExecutable.cpp (237491 => 237492)
--- trunk/Source/_javascript_Core/runtime/FunctionExecutable.cpp 2018-10-27 14:28:38 UTC (rev 237491)
+++ trunk/Source/_javascript_Core/runtime/FunctionExecutable.cpp 2018-10-27 14:41:22 UTC (rev 237492)
@@ -94,11 +94,11 @@
FunctionExecutable* FunctionExecutable::fromGlobalCode(
const Identifier& name, ExecState& exec, const SourceCode& source,
- JSObject*& exception, int overrideLineNumber)
+ JSObject*& exception, int overrideLineNumber, std::optional<int> functionConstructorParametersEndPosition)
{
UnlinkedFunctionExecutable* unlinkedExecutable =
UnlinkedFunctionExecutable::fromGlobalCode(
- name, exec, source, exception, overrideLineNumber);
+ name, exec, source, exception, overrideLineNumber, functionConstructorParametersEndPosition);
if (!unlinkedExecutable)
return nullptr;
Modified: trunk/Source/_javascript_Core/runtime/FunctionExecutable.h (237491 => 237492)
--- trunk/Source/_javascript_Core/runtime/FunctionExecutable.h 2018-10-27 14:28:38 UTC (rev 237491)
+++ trunk/Source/_javascript_Core/runtime/FunctionExecutable.h 2018-10-27 14:41:22 UTC (rev 237492)
@@ -55,7 +55,7 @@
}
static FunctionExecutable* fromGlobalCode(
const Identifier& name, ExecState&, const SourceCode&,
- JSObject*& exception, int overrideLineNumber);
+ JSObject*& exception, int overrideLineNumber, std::optional<int> functionConstructorParametersEndPosition);
static void destroy(JSCell*);