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

Side by Side Diff: src/js/regexp.js

Issue 2339443002: [regexp] Avoid unneeded accesses to lastIndex (Closed)
Patch Set: Update test262 status 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 unified diff | Download patch
« no previous file with comments | « no previous file | test/mjsunit/regexp.js » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2012 the V8 project authors. All rights reserved. 1 // Copyright 2012 the V8 project authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 (function(global, utils) { 5 (function(global, utils) {
6 6
7 %CheckIsBootstrapping(); 7 %CheckIsBootstrapping();
8 8
9 // ------------------------------------------------------------------- 9 // -------------------------------------------------------------------
10 // Imports 10 // Imports
(...skipping 167 matching lines...) Expand 10 before | Expand all | Expand 10 after
178 178
179 // ES#sec-regexp.prototype.exec 179 // ES#sec-regexp.prototype.exec
180 // RegExp.prototype.exec ( string ) 180 // RegExp.prototype.exec ( string )
181 function RegExpSubclassExecJS(string) { 181 function RegExpSubclassExecJS(string) {
182 if (!IS_REGEXP(this)) { 182 if (!IS_REGEXP(this)) {
183 throw %make_type_error(kIncompatibleMethodReceiver, 183 throw %make_type_error(kIncompatibleMethodReceiver,
184 'RegExp.prototype.exec', this); 184 'RegExp.prototype.exec', this);
185 } 185 }
186 186
187 string = TO_STRING(string); 187 string = TO_STRING(string);
188 var lastIndex = this.lastIndex;
189 188
190 // Conversion is required by the ES2015 specification (RegExpBuiltinExec 189 var lastIndex;
191 // algorithm, step 4) even if the value is discarded for non-global RegExps.
192 var i = TO_LENGTH(lastIndex);
193
194 var global = TO_BOOLEAN(REGEXP_GLOBAL(this)); 190 var global = TO_BOOLEAN(REGEXP_GLOBAL(this));
195 var sticky = TO_BOOLEAN(REGEXP_STICKY(this)); 191 var sticky = TO_BOOLEAN(REGEXP_STICKY(this));
196 var updateLastIndex = global || sticky; 192 var updateLastIndex = global || sticky;
197 if (updateLastIndex) { 193 if (updateLastIndex) {
198 if (i > string.length) { 194 lastIndex = TO_LENGTH(this.lastIndex);
195 if (lastIndex > string.length) {
199 this.lastIndex = 0; 196 this.lastIndex = 0;
200 return null; 197 return null;
201 } 198 }
202 } else { 199 } else {
203 i = 0; 200 lastIndex = 0;
204 } 201 }
205 202
206 // matchIndices is either null or the RegExpLastMatchInfo array. 203 // matchIndices is either null or the RegExpLastMatchInfo array.
207 var matchIndices = %_RegExpExec(this, string, i, RegExpLastMatchInfo); 204 var matchIndices = %_RegExpExec(this, string, lastIndex, RegExpLastMatchInfo);
208 205
209 if (IS_NULL(matchIndices)) { 206 if (IS_NULL(matchIndices)) {
210 this.lastIndex = 0; 207 if (updateLastIndex) this.lastIndex = 0;
211 return null; 208 return null;
212 } 209 }
213 210
214 // Successful match. 211 // Successful match.
215 if (updateLastIndex) { 212 if (updateLastIndex) {
216 this.lastIndex = RegExpLastMatchInfo[CAPTURE1]; 213 this.lastIndex = RegExpLastMatchInfo[CAPTURE1];
217 } 214 }
218 RETURN_NEW_RESULT_FROM_MATCH_INFO(matchIndices, string); 215 RETURN_NEW_RESULT_FROM_MATCH_INFO(matchIndices, string);
219 } 216 }
220 %FunctionRemovePrototype(RegExpSubclassExecJS); 217 %FunctionRemovePrototype(RegExpSubclassExecJS);
(...skipping 707 matching lines...) Expand 10 before | Expand all | Expand 10 after
928 925
929 // ES#sec-regexp.prototype-@@search 926 // ES#sec-regexp.prototype-@@search
930 // RegExp.prototype [ @@search ] ( string ) 927 // RegExp.prototype [ @@search ] ( string )
931 function RegExpSubclassSearch(string) { 928 function RegExpSubclassSearch(string) {
932 if (!IS_RECEIVER(this)) { 929 if (!IS_RECEIVER(this)) {
933 throw %make_type_error(kIncompatibleMethodReceiver, 930 throw %make_type_error(kIncompatibleMethodReceiver,
934 "RegExp.prototype.@@search", this); 931 "RegExp.prototype.@@search", this);
935 } 932 }
936 string = TO_STRING(string); 933 string = TO_STRING(string);
937 var previousLastIndex = this.lastIndex; 934 var previousLastIndex = this.lastIndex;
938 this.lastIndex = 0; 935 if (previousLastIndex != 0) this.lastIndex = 0;
939 var result = RegExpSubclassExec(this, string); 936 var result = RegExpSubclassExec(this, string);
940 this.lastIndex = previousLastIndex; 937 var currentLastIndex = this.lastIndex;
938 if (currentLastIndex != previousLastIndex) this.lastIndex = previousLastIndex;
941 if (IS_NULL(result)) return -1; 939 if (IS_NULL(result)) return -1;
942 return result.index; 940 return result.index;
943 } 941 }
944 %FunctionRemovePrototype(RegExpSubclassSearch); 942 %FunctionRemovePrototype(RegExpSubclassSearch);
945 943
946 944
947 // Getters for the static properties lastMatch, lastParen, leftContext, and 945 // Getters for the static properties lastMatch, lastParen, leftContext, and
948 // rightContext of the RegExp constructor. The properties are computed based 946 // rightContext of the RegExp constructor. The properties are computed based
949 // on the captures array of the last successful match and the subject string 947 // on the captures array of the last successful match and the subject string
950 // of the last successful match. 948 // of the last successful match.
(...skipping 271 matching lines...) Expand 10 before | Expand all | Expand 10 after
1222 to.InternalRegExpMatch = InternalRegExpMatch; 1220 to.InternalRegExpMatch = InternalRegExpMatch;
1223 to.InternalRegExpReplace = InternalRegExpReplace; 1221 to.InternalRegExpReplace = InternalRegExpReplace;
1224 to.IsRegExp = IsRegExp; 1222 to.IsRegExp = IsRegExp;
1225 to.RegExpExec = DoRegExpExec; 1223 to.RegExpExec = DoRegExpExec;
1226 to.RegExpInitialize = RegExpInitialize; 1224 to.RegExpInitialize = RegExpInitialize;
1227 to.RegExpLastMatchInfo = RegExpLastMatchInfo; 1225 to.RegExpLastMatchInfo = RegExpLastMatchInfo;
1228 to.RegExpTest = RegExpTest; 1226 to.RegExpTest = RegExpTest;
1229 }); 1227 });
1230 1228
1231 }) 1229 })
OLDNEW
« no previous file with comments | « no previous file | test/mjsunit/regexp.js » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698