On Oct 2, 2012, at 2:46 PM, Mark S. Miller wrote:

> 
> 
> On Tue, Oct 2, 2012 at 11:01 AM, Allen Wirfs-Brock <al...@wirfs-brock.com> 
> wrote:
> 
> On Oct 2, 2012, at 10:18 AM, Kevin Smith wrote:
> 
>> 
>> private @FooBrand;
>> class Foo {
>>    constructor() {
>>         /* establish the internal Fooness of the instance */
>>         this.@FooBrand = true;
>>    }
>> }
>> Foo.isFoo = function (obj) {return !!obj.@FooBrand};
>> 
>> Using this strategy, will isFoo not fail, if the specified object came from 
>> a different global context (frame)?
>> 
>> Kevin
>> 
> 
> Indeed it would, but why shouldn't it?  Foo in another  frame is a different 
> class.  If you need to do cross-frame brand, that seems like an additional 
> requirement would require additional mechanism.
> 
> Wouldn't a WeakMap branding scheme has similar issues. You would need to 
> share via some means a common WeakMap among constructors in different frames. 
>  Just like to make symbol based branding work for this requirement you would 
> have to share a private symbol between frames.
> 
> For classes, I agree it should fail cross frame -- they are different 
> classes. But what about builtins? Note that ES5 [[Class]] is a cross-frame 
> brand for builtins. And Array.isArray is an ad-hoc one-off cross-frame brand 
> check.


If you take a look at the recent draft spec. for Map you will see that is uses 
an internal branding check that is supposed to work across frame.   If that 
check is properly implemented then one can code 

function isBuiltinMap(obj) {
   try {
       Map.prototype.size.call(obj)
   } catch (e) {return false};
   return true;
}


But this does raise an interesting question for self-host built-in and for any 
user self hosted class definitions.

The spec leaves it up to the Map implementation to define the mechanism for 
testing for the presence of [[MapData]]. But, in an ES self hosted 
implementation a private symbol or WeakMap registry  are probably the two most 
plausible available mechanisms.   Both of these would require some secure 
mechanism for cross frame sharing in order make the branding work cross frame.  
I don't think we currently have this.  Perhaps it is a module loader issue.  Or 
perhaps it is an implementation issue.  If built-ins have magic powers and the 
implementation wants to support self hosting of built-in then perhaps it's the 
implementation responsibility to provide the mechanism for granting those 
powers. 

Allen
_______________________________________________
es-discuss mailing list
es-discuss@mozilla.org
https://mail.mozilla.org/listinfo/es-discuss

Reply via email to