> On 04 Jul 2016, at 12:15, Ben Coman <b...@openinworld.com> wrote: > > How does it compare with the result you get in pure C? > e.g. using this code... > http://libusb.org/browser/libusb/examples/lsusb.c?rev=efc29733ad31f81883a7ac51a6cc6cda9ad4feb9&order=name > > <http://libusb.org/browser/libusb/examples/lsusb.c?rev=efc29733ad31f81883a7ac51a6cc6cda9ad4feb9&order=name>
yes, this is a good approach since I cannot know what is happening… and basically arrays just take the pointer and do “address+offset” to give you another pointer. but of course, it can fail… if somewhere there is a problem in function translation… Esteban > > On Mon, Jul 4, 2016 at 4:24 PM, Julien Delplanque <jul...@tamere.eu> wrote: >> Hello again Esteban, all others, >> >> I am still experiencing strange behaviors with the objects in the external >> array. >> >> I get a lot of NULL pointers and some strange addresses (I guess, I am not a >> C expert) that are close to NULL >> (see the screenshot attached). These objects make the VM crash (segmentation >> fault) when I call a function >> from the libusb binding (for NULL objects it may be ok but what about >> others?). Some other objects (those with >> a normal address in the screenshot) work finely with the functions calls >> using UFFI... >> >> This kind of bug is not reported in libusb discussions I found on the >> internet and I tried an example in C, >> there is no NULL pointer received from the function (they are not even >> considered in official examples). >> >> So I guess the problem may come from Pharo? >> >> Do you have any idea of what it could be? >> >> I will be available on Slack all the day if you want. :) >> >> Thanks in advance, >> >> Julien >> >> On 01/07/16 14:03, Esteban Lorenzano wrote: >>> >>> ok, can you reload development version and try again? >>> >>> ps: this is easier on slack ;) >>> >>>> On 01 Jul 2016, at 14:00, Esteban Lorenzano <esteba...@gmail.com> wrote: >>>> >>>> yes, I made a mistake… the problem of not being capable of test here :( >>>> >>>> 1 minute. >>>> >>>> Esteban >>>> >>>>> On 01 Jul 2016, at 13:56, Julien Delplanque <jul...@tamere.eu> wrote: >>>>> >>>>> Ok, now I get a different exception! :-) >>>>> >>>>> "MessageNotUnderstood: LUDevice class>>fromHandle:" >>>>> >>>>> when executing: "array first." >>>>> >>>>> Where LUDevice is defined like this: >>>>> >>>>> FFIOpaqueObject subclass: #LUDevice >>>>> instanceVariableNames: '' >>>>> classVariableNames: '' >>>>> package: 'LibUsb-Kernel' >>>>> >>>>> Julien >>>>> >>>>> >>>>> On 01/07/16 13:51, Esteban Lorenzano wrote: >>>>>> >>>>>> I need you to test :) >>>>>> >>>>>> can you execute this: >>>>>> >>>>>> (ConfigurationOfUnifiedFFI project version: #development) load. >>>>>> >>>>>> and then retry your example? >>>>>> >>>>>> thanks, >>>>>> Esteban >>>>>> >>>>>> ps: this became pharo-dev, but well… still here :) >>>>>> >>>>>>> On 01 Jul 2016, at 13:48, Julien Delplanque <jul...@tamere.eu> wrote: >>>>>>> >>>>>>> Oh, ok :p >>>>>>> >>>>>>> Can you notify me know when the bug will be resolved? >>>>>>> >>>>>>> Thanks, >>>>>>> >>>>>>> Julien >>>>>>> >>>>>>> >>>>>>> On 01/07/16 13:36, Esteban Lorenzano wrote: >>>>>>>> >>>>>>>> … and now you hit a bug. >>>>>>>> bah, an “non implemented feature” :P >>>>>>>> >>>>>>>> I never tested arrays with complex types. >>>>>>>> it should not be hard… I will provide a fix. >>>>>>>> >>>>>>>> Esteban >>>>>>>> >>>>>>>> >>>>>>>>> On 01 Jul 2016, at 13:30, Julien Delplanque <jul...@tamere.eu> >>>>>>>>> wrote: >>>>>>>>> >>>>>>>>> Ok, the ffi call is done without problem with your method thanks. :) >>>>>>>>> >>>>>>>>> But now that I have the array, when I try to access the first >>>>>>>>> element using: >>>>>>>>> >>>>>>>>> array first. >>>>>>>>> >>>>>>>>> I get a exception saying I need to override a method: >>>>>>>>> >>>>>>>>> "SubclassResponsibility: FFIOpaqueObjectType had the subclass >>>>>>>>> responsibility to implement #basicHandle:at:" >>>>>>>>> >>>>>>>>> I looked at others implementors but I am not sure of how I should >>>>>>>>> override it, nor if I should. >>>>>>>>> >>>>>>>>> Thanks for the time your taking to answer me. :-) >>>>>>>>> >>>>>>>>> Julien >>>>>>>>> >>>>>>>>> On 01/07/16 12:29, Esteban Lorenzano wrote: >>>>>>>>>>> >>>>>>>>>>> On 01 Jul 2016, at 12:27, Esteban Lorenzano <esteba...@gmail.com> >>>>>>>>>>> wrote: >>>>>>>>>>> >>>>>>>>>>> hi, >>>>>>>>>>> >>>>>>>>>>> this is because you want to get an array with opaque objects. Do >>>>>>>>>>> not let the *** confuses you… cwhat you actually want, conceptually >>>>>>>>>>> is >>>>>>>>>>> something like this: >>>>>>>>>>> >>>>>>>>>>> *((FFIOpaqueObject*)[]) >>>>>>>>>>> >>>>>>>>>>> means: you pass the address of an array of opaque types (who are >>>>>>>>>>> always pointers). >>>>>>>>>>> >>>>>>>>>>> So, what you need to pass is the address of an array… you will >>>>>>>>>>> need to work a bit here, since translation is not automatic. >>>>>>>>>>> >>>>>>>>>>> 1) you need to declare your type. Let’ say it will be: >>>>>>>>>>> >>>>>>>>>>> FFIOpaqueObject subclass: USBDevice. >>>>>>>>>>> >>>>>>>>>>> 2) then you need to get the pointer to this array. You need to >>>>>>>>>>> rewrite you code as this: >>>>>>>>>>> >>>>>>>>>>> arrayPtr := ExternalAddress new. >>>>>>>>>>> size := self getDevice: ctx list: arrayPtr. >>>>>>>>>>> >>>>>>>>>>> getDevice: ctx list: list >>>>>>>>>>> ^ self ffiCall: #(size_t libusb_get_device_list >>>>>>>>>>> (libusb_context *ctx, void **list)) >>>>>>>>>>> >>>>>>>>>>> NOTE that we change the type to "void **”. This is because this is >>>>>>>>>>> what you actually want: the array of devices >>>>>>>>>>> >>>>>>>>>>> 3) now you will have size and arrayPtr. Then you declare the >>>>>>>>>>> array: >>>>>>>>>>> >>>>>>>>>>> array := FFIExternalArray fromPointer: arrayPtr type: USBDevice >>>>>>>>>> >>>>>>>>>> sorry, this expression (while possible) does not stops in “size”… >>>>>>>>>> it has to be like this, instead: >>>>>>>>>> >>>>>>>>>> array := FFIExternalArray fromPointer: arrayPtr type: USBDevice >>>>>>>>>> size: size. “you already has the size for the result" >>>>>>>>>> >>>>>>>>>>> … and you should be able to iterate this array normally :) >>>>>>>>>>> >>>>>>>>>>> let me know if this works for you… I’m “coding in mail client”, so >>>>>>>>>>> it can fail :P >>>>>>>>>>> >>>>>>>>>>> cheers, >>>>>>>>>>> Esteban >>>>>>>>>>> >>>>>>>>>>> >>>>>>>>>>>> On 01 Jul 2016, at 12:02, Julien Delplanque <jul...@tamere.eu> >>>>>>>>>>>> wrote: >>>>>>>>>>>> >>>>>>>>>>>> Thanks, it works I get an instance of FFIOpaqueObject. >>>>>>>>>>>> >>>>>>>>>>>> But how do I get a specific libusb_device object from the list? >>>>>>>>>>>> >>>>>>>>>>>> Thanks again for you quick answer :-). >>>>>>>>>>>> >>>>>>>>>>>> Julien >>>>>>>>>>>> >>>>>>>>>>>> On 01/07/16 11:44, Esteban Lorenzano wrote: >>>>>>>>>>>>> >>>>>>>>>>>>> Hi, >>>>>>>>>>>>> >>>>>>>>>>>>> an opaque structure is not an FFIExternalObject but an >>>>>>>>>>>>> FFIOpaqueObject. >>>>>>>>>>>>> in that case, something like (simplified): >>>>>>>>>>>>> >>>>>>>>>>>>> ctx := (your context). >>>>>>>>>>>>> list := FFIOpaqueObject new. >>>>>>>>>>>>> size := self getDevice: ctx list: list. >>>>>>>>>>>>> >>>>>>>>>>>>> getDevice: ctx list: list >>>>>>>>>>>>> ^ self ffiCall: #(size_t libusb_get_device_list >>>>>>>>>>>>> (libusb_context *ctx, FFIOpaqueObject ***list)) >>>>>>>>>>>>> >>>>>>>>>>>>> should work (note that of course you can make libusb_device an >>>>>>>>>>>>> alias for your type… that does not matters much, this is just a >>>>>>>>>>>>> simplification). >>>>>>>>>>>>> >>>>>>>>>>>>> if this does not works, if you can provide me code to reproduce >>>>>>>>>>>>> it, I can give it a shot and see what happens :) >>>>>>>>>>>>> >>>>>>>>>>>>> Esteban >>>>>>>>>>>>> >>>>>>>>>>>>>> On 01 Jul 2016, at 11:19, Julien Delplanque <jul...@tamere.eu> >>>>>>>>>>>>>> wrote: >>>>>>>>>>>>>> >>>>>>>>>>>>>> Hello everyone, >>>>>>>>>>>>>> >>>>>>>>>>>>>> I have a question about the UFFI API. I have the following >>>>>>>>>>>>>> function: >>>>>>>>>>>>>> >>>>>>>>>>>>>> ssize_t libusb_get_device_list (libusb_context *ctx, >>>>>>>>>>>>>> libusb_device ***list) >>>>>>>>>>>>>> >>>>>>>>>>>>>> where libusb_device is an opaque structure. >>>>>>>>>>>>>> >>>>>>>>>>>>>> I made a type mapping "ssize_t" -> "int" and an object >>>>>>>>>>>>>> inheriting >>>>>>>>>>>>>> from FFIExternalObject for the "libusb_context" (others methods >>>>>>>>>>>>>> using it are working). >>>>>>>>>>>>>> >>>>>>>>>>>>>> I can not find how to get an array filled with libusb_device >>>>>>>>>>>>>> using UFFI from Pharo. :-( >>>>>>>>>>>>>> >>>>>>>>>>>>>> Thanks in advance, >>>>>>>>>>>>>> >>>>>>>>>>>>>> Julien >>>>>>>>>>>>>> >>>>> >>> >> >