Mark: I also agree that `Object.freeze` is flawed, and I welcome a proper
proposal for `Object.tamperProof` or what have you.  But `Object.freeze`
works just well enough in the short term that people can build useful
mechanisms on top of it.

My proposal just makes `Map`/`Set` behave consistently with `Object` with
respect to `Object.freeze` (preserving the consistency between object
fields and the behavior of `Map`).  I think that consistency is preferable
to the current situation, even though (as I said) I welcome a proper
mechanism for immutability in the future.

Said a different way: one day we will have `Object.tamperProof` and it will
be wonderful.  But we will always be stuck with `Object.freeze` as well,
because it's been released into the while.  Let's at least try to make
`Object.freeze` a little more consistent, and not let future features
prevent us from improving what we have now.
  --scott


On Thu, Apr 30, 2015 at 1:17 PM, Mark S. Miller <erig...@google.com> wrote:

> This must *not* be hung off of Object.freeze. Object.freeze is about
> tamper proofing an object's API, not about making its internal state
> immutable. I regret the term "freeze" for this purpose as it repeatedly
> suggests this confusion. OTOH, because of the override mistake,
> Object.freeze is not directly usable as a good tamper proofing operation,
> so in this sense it was fortuitously good that it did not use up the name
> tamperProof.
>
> Deep immutability is a crucial concept deserving of good support for many
> reasons including security patterns. Deep immutability must of course
> include encapsulated state captured by lexical closures, and it must do so
> without violating the security properties that this very encapsulation
> guarantees. The Auditors of E <
> http://www.erights.org/elang/kernel/auditors/>, <
> http://wiki.erights.org/wiki/Guard-based_auditing> and Joe-E <
> http://www.cs.berkeley.edu/~daw/papers/pure-ccs08.pdf> <
> http://www.eecs.berkeley.edu/Pubs/TechRpts/2012/EECS-2012-244.html>
> provided solutions to this dilemma in their respective languages. E and
> Joe-E also support shallower forms of immutability that are specific to
> collections -- that are distinct from API tamper proofing but that do not
> extend to considering the mutability of the contents of the collections.
>
> I welcome proposals that would make sense for JavaScript.
>
>
>
> On Thu, Apr 30, 2015 at 9:52 AM, C. Scott Ananian <ecmascr...@cscott.net>
> wrote:
>
>> On Mon, Feb 23, 2015 at 3:31 PM, Mark S. Miller <erig...@google.com>
>> wrote:
>>
>>> On Mon, Feb 23, 2015 at 11:59 AM, Isiah Meadows <isiahmead...@gmail.com>
>>> wrote:
>>>>
>>>> On Feb 23, 2015 6:06 AM, "Andrea Giammarchi" <
>>>> andrea.giammar...@gmail.com> wrote:
>>>>
>>>> > On Sun, Feb 22, 2015 at 11:18 PM, Jordan Harband <ljh...@gmail.com>
>>>> wrote:
>>>>
>>> [...]
>>>
>>>> >>  - We'd definitely want `Map.empty` and `Set.empty` assuming
>>>> `Object.freeze` actually froze them
>>>>
>>>> Object.freeze does not freeze them, as far as I know. It might require
>>>> method overrides.
>>>>
>>> Object.freeze does not freeze their state. A proposal for a way to
>>> either freeze the state of collections, and/or to create frozen snapshots
>>> of collections, for future ES would be welcome and appreciated. I encourage
>>> any such effort to pay attention to Clojure and React.
>>>
>>
>> I ran into this today.
>>
>> As a strawman proposal:
>>
>> > Add "If TestIntegrityLevel(M, "frozen") is true, throw a TypeError
>> exception" between steps 3 and 4 of 23.1.3.1 (Map.prototype.clear),
>> 23.1.3.3 (Map.prototype.delete), 23.1.3.9 (Map.prototype.set), 23.2.3.1
>> (Set.prototype.add), 23.2.3.2 (Set.prototype.clear), and 23.2.3.4
>> (Set.prototype.delete).
>>
>> This wouldn't be some fancy all-singing all-dancing collection snapshot,
>> and would still leave the user responsible for freezing the prototype, etc,
>> but it would bring Map and Set back into parity with object (that is,
>> m.get(f) behaves for the most part like o[f]).
>>
>> Users would still have to special-case Map/Set when they implement their
>> own deepFreeze() methods, etc, but this ensures that the internal list is
>> actually protected.  It is (AFAICT) otherwise impossible in ES6 to maintain
>> object identity when "freezing" an collection.
>>  --scott
>>
>>
>
>
> --
>     Cheers,
>     --MarkM
>
_______________________________________________
es-discuss mailing list
es-discuss@mozilla.org
https://mail.mozilla.org/listinfo/es-discuss

Reply via email to