Le 22/01/2013 11:47, Jason Orendorff a écrit :
On Mon, Jan 21, 2013 at 6:04 AM, David Bruant <bruan...@gmail.com <mailto:bruan...@gmail.com>> wrote:

    [...] WeakMap.prototype.clear questions the property that was true
    before its adoption ("you can only modify a weakmap entry if you
    have the key")


David, would you please elaborate your argument for this invariant? This the first I've seen it stated.

An invariant can be a powerful thing. Still, I guess my default position is that (1) the object-capabilities perspective is only one view among many; (2) even looking at things with an eye for o-c integrity and security, clearing a data structure seems like a reasonable thing to allow, treating a reference to the data structure itself as a sufficient capability. It's (2) that I would especially like you to address.
I think Rick already suggested your (2), though phrased a bit differently [1] (that was his #1). I answered [2]: "I thought more about how I use weakmaps and [well-encapsulate my weakmaps so that I'm the only holder] is a thing I do naturally indeed." The problem may arise when you start sharing weakmaps around and some use cases require you to [3].

Regarding your (1), I don't doubt the need to clear a data structure since Allen explained a very compelling use case for that [3]. However, Mark showed an elegant way to implement .clear on top of clear-less weakmaps and the class syntax [4][5] (reproducing here the final version for clarity)

    // note: implements the WeakMap API but does *not* extend WeakMap.
    class WeakMapWithClear {
        private let wrapped;
        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 = new WeakMap(); }
    }

Now, the only thing that can differentiate both the native against this version is performance I think. Allen seems to argue that a native .clear would have better perf characteristics (related to GC). I still fail to see why the difference would be significant (but I need to re-read his recent posts about that). In all likelihood, .clear is a method that is used sporadically. At least, one needs to fill up the weakmap a bit before calling it, so I don't think a marginal perf difference would matter.

As an implementor, what is your feeling about performance characteristics of both the native and the class-based version?

David

[1] https://mail.mozilla.org/pipermail/es-discuss/2013-January/028353.html
[2] https://mail.mozilla.org/pipermail/es-discuss/2013-January/028357.html
[3] https://mail.mozilla.org/pipermail/es-discuss/2013-January/028380.html
[4] https://mail.mozilla.org/pipermail/es-discuss/2013-January/028370.html
[5] https://mail.mozilla.org/pipermail/es-discuss/2013-January/028371.html
_______________________________________________
es-discuss mailing list
es-discuss@mozilla.org
https://mail.mozilla.org/listinfo/es-discuss

Reply via email to