<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
</head>
<body>
<p>Hi Hannes,</p>
<p>Please try adding this to LargePositiveInteger</p>
<p> comeFullyUpOnReload: smartRefStream</p>
<p> ^self normalize</p>
<p>I think this should fix the result, converting back to
SmallInteger.</p>
<p>Thanks,</p>
<div class="moz-cite-prefix">On 24/09/2025 10:52 AM, H. Hirzel via
Cuis-dev wrote:<br>
</div>
<blockquote type="cite"
cite="mid:CAGQxfVgy92wyOMyj0s9Rg_-+Wavc1gKvBEtudpn5QjerswF+=Q@mail.gmail.com">
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<div dir="ltr">
<div>Hi <br>
<br>
The new change set <br>
<a
href="http://7600-ReferenceStream-Compatibility-JuanVuletich-2025Sep22-09h46m-jmv.003.cs.st"
moz-do-not-send="true">7600-ReferenceStream-Compatibility-JuanVuletich-2025Sep22-09h46m-jmv.003.cs.st</a><br>
does not yet re-establish the compatibily for ReferenceStreams
as far as SmallIntegers are concerned.<br>
<br>
Individually Cuis<br>
[3] <br>
````<br>
ReferenceStreamTest new testSmallIntegers.<br>
````<br>
<br>
and Squeak [4] pass with the test values given in the Cuis
BaseImageTest package for ReferenceStreams.<br>
<br>
What the Cuis change set <br>
<a
href="http://7600-ReferenceStream-Compatibility-JuanVuletich-2025Sep22-09h46m-jmv.003.cs.st"
moz-do-not-send="true">7600-ReferenceStream-Compatibility-JuanVuletich-2025Sep22-09h46m-jmv.003.cs.st</a><br>
does not provide yet is that the object file written in Squeak
may be read in Cuis 7.5_7601 [5].<br>
Integers in the test array positions 6 to 11 are restored as
LargePositiveInteger or LargeNegativeInteger values.<br>
In Squeak 6.1.a these values are restored as SmallInteger
values, the way they were written.<br>
<br>
--Hannes<br>
</div>
<div><br>
</div>
<div>Attachements: anArrayOfSmallIntegersFromSqueak.obj and</div>
<div>Cuis test <br>
</div>
<div>which provides the log in [5]<br>
</div>
<div><br>
## [3] ReferenceStreamTest new testSmallIntegers<br>
(from Cuis package BaseImageTests)<br>
````<br>
testSmallIntegers<br>
"<br>
ReferenceStreamTest new testSmallIntegers<br>
"<br>
| newInstance oldInstance |<br>
oldInstance := {-1. 0 . 1. 123456. -123456. 1234567890.
-1234567890. 123456789012345678. -123456789012345678. (2
raisedTo: 60)-1. (2 raisedTo: 60) negated }.<br>
newInstance := ReferenceStream unStream: (ReferenceStream
streamedRepresentationOf: oldInstance).<br>
self assert: newInstance = oldInstance.<br>
````<br>
<br>
<br>
## [4] Test Serializing integer values with ReferenceStream in
Squeak 6.1a<br>
<br>
````<br>
"Squeak6.1alpha latest update: #23331"<br>
"Test also passes in Squeak5.3 latest update: #19459"<br>
objectToSave := {-1. 0 . 1. 123456. -123456. 1234567890.
-1234567890. 123456789012345678. -123456789012345678. (2
raisedTo: 60)-1. (2 raisedTo: 60) negated }.<br>
<br>
fileStream := ReferenceStream fileNamed:
'anArrayOfSmallIntegersFromSqueak.obj'.<br>
fileStream nextPut: objectToSave.<br>
fileStream close.<br>
<br>
rr := ReferenceStream fileNamed:
'anArrayOfSmallIntegersFromSqueak.obj'.<br>
restoredObject := rr next.<br>
rr close.<br>
<br>
<br>
<br>
objectToSave = restoredObject<br>
true <br>
<br>
<br>
"Note:<br>
SmallInteger maxVal 1152921504606846975"<br>
````<br>
<br>
## [5] Restore in Cuis<br>
````<br>
"Cuis 7.5_6001"<br>
<br>
testSmallIntegersFromSqueak<br>
"<br>
ReferenceStreamTest new testSmallIntegersFromSqueak<br>
"<br>
| newInstanceCuis oldInstance newInstanceSqueak i |<br>
oldInstance := {-1. 0 . 1. 123456. -123456. 1234567890.
-1234567890. 123456789012345678. -123456789012345678. (2
raisedTo: 60)-1. (2 raisedTo: 60) negated }.<br>
newInstanceCuis := ReferenceStream unStream: (ReferenceStream
streamedRepresentationOf: oldInstance).<br>
self assert: newInstanceCuis = oldInstance.<br>
<br>
newInstanceSqueak := ReferenceStream restoreFromFile:
('anArrayOfSmallIntegersFromSqueak.obj' asFileEntry).<br>
<br>
i := 1.<br>
newInstanceCuis do: [:item | |itemSq|<br>
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].<br>
<br>
self assert: newInstanceSqueak = oldInstance.<br>
<br>
````<br>
<br>
Log in Transcript<br>
````<br>
1 -1 true Cuis class=SmallInteger; Restored from Squeak
class=SmallInteger<br>
2 0 true Cuis class=SmallInteger; Restored from Squeak
class=SmallInteger<br>
3 1 true Cuis class=SmallInteger; Restored from Squeak
class=SmallInteger<br>
4 123456 true Cuis class=SmallInteger; Restored from Squeak
class=SmallInteger<br>
5 -123456 true Cuis class=SmallInteger; Restored from Squeak
class=SmallInteger<br>
6 1234567890 false Cuis class=SmallInteger; Restored from
Squeak class=LargePositiveInteger<br>
7 -1234567890 false Cuis class=SmallInteger; Restored from
Squeak class=LargeNegativeInteger<br>
8 123456789012345678 false Cuis class=SmallInteger; Restored
from Squeak class=LargePositiveInteger<br>
9 -123456789012345678 false Cuis class=SmallInteger; Restored
from Squeak class=LargeNegativeInteger<br>
10 1152921504606846975 false Cuis class=SmallInteger; Restored
from Squeak class=LargePositiveInteger<br>
11 -1152921504606846976 false Cuis class=SmallInteger;
Restored from Squeak class=LargeNegativeInteger<br>
<br>
ReferenceStreamTest>>#testSmallIntegersFromSqueak --
Assertion (2) failed. TestFailure: Assertion (2) failed. <br>
<br>
````</div>
<div dir="ltr"><br>
</div>
<div dir="ltr"><br>
</div>
<br>
<div class="gmail_quote gmail_quote_container">
<div dir="ltr" class="gmail_attr">On Wed, Sep 24, 2025 at
3:31 AM Juan Vuletich via Cuis-dev <<a
href="mailto:cuis-dev@lists.cuis.st"
moz-do-not-send="true" class="moz-txt-link-freetext">cuis-dev@lists.cuis.st</a>>
wrote:<br>
</div>
<blockquote class="gmail_quote"
style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
<div>
<p>Hi Nicolas,</p>
<p>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.</p>
<p>It was only Cuis that was broken until last week WRT
this.</p>
<p>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.</p>
<p>But I'm pretty sure there are incompatibilities in
Character, UnicodeString and UnicodeSymbol. Floats and
Byte-Strings seem to be OK.</p>
<p>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.</p>
<p>Thanks!</p>
<div>On 23/09/2025 6:11 PM, Nicolas Cellier via Cuis-dev
wrote:<br>
</div>
<blockquote type="cite">
<div dir="ltr">
<div>
<div>
<div>
<div>
<div>Hi Juan,<br>
</div>
I fail to see the bug in current Squeak trunk.<br>
</div>
I tried this<br>
<br>
| int out file |<br>
int := SmallInteger maxVal.<font
color="#000000"><br>
</font><font color="#6B6B6B">file</font><font
color="#000000"> </font><b>:=</b><font
color="#000000"> </font><font color="#000000">FileStream</font><font
color="#000000"> </font><font color="#000080">fileNamed:</font><font
color="#000000"> </font><font color="#800080">'Test-Int'</font><font
color="#000000">.</font><font color="#000000"><br>
</font><font color="#6B6B6B">file</font><font
color="#000000"> </font><font color="#000080">binary</font><font
color="#000000">.</font><font color="#000000"><br>
</font><font color="#000000">(</font><font
color="#000000">DataStream</font><font
color="#000000"> </font><font color="#000080">on:</font><font
color="#000000"> </font><font color="#6B6B6B">file</font><font
color="#000000">)</font><font color="#000000">
</font><font color="#000080">nextPut:</font><font
color="#000000"> </font><font color="#000080">int</font><font
color="#000000">.</font><font color="#000000"><br>
</font><font color="#6B6B6B">file</font><font
color="#000000"> </font><font color="#000080">close</font><font
color="#000000">.</font><font color="#000000"><br>
<br>
</font><font color="#6B6B6B">file</font><font
color="#000000"> </font><b>:=</b><font
color="#000000"> </font><font color="#000000">FileStream</font><font
color="#000000"> </font><font color="#000080">fileNamed:</font><font
color="#000000"> </font><font color="#800080">'Test-Int'</font><font
color="#000000">.</font><font color="#000000"><br>
</font><font color="#6B6B6B">file</font><font
color="#000000"> </font><font color="#000080">binary</font><font
color="#000000">.</font><font color="#000000"><br>
</font><font color="#6B6B6B">out</font><font
color="#000000"> </font><b>:=</b><font
color="#000000"> </font><font color="#000000">(</font><font
color="#000000">DataStream</font><font
color="#000000"> </font><font color="#000080">on:</font><font
color="#000000"> </font><font color="#6B6B6B">file</font><font
color="#000000">)</font><font color="#000000">
</font><font color="#000080">next</font><font
color="#000000">.</font><font color="#000000"><br>
</font><font color="#6B6B6B">file</font><font
color="#000000"> </font><font color="#000080">close</font><font
color="#000000">.</font><font color="#000000"><br>
<br>
self assert: int = out<br>
<br>
</font></div>
<font color="#000000">The large SmallInteger is
restored correctly.<br>
</font></div>
<font color="#000000">This is because we find this
method timestamped from 2015:<br>
<br>
</font><b>SmallInteger>>objectForDataStream:</b><font
color="#000000"> </font><font color="#000080">refStrm</font><font
color="#000000"><br>
</font><font color="#008080"><i>"In a 64-bit
Spur VM, we may have to fake 32-bit
SmallIntegers for compatibility."</i></font><font
color="#000000"><br>
<br>
</font><font color="#808080">|</font><font
color="#000000"> </font><font color="#6B6B6B">large</font><font
color="#000000"> </font><font color="#808080">|</font><font
color="#000000"><br>
</font><font color="#800000">self</font><font
color="#000000"> </font><font color="#000080">></font><font
color="#000000"> </font><font color="#800000">16r3FFFFFFF</font><font
color="#000000"> </font><font color="#000080">ifTrue:</font><font
color="#000000"> </font><font color="#000000">[</font><font
color="#000000"><br>
</font><font color="#6B6B6B">large</font><font
color="#000000"> </font><b>:=</b><font
color="#000000"> </font><font color="#000000">LargePositiveInteger</font><font
color="#000000"> </font><font color="#000080">new:</font><font
color="#000000"> </font><font color="#800000">self</font><font
color="#000000"> </font><font color="#000080">digitLength</font><font
color="#000000"> </font><font color="#000080">neg:</font><font
color="#000000"> </font><font color="#800000">false</font><font
color="#000000">.</font><font color="#000000"><br>
</font><font color="#800000">1</font><font
color="#000000"> </font><font color="#000080">to:</font><font
color="#000000"> </font><font color="#800000">self</font><font
color="#000000"> </font><font color="#000080">digitLength</font><font
color="#000000"> </font><font color="#000080">do:</font><font
color="#000000"> </font><font color="#008000">[</font><font
color="#000000">:</font><font color="#000080">i</font><font
color="#000000"> </font><font color="#808080">|</font><font
color="#000000"> </font><font color="#6B6B6B">large</font><font
color="#000000"> </font><font color="#000080">digitAt:</font><font
color="#000000"> </font><font color="#000080">i</font><font
color="#000000"> </font><font color="#000080">put:</font><font
color="#000000"> </font><font color="#800080">(</font><font
color="#800000">self</font><font color="#000000">
</font><font color="#000080">digitAt:</font><font
color="#000000"> </font><font color="#000080">i</font><font
color="#800080">)</font><font color="#008000">]</font><font
color="#000000">.</font><font color="#000000"><br>
</font><font color="#800000">^</font><font
color="#6B6B6B">large</font><font color="#000000">]</font><font
color="#000000">.</font><font color="#000000"><br>
</font><font color="#800000">self</font><font
color="#000000"> </font><font color="#000080"><</font><font
color="#000000"> </font><font color="#800000">-</font><font
color="#800000">16r40000000</font><font
color="#000000"> </font><font color="#000080">ifTrue:</font><font
color="#000000"> </font><font color="#000000">[</font><font
color="#000000"><br>
</font><font color="#6B6B6B">large</font><font
color="#000000"> </font><b>:=</b><font
color="#000000"> </font><font color="#000000">LargeNegativeInteger</font><font
color="#000000"> </font><font color="#000080">new:</font><font
color="#000000"> </font><font color="#800000">self</font><font
color="#000000"> </font><font color="#000080">digitLength</font><font
color="#000000"> </font><font color="#000080">neg:</font><font
color="#000000"> </font><font color="#800000">true</font><font
color="#000000">.</font><font color="#000000"><br>
</font><font color="#800000">1</font><font
color="#000000"> </font><font color="#000080">to:</font><font
color="#000000"> </font><font color="#800000">self</font><font
color="#000000"> </font><font color="#000080">digitLength</font><font
color="#000000"> </font><font color="#000080">do:</font><font
color="#000000"> </font><font color="#008000">[</font><font
color="#000000">:</font><font color="#000080">i</font><font
color="#000000"> </font><font color="#808080">|</font><font
color="#000000"> </font><font color="#6B6B6B">large</font><font
color="#000000"> </font><font color="#000080">digitAt:</font><font
color="#000000"> </font><font color="#000080">i</font><font
color="#000000"> </font><font color="#000080">put:</font><font
color="#000000"> </font><font color="#800080">(</font><font
color="#800000">self</font><font color="#000000">
</font><font color="#000080">digitAt:</font><font
color="#000000"> </font><font color="#000080">i</font><font
color="#800080">)</font><font color="#008000">]</font><font
color="#000000">.</font><font color="#000000"><br>
</font><font color="#800000">^</font><font
color="#6B6B6B">large</font><font color="#000000">]</font><font
color="#000000">.</font><font color="#000000"><br>
</font><font color="#800000">^</font><font
color="#000000"> </font><font color="#800000">self</font>
<div><font color="#000000"><br>
</font></div>
<div><font color="#000000">Did I overlook something?</font></div>
<font color="#000000">I hope that Cuis and Squeak
DataStream will remain consistent after your
latest changes<br>
<br>
</font></div>
<font color="#000000">Nicolas</font></div>
<br>
<div class="gmail_quote">
<div dir="ltr" class="gmail_attr">Le lun. 22 sept.
2025 à 15:45, Juan Vuletich via Cuis-dev <<a
href="mailto:cuis-dev@lists.cuis.st"
target="_blank" moz-do-not-send="true"
class="moz-txt-link-freetext">cuis-dev@lists.cuis.st</a>>
a écrit :<br>
</div>
<blockquote class="gmail_quote"
style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
<div>
<p>Hi,</p>
<div>On 22/09/2025 10:10 AM, H. Hirzel via
Cuis-dev wrote:<br>
</div>
<blockquote type="cite">
<div dir="ltr">
<div>I could identify the change set which
causes the problem, it is from last
Wednesday<br>
</div>
<div><br>
</div>
<div>CoreUpdates\<a
href="http://7580-ReferenceStream-61BitSmallIntegers-fix-JuanVuletich-2025Sep17-08h16m-jmv.001.cs.st"
target="_blank" moz-do-not-send="true">7580-ReferenceStream-61BitSmallIntegers-fix-JuanVuletich-2025Sep17-08h16m-jmv.001.cs.st</a></div>
<div><br>
</div>
<div>It introduces a new version of
#readInteger and writeInteger: in the class
DataStream.</div>
<div>If I undo the change of this change set
it works.</div>
<div><br>
</div>
<div>--Hannes<br>
</div>
</div>
</blockquote>
<p><br>
</p>
<p>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.</p>
<p>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.</p>
<p><br>
</p>
<blockquote type="cite">
<div dir="ltr">
<div><br>
</div>
<div><br>
</div>
<div><br>
</div>
<div><br>
</div>
<div><br>
</div>
</div>
<br>
<div class="gmail_quote">
<div dir="ltr" class="gmail_attr">On Mon, Sep
22, 2025 at 2:36 PM H. Hirzel <<a
href="mailto:hannes.hirzel@gmail.com"
target="_blank" moz-do-not-send="true"
class="moz-txt-link-freetext">hannes.hirzel@gmail.com</a>>
wrote:<br>
</div>
<blockquote class="gmail_quote"
style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
<div dir="ltr">
<div>I am currently identifying which
change set causes the problem.</div>
<div>So far Cuis update 7523 still works.<br>
</div>
<div><br>
</div>
<div>This means if I produce a file '
aDictWithByteArraysFromSq.obj' in Squeak
I can read it in Cuis 7523</div>
<div><br>
</div>
<div>So the problem has been introduced in
one of the last 60 updates.</div>
<div><br>
</div>
<div><br>
</div>
<div class="gmail_quote">
<blockquote class="gmail_quote"
style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
<div dir="ltr">
<div>"Squeak"<br>
dict := Dictionary new.<br>
dict at: 1 put: #[1 2 3 4].<br>
dict at: 2 put: #[5 6 7 8].<br>
dict at: 3 put: #[10 20 30 40].<br>
<br>
fileStream := ReferenceStream
fileNamed:
'aDictWithByteArraysFromSq.obj'.<br>
objectToSave := dict.<br>
fileStream nextPut: objectToSave.<br>
fileStream close</div>
<div><br>
</div>
</div>
</blockquote>
<div> </div>
<blockquote class="gmail_quote"
style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
<div dir="ltr">
<div>"-----------------------------------------------"<br>
</div>
<div>"Restore in Cuis"<br>
</div>
<div>ReferenceStream
restoreFromFile:
('aDictWithByteArraysFromSq.obj'
asFileEntry).<br>
<br>
"Result<br>
OK in Cuis 7523<br>
NOT OK in Cuis 7584"</div>
<div><br>
</div>
</div>
</blockquote>
</div>
</div>
</blockquote>
</div>
<br>
<fieldset></fieldset>
</blockquote>
<pre cols="72">--
Juan Vuletich
<a href="http://www.cuis.st" target="_blank" moz-do-not-send="true">www.cuis.st</a>
<a href="http://github.com/jvuletich" target="_blank"
moz-do-not-send="true">github.com/jvuletich</a>
<a href="http://researchgate.net/profile/Juan-Vuletich" target="_blank"
moz-do-not-send="true">researchgate.net/profile/Juan-Vuletich</a>
<a href="http://independent.academia.edu/JuanVuletich" target="_blank"
moz-do-not-send="true">independent.academia.edu/JuanVuletich</a>
<a href="http://patents.justia.com/inventor/juan-manuel-vuletich"
target="_blank" moz-do-not-send="true">patents.justia.com/inventor/juan-manuel-vuletich</a></pre>
</div>
-- <br>
Cuis-dev mailing list<br>
<a href="mailto:Cuis-dev@lists.cuis.st"
target="_blank" moz-do-not-send="true"
class="moz-txt-link-freetext">Cuis-dev@lists.cuis.st</a><br>
<a
href="https://lists.cuis.st/mailman/listinfo/cuis-dev" rel="noreferrer"
target="_blank" moz-do-not-send="true"
class="moz-txt-link-freetext">https://lists.cuis.st/mailman/listinfo/cuis-dev</a><br>
</blockquote>
</div>
<br>
<fieldset></fieldset>
</blockquote>
<pre cols="72">--
Juan Vuletich
<a href="http://www.cuis.st" target="_blank" moz-do-not-send="true">www.cuis.st</a>
<a href="http://github.com/jvuletich" target="_blank"
moz-do-not-send="true">github.com/jvuletich</a>
<a href="http://researchgate.net/profile/Juan-Vuletich" target="_blank"
moz-do-not-send="true">researchgate.net/profile/Juan-Vuletich</a>
<a href="http://independent.academia.edu/JuanVuletich" target="_blank"
moz-do-not-send="true">independent.academia.edu/JuanVuletich</a>
<a href="http://patents.justia.com/inventor/juan-manuel-vuletich"
target="_blank" moz-do-not-send="true">patents.justia.com/inventor/juan-manuel-vuletich</a></pre>
</div>
-- <br>
Cuis-dev mailing list<br>
<a href="mailto:Cuis-dev@lists.cuis.st" target="_blank"
moz-do-not-send="true" class="moz-txt-link-freetext">Cuis-dev@lists.cuis.st</a><br>
<a href="https://lists.cuis.st/mailman/listinfo/cuis-dev"
rel="noreferrer" target="_blank" moz-do-not-send="true"
class="moz-txt-link-freetext">https://lists.cuis.st/mailman/listinfo/cuis-dev</a><br>
</blockquote>
</div>
</div>
<br>
<fieldset class="moz-mime-attachment-header"></fieldset>
</blockquote>
<pre class="moz-signature" cols="72">--
Juan Vuletich
<a class="moz-txt-link-abbreviated" href="http://www.cuis.st">www.cuis.st</a>
github.com/jvuletich
researchgate.net/profile/Juan-Vuletich
independent.academia.edu/JuanVuletich
patents.justia.com/inventor/juan-manuel-vuletich</pre>
</body>
</html>