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; |