On Nov 26, 2014, at 10:22 AM, Claude Pache wrote: > > The root of the issue, is that WeakMaps are thought as a tool for two > unrelated use cases. Quoting [1]: > >> (...) WeakMaps were motivate[d] by two distinct use cases. Soft fields and >> object-keyed caches. > > Now, in short, for the "soft fields" use case, a `.clear()` method is > unwanted, but for the "object-keyed caches" use case, a `.clear()` method is > welcome. > > —Claude > > [1]: https://esdiscuss.org/topic/weakmap-clear-and-inverted-implementations
Let's ignore security for the moment. If WeakMaps/WeakSets are not inspectable (via iteration) and do not have a clear operation, then the inverted implementation technique can be use used. This technique eliminates significant GS complexity. The ability to iterate over the elements of a WeakMap/Set would make implementation specific (and probably non-deterministic) GC timing observable to ES programs. Non-deterministic and observable implementation specific behavior is bad for interoperability. That reason alone is enough for TC39 to choose to not make WeakMaps/Sets non-iterable as interoperability is one of our highest priorities. That said, there are use cases for iterable weak collections if you are willing to tolerate the non-determinism and observability of the GC. Implementations supporting situation where those use cases are important might choose to provide a non-standard IterableWeakMap/Set implementation and there would be no particular reason for not including a 'clear' method. If there of evidence of enough utility for such collections TC39 might even decide to standardize them. In which case we would probably but them into a standard module that needs to be explicitly imported. Use of the module would be a flag that the program may have non-deterministic behavior. Allen > > >> Le 26 nov. 2014 à 18:33, Katelyn Gadd <[email protected]> a écrit : >> >> Is there a detailed rationale for this somewhere? Making typical >> applications pay the cost here for a specific security scenario seems >> really bizarre to me. Clearing standard library data structures is an >> incredibly common operation. If you want to ensure that someone can't >> clear the map/set, shouldn't you be handing them an encapsulated >> version of the data structure? This seems like a corner case that >> shouldn't justify removing an important primitive. >> >> If you have a clear method, the security problem seems solved by >> wrapping it in an object or using a proxy to deny the ability to clear >> (you hide the actual map/set, so it can't be cleared - you expose only >> the operations you want to expose). >> >> If you don't have a clear method, anyone wanting to clear the data >> structure has to throw it away and allocate a new one. This has >> significant disadvantages: >> The new structure starts empty at a default size, so repopulating it >> will have to grow the buffer multiple times - this is undesirable for >> cases where you are reusing a single data structure to store state for >> a long-running application. >> The allocation adds to GC and memory pressure for a long-running >> application that needs to clear data structures frequently. Were it a >> lightweight data type this would matter less, but a typical map >> instance with data in it can occupy a considerable amount of space in >> the heap. >> Being able to clear the structure now requires that all consumers have >> support for replacing their reference(s) to the old map with the new >> one. This makes it harder to maintain encapsulation because you may >> have saved a reference to the map in a private property or within a >> closure. Now you need to add accessibility points to everything that >> might retain the map so that you can update the reference. Or, you >> have to encapsulate maps and sets just to recreate the clear operation >> that should have been there to begin with. >> >> In either case, encapsulation or shielding the container behind a >> proxy is necessary. I insist that the common case is the one that >> shouldn't have to encapsulate, because optimizing for that case will >> benefit the vast majority of web applications that use it and the >> penalty to security-sensitive cases is small. >> >> -kg >> _______________________________________________ >> 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 >
_______________________________________________ es-discuss mailing list [email protected] https://mail.mozilla.org/listinfo/es-discuss

