FFI: FFI-Kernel-mt.119.mcz

Previous Topic Next Topic
 
classic Classic list List threaded Threaded
1 message Options
Reply | Threaded
Open this post in threaded view
|

FFI: FFI-Kernel-mt.119.mcz

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

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

Name: FFI-Kernel-mt.119
Author: mt
Time: 28 July 2020, 1:34:03.494011 pm
UUID: ad1bfdeb-3a7f-bb49-a61d-199918835891
Ancestors: FFI-Kernel-nice.118

Adds parser hook for callback pragmas. Simplifies loading of FFI-Callback.

=============== Diff against FFI-Kernel-nice.118 ===============

Item was added:
+ ----- Method: Parser>>callback (in category '*FFI-Kernel') -----
+ callback
+ <pragmaParser>
+
+ | descriptorClass retType externalName args argType |
+ descriptorClass := ExternalFunction.
+ "Parse return type"
+ self advance.
+ here = 'const' ifTrue: [self advance].
+ retType := self externalType: descriptorClass.
+ retType == nil ifTrue:[^self expected:'return type'].
+ "Parse function name or index"
+ externalName := here.
+
+ (self match: #leftParenthesis) ifFalse:[^self expected:'function pointer (*)'].
+ (self matchToken: #*) ifFalse:[^self expected:'function pointer (*)'].
+ (self match: #rightParenthesis) ifFalse:[^self expected:'function pointer (*)'].
+
+ (self match: #leftParenthesis) ifFalse:[^self expected:'argument list'].
+ args := WriteStream on: Array new.
+ [self match: #rightParenthesis] whileFalse:[
+ here = 'const' ifTrue: [self advance].
+ here = ',' ifTrue: [self advance].
+ argType := self externalType: descriptorClass.
+ argType == nil ifTrue:[^self expected:'argument'].
+ argType isVoid & argType isPointerType not ifFalse:[args nextPut: argType]].
+
+ self addPragma: (Pragma keyword: #callback: arguments: {{retType}, args contents}).
+ ^true!