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

commits at source.squeak.org commits at source.squeak.org
Fri May 28 10:52:04 UTC 2021


Marcel Taeumel uploaded a new version of FFI-Kernel to project FFI:
http://source.squeak.org/FFI/FFI-Kernel-mt.179.mcz

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

Name: FFI-Kernel-mt.179
Author: mt
Time: 28 May 2021, 12:52:03.4977 pm
UUID: c02c8260-e6ed-4845-a202-ddf2cd193be0
Ancestors: FFI-Kernel-mt.178

Adds #isStringType check to speed up ExternalData.

Fixes access and code generation for array types and pointer-to-array types.

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

Item was changed:
  ----- Method: ExternalArrayType>>handle:at: (in category 'external data') -----
  handle: handle at: byteOffset
  
+ 	| resultHandle |
+ 	resultHandle := handle structAt: byteOffset length: self byteSize.
+ 	^ self isTypeAlias
+ 		ifTrue: [referentClass fromHandle: resultHandle]
+ 		ifFalse: [ExternalData fromHandle: resultHandle type: self]!
- 	^ ExternalData
- 		fromHandle: (handle structAt: byteOffset length: self byteSize)
- 		type: self!

Item was added:
+ ----- Method: ExternalArrayType>>isStringType (in category 'testing - special') -----
+ isStringType
+ 
+ 	^ false!

Item was changed:
  ----- Method: ExternalArrayType>>readFieldAt: (in category 'external structure') -----
  readFieldAt: byteOffset
  
+ 	^ self isTypeAlias
+ 		ifTrue: [
+ 			'^ {1} fromHandle: (handle structAt: {1} length: {2})'
+ 				format: {
+ 					referentClass name.
+ 					byteOffset.
+ 					self byteSize}]
+ 		ifFalse: [
+ 			'^ ExternalData fromHandle: (handle structAt: {1} length: {2}) type: {3}'
+ 				format: {
+ 					byteOffset.
+ 					self byteSize.
+ 					self storeStringForField}]!
- 	^ '^ ExternalData fromHandle: (handle structAt: {1} length: {2}) type: {3}'
- 		format: {
- 			byteOffset.
- 			self byteSize.
- 			self storeStringForField}!

Item was added:
+ ----- Method: ExternalAtomicType>>isStringType (in category 'testing - special') -----
+ isStringType
+ 
+ 	^ false!

Item was changed:
  ----- Method: ExternalData>>setContentType: (in category 'initialize-release') -----
  setContentType: externalType
  
+ 	| newContentType |
+ 	(newContentType := externalType) isStringType ifTrue: [
+ 		newContentType := newContentType asNonPointerType].
- 	externalType = ExternalType string ifTrue: [
- 		^ self setContentType: externalType asNonPointerType].
  
+ 	self setType: (newContentType isVoid
+ 		ifTrue: [newContentType "Size gets lost for void."]
+ 		ifFalse: [newContentType asArrayType: self size]).!
- 	self setType: (externalType isVoid
- 		ifTrue: [externalType "Size gets lost for void."]
- 		ifFalse: [externalType asArrayType: self size]).!

Item was changed:
  ----- Method: ExternalData>>setType: (in category 'private') -----
  setType: externalType
  	"Private. Set the type used to derive content and container types. If you want to change the content type later, use #setContentType:."
  
+ 	| newType isVoid |
+ 	(newType := externalType) isStringType ifTrue: [
+ 		newType := newType asNonPointerType].
- 	externalType = ExternalType string ifTrue: [
- 		^ self setType: externalType asNonPointerType].
  
+ 	(isVoid := newType isVoid) ifTrue: [
+ 		newType := newType asPointerType].
- 	externalType isVoid ifTrue: [
- 		^ self setType: externalType asPointerType].
  
+ 	(newType isArrayType or: [isVoid or: [newType asNonPointerType isVoid]])
+ 		ifTrue: [type := newType "array type or void*"]
+ 		ifFalse: [type := (newType asArrayType: nil)].
- 	(externalType isArrayType or: [externalType asNonPointerType isVoid])
- 		ifTrue: [type := externalType "array type or void*"]
- 		ifFalse: [type := (externalType asArrayType: nil)].
  		
  	contentType := nil.!

Item was changed:
  ----- Method: ExternalPointerType>>handle:at: (in category 'external data') -----
  handle: handle at: byteOffset
  
+ 	| referentClassToUse |
+ 	referentClassToUse := self isPointerTypeForArray
+ 		ifFalse: [referentClass]
+ 		ifTrue: [self asNonPointerType isTypeAlias
+ 			ifTrue: [self asNonPointerType referentClass] ifFalse: [nil]].
+ 	^ referentClassToUse
- 	^ referentClass
  			ifNotNil: [
+ 				referentClassToUse fromHandle: (handle pointerAt: byteOffset length: self byteSize)]
- 				referentClass fromHandle: (handle pointerAt: byteOffset length: self byteSize)]
  			ifNil: [
  				ExternalData
  					fromHandle: (handle pointerAt: byteOffset length: self byteSize)
  					type: self asNonPointerType "content type"]!

Item was changed:
  ----- Method: ExternalPointerType>>isPointerTypeForArray (in category 'testing') -----
  isPointerTypeForArray
+ 	"referentClass is currently nil for pointer-to-array types. All operations on referentClass should check this to then use the referentClass from the non-pointer type. Might be changed once array information are encoded in the headerWord."
+ 	
- 
  	^ self asNonPointerType isArrayType!

Item was added:
+ ----- Method: ExternalPointerType>>isStringType (in category 'testing - special') -----
+ isStringType
+ 	"If pointer to atomic, the atomic type is encoded directly in the headerWord. Might change in the future; use #asNonPointerType in that case."
+ 	
+ 	^ self atomicType = FFITypeUnsignedChar!

Item was changed:
  ----- Method: ExternalPointerType>>readFieldAt: (in category 'external structure') -----
  readFieldAt: byteOffset
+ 
+ 	| referentClassToUse |
+ 	referentClassToUse := self isPointerTypeForArray
+ 		ifFalse: [referentClass]
+ 		ifTrue: [self asNonPointerType isTypeAlias
+ 			ifTrue: [self asNonPointerType referentClass] ifFalse: [nil]].
- 	"
- 	ExternalStructure defineAllFields.
- 	"
  	^ '^ {1} fromHandle: (handle pointerAt: {2} length: {3}){4}'
  		format: {
+ 			(referentClassToUse ifNil: [ExternalData]) name.
- 			(referentClass ifNil: [ExternalData]) name.
  			byteOffset.
  			self byteSize.
+ 			referentClassToUse ifNotNil: [''] ifNil: [
- 			referentClass ifNotNil: [''] ifNil: [
  				' type: ', self asNonPointerType "content type" storeStringForField]}!

Item was added:
+ ----- Method: ExternalStructureType>>isStringType (in category 'testing - special') -----
+ isStringType
+ 
+ 	^ false!

Item was added:
+ ----- Method: ExternalType>>isStringType (in category 'testing - special') -----
+ isStringType
+ 
+ 	| type |
+ 	type := self atomicType.
+ 	^ type = FFITypeUnsignedChar and: [self isPointerType]!



More information about the Squeak-dev mailing list