Reviewers: Erik Corry, sandholm,
Description:
Make Script.prototype.nameOrSourceURL use indexOf search first before
trying to
match with a RegExp.
This should use Boyer-Moore search with a long string, which is potentially
faster than RegExp search.
The target string is typically, but not guaranteed, at the end of the
source, so for long sources, there will be a lot of characters to skip.
Please review this at http://codereview.chromium.org/6709027/
SVN Base: https://v8.googlecode.com/svn/branches/bleeding_edge
Affected files:
M src/messages.js
Index: src/messages.js
diff --git a/src/messages.js b/src/messages.js
index
ea0096fe1ae85a2c369e56c602e4d36129a20631..bd1915e8181efe08f6de0e64eed29d0c7de5af03
100644
--- a/src/messages.js
+++ b/src/messages.js
@@ -495,10 +495,23 @@ Script.prototype.nameOrSourceURL = function() {
// because this file is being processed by js2c whose handling of spaces
// in regexps is broken. Also, ['"] are excluded from allowed URLs to
// avoid matches against sources that invoke evals with sourceURL.
- var sourceUrlPattern =
- /\/\/@[\040\t]sourceURL=[\040\t]*([^\s'"]*)[\040\t]*$/m;
- var match = sourceUrlPattern.exec(this.source);
- return match ? match[1] : this.name;
+ // A better solution would be to detect these special comments in
+ // the scanner/parser.
+ var source = ToString(this.source);
+ var sourceUrlPos = %StringIndexOf(source, "sourceURL=", 0);
+ if (sourceUrlPos > 4) {
+ var sourceUrlPattern =
+ /\/\/@[\040\t]sourceURL=[\040\t]*([^\s\'\"]*)[\040\t]*$/gm;
+ // Don't reuse lastMatchInfo here, so we create a new array with room
+ // for four captures.
+ var matchInfo = new InternalArray(CAPTURE(3) + 1);
+ var match =
+ %_RegExpExec(sourceUrlPattern, source, sourceUrlPos - 4,
matchInfo);
+ if (match) {
+ return SubString(source, matchInfo[CAPTURE(2)],
matchInfo[CAPTURE(3)]);
+ }
+ }
+ return this.name;
}
--
v8-dev mailing list
[email protected]
http://groups.google.com/group/v8-dev