W3C home > Mailing lists > Public > public-script-coord@w3.org > October to December 2011

Re: overload resolution consistency

From: Simon Pieters <simonp@opera.com>
Date: Fri, 09 Dec 2011 12:45:48 +0100
To: "Cameron McCormack" <cam@mcc.id.au>
Cc: "public-script-coord@w3.org" <public-script-coord@w3.org>
Message-ID: <op.v570amrfidj3kv@simon-pieterss-macbook.local>
On Fri, 09 Dec 2011 02:30:13 +0100, Cameron McCormack <cam@mcc.id.au>  
wrote:

> Cameron McCormack:
>>> The simplest choice is probably to select the exactly matching
>>> overload if there is one, otherwise to select the first overload
>>> regardless of the types of the actual arguments. So for the above
>>> example that would select f(object, object).
>
> Simon Peters:
>> interface HTMLOptionsCollection : HTMLCollection {
>> void add(HTMLOptionElement element, optional HTMLElement? before);
>> void add(HTMLOptGroupElement element, optional HTMLElement? before);
>> void add(HTMLOptionElement element, long before);
>> void add(HTMLOptGroupElement element, long before);
>>
>> (HTMLFormElement also has these variants.)
>>
>> Consider:
>>
>> options.add(document.createElement('optgroup'), "foo");
>>
>> (maybe the second argument comes from an <input type=number> and the
>> author forgot to convert it from a string to an int.)
>
> That's a good argument against the simple choice I proposed.
>
>> interface CanvasRenderingContext2D {
>> CanvasPattern createPattern(HTMLImageElement image, DOMString  
>> repetition);
>> CanvasPattern createPattern(HTMLCanvasElement image, DOMString  
>> repetition);
>> CanvasPattern createPattern(HTMLVideoElement image, DOMString  
>> repetition);
>> void drawImage(HTMLImageElement image, double dx, double dy);
>> void drawImage(HTMLImageElement image, double dx, double dy, double dw,
>> double dh);
>> void drawImage(HTMLImageElement image, double sx, double sy, double sw,
>> double sh, double dx, double dy, double dw, double dh);
>> void drawImage(HTMLCanvasElement image, double dx, double dy);
>> void drawImage(HTMLCanvasElement image, double dx, double dy, double dw,
>> double dh);
>> void drawImage(HTMLCanvasElement image, double sx, double sy, double sw,
>> double sh, double dx, double dy, double dw, double dh);
>> void drawImage(HTMLVideoElement image, double dx, double dy);
>> void drawImage(HTMLVideoElement image, double dx, double dy, double dw,
>> double dh);
>> void drawImage(HTMLVideoElement image, double sx, double sy, double sw,
>> double sh, double dx, double dy, double dw, double dh);
>>
>> Consider using a <canvas> or <video> in the first argument, but using
>> the wrong type in another argument.
>
> Yes, fair enough.
>
>> How does it work when there are different number of arguments?
>>
>> ImageData createImageData(double sw, double sh);
>> ImageData createImageData(ImageData imagedata);
>
> Elimination of candidate overloads due to number of arguments is done  
> before looking at the types of values passed in.  So if you did
>
>    createImageData(anImageData, 123);
>
> this would select the first overload and convert anImageData to a double.
>
>> [NoInterfaceObject]
>> interface WindowTimers {
>> long setTimeout(Function handler, optional long timeout, any... args);
>> long setTimeout([AllowAny] DOMString handler, optional long timeout,
>> any... args);
>> long setInterval(Function handler, optional long timeout, any... args);
>> long setInterval([AllowAny] DOMString handler, optional long timeout,
>> any... args);
>>
>> This already uses [AllowAny], so the wrong type on the first argument
>> would convert to DOMString. But what if the second argument is of the
>> wrong type?
>>
>> interface WebSocket : EventTarget {
>> void send(DOMString data);
>> void send(ArrayBuffer data);
>> void send(Blob data);
>>
>> This should probably convert to DOMString for other types.
>>
>> The above extracts are the overloads I found in the HTML spec. What they
>> have in common is that the first argument is more important than the
>> other arguments, such that we should try not to convert the first
>> argument if it's of a matching type.
>
> Yes.  I'd be reluctant to enshrine overload resolution that favours the  
> first argument, though.  It seems just as likely that if you had
>
>    interface A {
>      void f(float x, Node y);
>      void f(DOMString x, Blob y);
>    };
>
> then you'd want f("0", node) to select the first one.
>
> Not sure what the right way forward is yet.

I was going to say that such an API doesn't exist AFAIK, but then I found  
in XHR:

[Constructor,
  Constructor(HTMLFormElement form)]
interface FormData {
   void append(DOMString name, Blob value, optional DOMString filename);
   void append(DOMString name, DOMString value);
};

Here the second argument seems most important to preserve, if it's a Blob.

So AFAICT what's common with the above "most important" arguments is that  
they are all platform object types.

-- 
Simon Pieters
Opera Software
Received on Friday, 9 December 2011 11:46:34 UTC

This archive was generated by hypermail 2.3.1 : Wednesday, 8 May 2013 19:30:05 UTC