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

Side by Side Diff: src/string.js

Issue 12033099: Fix additional spec violations wrt RegExp.lastIndex. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Created 7 years, 10 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 | Annotate | Revision Log
« no previous file with comments | « src/runtime.cc ('k') | test/mjsunit/regress/regress-2437.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 // Redistribution and use in source and binary forms, with or without 2 // Redistribution and use in source and binary forms, with or without
3 // modification, are permitted provided that the following conditions are 3 // modification, are permitted provided that the following conditions are
4 // met: 4 // met:
5 // 5 //
6 // * Redistributions of source code must retain the above copyright 6 // * Redistributions of source code must retain the above copyright
7 // notice, this list of conditions and the following disclaimer. 7 // notice, this list of conditions and the following disclaimer.
8 // * Redistributions in binary form must reproduce the above 8 // * Redistributions in binary form must reproduce the above
9 // copyright notice, this list of conditions and the following 9 // copyright notice, this list of conditions and the following
10 // disclaimer in the documentation and/or other materials provided 10 // disclaimer in the documentation and/or other materials provided
(...skipping 176 matching lines...) Expand 10 before | Expand all | Expand 10 after
187 var subject = TO_STRING_INLINE(this); 187 var subject = TO_STRING_INLINE(this);
188 if (IS_REGEXP(regexp)) { 188 if (IS_REGEXP(regexp)) {
189 // Emulate RegExp.prototype.exec's side effect in step 5, even though 189 // Emulate RegExp.prototype.exec's side effect in step 5, even though
190 // value is discarded. 190 // value is discarded.
191 ToInteger(regexp.lastIndex); 191 ToInteger(regexp.lastIndex);
192 if (!regexp.global) return RegExpExecNoTests(regexp, subject, 0); 192 if (!regexp.global) return RegExpExecNoTests(regexp, subject, 0);
193 %_Log('regexp', 'regexp-match,%0S,%1r', [subject, regexp]); 193 %_Log('regexp', 'regexp-match,%0S,%1r', [subject, regexp]);
194 // lastMatchInfo is defined in regexp.js. 194 // lastMatchInfo is defined in regexp.js.
195 var result = %StringMatch(subject, regexp, lastMatchInfo); 195 var result = %StringMatch(subject, regexp, lastMatchInfo);
196 if (result !== null) lastMatchInfoOverride = null; 196 if (result !== null) lastMatchInfoOverride = null;
197 regexp.lastIndex = 0;
197 return result; 198 return result;
198 } 199 }
199 // Non-regexp argument. 200 // Non-regexp argument.
200 regexp = new $RegExp(regexp); 201 regexp = new $RegExp(regexp);
201 return RegExpExecNoTests(regexp, subject, 0); 202 return RegExpExecNoTests(regexp, subject, 0);
202 } 203 }
203 204
204 205
205 // SubString is an internal function that returns the sub string of 'string'. 206 // SubString is an internal function that returns the sub string of 'string'.
206 // If resulting string is of length 1, we use the one character cache 207 // If resulting string is of length 1, we use the one character cache
(...skipping 30 matching lines...) Expand all
237 if (IS_SPEC_FUNCTION(replace)) { 238 if (IS_SPEC_FUNCTION(replace)) {
238 if (search.global) { 239 if (search.global) {
239 return StringReplaceGlobalRegExpWithFunction(subject, search, replace); 240 return StringReplaceGlobalRegExpWithFunction(subject, search, replace);
240 } else { 241 } else {
241 return StringReplaceNonGlobalRegExpWithFunction(subject, 242 return StringReplaceNonGlobalRegExpWithFunction(subject,
242 search, 243 search,
243 replace); 244 replace);
244 } 245 }
245 } else { 246 } else {
246 if (lastMatchInfoOverride == null) { 247 if (lastMatchInfoOverride == null) {
247 return %StringReplaceRegExpWithString(subject, 248 var answer = %StringReplaceRegExpWithString(subject,
248 search, 249 search,
249 TO_STRING_INLINE(replace), 250 TO_STRING_INLINE(replace),
250 lastMatchInfo); 251 lastMatchInfo);
252 if (IS_UNDEFINED(answer)) { // No match. Return subject string.
253 search.lastIndex = 0;
254 return subject;
255 }
256 if (search.global) search.lastIndex = 0;
257 return answer;
251 } else { 258 } else {
252 // We use this hack to detect whether StringReplaceRegExpWithString 259 // We use this hack to detect whether StringReplaceRegExpWithString
253 // found at least one hit. In that case we need to remove any 260 // found at least one hit. In that case we need to remove any
254 // override. 261 // override.
255 var saved_subject = lastMatchInfo[LAST_SUBJECT_INDEX]; 262 var saved_subject = lastMatchInfo[LAST_SUBJECT_INDEX];
256 lastMatchInfo[LAST_SUBJECT_INDEX] = 0; 263 lastMatchInfo[LAST_SUBJECT_INDEX] = 0;
257 var answer = %StringReplaceRegExpWithString(subject, 264 var answer = %StringReplaceRegExpWithString(subject,
258 search, 265 search,
259 TO_STRING_INLINE(replace), 266 TO_STRING_INLINE(replace),
260 lastMatchInfo); 267 lastMatchInfo);
268 if (IS_UNDEFINED(answer)) { // No match. Return subject string.
269 search.lastIndex = 0;
270 lastMatchInfo[LAST_SUBJECT_INDEX] = saved_subject;
271 return subject;
272 }
261 if (%_IsSmi(lastMatchInfo[LAST_SUBJECT_INDEX])) { 273 if (%_IsSmi(lastMatchInfo[LAST_SUBJECT_INDEX])) {
262 lastMatchInfo[LAST_SUBJECT_INDEX] = saved_subject; 274 lastMatchInfo[LAST_SUBJECT_INDEX] = saved_subject;
263 } else { 275 } else {
264 lastMatchInfoOverride = null; 276 lastMatchInfoOverride = null;
265 } 277 }
278 if (search.global) search.lastIndex = 0;
266 return answer; 279 return answer;
267 } 280 }
268 } 281 }
269 } 282 }
270 283
271 // Convert the search argument to a string and search for it. 284 // Convert the search argument to a string and search for it.
272 search = TO_STRING_INLINE(search); 285 search = TO_STRING_INLINE(search);
273 if (search.length == 1 && 286 if (search.length == 1 &&
274 subject.length > 0xFF && 287 subject.length > 0xFF &&
275 IS_STRING(replace) && 288 IS_STRING(replace) &&
(...skipping 726 matching lines...) Expand 10 before | Expand all | Expand 10 after
1002 "fixed", StringFixed, 1015 "fixed", StringFixed,
1003 "italics", StringItalics, 1016 "italics", StringItalics,
1004 "small", StringSmall, 1017 "small", StringSmall,
1005 "strike", StringStrike, 1018 "strike", StringStrike,
1006 "sub", StringSub, 1019 "sub", StringSub,
1007 "sup", StringSup 1020 "sup", StringSup
1008 )); 1021 ));
1009 } 1022 }
1010 1023
1011 SetUpString(); 1024 SetUpString();
OLDNEW
« no previous file with comments | « src/runtime.cc ('k') | test/mjsunit/regress/regress-2437.js » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698