Title: [241707] releases/WebKitGTK/webkit-2.24/Source/_javascript_Core
Revision
241707
Author
carlo...@webkit.org
Date
2019-02-18 08:16:24 -0800 (Mon, 18 Feb 2019)

Log Message

Merge r241640 - [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):

Modified Paths

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);
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to