OLD | NEW |
1 // Copyright 2006-2009 the V8 project authors. All rights reserved. | 1 // Copyright 2006-2009 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 219 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
230 } | 230 } |
231 string = regExpInput; | 231 string = regExpInput; |
232 } | 232 } |
233 | 233 |
234 var s; | 234 var s; |
235 if (IS_STRING(string)) { | 235 if (IS_STRING(string)) { |
236 s = string; | 236 s = string; |
237 } else { | 237 } else { |
238 s = ToString(string); | 238 s = ToString(string); |
239 } | 239 } |
240 var length = s.length; | |
241 | 240 |
242 var lastIndex = this.lastIndex; | 241 var lastIndex = this.lastIndex; |
243 | 242 |
244 // Conversion is required by the ES5 specification (RegExp.prototype.exec | 243 // Conversion is required by the ES5 specification (RegExp.prototype.exec |
245 // algorithm, step 5) even if the value is discarded for non-global RegExps. | 244 // algorithm, step 5) even if the value is discarded for non-global RegExps. |
246 var i = TO_INTEGER(lastIndex); | 245 var i = TO_INTEGER(lastIndex); |
247 | 246 |
248 var global = this.global; | 247 var global = this.global; |
249 if (global) { | 248 if (global) { |
250 if (i < 0 || i > length) { | 249 if (i < 0 || i > s.length) { |
251 this.lastIndex = 0; | 250 this.lastIndex = 0; |
252 return false; | 251 return false; |
253 } | 252 } |
254 } else { | 253 } else { |
255 i = 0; | 254 i = 0; |
256 } | 255 } |
257 | 256 |
258 // Remove irrelevant preceeding '.*' in a test regexp. The expression | 257 // Remove irrelevant preceeding '.*' in a test regexp. The expression |
259 // checks whether this.source starts with '.*' and that the third | 258 // checks whether this.source starts with '.*' and that the third |
260 // char is not a '?' | 259 // char is not a '?' |
261 if (%_StringCharCodeAt(this.source, 0) == 46 && // '.' | 260 if (%_StringCharCodeAt(this.source, 0) == 46 && // '.' |
262 %_StringCharCodeAt(this.source, 1) == 42 && // '*' | 261 %_StringCharCodeAt(this.source, 1) == 42 && // '*' |
263 %_StringCharCodeAt(this.source, 2) != 63) { // '?' | 262 %_StringCharCodeAt(this.source, 2) != 63) { // '?' |
264 if (!%_ObjectEquals(regexp_key, this)) { | 263 if (!%_ObjectEquals(regexp_key, this)) { |
265 regexp_key = this; | 264 regexp_key = this; |
266 regexp_val = new $RegExp(this.source.substring(2, this.source.length), | 265 regexp_val = new $RegExp(this.source.substring(2, this.source.length), |
267 (global ? 'g' : '') | 266 (global ? 'g' : '') |
268 + (this.ignoreCase ? 'i' : '') | 267 + (this.ignoreCase ? 'i' : '') |
269 + (this.multiline ? 'm' : '')); | 268 + (this.multiline ? 'm' : '')); |
270 } | 269 } |
271 if (!regexp_val.test(s)) return false; | 270 if (!regexp_val.test(s)) return false; |
272 } | 271 } |
273 | 272 |
274 var length = s.length; | |
275 | |
276 if (i < 0 || i > length) { | |
277 this.lastIndex = 0; | |
278 return false; | |
279 } | |
280 | |
281 %_Log('regexp', 'regexp-exec,%0r,%1S,%2i', [this, s, lastIndex]); | 273 %_Log('regexp', 'regexp-exec,%0r,%1S,%2i', [this, s, lastIndex]); |
282 // matchIndices is either null or the lastMatchInfo array. | 274 // matchIndices is either null or the lastMatchInfo array. |
283 var matchIndices = %_RegExpExec(this, s, i, lastMatchInfo); | 275 var matchIndices = %_RegExpExec(this, s, i, lastMatchInfo); |
284 | 276 |
285 if (matchIndices === null) { | 277 if (matchIndices === null) { |
286 if (global) this.lastIndex = 0; | 278 if (global) this.lastIndex = 0; |
287 return false; | 279 return false; |
288 } | 280 } |
289 lastMatchInfoOverride = null; | 281 lastMatchInfoOverride = null; |
290 if (global) this.lastIndex = lastMatchInfo[CAPTURE1]; | 282 if (global) this.lastIndex = lastMatchInfo[CAPTURE1]; |
(...skipping 195 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
486 %DefineAccessor($RegExp, "$'", SETTER, NoOpSetter, DONT_ENUM | DONT_DELETE); | 478 %DefineAccessor($RegExp, "$'", SETTER, NoOpSetter, DONT_ENUM | DONT_DELETE); |
487 | 479 |
488 for (var i = 1; i < 10; ++i) { | 480 for (var i = 1; i < 10; ++i) { |
489 %DefineAccessor($RegExp, '$' + i, GETTER, RegExpMakeCaptureGetter(i), DONT_D
ELETE); | 481 %DefineAccessor($RegExp, '$' + i, GETTER, RegExpMakeCaptureGetter(i), DONT_D
ELETE); |
490 %DefineAccessor($RegExp, '$' + i, SETTER, NoOpSetter, DONT_DELETE); | 482 %DefineAccessor($RegExp, '$' + i, SETTER, NoOpSetter, DONT_DELETE); |
491 } | 483 } |
492 } | 484 } |
493 | 485 |
494 | 486 |
495 SetupRegExp(); | 487 SetupRegExp(); |
OLD | NEW |