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

Reply via email to