[squeak-dev] FFI: FFI-CallbacksTests-mt.3.mcz
commits at source.squeak.org
commits at source.squeak.org
Fri May 28 09:16:30 UTC 2021
Marcel Taeumel uploaded a new version of FFI-CallbacksTests to project FFI:
http://source.squeak.org/FFI/FFI-CallbacksTests-mt.3.mcz
==================== Summary ====================
Name: FFI-CallbacksTests-mt.3
Author: mt
Time: 28 May 2021, 11:16:30.0737 am
UUID: c7b02b69-cc7d-5148-af00-423356b5bd8c
Ancestors: FFI-CallbacksTests-mt.2
Complements FFI-Callbacks-mt.22
=============== Diff against FFI-CallbacksTests-mt.2 ===============
Item was changed:
----- Method: FFICallbackTests>>expectedFailures (in category 'failures') -----
expectedFailures
^ #(
+ test02SortArrayOfDoublesRaw "Coercing checks are too aggressive or just wrong."
- test02SortArrayOfDoublesRaw "Checked on 32-bit. Coercing checks are too aggressive or just wrong."
test04SortArrayOfIntegersRaw "See above."
)!
Item was changed:
----- Method: FFICallbackTests>>test08ManagedCallback (in category 'tests') -----
test08ManagedCallback
| array unsorted sorted compare callback |
unsorted := #(71 66 33 77 16 63 91 54 48 52).
sorted := #(16 33 48 52 54 63 66 71 77 91).
array := ExternalType int32_t allocate: 10.
1 to: array size do: [:index |
array at: index put: (unsorted at: index)].
compare := [:a :b | (a - b) sign].
+ callback := compare gcSignature: #(int32_t 'int32_t*' 'int32_t*').
- callback := FFICallback newGC.
- callback
- setBlock: compare
- signature: #(int32_t 'int32_t*' 'int32_t*').
lib
qsort: array
with: array size
with: array contentType byteSize
with: callback.
self assert: (sorted hasEqualElements: array).
+ "Callback no longer needed but still there."
Smalltalk garbageCollect.
self deny: callback isNull.
+
+ "Callback depends on the existence of the compare block."
+ self
+ assert: callback
+ identical: (FFICallback lookupCallbackForEvaluable: compare).
compare := nil.
Smalltalk garbageCollect.
self assert: callback isNull.!
Item was added:
+ ----- Method: FFICallbackTests>>test09UnmanagedCallback (in category 'tests') -----
+ test09UnmanagedCallback
+
+ | array unsorted sorted compare callback |
+ unsorted := #(71 66 33 77 16 63 91 54 48 52).
+ sorted := #(16 33 48 52 54 63 66 71 77 91).
+
+ array := ExternalType int32_t allocate: 10.
+ 1 to: array size do: [:index |
+ array at: index put: (unsorted at: index)].
+
+ compare := [:a :b | (a - b) sign].
+ callback := compare signature: #(int32_t 'int32_t*' 'int32_t*').
+
+ lib
+ qsort: array
+ with: array size
+ with: array contentType byteSize
+ with: callback.
+ self assert: (sorted hasEqualElements: array).
+
+ "Callback no longer needed but still there."
+ Smalltalk garbageCollect.
+ self deny: callback isNull.
+
+ "Callback independent from the compare block."
+ self assert: (FFICallback lookupCallbackForEvaluable: compare) isNil.
+ compare := nil.
+ Smalltalk garbageCollect.
+ self deny: callback isNull.
+
+ "Callback needs to be free'd manually."
+ callback free.
+ self assert: callback isNull.!
More information about the Squeak-dev
mailing list
|