[V8] V8LazyEventListener::prepareListenerObject uses inefficient string operations
authorabarth@webkit.org <abarth@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Mon, 10 Sep 2012 23:23:00 +0000 (23:23 +0000)
committerabarth@webkit.org <abarth@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Mon, 10 Sep 2012 23:23:00 +0000 (23:23 +0000)
https://bugs.webkit.org/show_bug.cgi?id=96324

Patch by Adam Barth <abarth@chromium.org> on 2012-09-10
Reviewed by Kentaro Hara.

Previously, this code called String::append several times, which
mallocs a new string buffer each time. This patch switches this code to
use operator+, which uses StringAppend to optimize these operations
down to a single malloc.

* bindings/v8/V8LazyEventListener.cpp:
(WebCore::V8LazyEventListener::prepareListenerObject):

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@128126 268f45cc-cd09-0410-ab3c-d52691b4dbfc

Source/WebCore/ChangeLog
Source/WebCore/bindings/v8/V8LazyEventListener.cpp

index 626f576..b4f3a13 100644 (file)
@@ -1,5 +1,20 @@
 2012-09-10  Adam Barth  <abarth@chromium.org>
 
+        [V8] V8LazyEventListener::prepareListenerObject uses inefficient string operations
+        https://bugs.webkit.org/show_bug.cgi?id=96324
+
+        Reviewed by Kentaro Hara.
+
+        Previously, this code called String::append several times, which
+        mallocs a new string buffer each time. This patch switches this code to
+        use operator+, which uses StringAppend to optimize these operations
+        down to a single malloc.
+
+        * bindings/v8/V8LazyEventListener.cpp:
+        (WebCore::V8LazyEventListener::prepareListenerObject):
+
+2012-09-10  Adam Barth  <abarth@chromium.org>
+
         [V8] V8AuxiliaryContext used by IDB leaks memory
         https://bugs.webkit.org/show_bug.cgi?id=96317
 
index c1bbdbf..8fbde93 100644 (file)
@@ -145,16 +145,15 @@ void V8LazyEventListener::prepareListenerObject(ScriptExecutionContext* context)
     // Call with 4 arguments instead of 3, pass additional null as the last parameter.
     // By calling the function with 4 arguments, we create a setter on arguments object
     // which would shadow property "3" on the prototype.
-    String code = ASCIILiteral("(function() {" \
-        "with (this[2]) {" \
-        "with (this[1]) {" \
-        "with (this[0]) {");
-    code.append("return function(");
-    code.append(m_eventParameterName);
-    code.append(") {");
-    code.append(m_code);
-    // Insert '\n' otherwise //-style comments could break the handler.
-    code.append("\n};}}}})");
+    String code = "(function() {"
+        "with (this[2]) {"
+        "with (this[1]) {"
+        "with (this[0]) {"
+            "return function(" + m_eventParameterName + ") {" +
+                m_code + "\n" // Insert '\n' otherwise //-style comments could break the handler.
+            "};"
+        "}}}})";
+
     v8::Handle<v8::String> codeExternalString = v8ExternalString(code);
 
     v8::Handle<v8::Script> script = ScriptSourceCode::compileScript(codeExternalString, m_sourceURL, m_position);
@@ -219,14 +218,8 @@ void V8LazyEventListener::prepareListenerObject(ScriptExecutionContext* context)
     if (!toStringTemplate.IsEmpty())
         toStringFunction = toStringTemplate->GetFunction();
     if (!toStringFunction.IsEmpty()) {
-        String toStringResult = ASCIILiteral("function ");
-        toStringResult.append(m_functionName);
-        toStringResult.append("(");
-        toStringResult.append(m_eventParameterName);
-        toStringResult.append(") {\n  ");
-        toStringResult.append(m_code);
-        toStringResult.append("\n}");
-        wrappedFunction->SetHiddenValue(V8HiddenPropertyName::toStringString(), v8ExternalString(toStringResult));
+        String toStringString = "function " + m_functionName + "(" + m_eventParameterName + ") {\n  " + m_code + "\n}";
+        wrappedFunction->SetHiddenValue(V8HiddenPropertyName::toStringString(), v8ExternalString(toStringString));
         wrappedFunction->Set(v8::String::NewSymbol("toString"), toStringFunction);
     }