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

commits at source.squeak.org commits at source.squeak.org
Mon Jun 1 07:06:24 UTC 2020


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

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

Name: FFI-Kernel-mt.81
Author: mt
Time: 1 June 2020, 9:06:23.085523 am
UUID: 32229562-fe90-5b42-8d0d-926e8bc4da7a
Ancestors: FFI-Kernel-mt.80

More flags to document #ffiLongVsInt -- which is an intersting clash of vocabularies. :-)

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

Item was changed:
  ----- Method: ByteArray>>pointerAt: (in category '*FFI-Kernel') -----
  pointerAt: byteOffset
  	"Answer a pointer object stored at the given byte address"
  
+ 	self flag: #ffiLongVsInt. "mt: Here short means 'long', which is actually 'int', and long means 'longlong'. Sigh."
  	^ ExternalAddress wordSize caseOf: {
  		[4] -> [self shortPointerAt: byteOffset].
  		[8] -> [self longPointerAt: byteOffset] }!

Item was changed:
  ----- Method: ByteArray>>pointerAt:put: (in category '*FFI-Kernel') -----
  pointerAt: byteOffset put: value
  	"Store a pointer object at the given byte address"
  
+ 	self flag: #ffiLongVsInt. "mt: Here short means 'long', which is actually 'int', and long means 'longlong'. Sigh."
  	^ ExternalAddress wordSize caseOf: {
  		[4] -> [self shortPointerAt: byteOffset put: value].
  		[8] -> [self longPointerAt: byteOffset put: value] }!

Item was changed:
  ----- Method: ExternalType class>>initializeFFIConstants (in category 'class initialization') -----
  initializeFFIConstants
  	"ExternalType initialize"
  	FFIConstants initialize. "ensure proper initialization"
  	AtomicTypeNames := IdentityDictionary new.
  	AtomicSelectors := IdentityDictionary new.
  	AtomicTypeNames
  		at: FFITypeVoid put: 'void';
  		at: FFITypeBool put: 'bool';
  		at: FFITypeUnsignedByte put: 'byte';
  		at: FFITypeSignedByte put: 'sbyte';
  		at: FFITypeUnsignedShort put: 'ushort';
  		at: FFITypeSignedShort put: 'short';
+ 		flag: #ffiLongVsInt;
  		at: FFITypeUnsignedInt put: 'ulong';
  		at: FFITypeSignedInt put: 'long';
  		at: FFITypeUnsignedLongLong put: 'ulonglong';
  		at: FFITypeSignedLongLong put: 'longlong';
  		at: FFITypeUnsignedChar put: 'char';
  		at: FFITypeSignedChar put: 'schar';
  		at: FFITypeSingleFloat put: 'float';
  		at: FFITypeDoubleFloat put: 'double';
  	yourself.
  
  	AtomicSelectors
  		at: FFITypeVoid put: #voidAt:;
  		at: FFITypeBool put: #booleanAt:;
  		at: FFITypeUnsignedByte put: #unsignedByteAt:;
  		at: FFITypeSignedByte put: #signedByteAt:;
  		at: FFITypeUnsignedShort put: #unsignedShortAt:;
  		at: FFITypeSignedShort put: #signedShortAt:;
+ 		flag: #ffiLongVsInt;
  		at: FFITypeUnsignedInt put: #unsignedLongAt:;
  		at: FFITypeSignedInt put: #signedLongAt:;
  		at: FFITypeUnsignedLongLong put: #unsignedLongLongAt:;
  		at: FFITypeSignedLongLong put: #signedLongLongAt:;
  		at: FFITypeUnsignedChar put: #unsignedCharAt:;
  		at: FFITypeSignedChar put: #signedCharAt:;
  		at: FFITypeSingleFloat put: #floatAt:;
  		at: FFITypeDoubleFloat put: #doubleAt:;
  	yourself!

Item was changed:
  ----- Method: ExternalType>>readFieldAt: (in category 'private') -----
  readFieldAt: byteOffset
  	"Answer a string defining the accessor to an entity of the receiver type starting at the given byte offset. 
  	 Private. Used for field definition only."
  	self isPointerType ifTrue:
  		[| accessor |
+ 		self flag: #ffiLongVsInt. "mt: Here short means 'long', which is actually 'int', and long means 'longlong'. Sigh."
  		accessor := self pointerSize caseOf: {
  						[4]	->	[#shortPointerAt:].
  						[8]	->	[#longPointerAt:] }.
  		 ^String streamContents:
  			[:s|
  			 referentClass
  				ifNil:
  					[s nextPutAll: '^ExternalData fromHandle: (handle ', accessor, ' ';
  						print: byteOffset;
  						nextPutAll: ') type: ExternalType ';
  						nextPutAll: (AtomicTypeNames at: self atomicType);
  						nextPutAll: ' asPointerType']
  				ifNotNil:
  					[s nextPutAll: '^';
  						print: referentClass;
  						nextPutAll: ' fromHandle: (handle ', accessor, ' ';
  						print: byteOffset;
  						nextPut: $)]]].
  
  	self isAtomic ifFalse: "structure type"
  		[^String streamContents:[:s|
  			s nextPutAll:'^';
  				print: referentClass;
  				nextPutAll:' fromHandle: (handle structAt: ';
  				print: byteOffset;
  				nextPutAll:' length: ';
  				print: self byteSize;
  				nextPutAll:')']].
  
  	"Atomic non-pointer types"
  	^String streamContents:
  		[:s|
  		s nextPutAll:'^handle ';
  			nextPutAll: (AtomicSelectors at: self atomicType);
  			space; print: byteOffset].!

Item was changed:
  ----- Method: ExternalType>>writeFieldAt:with: (in category 'private') -----
  writeFieldAt: byteOffset with: valueName
  	"Answer a string defining the accessor to an entity of the receiver type starting at the given byte offset. 
  	 Private. Used for field definition only."
  	self isPointerType ifTrue:
  		[| accessor |
+ 		self flag: #ffiLongVsInt. "mt: Here short means 'long', which is actually 'int', and long means 'longlong'. Sigh."
  		accessor := self pointerSize caseOf: {
  						[4]	->	[#shortPointerAt:].
  						[8]	->	[#longPointerAt:] }.
  		^String streamContents:
  			[:s|
  			s nextPutAll:'handle ', accessor, ' ';
  				print: byteOffset;
  				nextPutAll:' put: ';
  				nextPutAll: valueName;
  				nextPutAll:' getHandle.']].
  
  	self isAtomic ifFalse:[
  		^String streamContents:[:s|
  			s nextPutAll:'handle structAt: ';
  				print: byteOffset;
  				nextPutAll:' put: ';
  				nextPutAll: valueName;
  				nextPutAll:' getHandle';
  				nextPutAll:' length: ';
  				print: self byteSize;
  				nextPutAll:'.']].
  
  	^String streamContents:[:s|
  		s nextPutAll:'handle ';
  			nextPutAll: (AtomicSelectors at: self atomicType);
  			space; print: byteOffset;
  			nextPutAll:' put: ';
  			nextPutAll: valueName].!



More information about the Squeak-dev mailing list