Hi,
I have a problem with a nativeboost call, but I don't see what I do wrong.
library function prototype is:
int zmq_getsockopt (void *socket, int option_name, void *option_value,
size_t *option_len);
my calling method in pharo is:
zmq_getsockopt: socket option_name: option_name option_value:
option_value option_len: option_len
<primitive: #primitiveNativeCall module: #NativeBoostPlugin error:
errorCode>
^self nbCall: #(int zmq_getsockopt (void *socket, int option_name,
void * option_value, size_t* option_len) )
when I call it with
...
optionValue := (NBExternalArray ofType: 'int') externalNew: 1.
optionLen := (NBExternalArray ofType: 'size_t' ) externalNew: 1.
[ optionValue at: 1 put: 0 .
optionLen at: 1 put: (NBExternalType sizeOf: 'int') .
rc := self zmq_getsockopt: socket option_name: option_name
option_value: optionValue
option_len: optionLen .
value := optionValue at: 1 .
] ensure: [ optionValue free.
optionLen free ].
...
I allways get an exception: "error during FFI call : nil"
After stepping in NBFFICallout generation, I found something strange,
the code
generation seems not to be called because lastError stays at nil ?
handleFailureIn: aContext nativeCode: aBlock
lastError := self getErrorFrom: aContext lastError: NativeBoost
lastError.
>>getErrorFrom: aContext lastError: errorCode
... checks pragmas etc
>>getErrorFrom: aContext lastError: errorCode
... lastError := aContext tempAt: method numTemps.
=> lastError = nil ??? shouldn't be ErrNoNativeCodeInMethod ?
"install native code and retry the send"
lastError = ErrNoNativeCodeInMethod
ifTrue: [ ^ self generateCode: aBlock andRetry: aContext ].
never gets called ...
"ok, we're out of options, signal an error here"
^ self signalError: lastError
Could it be because I use this image on windows and unix ?
Or because I had an exception at prototype parsing the first time
because I forgot a ; at the end of the prototype ?
Is my prototype correct or is it the origin of the error ?
Is there a way to reset the lastError (aContext tempAt: method numTemps) ?
I will try to reset it in debugger but may be there is a cleaner way ?
would it be ok to change the test in handleFailure to
(lastError = ErrNoNativeCodeInMethod) or:[ lastError isNil ] ?
(I can open a bug in this case )
Any idea or comment is welcome
Thanks in advance
Alain