On Mon, Jan 21, 2013 at 10:40 AM, Mark S. Miller <[email protected]> wrote:
> On Mon, Jan 21, 2013 at 9:02 AM, Allen Wirfs-Brock
> <[email protected]> wrote:
>> If you don't want to expose clear on a WeakMap, create a subclass that 
>> doesn't support it:
>>
>> class WeakMapWithoutClear extends WeakMap {
>>    delete() {throw Error("Clearing this map is not allowed");
>> }
>
> Did you mean "clear()" rather than "delete()" ? Assuming so, how does
> this defend against


The above fragment was a leftover from a partial edit, sorry. I had
written your clear.call attack before seeing that you'd already
covered that below and suggested the wrapping defense.


>
>
>
> In any case, your argument cuts both ways. Given WeakMaps without .clear,
>
> // note: implements the WeakMap API but does *not* extend WeakMap.
> class WeakMapWithClear {
>      // doesn't matter whether private is implemented using WeakMap or
> private symbols
>      // as long as it provides real encapsulation.
>     private let wrapped; // not const, however we say this for a field
>     constructor() {
>         wrapped = new WeakMap();
>     }
>     get(key) => wrapped.get(key),
>     set(key, val) => wrapped.set(key, value),
>     has(key) => wrapped.has(key),
>     delete(key) => wrapped.delete(key),
>     clear() => { wrapped = null; }
> }
>
>
> Btw, as a separate point, notice that the above code becomes insecure
> if .set and .delete implicitly chain, unless we wrap curlies around
> the body. Not a strong point by itself because it's not hard to wrap
> curlies around the body, but does show that chaining creates a hazard
> that is easy to trip on.
>
>
>
>>
>> if you are really paranoid that somebody is going to do
>>        WeakMap.prototype.clear.call(myWeakMapWithoutClear);
>> then don't expose myWeakMapWithoutClear to untrusted parties or only expose 
>> wrapper object that hides the WeakMap as private state.
>
> Please don't speak out of both sides of your mouth in this way. First
> you show a piece of code as a supposed solution to the problem you
> raise. Then in an aside, you admit your solution is broken but do not
> show the code needed to actually fix it, leading to an underestimation
> of costs. My code above shows the cost of wrapping to get the dual
> effect. It's pay as you go -- the built-in weakmaps do not need to pay
> the costs of .clear. Note that in the reversed weakmap representation
> we're talking about, which will be common, these costs are real.
>
>
>>
>> clear is an operation that can not be otherwise synthesized for WeakMaps.
>
> See counter example above.
>
>>  Given the ambient impact of the mere existance of WeakMap entries on 
>> garbage collection algorithms, it seems likely that  will be performance 
>> advantages in some situations to proactively clear a WeakMap rather than 
>> waiting for the GC to do so.  Having clear enables this while it doesn't 
>> prevent using WeakMaps in ways that don't expose that operation to ambient 
>> use.
>
> This argument is backwards. It is the presence of .clear that prevents
> the non-ephemeron optimization for the common rights-amplification
> pattern.
>
>
>
>>
>>  On Jan 21, 2013, at 3:04 AM, David Bruant wrote:
>>
>>> Le 21/01/2013 11:58, David Bruant a écrit :
>>>> Before the clear method, weakmaps had the following property: "you can 
>>>> only modify a weakmap entry if you have the key". This property isn't true 
>>>> anymore with .clear. This may be considered as abusive ambient authority.
>>> Let's see how this feature came to appear:
>>> Jason Orendorff talked about Map.prototype.clear [1] (Oct 22nd). Seen as a 
>>> good idea. No discussion on whether it's a good idea for WeakMaps 
>>> specifically. Nicholas Zakas briefly mentions it in November [2]. No one 
>>> replied to it specifically. I haven't seen any discussion about it in 
>>> meeting notes [3]. A brief mention of Set/Map.prototype.clear [4] as a 
>>> review of the Oct 26th draft [5] (note, 4 days after Jason post, which is a 
>>> very short amount of time) but nothing about WeakMap.prototype.clear. 
>>> Implemented in Firefox soon after [6]...
>>> I think WeakMap.prototype.clear slipped through the crack without being 
>>> specifically discussed. Based on what's publicly available, I don't see 
>>> anyone noticed and discussed the fact that WeakMap.prototype.clear 
>>> questions the property that was true before its adoption ("you can only 
>>> modify a weakmap entry if you have the key")
>>
>> As much as makes sense we want Map, WeakMap, and Set to expose the same 
>> interfaces.  Any new method added to one is going to get added to all of 
>> them, unless it either simply makes no sense for one of them or if somebody 
>> can make a convincing argument for excluding it for one of them.
>>
>>>
>>> I think the property I mentioned is cricial to weakmap integrity and I 
>>> think WeakMap.prototype.clear should be considered for removal... or at 
>>> least proper discussion since none really happened from what I've found.
>>
>> TC39 doesn't have a process that requires a priori discussion on es-discuss 
>> of every design detailed before it can become part of specification draft.  
>> I'm pretty sure we would never finish anything it that was the case. The 
>> spec. drafts exist so the actual details of the proposed specification an be 
>> reviewed and discussed like this.
>>
>> Allen
>>
>>
>>
>>
>>>
>>> David
>>>
>>> [1] https://mail.mozilla.org/pipermail/es-discuss/2012-October/025962.html
>>> [2] https://mail.mozilla.org/pipermail/es-discuss/2012-November/026114.html
>>> [3] https://github.com/rwldrn/tc39-notes
>>> [4] 
>>> https://github.com/rwldrn/tc39-notes/blob/master/es6/2012-11/nov-27.md#review-of-new-draft-spec
>>> [5] http://wiki.ecmascript.org/doku.php?id=harmony:specification_drafts
>>> [6] https://bugzilla.mozilla.org/show_bug.cgi?id=814562
>>> _______________________________________________
>>> es-discuss mailing list
>>> [email protected]
>>> https://mail.mozilla.org/listinfo/es-discuss
>>>
>>
>> _______________________________________________
>> es-discuss mailing list
>> [email protected]
>> https://mail.mozilla.org/listinfo/es-discuss
>
>
>
> --
>     Cheers,
>     --MarkM



--
    Cheers,
    --MarkM
_______________________________________________
es-discuss mailing list
[email protected]
https://mail.mozilla.org/listinfo/es-discuss

Reply via email to