Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(319)

Unified Diff: src/js/regexp.js

Issue 2307863003: [regexp] Port RegExpMatch, RegExpSearch, and RegExpTest (Closed)
Patch Set: Rebase Created 4 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « src/heap-symbols.h ('k') | src/objects.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/js/regexp.js
diff --git a/src/js/regexp.js b/src/js/regexp.js
index b9d0f50b244345c52e73e1cb33fdbe09d7c3c6f6..3053ce67c6831aca5371ee6b4f8f1a5033d93fa9 100644
--- a/src/js/regexp.js
+++ b/src/js/regexp.js
@@ -24,6 +24,7 @@ var searchSymbol = utils.ImportNow("search_symbol");
var speciesSymbol = utils.ImportNow("species_symbol");
var splitSymbol = utils.ImportNow("split_symbol");
var SpeciesConstructor;
+var RegExpSubclassExecJS;
utils.Import(function(from) {
ExpandReplacement = from.ExpandReplacement;
@@ -102,66 +103,6 @@ macro RETURN_NEW_RESULT_FROM_MATCH_INFO(MATCHINFO, STRING)
endmacro
-function RegExpExecNoTests(regexp, string, start) {
- // Must be called with RegExp, string and positive integer as arguments.
- var matchInfo = %_RegExpExec(regexp, string, start, RegExpLastMatchInfo);
- if (matchInfo !== null) {
- // ES6 21.2.5.2.2 step 18.
- if (REGEXP_STICKY(regexp)) regexp.lastIndex = matchInfo[CAPTURE1];
- RETURN_NEW_RESULT_FROM_MATCH_INFO(matchInfo, string);
- }
- regexp.lastIndex = 0;
- return null;
-}
-
-
-// ES#sec-regexp.prototype.exec
-// RegExp.prototype.exec ( string )
-function RegExpSubclassExecJS(string) {
- if (!IS_REGEXP(this)) {
- throw %make_type_error(kIncompatibleMethodReceiver,
- 'RegExp.prototype.exec', this);
- }
-
- string = TO_STRING(string);
- var lastIndex = this.lastIndex;
-
- // Conversion is required by the ES2015 specification (RegExpBuiltinExec
- // algorithm, step 4) even if the value is discarded for non-global RegExps.
- var i = TO_LENGTH(lastIndex);
-
- var global = TO_BOOLEAN(REGEXP_GLOBAL(this));
- var sticky = TO_BOOLEAN(REGEXP_STICKY(this));
- var updateLastIndex = global || sticky;
- if (updateLastIndex) {
- if (i > string.length) {
- this.lastIndex = 0;
- return null;
- }
- } else {
- i = 0;
- }
-
- // matchIndices is either null or the RegExpLastMatchInfo array.
- // TODO(littledan): Whether a RegExp is sticky is compiled into the RegExp
- // itself, but ES2015 allows monkey-patching this property to differ from
- // the internal flags. If it differs, recompile a different RegExp?
- var matchIndices = %_RegExpExec(this, string, i, RegExpLastMatchInfo);
-
- if (IS_NULL(matchIndices)) {
- this.lastIndex = 0;
- return null;
- }
-
- // Successful match.
- if (updateLastIndex) {
- this.lastIndex = RegExpLastMatchInfo[CAPTURE1];
- }
- RETURN_NEW_RESULT_FROM_MATCH_INFO(matchIndices, string);
-}
-%FunctionRemovePrototype(RegExpSubclassExecJS);
-
-
// ES#sec-regexpexec Runtime Semantics: RegExpExec ( R, S )
// Also takes an optional exec method in case our caller
// has already fetched exec.
@@ -181,19 +122,6 @@ function RegExpSubclassExec(regexp, string, exec) {
%SetForceInlineFlag(RegExpSubclassExec);
-// ES#sec-regexp.prototype.test RegExp.prototype.test ( S )
-function RegExpSubclassTest(string) {
- if (!IS_RECEIVER(this)) {
- throw %make_type_error(kIncompatibleMethodReceiver,
- 'RegExp.prototype.test', this);
- }
- string = TO_STRING(string);
- var match = RegExpSubclassExec(this, string);
- return !IS_NULL(match);
-}
-%FunctionRemovePrototype(RegExpSubclassTest);
-
-
function AtSurrogatePair(subject, index) {
if (index + 1 >= subject.length) return false;
var first = %_StringCharCodeAt(subject, index);
@@ -354,39 +282,6 @@ function RegExpSubclassSplit(string, limit) {
%FunctionRemovePrototype(RegExpSubclassSplit);
-// ES#sec-regexp.prototype-@@match
-// RegExp.prototype [ @@match ] ( string )
-function RegExpSubclassMatch(string) {
- if (!IS_RECEIVER(this)) {
- throw %make_type_error(kIncompatibleMethodReceiver,
- "RegExp.prototype.@@match", this);
- }
- string = TO_STRING(string);
- var global = this.global;
- if (!global) return RegExpSubclassExec(this, string);
- var unicode = this.unicode;
- this.lastIndex = 0;
- var array = new InternalArray();
- var n = 0;
- var result;
- while (true) {
- result = RegExpSubclassExec(this, string);
- if (IS_NULL(result)) {
- if (n === 0) return null;
- break;
- }
- var matchStr = TO_STRING(result[0]);
- array[n] = matchStr;
- if (matchStr === "") SetAdvancedStringIndex(this, string, unicode);
- n++;
- }
- var resultArray = [];
- %MoveArrayContents(array, resultArray);
- return resultArray;
-}
-%FunctionRemovePrototype(RegExpSubclassMatch);
-
-
// Legacy implementation of RegExp.prototype[Symbol.replace] which
// doesn't properly call the underlying exec method.
@@ -753,38 +648,18 @@ function RegExpSubclassReplace(string, replace) {
%FunctionRemovePrototype(RegExpSubclassReplace);
-// ES#sec-regexp.prototype-@@search
-// RegExp.prototype [ @@search ] ( string )
-function RegExpSubclassSearch(string) {
- if (!IS_RECEIVER(this)) {
- throw %make_type_error(kIncompatibleMethodReceiver,
- "RegExp.prototype.@@search", this);
- }
- string = TO_STRING(string);
- var previousLastIndex = this.lastIndex;
- this.lastIndex = 0;
- var result = RegExpSubclassExec(this, string);
- this.lastIndex = previousLastIndex;
- if (IS_NULL(result)) return -1;
- return result.index;
-}
-%FunctionRemovePrototype(RegExpSubclassSearch);
-
-
// -------------------------------------------------------------------
utils.InstallFunctions(GlobalRegExp.prototype, DONT_ENUM, [
- "exec", RegExpSubclassExecJS,
- "test", RegExpSubclassTest,
- matchSymbol, RegExpSubclassMatch,
replaceSymbol, RegExpSubclassReplace,
- searchSymbol, RegExpSubclassSearch,
splitSymbol, RegExpSubclassSplit,
]);
// Temporary until all RegExpLastMatchInfo accesses are ported to C++.
SET_PRIVATE(GlobalRegExp, lastMatchInfoSymbol, RegExpLastMatchInfo);
+var RegExpSubclassExecJS = GlobalRegExp.prototype.exec;
+
// -------------------------------------------------------------------
// Internal
« no previous file with comments | « src/heap-symbols.h ('k') | src/objects.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698