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

Unified Diff: src/js/regexp.js

Issue 2050343002: [regexp] Experimental support for regexp named captures (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: static_cast<int> Created 4 years, 6 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/flag-definitions.h ('k') | src/objects.h » ('j') | src/regexp/jsregexp.cc » ('J')
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 ef6a4aed053b3d15f23056a64c4540112be08337..a881c490006b8e961c8c8a1125952231f986e409 100644
--- a/src/js/regexp.js
+++ b/src/js/regexp.js
@@ -141,7 +141,7 @@ function DoRegExpExec(regexp, string, index) {
// This is kind of performance sensitive, so we want to avoid unnecessary
// type checks on inputs. But we also don't want to inline it several times
// manually, so we use a macro :-)
-macro RETURN_NEW_RESULT_FROM_MATCH_INFO(MATCHINFO, STRING)
+macro RETURN_NEW_RESULT_FROM_MATCH_INFO(MATCHINFO, STRING, JSREGEXP)
var numResults = NUMBER_OF_CAPTURES(MATCHINFO) >> 1;
var start = MATCHINFO[CAPTURE0];
var end = MATCHINFO[CAPTURE1];
@@ -160,6 +160,9 @@ macro RETURN_NEW_RESULT_FROM_MATCH_INFO(MATCHINFO, STRING)
}
j++;
}
+ // For each named capture 'a', create a property result.a containing the
+ // corresponding captured string.
+ %RegExpResultAttachNamedCaptures(result, JSREGEXP);
Yang 2016/06/13 10:54:52 This is going to be fairly expensive, and affects
jgruber 2016/06/13 13:09:59 I'm tending towards this as an initial approach. T
return result;
endmacro
@@ -170,7 +173,7 @@ function RegExpExecNoTests(regexp, string, start) {
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);
+ RETURN_NEW_RESULT_FROM_MATCH_INFO(matchInfo, string, regexp);
}
regexp.lastIndex = 0;
return null;
@@ -219,7 +222,7 @@ function RegExpSubclassExecJS(string) {
if (updateLastIndex) {
this.lastIndex = RegExpLastMatchInfo[CAPTURE1];
}
- RETURN_NEW_RESULT_FROM_MATCH_INFO(matchIndices, string);
+ RETURN_NEW_RESULT_FROM_MATCH_INFO(matchIndices, string, this);
}
%FunctionRemovePrototype(RegExpSubclassExecJS);
@@ -260,7 +263,7 @@ function RegExpExecJS(string) {
if (updateLastIndex) {
this.lastIndex = RegExpLastMatchInfo[CAPTURE1];
}
- RETURN_NEW_RESULT_FROM_MATCH_INFO(matchIndices, string);
+ RETURN_NEW_RESULT_FROM_MATCH_INFO(matchIndices, string, this);
}
@@ -1214,7 +1217,7 @@ var InternalRegExpMatchInfo = new InternalPackedArray(2, "", UNDEFINED, 0, 0);
function InternalRegExpMatch(regexp, subject) {
var matchInfo = %_RegExpExec(regexp, subject, 0, InternalRegExpMatchInfo);
if (!IS_NULL(matchInfo)) {
- RETURN_NEW_RESULT_FROM_MATCH_INFO(matchInfo, subject);
+ RETURN_NEW_RESULT_FROM_MATCH_INFO(matchInfo, subject, regexp);
}
return null;
}
« no previous file with comments | « src/flag-definitions.h ('k') | src/objects.h » ('j') | src/regexp/jsregexp.cc » ('J')

Powered by Google App Engine
This is Rietveld 408576698