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

H. Hirzel hannes.hirzel at gmail.com
Mon Apr 30 02:13:36 UTC 2018


On 4/26/18, Eliot Miranda <eliot.miranda at gmail.com> wrote:
> 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.
+1
(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.


More information about the Squeak-dev mailing list