Hi, I just spotted this: Integer>>#putOn: aStream (aStream isBinary ifTrue: [ self asByteArray ] ifFalse: [ self asString]) putOn: aStream 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? Esteban
On 12 Oct 2015, at 14:26, Esteban Lorenzano <estebanlm@gmail.com> 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 ? 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 ;-)
Esteban
On 12 Oct 2015, at 14:39, Sven Van Caekenberghe <sven@stfx.eu> wrote:
On 12 Oct 2015, at 14:26, Esteban Lorenzano <estebanlm@gmail.com <mailto:estebanlm@gmail.com>> 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
participants (2)
-
Esteban Lorenzano -
Sven Van Caekenberghe