Very strange bug on Streams and probably compiler

Roel Wuyts Roel.Wuyts at ulb.ac.be
Wed Feb 14 19:27:32 UTC 2007


I have the impression that the point of the initial question was lost  
in this thread, spinning into mutability, etc.

Let me try to phrase it in another way:

'foo' = 'foo' 			true		"ok"
'foo' == 'foo' 			true		"NOT OK"

The underlying reason is that whenever I execute one of these  
expressions in a workspace, a method is created behind my back and  
then executed. In the case of comparing two strings, the compiler  
creates *a single literal for both strings*. This is plain wrong: a  
string is a collection of characters, and therefore these are two  
different instances of this collection that happen to have the same  
contents.

Now some more experiments:

Take any class (say a new class A). First add the following two methods:

foo
	^'foo'

foo2
	^'foo'

Now execute the following code:
A new foo == A new foo		"true ?!?!?!?!?!?!"
A new foo == A new foo2		"false"

To top it all of, add one more method:

isIdentical: arg1 to: arg2

	^arg1 == arg2

So consider the following now:
	A new isIdentical: A new foo with: A new foo2	"false"
	A new isIdentical: 'foo' to: 'foo'					"true"

I can only conclude that this is really not what you want.....

On 14 Feb 2007, at 14 February/18:33, stephane ducasse wrote:

> Do you have example?
> Because VW introduced immutable objects and I would like to educate  
> my taste on this topic.
>
>
> On 14 févr. 07, at 17:03, Lukas Renggli wrote:
>
>>> > Lesson: never modify string literals.
>>
>> Ohh god, how much I wish to have immutability on a per object bases.
>>
>> Cheers,
>> Lukas
>>
>> -- 
>> Lukas Renggli
>> http://www.lukas-renggli.ch
>>
>>
>
>




More information about the Squeak-dev mailing list