[Cuis-dev] ReferenceStream cannot read Dictionary object written with Squeak (was Re: ReferenceStream restoreFromFile: aFileEntry goes into infinite loop)
Juan Vuletich
juan at cuis.st
Tue Sep 23 18:31:08 PDT 2025
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*:=*FileStreamfileNamed:'Test-Int'.
> filebinary.
> (DataStreamon:file)nextPut:int.
> fileclose.
>
> file*:=*FileStreamfileNamed:'Test-Int'.
> filebinary.
> out*:=*(DataStreamon:file)next.
> fileclose.
>
> 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>16r3FFFFFFFifTrue:[
> large*:=*LargePositiveIntegernew:selfdigitLengthneg:false.
> 1to:selfdigitLengthdo:[:i|largedigitAt:iput:(selfdigitAt:i)].
> ^large].
> self<-16r40000000ifTrue:[
> large*:=*LargeNegativeIntegernew:selfdigitLengthneg:true.
> 1to:selfdigitLengthdo:[:i|largedigitAt:iput:(selfdigitAt: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
>> <http://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 Vuletich
> www.cuis.st <http://www.cuis.st>
> github.com/jvuletich <http://github.com/jvuletich>
> researchgate.net/profile/Juan-Vuletich <http://researchgate.net/profile/Juan-Vuletich>
> independent.academia.edu/JuanVuletich <http://independent.academia.edu/JuanVuletich>
> patents.justia.com/inventor/juan-manuel-vuletich <http://patents.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 Vuletich
www.cuis.st
github.com/jvuletich
researchgate.net/profile/Juan-Vuletich
independent.academia.edu/JuanVuletich
patents.justia.com/inventor/juan-manuel-vuletich
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.cuis.st/mailman/archives/cuis-dev/attachments/20250923/639fae7c/attachment.htm>
More information about the Cuis-dev
mailing list