Eliot Miranda uploaded a new version of Monticello to project The Trunk:
http://source.squeak.org/trunk/Monticello-eem.806.mcz
==================== Summary ====================
Name: Monticello-eem.806
Author: eem
Time: 12 February 2024, 2:16:55.744 pm
UUID: 450ea539-e238-4b2f-9f81-d2e0fa950ce7
Ancestors: Monticello-mt.805
Make sure class definitions are filed out correectly via fileOut ours/fileOut theirs from version difference browsers.
=============== Diff against Monticello-mt.805 ===============
Item was added:
+ ----- Method: MCClassDefinition>>fileOutOn: (in category 'printing') -----
+ fileOutOn: aStream
+ "File out the receiver's definition, metaclass definition, and class comment in chunk format.
+ Override to chunk all three elements."
+ (MCStWriter on: aStream) visitClassDefinition: self!
many thanks to Dave, Marcel, and Yannis for sorting this out—i can confirm that i am now able to receive the list at my colorado.edu address again.
great work folks!
hal
> On Feb 9, 2024, at 6:49 AM, squeak-dev-request(a)lists.squeakfoundation.org wrote:
>
> From: "Taeumel, Marcel" <Marcel.Taeumel(a)hpi.de <mailto:Marcel.Taeumel@hpi.de>>
> Subject: [squeak-dev] DKIM signing fixed
> Date: February 9, 2024 at 6:49:14 AM MST
> To: tim Rowledge via Squeak-dev <squeak-dev(a)lists.squeakfoundation.org <mailto:squeak-dev@lists.squeakfoundation.org>>, "vm-dev(a)lists.squeakfoundation.org <mailto:vm-dev@lists.squeakfoundation.org>" <vm-dev(a)lists.squeakfoundation.org <mailto:vm-dev@lists.squeakfoundation.org>>, "beginners(a)lists.squeakfoundation.org <mailto:beginners@lists.squeakfoundation.org>" <beginners(a)lists.squeakfoundation.org <mailto:beginners@lists.squeakfoundation.org>>
> Cc: "Hofmann, Yannis" <Yannis.Hofmann(a)student.hpi.uni-potsdam.de <mailto:Yannis.Hofmann@student.hpi.uni-potsdam.de>>
> Reply-To: The general-purpose Squeak developers list <squeak-dev(a)lists.squeakfoundation.org <mailto:squeak-dev@lists.squeakfoundation.org>>
>
>
> Hi all --
>
> Our admin volunteer Yannis (CC) fixed DKIM signing. Hooraaaay!
>
> Hopefully, more mail servers will now accept our list traffic again. :-)
>
> Best,
> Marcel
Marcel Taeumel uploaded a new version of MonticelloConfigurations to project The Trunk:
http://source.squeak.org/trunk/MonticelloConfigurations-mt.185.mcz
==================== Summary ====================
Name: MonticelloConfigurations-mt.185
Author: mt
Time: 12 February 2024, 4:54:34.878007 pm
UUID: ca6f400d-f79c-d34b-be8e-5c02cfb06f04
Ancestors: MonticelloConfigurations-mt.184
In the update dialog, slightly reformat the "New VM recommended" message to have current and new version numbers be on the same line. Make the current one bold as it is with the current build number above.
=============== Diff against MonticelloConfigurations-mt.184 ===============
Item was changed:
----- Method: MCMcmUpdater>>updateMessageFor: (in category 'private') -----
updateMessageFor: previousUpdateLevel
| ciTemplate ciStamp |
ciTemplate := '<br>CI status: <a href="{8}"><img src="{7}" /> {9}</{10}>'.
ciStamp := SystemVersion current ciStatusTimestamp
ifNil: [SystemVersion current isRelease
ifTrue: [ciTemplate := '' "Drop outdated/unavailable CI info for releases"]
ifFalse: ['(build inaccessible!!)' translated]].
^ ('Update completed.<br><br>Version: {1}<br>Update: {3}<b>{2}</b><br><br>Url: <a href="{4}">{4}</{10}><br>Map: ''{5}''', ciTemplate, '{6}{11}' translated format: {
SystemVersion current version escapeEntities.
SystemVersion current highestUpdate.
(previousUpdateLevel = SystemVersion current highestUpdate
ifTrue: ['']
ifFalse: [previousUpdateLevel asString, ' -> ']) escapeEntities.
self repository escapeEntities.
MCMcmUpdater updateMapName escapeEntities.
SystemVersion current description ifEmpty: [''] ifNotEmpty: [:d |
'<br><br><font face="{2}" size="{3}">{1}</font>'
format: {
d escapeEntities.
Preferences standardButtonFont familyName.
Preferences standardButtonFont pointSize.
}].
SystemVersion current ciStatusBadgeUrl.
SystemVersion current ciStatusPageUrl.
ciStamp.
"mt: Avoid triggering the Windows Defender. See http://lists.squeakfoundation.org/pipermail/squeak-dev/2021-December/217346…"
'a'.
SystemVersion current recommendedVMUpdateInfo ifNil: [''] ifNotNil: [:info |
+ '<font face="{5}" size="{6}"><br><br>A newer VM is recommended. Visit the <a href="{3}">project page</{4}> to download it. Manual image save, quit, and restart will be required.<br><b>{1}</b> -> {2}</font>' translated
- '<font face="{5}" size="{6}"><br><br>A newer VM is recommended ({1} -> {2})!! Visit the <a href="{3}">project page</{4}> to download it.</font>' translated
format: {
info key.
info value.
SystemVersion current vmUpdateURL.
'a'. "avoid Windows Defender again"
Preferences standardButtonFont familyName.
Preferences standardButtonFont pointSize
}]
}) asTextFromHtml!
Vanessa Freudenberg uploaded a new version of System to project The Trunk:
http://source.squeak.org/trunk/System-codefrau.1446.mcz
==================== Summary ====================
Name: System-codefrau.1446
Author: codefrau
Time: 10 February 2024, 5:09:57.063937 pm
UUID: 52c0d3db-d7c2-49b0-89ae-9dcba8aa1c60
Ancestors: System-ct.1445
Fix VM vmUpdateURL
=============== Diff against System-ct.1445 ===============
Item was changed:
----- Method: SystemVersion>>recommendedVMBuildNumber (in category 'accessing') -----
recommendedVMBuildNumber
+ "This is used to construct #vmUpdateURL, make sure the release actually exists"
-
^ 202312181441!
Item was changed:
----- Method: SystemVersion>>vmUpdateURL (in category 'accessing') -----
vmUpdateURL
+ ^ 'https://github.com/OpenSmalltalk/opensmalltalk-vm/releases/tag/', self recommendedVMBuildNumber!
- ^ 'https://github.com/OpenSmalltalk/opensmalltalk-vm/releases/tag/202206021410'!
Hi all --
Our admin volunteer Yannis (CC) fixed DKIM signing. Hooraaaay!
Hopefully, more mail servers will now accept our list traffic again. :-)
Best,
Marcel
Recipe for a disaster:
| window |
MCWorkingCopyBrowser open.
window := ToolSet inspect: DependentsFields.
window model selectionIndex: 95
What happens?
- The MCWorkingCopyBrowser adds a bunch of MCWorkingCopy in the DependentsFields, so as to add itself as a dependent and get notified of some package change.
- Since the DependentFields is quite populated, the DictionaryInspector omits most of the keys and replace them with ellipsis '...'
- when we select the ellipsis (at index 95 at this time of writing), the inspector is trying to print something wth `storeString`
- the VM gets overwhelmed, and in my case finish by freezing
If we user-interrupted soon enough, debugging the problem is already a challenge.<br>
Even if we use debugIt instead of doIt in the above code snippet, Morphic stepping will freeze the UI soon after setting the `selectionIndex` inst. var. of the `Inspector`.
What are the problem with `storeString`?
- it's verbose (instVarAt:put:)
- it can work on simple trees, but will store the objects several times for a more general graph, and will run indefinitely if the object graph is cyclic
Invoking `storeString `on a `MCWorkingCopy`, even if not a cyclic graph (I hope), is not a thing to do, because it can consume several Gbytes just with the business of printing the ancestry.
- the `storeString `of complex objects cannot be evaluated because of intrinsic limitations of the language (number of literals in a single method, execution stack depth, ...).
- it's neither of much use for a human interface, we ain't gonna decipher several Gbytes of `instVarAt:put:` instructions.
`storeString `is for simple objects at best with simple graphs, it's simplistic nature is otherwise a failure.
An inspector aiming at some robustness shall not invoke `storeString`.
--
Reply to this email directly or view it on GitHub:
https://github.com/squeak-smalltalk/squeak-object-memory/issues/115
You are receiving this because you are subscribed to this thread.
Message ID: <squeak-smalltalk/squeak-object-memory/issues/115(a)github.com>
Nicolas Cellier uploaded a new version of Collections to project The Inbox:
http://source.squeak.org/inbox/Collections-nice.1059.mcz
==================== Summary ====================
Name: Collections-nice.1059
Author: nice
Time: 8 February 2024, 12:57:43.861987 am
UUID: a61087ae-f9ac-4e43-89d1-837d3edb7493
Ancestors: Collections-mt.1058
Provide the ability to reverse the endianness of a RawBitsArray. Spur platforms are all little-endian so far, so this is for the case when we would want to exchange such an array in a big-endian format.
Example:
| w |
w := WordArray with: 16r01020304.
w reverseEndianness.
w first hex
Also provide the ability to access the underlying bytes of any collection of raw bits thru byteAt: and byteAt:put:, whatever the number of bytesPerBasicElement.
Examples:
| w b |
w := WordArray with: 16r01020304.
b := w copy changeClassTo: ByteArray.
1 to: 4 do: [:index |
self assert: (w byteAt: index) = (b byteAt: index)].
| w b |
w := WordArray with: 16r01020304.
b := w copy changeClassTo: ByteArray.
w byteAt: 3 put: 5.
b byteAt: 3 put: 5.
{w first hex. b}
This might be usefull for low level operations, like simulating a VM for example.
=============== Diff against Collections-mt.1058 ===============
Item was added:
+ ----- Method: RawBitsArray>>byteAt: (in category 'accessing') -----
+ byteAt: anIndex
+ "Access a byte of the receiver, considered as a raw sequence of bytes.
+ This is a memory efficient implementation of:
+ ((self copy changeClassTo: ByteArray) at: anIndex)"
+ | int mask stride index shift |
+ self class isBytes
+ ifTrue: [^ self basicAt: anIndex].
+ mask := 16rFF.
+ stride := self bytesPerBasicElement.
+ index := anIndex - 1 // stride + 1.
+ shift := anIndex - 1 \\ stride * -8.
+ Smalltalk isLittleEndian ifFalse: [shift := stride - 1 * 8 - shift].
+ int := self basicAt: index.
+ int := int bitShift: shift.
+ int := int bitAnd: mask.
+ ^int!
Item was added:
+ ----- Method: RawBitsArray>>byteAt:put: (in category 'accessing') -----
+ byteAt: anIndex put: aByte
+ "Modify a byte of the receiver, considered as a raw sequence of bytes.
+ This is a less scary implementation than:
+ ([:class | ((self changeClassTo: ByteArray) at: anIndex put: aByte) changeClassTo: class] value: self class)"
+ | int stride index shift mask |
+ self class isBytes
+ ifTrue: [^ self basicAt: anIndex put: aByte].
+ mask := 16rFF.
+ stride := self bytesPerBasicElement.
+ index := anIndex - 1 // stride + 1.
+ shift := anIndex - 1 \\ stride * 8.
+ Smalltalk isLittleEndian ifFalse: [shift := stride - 1 * 8 - shift].
+ int := self basicAt: index.
+ int := int bitClear: (mask bitShift: shift).
+ int := int bitOr: (aByte bitShift: shift).
+ self basicAt: index put: int.
+ ^aByte!
Item was added:
+ ----- Method: RawBitsArray>>reverseEndianness (in category 'converting') -----
+ reverseEndianness
+ "reverse the endianness for each element"
+
+ self class isBytes ifTrue: [^self].
+ self class isWords ifTrue: [^self swapWords].
+ self class isLongs ifTrue: [^self swapDoubleWords].
+ self class isShorts ifTrue: [^self swapDoubleBytes].
+ self error: 'this is not a collection of 1,2,4 or 8 bytes elements'!
Item was added:
+ ----- Method: RawBitsArray>>swap16pairs (in category 'private') -----
+ swap16pairs
+ "Swap every pair of double-bytes
+ Example: #[ 1 2 3 4 5 6 7 8 ] copy swap16pairs => #[ 3 4 1 2 7 8 5 6]
+ Implementation notes: this is the same as swapHalves, except that swapHalves only work for WordArray"
+
+ | hack blt |
+ "The implementation is a hack, but fast for large ranges"
+ hack := Form new hackBits: self.
+ blt := (BitBlt toForm: hack) sourceForm: hack.
+ blt combinationRule: Form reverse. "XOR"
+ blt sourceY: 0; destY: 0; height: self byteSize//4; width: 2.
+ blt sourceX: 0; destX: 2; copyBits. "Exchange double-bytes 0 and 1"
+ blt sourceX: 2; destX: 0; copyBits.
+ blt sourceX: 0; destX: 2; copyBits.!
Item was added:
+ ----- Method: RawBitsArray>>swap32pairs (in category 'private') -----
+ swap32pairs
+ "Swap every pair of words
+ Example: #[ 1 2 3 4 5 6 7 8 ] copy swap32pairs => #[ 5 6 7 8 1 2 3 4 ]"
+
+ | hack blt |
+ "The implementation is a hack, but fast for large ranges"
+ hack := Form new hackBits: self width: 8.
+ blt := (BitBlt toForm: hack) sourceForm: hack.
+ blt combinationRule: Form reverse. "XOR"
+ blt sourceY: 0; destY: 0; height: self byteSize//8; width: 4.
+ blt sourceX: 0; destX: 4; copyBits. "Exchange words 0 and 1"
+ blt sourceX: 4; destX: 0; copyBits.
+ blt sourceX: 0; destX: 4; copyBits.!
Item was added:
+ ----- Method: RawBitsArray>>swap8pairs (in category 'private') -----
+ swap8pairs
+ "Swap every pair of bytes
+ Example: #[ 1 2 3 4 5 6 ] copy swap8pairs => #[ 2 1 4 3 6 5 ]"
+
+ | hack blt |
+ "The implementation is a hack, but fast for large ranges"
+ hack := Form new hackBits: self.
+ blt := (BitBlt toForm: hack) sourceForm: hack.
+ blt combinationRule: Form reverse. "XOR"
+ blt sourceY: 0; destY: 0; height: self byteSize//4; width: 1.
+ blt sourceX: 0; destX: 1; copyBits. "Exchange bytes 0 and 1"
+ blt sourceX: 1; destX: 0; copyBits.
+ blt sourceX: 0; destX: 1; copyBits.
+ blt sourceX: 2; destX: 3; copyBits. "Exchange bytes 2 and 3"
+ blt sourceX: 3; destX: 2; copyBits.
+ blt sourceX: 2; destX: 3; copyBits.
+ self byteSize\\4 >= 2
+ ifTrue:
+ ["The lines in a From must fit on a Word boundary.
+ Handle the excess bytes"
+ | n tmp |
+ n := self byteSize // 4 * 4.
+ tmp := self byteAt: n + 1.
+ self byteAt: n + 1 put: (self byteAt: n + 2).
+ self byteAt: n + 2 put: tmp.]!
Item was added:
+ ----- Method: RawBitsArray>>swapDoubleBytes (in category 'private') -----
+ swapDoubleBytes
+ "Perform a bigEndian/littleEndian byte reversal of my double bytes.
+ Assume that our byte size is a multiple of souble byte size (2)
+ If it's not the case, trailing bytes would be left unchanged"
+
+ self swap8pairs!
Item was added:
+ ----- Method: RawBitsArray>>swapDoubleWords (in category 'private') -----
+ swapDoubleWords
+ "Perform a bigEndian/littleEndian byte reversal of my double words.
+ Assume that our byte size is a multiple of double word size (8)
+ If it's not the case, 4 trailing bytes might be altered"
+
+ self swap32pairs. "#[1 2 3 4 5 6 7 8] copy swap32pairs => #[5 6 7 8 1 2 3 4]"
+ self swapWords "#[5 6 7 8 1 2 3 4] copy swapWords => #[8 7 6 5 4 3 2 1]"!
Item was added:
+ ----- Method: RawBitsArray>>swapWords (in category 'private') -----
+ swapWords
+ "Perform a bigEndian/littleEndian byte reversal of my words.
+ Assume that our byte size is a multiple of word size (4)
+ If it's not the case, trailing bytes will remain unchanged"
+
+ | hack blt |
+ "The implementation is a hack, but fast for large ranges"
+ hack := Form new hackBits: self.
+ blt := (BitBlt toForm: hack) sourceForm: hack.
+ blt combinationRule: Form reverse. "XOR"
+ blt sourceY: 0; destY: 0; height: self byteSize//4; width: 1.
+ blt sourceX: 0; destX: 3; copyBits. "Exchange bytes 0 and 3"
+ blt sourceX: 3; destX: 0; copyBits.
+ blt sourceX: 0; destX: 3; copyBits.
+ blt sourceX: 2; destX: 1; copyBits. "Exchange bytes 1 and 2"
+ blt sourceX: 1; destX: 2; copyBits.
+ blt sourceX: 2; destX: 1; copyBits.!