<div dir="ltr"><div class="gmail_extra"><div class="gmail_quote">On Sat, Apr 25, 2015 at 6:58 PM, Kevin Smith <span dir="ltr"><<a href="mailto:zenparsing@gmail.com" target="_blank">zenparsing@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><div dir="ltr"><div class="gmail_quote"><span class=""><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><div dir="ltr"><div class="gmail_extra"><div class="gmail_quote"><div>I think I'd rather see `Promise.resolve` changed to use `this.constructor` instead of `this.[[PromiseConstructor]]`, like every other Promise-related method.  Can someone who feels strongly otherwise give me the use case for `[[PromiseConstructor]]` existing?<br></div></div></div></div></blockquote></span></div></div></blockquote><div><br></div><div>I shouldn't have written `this.constructor` here.  I think looking at the object's prototype would be preferable.</div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><div dir="ltr"><div class="gmail_quote"><div>"Promise.resolve", executed on a constructor C, with argument x, should only return x if x was created by C.[[Construct]].  Otherwise it should create an instance of C which is resolved with x.</div></div></div></blockquote><div><br></div><div>"was created by C.[[Construct]] with NewTarget equal to C" is roughly how it is written currently.  But I think "should only return x if x is an instanceof C" (or "if the prototype of C is exactly C.prototype") would be the most logical behavior, since:</div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><div dir="ltr"><div class="gmail_quote"><div>If we used "x.constructor" to determine the actual constructor, then someone could just change the "constructor" property for x and fool someone who wrote "C.resolve(x)" and expected to get an instance of C back.<br></div></div></div></blockquote><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><div dir="ltr"><div class="gmail_quote"><div>It would be an unreliable, unsound conversion function.</div></div></div></blockquote><div><br></div><div>I don't think this argument holds water since:</div><div><br></div><div>x = Reflect.construct(Promise, x, C);</div><div><br></div><div>is another fine way to fool someone who wrote "C.resolve(x)" and expected to get an instance of C back.</div><div><br></div><div>What's more, I can then do:<br></div><div><br></div><div>Object.setPrototype(x, SomeArbitraryThing);</div><div><br></div><div>and still fool C.resolve, and now x behaves nothing like a Promise (much less a C).</div><div><br></div><div><div>So we've got an unreliable, unsound conversion function.  What is it good for?</div><div><br></div><div>If our conversion is inherently "unsound", we might as well have it preserve duck typing.  If it's currently quacking like a duck (that is, x.prototype = Duck.prototype), then let's just call it a duck and be done with it.   Adding complexity to try to "preserve soundness" isn't actually working.</div><div><br></div><div>Again: but maybe I'm wrong.  Can someone with a security-sensitive application explain how Promise.resolve is actually the right thing for them?</div><div>  --scott<br></div></div><div><br></div></div></div></div>