Changeset 87412 in webkit


Ignore:
Timestamp:
May 26, 2011 12:25:08 PM (13 years ago)
Author:
andreas.kling@nokia.com
Message:

2011-05-26 Andreas Kling <kling@webkit.org>

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):
Location:
trunk/Source/WebCore
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/ChangeLog

    r87409 r87412  
     12011-05-26  Andreas Kling  <kling@webkit.org>
     2
     3        Reviewed by Geoffrey Garen.
     4
     5        Overload resolution in generated JSC bindings could be more efficient.
     6        https://bugs.webkit.org/show_bug.cgi?id=61544
     7
     8        Only fetch the arguments once, and not until they are needed (less work
     9        in the case of an early return.)
     10
     11        * bindings/scripts/CodeGeneratorJS.pm:
     12        * bindings/scripts/test/JS/JSTestObj.cpp: Rebaselined.
     13        (WebCore::jsTestObjPrototypeFunctionOverloadedMethod):
     14
    1152011-05-26  Adrienne Walker  <enne@google.com>
    216
  • trunk/Source/WebCore/bindings/scripts/CodeGeneratorJS.pm

    r87390 r87412  
    11401140
    11411141    my @andExpression = ();
    1142     push(@andExpression, "exec->argumentCount() == $numParameters");
     1142    push(@andExpression, "argsCount == $numParameters");
    11431143    my $parameterIndex = 0;
     1144    my %usedArguments = ();
    11441145    foreach $parameter (@{$function->parameters}) {
    11451146        last if $parameterIndex >= $numParameters;
    1146         my $value = "exec->argument($parameterIndex)";
     1147        my $value = "arg$parameterIndex";
    11471148        my $type = $codeGenerator->StripModule($parameter->type);
    11481149
     
    11531154        if ($codeGenerator->IsStringType($type)) {
    11541155            push(@andExpression, "(${value}.isUndefinedOrNull() || ${value}.isString() || ${value}.isObject())");
     1156            $usedArguments{$parameterIndex} = 1;
    11551157        } elsif ($parameter->extendedAttributes->{"Callback"}) {
    11561158            # For Callbacks only checks if the value is null or object.
    11571159            push(@andExpression, "(${value}.isNull() || ${value}.isObject())");
     1160            $usedArguments{$parameterIndex} = 1;
    11581161        } elsif (!IsNativeType($type)) {
    11591162            push(@andExpression, "(${value}.isNull() || (${value}.isObject() && asObject(${value})->inherits(&JS${type}::s_info)))");
     1163            $usedArguments{$parameterIndex} = 1;
    11601164        }
    11611165        $parameterIndex++;
     
    11631167    my $res = join(" && ", @andExpression);
    11641168    $res = "($res)" if @andExpression > 1;
    1165     return $res;
     1169    return ($res, keys %usedArguments);
    11661170}
    11671171
     
    11721176    my @orExpression = ();
    11731177    my $numParameters = 0;
     1178    my @neededArguments = ();
     1179
    11741180    foreach $parameter (@{$function->parameters}) {
    11751181        if ($parameter->extendedAttributes->{"Optional"}) {
    1176             push(@orExpression, GenerateParametersCheckExpression($numParameters, $function));
     1182            my ($expression, @usedArguments) = GenerateParametersCheckExpression($numParameters, $function);
     1183            push(@orExpression, $expression);
     1184            push(@neededArguments, @usedArguments);
    11771185        }
    11781186        $numParameters++;
    11791187    }
    1180     push(@orExpression, GenerateParametersCheckExpression($numParameters, $function));
    1181     return join(" || ", @orExpression);
     1188    my ($expression, @usedArguments) = GenerateParametersCheckExpression($numParameters, $function);
     1189    push(@orExpression, $expression);
     1190    push(@neededArguments, @usedArguments);
     1191    return (join(" || ", @orExpression), @neededArguments);
    11821192}
    11831193
     
    11991209    push(@implContent, <<END);
    12001210{
     1211    size_t argsCount = exec->argumentCount();
    12011212END
     1213
     1214    my %fetchedArguments = ();
     1215
    12021216    foreach my $overload (@{$function->{overloads}}) {
    1203         my $parametersCheck = GenerateFunctionParametersCheck($overload);
     1217        my ($parametersCheck, @neededArguments) = GenerateFunctionParametersCheck($overload);
     1218
     1219        foreach my $parameterIndex (@neededArguments) {
     1220            next if exists $fetchedArguments{$parameterIndex};
     1221            push(@implContent, "    JSValue arg$parameterIndex(exec->argument($parameterIndex));\n");
     1222            $fetchedArguments{$parameterIndex} = 1;
     1223        }
     1224
    12041225        push(@implContent, "    if ($parametersCheck)\n");
    12051226        push(@implContent, "        return ${functionName}$overload->{overloadIndex}(exec);\n");
  • trunk/Source/WebCore/bindings/scripts/test/JS/JSTestObj.cpp

    r87390 r87412  
    16201620EncodedJSValue JSC_HOST_CALL jsTestObjPrototypeFunctionOverloadedMethod(ExecState* exec)
    16211621{
    1622     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())))
     1622    size_t argsCount = exec->argumentCount();
     1623    JSValue arg1(exec->argument(1));
     1624    JSValue arg0(exec->argument(0));
     1625    if ((argsCount == 2 && (arg0.isNull() || (arg0.isObject() && asObject(arg0)->inherits(&JSTestObj::s_info))) && (arg1.isUndefinedOrNull() || arg1.isString() || arg1.isObject())))
    16231626        return jsTestObjPrototypeFunctionOverloadedMethod1(exec);
    1624     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)))))
     1627    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)))))
    16251628        return jsTestObjPrototypeFunctionOverloadedMethod2(exec);
    1626     if ((exec->argumentCount() == 1 && (exec->argument(0).isUndefinedOrNull() || exec->argument(0).isString() || exec->argument(0).isObject())))
     1629    if ((argsCount == 1 && (arg0.isUndefinedOrNull() || arg0.isString() || arg0.isObject())))
    16271630        return jsTestObjPrototypeFunctionOverloadedMethod3(exec);
    1628     if (exec->argumentCount() == 1)
     1631    if (argsCount == 1)
    16291632        return jsTestObjPrototypeFunctionOverloadedMethod4(exec);
    1630     if ((exec->argumentCount() == 1 && (exec->argument(0).isNull() || exec->argument(0).isObject())))
     1633    if ((argsCount == 1 && (arg0.isNull() || arg0.isObject())))
    16311634        return jsTestObjPrototypeFunctionOverloadedMethod5(exec);
    16321635    return throwVMTypeError(exec);
Note: See TracChangeset for help on using the changeset viewer.