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! |
Free forum by Nabble | Edit this page |