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

Reply via email to