<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head><meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title>[198273] releases/WebKitGTK/webkit-2.12/Source/JavaScriptCore</title>
</head>
<body>
<style type="text/css"><!--
#msg dl.meta { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; }
#msg dl.meta dt { float: left; width: 6em; font-weight: bold; }
#msg dt:after { content:':';}
#msg dl, #msg dt, #msg ul, #msg li, #header, #footer, #logmsg { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; }
#msg dl a { font-weight: bold}
#msg dl a:link { color:#fc3; }
#msg dl a:active { color:#ff0; }
#msg dl a:visited { color:#cc6; }
h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; }
#msg pre { overflow: auto; background: #ffc; border: 1px #fa0 solid; padding: 6px; }
#logmsg { background: #ffc; border: 1px #fa0 solid; padding: 1em 1em 0 1em; }
#logmsg p, #logmsg pre, #logmsg blockquote { margin: 0 0 1em 0; }
#logmsg p, #logmsg li, #logmsg dt, #logmsg dd { line-height: 14pt; }
#logmsg h1, #logmsg h2, #logmsg h3, #logmsg h4, #logmsg h5, #logmsg h6 { margin: .5em 0; }
#logmsg h1:first-child, #logmsg h2:first-child, #logmsg h3:first-child, #logmsg h4:first-child, #logmsg h5:first-child, #logmsg h6:first-child { margin-top: 0; }
#logmsg ul, #logmsg ol { padding: 0; list-style-position: inside; margin: 0 0 0 1em; }
#logmsg ul { text-indent: -1em; padding-left: 1em; }#logmsg ol { text-indent: -1.5em; padding-left: 1.5em; }
#logmsg > ul, #logmsg > ol { margin: 0 0 1em 0; }
#logmsg pre { background: #eee; padding: 1em; }
#logmsg blockquote { border: 1px solid #fa0; border-left-width: 10px; padding: 1em 1em 0 1em; background: white;}
#logmsg dl { margin: 0; }
#logmsg dt { font-weight: bold; }
#logmsg dd { margin: 0; padding: 0 0 0.5em 0; }
#logmsg dd:before { content:'\00bb';}
#logmsg table { border-spacing: 0px; border-collapse: collapse; border-top: 4px solid #fa0; border-bottom: 1px solid #fa0; background: #fff; }
#logmsg table th { text-align: left; font-weight: normal; padding: 0.2em 0.5em; border-top: 1px dotted #fa0; }
#logmsg table td { text-align: right; border-top: 1px dotted #fa0; padding: 0.2em 0.5em; }
#logmsg table thead th { text-align: center; border-bottom: 1px solid #fa0; }
#logmsg table th.Corner { text-align: left; }
#logmsg hr { border: none 0; border-top: 2px dashed #fa0; height: 1px; }
#header, #footer { color: #fff; background: #636; border: 1px #300 solid; padding: 6px; }
#patch { width: 100%; }
#patch h4 {font-family: verdana,arial,helvetica,sans-serif;font-size:10pt;padding:8px;background:#369;color:#fff;margin:0;}
#patch .propset h4, #patch .binary h4 {margin:0;}
#patch pre {padding:0;line-height:1.2em;margin:0;}
#patch .diff {width:100%;background:#eee;padding: 0 0 10px 0;overflow:auto;}
#patch .propset .diff, #patch .binary .diff {padding:10px 0;}
#patch span {display:block;padding:0 10px;}
#patch .modfile, #patch .addfile, #patch .delfile, #patch .propset, #patch .binary, #patch .copfile {border:1px solid #ccc;margin:10px 0;}
#patch ins {background:#dfd;text-decoration:none;display:block;padding:0 10px;}
#patch del {background:#fdd;text-decoration:none;display:block;padding:0 10px;}
#patch .lines, .info {color:#888;background:#fff;}
--></style>
<div id="msg">
<dl class="meta">
<dt>Revision</dt> <dd><a href="http://trac.webkit.org/projects/webkit/changeset/198273">198273</a></dd>
<dt>Author</dt> <dd>carlosgc@webkit.org</dd>
<dt>Date</dt> <dd>2016-03-16 08:13:51 -0700 (Wed, 16 Mar 2016)</dd>
</dl>
<h3>Log Message</h3>
<pre>Revert "Merge <a href="http://trac.webkit.org/projects/webkit/changeset/197796">r197796</a> - Regexp matching should incur less call overhead"
This reverts commit 462dd3fe9ae1b6992bbf331c52e9d4d440298a16.</pre>
<h3>Modified Paths</h3>
<ul>
<li><a href="#releasesWebKitGTKwebkit212SourceJavaScriptCoreChangeLog">releases/WebKitGTK/webkit-2.12/Source/JavaScriptCore/ChangeLog</a></li>
<li><a href="#releasesWebKitGTKwebkit212SourceJavaScriptCoreJavaScriptCorexcodeprojprojectpbxproj">releases/WebKitGTK/webkit-2.12/Source/JavaScriptCore/JavaScriptCore.xcodeproj/project.pbxproj</a></li>
<li><a href="#releasesWebKitGTKwebkit212SourceJavaScriptCoredfgDFGOperationscpp">releases/WebKitGTK/webkit-2.12/Source/JavaScriptCore/dfg/DFGOperations.cpp</a></li>
<li><a href="#releasesWebKitGTKwebkit212SourceJavaScriptCoreruntimeRegExpcpp">releases/WebKitGTK/webkit-2.12/Source/JavaScriptCore/runtime/RegExp.cpp</a></li>
<li><a href="#releasesWebKitGTKwebkit212SourceJavaScriptCoreruntimeRegExph">releases/WebKitGTK/webkit-2.12/Source/JavaScriptCore/runtime/RegExp.h</a></li>
<li><a href="#releasesWebKitGTKwebkit212SourceJavaScriptCoreruntimeRegExpMatchesArraycpp">releases/WebKitGTK/webkit-2.12/Source/JavaScriptCore/runtime/RegExpMatchesArray.cpp</a></li>
<li><a href="#releasesWebKitGTKwebkit212SourceJavaScriptCoreruntimeRegExpMatchesArrayh">releases/WebKitGTK/webkit-2.12/Source/JavaScriptCore/runtime/RegExpMatchesArray.h</a></li>
<li><a href="#releasesWebKitGTKwebkit212SourceJavaScriptCoreruntimeRegExpObjectcpp">releases/WebKitGTK/webkit-2.12/Source/JavaScriptCore/runtime/RegExpObject.cpp</a></li>
<li><a href="#releasesWebKitGTKwebkit212SourceJavaScriptCoreruntimeRegExpObjecth">releases/WebKitGTK/webkit-2.12/Source/JavaScriptCore/runtime/RegExpObject.h</a></li>
</ul>
<h3>Removed Paths</h3>
<ul>
<li><a href="#releasesWebKitGTKwebkit212SourceJavaScriptCoreruntimeRegExpInlinesh">releases/WebKitGTK/webkit-2.12/Source/JavaScriptCore/runtime/RegExpInlines.h</a></li>
<li><a href="#releasesWebKitGTKwebkit212SourceJavaScriptCoreruntimeRegExpObjectInlinesh">releases/WebKitGTK/webkit-2.12/Source/JavaScriptCore/runtime/RegExpObjectInlines.h</a></li>
</ul>
</div>
<div id="patch">
<h3>Diff</h3>
<a id="releasesWebKitGTKwebkit212SourceJavaScriptCoreChangeLog"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.12/Source/JavaScriptCore/ChangeLog (198272 => 198273)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.12/Source/JavaScriptCore/ChangeLog        2016-03-16 15:13:30 UTC (rev 198272)
+++ releases/WebKitGTK/webkit-2.12/Source/JavaScriptCore/ChangeLog        2016-03-16 15:13:51 UTC (rev 198273)
</span><span class="lines">@@ -1,58 +1,3 @@
</span><del>-2016-03-08 Filip Pizlo <fpizlo@apple.com>
-
- Regexp matching should incur less call overhead
- https://bugs.webkit.org/show_bug.cgi?id=155181
-
- Reviewed by Geoffrey Garen.
-
- Previously we had DFG/FTL code call into the DFGOperation, which then called in to
- RegExpObject, which then called into createRegExpMatchesArray, which then called into
- RegExp, which then called the code generated by Yarr.
-
- Now we have DFG/FTL code call into the DFGOperation, which does all of the things and calls
- into code generated by Yarr.
-
- This is another tiny Octane/regexp speed-up.
-
- * JavaScriptCore.xcodeproj/project.pbxproj:
- * dfg/DFGOperations.cpp:
- * runtime/RegExp.cpp:
- (JSC::regExpFlags):
- (JSC::RegExp::compile):
- (JSC::RegExp::match):
- (JSC::RegExp::compileMatchOnly):
- (JSC::RegExp::deleteCode):
- (JSC::RegExpFunctionalTestCollector::clearRegExp): Deleted.
- (JSC::RegExp::compileIfNecessary): Deleted.
- (JSC::RegExp::compileIfNecessaryMatchOnly): Deleted.
- * runtime/RegExp.h:
- * runtime/RegExpInlines.h: Added.
- (JSC::RegExpFunctionalTestCollector::clearRegExp):
- (JSC::RegExp::compileIfNecessary):
- (JSC::RegExp::matchInline):
- (JSC::RegExp::compileIfNecessaryMatchOnly):
- * runtime/RegExpMatchesArray.cpp:
- (JSC::createEmptyRegExpMatchesArray):
- (JSC::createStructureImpl):
- (JSC::tryCreateUninitializedRegExpMatchesArray): Deleted.
- (JSC::createRegExpMatchesArray): Deleted.
- * runtime/RegExpMatchesArray.h:
- (JSC::tryCreateUninitializedRegExpMatchesArray):
- (JSC::createRegExpMatchesArray):
- * runtime/RegExpObject.cpp:
- (JSC::RegExpObject::put):
- (JSC::RegExpObject::exec):
- (JSC::RegExpObject::match):
- (JSC::getLastIndexAsUnsigned): Deleted.
- * runtime/RegExpObject.h:
- (JSC::RegExpObject::getLastIndex):
- (JSC::RegExpObject::test):
- (JSC::RegExpObject::testInline):
- * runtime/RegExpObjectInlines.h: Added.
- (JSC::getRegExpObjectLastIndexAsUnsigned):
- (JSC::RegExpObject::execInline):
- (JSC::RegExpObject::matchInline):
-
</del><span class="cx"> 2016-03-08 Andreas Kling <akling@apple.com>
</span><span class="cx">
</span><span class="cx"> WeakBlock::visit() should check for a WeakHandleOwner before consulting mark bits.
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit212SourceJavaScriptCoreJavaScriptCorexcodeprojprojectpbxproj"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.12/Source/JavaScriptCore/JavaScriptCore.xcodeproj/project.pbxproj (198272 => 198273)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.12/Source/JavaScriptCore/JavaScriptCore.xcodeproj/project.pbxproj        2016-03-16 15:13:30 UTC (rev 198272)
+++ releases/WebKitGTK/webkit-2.12/Source/JavaScriptCore/JavaScriptCore.xcodeproj/project.pbxproj        2016-03-16 15:13:51 UTC (rev 198273)
</span><span class="lines">@@ -486,8 +486,6 @@
</span><span class="cx">                 0F7B294B14C3CD2F007C3DB1 /* DFGCapabilities.h in Headers */ = {isa = PBXBuildFile; fileRef = 0FD82E1F14172C2F00179C94 /* DFGCapabilities.h */; };
</span><span class="cx">                 0F7B294D14C3CD4C007C3DB1 /* DFGCommon.h in Headers */ = {isa = PBXBuildFile; fileRef = 0FC0977E1469EBC400CF2442 /* DFGCommon.h */; settings = {ATTRIBUTES = (Private, ); }; };
</span><span class="cx">                 0F7C11AD1BC3862C00C74CDB /* CopyBarrier.h in Headers */ = {isa = PBXBuildFile; fileRef = 0F7C11AC1BC3862C00C74CDB /* CopyBarrier.h */; settings = {ATTRIBUTES = (Private, ); }; };
</span><del>-                0F7C39FB1C8F629300480151 /* RegExpInlines.h in Headers */ = {isa = PBXBuildFile; fileRef = 0F7C39FA1C8F629300480151 /* RegExpInlines.h */; };
-                0F7C39FD1C8F659500480151 /* RegExpObjectInlines.h in Headers */ = {isa = PBXBuildFile; fileRef = 0F7C39FC1C8F659500480151 /* RegExpObjectInlines.h */; };
</del><span class="cx">                 0F8023EA1613832B00A0BA45 /* ByValInfo.h in Headers */ = {isa = PBXBuildFile; fileRef = 0F8023E91613832300A0BA45 /* ByValInfo.h */; settings = {ATTRIBUTES = (Private, ); }; };
</span><span class="cx">                 0F8335B71639C1E6001443B5 /* ArrayAllocationProfile.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0F8335B41639C1E3001443B5 /* ArrayAllocationProfile.cpp */; };
</span><span class="cx">                 0F8335B81639C1EA001443B5 /* ArrayAllocationProfile.h in Headers */ = {isa = PBXBuildFile; fileRef = 0F8335B51639C1E3001443B5 /* ArrayAllocationProfile.h */; settings = {ATTRIBUTES = (Private, ); }; };
</span><span class="lines">@@ -2629,8 +2627,6 @@
</span><span class="cx">                 0F79085319A290B200F6310C /* DFGStructureRegistrationPhase.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = DFGStructureRegistrationPhase.cpp; path = dfg/DFGStructureRegistrationPhase.cpp; sourceTree = "<group>"; };
</span><span class="cx">                 0F79085419A290B200F6310C /* DFGStructureRegistrationPhase.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = DFGStructureRegistrationPhase.h; path = dfg/DFGStructureRegistrationPhase.h; sourceTree = "<group>"; };
</span><span class="cx">                 0F7C11AC1BC3862C00C74CDB /* CopyBarrier.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CopyBarrier.h; sourceTree = "<group>"; };
</span><del>-                0F7C39FA1C8F629300480151 /* RegExpInlines.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RegExpInlines.h; sourceTree = "<group>"; };
-                0F7C39FC1C8F659500480151 /* RegExpObjectInlines.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RegExpObjectInlines.h; sourceTree = "<group>"; };
</del><span class="cx">                 0F8023E91613832300A0BA45 /* ByValInfo.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ByValInfo.h; sourceTree = "<group>"; };
</span><span class="cx">                 0F8335B41639C1E3001443B5 /* ArrayAllocationProfile.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ArrayAllocationProfile.cpp; sourceTree = "<group>"; };
</span><span class="cx">                 0F8335B51639C1E3001443B5 /* ArrayAllocationProfile.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ArrayAllocationProfile.h; sourceTree = "<group>"; };
</span><span class="lines">@@ -5856,13 +5852,11 @@
</span><span class="cx">                                 86F75EFC151C062F007C9BA3 /* RegExpCachedResult.h */,
</span><span class="cx">                                 BCD202BD0E1706A7002C7E82 /* RegExpConstructor.cpp */,
</span><span class="cx">                                 BCD202BE0E1706A7002C7E82 /* RegExpConstructor.h */,
</span><del>-                                0F7C39FA1C8F629300480151 /* RegExpInlines.h */,
</del><span class="cx">                                 A1712B4011C7B235007A5315 /* RegExpKey.h */,
</span><span class="cx">                                 86F75EFD151C062F007C9BA3 /* RegExpMatchesArray.cpp */,
</span><span class="cx">                                 93CEDDFB0EA91EE600258EBE /* RegExpMatchesArray.h */,
</span><span class="cx">                                 F692A87B0255597D01FF60F7 /* RegExpObject.cpp */,
</span><span class="cx">                                 F692A87C0255597D01FF60F7 /* RegExpObject.h */,
</span><del>-                                0F7C39FC1C8F659500480151 /* RegExpObjectInlines.h */,
</del><span class="cx">                                 BCD202BF0E1706A7002C7E82 /* RegExpPrototype.cpp */,
</span><span class="cx">                                 BCD202C00E1706A7002C7E82 /* RegExpPrototype.h */,
</span><span class="cx">                                 0FB7F39115ED8E3800F167B2 /* Reject.h */,
</span><span class="lines">@@ -7185,7 +7179,6 @@
</span><span class="cx">                                 0FBC0AE81496C7C700D4FBDD /* DFGExitProfile.h in Headers */,
</span><span class="cx">                                 A78A9775179738B8009DF744 /* DFGFailedFinalizer.h in Headers */,
</span><span class="cx">                                 A7BFF3C0179868940002F462 /* DFGFiltrationResult.h in Headers */,
</span><del>-                                0F7C39FB1C8F629300480151 /* RegExpInlines.h in Headers */,
</del><span class="cx">                                 A78A9777179738B8009DF744 /* DFGFinalizer.h in Headers */,
</span><span class="cx">                                 0F2BDC16151C5D4F00CD8910 /* DFGFixupPhase.h in Headers */,
</span><span class="cx">                                 0F9D339717FFC4E60073C2BC /* DFGFlushedAt.h in Headers */,
</span><span class="lines">@@ -7904,7 +7897,6 @@
</span><span class="cx">                                 A709F2F017A0AC0400512E98 /* SlowPathCall.h in Headers */,
</span><span class="cx">                                 933040040E6A749400786E6A /* SmallStrings.h in Headers */,
</span><span class="cx">                                 BC18C4640E16F5CD00B34460 /* SourceCode.h in Headers */,
</span><del>-                                0F7C39FD1C8F659500480151 /* RegExpObjectInlines.h in Headers */,
</del><span class="cx">                                 BC18C4630E16F5CD00B34460 /* SourceProvider.h in Headers */,
</span><span class="cx">                                 E49DC16C12EF294E00184A1F /* SourceProviderCache.h in Headers */,
</span><span class="cx">                                 E49DC16D12EF295300184A1F /* SourceProviderCacheItem.h in Headers */,
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit212SourceJavaScriptCoredfgDFGOperationscpp"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.12/Source/JavaScriptCore/dfg/DFGOperations.cpp (198272 => 198273)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.12/Source/JavaScriptCore/dfg/DFGOperations.cpp        2016-03-16 15:13:30 UTC (rev 198272)
+++ releases/WebKitGTK/webkit-2.12/Source/JavaScriptCore/dfg/DFGOperations.cpp        2016-03-16 15:13:51 UTC (rev 198273)
</span><span class="lines">@@ -617,7 +617,7 @@
</span><span class="cx"> VM& vm = globalObject->vm();
</span><span class="cx"> NativeCallFrameTracer tracer(&vm, exec);
</span><span class="cx">
</span><del>- return JSValue::encode(regExpObject->execInline(exec, globalObject, argument));
</del><ins>+ return JSValue::encode(regExpObject->exec(exec, globalObject, argument));
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> EncodedJSValue JIT_OPERATION operationRegExpExec(ExecState* exec, JSGlobalObject* globalObject, RegExpObject* regExpObject, EncodedJSValue encodedArgument)
</span><span class="lines">@@ -630,7 +630,7 @@
</span><span class="cx"> JSString* input = argument.toStringOrNull(exec);
</span><span class="cx"> if (!input)
</span><span class="cx"> return JSValue::encode(jsUndefined());
</span><del>- return JSValue::encode(regExpObject->execInline(exec, globalObject, input));
</del><ins>+ return JSValue::encode(regExpObject->exec(exec, globalObject, input));
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> EncodedJSValue JIT_OPERATION operationRegExpExecGeneric(ExecState* exec, JSGlobalObject* globalObject, EncodedJSValue encodedBase, EncodedJSValue encodedArgument)
</span><span class="lines">@@ -655,7 +655,7 @@
</span><span class="cx"> VM& vm = globalObject->vm();
</span><span class="cx"> NativeCallFrameTracer tracer(&vm, exec);
</span><span class="cx">
</span><del>- return regExpObject->testInline(exec, globalObject, input);
</del><ins>+ return regExpObject->test(exec, globalObject, input);
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> size_t JIT_OPERATION operationRegExpTest(ExecState* exec, JSGlobalObject* globalObject, RegExpObject* regExpObject, EncodedJSValue encodedArgument)
</span><span class="lines">@@ -668,7 +668,7 @@
</span><span class="cx"> JSString* input = argument.toStringOrNull(exec);
</span><span class="cx"> if (!input)
</span><span class="cx"> return false;
</span><del>- return regExpObject->testInline(exec, globalObject, input);
</del><ins>+ return regExpObject->test(exec, globalObject, input);
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> size_t JIT_OPERATION operationRegExpTestGeneric(ExecState* exec, JSGlobalObject* globalObject, EncodedJSValue encodedBase, EncodedJSValue encodedArgument)
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit212SourceJavaScriptCoreruntimeRegExpcpp"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.12/Source/JavaScriptCore/runtime/RegExp.cpp (198272 => 198273)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.12/Source/JavaScriptCore/runtime/RegExp.cpp        2016-03-16 15:13:30 UTC (rev 198272)
+++ releases/WebKitGTK/webkit-2.12/Source/JavaScriptCore/runtime/RegExp.cpp        2016-03-16 15:13:51 UTC (rev 198273)
</span><span class="lines">@@ -1,6 +1,6 @@
</span><span class="cx"> /*
</span><span class="cx"> * Copyright (C) 1999-2001, 2004 Harri Porten (porten@kde.org)
</span><del>- * Copyright (c) 2007, 2008, 2016 Apple Inc. All rights reserved.
</del><ins>+ * Copyright (c) 2007, 2008 Apple Inc. All rights reserved.
</ins><span class="cx"> * Copyright (C) 2009 Torch Mobile, Inc.
</span><span class="cx"> * Copyright (C) 2010 Peter Varga (pvarga@inf.u-szeged.hu), University of Szeged
</span><span class="cx"> *
</span><span class="lines">@@ -26,11 +26,18 @@
</span><span class="cx"> #include "Lexer.h"
</span><span class="cx"> #include "JSCInlines.h"
</span><span class="cx"> #include "RegExpCache.h"
</span><del>-#include "RegExpInlines.h"
</del><span class="cx"> #include "Yarr.h"
</span><span class="cx"> #include "YarrJIT.h"
</span><span class="cx"> #include <wtf/Assertions.h>
</span><span class="cx">
</span><ins>+#define REGEXP_FUNC_TEST_DATA_GEN 0
+
+#if REGEXP_FUNC_TEST_DATA_GEN
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#endif
+
</ins><span class="cx"> namespace JSC {
</span><span class="cx">
</span><span class="cx"> const ClassInfo RegExp::s_info = { "RegExp", 0, 0, CREATE_METHOD_TABLE(RegExp) };
</span><span class="lines">@@ -68,6 +75,33 @@
</span><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> #if REGEXP_FUNC_TEST_DATA_GEN
</span><ins>+class RegExpFunctionalTestCollector {
+ // This class is not thread safe.
+protected:
+ static const char* const s_fileName;
+
+public:
+ static RegExpFunctionalTestCollector* get();
+
+ ~RegExpFunctionalTestCollector();
+
+ void outputOneTest(RegExp*, String, int, int*, int);
+ void clearRegExp(RegExp* regExp)
+ {
+ if (regExp == m_lastRegExp)
+ m_lastRegExp = 0;
+ }
+
+private:
+ RegExpFunctionalTestCollector();
+
+ void outputEscapedString(const String&, bool escapeSlash = false);
+
+ static RegExpFunctionalTestCollector* s_instance;
+ FILE* m_file;
+ RegExp* m_lastRegExp;
+};
+
</ins><span class="cx"> const char* const RegExpFunctionalTestCollector::s_fileName = "/tmp/RegExpTestsData";
</span><span class="cx"> RegExpFunctionalTestCollector* RegExpFunctionalTestCollector::s_instance = 0;
</span><span class="cx">
</span><span class="lines">@@ -278,9 +312,89 @@
</span><span class="cx"> m_regExpBytecode = Yarr::byteCompile(pattern, &vm->m_regExpAllocator);
</span><span class="cx"> }
</span><span class="cx">
</span><ins>+void RegExp::compileIfNecessary(VM& vm, Yarr::YarrCharSize charSize)
+{
+ if (hasCode()) {
+#if ENABLE(YARR_JIT)
+ if (m_state != JITCode)
+ return;
+ if ((charSize == Yarr::Char8) && (m_regExpJITCode.has8BitCode()))
+ return;
+ if ((charSize == Yarr::Char16) && (m_regExpJITCode.has16BitCode()))
+ return;
+#else
+ return;
+#endif
+ }
+
+ compile(&vm, charSize);
+}
+
</ins><span class="cx"> int RegExp::match(VM& vm, const String& s, unsigned startOffset, Vector<int, 32>& ovector)
</span><span class="cx"> {
</span><del>- return matchInline(vm, s, startOffset, ovector);
</del><ins>+#if ENABLE(REGEXP_TRACING)
+ m_rtMatchCallCount++;
+ m_rtMatchTotalSubjectStringLen += (double)(s.length() - startOffset);
+#endif
+
+ ASSERT(m_state != ParseError);
+ compileIfNecessary(vm, s.is8Bit() ? Yarr::Char8 : Yarr::Char16);
+
+ int offsetVectorSize = (m_numSubpatterns + 1) * 2;
+ ovector.resize(offsetVectorSize);
+ int* offsetVector = ovector.data();
+
+ int result;
+#if ENABLE(YARR_JIT)
+ if (m_state == JITCode) {
+ if (s.is8Bit())
+ result = m_regExpJITCode.execute(s.characters8(), startOffset, s.length(), offsetVector).start;
+ else
+ result = m_regExpJITCode.execute(s.characters16(), startOffset, s.length(), offsetVector).start;
+#if ENABLE(YARR_JIT_DEBUG)
+ matchCompareWithInterpreter(s, startOffset, offsetVector, result);
+#endif
+ } else
+#endif
+ result = Yarr::interpret(m_regExpBytecode.get(), s, startOffset, reinterpret_cast<unsigned*>(offsetVector));
+
+ // FIXME: The YARR engine should handle unsigned or size_t length matches.
+ // The YARR Interpreter is "unsigned" clean, while the YARR JIT hasn't been addressed.
+ // The offset vector handling needs to change as well.
+ // Right now we convert a match where the offsets overflowed into match failure.
+ // There are two places in WebCore that call the interpreter directly that need to
+ // have their offsets changed to int as well. They are yarr/RegularExpression.cpp
+ // and inspector/ContentSearchUtilities.cpp
+ if (s.length() > INT_MAX) {
+ bool overflowed = false;
+
+ if (result < -1)
+ overflowed = true;
+
+ for (unsigned i = 0; i <= m_numSubpatterns; i++) {
+ if ((offsetVector[i*2] < -1) || ((offsetVector[i*2] >= 0) && (offsetVector[i*2+1] < -1))) {
+ overflowed = true;
+ offsetVector[i*2] = -1;
+ offsetVector[i*2+1] = -1;
+ }
+ }
+
+ if (overflowed)
+ result = -1;
+ }
+
+ ASSERT(result >= -1);
+
+#if REGEXP_FUNC_TEST_DATA_GEN
+ RegExpFunctionalTestCollector::get()->outputOneTest(this, s, startOffset, offsetVector, result);
+#endif
+
+#if ENABLE(REGEXP_TRACING)
+ if (result != -1)
+ m_rtMatchFoundCount++;
+#endif
+
+ return result;
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> void RegExp::compileMatchOnly(VM* vm, Yarr::YarrCharSize charSize)
</span><span class="lines">@@ -317,9 +431,65 @@
</span><span class="cx"> m_regExpBytecode = Yarr::byteCompile(pattern, &vm->m_regExpAllocator);
</span><span class="cx"> }
</span><span class="cx">
</span><ins>+void RegExp::compileIfNecessaryMatchOnly(VM& vm, Yarr::YarrCharSize charSize)
+{
+ if (hasCode()) {
+#if ENABLE(YARR_JIT)
+ if (m_state != JITCode)
+ return;
+ if ((charSize == Yarr::Char8) && (m_regExpJITCode.has8BitCodeMatchOnly()))
+ return;
+ if ((charSize == Yarr::Char16) && (m_regExpJITCode.has16BitCodeMatchOnly()))
+ return;
+#else
+ return;
+#endif
+ }
+
+ compileMatchOnly(&vm, charSize);
+}
+
</ins><span class="cx"> MatchResult RegExp::match(VM& vm, const String& s, unsigned startOffset)
</span><span class="cx"> {
</span><del>- return matchInline(vm, s, startOffset);
</del><ins>+#if ENABLE(REGEXP_TRACING)
+ m_rtMatchOnlyCallCount++;
+ m_rtMatchOnlyTotalSubjectStringLen += (double)(s.length() - startOffset);
+#endif
+
+ ASSERT(m_state != ParseError);
+ compileIfNecessaryMatchOnly(vm, s.is8Bit() ? Yarr::Char8 : Yarr::Char16);
+
+#if ENABLE(YARR_JIT)
+ if (m_state == JITCode) {
+ MatchResult result = s.is8Bit() ?
+ m_regExpJITCode.execute(s.characters8(), startOffset, s.length()) :
+ m_regExpJITCode.execute(s.characters16(), startOffset, s.length());
+#if ENABLE(REGEXP_TRACING)
+ if (!result)
+ m_rtMatchOnlyFoundCount++;
+#endif
+ return result;
+ }
+#endif
+
+ int offsetVectorSize = (m_numSubpatterns + 1) * 2;
+ int* offsetVector;
+ Vector<int, 32> nonReturnedOvector;
+ nonReturnedOvector.resize(offsetVectorSize);
+ offsetVector = nonReturnedOvector.data();
+ int r = Yarr::interpret(m_regExpBytecode.get(), s, startOffset, reinterpret_cast<unsigned*>(offsetVector));
+#if REGEXP_FUNC_TEST_DATA_GEN
+ RegExpFunctionalTestCollector::get()->outputOneTest(this, s, startOffset, offsetVector, result);
+#endif
+
+ if (r >= 0) {
+#if ENABLE(REGEXP_TRACING)
+ m_rtMatchOnlyFoundCount++;
+#endif
+ return MatchResult(r, reinterpret_cast<unsigned*>(offsetVector)[1]);
+ }
+
+ return MatchResult::failed();
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> void RegExp::deleteCode()
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit212SourceJavaScriptCoreruntimeRegExph"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.12/Source/JavaScriptCore/runtime/RegExp.h (198272 => 198273)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.12/Source/JavaScriptCore/runtime/RegExp.h        2016-03-16 15:13:30 UTC (rev 198272)
+++ releases/WebKitGTK/webkit-2.12/Source/JavaScriptCore/runtime/RegExp.h        2016-03-16 15:13:51 UTC (rev 198273)
</span><span class="lines">@@ -1,6 +1,6 @@
</span><span class="cx"> /*
</span><span class="cx"> * Copyright (C) 1999-2000 Harri Porten (porten@kde.org)
</span><del>- * Copyright (C) 2007, 2008, 2009, 2016 Apple Inc. All rights reserved.
</del><ins>+ * Copyright (C) 2007, 2008, 2009 Apple Inc. All rights reserved.
</ins><span class="cx"> * Copyright (C) 2009 Torch Mobile, Inc.
</span><span class="cx"> *
</span><span class="cx"> * This library is free software; you can redistribute it and/or
</span><span class="lines">@@ -63,11 +63,6 @@
</span><span class="cx">
</span><span class="cx"> JS_EXPORT_PRIVATE int match(VM&, const String&, unsigned startOffset, Vector<int, 32>& ovector);
</span><span class="cx"> JS_EXPORT_PRIVATE MatchResult match(VM&, const String&, unsigned startOffset);
</span><del>-
- // Call these versions of the match functions if you're desperate for performance.
- int matchInline(VM&, const String&, unsigned startOffset, Vector<int, 32>& ovector);
- MatchResult matchInline(VM&, const String&, unsigned startOffset);
-
</del><span class="cx"> unsigned numSubpatterns() const { return m_numSubpatterns; }
</span><span class="cx">
</span><span class="cx"> bool hasCode()
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit212SourceJavaScriptCoreruntimeRegExpInlinesh"></a>
<div class="delfile"><h4>Deleted: releases/WebKitGTK/webkit-2.12/Source/JavaScriptCore/runtime/RegExpInlines.h (198272 => 198273)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.12/Source/JavaScriptCore/runtime/RegExpInlines.h        2016-03-16 15:13:30 UTC (rev 198272)
+++ releases/WebKitGTK/webkit-2.12/Source/JavaScriptCore/runtime/RegExpInlines.h        2016-03-16 15:13:51 UTC (rev 198273)
</span><span class="lines">@@ -1,219 +0,0 @@
</span><del>-/*
- * Copyright (C) 1999-2001, 2004 Harri Porten (porten@kde.org)
- * Copyright (c) 2007, 2008, 2016 Apple Inc. All rights reserved.
- * Copyright (C) 2009 Torch Mobile, Inc.
- * Copyright (C) 2010 Peter Varga (pvarga@inf.u-szeged.hu), University of Szeged
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- */
-
-#ifndef RegExpInlines_h
-#define RegExpInlines_h
-
-#include "RegExp.h"
-#include "JSCInlines.h"
-#include "Yarr.h"
-#include "YarrJIT.h"
-
-#define REGEXP_FUNC_TEST_DATA_GEN 0
-
-#if REGEXP_FUNC_TEST_DATA_GEN
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#endif
-
-namespace JSC {
-
-#if REGEXP_FUNC_TEST_DATA_GEN
-class RegExpFunctionalTestCollector {
- // This class is not thread safe.
-protected:
- static const char* const s_fileName;
-
-public:
- static RegExpFunctionalTestCollector* get();
-
- ~RegExpFunctionalTestCollector();
-
- void outputOneTest(RegExp*, String, int, int*, int);
- void clearRegExp(RegExp* regExp)
- {
- if (regExp == m_lastRegExp)
- m_lastRegExp = 0;
- }
-
-private:
- RegExpFunctionalTestCollector();
-
- void outputEscapedString(const String&, bool escapeSlash = false);
-
- static RegExpFunctionalTestCollector* s_instance;
- FILE* m_file;
- RegExp* m_lastRegExp;
-};
-#endif // REGEXP_FUNC_TEST_DATA_GEN
-
-ALWAYS_INLINE void RegExp::compileIfNecessary(VM& vm, Yarr::YarrCharSize charSize)
-{
- if (hasCode()) {
-#if ENABLE(YARR_JIT)
- if (m_state != JITCode)
- return;
- if ((charSize == Yarr::Char8) && (m_regExpJITCode.has8BitCode()))
- return;
- if ((charSize == Yarr::Char16) && (m_regExpJITCode.has16BitCode()))
- return;
-#else
- return;
-#endif
- }
-
- compile(&vm, charSize);
-}
-
-ALWAYS_INLINE int RegExp::matchInline(VM& vm, const String& s, unsigned startOffset, Vector<int, 32>& ovector)
-{
-#if ENABLE(REGEXP_TRACING)
- m_rtMatchCallCount++;
- m_rtMatchTotalSubjectStringLen += (double)(s.length() - startOffset);
-#endif
-
- ASSERT(m_state != ParseError);
- compileIfNecessary(vm, s.is8Bit() ? Yarr::Char8 : Yarr::Char16);
-
- int offsetVectorSize = (m_numSubpatterns + 1) * 2;
- ovector.resize(offsetVectorSize);
- int* offsetVector = ovector.data();
-
- int result;
-#if ENABLE(YARR_JIT)
- if (m_state == JITCode) {
- if (s.is8Bit())
- result = m_regExpJITCode.execute(s.characters8(), startOffset, s.length(), offsetVector).start;
- else
- result = m_regExpJITCode.execute(s.characters16(), startOffset, s.length(), offsetVector).start;
-#if ENABLE(YARR_JIT_DEBUG)
- matchCompareWithInterpreter(s, startOffset, offsetVector, result);
-#endif
- } else
-#endif
- result = Yarr::interpret(m_regExpBytecode.get(), s, startOffset, reinterpret_cast<unsigned*>(offsetVector));
-
- // FIXME: The YARR engine should handle unsigned or size_t length matches.
- // The YARR Interpreter is "unsigned" clean, while the YARR JIT hasn't been addressed.
- // The offset vector handling needs to change as well.
- // Right now we convert a match where the offsets overflowed into match failure.
- // There are two places in WebCore that call the interpreter directly that need to
- // have their offsets changed to int as well. They are yarr/RegularExpression.cpp
- // and inspector/ContentSearchUtilities.cpp
- if (s.length() > INT_MAX) {
- bool overflowed = false;
-
- if (result < -1)
- overflowed = true;
-
- for (unsigned i = 0; i <= m_numSubpatterns; i++) {
- if ((offsetVector[i*2] < -1) || ((offsetVector[i*2] >= 0) && (offsetVector[i*2+1] < -1))) {
- overflowed = true;
- offsetVector[i*2] = -1;
- offsetVector[i*2+1] = -1;
- }
- }
-
- if (overflowed)
- result = -1;
- }
-
- ASSERT(result >= -1);
-
-#if REGEXP_FUNC_TEST_DATA_GEN
- RegExpFunctionalTestCollector::get()->outputOneTest(this, s, startOffset, offsetVector, result);
-#endif
-
-#if ENABLE(REGEXP_TRACING)
- if (result != -1)
- m_rtMatchFoundCount++;
-#endif
-
- return result;
-}
-
-ALWAYS_INLINE void RegExp::compileIfNecessaryMatchOnly(VM& vm, Yarr::YarrCharSize charSize)
-{
- if (hasCode()) {
-#if ENABLE(YARR_JIT)
- if (m_state != JITCode)
- return;
- if ((charSize == Yarr::Char8) && (m_regExpJITCode.has8BitCodeMatchOnly()))
- return;
- if ((charSize == Yarr::Char16) && (m_regExpJITCode.has16BitCodeMatchOnly()))
- return;
-#else
- return;
-#endif
- }
-
- compileMatchOnly(&vm, charSize);
-}
-
-ALWAYS_INLINE MatchResult RegExp::matchInline(VM& vm, const String& s, unsigned startOffset)
-{
-#if ENABLE(REGEXP_TRACING)
- m_rtMatchOnlyCallCount++;
- m_rtMatchOnlyTotalSubjectStringLen += (double)(s.length() - startOffset);
-#endif
-
- ASSERT(m_state != ParseError);
- compileIfNecessaryMatchOnly(vm, s.is8Bit() ? Yarr::Char8 : Yarr::Char16);
-
-#if ENABLE(YARR_JIT)
- if (m_state == JITCode) {
- MatchResult result = s.is8Bit() ?
- m_regExpJITCode.execute(s.characters8(), startOffset, s.length()) :
- m_regExpJITCode.execute(s.characters16(), startOffset, s.length());
-#if ENABLE(REGEXP_TRACING)
- if (!result)
- m_rtMatchOnlyFoundCount++;
-#endif
- return result;
- }
-#endif
-
- int offsetVectorSize = (m_numSubpatterns + 1) * 2;
- int* offsetVector;
- Vector<int, 32> nonReturnedOvector;
- nonReturnedOvector.resize(offsetVectorSize);
- offsetVector = nonReturnedOvector.data();
- int r = Yarr::interpret(m_regExpBytecode.get(), s, startOffset, reinterpret_cast<unsigned*>(offsetVector));
-#if REGEXP_FUNC_TEST_DATA_GEN
- RegExpFunctionalTestCollector::get()->outputOneTest(this, s, startOffset, offsetVector, result);
-#endif
-
- if (r >= 0) {
-#if ENABLE(REGEXP_TRACING)
- m_rtMatchOnlyFoundCount++;
-#endif
- return MatchResult(r, reinterpret_cast<unsigned*>(offsetVector)[1]);
- }
-
- return MatchResult::failed();
-}
-
-} // namespace JSC
-
-#endif // RegExpInlines_h
-
</del></span></pre></div>
<a id="releasesWebKitGTKwebkit212SourceJavaScriptCoreruntimeRegExpMatchesArraycpp"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.12/Source/JavaScriptCore/runtime/RegExpMatchesArray.cpp (198272 => 198273)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.12/Source/JavaScriptCore/runtime/RegExpMatchesArray.cpp        2016-03-16 15:13:30 UTC (rev 198272)
+++ releases/WebKitGTK/webkit-2.12/Source/JavaScriptCore/runtime/RegExpMatchesArray.cpp        2016-03-16 15:13:51 UTC (rev 198273)
</span><span class="lines">@@ -26,8 +26,90 @@
</span><span class="cx"> #include "config.h"
</span><span class="cx"> #include "RegExpMatchesArray.h"
</span><span class="cx">
</span><ins>+#include "ButterflyInlines.h"
+#include "JSCInlines.h"
+
</ins><span class="cx"> namespace JSC {
</span><span class="cx">
</span><ins>+static const PropertyOffset indexPropertyOffset = 100;
+static const PropertyOffset inputPropertyOffset = 101;
+
+static JSArray* tryCreateUninitializedRegExpMatchesArray(VM& vm, Structure* structure, unsigned initialLength)
+{
+ unsigned vectorLength = std::max(BASE_VECTOR_LEN, initialLength);
+ if (vectorLength > MAX_STORAGE_VECTOR_LENGTH)
+ return 0;
+
+ void* temp;
+ if (!vm.heap.tryAllocateStorage(0, Butterfly::totalSize(0, structure->outOfLineCapacity(), true, vectorLength * sizeof(EncodedJSValue)), &temp))
+ return 0;
+ Butterfly* butterfly = Butterfly::fromBase(temp, 0, structure->outOfLineCapacity());
+ butterfly->setVectorLength(vectorLength);
+ butterfly->setPublicLength(initialLength);
+
+ return JSArray::createWithButterfly(vm, structure, butterfly);
+}
+
+JSArray* createRegExpMatchesArray(
+ ExecState* exec, JSGlobalObject* globalObject, JSString* input, RegExp* regExp,
+ unsigned startOffset, MatchResult& result)
+{
+ SamplingRegion samplingRegion("createRegExpMatchesArray");
+
+ VM& vm = globalObject->vm();
+
+ Vector<int, 32> subpatternResults;
+ int position = regExp->match(vm, input->value(exec), startOffset, subpatternResults);
+ if (position == -1) {
+ result = MatchResult::failed();
+ return nullptr;
+ }
+
+ result.start = position;
+ result.end = subpatternResults[1];
+
+ JSArray* array;
+
+ // FIXME: This should handle array allocation errors gracefully.
+ // https://bugs.webkit.org/show_bug.cgi?id=155144
+
+ if (UNLIKELY(globalObject->isHavingABadTime())) {
+ array = JSArray::tryCreateUninitialized(vm, globalObject->regExpMatchesArrayStructure(), regExp->numSubpatterns() + 1);
+
+ array->initializeIndex(vm, 0, jsSubstringOfResolved(vm, input, result.start, result.end - result.start));
+
+ if (unsigned numSubpatterns = regExp->numSubpatterns()) {
+ for (unsigned i = 1; i <= numSubpatterns; ++i) {
+ int start = subpatternResults[2 * i];
+ if (start >= 0)
+ array->initializeIndex(vm, i, JSRopeString::createSubstringOfResolved(vm, input, start, subpatternResults[2 * i + 1] - start));
+ else
+ array->initializeIndex(vm, i, jsUndefined());
+ }
+ }
+ } else {
+ array = tryCreateUninitializedRegExpMatchesArray(vm, globalObject->regExpMatchesArrayStructure(), regExp->numSubpatterns() + 1);
+ RELEASE_ASSERT(array);
+
+ array->initializeIndex(vm, 0, jsSubstringOfResolved(vm, input, result.start, result.end - result.start), ArrayWithContiguous);
+
+ if (unsigned numSubpatterns = regExp->numSubpatterns()) {
+ for (unsigned i = 1; i <= numSubpatterns; ++i) {
+ int start = subpatternResults[2 * i];
+ if (start >= 0)
+ array->initializeIndex(vm, i, JSRopeString::createSubstringOfResolved(vm, input, start, subpatternResults[2 * i + 1] - start), ArrayWithContiguous);
+ else
+ array->initializeIndex(vm, i, jsUndefined(), ArrayWithContiguous);
+ }
+ }
+ }
+
+ array->putDirect(vm, indexPropertyOffset, jsNumber(result.start));
+ array->putDirect(vm, inputPropertyOffset, input);
+
+ return array;
+}
+
</ins><span class="cx"> JSArray* createEmptyRegExpMatchesArray(JSGlobalObject* globalObject, JSString* input, RegExp* regExp)
</span><span class="cx"> {
</span><span class="cx"> VM& vm = globalObject->vm();
</span><span class="lines">@@ -57,8 +139,8 @@
</span><span class="cx"> }
</span><span class="cx"> }
</span><span class="cx">
</span><del>- array->putDirect(vm, RegExpMatchesArrayIndexPropertyOffset, jsNumber(-1));
- array->putDirect(vm, RegExpMatchesArrayInputPropertyOffset, input);
</del><ins>+ array->putDirect(vm, indexPropertyOffset, jsNumber(-1));
+ array->putDirect(vm, inputPropertyOffset, input);
</ins><span class="cx"> return array;
</span><span class="cx"> }
</span><span class="cx">
</span><span class="lines">@@ -67,9 +149,9 @@
</span><span class="cx"> Structure* structure = globalObject->arrayStructureForIndexingTypeDuringAllocation(indexingType);
</span><span class="cx"> PropertyOffset offset;
</span><span class="cx"> structure = Structure::addPropertyTransition(vm, structure, vm.propertyNames->index, 0, offset);
</span><del>- ASSERT(offset == RegExpMatchesArrayIndexPropertyOffset);
</del><ins>+ ASSERT(offset == indexPropertyOffset);
</ins><span class="cx"> structure = Structure::addPropertyTransition(vm, structure, vm.propertyNames->input, 0, offset);
</span><del>- ASSERT(offset == RegExpMatchesArrayInputPropertyOffset);
</del><ins>+ ASSERT(offset == inputPropertyOffset);
</ins><span class="cx"> return structure;
</span><span class="cx"> }
</span><span class="cx">
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit212SourceJavaScriptCoreruntimeRegExpMatchesArrayh"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.12/Source/JavaScriptCore/runtime/RegExpMatchesArray.h (198272 => 198273)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.12/Source/JavaScriptCore/runtime/RegExpMatchesArray.h        2016-03-16 15:13:30 UTC (rev 198272)
+++ releases/WebKitGTK/webkit-2.12/Source/JavaScriptCore/runtime/RegExpMatchesArray.h        2016-03-16 15:13:51 UTC (rev 198273)
</span><span class="lines">@@ -20,96 +20,17 @@
</span><span class="cx"> #ifndef RegExpMatchesArray_h
</span><span class="cx"> #define RegExpMatchesArray_h
</span><span class="cx">
</span><del>-#include "ButterflyInlines.h"
</del><span class="cx"> #include "JSArray.h"
</span><del>-#include "JSCInlines.h"
</del><span class="cx"> #include "JSGlobalObject.h"
</span><del>-#include "RegExpInlines.h"
</del><span class="cx"> #include "RegExpObject.h"
</span><span class="cx">
</span><span class="cx"> namespace JSC {
</span><span class="cx">
</span><del>-static const PropertyOffset RegExpMatchesArrayIndexPropertyOffset = 100;
-static const PropertyOffset RegExpMatchesArrayInputPropertyOffset = 101;
-
-ALWAYS_INLINE JSArray* tryCreateUninitializedRegExpMatchesArray(VM& vm, Structure* structure, unsigned initialLength)
-{
- unsigned vectorLength = std::max(BASE_VECTOR_LEN, initialLength);
- if (vectorLength > MAX_STORAGE_VECTOR_LENGTH)
- return 0;
-
- void* temp;
- if (!vm.heap.tryAllocateStorage(0, Butterfly::totalSize(0, structure->outOfLineCapacity(), true, vectorLength * sizeof(EncodedJSValue)), &temp))
- return 0;
- Butterfly* butterfly = Butterfly::fromBase(temp, 0, structure->outOfLineCapacity());
- butterfly->setVectorLength(vectorLength);
- butterfly->setPublicLength(initialLength);
-
- return JSArray::createWithButterfly(vm, structure, butterfly);
-}
-
-ALWAYS_INLINE JSArray* createRegExpMatchesArray(
- VM& vm, JSGlobalObject* globalObject, JSString* input, const String& inputValue,
- RegExp* regExp, unsigned startOffset, MatchResult& result)
-{
- SamplingRegion samplingRegion("createRegExpMatchesArray");
-
- Vector<int, 32> subpatternResults;
- int position = regExp->matchInline(vm, inputValue, startOffset, subpatternResults);
- if (position == -1) {
- result = MatchResult::failed();
- return nullptr;
- }
-
- result.start = position;
- result.end = subpatternResults[1];
-
- JSArray* array;
-
- // FIXME: This should handle array allocation errors gracefully.
- // https://bugs.webkit.org/show_bug.cgi?id=155144
-
- if (UNLIKELY(globalObject->isHavingABadTime())) {
- array = JSArray::tryCreateUninitialized(vm, globalObject->regExpMatchesArrayStructure(), regExp->numSubpatterns() + 1);
-
- array->initializeIndex(vm, 0, jsSubstringOfResolved(vm, input, result.start, result.end - result.start));
-
- if (unsigned numSubpatterns = regExp->numSubpatterns()) {
- for (unsigned i = 1; i <= numSubpatterns; ++i) {
- int start = subpatternResults[2 * i];
- if (start >= 0)
- array->initializeIndex(vm, i, JSRopeString::createSubstringOfResolved(vm, input, start, subpatternResults[2 * i + 1] - start));
- else
- array->initializeIndex(vm, i, jsUndefined());
- }
- }
- } else {
- array = tryCreateUninitializedRegExpMatchesArray(vm, globalObject->regExpMatchesArrayStructure(), regExp->numSubpatterns() + 1);
- RELEASE_ASSERT(array);
-
- array->initializeIndex(vm, 0, jsSubstringOfResolved(vm, input, result.start, result.end - result.start), ArrayWithContiguous);
-
- if (unsigned numSubpatterns = regExp->numSubpatterns()) {
- for (unsigned i = 1; i <= numSubpatterns; ++i) {
- int start = subpatternResults[2 * i];
- if (start >= 0)
- array->initializeIndex(vm, i, JSRopeString::createSubstringOfResolved(vm, input, start, subpatternResults[2 * i + 1] - start), ArrayWithContiguous);
- else
- array->initializeIndex(vm, i, jsUndefined(), ArrayWithContiguous);
- }
- }
- }
-
- array->putDirect(vm, RegExpMatchesArrayIndexPropertyOffset, jsNumber(result.start));
- array->putDirect(vm, RegExpMatchesArrayInputPropertyOffset, input);
-
- return array;
-}
-
</del><ins>+JSArray* createRegExpMatchesArray(ExecState*, JSGlobalObject*, JSString*, RegExp*, unsigned startOffset, MatchResult&);
</ins><span class="cx"> inline JSArray* createRegExpMatchesArray(ExecState* exec, JSGlobalObject* globalObject, JSString* string, RegExp* regExp, unsigned startOffset)
</span><span class="cx"> {
</span><span class="cx"> MatchResult ignoredResult;
</span><del>- return createRegExpMatchesArray(globalObject->vm(), globalObject, string, string->value(exec), regExp, startOffset, ignoredResult);
</del><ins>+ return createRegExpMatchesArray(exec, globalObject, string, regExp, startOffset, ignoredResult);
</ins><span class="cx"> }
</span><span class="cx"> JSArray* createEmptyRegExpMatchesArray(JSGlobalObject*, JSString*, RegExp*);
</span><span class="cx"> Structure* createRegExpMatchesArrayStructure(VM&, JSGlobalObject*);
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit212SourceJavaScriptCoreruntimeRegExpObjectcpp"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.12/Source/JavaScriptCore/runtime/RegExpObject.cpp (198272 => 198273)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.12/Source/JavaScriptCore/runtime/RegExpObject.cpp        2016-03-16 15:13:30 UTC (rev 198272)
+++ releases/WebKitGTK/webkit-2.12/Source/JavaScriptCore/runtime/RegExpObject.cpp        2016-03-16 15:13:51 UTC (rev 198273)
</span><span class="lines">@@ -32,7 +32,6 @@
</span><span class="cx"> #include "JSCInlines.h"
</span><span class="cx"> #include "RegExpConstructor.h"
</span><span class="cx"> #include "RegExpMatchesArray.h"
</span><del>-#include "RegExpObjectInlines.h"
</del><span class="cx"> #include "RegExpPrototype.h"
</span><span class="cx"> #include <wtf/text/StringBuilder.h>
</span><span class="cx">
</span><span class="lines">@@ -160,15 +159,77 @@
</span><span class="cx"> Base::put(cell, exec, propertyName, value, slot);
</span><span class="cx"> }
</span><span class="cx">
</span><ins>+ALWAYS_INLINE unsigned getLastIndexAsUnsigned(
+ ExecState* exec, RegExpObject* regExpObject, const String& input)
+{
+ JSValue jsLastIndex = regExpObject->getLastIndex();
+ unsigned lastIndex;
+ if (LIKELY(jsLastIndex.isUInt32())) {
+ lastIndex = jsLastIndex.asUInt32();
+ if (lastIndex > input.length()) {
+ regExpObject->setLastIndex(exec, 0);
+ return UINT_MAX;
+ }
+ } else {
+ double doubleLastIndex = jsLastIndex.toInteger(exec);
+ if (doubleLastIndex < 0 || doubleLastIndex > input.length()) {
+ regExpObject->setLastIndex(exec, 0);
+ return UINT_MAX;
+ }
+ lastIndex = static_cast<unsigned>(doubleLastIndex);
+ }
+ return lastIndex;
+}
+
</ins><span class="cx"> JSValue RegExpObject::exec(ExecState* exec, JSGlobalObject* globalObject, JSString* string)
</span><span class="cx"> {
</span><del>- return execInline(exec, globalObject, string);
</del><ins>+ RegExp* regExp = this->regExp();
+ RegExpConstructor* regExpConstructor = globalObject->regExpConstructor();
+ String input = string->value(exec); // FIXME: Handle errors. https://bugs.webkit.org/show_bug.cgi?id=155145
+ VM& vm = globalObject->vm();
+
+ if (!regExp->global()) {
+ MatchResult result;
+ JSArray* array = createRegExpMatchesArray(exec, globalObject, string, regExp, 0, result);
+ if (!array)
+ return jsNull();
+ regExpConstructor->recordMatch(vm, regExp, string, result);
+ return array;
+ }
+
+ unsigned lastIndex = getLastIndexAsUnsigned(exec, this, input);
+ if (lastIndex == UINT_MAX)
+ return jsNull();
+
+ MatchResult result;
+ JSArray* array =
+ createRegExpMatchesArray(exec, globalObject, string, regExp, lastIndex, result);
+ if (!array) {
+ setLastIndex(exec, 0);
+ return jsNull();
+ }
+ setLastIndex(exec, result.end);
+ regExpConstructor->recordMatch(vm, regExp, string, result);
+ return array;
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> // Shared implementation used by test and exec.
</span><span class="cx"> MatchResult RegExpObject::match(ExecState* exec, JSGlobalObject* globalObject, JSString* string)
</span><span class="cx"> {
</span><del>- return matchInline(exec, globalObject, string);
</del><ins>+ RegExp* regExp = this->regExp();
+ RegExpConstructor* regExpConstructor = globalObject->regExpConstructor();
+ String input = string->value(exec); // FIXME: Handle errors. https://bugs.webkit.org/show_bug.cgi?id=155145
+ VM& vm = globalObject->vm();
+ if (!regExp->global())
+ return regExpConstructor->performMatch(vm, regExp, string, input, 0);
+
+ unsigned lastIndex = getLastIndexAsUnsigned(exec, this, input);
+ if (lastIndex == UINT_MAX)
+ return MatchResult::failed();
+
+ MatchResult result = regExpConstructor->performMatch(vm, regExp, string, input, lastIndex);
+ setLastIndex(exec, result.end);
+ return result;
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> } // namespace JSC
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit212SourceJavaScriptCoreruntimeRegExpObjecth"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.12/Source/JavaScriptCore/runtime/RegExpObject.h (198272 => 198273)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.12/Source/JavaScriptCore/runtime/RegExpObject.h        2016-03-16 15:13:30 UTC (rev 198272)
+++ releases/WebKitGTK/webkit-2.12/Source/JavaScriptCore/runtime/RegExpObject.h        2016-03-16 15:13:51 UTC (rev 198273)
</span><span class="lines">@@ -67,9 +67,7 @@
</span><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> bool test(ExecState* exec, JSGlobalObject* globalObject, JSString* string) { return !!match(exec, globalObject, string); }
</span><del>- bool testInline(ExecState* exec, JSGlobalObject* globalObject, JSString* string) { return !!matchInline(exec, globalObject, string); }
</del><span class="cx"> JSValue exec(ExecState*, JSGlobalObject*, JSString*);
</span><del>- JSValue execInline(ExecState*, JSGlobalObject*, JSString*);
</del><span class="cx">
</span><span class="cx"> static bool getOwnPropertySlot(JSObject*, ExecState*, PropertyName, PropertySlot&);
</span><span class="cx"> static void put(JSCell*, ExecState*, PropertyName, JSValue, PutPropertySlot&);
</span><span class="lines">@@ -105,7 +103,6 @@
</span><span class="cx">
</span><span class="cx"> private:
</span><span class="cx"> MatchResult match(ExecState*, JSGlobalObject*, JSString*);
</span><del>- MatchResult matchInline(ExecState*, JSGlobalObject*, JSString*);
</del><span class="cx">
</span><span class="cx"> WriteBarrier<RegExp> m_regExp;
</span><span class="cx"> WriteBarrier<Unknown> m_lastIndex;
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit212SourceJavaScriptCoreruntimeRegExpObjectInlinesh"></a>
<div class="delfile"><h4>Deleted: releases/WebKitGTK/webkit-2.12/Source/JavaScriptCore/runtime/RegExpObjectInlines.h (198272 => 198273)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.12/Source/JavaScriptCore/runtime/RegExpObjectInlines.h        2016-03-16 15:13:30 UTC (rev 198272)
+++ releases/WebKitGTK/webkit-2.12/Source/JavaScriptCore/runtime/RegExpObjectInlines.h        2016-03-16 15:13:51 UTC (rev 198273)
</span><span class="lines">@@ -1,113 +0,0 @@
</span><del>-/*
- * Copyright (C) 1999-2000 Harri Porten (porten@kde.org)
- * Copyright (C) 2003, 2007, 2008, 2012, 2016 Apple Inc. All Rights Reserved.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- */
-
-#ifndef RegExpObjectInlines_h
-#define RegExpObjectInlines_h
-
-#include "ButterflyInlines.h"
-#include "Error.h"
-#include "ExceptionHelpers.h"
-#include "JSArray.h"
-#include "JSGlobalObject.h"
-#include "JSString.h"
-#include "JSCInlines.h"
-#include "RegExpConstructor.h"
-#include "RegExpMatchesArray.h"
-#include "RegExpObject.h"
-
-namespace JSC {
-
-ALWAYS_INLINE unsigned getRegExpObjectLastIndexAsUnsigned(
- ExecState* exec, RegExpObject* regExpObject, const String& input)
-{
- JSValue jsLastIndex = regExpObject->getLastIndex();
- unsigned lastIndex;
- if (LIKELY(jsLastIndex.isUInt32())) {
- lastIndex = jsLastIndex.asUInt32();
- if (lastIndex > input.length()) {
- regExpObject->setLastIndex(exec, 0);
- return UINT_MAX;
- }
- } else {
- double doubleLastIndex = jsLastIndex.toInteger(exec);
- if (doubleLastIndex < 0 || doubleLastIndex > input.length()) {
- regExpObject->setLastIndex(exec, 0);
- return UINT_MAX;
- }
- lastIndex = static_cast<unsigned>(doubleLastIndex);
- }
- return lastIndex;
-}
-
-JSValue RegExpObject::execInline(ExecState* exec, JSGlobalObject* globalObject, JSString* string)
-{
- RegExp* regExp = this->regExp();
- RegExpConstructor* regExpConstructor = globalObject->regExpConstructor();
- String input = string->value(exec); // FIXME: Handle errors. https://bugs.webkit.org/show_bug.cgi?id=155145
- VM& vm = globalObject->vm();
-
- bool global = regExp->global();
-
- unsigned lastIndex;
- if (global) {
- lastIndex = getRegExpObjectLastIndexAsUnsigned(exec, this, input);
- if (lastIndex == UINT_MAX)
- return jsNull();
- } else
- lastIndex = 0;
-
- MatchResult result;
- JSArray* array =
- createRegExpMatchesArray(vm, globalObject, string, input, regExp, lastIndex, result);
- if (!array) {
- if (global)
- setLastIndex(exec, 0);
- return jsNull();
- }
- if (global)
- setLastIndex(exec, result.end);
- regExpConstructor->recordMatch(vm, regExp, string, result);
- return array;
-}
-
-// Shared implementation used by test and exec.
-MatchResult RegExpObject::matchInline(
- ExecState* exec, JSGlobalObject* globalObject, JSString* string)
-{
- RegExp* regExp = this->regExp();
- RegExpConstructor* regExpConstructor = globalObject->regExpConstructor();
- String input = string->value(exec); // FIXME: Handle errors. https://bugs.webkit.org/show_bug.cgi?id=155145
- VM& vm = globalObject->vm();
- if (!regExp->global())
- return regExpConstructor->performMatch(vm, regExp, string, input, 0);
-
- unsigned lastIndex = getRegExpObjectLastIndexAsUnsigned(exec, this, input);
- if (lastIndex == UINT_MAX)
- return MatchResult::failed();
-
- MatchResult result = regExpConstructor->performMatch(vm, regExp, string, input, lastIndex);
- setLastIndex(exec, result.end);
- return result;
-}
-
-} // namespace JSC
-
-#endif // RegExpObjectInlines_h
-
</del></span></pre>
</div>
</div>
</body>
</html>