[WebIDL] Extend new overload resolution algorithm support to constructors
authorcdumez@apple.com <cdumez@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 2 Aug 2016 21:44:27 +0000 (21:44 +0000)
committercdumez@apple.com <cdumez@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 2 Aug 2016 21:44:27 +0000 (21:44 +0000)
https://bugs.webkit.org/show_bug.cgi?id=160455

Reviewed by Ryosuke Niwa.

Source/WebCore:

Extend new overload resolution algorithm support (added in r204028) to
constructors as well. It was only used for operations. Remove code that
is now dead from the bindings generator.

We now share the same code of generating the overload resolution code
for operations and constructors.

No new tests, rebaselined existing tests.

* bindings/scripts/CodeGenerator.pm:
(LinkOverloadedFunctions):
* bindings/scripts/CodeGeneratorJS.pm:
(GenerateOverloadedFunctionOrConstructor):
(GenerateImplementation):
(GenerateConstructorDefinitions):
(GenerateConstructorDefinition):
(GetFunctionLength): Deleted.
(LengthOfLongestFunctionParameterList): Deleted.
(GetNativeTypeForConversions): Deleted.
(GetGnuVTableNameForInterface): Deleted.
(GetGnuMangledNameForInterface): Deleted.
(GetGnuVTableOffsetForType): Deleted.
(GenerateConstructorHelperMethods): Deleted.
* bindings/scripts/IDLParser.pm:
(applyExtendedAttributeList): Deleted.
* bindings/scripts/test/JS/JSTestOverloadedConstructors.cpp:
(WebCore::JSTestOverloadedConstructorsConstructor::construct):
* bindings/scripts/test/TestOverloadedConstructors.idl:

LayoutTests:

Update / rebaseline existing test as we now provide slightly different
exception messages when given bad overloaded constructor parameters.

* fast/canvas/canvas-imageData-expected.txt:
* fast/canvas/script-tests/canvas-imageData.js:

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

LayoutTests/ChangeLog
LayoutTests/fast/canvas/canvas-imageData-expected.txt
LayoutTests/fast/canvas/script-tests/canvas-imageData.js
Source/WebCore/ChangeLog
Source/WebCore/bindings/scripts/CodeGenerator.pm
Source/WebCore/bindings/scripts/CodeGeneratorJS.pm
Source/WebCore/bindings/scripts/IDLParser.pm
Source/WebCore/bindings/scripts/test/JS/JSTestOverloadedConstructors.cpp
Source/WebCore/bindings/scripts/test/TestOverloadedConstructors.idl

index 7339923..eeb3e47 100644 (file)
@@ -1,3 +1,16 @@
+2016-08-02  Chris Dumez  <cdumez@apple.com>
+
+        [WebIDL] Extend new overload resolution algorithm support to constructors
+        https://bugs.webkit.org/show_bug.cgi?id=160455
+
+        Reviewed by Ryosuke Niwa.
+
+        Update / rebaseline existing test as we now provide slightly different
+        exception messages when given bad overloaded constructor parameters.
+
+        * fast/canvas/canvas-imageData-expected.txt:
+        * fast/canvas/script-tests/canvas-imageData.js:
+
 2016-08-02  Ryan Haddad  <ryanhaddad@apple.com>
 
         Marking two media tests as flaky crashes on ios-simulator-wk2
index 8db4f00..0bd0d83 100644 (file)
@@ -14,20 +14,20 @@ PASS new ImageData(-20, 20) threw exception TypeError: Type error.
 PASS new ImageData(20, -20) threw exception TypeError: Type error.
 PASS new ImageData(null, 20) threw exception IndexSizeError (DOM Exception 1): The index is not in the allowed range..
 PASS new ImageData(32768, 32768) threw exception TypeError: Type error.
-PASS new ImageData(null, 20, 20) threw exception TypeError: Type error.
-PASS new ImageData(imageData, 20, 20) threw exception TypeError: Type error.
+PASS new ImageData(null, 20, 20) threw exception TypeError: Argument 1 ('data') to the ImageData constructor must be an instance of Uint8ClampedArray.
+PASS new ImageData(imageData, 20, 20) threw exception TypeError: Argument 1 ('data') to the ImageData constructor must be an instance of Uint8ClampedArray.
 PASS new ImageData(imageData, 0) threw exception IndexSizeError (DOM Exception 1): The index is not in the allowed range..
-PASS new ImageData(imageData, 20, 0) threw exception TypeError: Type error.
-PASS new ImageData(imageData, 0, 20) threw exception TypeError: Type error.
-PASS new ImageData(imageData, 10, 5) threw exception TypeError: Type error.
+PASS new ImageData(imageData, 20, 0) threw exception TypeError: Argument 1 ('data') to the ImageData constructor must be an instance of Uint8ClampedArray.
+PASS new ImageData(imageData, 0, 20) threw exception TypeError: Argument 1 ('data') to the ImageData constructor must be an instance of Uint8ClampedArray.
+PASS new ImageData(imageData, 10, 5) threw exception TypeError: Argument 1 ('data') to the ImageData constructor must be an instance of Uint8ClampedArray.
 PASS new ImageData(imageData.data, 10, 5) threw exception IndexSizeError (DOM Exception 1): The index is not in the allowed range..
 PASS new ImageData(imageData.data, -10, 5) threw exception InvalidStateError (DOM Exception 11): The object is in an invalid state..
 PASS new ImageData(imageData.data, 10, -10) threw exception IndexSizeError (DOM Exception 1): The index is not in the allowed range..
 PASS new ImageData(new Uint8ClampedArray([1,2,3,4,5,6,7,8]),536870913,2); threw exception InvalidStateError (DOM Exception 11): The object is in an invalid state..
-PASS new ImageData({},2,2); threw exception TypeError: Type error.
-PASS new ImageData(undefined,2,2); threw exception TypeError: Type error.
-PASS new ImageData("none",2,2); threw exception TypeError: Type error.
-PASS new ImageData(0,2,2); threw exception TypeError: Type error.
+PASS new ImageData({},2,2); threw exception TypeError: Argument 1 ('data') to the ImageData constructor must be an instance of Uint8ClampedArray.
+PASS new ImageData(undefined,2,2); threw exception TypeError: Argument 1 ('data') to the ImageData constructor must be an instance of Uint8ClampedArray.
+PASS new ImageData("none",2,2); threw exception TypeError: Argument 1 ('data') to the ImageData constructor must be an instance of Uint8ClampedArray.
+PASS new ImageData(0,2,2); threw exception TypeError: Argument 1 ('data') to the ImageData constructor must be an instance of Uint8ClampedArray.
 PASS new ImageData(imageData.data, 32768, 32768) threw exception InvalidStateError (DOM Exception 11): The object is in an invalid state..
 PASS new ImageData(imageData.data, Infinity, Infinity) threw exception IndexSizeError (DOM Exception 1): The index is not in the allowed range..
 PASS new ImageData(imageData.data, NaN, NaN) threw exception IndexSizeError (DOM Exception 1): The index is not in the allowed range..
index 847514c..ef0b8d9 100644 (file)
@@ -6,33 +6,33 @@ ctx.fillRect(0,0,10,10);
 var imageData = ctx.getImageData(0,0,10,10);
 
 debug('Test invalid ImageData constructor arguments.')
-shouldThrow('new ImageData()', '"TypeError: Not enough arguments"');
-shouldThrow('new ImageData(1)', '"TypeError: Not enough arguments"');
-shouldThrow('new ImageData(new Uint8ClampedArray([1,2,3,4]));', '"TypeError: Not enough arguments"');
-shouldThrow('new ImageData(0, 0)', '"IndexSizeError (DOM Exception 1): The index is not in the allowed range."');
-shouldThrow('new ImageData(20, 0)', '"IndexSizeError (DOM Exception 1): The index is not in the allowed range."');
-shouldThrow('new ImageData(0, 20)', '"IndexSizeError (DOM Exception 1): The index is not in the allowed range."');
-shouldThrow('new ImageData(-20, 20)', '"TypeError: Type error"');
-shouldThrow('new ImageData(20, -20)', '"TypeError: Type error"');
-shouldThrow('new ImageData(null, 20)', '"IndexSizeError (DOM Exception 1): The index is not in the allowed range."');
-shouldThrow('new ImageData(32768, 32768)', '"TypeError: Type error"');
-shouldThrow('new ImageData(null, 20, 20)', '"TypeError: Type error"');
-shouldThrow('new ImageData(imageData, 20, 20)', '"TypeError: Type error"');
-shouldThrow('new ImageData(imageData, 0)', '"IndexSizeError (DOM Exception 1): The index is not in the allowed range."');
-shouldThrow('new ImageData(imageData, 20, 0)', '"TypeError: Type error"');
-shouldThrow('new ImageData(imageData, 0, 20)', '"TypeError: Type error"');
-shouldThrow('new ImageData(imageData, 10, 5)', '"TypeError: Type error"');
-shouldThrow('new ImageData(imageData.data, 10, 5)', '"IndexSizeError (DOM Exception 1): The index is not in the allowed range."');
-shouldThrow('new ImageData(imageData.data, -10, 5)', '"InvalidStateError (DOM Exception 11): The object is in an invalid state."');
-shouldThrow('new ImageData(imageData.data, 10, -10)', '"IndexSizeError (DOM Exception 1): The index is not in the allowed range."');
-shouldThrow('new ImageData(new Uint8ClampedArray([1,2,3,4,5,6,7,8]),536870913,2);', '"InvalidStateError (DOM Exception 11): The object is in an invalid state."');
-shouldThrow('new ImageData({},2,2);', '"TypeError: Type error"');
-shouldThrow('new ImageData(undefined,2,2);', '"TypeError: Type error"');
-shouldThrow('new ImageData("none",2,2);', '"TypeError: Type error"');
-shouldThrow('new ImageData(0,2,2);', '"TypeError: Type error"');
-shouldThrow('new ImageData(imageData.data, 32768, 32768)', '"InvalidStateError (DOM Exception 11): The object is in an invalid state."');
-shouldThrow('new ImageData(imageData.data, Infinity, Infinity)', '"IndexSizeError (DOM Exception 1): The index is not in the allowed range."');
-shouldThrow('new ImageData(imageData.data, NaN, NaN)', '"IndexSizeError (DOM Exception 1): The index is not in the allowed range."');
+shouldThrowErrorName('new ImageData()', 'TypeError');
+shouldThrowErrorName('new ImageData(1)', 'TypeError');
+shouldThrowErrorName('new ImageData(new Uint8ClampedArray([1,2,3,4]));', 'TypeError');
+shouldThrowErrorName('new ImageData(0, 0)', 'IndexSizeError');
+shouldThrowErrorName('new ImageData(20, 0)', 'IndexSizeError');
+shouldThrowErrorName('new ImageData(0, 20)', 'IndexSizeError');
+shouldThrowErrorName('new ImageData(-20, 20)', 'TypeError');
+shouldThrowErrorName('new ImageData(20, -20)', 'TypeError');
+shouldThrowErrorName('new ImageData(null, 20)', 'IndexSizeError');
+shouldThrowErrorName('new ImageData(32768, 32768)', 'TypeError');
+shouldThrowErrorName('new ImageData(null, 20, 20)', 'TypeError');
+shouldThrowErrorName('new ImageData(imageData, 20, 20)', 'TypeError');
+shouldThrowErrorName('new ImageData(imageData, 0)', 'IndexSizeError');
+shouldThrowErrorName('new ImageData(imageData, 20, 0)', 'TypeError');
+shouldThrowErrorName('new ImageData(imageData, 0, 20)', 'TypeError');
+shouldThrowErrorName('new ImageData(imageData, 10, 5)', 'TypeError');
+shouldThrowErrorName('new ImageData(imageData.data, 10, 5)', 'IndexSizeError');
+shouldThrowErrorName('new ImageData(imageData.data, -10, 5)', 'InvalidStateError');
+shouldThrowErrorName('new ImageData(imageData.data, 10, -10)', 'IndexSizeError');
+shouldThrowErrorName('new ImageData(new Uint8ClampedArray([1,2,3,4,5,6,7,8]),536870913,2);', 'InvalidStateError');
+shouldThrowErrorName('new ImageData({},2,2);', 'TypeError');
+shouldThrowErrorName('new ImageData(undefined,2,2);', 'TypeError');
+shouldThrowErrorName('new ImageData("none",2,2);', 'TypeError');
+shouldThrowErrorName('new ImageData(0,2,2);', 'TypeError');
+shouldThrowErrorName('new ImageData(imageData.data, 32768, 32768)', 'InvalidStateError');
+shouldThrowErrorName('new ImageData(imageData.data, Infinity, Infinity)', 'IndexSizeError');
+shouldThrowErrorName('new ImageData(imageData.data, NaN, NaN)', 'IndexSizeError');
 debug('');
 
 debug('Test valid ImageData constructors.')
@@ -61,4 +61,4 @@ function testTransparentBlack(data) {
 }
 
 var imageData2 = new ImageData(100,100);
-shouldBeTrue('testTransparentBlack(imageData2.data)');
\ No newline at end of file
+shouldBeTrue('testTransparentBlack(imageData2.data)');
index f09e03a..003977a 100644 (file)
@@ -1,3 +1,39 @@
+2016-08-02  Chris Dumez  <cdumez@apple.com>
+
+        [WebIDL] Extend new overload resolution algorithm support to constructors
+        https://bugs.webkit.org/show_bug.cgi?id=160455
+
+        Reviewed by Ryosuke Niwa.
+
+        Extend new overload resolution algorithm support (added in r204028) to
+        constructors as well. It was only used for operations. Remove code that
+        is now dead from the bindings generator.
+
+        We now share the same code of generating the overload resolution code
+        for operations and constructors.
+
+        No new tests, rebaselined existing tests.
+
+        * bindings/scripts/CodeGenerator.pm:
+        (LinkOverloadedFunctions):
+        * bindings/scripts/CodeGeneratorJS.pm:
+        (GenerateOverloadedFunctionOrConstructor):
+        (GenerateImplementation):
+        (GenerateConstructorDefinitions):
+        (GenerateConstructorDefinition):
+        (GetFunctionLength): Deleted.
+        (LengthOfLongestFunctionParameterList): Deleted.
+        (GetNativeTypeForConversions): Deleted.
+        (GetGnuVTableNameForInterface): Deleted.
+        (GetGnuMangledNameForInterface): Deleted.
+        (GetGnuVTableOffsetForType): Deleted.
+        (GenerateConstructorHelperMethods): Deleted.
+        * bindings/scripts/IDLParser.pm:
+        (applyExtendedAttributeList): Deleted.
+        * bindings/scripts/test/JS/JSTestOverloadedConstructors.cpp:
+        (WebCore::JSTestOverloadedConstructorsConstructor::construct):
+        * bindings/scripts/test/TestOverloadedConstructors.idl:
+
 2016-08-02  Brady Eidson  <beidson@apple.com>
 
         Removing IndexedDB WebsiteData can fail for some users.
index f0cb089..2f5aa0c 100644 (file)
@@ -614,6 +614,13 @@ sub LinkOverloadedFunctions
         $function->{overloads} = $nameToFunctionsMap{$name};
         $function->{overloadIndex} = @{$nameToFunctionsMap{$name}};
     }
+
+    my $index = 1;
+    foreach my $constructor (@{$interface->constructors}) {
+        $constructor->{overloads} = $interface->constructors;
+        $constructor->{overloadIndex} = $index;
+        $index++;
+    }
 }
 
 sub AttributeNameForGetterAndSetter
index 3047e1c..3394b97 100644 (file)
@@ -1782,14 +1782,20 @@ sub GetOverloadThatMatches
 
 # Implements the overload resolution algorithm, as defined in the Web IDL specification:
 # http://heycam.github.io/webidl/#es-overloads
-sub GenerateOverloadedFunction
+sub GenerateOverloadedFunctionOrConstructor
 {
-    my ($function, $interface) = @_;
+    my ($function, $interface, $isConstructor) = @_;
     my %allSets = ComputeEffectiveOverloadSet($function->{overloads});
 
-    my $kind = $function->isStatic ? "Constructor" : (OperationShouldBeOnInstance($interface, $function) ? "Instance" : "Prototype");
     my $interfaceName = $interface->name;
-    my $functionName = "js${interfaceName}${kind}Function" . $codeGenerator->WK_ucfirst($function->signature->name);
+    my $className = "JS$interfaceName";
+    my $functionName;
+    if ($isConstructor) {
+        $functionName = "construct${className}";
+    } else {
+        my $kind = $function->isStatic ? "Constructor" : (OperationShouldBeOnInstance($interface, $function) ? "Instance" : "Prototype");
+        $functionName = "js${interfaceName}${kind}Function" . $codeGenerator->WK_ucfirst($function->signature->name);
+    }
 
     my $generateOverloadCallIfNecessary = sub {
         my ($overload, $condition) = @_;
@@ -1859,8 +1865,12 @@ sub GenerateOverloadedFunction
 
     my $maxArgCount = LengthOfLongestFunctionParameterList($function->{overloads});
 
+    if ($isConstructor) {
+        push(@implContent, "template<> EncodedJSValue JSC_HOST_CALL ${className}Constructor::construct(ExecState* state)\n");
+    } else {
+        push(@implContent, "EncodedJSValue JSC_HOST_CALL ${functionName}(ExecState* state)\n");
+    }
     push(@implContent, <<END);    
-EncodedJSValue JSC_HOST_CALL ${functionName}(ExecState* state)
 {
     size_t argsCount = std::min<size_t>($maxArgCount, state->argumentCount());
 END
@@ -1942,56 +1952,6 @@ END
     push(@implContent, "}\n\n");
 }
 
-sub GenerateParametersCheckExpression
-{
-    my $numParameters = shift;
-    my $function = shift;
-
-    my @andExpression = ();
-    push(@andExpression, "argsCount == $numParameters");
-    my $parameterIndex = 0;
-    my %usedArguments = ();
-    foreach my $parameter (@{$function->parameters}) {
-        last if $parameterIndex >= $numParameters;
-        my $value = "arg$parameterIndex";
-        my $type = $parameter->type;
-
-        if ($codeGenerator->IsCallbackInterface($parameter->type)) {
-            # For Callbacks only checks if the value is null or object.
-            if ($codeGenerator->IsFunctionOnlyCallbackInterface($parameter->type)) {
-                push(@andExpression, "(${value}.isNull() || ${value}.isFunction())");
-            } else {
-                push(@andExpression, "(${value}.isNull() || ${value}.isObject())");
-            }
-            $usedArguments{$parameterIndex} = 1;
-        } elsif ($codeGenerator->IsDictionaryType($parameter->type)) {
-            push(@andExpression, "(${value}.isUndefinedOrNull() || ${value}.isObject())");
-            $usedArguments{$parameterIndex} = 1;
-        } elsif (($codeGenerator->GetArrayOrSequenceType($type) || $codeGenerator->IsTypedArrayType($type) || $codeGenerator->IsWrapperType($type)) && $type ne "EventListener") {
-            my $condition = "";
-
-            if ($parameter->isNullable) {
-                $condition .= "${value}.isUndefinedOrNull() || ";
-            } elsif ($parameter->isOptional) {
-                $condition .= "${value}.isUndefined() || ";
-            }
-
-            if ($codeGenerator->GetArrayOrSequenceType($type)) {
-                # FIXME: Add proper support for T[], T[]?, sequence<T>.
-                $condition .= "(${value}.isObject() && isJSArray(${value}))";
-            } else {
-                $condition .= "(${value}.isObject() && asObject(${value})->inherits(JS${type}::info()))";
-            }
-            push(@andExpression, "(" . $condition . ")");
-            $usedArguments{$parameterIndex} = 1;
-        }
-        $parameterIndex++;
-    }
-    my $res = join(" && ", @andExpression);
-    $res = "($res)" if @andExpression > 1;
-    return ($res, sort {$a <=> $b} (keys %usedArguments));
-}
-
 # As per Web IDL specification, the length of a function Object is its number of mandatory parameters.
 sub GetFunctionLength
 {
@@ -2016,37 +1976,6 @@ sub GetFunctionLength
     return $length;
 }
 
-sub GenerateFunctionParametersCheck
-{
-    my $function = shift;
-
-    my @orExpression = ();
-    my $numParameters = 0;
-    my @neededArguments = ();
-    my $hasVariadic = 0;
-    my $numMandatoryParams = @{$function->parameters};
-
-    foreach my $parameter (@{$function->parameters}) {
-        if ($parameter->isOptional) {
-            my ($expression, @usedArguments) = GenerateParametersCheckExpression($numParameters, $function);
-            push(@orExpression, $expression);
-            push(@neededArguments, @usedArguments);
-            $numMandatoryParams--;
-        }
-        if ($parameter->isVariadic) {
-            $hasVariadic = 1;
-            last;
-        }
-        $numParameters++;
-    }
-    if (!$hasVariadic) {
-        my ($expression, @usedArguments) = GenerateParametersCheckExpression($numParameters, $function);
-        push(@orExpression, $expression);
-        push(@neededArguments, @usedArguments);
-    }
-    return ($numMandatoryParams, join(" || ", @orExpression), @neededArguments);
-}
-
 sub LengthOfLongestFunctionParameterList
 {
     my ($overloads) = @_;
@@ -3448,7 +3377,7 @@ END
             push(@implContent, "#endif\n\n") if $conditional;
 
             # Generate a function dispatching call to the rest of the overloads.
-            GenerateOverloadedFunction($function, $interface) if !$isCustom && $isOverloaded && $function->{overloadIndex} == @{$function->{overloads}};
+            GenerateOverloadedFunctionOrConstructor($function, $interface, 0) if !$isCustom && $isOverloaded && $function->{overloadIndex} == @{$function->{overloads}};
         }
 
         push(@implContent, $endAppleCopyright) if $inAppleCopyright;
@@ -5185,7 +5114,7 @@ sub GenerateConstructorDefinitions
             foreach my $constructor (@constructors) {
                 GenerateConstructorDefinition($outputArray, $className, $protoClassName, $visibleInterfaceName, $interface, $generatingNamedConstructor, $constructor);
             }
-            GenerateOverloadedConstructorDefinition($outputArray, $className, $interface);
+            GenerateOverloadedFunctionOrConstructor(@{$interface->constructors}[0], $interface, 1);
         } elsif (@constructors == 1) {
             GenerateConstructorDefinition($outputArray, $className, $protoClassName, $visibleInterfaceName, $interface, $generatingNamedConstructor, $constructors[0]);
         } else {
@@ -5196,51 +5125,6 @@ sub GenerateConstructorDefinitions
     GenerateConstructorHelperMethods($outputArray, $className, $protoClassName, $visibleInterfaceName, $interface, $generatingNamedConstructor);
 }
 
-sub GenerateOverloadedConstructorDefinition
-{
-    my $outputArray = shift;
-    my $className = shift;
-    my $interface = shift;
-
-    # FIXME: Implement support for overloaded constructors with variadic arguments.
-    my $lengthOfLongestOverloadedConstructorParameterList = LengthOfLongestFunctionParameterList($interface->constructors);
-
-    push(@$outputArray, <<END);
-template<> EncodedJSValue JSC_HOST_CALL ${className}Constructor::construct(ExecState* state)
-{
-    size_t argsCount = std::min<size_t>($lengthOfLongestOverloadedConstructorParameterList, state->argumentCount());
-END
-
-    my %fetchedArguments = ();
-    my $leastNumMandatoryParams = 255;
-
-    my @constructors = @{$interface->constructors};
-    foreach my $overload (@constructors) {
-        my $functionName = "construct${className}";
-        my ($numMandatoryParams, $parametersCheck, @neededArguments) = GenerateFunctionParametersCheck($overload);
-        $leastNumMandatoryParams = $numMandatoryParams if ($numMandatoryParams < $leastNumMandatoryParams);
-
-        foreach my $parameterIndex (@neededArguments) {
-            next if exists $fetchedArguments{$parameterIndex};
-            push(@$outputArray, "    JSValue arg$parameterIndex(state->argument($parameterIndex));\n");
-            $fetchedArguments{$parameterIndex} = 1;
-        }
-
-        push(@$outputArray, "    if ($parametersCheck)\n");
-        push(@$outputArray, "        return ${functionName}$overload->{overloadedIndex}(state);\n");
-    }
-
-    if ($leastNumMandatoryParams >= 1) {
-        push(@$outputArray, "    if (UNLIKELY(argsCount < $leastNumMandatoryParams))\n");
-        push(@$outputArray, "        return throwVMError(state, createNotEnoughArgumentsError(state));\n");
-    }
-    push(@$outputArray, <<END);
-    return throwVMTypeError(state);
-}
-
-END
-}
-
 sub GenerateConstructorDefinition
 {
     my ($outputArray, $className, $protoClassName, $visibleInterfaceName, $interface, $generatingNamedConstructor, $function) = @_;
@@ -5333,10 +5217,10 @@ END
             push(@$outputArray, "    return construct${className}(*exec);\n");
             push(@$outputArray, "}\n\n");
          } elsif (!HasCustomConstructor($interface) && (!$interface->extendedAttributes->{"NamedConstructor"} || $generatingNamedConstructor)) {
-            if ($function->{overloadedIndex} && $function->{overloadedIndex} > 0) {
-                push(@$outputArray, "static inline EncodedJSValue construct${className}$function->{overloadedIndex}(ExecState* state)\n");
-            }
-            else {
+            my $isOverloaded = $function->{overloads} && @{$function->{overloads}} > 1;
+            if ($isOverloaded) {
+                push(@$outputArray, "static inline EncodedJSValue construct${className}$function->{overloadIndex}(ExecState* state)\n");
+            else {
                 push(@$outputArray, "template<> EncodedJSValue JSC_HOST_CALL ${constructorClassName}::construct(ExecState* state)\n");
             }
 
index 93d4f0a..5043112 100644 (file)
@@ -2306,7 +2306,6 @@ sub applyExtendedAttributeList
             $constructor->signature->name("Constructor");
             $constructor->signature->extendedAttributes($extendedAttributeList);
             $constructor->parameters($param);
-            $constructor->{overloadedIndex} = $index++;
             push(@{$interface->constructors}, $constructor);
         }
         delete $extendedAttributeList->{"Constructors"};
@@ -2332,7 +2331,6 @@ sub applyExtendedAttributeList
             $customConstructor->signature->name("CustomConstructor");
             $customConstructor->signature->extendedAttributes($extendedAttributeList);
             $customConstructor->parameters($param);
-            $customConstructor->{overloadedIndex} = $index++;
             push(@{$interface->customConstructors}, $customConstructor);
         }
         delete $extendedAttributeList->{"CustomConstructors"};
index 1fa1eda..c684663 100644 (file)
@@ -130,19 +130,21 @@ static inline EncodedJSValue constructJSTestOverloadedConstructors5(ExecState* s
 template<> EncodedJSValue JSC_HOST_CALL JSTestOverloadedConstructorsConstructor::construct(ExecState* state)
 {
     size_t argsCount = std::min<size_t>(1, state->argumentCount());
-    JSValue arg0(state->argument(0));
-    if ((argsCount == 1 && ((arg0.isObject() && asObject(arg0)->inherits(JSArrayBuffer::info())))))
-        return constructJSTestOverloadedConstructors1(state);
-    if ((argsCount == 1 && ((arg0.isObject() && asObject(arg0)->inherits(JSArrayBufferView::info())))))
-        return constructJSTestOverloadedConstructors2(state);
-    if ((argsCount == 1 && ((arg0.isObject() && asObject(arg0)->inherits(JSBlob::info())))))
-        return constructJSTestOverloadedConstructors3(state);
-    if (argsCount == 1)
-        return constructJSTestOverloadedConstructors4(state);
-    if ()
+    if (argsCount == 0) {
         return constructJSTestOverloadedConstructors5(state);
-    if (UNLIKELY(argsCount < 1))
-        return throwVMError(state, createNotEnoughArgumentsError(state));
+    }
+    if (argsCount == 1) {
+        JSValue distinguishingArg = state->uncheckedArgument(0);
+        if (distinguishingArg.isObject() && asObject(distinguishingArg)->inherits(JSArrayBuffer::info()))
+            return constructJSTestOverloadedConstructors1(state);
+        if (distinguishingArg.isObject() && asObject(distinguishingArg)->inherits(JSArrayBufferView::info()))
+            return constructJSTestOverloadedConstructors2(state);
+        if (distinguishingArg.isObject() && asObject(distinguishingArg)->inherits(JSBlob::info()))
+            return constructJSTestOverloadedConstructors3(state);
+        if (distinguishingArg.isNumber())
+            return constructJSTestOverloadedConstructors5(state);
+        return constructJSTestOverloadedConstructors4(state);
+    }
     return throwVMTypeError(state);
 }
 
index bddb1b8..7e744ac 100644 (file)
@@ -30,6 +30,6 @@
     Constructor(ArrayBufferView arrayBufferView),
     Constructor(Blob blob),
     Constructor(DOMString string),
-    Constructor(long... longArgs) // FIXME: Implement support for overloaded constructors with variadic arguments.
+    Constructor(long... longArgs)
 ] interface TestOverloadedConstructors {
 };