Boris Zbarsky wrote:
In fact, WebIDL doesn't even do what you want here with [TreatUndefinedAs=Missing]. All that does is that if it's present on an argument and all arguments after it, and if all the values passed for all those arguments are undefined, then the effective overload used is the one with all those arguments omitted. So if you have this IDL:

  void foo([TreatUndefinedAs=Missing] optional int foo,
           [TreatUndefinedAs=Missing] optional int bar);

and you make this call:

  foo(undefined, 5)

this will behave the same as foo(0, 5).

Basically, TreatUndefinedAs=Missing is meant to let you pretend like trailing undefined values don't affect arguments.length, in ES terms.

This is all consistent with draft ES6, per Ecma TC39 and its Editor, @awbjs.

http://wiki.ecmascript.org/doku.php?id=harmony:specification_drafts

undefined is the one value that acts as the default-triggering sentinel, whether trailing or not. This supports composition by delegation, where f(a,b,c) and f calls g(a,b,c) and g has default parameters triggers defaulting no matter how many or few actual arguments f receives -- without f having to specialize on arguments.length and call g with 0, 1, or 2 actuals.

Think about all this from the point of view of an ES impl of foo() above. How would you represent, in an ES function that expects its first argument to be an int and the second argument to be an int but makes them optional, the concept of "second int passed, but first not passed"? However you'd do that, that's probably what WebIDL should aim for.

undefined as first actual, int as second.

ccing public-script-coord here, because it seems like there's some serious lack of clarity about what WebIDL does now and what behavior people want out of it.

ES6 draft on default parameters is now clear.

/be

Reply via email to