OLD | NEW |
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 232 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
243 return false; | 243 return false; |
244 } | 244 } |
245 lastMatchInfoOverride = null; | 245 lastMatchInfoOverride = null; |
246 this.lastIndex = lastMatchInfo[CAPTURE1]; | 246 this.lastIndex = lastMatchInfo[CAPTURE1]; |
247 return true; | 247 return true; |
248 } else { | 248 } else { |
249 // Non-global regexp. | 249 // Non-global regexp. |
250 // Remove irrelevant preceeding '.*' in a non-global test regexp. | 250 // Remove irrelevant preceeding '.*' in a non-global test regexp. |
251 // The expression checks whether this.source starts with '.*' and | 251 // The expression checks whether this.source starts with '.*' and |
252 // that the third char is not a '?'. | 252 // that the third char is not a '?'. |
253 if (%_StringCharCodeAt(this.source, 0) == 46 && // '.' | 253 var regexp = this; |
254 %_StringCharCodeAt(this.source, 1) == 42 && // '*' | 254 if (%_StringCharCodeAt(regexp.source, 0) == 46 && // '.' |
255 %_StringCharCodeAt(this.source, 2) != 63) { // '?' | 255 %_StringCharCodeAt(regexp.source, 1) == 42 && // '*' |
256 if (!%_ObjectEquals(regexp_key, this)) { | 256 %_StringCharCodeAt(regexp.source, 2) != 63) { // '?' |
257 regexp_key = this; | 257 regexp = TrimRegExp(regexp); |
258 regexp_val = new $RegExp(SubString(this.source, 2, this.source.length), | |
259 (!this.ignoreCase | |
260 ? !this.multiline ? "" : "m" | |
261 : !this.multiline ? "i" : "im")); | |
262 } | |
263 if (%_RegExpExec(regexp_val, string, 0, lastMatchInfo) === null) { | |
264 return false; | |
265 } | |
266 } | 258 } |
267 %_Log('regexp', 'regexp-exec,%0r,%1S,%2i', [this, string, lastIndex]); | 259 %_Log('regexp', 'regexp-exec,%0r,%1S,%2i', [regexp, string, lastIndex]); |
268 // matchIndices is either null or the lastMatchInfo array. | 260 // matchIndices is either null or the lastMatchInfo array. |
269 var matchIndices = %_RegExpExec(this, string, 0, lastMatchInfo); | 261 var matchIndices = %_RegExpExec(regexp, string, 0, lastMatchInfo); |
270 if (matchIndices === null) return false; | 262 if (matchIndices === null) return false; |
271 lastMatchInfoOverride = null; | 263 lastMatchInfoOverride = null; |
272 return true; | 264 return true; |
273 } | 265 } |
274 } | 266 } |
275 | 267 |
| 268 function TrimRegExp(regexp) { |
| 269 if (!%_ObjectEquals(regexp_key, regexp)) { |
| 270 regexp_key = regexp; |
| 271 regexp_val = |
| 272 new $RegExp(SubString(regexp.source, 2, regexp.source.length), |
| 273 (regexp.ignoreCase ? regexp.multiline ? "im" : "i" |
| 274 : regexp.multiline ? "m" : "")); |
| 275 } |
| 276 return regexp_val; |
| 277 } |
| 278 |
276 | 279 |
277 function RegExpToString() { | 280 function RegExpToString() { |
278 // If this.source is an empty string, output /(?:)/. | 281 // If this.source is an empty string, output /(?:)/. |
279 // http://bugzilla.mozilla.org/show_bug.cgi?id=225550 | 282 // http://bugzilla.mozilla.org/show_bug.cgi?id=225550 |
280 // ecma_2/RegExp/properties-001.js. | 283 // ecma_2/RegExp/properties-001.js. |
281 var src = this.source ? this.source : '(?:)'; | 284 var src = this.source ? this.source : '(?:)'; |
282 var result = '/' + src + '/'; | 285 var result = '/' + src + '/'; |
283 if (this.global) result += 'g'; | 286 if (this.global) result += 'g'; |
284 if (this.ignoreCase) result += 'i'; | 287 if (this.ignoreCase) result += 'i'; |
285 if (this.multiline) result += 'm'; | 288 if (this.multiline) result += 'm'; |
(...skipping 185 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
471 NoOpSetter, DONT_ENUM | DONT_DELETE); | 474 NoOpSetter, DONT_ENUM | DONT_DELETE); |
472 | 475 |
473 for (var i = 1; i < 10; ++i) { | 476 for (var i = 1; i < 10; ++i) { |
474 %DefineOrRedefineAccessorProperty($RegExp, '$' + i, | 477 %DefineOrRedefineAccessorProperty($RegExp, '$' + i, |
475 RegExpMakeCaptureGetter(i), NoOpSetter, | 478 RegExpMakeCaptureGetter(i), NoOpSetter, |
476 DONT_DELETE); | 479 DONT_DELETE); |
477 } | 480 } |
478 } | 481 } |
479 | 482 |
480 SetUpRegExp(); | 483 SetUpRegExp(); |
OLD | NEW |