On 26 April 2018 at 11:28, marcel.taeumel <Marcel.Taeumel@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

- Bert -