Experimental profiler: split RegExp.test() for better optimization.
BUG= TEST= Review URL: https://chromiumcodereview.appspot.com/9701064 git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@11065 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
This commit is contained in:
parent
863d5fdf49
commit
184b7a8915
@ -250,29 +250,32 @@ function RegExpTest(string) {
|
||||
// Remove irrelevant preceeding '.*' in a non-global test regexp.
|
||||
// The expression checks whether this.source starts with '.*' and
|
||||
// that the third char is not a '?'.
|
||||
if (%_StringCharCodeAt(this.source, 0) == 46 && // '.'
|
||||
%_StringCharCodeAt(this.source, 1) == 42 && // '*'
|
||||
%_StringCharCodeAt(this.source, 2) != 63) { // '?'
|
||||
if (!%_ObjectEquals(regexp_key, this)) {
|
||||
regexp_key = this;
|
||||
regexp_val = new $RegExp(SubString(this.source, 2, this.source.length),
|
||||
(!this.ignoreCase
|
||||
? !this.multiline ? "" : "m"
|
||||
: !this.multiline ? "i" : "im"));
|
||||
}
|
||||
if (%_RegExpExec(regexp_val, string, 0, lastMatchInfo) === null) {
|
||||
return false;
|
||||
}
|
||||
var regexp = this;
|
||||
if (%_StringCharCodeAt(regexp.source, 0) == 46 && // '.'
|
||||
%_StringCharCodeAt(regexp.source, 1) == 42 && // '*'
|
||||
%_StringCharCodeAt(regexp.source, 2) != 63) { // '?'
|
||||
regexp = TrimRegExp(regexp);
|
||||
}
|
||||
%_Log('regexp', 'regexp-exec,%0r,%1S,%2i', [this, string, lastIndex]);
|
||||
%_Log('regexp', 'regexp-exec,%0r,%1S,%2i', [regexp, string, lastIndex]);
|
||||
// matchIndices is either null or the lastMatchInfo array.
|
||||
var matchIndices = %_RegExpExec(this, string, 0, lastMatchInfo);
|
||||
var matchIndices = %_RegExpExec(regexp, string, 0, lastMatchInfo);
|
||||
if (matchIndices === null) return false;
|
||||
lastMatchInfoOverride = null;
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
function TrimRegExp(regexp) {
|
||||
if (!%_ObjectEquals(regexp_key, regexp)) {
|
||||
regexp_key = regexp;
|
||||
regexp_val =
|
||||
new $RegExp(SubString(regexp.source, 2, regexp.source.length),
|
||||
(regexp.ignoreCase ? regexp.multiline ? "im" : "i"
|
||||
: regexp.multiline ? "m" : ""));
|
||||
}
|
||||
return regexp_val;
|
||||
}
|
||||
|
||||
|
||||
function RegExpToString() {
|
||||
// If this.source is an empty string, output /(?:)/.
|
||||
|
@ -1,4 +1,4 @@
|
||||
// Copyright 2008 the V8 project authors. All rights reserved.
|
||||
// Copyright 2012 the V8 project authors. All rights reserved.
|
||||
// Redistribution and use in source and binary forms, with or without
|
||||
// modification, are permitted provided that the following conditions are
|
||||
// met:
|
||||
@ -701,3 +701,7 @@ assertThrows("RegExp('(*)')");
|
||||
assertThrows("RegExp('(?:*)')");
|
||||
assertThrows("RegExp('(?=*)')");
|
||||
assertThrows("RegExp('(?!*)')");
|
||||
|
||||
// Test trimmed regular expression for RegExp.test().
|
||||
assertTrue(/.*abc/.test("abc"));
|
||||
assertFalse(/.*\d+/.test("q"));
|
||||
|
Loading…
Reference in New Issue
Block a user