Marcel Taeumel uploaded a new version of FFI-Tests to project FFI:
http://source.squeak.org/FFI/FFI-Tests-mt.34.mcz ==================== Summary ==================== Name: FFI-Tests-mt.34 Author: mt Time: 15 May 2021, 2:57:58.142282 pm UUID: 88a07f6a-4b02-d042-a0e5-e6e3613789a7 Ancestors: FFI-Tests-mt.33 More tests :-) And #test03GlobalVariable actually fails to meet the requirements when allocated externally. =============== Diff against FFI-Tests-mt.33 =============== Item was changed: ----- Method: FFIAllocateExternalTests>>expectedFailures (in category 'failures') ----- expectedFailures + ^ (super expectedFailures + + copyWithoutAll: #( - ^ super expectedFailures copyWithoutAll: #( test04LinkedList "Storing pointers works fine." + )), #( + test03GlobalVariable "Atomic values in an alias container will be fetched immediately. Hmm..." )! Item was added: + ----- Method: FFIAllocateExternalTests>>test03GlobalVariable (in category 'tests') ----- + test03GlobalVariable + "If you happen to have to address to a global variable you can use a type alias." + | global | + global := self allocate: FFITestAliasForInt32. + self assert: global getHandle isExternalAddress. + self assert: global externalType isPointerType. + self assert: 0 equals: global value. + global value: 42. + self assert: 42 equals: global value.! Item was changed: ----- Method: FFIAllocateTests>>test03GlobalVariable (in category 'tests') ----- test03GlobalVariable "If you happen to have to address to a global variable you can use a type alias or just external data for it. See ExternalObject class >> #fromHandle:." | global | global := self allocate: FFITestAliasForInt32. self assert: 0 equals: global value. global value: 42. self assert: 42 equals: global value.! Item was changed: ----- Method: FFIAllocateTests>>test05ArrayFromCString (in category 'tests - array') ----- test05ArrayFromCString | data | ExternalData allowDetectForUnknownSizeDuring: [ data := self allocate: ExternalType char size: 4. + data setContentType: ExternalType byte. + data setSize: nil. - data setType: ExternalType byte. self assert: data size isNil. #[65 66 67 0] withIndexDo: [:byte :index | data at: index put: byte]. + data setContentType: ExternalType char. - data setType: ExternalType char. self assert: 'ABC' equals: data fromCString. data := self allocate: ExternalType char size: 9. data setType: ExternalType byte. self assert: data size isNil. #[65 66 67 0 68 69 70 0 0] withIndexDo: [:byte :index | data at: index put: byte]. data setType: ExternalType char. self assert:#('ABC' 'DEF') equals: data fromCStrings].! Item was added: + ----- Method: FFIAllocateTests>>test07ArraySetSize (in category 'tests - array') ----- + test07ArraySetSize + + | data | + data := self allocate: ExternalType byte size: 10. + + data setSize: 2. "limit access" + self assert: ExternalType byte identical: data contentType. + self assert: 2 equals: data size. + self shouldnt: [data at: 2] raise: Error. + self should: [data at: 3] raise: Error. + + data setSize: 5. "move limit" + self assert: ExternalType byte identical: data contentType. + self assert: 5 equals: data size. + self shouldnt: [data at: 5] raise: Error. + self should: [data at: 6] raise: Error. + + data setSize: nil. "ignore size" + self assert: ExternalType byte identical: data contentType. + self shouldnt: [data at: 3] raise: Error. + self shouldnt: [data at: 6] raise: Error. + self shouldnt: [data at: 10] raise: Error.! Item was added: + ----- Method: FFIAllocateTests>>test08ArraySetContentType (in category 'tests - array') ----- + test08ArraySetContentType + + | data | + data := self allocate: ExternalType byte size: 1. + data at: 1 put: 65. + + self assert: 65 equals: data first. + data setContentType: ExternalType char. + self assert: $A equals: data first.! Item was added: + ----- Method: FFIPluginTests>>testReturnPointerAlias (in category 'tests - type alias') ----- + testReturnPointerAlias + "Check the handle of a returned alias-to-pointer type. Should be an external address." + + | pt1 pt2 pt3 | + pt1 := FFITestPoint4 new. + pt1 x: 1. pt1 y: 2. pt1 z: 3. pt1 w: 4. + pt2 := FFITestPoint4 new. + pt2 x: 5. pt2 y: 6. pt2 z: 7. pt2 w: 8. + pt3 := heapObject := FFITestLibrary ffiTestAliasForPointerResult: pt1 with: pt2. + + self assert: pt3 getHandle isExternalAddress. + self assert: pt3 externalType isPointerType. + + self assert: pt3 x = 6. + self assert: pt3 y = 8. + self assert: pt3 z = 10. + self assert: pt3 w = 12.! Item was added: + ExternalTypeAlias subclass: #FFITestAliasForPoint4Pointer + instanceVariableNames: '' + classVariableNames: '' + poolDictionaries: '' + category: 'FFI-Tests-Fixtures'! Item was added: + ----- Method: FFITestAliasForPoint4Pointer class>>originalTypeName (in category 'type alias') ----- + originalTypeName + + ^ 'FFITestPoint4*'! Item was added: + ----- Method: FFITestLibrary class>>ffiTestAliasForPointerResult:with: (in category 'experiments') ----- + ffiTestAliasForPointerResult: pt1 with: pt2 + "Allocates the result. Needs to be free'd after calling." + <cdecl: FFITestAliasForPoint4Pointer 'ffiTestPointers' (FFITestPoint4* FFITestPoint4*) module:'SqueakFFIPrims'> + ^self externalCallFailed! Item was changed: + ----- Method: FFITestLibrary class>>ffiTestArrayResultWith:with: (in category 'experiments') ----- - ----- Method: FFITestLibrary class>>ffiTestArrayResultWith:with: (in category 'mocks') ----- ffiTestArrayResultWith: pt1 with: pt2 "Allocates the result. Needs to be free'd after calling." <cdecl: FFITestPoint4[] 'ffiTestPointers' (FFITestPoint4* FFITestPoint4*) module:'SqueakFFIPrims'> ^self externalCallFailed! Item was changed: + ----- Method: FFITestLibrary class>>ffiTestArrayResultWithString: (in category 'experiments') ----- - ----- Method: FFITestLibrary class>>ffiTestArrayResultWithString: (in category 'mocks') ----- ffiTestArrayResultWithString: aString " FFITestLibrary ffiTestArrayResultWithString: 'Hello Squeak'. " <cdecl: char[] 'ffiPrintString' (char *) module:'SqueakFFIPrims'> ^self externalCallFailed! Item was changed: + ----- Method: FFITestLibrary class>>ffiTestArrayType (in category 'experiments') ----- - ----- Method: FFITestLibrary class>>ffiTestArrayType (in category 'mocks') ----- ffiTestArrayType "Just a mock. Not sure whether there will ever be call signatures using array types ... isn't this pass-by-pointer anyway?" <cdecl: char[5] 'ffiTestArrayType' (float[5] FFITestPoint2[10] int[1]) module: 'SqueakFFIPrims'> ^ self externalCallFailed ! Item was changed: + ----- Method: FFITestLibrary class>>ffiTestVoid (in category 'experiments') ----- - ----- Method: FFITestLibrary class>>ffiTestVoid (in category 'mocks') ----- ffiTestVoid "Note that ffiTestVoid does exist in the module." <cdecl: void 'ffiTestVoid' (void) module:'SqueakFFIPrims'> ^self externalCallFailed! Item was changed: + ----- Method: FFITestLibrary class>>ffiTestVoidPointer (in category 'experiments') ----- - ----- Method: FFITestLibrary class>>ffiTestVoidPointer (in category 'mocks') ----- ffiTestVoidPointer "Note that ffiTestVoidPointer does exist in the module." <cdecl: void* 'ffiTestVoidPointer' (void*) module:'SqueakFFIPrims'> ^self externalCallFailed! |
Free forum by Nabble | Edit this page |