[squeak-dev] read-only literals
Chris Muller
ma.chris.m at gmail.com
Mon Mar 26 22:27:39 UTC 2018
(Palm hits forehead "duh, of course!"). You meant only literal Arrays
and ByteArrays in CompiledMethods, not _all_ Arrays and ByteArray
instances. Whew, sorry! :)
Thanks for your patience with me.
On Mon, Mar 26, 2018 at 9:09 AM, Eliot Miranda <eliot.miranda at gmail.com> wrote:
> Hi Chris,
>
>
>
> _,,,^..^,,,_ (phone)
> On Mar 25, 2018, at 8:26 PM, Chris Muller <asqueaker at gmail.com> wrote:
>
> On Sun, Mar 25, 2018 at 6:18 PM, Eliot Miranda <eliot.miranda at gmail.com>
> wrote:
>
> Hi All,
>
>
> Hi Eliot,
>
> Congratulations on the enhancement. As developer of Magma, I'm
> interested in learning more about it as a possible alternative to the
> WriteBarrier. How does it work?
>
>
> There is a per-object flag (a bit in the object header) that if set prevents
> modification. The bit is controlled by Object>>#setIsReadOnlyObject: with
> Object>>#beReadOnlyObject as a convenience. Object>>#beReadOnlyObject is
> the getter. By default the bit is off (new objects are mutable). The
> Compiler modification sets the bit for method literals (literal strings,
> symbols, arrays, byte arrays and boxed floats). The facility may also be
> used for
> - an object-to-database mapping system
> -debugging
> etc
>
>
> First, it might help me to understand what _your_ primary motivation
> for proposing to make various entire classes of objects read-only by
> default?
>
>
> I have proposed no such thing. You have misunderstood :-)
>
> As you found from running the tests, the few cases that
> modified literals were doing it intentionally. My guess is that more
> read-only objects allows the VM to run a lot faster, is that right?
> But my hope was that this capability would be provided with
> granularity at the object-level, not necessarily the class level.
>
> the VM now has support for read only objects, and the first logical
>
> application is for literals, making boxed floats, strings, symbols, arrays
>
> and byte arrays read-only.
>
>
> Wow, Arrays and ByteArrays too? Magma's core Buffer classes all use
> ByteArray's internally to represent and update their state. Ouch!
>
>
> No, no, no, no :-). Only _literal_ instances of these.
>
>
> Doing so is trivial; only two methods need to be
>
> modified (see attached). AFAIA little or no core code is broken by making
>
> literals read-only. However, when I ran the test suite with read-only
>
> literals in place, several tests were broken. These are things like
>
> creating null-terminated strings for testing OSProcess, by replacing spaces
>
> in string literals with zeros, etc.
>
>
> When we added read-only literals to VisualWorks in something like vw7.0 the
>
> balance of opinion was that we should not break user code. Hence we
>
> implemented a preference scheme with three states:
>
>
> - By default, an attempt to modify a read-only literal would silently make
>
> the literal mutable temporarily,update it and then reenable read-onlyness.
>
>
> Magma uses previously-loaded ByteArray's and replaces their contents,
> field by field, via ByteArray>>#uint:at:put:. It runs this method
> more than any other in the image -- millions and millions of times.
> The performance of this method is very important for Magma.
>
>
> And why on earth would I try and introduce something that would break this?
>
>
> - A second state would issue a warning to the transcript, while doing what
>
> the default did.
>
>
> I'm reading that and imagining a low level primitive like
> Array>>#at:put: having a reference or signal to the Transcript that
> runs *every single time*? That can't be true. Surely the "preference
> scheme" you mentioned must've been more sophisticated than global
> Preference values. Something more dynamic and simple, like "myObject
> beReadOnly: true"...? Then applications -- including the IDE -- can
> handle AttemptToModifyReadOnlyObject as needed.
>
> - The third state would raise an error
>
>
> In the process of raising that error, is there any danger of
> encountering a place in the debugger code which attempted to modify
> another Array, thus causing it to re-enter the original error-raising
> code to raise yet another error? It seems like a pretty low-level
> thing to have to guard against...
>
> Remember that all one needs to do to fix code that modifies literals is to
>
> send copy to the literal before modifying the copy, since copies of
>
> read-only literals are mutable.
>
>
> I hope we are not confusing the intermal representation of objects
> being bytes with whether those objects are literals or not. If a
> program sees fit to modify a "literal", techincally is not a literal,
> but a variable, right? Dave's case sounds like a true literal, but
> I'm saying I have applications which update bitmap forms in real time.
> Artists paint on SketchMorphs.. I presume you don't mean for _these_
> cases to need to make constant copies...
>
> I was on the side of only raising an error, but was overruled :-). I wonder
>
> what this community thinks. If there are strong views that user code should
>
> continue to function unchanged (even though it is modifying literals, which
>
> is so so wrong :-) ) I'm happy to implement a scheme similar to that for
>
> VisualWorks. But I'd rather not have to and simply have people fix their
>
> code within a system that raises an error whenever an attempt is made to
>
> modify a literal, and is as simple as possible, but no simpler ;-)
>
> Thoughts, opinions?
>
>
> Instead of introducing new assumptions and breaking old code, I
> suggest people writing which explicitly turn ON read-only'ness, for
> the objects they want preserving legacy expectations about Smalltalk
> as well as the operation of legacy applications. IMO, any
> introduction of immutability at the class-level should be turned off
> by default. Make it powerful but not painful.
>
> It would help tremendously to know what you want to accomplish and how
> the new API works.
>
>
> We have been discussing this for a while now. Clément even wrote a paper
>
> https://hal.archives-ouvertes.fr/hal-01356338/document
>
>
> Regards,
> Chris
>
More information about the Squeak-dev
mailing list
|