- From: Boris Zbarsky <notifications@github.com>
- Date: Tue, 28 Feb 2017 10:13:04 -0800
- To: heycam/webidl <webidl@noreply.github.com>
- Cc: Subscribed <subscribed@noreply.github.com>
- Message-ID: <heycam/webidl/pull/323/review/24303934@github.com>
bzbarsky requested changes on this pull request. In general, this looks pretty reasonable... > @@ -1985,6 +1989,122 @@ The following extended attributes are applicable to operation arguments: "void" </pre> +<h5 id="idl-tojson-operation">toJSON</h5> + +By declaring a “toJSON” [=regular operation=], +an [=interface=] specify how to convert the objects that implements it to [=JSON values=]. "Specifies" and "implement". > @@ -1985,6 +1989,122 @@ The following extended attributes are applicable to operation arguments: "void" </pre> +<h5 id="idl-tojson-operation">toJSON</h5> + +By declaring a “toJSON” [=regular operation=], +an [=interface=] specify how to convert the objects that implements it to [=JSON values=]. + +The “toJSON” [=regular operation=] is reserved for this usage. +It must take zero arguments and return a [=JSON value=]. + +The list of <dfn id="dfn-json-values" export lt="JSON value">JSON values</dfn> is as follows: This is a list of types, not values. Should we be talking about "JSON types"? > +The [=corresponding default operation=] of the “toJSON” operation is the [=default toJSON operation=]. + +<div algorithm> + + To invoke the <dfn export>default toJSON operation</dfn> of [=interface=] |I|, + run the the following steps: + + 1. Let |O| be the <emu-val>this</emu-val> value. + 1. Let |result| be [=!=] [=ObjectCreate=]([=%ObjectPrototype%=]). + 1. If there is an [=inherited interface=] of |I| + that declares a “toJSON” operation, then + 1. Let |super| be the “toJSON” operation of + the closest [=inherited interface=] of |I| + that declares a “toJSON” operation. + 1. Set |result| to [=?=] [=Call=](|super|, |O|). + 1. If Type(|result|) is not Object, return |result|. This is not very compatible with declaring `toJSON` to return `object`. Should the default `toJSON` be required to return `any`? > +The [=corresponding default operation=] of the “toJSON” operation is the [=default toJSON operation=]. + +<div algorithm> + + To invoke the <dfn export>default toJSON operation</dfn> of [=interface=] |I|, + run the the following steps: + + 1. Let |O| be the <emu-val>this</emu-val> value. + 1. Let |result| be [=!=] [=ObjectCreate=]([=%ObjectPrototype%=]). + 1. If there is an [=inherited interface=] of |I| + that declares a “toJSON” operation, then + 1. Let |super| be the “toJSON” operation of + the closest [=inherited interface=] of |I| + that declares a “toJSON” operation. + 1. Set |result| to [=?=] [=Call=](|super|, |O|). + 1. If Type(|result|) is not Object, return |result|. So here we're invoking the actual operation (as opposed to operation steps), right? But the default value of that operation, not whatever is on the prototype? > +<h6 id="es-default-tojson">default toJSON operation</h5> + +The [=corresponding default operation=] of the “toJSON” operation is the [=default toJSON operation=]. + +<div algorithm> + + To invoke the <dfn export>default toJSON operation</dfn> of [=interface=] |I|, + run the the following steps: + + 1. Let |O| be the <emu-val>this</emu-val> value. + 1. Let |result| be [=!=] [=ObjectCreate=]([=%ObjectPrototype%=]). + 1. If there is an [=inherited interface=] of |I| + that declares a “toJSON” operation, then + 1. Let |super| be the “toJSON” operation of + the closest [=inherited interface=] of |I| + that declares a “toJSON” operation. This all does not play nicely with mixins, in our current mixin model. The idea should be that you consider your inherited interfaces and all their mixins, right? > + +Only [=regular operations=] which have a <dfn>corresponding default operation</dfn> defined below +may be declared with a [{{Default}}] [=extended attribute=]. + + +<h6 id="es-default-tojson">default toJSON operation</h5> + +The [=corresponding default operation=] of the “toJSON” operation is the [=default toJSON operation=]. + +<div algorithm> + + To invoke the <dfn export>default toJSON operation</dfn> of [=interface=] |I|, + run the the following steps: + + 1. Let |O| be the <emu-val>this</emu-val> value. + 1. Let |result| be [=!=] [=ObjectCreate=]([=%ObjectPrototype%=]). Shouldn't this move into a "if there is no inherited toJSON" branch? > + + To invoke the <dfn export>default toJSON operation</dfn> of [=interface=] |I|, + run the the following steps: + + 1. Let |O| be the <emu-val>this</emu-val> value. + 1. Let |result| be [=!=] [=ObjectCreate=]([=%ObjectPrototype%=]). + 1. If there is an [=inherited interface=] of |I| + that declares a “toJSON” operation, then + 1. Let |super| be the “toJSON” operation of + the closest [=inherited interface=] of |I| + that declares a “toJSON” operation. + 1. Set |result| to [=?=] [=Call=](|super|, |O|). + 1. If Type(|result|) is not Object, return |result|. + 1. For each [=exposed=] [=regular attribute=] |attr| that is an [=interface member=] of |I|: + 1. Let |id| be |attr|’s [=identifier=] [=converted to an ECMAScript value=]. + 1. Let |value| be [=?=] [=Get=](|O|, |id|). So this is calling possibly-modified getters, not the original ones, right? Why? > + run the the following steps: + + 1. Let |O| be the <emu-val>this</emu-val> value. + 1. Let |result| be [=!=] [=ObjectCreate=]([=%ObjectPrototype%=]). + 1. If there is an [=inherited interface=] of |I| + that declares a “toJSON” operation, then + 1. Let |super| be the “toJSON” operation of + the closest [=inherited interface=] of |I| + that declares a “toJSON” operation. + 1. Set |result| to [=?=] [=Call=](|super|, |O|). + 1. If Type(|result|) is not Object, return |result|. + 1. For each [=exposed=] [=regular attribute=] |attr| that is an [=interface member=] of |I|: + 1. Let |id| be |attr|’s [=identifier=] [=converted to an ECMAScript value=]. + 1. Let |value| be [=?=] [=Get=](|O|, |id|). + 1. Let |created| be [=!=] [=CreateDataProperty=](|result|, |id|, |value|). + 1. Assert: |created| is <emu-val>true</emu-val>. You can't assert anything of the sort. You're calling CreateDataProperty on some random object that might have come from anywhere. It can totally fail to define the property. > + To invoke the <dfn export>default toJSON operation</dfn> of [=interface=] |I|, + run the the following steps: + + 1. Let |O| be the <emu-val>this</emu-val> value. + 1. Let |result| be [=!=] [=ObjectCreate=]([=%ObjectPrototype%=]). + 1. If there is an [=inherited interface=] of |I| + that declares a “toJSON” operation, then + 1. Let |super| be the “toJSON” operation of + the closest [=inherited interface=] of |I| + that declares a “toJSON” operation. + 1. Set |result| to [=?=] [=Call=](|super|, |O|). + 1. If Type(|result|) is not Object, return |result|. + 1. For each [=exposed=] [=regular attribute=] |attr| that is an [=interface member=] of |I|: + 1. Let |id| be |attr|’s [=identifier=] [=converted to an ECMAScript value=]. + 1. Let |value| be [=?=] [=Get=](|O|, |id|). + 1. Let |created| be [=!=] [=CreateDataProperty=](|result|, |id|, |value|). You can't use `!` here. You don't control `result`; it could just throw from `[[DefineOwnProperty]]`. -- You are receiving this because you are subscribed to this thread. Reply to this email directly or view it on GitHub: https://github.com/heycam/webidl/pull/323#pullrequestreview-24303934
Received on Tuesday, 28 February 2017 23:21:27 UTC