[Cuis-dev] ReferenceStreams with SmallIntegers in Cuis 7.5_7601 and Squeak 6.1a_23331 not yet compatible
H. Hirzel
hannes.hirzel at gmail.com
Wed Sep 24 06:52:42 PDT 2025
Hi
The new change set
7600-ReferenceStream-Compatibility-JuanVuletich-2025Sep22-09h46m-jmv.003.cs.st
does not yet re-establish the compatibily for ReferenceStreams as far as
SmallIntegers are concerned.
Individually Cuis
[3]
````
ReferenceStreamTest new testSmallIntegers.
````
and Squeak [4] pass with the test values given in the Cuis BaseImageTest
package for ReferenceStreams.
What the Cuis change set
7600-ReferenceStream-Compatibility-JuanVuletich-2025Sep22-09h46m-jmv.003.cs.st
does not provide yet is that the object file written in Squeak may be read
in Cuis 7.5_7601 [5].
Integers in the test array positions 6 to 11 are restored as
LargePositiveInteger or LargeNegativeInteger values.
In Squeak 6.1.a these values are restored as SmallInteger values, the way
they were written.
--Hannes
Attachements: anArrayOfSmallIntegersFromSqueak.obj and
Cuis test
which provides the log in [5]
## [3] ReferenceStreamTest new testSmallIntegers
(from Cuis package BaseImageTests)
````
testSmallIntegers
"
ReferenceStreamTest new testSmallIntegers
"
| newInstance oldInstance |
oldInstance := {-1. 0 . 1. 123456. -123456. 1234567890. -1234567890.
123456789012345678. -123456789012345678. (2 raisedTo: 60)-1. (2 raisedTo:
60) negated }.
newInstance := ReferenceStream unStream: (ReferenceStream
streamedRepresentationOf: oldInstance).
self assert: newInstance = oldInstance.
````
## [4] Test Serializing integer values with ReferenceStream in Squeak 6.1a
````
"Squeak6.1alpha latest update: #23331"
"Test also passes in Squeak5.3 latest update: #19459"
objectToSave := {-1. 0 . 1. 123456. -123456. 1234567890. -1234567890.
123456789012345678. -123456789012345678. (2 raisedTo: 60)-1. (2 raisedTo:
60) negated }.
fileStream := ReferenceStream fileNamed:
'anArrayOfSmallIntegersFromSqueak.obj'.
fileStream nextPut: objectToSave.
fileStream close.
rr := ReferenceStream fileNamed: 'anArrayOfSmallIntegersFromSqueak.obj'.
restoredObject := rr next.
rr close.
objectToSave = restoredObject
true
"Note:
SmallInteger maxVal 1152921504606846975"
````
## [5] Restore in Cuis
````
"Cuis 7.5_6001"
testSmallIntegersFromSqueak
"
ReferenceStreamTest new testSmallIntegersFromSqueak
"
| newInstanceCuis oldInstance newInstanceSqueak i |
oldInstance := {-1. 0 . 1. 123456. -123456. 1234567890. -1234567890.
123456789012345678. -123456789012345678. (2 raisedTo: 60)-1. (2 raisedTo:
60) negated }.
newInstanceCuis := ReferenceStream unStream: (ReferenceStream
streamedRepresentationOf: oldInstance).
self assert: newInstanceCuis = oldInstance.
newInstanceSqueak := ReferenceStream restoreFromFile:
('anArrayOfSmallIntegersFromSqueak.obj' asFileEntry).
i := 1.
newInstanceCuis do: [:item | |itemSq|
itemSq := (newInstanceSqueak at: i). Transcript show: i printString, ' ';
show: item printString, ' '; show: (item = itemSq); show: ' Cuis class=',
item class printString; show: ' Squeak class=', itemSq class
printString;cr. i := i + 1].
self assert: newInstanceSqueak = oldInstance.
````
Log in Transcript
````
1 -1 true Cuis class=SmallInteger; Restored from Squeak class=SmallInteger
2 0 true Cuis class=SmallInteger; Restored from Squeak class=SmallInteger
3 1 true Cuis class=SmallInteger; Restored from Squeak class=SmallInteger
4 123456 true Cuis class=SmallInteger; Restored from Squeak
class=SmallInteger
5 -123456 true Cuis class=SmallInteger; Restored from Squeak
class=SmallInteger
6 1234567890 false Cuis class=SmallInteger; Restored from Squeak
class=LargePositiveInteger
7 -1234567890 false Cuis class=SmallInteger; Restored from Squeak
class=LargeNegativeInteger
8 123456789012345678 false Cuis class=SmallInteger; Restored from Squeak
class=LargePositiveInteger
9 -123456789012345678 false Cuis class=SmallInteger; Restored from Squeak
class=LargeNegativeInteger
10 1152921504606846975 false Cuis class=SmallInteger; Restored from Squeak
class=LargePositiveInteger
11 -1152921504606846976 false Cuis class=SmallInteger; Restored from Squeak
class=LargeNegativeInteger
ReferenceStreamTest>>#testSmallIntegersFromSqueak -- Assertion (2) failed.
TestFailure: Assertion (2) failed.
````
On Wed, Sep 24, 2025 at 3:31 AM Juan Vuletich via Cuis-dev <
cuis-dev at lists.cuis.st> wrote:
> Hi Nicolas,
>
> Oh gosh! #objectForDataStream: I didn't see that coming! I only saw
> #readInteger and #writeInteger: in Squeak and assumed Squeak was broken.
> And didn't try it before opening my mouth. Apologies for my ill informed
> and rude comment.
>
> It was only Cuis that was broken until last week WRT this.
>
> WRT compatibility between Squeak and Cuis wrt DataStream, a lot of content
> is compatible. Larger SmallIntegers written in Squeak (as LargeIntegers)
> will be read correctly in Cuis. But those written in Cuis will use a new
> TypeMap entry with code 25 that uses two 32 bit words. I prefer this
> approach, because I want to be able to load DataStreams that don't have any
> LargeIntegers into small bootstrapped images that don't include
> LargeIntegers at all. The 'minimal kernel' images I'm building haven't seen
> need for LargeIntegers yet, and so I prefer not to include them, and keep
> them in a separate pre-compiled "dynamic cuis library". The "25" format is
> easy to add to Squeak, at least for reading, though.
>
> But I'm pretty sure there are incompatibilities in Character,
> UnicodeString and UnicodeSymbol. Floats and Byte-Strings seem to be OK.
>
> If you want to collaborate with me on keeping DataStream as compatible as
> possible (Morphs are out of the question, I guess!), and are willing to
> make minor tweaks for Squeak, I'm willing to make them for Cuis as needed.
>
> Thanks!
> On 23/09/2025 6:11 PM, Nicolas Cellier via Cuis-dev wrote:
>
> Hi Juan,
> I fail to see the bug in current Squeak trunk.
> I tried this
>
> | int out file |
> int := SmallInteger maxVal.
> file *:=* FileStream fileNamed: 'Test-Int'.
> file binary.
> (DataStream on: file) nextPut: int.
> file close.
>
> file *:=* FileStream fileNamed: 'Test-Int'.
> file binary.
> out *:=* (DataStream on: file) next.
> file close.
>
> self assert: int = out
>
> The large SmallInteger is restored correctly.
> This is because we find this method timestamped from 2015:
>
> *SmallInteger>>objectForDataStream:* refStrm
> *"In a 64-bit Spur VM, we may have to fake 32-bit SmallIntegers for
> compatibility."*
>
> | large |
> self > 16r3FFFFFFF ifTrue: [
> large *:=* LargePositiveInteger new: self digitLength neg: false.
> 1 to: self digitLength do: [:i | large digitAt: i put: (self
> digitAt: i)].
> ^large].
> self < -16r40000000 ifTrue: [
> large *:=* LargeNegativeInteger new: self digitLength neg: true.
> 1 to: self digitLength do: [:i | large digitAt: i put: (self
> digitAt: i)].
> ^large].
> ^ self
>
> Did I overlook something?
> I hope that Cuis and Squeak DataStream will remain consistent after your
> latest changes
>
> Nicolas
>
> Le lun. 22 sept. 2025 à 15:45, Juan Vuletich via Cuis-dev <
> cuis-dev at lists.cuis.st> a écrit :
>
>> Hi,
>> On 22/09/2025 10:10 AM, H. Hirzel via Cuis-dev wrote:
>>
>> I could identify the change set which causes the problem, it is from last
>> Wednesday
>>
>> CoreUpdates\
>> 7580-ReferenceStream-61BitSmallIntegers-fix-JuanVuletich-2025Sep17-08h16m-jmv.001.cs.st
>>
>> It introduces a new version of #readInteger and writeInteger: in the
>> class DataStream.
>> If I undo the change of this change set it works.
>>
>> --Hannes
>>
>>
>> As you saw in that changeset (file name, comments in code, commit
>> message), and as exemplified in the test added to BaseImageTests shortly
>> after, what that code does is not to cause a problem, but to fix a serious
>> bug that has been around for a long time and that is still present in
>> Squeak. Just try to serialize an object with a largish SmallInteger and see
>> what you get back.
>>
>> Anyway. I just pushed a better implementation that uses a different
>> format for 32bit SmallIntegers than from larger ones. This brings back
>> compatibility with the badly broken Squeak format, although it obviously
>> can't bring back the bits that Squeak discarded when saving the file, and
>> results will be wrong unless you're lucky enough to only use small
>> SmallIntegers.
>>
>>
>>
>>
>>
>>
>>
>>
>> On Mon, Sep 22, 2025 at 2:36 PM H. Hirzel <hannes.hirzel at gmail.com>
>> wrote:
>>
>>> I am currently identifying which change set causes the problem.
>>> So far Cuis update 7523 still works.
>>>
>>> This means if I produce a file ' aDictWithByteArraysFromSq.obj' in
>>> Squeak I can read it in Cuis 7523
>>>
>>> So the problem has been introduced in one of the last 60 updates.
>>>
>>>
>>> "Squeak"
>>>> dict := Dictionary new.
>>>> dict at: 1 put: #[1 2 3 4].
>>>> dict at: 2 put: #[5 6 7 8].
>>>> dict at: 3 put: #[10 20 30 40].
>>>>
>>>> fileStream := ReferenceStream fileNamed:
>>>> 'aDictWithByteArraysFromSq.obj'.
>>>> objectToSave := dict.
>>>> fileStream nextPut: objectToSave.
>>>> fileStream close
>>>>
>>>>
>>>
>>>> "-----------------------------------------------"
>>>> "Restore in Cuis"
>>>> ReferenceStream restoreFromFile: ('aDictWithByteArraysFromSq.obj'
>>>> asFileEntry).
>>>>
>>>> "Result
>>>> OK in Cuis 7523
>>>> NOT OK in Cuis 7584"
>>>>
>>>>
>> --
>> Juan Vuletichwww.cuis.stgithub.com/jvuletichresearchgate.net/profile/Juan-Vuletichindependent.academia.edu/JuanVuletichpatents.justia.com/inventor/juan-manuel-vuletich
>>
>> --
>> Cuis-dev mailing list
>> Cuis-dev at lists.cuis.st
>> https://lists.cuis.st/mailman/listinfo/cuis-dev
>>
>
> --
> Juan Vuletichwww.cuis.stgithub.com/jvuletichresearchgate.net/profile/Juan-Vuletichindependent.academia.edu/JuanVuletichpatents.justia.com/inventor/juan-manuel-vuletich
>
> --
> Cuis-dev mailing list
> Cuis-dev at lists.cuis.st
> https://lists.cuis.st/mailman/listinfo/cuis-dev
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.cuis.st/mailman/archives/cuis-dev/attachments/20250924/d4a0c740/attachment-0001.htm>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: anArrayOfSmallIntegersFromSqueak.obj
Type: application/octet-stream
Size: 300 bytes
Desc: not available
URL: <http://lists.cuis.st/mailman/archives/cuis-dev/attachments/20250924/d4a0c740/attachment-0002.obj>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: ReferenceStreamTest-testSmallIntegersFromSqueak.st
Type: application/octet-stream
Size: 1100 bytes
Desc: not available
URL: <http://lists.cuis.st/mailman/archives/cuis-dev/attachments/20250924/d4a0c740/attachment-0003.obj>
More information about the Cuis-dev
mailing list