Chromium Code Reviews| 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; |
| } |