NBExternalArray instances cannot be passed directly to functions expecting pointers.
use 'myarray address' for arguments. On 3 November 2014 00:20, Alain Rastoul <[email protected]> wrote: > 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 > > > -- Best regards, Igor Stasenko.
