Changeset 87412 in webkit
- Timestamp:
- May 26, 2011 12:25:08 PM (13 years ago)
- Location:
- trunk/Source/WebCore
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebCore/ChangeLog
r87409 r87412 1 2011-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 1 15 2011-05-26 Adrienne Walker <enne@google.com> 2 16 -
trunk/Source/WebCore/bindings/scripts/CodeGeneratorJS.pm
r87390 r87412 1140 1140 1141 1141 my @andExpression = (); 1142 push(@andExpression, " exec->argumentCount()== $numParameters");1142 push(@andExpression, "argsCount == $numParameters"); 1143 1143 my $parameterIndex = 0; 1144 my %usedArguments = (); 1144 1145 foreach $parameter (@{$function->parameters}) { 1145 1146 last if $parameterIndex >= $numParameters; 1146 my $value = " exec->argument($parameterIndex)";1147 my $value = "arg$parameterIndex"; 1147 1148 my $type = $codeGenerator->StripModule($parameter->type); 1148 1149 … … 1153 1154 if ($codeGenerator->IsStringType($type)) { 1154 1155 push(@andExpression, "(${value}.isUndefinedOrNull() || ${value}.isString() || ${value}.isObject())"); 1156 $usedArguments{$parameterIndex} = 1; 1155 1157 } elsif ($parameter->extendedAttributes->{"Callback"}) { 1156 1158 # For Callbacks only checks if the value is null or object. 1157 1159 push(@andExpression, "(${value}.isNull() || ${value}.isObject())"); 1160 $usedArguments{$parameterIndex} = 1; 1158 1161 } elsif (!IsNativeType($type)) { 1159 1162 push(@andExpression, "(${value}.isNull() || (${value}.isObject() && asObject(${value})->inherits(&JS${type}::s_info)))"); 1163 $usedArguments{$parameterIndex} = 1; 1160 1164 } 1161 1165 $parameterIndex++; … … 1163 1167 my $res = join(" && ", @andExpression); 1164 1168 $res = "($res)" if @andExpression > 1; 1165 return $res;1169 return ($res, keys %usedArguments); 1166 1170 } 1167 1171 … … 1172 1176 my @orExpression = (); 1173 1177 my $numParameters = 0; 1178 my @neededArguments = (); 1179 1174 1180 foreach $parameter (@{$function->parameters}) { 1175 1181 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); 1177 1185 } 1178 1186 $numParameters++; 1179 1187 } 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); 1182 1192 } 1183 1193 … … 1199 1209 push(@implContent, <<END); 1200 1210 { 1211 size_t argsCount = exec->argumentCount(); 1201 1212 END 1213 1214 my %fetchedArguments = (); 1215 1202 1216 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 1204 1225 push(@implContent, " if ($parametersCheck)\n"); 1205 1226 push(@implContent, " return ${functionName}$overload->{overloadIndex}(exec);\n"); -
trunk/Source/WebCore/bindings/scripts/test/JS/JSTestObj.cpp
r87390 r87412 1620 1620 EncodedJSValue JSC_HOST_CALL jsTestObjPrototypeFunctionOverloadedMethod(ExecState* exec) 1621 1621 { 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()))) 1623 1626 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))))) 1625 1628 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()))) 1627 1630 return jsTestObjPrototypeFunctionOverloadedMethod3(exec); 1628 if ( exec->argumentCount()== 1)1631 if (argsCount == 1) 1629 1632 return jsTestObjPrototypeFunctionOverloadedMethod4(exec); 1630 if (( exec->argumentCount() == 1 && (exec->argument(0).isNull() || exec->argument(0).isObject())))1633 if ((argsCount == 1 && (arg0.isNull() || arg0.isObject()))) 1631 1634 return jsTestObjPrototypeFunctionOverloadedMethod5(exec); 1632 1635 return throwVMTypeError(exec);
Note: See TracChangeset
for help on using the changeset viewer.