[squeak-dev] ByteArray>>at:put:

Eliot Miranda eliot.miranda at gmail.com
Thu Apr 26 14:16:32 UTC 2018


Hi Bert, Hi Marcel,

> On Apr 26, 2018, at 5:03 AM, Bert Freudenberg <bert at freudenbergs.de> wrote:
> 
>> On 26 April 2018 at 13:29, Bert Freudenberg <bert at freudenbergs.de> wrote:
> 
>>> On 26 April 2018 at 11:28, marcel.taeumel <Marcel.Taeumel at hpi.de> wrote:
>> 
>>> Hi, there.
>>> 
>>> I cannot put a ByteString into a ByteArray via a WriteStream anymore:
>>> 
>>> | s |
>>> s := WriteStream on: ByteArray new.
>>> s nextPutAll: 'hello'.
>>> 
>>> You need to do:
>>> 
>>> | s |
>>> s := WriteStream on: ByteArray new.
>>> s nextPutAll: 'hello' asByteArray.
>>> 
>>> This breaks code.
>>> 
>>> Best,
>>> Marcel
>> 
>> ​Tech​nically this is an expected error - you simply cannot put Characters (the elements of a String) into a ByteArray. However, for convenience we do support copying Strings into ByteArrays in various places, including WriteStream>>nextPutAll:.
>> 
>> However, the test in WriteStream>>nextPutAll: is too strict. It needs to be "collection class isBits" instead of "collection isString". This makes the code actually match its comment:
>> 
>> WriteStream>>nextPutAll: aCollection
>> 
>> 	| newEnd |
>> 	(collection class == aCollection class
>> 		or: [ collection class isBits
>> 			and: [ aCollection isString
>> 			and: [ collection class format = aCollection class format ] ] ]) "Let Strings with the same field size as collection take the quick route too."
>> 		ifFalse: [ ^ super nextPutAll: aCollection ].
>> 
>> 	newEnd := position + aCollection size.
>> 	newEnd > writeLimit ifTrue:
>> 		[self growTo: newEnd + 10].
>> 
>> 	collection replaceFrom: position+1 to: newEnd  with: aCollection startingAt: 1.
>> 	position := newEnd.
>> 	^aCollection​
>> 
>> With that change your example works. I think this was the original intent of the code.
>> 
>> Fixed in Collections-bf.787
>  
> ​PS: ​doing it this way ensures that you still get an error when you try to write a WideString into a ByteArray stream.
> 
> - Bert -

I agree with Sven:

> From: Sven Van Caekenberghe <sven at stfx.eu>
> Date: April 26, 2018 at 6:36:42 AM PDT
> To: Pharo Development List <pharo-dev at lists.pharo.org>
> Subject: Re: [Pharo-dev] Fwd: ByteArray>>at:put:
> Reply-To: Pharo Development List <pharo-dev at lists.pharo.org>
> 
>> On 26 Apr 2018, at 15:21, Sean P. DeNigris <sean at clipperadams.com> wrote:
>> 
>> Relevant to Pharo?
>> 
>> From http://forum.world.st/ByteArray-at-put-tp4955848.html :
> 
> We don't (want to) mix binary and character collections or streams. Going from one to the other is called encoding and decoding, it has to be done while being conscious of which encoding you are using. Sending #asByteArray to a String or #asString to a ByteArray is dangerous, lazy and wrong (in most cases), especially in an international context.

So I would rather see an error or a convenience method such as nextPutAllBits: which does what the above does (implicitly convert) but is explicit.  (ByteArray new: 5) writeStream nextPutAll: #[1 2 3 4 5] and (ByteString new: 5) nextPutAll: 'hello' should both raise an error (only the last does), as should (ByteArray new: 5) writeStream nextPut: $!.  (ByteString new: 5) nextPut: 33 does.  At least these operations should be consistent and symmetrical.  Right now nextPut: is consistent with nextPutAll: but String<-Integer is not symmetric with ByteArray<-Character.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.squeakfoundation.org/pipermail/squeak-dev/attachments/20180426/c79724aa/attachment.html>


More information about the Squeak-dev mailing list