REGRESSION(204854): ASan is unhappy
authorfpizlo@apple.com <fpizlo@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 23 Aug 2016 23:19:14 +0000 (23:19 +0000)
committerfpizlo@apple.com <fpizlo@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 23 Aug 2016 23:19:14 +0000 (23:19 +0000)
https://bugs.webkit.org/show_bug.cgi?id=161109

Reviewed by Geoffrey Garen.

I messed up RegExpConstructor: it ends up being a callee and a large allocation.

This fixes it to not be a large allocation.

* dfg/DFGStrengthReductionPhase.cpp:
(JSC::DFG::StrengthReductionPhase::handleNode):
* runtime/InternalFunction.cpp:
(JSC::InternalFunction::InternalFunction):
* runtime/RegExp.cpp:
(JSC::RegExp::match):
(JSC::RegExp::matchConcurrently):
(JSC::RegExp::matchCompareWithInterpreter):
* runtime/RegExp.h:
* runtime/RegExpConstructor.h:
* runtime/RegExpInlines.h:
(JSC::RegExp::matchInline):
* runtime/RegExpPrototype.cpp:
(JSC::genericSplit):
* testRegExp.cpp:
(testOneRegExp):

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@204866 268f45cc-cd09-0410-ab3c-d52691b4dbfc

Source/JavaScriptCore/ChangeLog
Source/JavaScriptCore/dfg/DFGStrengthReductionPhase.cpp
Source/JavaScriptCore/runtime/InternalFunction.cpp
Source/JavaScriptCore/runtime/RegExp.cpp
Source/JavaScriptCore/runtime/RegExp.h
Source/JavaScriptCore/runtime/RegExpConstructor.h
Source/JavaScriptCore/runtime/RegExpInlines.h
Source/JavaScriptCore/runtime/RegExpPrototype.cpp
Source/JavaScriptCore/testRegExp.cpp

index 220e545..808c451 100644 (file)
@@ -1,3 +1,31 @@
+2016-08-23  Filip Pizlo  <fpizlo@apple.com>
+
+        REGRESSION(204854): ASan is unhappy
+        https://bugs.webkit.org/show_bug.cgi?id=161109
+
+        Reviewed by Geoffrey Garen.
+        
+        I messed up RegExpConstructor: it ends up being a callee and a large allocation.
+        
+        This fixes it to not be a large allocation.
+
+        * dfg/DFGStrengthReductionPhase.cpp:
+        (JSC::DFG::StrengthReductionPhase::handleNode):
+        * runtime/InternalFunction.cpp:
+        (JSC::InternalFunction::InternalFunction):
+        * runtime/RegExp.cpp:
+        (JSC::RegExp::match):
+        (JSC::RegExp::matchConcurrently):
+        (JSC::RegExp::matchCompareWithInterpreter):
+        * runtime/RegExp.h:
+        * runtime/RegExpConstructor.h:
+        * runtime/RegExpInlines.h:
+        (JSC::RegExp::matchInline):
+        * runtime/RegExpPrototype.cpp:
+        (JSC::genericSplit):
+        * testRegExp.cpp:
+        (testOneRegExp):
+
 2016-08-23  Saam Barati  <sbarati@apple.com>
 
         strict mode eval should not fire the var injection watch point
index 0e5163e..64fb3cc 100644 (file)
@@ -469,7 +469,7 @@ private:
             FrozenValue* constructorFrozenValue = m_graph.freeze(constructor);
 
             MatchResult result;
-            Vector<int, 32> ovector;
+            Vector<int> ovector;
             // We have to call the kind of match function that the main thread would have called.
             // Otherwise, we might not have the desired Yarr code compiled, and the match will fail.
             if (m_node->op() == RegExpExec) {
@@ -651,7 +651,7 @@ private:
             bool ok = true;
             do {
                 MatchResult result;
-                Vector<int, 32> ovector;
+                Vector<int> ovector;
                 // Model which version of match() is called by the main thread.
                 if (replace.isEmpty() && regExp->global()) {
                     if (!regExp->matchConcurrently(vm(), string, startPosition, result)) {
index 1801b61..6d7ecf3 100644 (file)
@@ -37,6 +37,8 @@ const ClassInfo InternalFunction::s_info = { "Function", &Base::s_info, 0, CREAT
 InternalFunction::InternalFunction(VM& vm, Structure* structure)
     : JSDestructibleObject(vm, structure)
 {
+    // exec->vm() wants callees to not be large allocations.
+    RELEASE_ASSERT(!isLargeAllocation());
 }
 
 void InternalFunction::finishCreation(VM& vm, const String& name)
index c87751f..f6d0e9b 100644 (file)
@@ -296,13 +296,13 @@ void RegExp::compile(VM* vm, Yarr::YarrCharSize charSize)
     m_regExpBytecode = Yarr::byteCompile(pattern, &vm->m_regExpAllocator, &vm->m_regExpAllocatorLock);
 }
 
-int RegExp::match(VM& vm, const String& s, unsigned startOffset, Vector<int, 32>& ovector)
+int RegExp::match(VM& vm, const String& s, unsigned startOffset, Vector<int>& ovector)
 {
     return matchInline(vm, s, startOffset, ovector);
 }
 
 bool RegExp::matchConcurrently(
-    VM& vm, const String& s, unsigned startOffset, int& position, Vector<int, 32>& ovector)
+    VM& vm, const String& s, unsigned startOffset, int& position, Vector<int>& ovector)
 {
     ConcurrentJITLocker locker(m_lock);
 
@@ -382,7 +382,7 @@ void RegExp::deleteCode()
 void RegExp::matchCompareWithInterpreter(const String& s, int startOffset, int* offsetVector, int jitResult)
 {
     int offsetVectorSize = (m_numSubpatterns + 1) * 2;
-    Vector<int, 32> interpreterOvector;
+    Vector<int> interpreterOvector;
     interpreterOvector.resize(offsetVectorSize);
     int* interpreterOffsetVector = interpreterOvector.data();
     int interpreterResult = 0;
index 995aae5..b6c0d77 100644 (file)
@@ -64,17 +64,18 @@ public:
     bool isValid() const { return !m_constructionError && m_flags != InvalidFlags; }
     const char* errorMessage() const { return m_constructionError; }
 
-    JS_EXPORT_PRIVATE int match(VM&, const String&, unsigned startOffset, Vector<int, 32>& ovector);
+    JS_EXPORT_PRIVATE int match(VM&, const String&, unsigned startOffset, Vector<int>& ovector);
 
     // Returns false if we couldn't run the regular expression for any reason.
-    bool matchConcurrently(VM&, const String&, unsigned startOffset, int& position, Vector<int, 32>& ovector);
+    bool matchConcurrently(VM&, const String&, unsigned startOffset, int& position, Vector<int>& ovector);
     
     JS_EXPORT_PRIVATE MatchResult match(VM&, const String&, unsigned startOffset);
 
     bool matchConcurrently(VM&, const String&, unsigned startOffset, MatchResult&);
 
     // Call these versions of the match functions if you're desperate for performance.
-    int matchInline(VM&, const String&, unsigned startOffset, Vector<int, 32>& ovector);
+    template<typename VectorType>
+    int matchInline(VM&, const String&, unsigned startOffset, VectorType& ovector);
     MatchResult matchInline(VM&, const String&, unsigned startOffset);
     
     unsigned numSubpatterns() const { return m_numSubpatterns; }
index 2536525..50c8b5e 100644 (file)
@@ -80,7 +80,7 @@ private:
 
     RegExpCachedResult m_cachedResult;
     bool m_multiline;
-    Vector<int, 32> m_ovector;
+    Vector<int> m_ovector;
 };
 
 RegExpConstructor* asRegExpConstructor(JSValue);
index 295d931..5b0db95 100644 (file)
@@ -94,7 +94,8 @@ ALWAYS_INLINE void RegExp::compileIfNecessary(VM& vm, Yarr::YarrCharSize charSiz
     compile(&vm, charSize);
 }
 
-ALWAYS_INLINE int RegExp::matchInline(VM& vm, const String& s, unsigned startOffset, Vector<int, 32>& ovector)
+template<typename VectorType>
+ALWAYS_INLINE int RegExp::matchInline(VM& vm, const String& s, unsigned startOffset, VectorType& ovector)
 {
 #if ENABLE(REGEXP_TRACING)
     m_rtMatchCallCount++;
index afc3ed7..5f88e22 100644 (file)
@@ -468,12 +468,14 @@ void genericSplit(
     unsigned& matchPosition, bool regExpIsSticky, bool regExpIsUnicode,
     const ControlFunc& control, const PushFunc& push)
 {
+    Vector<int> ovector;
+        
     while (matchPosition < inputSize) {
         if (control() == AbortSplit)
             return;
         
-        Vector<int, 32> ovector;
-
+        ovector.resize(0);
+        
         // a. Perform ? Set(splitter, "lastIndex", q, true).
         // b. Let z be ? RegExpExec(splitter, S).
         int mpos = regexp->match(vm, input, matchPosition, ovector);
index 7f29aea..6d6f280 100644 (file)
@@ -191,7 +191,7 @@ int main(int argc, char** argv)
 static bool testOneRegExp(VM& vm, RegExp* regexp, RegExpTest* regExpTest, bool verbose, unsigned int lineNumber)
 {
     bool result = true;
-    Vector<int, 32> outVector;
+    Vector<int> outVector;
     outVector.resize(regExpTest->expectVector.size());
     int matchResult = regexp->match(vm, regExpTest->subject, regExpTest->offset, outVector);