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