[squeak-dev] FFI: FFI-Kernel-eem.184.mcz
commits at source.squeak.org
commits at source.squeak.org
Tue Jul 27 01:36:09 UTC 2021
Eliot Miranda uploaded a new version of FFI-Kernel to project FFI:
http://source.squeak.org/FFI/FFI-Kernel-eem.184.mcz
==================== Summary ====================
Name: FFI-Kernel-eem.184
Author: eem
Time: 26 July 2021, 6:36:07.613943 pm
UUID: 4cfd2228-15ae-475b-b152-805e77401509
Ancestors: FFI-Kernel-eem.183
Make ExternalType class>>#initializeAtomicTypes cope with old images in which all the AtomicTypes are still instances of ExternalType, not ExternalAtomicType.
Add robustness to cleanupUnusedTypes, and to ExternalType>isTypeAlias (to get the package to load in older images).
Provide readFieldAt:/writeFieldAt: for ExternalUnknownType so that packages can load.
=============== Diff against FFI-Kernel-eem.183 ===============
Item was changed:
----- Method: ExternalType class>>cleanupUnusedTypes (in category 'housekeeping') -----
cleanupUnusedTypes
"In the lookup table for struct types and array types, remove keys to types no longer present..
ExternalType cleanupUnusedTypes
"
Smalltalk garbageCollect.
StructTypes keys do: [:key |
(StructTypes at: key) ifNil: [
StructTypes removeKey: key]].
ArrayTypes keys do: [:contentTypeName |
| sizes |
sizes := ArrayTypes at: contentTypeName.
+ [sizes keys do: [:size |
- sizes keys do: [:size |
(sizes at: size) ifNil: [sizes removeKey: size]].
+ sizes ifEmpty: [
+ ArrayTypes removeKey: contentTypeName]]
+ on: Error
+ do: [:ex| Transcript print: ex; cr; flush]]!
- sizes ifEmpty: [
- ArrayTypes removeKey: contentTypeName]].!
Item was changed:
----- Method: ExternalType class>>initializeAtomicTypes (in category 'class initialization') -----
initializeAtomicTypes
"ExternalType initialize"
| atomicType byteSize type typeName byteAlignment |
self flag: #ffiLongVsInt. "For a discussion about long vs. int see http://forum.world.st/Re-squeak-dev-64-bit-FFI-was-porting-Croquet-to-Squeak6-0-alpha-tp5113318.html."
+ AtomicTypes do:
+ [:anAtomicType|
+ (anAtomicType class ~~ ExternalAtomicType
+ and: [anAtomicType class == ExternalType]) ifTrue:
+ [ExternalAtomicType adoptInstance: anAtomicType]].
-
#(
"name atomic id byte size byte alignment"
('void' 0 0 0) "No non-pointer support in calls. Duh. ;-)"
('bool' 1 1 1) "No pointer support in calls."
('byte' 2 1 1)
('sbyte' 3 1 1)
('ushort' 4 2 2)
('short' 5 2 2)
"!!!!!!" ('ulong' 6 4 "!!!!!!" 4)
"!!!!!!" ('long' 7 4 "!!!!!!" 4)
('ulonglong' 8 8 8) "v.i."
('longlong' 9 8 8) "v.i."
('char' 10 1 1)
('schar' 11 1 1)
('float' 12 4 4)
('double' 13 8 8) "v.i."
"TODO: ('longdouble' 14 10 16? 4?)"
) do:[:typeSpec| | compiled |
typeName := typeSpec first.
atomicType := typeSpec second.
byteSize := typeSpec third.
byteAlignment := typeSpec fourth.
"0) On 32-bits Windows and MacOS, double and long long have an alignment of 8. But on 32-bit Linux, their alignment is 4. But not on a 32-bit Raspberry Pi OS."
(FFIPlatformDescription current wordSize = 4
and: [FFIPlatformDescription current isUnix
and: [FFIPlatformDescription current isARM not]]) ifTrue: [
(#('double' 'longlong' 'ulonglong') includes: typeName) ifTrue: [
byteAlignment := 4]].
"1) Regular type"
type := (AtomicTypes at: typeName).
compiled := WordArray with: ((byteSize bitOr: FFIFlagAtomic) bitOr:
(atomicType bitShift: FFIAtomicTypeShift)).
compiled ~= type compiledSpec
"Preserve the identity of #compiledSpec."
ifTrue: [type compiledSpec: compiled].
type byteAlignment: byteAlignment.
"2) Pointer type"
type := type asPointerType.
compiled := WordArray with: ((self pointerSpec bitOr: FFIFlagAtomic) bitOr:
(atomicType bitShift: FFIAtomicTypeShift)).
compiled ~= type compiledSpec
"Preserve the identity of #compiledSpec."
ifTrue: [type compiledSpec: compiled].
type byteAlignment: self pointerAlignment.
].!
Item was changed:
----- Method: ExternalType>>isTypeAlias (in category 'testing') -----
isTypeAlias
+ ^true ifTrue: [false] ifFalse: [self subclassResponsibility]!
- self subclassResponsibility.!
Item was added:
+ ----- Method: ExternalUnknownType>>readFieldAt: (in category 'external structure') -----
+ readFieldAt: anInteger
+ ^'self error: ''cannot read field at ', anInteger printString, '; field has unknown type'''!
Item was added:
+ ----- Method: ExternalUnknownType>>writeFieldAt:with: (in category 'external structure') -----
+ writeFieldAt: anInteger with: aString
+ ^'self error: ''cannot read field at ', anInteger printString, ' with name ', aString, '; field has unknown type'''!
More information about the Squeak-dev
mailing list
|