- 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>
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