Diff
Modified: releases/WebKitGTK/webkit-2.24/Source/_javascript_Core/ChangeLog (241706 => 241707)
--- releases/WebKitGTK/webkit-2.24/Source/_javascript_Core/ChangeLog 2019-02-18 16:16:19 UTC (rev 241706)
+++ releases/WebKitGTK/webkit-2.24/Source/_javascript_Core/ChangeLog 2019-02-18 16:16:24 UTC (rev 241707)
@@ -1,5 +1,30 @@
2019-02-15 Yusuke Suzuki <ysuz...@apple.com>
+ [JSC] Lazily create empty RegExp
+ https://bugs.webkit.org/show_bug.cgi?id=194735
+
+ Reviewed by Keith Miller.
+
+ Some scripts do not have any RegExp. In that case, allocating MarkedBlock for RegExp is costly.
+ Previously, there was always one RegExp, "empty RegExp". This patch lazily creates it and drop
+ one MarkedBlock.
+
+ * runtime/JSGlobalObject.cpp:
+ (JSC::JSGlobalObject::init):
+ * runtime/RegExpCache.cpp:
+ (JSC::RegExpCache::ensureEmptyRegExpSlow):
+ (JSC::RegExpCache::initialize): Deleted.
+ * runtime/RegExpCache.h:
+ (JSC::RegExpCache::ensureEmptyRegExp):
+ (JSC::RegExpCache::emptyRegExp const): Deleted.
+ * runtime/RegExpCachedResult.cpp:
+ (JSC::RegExpCachedResult::lastResult):
+ * runtime/RegExpCachedResult.h:
+ * runtime/VM.cpp:
+ (JSC::VM::VM):
+
+2019-02-15 Yusuke Suzuki <ysuz...@apple.com>
+
[JSC] Make builtin objects more lazily initialized under non-JIT mode
https://bugs.webkit.org/show_bug.cgi?id=194727
Modified: releases/WebKitGTK/webkit-2.24/Source/_javascript_Core/runtime/JSGlobalObject.cpp (241706 => 241707)
--- releases/WebKitGTK/webkit-2.24/Source/_javascript_Core/runtime/JSGlobalObject.cpp 2019-02-18 16:16:19 UTC (rev 241706)
+++ releases/WebKitGTK/webkit-2.24/Source/_javascript_Core/runtime/JSGlobalObject.cpp 2019-02-18 16:16:24 UTC (rev 241707)
@@ -688,7 +688,7 @@
m_arrayConstructor.set(vm, this, arrayConstructor);
RegExpConstructor* regExpConstructor = RegExpConstructor::create(vm, RegExpConstructor::createStructure(vm, this, m_functionPrototype.get()), m_regExpPrototype.get(), m_speciesGetterSetter.get());
- m_regExpGlobalData.cachedResult().record(vm, this, vm.regExpCache()->emptyRegExp(), jsEmptyString(&vm), MatchResult(0, 0));
+ m_regExpGlobalData.cachedResult().record(vm, this, nullptr, jsEmptyString(&vm), MatchResult(0, 0));
JSArrayBufferConstructor* arrayBufferConstructor = JSArrayBufferConstructor::create(vm, JSArrayBufferConstructor::createStructure(vm, this, m_functionPrototype.get()), m_arrayBufferPrototype.get(), m_speciesGetterSetter.get());
m_arrayBufferPrototype->putDirectWithoutTransition(vm, vm.propertyNames->constructor, arrayBufferConstructor, static_cast<unsigned>(PropertyAttribute::DontEnum));
Modified: releases/WebKitGTK/webkit-2.24/Source/_javascript_Core/runtime/RegExpCache.cpp (241706 => 241707)
--- releases/WebKitGTK/webkit-2.24/Source/_javascript_Core/runtime/RegExpCache.cpp 2019-02-18 16:16:19 UTC (rev 241706)
+++ releases/WebKitGTK/webkit-2.24/Source/_javascript_Core/runtime/RegExpCache.cpp 2019-02-18 16:16:24 UTC (rev 241707)
@@ -56,9 +56,11 @@
{
}
-void RegExpCache::initialize(VM& vm)
+RegExp* RegExpCache::ensureEmptyRegExpSlow(VM& vm)
{
- m_emptyRegExp.set(vm, RegExp::create(vm, "", NoFlags));
+ RegExp* regExp = RegExp::create(vm, "", NoFlags);
+ m_emptyRegExp.set(vm, regExp);
+ return regExp;
}
void RegExpCache::finalize(Handle<Unknown> handle, void*)
Modified: releases/WebKitGTK/webkit-2.24/Source/_javascript_Core/runtime/RegExpCache.h (241706 => 241707)
--- releases/WebKitGTK/webkit-2.24/Source/_javascript_Core/runtime/RegExpCache.h 2019-02-18 16:16:19 UTC (rev 241706)
+++ releases/WebKitGTK/webkit-2.24/Source/_javascript_Core/runtime/RegExpCache.h 2019-02-18 16:16:24 UTC (rev 241707)
@@ -46,10 +46,13 @@
RegExpCache(VM* vm);
void deleteAllCode();
- void initialize(VM&);
+ RegExp* ensureEmptyRegExp(VM& vm)
+ {
+ if (LIKELY(m_emptyRegExp))
+ return m_emptyRegExp.get();
+ return ensureEmptyRegExpSlow(vm);
+ }
- RegExp* emptyRegExp() const { return m_emptyRegExp.get(); }
-
private:
static const unsigned maxStrongCacheablePatternLength = 256;
@@ -58,6 +61,8 @@
void finalize(Handle<Unknown>, void* context) override;
+ RegExp* ensureEmptyRegExpSlow(VM&);
+
RegExp* lookupOrCreate(const WTF::String& patternString, RegExpFlags);
void addToStrongCache(RegExp*);
RegExpCacheMap m_weakCache; // Holds all regular expressions currently live.
Modified: releases/WebKitGTK/webkit-2.24/Source/_javascript_Core/runtime/RegExpCachedResult.cpp (241706 => 241707)
--- releases/WebKitGTK/webkit-2.24/Source/_javascript_Core/runtime/RegExpCachedResult.cpp 2019-02-18 16:16:19 UTC (rev 241706)
+++ releases/WebKitGTK/webkit-2.24/Source/_javascript_Core/runtime/RegExpCachedResult.cpp 2019-02-18 16:16:24 UTC (rev 241707)
@@ -45,8 +45,11 @@
JSArray* RegExpCachedResult::lastResult(ExecState* exec, JSObject* owner)
{
+ VM& vm = exec->vm();
if (!m_reified) {
- m_reifiedInput.set(exec->vm(), owner, m_lastInput.get());
+ m_reifiedInput.set(vm, owner, m_lastInput.get());
+ if (!m_lastRegExp)
+ m_lastRegExp.set(vm, owner, vm.regExpCache()->ensureEmptyRegExp(vm));
if (m_result)
m_reifiedResult.setWithoutWriteBarrier(createRegExpMatchesArray(exec, exec->lexicalGlobalObject(), m_lastInput.get(), m_lastRegExp.get(), m_result.start));
else
@@ -54,7 +57,7 @@
m_reifiedLeftContext.clear();
m_reifiedRightContext.clear();
m_reified = true;
- exec->vm().heap.writeBarrier(owner);
+ vm.heap.writeBarrier(owner);
}
return m_reifiedResult.get();
}
Modified: releases/WebKitGTK/webkit-2.24/Source/_javascript_Core/runtime/RegExpCachedResult.h (241706 => 241707)
--- releases/WebKitGTK/webkit-2.24/Source/_javascript_Core/runtime/RegExpCachedResult.h 2019-02-18 16:16:19 UTC (rev 241706)
+++ releases/WebKitGTK/webkit-2.24/Source/_javascript_Core/runtime/RegExpCachedResult.h 2019-02-18 16:16:24 UTC (rev 241707)
@@ -65,6 +65,8 @@
void visitAggregate(SlotVisitor&);
+ // m_lastRegExp would be nullptr when RegExpCachedResult is not reified.
+ // If we find m_lastRegExp is nullptr, it means this should hold the empty RegExp.
static ptrdiff_t offsetOfLastRegExp() { return OBJECT_OFFSETOF(RegExpCachedResult, m_lastRegExp); }
static ptrdiff_t offsetOfLastInput() { return OBJECT_OFFSETOF(RegExpCachedResult, m_lastInput); }
static ptrdiff_t offsetOfResult() { return OBJECT_OFFSETOF(RegExpCachedResult, m_result); }
Modified: releases/WebKitGTK/webkit-2.24/Source/_javascript_Core/runtime/VM.cpp (241706 => 241707)
--- releases/WebKitGTK/webkit-2.24/Source/_javascript_Core/runtime/VM.cpp 2019-02-18 16:16:19 UTC (rev 241706)
+++ releases/WebKitGTK/webkit-2.24/Source/_javascript_Core/runtime/VM.cpp 2019-02-18 16:16:24 UTC (rev 241707)
@@ -401,7 +401,6 @@
sentinelSetBucket.set(*this, JSSet::BucketType::createSentinel(*this));
sentinelMapBucket.set(*this, JSMap::BucketType::createSentinel(*this));
- m_regExpCache->initialize(*this);
smallStrings.initializeCommonStrings(*this);
Thread::current().setCurrentAtomicStringTable(existingEntryAtomicStringTable);