[squeak-dev] FFI: FFI-Callbacks-mt.28.mcz

commits at source.squeak.org commits at source.squeak.org
Thu Aug 19 10:02:35 UTC 2021

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

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

Name: FFI-Callbacks-mt.28
Author: mt
Time: 19 August 2021, 12:02:33.914627 pm
UUID: 00c82084-ed47-0941-b5a7-515c07ea4e8d
Ancestors: FFI-Callbacks-mt.27

Fixes regression from previous commit. Adding an extra unpacking step needs to retain the strong (arg) reference of the comparator to make use of managed callback.

=============== Diff against FFI-Callbacks-mt.27 ===============

Item was changed:
  ----- Method: CStandardLibrary>>compare:through: (in category '*FFI-Callbacks') -----
  compare: contentType through: evaluable
  	"Answers a callback for comparing the given contentType through the given evaluable, i.e., messages sends or blocks. Supports pointer types as contentType via array-type indirection. Automatically unpacks pointers to atomics so that evaluable can directly work on Smalltalk objects. Does not support void as contentType."
  	<callback: int32_t (*)(const void*, const void*)>
  	| argType signature |
  	self assert: [evaluable numArgs = 2].
  	argType := contentType isPointerType
  		ifTrue: [(contentType asArrayType: nil) "HACKY!!"]
  		ifFalse: [contentType].
  	signature := ((thisContext method pragmaAt: #callback:) argumentAt: 1) copy.
  	signature at: 2 put: argType asPointerType.
  	signature at: 3 put: argType asPointerType.	
+ 	(contentType isAtomic or: [contentType isPointerType "e.g., array of int*"])
+ 		ifTrue: ["Re-write evaluable to keep the strong reference as stack argument"
+ 			| source newEvaluable |
+ 			self flag: #hacky.
+ 			source := '[:arg1 :arg2 | {1} value: arg1 value value: arg2 value]'
+ 				format: { evaluable decompile decompileString }.
+ 			newEvaluable := Compiler evaluate: source.
+ 			newEvaluable receiver: evaluable receiver. "TODO: other bindings?"
+ 			evaluable becomeForward: newEvaluable].
+ 	^ evaluable gcSignature: signature!
- 	^ ((contentType isAtomic or: [contentType isPointerType])
- 		ifTrue: [ [:arg1 :arg2 | evaluable value: arg1 value value: arg2 value] ]
- 		ifFalse: [evaluable]) gcSignature: signature!

More information about the Squeak-dev mailing list