Title: [87412] trunk/Source/WebCore
Revision
87412
Author
[email protected]
Date
2011-05-26 12:25:08 -0700 (Thu, 26 May 2011)

Log Message

2011-05-26  Andreas Kling  <[email protected]>

        Reviewed by Geoffrey Garen.

        Overload resolution in generated JSC bindings could be more efficient.
        https://bugs.webkit.org/show_bug.cgi?id=61544

        Only fetch the arguments once, and not until they are needed (less work
        in the case of an early return.)

        * bindings/scripts/CodeGeneratorJS.pm:
        * bindings/scripts/test/JS/JSTestObj.cpp: Rebaselined.
        (WebCore::jsTestObjPrototypeFunctionOverloadedMethod):

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (87411 => 87412)


--- trunk/Source/WebCore/ChangeLog	2011-05-26 19:23:40 UTC (rev 87411)
+++ trunk/Source/WebCore/ChangeLog	2011-05-26 19:25:08 UTC (rev 87412)
@@ -1,3 +1,17 @@
+2011-05-26  Andreas Kling  <[email protected]>
+
+        Reviewed by Geoffrey Garen.
+
+        Overload resolution in generated JSC bindings could be more efficient.
+        https://bugs.webkit.org/show_bug.cgi?id=61544
+
+        Only fetch the arguments once, and not until they are needed (less work
+        in the case of an early return.)
+
+        * bindings/scripts/CodeGeneratorJS.pm:
+        * bindings/scripts/test/JS/JSTestObj.cpp: Rebaselined.
+        (WebCore::jsTestObjPrototypeFunctionOverloadedMethod):
+
 2011-05-26  Adrienne Walker  <[email protected]>
 
         Reviewed by James Robinson.

Modified: trunk/Source/WebCore/bindings/scripts/CodeGeneratorJS.pm (87411 => 87412)


--- trunk/Source/WebCore/bindings/scripts/CodeGeneratorJS.pm	2011-05-26 19:23:40 UTC (rev 87411)
+++ trunk/Source/WebCore/bindings/scripts/CodeGeneratorJS.pm	2011-05-26 19:25:08 UTC (rev 87412)
@@ -1139,11 +1139,12 @@
     my $function = shift;
 
     my @andExpression = ();
-    push(@andExpression, "exec->argumentCount() == $numParameters");
+    push(@andExpression, "argsCount == $numParameters");
     my $parameterIndex = 0;
+    my %usedArguments = ();
     foreach $parameter (@{$function->parameters}) {
         last if $parameterIndex >= $numParameters;
-        my $value = "exec->argument($parameterIndex)";
+        my $value = "arg$parameterIndex";
         my $type = $codeGenerator->StripModule($parameter->type);
 
         # Only DOMString or wrapper types are checked.
@@ -1152,17 +1153,20 @@
         # be converted to a string via .toString).
         if ($codeGenerator->IsStringType($type)) {
             push(@andExpression, "(${value}.isUndefinedOrNull() || ${value}.isString() || ${value}.isObject())");
+            $usedArguments{$parameterIndex} = 1;
         } elsif ($parameter->extendedAttributes->{"Callback"}) {
             # For Callbacks only checks if the value is null or object.
             push(@andExpression, "(${value}.isNull() || ${value}.isObject())");
+            $usedArguments{$parameterIndex} = 1;
         } elsif (!IsNativeType($type)) {
             push(@andExpression, "(${value}.isNull() || (${value}.isObject() && asObject(${value})->inherits(&JS${type}::s_info)))");
+            $usedArguments{$parameterIndex} = 1;
         }
         $parameterIndex++;
     }
     my $res = join(" && ", @andExpression);
     $res = "($res)" if @andExpression > 1;
-    return $res;
+    return ($res, keys %usedArguments);
 }
 
 sub GenerateFunctionParametersCheck
@@ -1171,14 +1175,20 @@
 
     my @orExpression = ();
     my $numParameters = 0;
+    my @neededArguments = ();
+
     foreach $parameter (@{$function->parameters}) {
         if ($parameter->extendedAttributes->{"Optional"}) {
-            push(@orExpression, GenerateParametersCheckExpression($numParameters, $function));
+            my ($_expression_, @usedArguments) = GenerateParametersCheckExpression($numParameters, $function);
+            push(@orExpression, $_expression_);
+            push(@neededArguments, @usedArguments);
         }
         $numParameters++;
     }
-    push(@orExpression, GenerateParametersCheckExpression($numParameters, $function));
-    return join(" || ", @orExpression);
+    my ($_expression_, @usedArguments) = GenerateParametersCheckExpression($numParameters, $function);
+    push(@orExpression, $_expression_);
+    push(@neededArguments, @usedArguments);
+    return (join(" || ", @orExpression), @neededArguments);
 }
 
 sub GenerateOverloadedPrototypeFunction
@@ -1198,9 +1208,20 @@
     push(@implContent, "EncodedJSValue JSC_HOST_CALL ${functionName}(ExecState* exec)\n");
     push(@implContent, <<END);
 {
+    size_t argsCount = exec->argumentCount();
 END
+
+    my %fetchedArguments = ();
+
     foreach my $overload (@{$function->{overloads}}) {
-        my $parametersCheck = GenerateFunctionParametersCheck($overload);
+        my ($parametersCheck, @neededArguments) = GenerateFunctionParametersCheck($overload);
+
+        foreach my $parameterIndex (@neededArguments) {
+            next if exists $fetchedArguments{$parameterIndex};
+            push(@implContent, "    JSValue arg$parameterIndex(exec->argument($parameterIndex));\n");
+            $fetchedArguments{$parameterIndex} = 1;
+        }
+
         push(@implContent, "    if ($parametersCheck)\n");
         push(@implContent, "        return ${functionName}$overload->{overloadIndex}(exec);\n");
     }

Modified: trunk/Source/WebCore/bindings/scripts/test/JS/JSTestObj.cpp (87411 => 87412)


--- trunk/Source/WebCore/bindings/scripts/test/JS/JSTestObj.cpp	2011-05-26 19:23:40 UTC (rev 87411)
+++ trunk/Source/WebCore/bindings/scripts/test/JS/JSTestObj.cpp	2011-05-26 19:25:08 UTC (rev 87412)
@@ -1619,15 +1619,18 @@
 
 EncodedJSValue JSC_HOST_CALL jsTestObjPrototypeFunctionOverloadedMethod(ExecState* exec)
 {
-    if ((exec->argumentCount() == 2 && (exec->argument(0).isNull() || (exec->argument(0).isObject() && asObject(exec->argument(0))->inherits(&JSTestObj::s_info))) && (exec->argument(1).isUndefinedOrNull() || exec->argument(1).isString() || exec->argument(1).isObject())))
+    size_t argsCount = exec->argumentCount();
+    JSValue arg1(exec->argument(1));
+    JSValue arg0(exec->argument(0));
+    if ((argsCount == 2 && (arg0.isNull() || (arg0.isObject() && asObject(arg0)->inherits(&JSTestObj::s_info))) && (arg1.isUndefinedOrNull() || arg1.isString() || arg1.isObject())))
         return jsTestObjPrototypeFunctionOverloadedMethod1(exec);
-    if ((exec->argumentCount() == 1 && (exec->argument(0).isNull() || (exec->argument(0).isObject() && asObject(exec->argument(0))->inherits(&JSTestObj::s_info)))) || (exec->argumentCount() == 2 && (exec->argument(0).isNull() || (exec->argument(0).isObject() && asObject(exec->argument(0))->inherits(&JSTestObj::s_info)))))
+    if ((argsCount == 1 && (arg0.isNull() || (arg0.isObject() && asObject(arg0)->inherits(&JSTestObj::s_info)))) || (argsCount == 2 && (arg0.isNull() || (arg0.isObject() && asObject(arg0)->inherits(&JSTestObj::s_info)))))
         return jsTestObjPrototypeFunctionOverloadedMethod2(exec);
-    if ((exec->argumentCount() == 1 && (exec->argument(0).isUndefinedOrNull() || exec->argument(0).isString() || exec->argument(0).isObject())))
+    if ((argsCount == 1 && (arg0.isUndefinedOrNull() || arg0.isString() || arg0.isObject())))
         return jsTestObjPrototypeFunctionOverloadedMethod3(exec);
-    if (exec->argumentCount() == 1)
+    if (argsCount == 1)
         return jsTestObjPrototypeFunctionOverloadedMethod4(exec);
-    if ((exec->argumentCount() == 1 && (exec->argument(0).isNull() || exec->argument(0).isObject())))
+    if ((argsCount == 1 && (arg0.isNull() || arg0.isObject())))
         return jsTestObjPrototypeFunctionOverloadedMethod5(exec);
     return throwVMTypeError(exec);
 }
_______________________________________________
webkit-changes mailing list
[email protected]
http://lists.webkit.org/mailman/listinfo.cgi/webkit-changes

Reply via email to