Chromium Code Reviews| Index: src/regexp.js |
| =================================================================== |
| --- src/regexp.js (revision 4793) |
| +++ src/regexp.js (working copy) |
| @@ -257,6 +257,10 @@ |
| } |
| +// One-element cache for the simplified test regexp. |
| +var regexp_key; |
| +var regexp_val; |
|
Lasse Reichstein
2010/06/04 11:30:33
How often do you hit this? (And how often will you
sandholm
2010/06/04 11:57:23
Caching negative results in the global regexp cach
|
| + |
| // Section 15.10.6.3 doesn't actually make sense, but the intention seems to be |
| // that test is defined in terms of String.prototype.exec. However, it probably |
| // means the original value of String.prototype.exec, which is what everybody |
| @@ -281,9 +285,7 @@ |
| } |
| var lastIndex = this.lastIndex; |
| - |
| var cache = regExpCache; |
| - |
| if (%_ObjectEquals(cache.type, 'test') && |
| %_ObjectEquals(cache.regExp, this) && |
| %_ObjectEquals(cache.subject, string) && |
| @@ -291,6 +293,26 @@ |
| return cache.answer; |
| } |
| + // Remove irrelevant '.*' around a test regexp. The expression |
| + // checks whether this.source starts and ends with '.*' and that the third |
| + // char is not a '?' and that the third to last char is not a '\'. |
| + if (%_StringCharCodeAt(this.source,0) == 46 && // '.' |
|
Lasse Reichstein
2010/06/04 11:30:33
You may want to try moving this.source to a local
sandholm
2010/06/04 11:57:23
Tried this. Causes regressions on some benchmarks
|
| + %_StringCharCodeAt(this.source,1) == 42 && // '*' |
| + %_StringCharCodeAt(this.source,2) != 63 && // '?' |
| + %_StringCharCodeAt(this.source,this.source.length - 3) != 28 && // '\' |
| + %_StringCharCodeAt(this.source,this.source.length - 2) == 46 && // '.' |
| + %_StringCharCodeAt(this.source,this.source.length - 1) == 42) { // '*' |
| + if (!%_ObjectEquals(regexp_key, this)) { |
| + regexp_key = this; |
| + regexp_val = new $RegExp(this.source.substring(2, |
| + this.source.length - 2), |
| + (this.global ? 'g' : '') |
| + + (this.ignoreCase ? 'i' : '') |
| + + (this.multiline ? 'm' : '')); |
| + } |
| + if (!regexp_val.test(s)) return false; |
|
Lasse Reichstein
2010/06/04 11:30:33
You can cache the negative result in the regexp ca
sandholm
2010/06/04 11:57:23
Often test is called with a new string so that won
|
| + } |
| + |
| var length = s.length; |
| var i = this.global ? TO_INTEGER(lastIndex) : 0; |
| @@ -299,7 +321,7 @@ |
| cache.subject = s; |
| cache.lastIndex = i; |
| - if (i < 0 || i > s.length) { |
| + if (i < 0 || i > length) { |
| this.lastIndex = 0; |
| cache.answer = false; |
| return false; |