[squeak-dev] FFI: FFI-Pools-mt.29.mcz
commits at source.squeak.org
commits at source.squeak.org
Wed May 26 16:57:14 UTC 2021
Marcel Taeumel uploaded a new version of FFI-Pools to project FFI:
http://source.squeak.org/FFI/FFI-Pools-mt.29.mcz
==================== Summary ====================
Name: FFI-Pools-mt.29
Author: mt
Time: 26 May 2021, 6:57:13.954386 pm
UUID: 35ffa57b-8d10-8148-80f8-dd10f3e1ccdf
Ancestors: FFI-Pools-mt.28
Remove dependencies on "FFI-Kernel" classes. Use #environment instead of Smalltalk global.
=============== Diff against FFI-Pools-mt.28 ===============
Item was changed:
----- Method: Parser>>callback (in category '*FFI-Pools') -----
callback
<pragmaParser>
| descriptorClass retType externalName args argType |
+ descriptorClass := self environment classNamed: #ExternalFunction.
- descriptorClass := ExternalFunction.
"Parse return type"
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:[
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!
Item was changed:
----- Method: Parser>>externalFunctionDeclaration (in category '*FFI-Pools') -----
externalFunctionDeclaration
"Parse the function declaration for a call to an external library.
(1) Create an instance of ExternalLibraryFunction and install it as first literal.
(2) Add a pragma to primitive call 120.
"
| descriptorClass callType modifier retType externalName args argType module fn |
descriptorClass := cue environment
valueOf: #ExternalFunction
ifAbsent: [^ false].
callType := descriptorClass callingConventionFor: here.
callType == nil ifTrue:[^false].
[modifier := descriptorClass callingConventionModifierFor: token.
modifier notNil] whileTrue:
[self advance.
callType := callType bitOr: modifier].
"Parse return type"
self advance.
retType := self externalType: descriptorClass.
retType == nil ifTrue:[^self expected:'return type'].
"Parse function name or index"
externalName := here.
(self match: #number)
ifFalse: [ "Consume all tokens as function name"
self advance.
externalName := externalName asSymbol].
(self match: #leftParenthesis) ifFalse:[^self expected:'argument list'].
args := WriteStream on: Array new.
[self match: #rightParenthesis] whileFalse:[
argType := self externalType: descriptorClass.
argType == nil ifTrue:[^self expected:'argument'].
argType isVoid & argType isPointerType not ifFalse:[args nextPut: argType]].
(self matchToken: 'module:') ifTrue:[
module := here.
(self match: #string) ifFalse:[^self expected: 'String'].
module := module asSymbol].
+ self environment at: #ExternalLibraryFunction ifPresent:[:xfn|
- Smalltalk at: #ExternalLibraryFunction ifPresent:[:xfn|
fn := xfn name: externalName
module: module
callType: callType
returnType: retType
argumentTypes: args contents.
self allocateLiteral: fn.
fn beWritableObject. "Undo the read-only setting in litIndex:"].
(self matchToken: 'error:')
ifTrue:
[| errorCodeVariable |
errorCodeVariable := here.
(hereType == #string
or: [hereType == #word]) ifFalse:[^self expected: 'error code (a variable or string)'].
self advance.
self addPragma: (Pragma keyword: #primitive:error: arguments: (Array with: 120 with: errorCodeVariable)).
fn ifNotNil: [fn setErrorCodeName: errorCodeVariable]]
ifFalse:
[self addPragma: (Pragma keyword: #primitive: arguments: #(120))].
^true!
More information about the Squeak-dev
mailing list
|