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);
}