> On 12 Oct 2015, at 14:39, Sven Van Caekenberghe <[email protected]> wrote:
> 
>> 
>> On 12 Oct 2015, at 14:26, Esteban Lorenzano <[email protected] 
>> <mailto:[email protected]>> wrote:
>> 
>> Hi, 
>> 
>> I just spotted this:
>> 
>> 
>> Integer>>#putOn: aStream
>> 
>>      (aStream isBinary ifTrue: [ self asByteArray ] ifFalse: [ self 
>> asString]) putOn: aStream
> 
> IMO, this is not good, implicit (and inefficient) conversions are being done. 
> Why ?

I don’t know… I was just passing through :)

> 
> What is the exact contract of #putOn: anyway ?
> 
> If the result should really depend on the argument, double dispatch might be 
> better.
> 
>> It does not look so bad at the begining, but… if I do: 
>> 
>> ByteArray streamContents: [ :s | 42 putOn: s ]
>> 
>> I got an infinite loop.
>> 
>> I know, it does not look as a very typical case, but… if I’m writing to a 
>> Socket and I want to use 
>> 
>> mySocket << 255 “IAC”, that’s exactly what will happen :(
>> 
>> If I redefine it as: 
>> 
>> Integer>>#putOn: aStream
>>      aStream isBinary ifFalse: [ 
>>              self asString putOn: aStream.
>>              ^ self ].
>>      self asByteArray do: [ :each | aStream nextPut: each ]
>> 
>> then is ok… 
>> 
>> Would that be a good change?
> 
> Yeah that looks about right, still weird, but no weirder than before ;-)

I submitted a fix, still ugly but well… at least it avoids the infinite loop :P


> 
>> Esteban

Reply via email to