2010-11-18 Ilya Tikhonovsky <loislo@chromium.org>
authorloislo@chromium.org <loislo@chromium.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 19 Nov 2010 15:34:10 +0000 (15:34 +0000)
committerloislo@chromium.org <loislo@chromium.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 19 Nov 2010 15:34:10 +0000 (15:34 +0000)
        Reviewed by Yury Semikhatsky.

        Web Inspector: reduce the footprint of InspectorBackendDispatcher.
        InspectorBackendDispatcher is a generated file.
        Its content is not optimal and loc may be reduced by a quarter.
        In each generated function we have a code for getting 'in' values from
        the arguments properties object. I've extracted this code into separate getters.
        The side effect is better readability of the generated code.

        https://bugs.webkit.org/show_bug.cgi?id=49729

        * inspector/CodeGeneratorInspector.pm:

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

WebCore/ChangeLog
WebCore/inspector/CodeGeneratorInspector.pm

index fd2aa1ab36cbfddbfd65b722484cd143e951966e..280c0f0eb0e8994f644e8a381419aa585229cfe6 100644 (file)
@@ -1,3 +1,18 @@
+2010-11-18  Ilya Tikhonovsky  <loislo@chromium.org>
+
+        Reviewed by Yury Semikhatsky.
+
+        Web Inspector: reduce the footprint of InspectorBackendDispatcher.
+        InspectorBackendDispatcher is a generated file.
+        Its content is not optimal and loc may be reduced by a quarter.
+        In each generated function we have a code for getting 'in' values from
+        the arguments properties object. I've extracted this code into separate getters.
+        The side effect is better readability of the generated code.
+
+        https://bugs.webkit.org/show_bug.cgi?id=49729
+
+        * inspector/CodeGeneratorInspector.pm:
+
 2010-11-19  John Knottenbelt  <jknotten@chromium.org>
 
         Reviewed by Jeremy Orlow.
index f5f24539fb39334955638473091bb3bfb02b90ee..c2b0eb476a2b71ce849ee0762a80b000d68ea96e 100644 (file)
@@ -92,6 +92,7 @@ $typeTransform{"Value"} = {
 $typeTransform{"String"} = {
     "param" => "const String&",
     "variable" => "String",
+    "return" => "String",
     "defaultValue" => "\"\"",
     "forwardHeader" => "wtf/Forward.h",
     "header" => "PlatformString.h",
@@ -266,6 +267,12 @@ sub generateFunctions
     push(@backendMethodsImpl, generateBackendDispatcher());
     push(@backendMethodsImpl, generateBackendReportProtocolError());
 
+    foreach my $type (keys %backendTypes) {
+        if ($typeTransform{$type}{"JSONType"}) {
+            push(@backendMethodsImpl, generateArgumentGetters($type));
+        }
+    }
+
     @backendStubJS = generateBackendStubJS($interface);
 }
 
@@ -301,6 +308,14 @@ sub generateFrontendFunction
     }
 }
 
+sub camelCase
+{
+    my $value = shift;
+    $value =~ s/\b(\w)/\U$1/g; # make a camel-case name for type name
+    $value =~ s/ //g;
+    return $value;
+}
+
 sub generateBackendFunction
 {
     my $function = shift;
@@ -332,43 +347,31 @@ sub generateBackendFunction
     push(@function, "        protocolErrors->pushString(\"Protocol Error: $domain handler is not available.\");");
     push(@function, "");
 
-    if (scalar(@inArgs)) {
-        # declare variables for all 'in' args;
-        push(@function, map("    " . $typeTransform{$_->type}->{"variable"} . " " . $_->name . " = " . $typeTransform{$_->type}->{"defaultValue"} . ";", @inArgs));
+    # declare local variables for out arguments.
+    push(@function, map("    " . $typeTransform{$_->type}->{"variable"} . " " . $_->name . " = " . $typeTransform{$_->type}->{"defaultValue"} . ";", @outArgs));
 
-        push(@function, "");
-        push(@function, "    RefPtr<InspectorObject> argumentsContainer;");
-        push(@function, "    if (!(argumentsContainer = requestMessageObject->getObject(\"arguments\"))) {");
-        push(@function, "        protocolErrors->pushString(\"Protocol Error: 'arguments' property with type 'object' was not found.\");");
-        push(@function, "    } else {");
-        push(@function, "        InspectorObject::const_iterator argumentsEndIterator = argumentsContainer->end();");
+    my $indent = "";
+    if (scalar(@inArgs)) {
+        push(@function, "    if (RefPtr<InspectorObject> argumentsContainer = requestMessageObject->getObject(\"arguments\")) {");
 
         foreach my $parameter (@inArgs) {
             my $name = $parameter->name;
             my $type = $parameter->type;
-            my $variableType = $typeTransform{$type}->{"variable"};
-            my $JSONType = $typeTransform{$type}->{"JSONType"};
-
-            push(@function, "");
-            push(@function, "        InspectorObject::const_iterator ${name}ValueIterator = argumentsContainer->find(\"$name\");");
-            push(@function, "        if (${name}ValueIterator == argumentsEndIterator) {");
-            push(@function, "            protocolErrors->pushString(\"Protocol Error: Argument '$name' with type '$JSONType' was not found.\");");
-            push(@function, "        } else {");
-            push(@function, "            if (!${name}ValueIterator->second->as$JSONType(&$name)) {");
-            push(@function, "                protocolErrors->pushString(\"Protocol Error: Argument '$name' has wrong type. It should be '$JSONType'.\");");
-            push(@function, "            }");
-            push(@function, "        }");
+            my $typeString = camelCase($parameter->type);
+            push(@function, "        " . $typeTransform{$type}->{"variable"} . " $name = get$typeString(argumentsContainer.get(), \"$name\", protocolErrors.get());");
         }
-        push(@function, "    }");
+        push(@function, "");
+        $indent = "    ";
     }
 
-    # declare local variables for out arguments.
-    push(@function, map("    " . $typeTransform{$_->type}->{"variable"} . " " . $_->name . " = " . $typeTransform{$_->type}->{"defaultValue"} . ";", @outArgs));
-
     my $args = join(", ", (map($_->name, @inArgs), map("&" . $_->name, @outArgs)));
-    push(@function, "    if (!protocolErrors->length())");
-    push(@function, "        $domainAccessor->$functionName($args);");
-    push(@function, "");
+    push(@function, "$indent    if (!protocolErrors->length())");
+    push(@function, "$indent        $domainAccessor->$functionName($args);");
+    if (scalar(@inArgs)) {
+        push(@function, "    } else {");
+        push(@function, "        protocolErrors->pushString(\"Protocol Error: 'arguments' property with type 'object' was not found.\");");
+        push(@function, "    }");
+    }
 
     push(@function, "    // use InspectorFrontend as a marker of WebInspector availability");
     push(@function, "    if ((callId || protocolErrors->length()) && m_inspectorController->hasFrontend()) {");
@@ -412,6 +415,39 @@ EOF
     return split("\n", $reportProtocolError);
 }
 
+sub generateArgumentGetters
+{
+    my $type = shift;
+    my $json = $typeTransform{$type}{"JSONType"};
+    my $variable = $typeTransform{$type}{"variable"};
+    my $defaultValue = $typeTransform{$type}{"defaultValue"};
+    my $return  = $typeTransform{$type}{"return"} ? $typeTransform{$type}{"return"} : $typeTransform{$type}{"param"};
+
+    my $typeString = camelCase($type);
+    push(@backendConstantDeclarations, "$return get$typeString(InspectorObject* object, const String& name, InspectorArray* protocolErrors);");
+    my $getterBody = << "EOF";
+
+$return InspectorBackendDispatcher::get$typeString(InspectorObject* object, const String& name, InspectorArray* protocolErrors)
+{
+    ASSERT(object);
+    ASSERT(protocolErrors);
+
+    $variable value = $defaultValue;
+    InspectorObject::const_iterator end = object->end();
+    InspectorObject::const_iterator valueIterator = object->find(name);
+
+    if (valueIterator == end)
+        protocolErrors->pushString(String::format("Protocol Error: Argument '\%s' with type '$json' was not found.", name.utf8().data()));
+    else {
+        if (!valueIterator->second->as$json(&value))
+            protocolErrors->pushString(String::format("Protocol Error: Argument '\%s' has wrong type. It should be '$json'.", name.utf8().data()));
+    }
+    return value;
+}
+EOF
+
+    return split("\n", $getterBody);
+}
 
 sub generateBackendDispatcher
 {