Hi Igor,
> there is a workaround.
> all structs in C is returned via pointer.
> so, actually a true return type of a function is CvSize*
>
I agree that usually structs are returned through pointers.
But here it is not the case.
I want to wrap this function:
CvSize cvGetSize( const CvArr* arr );
and the CvSize struct is returned by value. Am I wrong?
>
> so, what you do is to change the return value to simple void*
> and then copy the contents of struct into instance of corresponding
> NBExternalStructure subclass
> using #fromPointer: method.. to conveniently access its fields values.
>
yes I saw that in NB tests.
>
>
> but this is in general, in your case this function is actually inlined
> by compiler (as CV_INLINE suggests), so there could be even no
> exported symbol for it in dynamic library.
> and the function is actually so simple, that you don't need to wrap it at
> all.
> you can just create a subclass of NBExternalStructure , named CvSize,
> implement fieldDesc method as:
>
> fieldsDesc
> ^ #(
> int width;
> int height
> )
> and if you invoke:
>
> CvSize new width: 1 height:2
>
> it will be equivalent as if you will call cvSize(1,2) function.
>
yes it is exactly what I did.
So my problem is:
NBCvSize implemented as a subclass of NBExternalStruct with fieldDesc
correctly set up.
Then wrap the function cvGetSize:
getSize
self nbCall: #(NBCvSize cvGetSize(IplImage self)) module: LIB_CV.
But I get a debugger because:
NBExternalStruct>>coerceReturn: gen
" ... should we support handling return of external structures? "
self error: 'returning pointer to structure?'
And I have no idea how to implement this (black magic EAX pop push ;-)) to
coerce result of struct.
Luc