|
Smalltalk/X WebserverDocumentation of class 'ImmutableByteArray': |
|
|
Class: ImmutableByteArrayInheritance:Object | +--Collection | +--SequenceableCollection | +--ArrayedCollection | +--UninterpretedBytes | +--ByteArray | +--ImmutableByteArray
Description:
By default, byte array literals in smalltalk are mutable objects. That
may lead to some subtle (and hard to find errors), if some method passes
a literal byte-array object as argument to someone else, who changes the
bytearray using at:put: like messages. Since the bytearray object is kept in
the first methods literals, the bytearray constant has now been changed without
having the method's sourcecode reflect this. Thus, the method will
behave differently from what its source may make you think.
To help finding this kind of 'feature/bug', the compiler can be
configured to create instances of this ImmutableByteArray instead of ByteArrays
for literals. Instances of ImmutableByteArray catch storing accesses and
enter the debugger. Although useful, this feature is disabled by default
for compatibility to other smalltalk implementations.
(Also, if turned on, this makes inspecting bytearray literals entered in
a workspace somewhat strange: you cannot modify it any longer).
Turn the ImmutableArray feature on, by setting the Parser's class variable
'ArraysAreImmutable' to true or use the new launchers settings menu.
ATTENTION:
there may be still code around which checks for explicit class being ByteArray
(both in Smalltalk and in primitive code). All code like foo 'class == ByteArray'
or '__isByteArray' will not work with ImmutableByteArrays.
A somewhat better approach would be to either add a flag to the object (mutability)
and check this dynamically (expensive) or to place immutable objects into a readonly
memory segment (the good solution). We will eventually implement the second in the future...
Related information:
ImmutableString
ImmutableArray
Parser
Scanner
Instance protocol:accessing
|
|
|
ST/X 6.1.1; WebServer 1.620 at exept:8081; Wed, 23 May 2012 19:36:05 GMT
|