[squeak-dev] FFI: FFI-Kernel-mt.133.mcz

commits at source.squeak.org commits at source.squeak.org
Wed May 5 16:22:09 UTC 2021

Marcel Taeumel uploaded a new version of FFI-Kernel to project FFI:

==================== Summary ====================

Name: FFI-Kernel-mt.133
Author: mt
Time: 5 May 2021, 6:22:06.654784 pm
UUID: 5b4d9432-d53c-424d-9d60-7e9dd5c7ce64
Ancestors: FFI-Kernel-mt.132

Since empty array types such as char[] are not actually supported, e.g., in struct defs, disallow them for now to not deceive users trying to work with them and then wonder about strange results.

=============== Diff against FFI-Kernel-mt.132 ===============

Item was changed:
  ----- Method: ExternalArrayType class>>newTypeForContentType:size: (in category 'instance creation') -----
  newTypeForContentType: contentType size: numElements
  	"!!!!!! Be aware that only the pointer type can be used in calls. As of SqueakFFIPrims VMMaker.oscog-eem.2950, there is no actual support for array types in the FFI plugin !!!!!!"
  	| type pointerType headerWord byteSize |	
  		assert: [contentType isPointerType not]
  		description: 'No support for pointers as content type yet!!'.
+ 		assert: [numElements > 0]
+ 		description: 'Empty array types are not supported!!'.
+ 	self
  		assert: [contentType byteSize > 0]
  		description: 'Invalid byte size!!'.
  		assert: [(ArrayTypes includesKey: contentType typeName -> numElements) not]
  		description: 'Array type already exists. Use #typeNamed: to access it.'.
  	type := self "ExternalArrayType" basicNew.
  	pointerType := ExternalType basicNew.
  	"1) Regular type"
  	byteSize := numElements * contentType byteSize.
  	self assert: [byteSize <= FFIStructSizeMask].
  	headerWord := contentType headerWord.
  	headerWord := headerWord bitClear: FFIStructSizeMask.
  	headerWord := headerWord bitOr: byteSize.
  		setReferencedType: pointerType;
  		compiledSpec: (WordArray with: headerWord);
  		byteAlignment: contentType byteAlignment;
  		setReferentClass: contentType referentClass;
  		setSize: numElements.
  	"2) Pointer type. Reuse the compiledSpec of the content-type's pointer type."
  		setReferencedType: type;
  		compiledSpec: contentType asPointerType compiledSpec copy;
  		byteAlignment: contentType asPointerType byteAlignment;
  		setReferentClass: contentType asPointerType referentClass.
  	"3) Remember this new array type."
  		at: contentType typeName -> numElements
  		put: type.
  	^ type!

Item was changed:
  ----- Method: ExternalType class>>newTypeNamed: (in category 'instance creation') -----
  newTypeNamed: aTypeName
  	"Create a new struct type or array type. Not needed for atomic types; see #initializeDefaultTypes."
  	| structClass arraySpec |
  		assert: [aTypeName last ~~ $*]
  		description: 'Pointer type will be created automatically'.
  	aTypeName last == $] ifTrue: [ "array type, e.g., char[50]"
  		arraySpec := self parseArrayTypeName: aTypeName.
  		arraySpec second ifNil: [arraySpec at: 2 put: (self newTypeNamed: arraySpec first)].
- 		arraySpec third ifNil: [arraySpec at: 3 put: 0].
  		^ self
  			newTypeForContentType: arraySpec second
  			size: arraySpec third].
  	structClass := (self environment classNamed: aTypeName)
  		ifNotNil: [:class | (class includesBehavior: ExternalStructure) ifTrue: [class]].
  	^ structClass
  		ifNil: [self newTypeForUnknownNamed: aTypeName]
  		ifNotNil: [self newTypeForStructureClass: structClass]!

Item was changed:
  (PackageInfo named: 'FFI-Kernel') postscript: 'Smalltalk removeFromStartUpList: ExternalAddress.
  Smalltalk removeFromStartUpList: ExternalObject.
  "Adds housekeeping for array types."
+ ExternalType resetAllStructureTypes..
- ExternalType resetAllStructureTypes.
  "Re-generate all field accessors because type checks are now controlled by a new preference."
  ExternalStructure defineAllFields.

More information about the Squeak-dev mailing list