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

Unified Diff: src/regexp.js

Issue 2645002: Simplify regexp test call when the regexp starts and ends with '.*'. (Closed) Base URL: http://v8.googlecode.com/svn/branches/bleeding_edge/
Patch Set: '' Created 10 years, 7 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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;
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698