Please do not use Smalltalk at:
We will ban it for real!
Stef
Le 31/3/15 20:49, Max Leske a écrit :
Hi
Tommaso and I, while hacking on Fuel, today discovered that globals in Pharo
can have very weird bindings (I guess some of you already know that). For
example:
class := Class new
setName: 4;
yourself.
Smalltalk
at: class name
put: class.
So we now have a class with name 4 (which is a SmallInteger):
self assert: (Smalltalk at: 4) == class.
There are basically two different issues:
1. SystemDictionary will store any kind of association, not only symbols /
strings
arghhhh
2. SystemDictionary is an IdentityDictionary and as such two equivalent but not
identical keys will not resolve to the same object:
class := Class new
setName: (String streamContents: [ :s | s nextPutAll:
'someName']);
yourself.
Smalltalk
at: class name
put: class.
Smalltalk
at: (String streamContents: [ :s | s nextPutAll: 'someName’])
ifAbsent: [ false ]. “——> false”
In Fuel we simply assume that any key to a global is either a ByteString or
ByteSymbol. If that’s not the case bad things happen.
It would help us a lot if we could clear up the semantics of bindings in
SystemDictionary:
1. Are bindings with keys that are not ByteString or ByteSymbol valid?
2. Should we keep allowing ByteString as keys to globals (ByteSymbol guarantees
identity)?
3. If we allow ByteString, do we also allow WideString?
4. Would “type checks” on SystemDictionary incur a big performance penalty?
Any suggestions are welcome.
Cheers,
Max