Hi,

I uploaded the fix for it. 
it will be integrated soon. 

Esteban

> On 11 Jul 2016, at 13:13, Henrik Johansen <henrik.s.johan...@veloxit.no> 
> wrote:
> 
> The alignment calculation of external enums is wrong, it should be
> 
> FFIExternalEnumerationType >> externalTypeAlignment
>       ^ self representationType externalTypeAlignment
> 
> It only manifests for 32bit platforms on Windows  since that's the only one 
> with a pointer alignment (which superclass FFIExternalReferenceType returns) 
> of 8, not 4 (which is the same alignment as the correct FFIUInt alignment)
> 
> Cheers,
> Henry
> 
> 
>> On 09 Jul 2016, at 12:08 , Merwan Ouddane <merwanoudd...@gmail.com 
>> <mailto:merwanoudd...@gmail.com>> wrote:
>> 
>> Yes I did.
>> 
>> Have you tried on windows ?
>> 
>> Merwan
>> 
>> On 08/07/2016 21:20, Esteban Lorenzano wrote:
>>> it works fine for me: 
>>> 
>>> Struct>>b
>>>     "This method was automatically generated"
>>>     ^Enum fromInteger: (handle unsignedLongAt: 5)
>>> 
>>> Struct>>b: anObject
>>>     "This method was automatically generated"
>>>     handle unsignedLongAt: 5 put: anObject value
>>> 
>>> Struct>>c
>>>     "This method was automatically generated"
>>>     ^Enum fromInteger: (handle unsignedLongAt: 9)
>>> 
>>> Struct>>c: anObject
>>>     "This method was automatically generated"
>>>     handle unsignedLongAt: 9 put: anObject value
>>> 
>>> question: did you initialise the Enum? before generating fields?
>>> 
>>> Esteban
>>> 
>>>> On 08 Jul 2016, at 20:42, Merwan Ouddane <merwanoudd...@gmail.com 
>>>> <mailto:merwanoudd...@gmail.com>> wrote:
>>>> 
>>>> Struct >> fieldsDesc
>>>>     ^#( void* a;
>>>>     Enum b;
>>>>     Enum c; 
>>>>     )
>>>> 
>>>> Enum >> enumDecl
>>>>     ^ #( TEST 1 )
>>>> 
>>>> I joined a .st with the struct and the enum, the package name is FFITest.
>>>> 
>>>> Merwan
>>>> 
>>>> On 08/07/2016 20:14, Esteban Lorenzano wrote:
>>>>> that still does not helps… show me the code!
>>>>> 
>>>>> Esteban
>>>>> 
>>>>>> On 08 Jul 2016, at 20:09, Merwan Ouddane <merwanoudd...@gmail.com 
>>>>>> <mailto:merwanoudd...@gmail.com>> wrote:
>>>>>> 
>>>>>> Sorry not unsigned longs but enumerations
>>>>>> 
>>>>>> On Fri, Jul 8, 2016 at 10:09 AM, Esteban Lorenzano <esteba...@gmail.com 
>>>>>> <mailto:esteba...@gmail.com>> wrote:
>>>>>> how do you declare this?
>>>>>> 
>>>>>>> On 08 Jul 2016, at 10:01, Merwan Ouddane <merwanoudd...@gmail.com 
>>>>>>> <mailto:merwanoudd...@gmail.com>> wrote:
>>>>>>> 
>>>>>>> I spoke too fast ^^'
>>>>>>> 
>>>>>>> struct Test {
>>>>>>>   void * ptr;
>>>>>>>   insigned long i;
>>>>>>>   insigned long j;
>>>>>>> }
>>>>>>> 
>>>>>>> Real size is 12, UFFI counts 24
>>>>>>> 
>>>>>>> Merwan
>>>>>>> 
>>>>>>> 
>>>>>>> Le 7 juil. 2016 10:02, "Merwan Ouddane" <merwanoudd...@gmail.com 
>>>>>>> <mailto:merwanoudd...@gmail.com>> a écrit :
>>>>>>> Now it is working, thank you :)
>>>>>>> 
>>>>>>> On Thu, Jul 7, 2016 at 8:42 AM, Esteban Lorenzano <esteba...@gmail.com 
>>>>>>> <mailto:esteba...@gmail.com>> wrote:
>>>>>>> Hi,
>>>>>>> 
>>>>>>> > On 07 Jul 2016, at 01:54, Ben Coman <b...@openinworld.com 
>>>>>>> > <mailto:b...@openinworld.com>> wrote:
>>>>>>> >
>>>>>>> > On Thu, Jul 7, 2016 at 12:58 AM, Merwan Ouddane 
>>>>>>> > <merwanoudd...@gmail.com <mailto:merwanoudd...@gmail.com>> wrote:
>>>>>>> >> PS: for the first example, the alignment is not respected, the vec3
>>>>>>> >> structure is starting at 9 but uffi is fetching it at 5
>>>>>>> >
>>>>>>> > Hi Esteban,
>>>>>>> >
>>>>>>> > Is it possible to get a feature or a recipe to output the sizeof or
>>>>>>> > offset of fields in types as understood by the Image, and the same
>>>>>>> > from a C side - that could be used as the standard first step in
>>>>>>> > troubleshooting these kinds of issues ?
>>>>>>> 
>>>>>>> FFIExternalType class>>sizeOf: ?
>>>>>>> 
>>>>>>> but that does not works for complex type sizes (like FFIExternalArray).
>>>>>>> 
>>>>>>> I don’t know what the problem is here, because in my test (attached) it 
>>>>>>> seems to be working fine.
>>>>>>> maybe problem is on how the Vec3 array is created, it should be 
>>>>>>> something like this:
>>>>>>> 
>>>>>>> Vec3 class>>iinitialize
>>>>>>>         self
>>>>>>>                 type: (FFIExternalType resolveType: 'double')
>>>>>>>                 size: 3
>>>>>>> 
>>>>>>> (is like that because FFITypeArray is more designed to be used creating 
>>>>>>> anonymous types than concretes, but well… )
>>>>>>> 
>>>>>>> in any case, it seems to be working for me.
>>>>>>> 
>>>>>>> Now, about the use…
>>>>>>> 
>>>>>>> doing this:
>>>>>>> 
>>>>>>> p := Position new.
>>>>>>> p v1 at: 1 put: 42.0.
>>>>>>> p v1 at: 1. “will print 0.0"
>>>>>>> 
>>>>>>> why? because it works making a copy (maybe it should work passing a 
>>>>>>> segment, as nested structs work, but this is how it works now).
>>>>>>> 
>>>>>>> What should work (at doesn’t) in this case is this:
>>>>>>> 
>>>>>>> v := Vector3 new.
>>>>>>> p := Position new.
>>>>>>> v at: 1 put: 42.0.
>>>>>>> p v1: v.
>>>>>>> p v1 at: 1. “will print 42.0"
>>>>>>> 
>>>>>>> it does not work because I made a mistake in field generation that I 
>>>>>>> already fixed… so you will need to update UFFI (and regenerate field 
>>>>>>> accessors) ;)
>>>>>>> 
>>>>>>> also… I will provide a fix to make first case work… just later because 
>>>>>>> now I’m going to my french lessons :)
>>>>>>> 
>>>>>>> Esteban
>>>>>>> 
>>>>>>> ps: for future reference, a description of: install this, run that, is 
>>>>>>> a lot easier to understand the problem (is a case of “show me the 
>>>>>>> code!”) :P
>>>>>>> 
>>>>>>> 
>>>>>>> 
>>>>>>> 
>>>>>>> >
>>>>>>> > cheers -ben
>>>>>>> >
>>>>>>> >>
>>>>>>> >>
>>>>>>> >> On 06/07/2016 17:55, Merwan Ouddane wrote:
>>>>>>> >>
>>>>>>> >> Another test:
>>>>>>> >> I replaced double by integer, for visibility...
>>>>>>> >> typedef struct vec3 {
>>>>>>> >>     int data[3];
>>>>>>> >> } vec3;
>>>>>>> >>
>>>>>>> >> add a second vec3 to position:
>>>>>>> >>
>>>>>>> >> typedef struct position {
>>>>>>> >>     int i;
>>>>>>> >>     vec3 vec;
>>>>>>> >>     vec3 vec2;
>>>>>>> >> } position;
>>>>>>> >>
>>>>>>> >> Now in pharo:
>>>>>>> >> Position >> fieldsDesc
>>>>>>> >> "self rebuildFieldAccessors"
>>>>>>> >>    ^ #(
>>>>>>> >>    int i;
>>>>>>> >>    Vec3 vec;
>>>>>>> >>    Vec3 vec2;
>>>>>>> >> )
>>>>>>> >>
>>>>>>> >> The size returned for each stucture is 16 instead of 12 that because 
>>>>>>> >> of the
>>>>>>> >> "8 byte alignment"
>>>>>>> >>
>>>>>>> >> Meaning that the "position" structure is corrupted.
>>>>>>> >>
>>>>>>> >> With this function:
>>>>>>> >>
>>>>>>> >>
>>>>>>> >> extern "C" void DLL_EXPORT fillStruct(position *position)
>>>>>>> >> {
>>>>>>> >>    position -> i = 19;
>>>>>>> >>    (position -> vec).data[0] = 1;
>>>>>>> >>    (position -> vec).data[1] = 2;
>>>>>>> >>    (position -> vec).data[2] = 3;
>>>>>>> >>    (position -> vec2).data[0] = 1;
>>>>>>> >>    (position -> vec2).data[1] = 2;
>>>>>>> >>    (position -> vec2).data[2] = 3;
>>>>>>> >> }
>>>>>>> >>
>>>>>>> >> We will get:
>>>>>>> >> position i == 19
>>>>>>> >> position vec at: 1 == 1
>>>>>>> >> position vec2 at: 1 == 2
>>>>>>> >>
>>>>>>> >>
>>>>>>> >> On Tue, Jul 5, 2016 at 3:12 PM, Ronie Salgado <ronies...@gmail.com 
>>>>>>> >> <mailto:ronies...@gmail.com>> wrote:
>>>>>>> >>>
>>>>>>> >>> I compiled the DLL using Visual Studio 2015 Community Edition. 
>>>>>>> >>> Later I
>>>>>>> >>> will check with mingw.
>>>>>>> >>>
>>>>>>> >>> 2016-07-05 14:58 GMT+02:00 Merwan Ouddane <merwanoudd...@gmail.com 
>>>>>>> >>> <mailto:merwanoudd...@gmail.com>>:
>>>>>>> >>>>
>>>>>>> >>>> Using codeblocks, mine are:
>>>>>>> >>>>
>>>>>>> >>>> mingw32-g++.exe -m32 -DBUILD_DLL -c main.cpp -o obj\Release\main.o
>>>>>>> >>>> mingw32-g++.exe -shared -Wl,--output-def=bin\Release\libTest.def
>>>>>>> >>>> -Wl,--out-implib=bin\Release\libTest.a -Wl,--dll  
>>>>>>> >>>> obj\Release\main.o  -o
>>>>>>> >>>> bin\Release\Test.dll -s -m32
>>>>>>> >>>>
>>>>>>> >>>>
>>>>>>> >>>> On Tue, Jul 5, 2016 at 2:52 PM, Merwan Ouddane 
>>>>>>> >>>> <merwanoudd...@gmail.com <mailto:merwanoudd...@gmail.com>>
>>>>>>> >>>> wrote:
>>>>>>> >>>>>
>>>>>>> >>>>> I am not moving from another plateform :/
>>>>>>> >>>>>
>>>>>>> >>>>> I tried it in pharo 6 and I it didn't work either.
>>>>>>> >>>>>
>>>>>>> >>>>> It could be my dll. What is your compilation line for the dll ?
>>>>>>> >>>>>
>>>>>>> >>>>> Thanks you,
>>>>>>> >>>>> Merwan
>>>>>>> >>>>>
>>>>>>> >>>>> On Tue, Jul 5, 2016 at 2:14 PM, Ronie Salgado 
>>>>>>> >>>>> <ronies...@gmail.com <mailto:ronies...@gmail.com>>
>>>>>>> >>>>> wrote:
>>>>>>> >>>>>>
>>>>>>> >>>>>> Hi Merwan,
>>>>>>> >>>>>>
>>>>>>> >>>>>> I tested this on Pharo 6 and it is working in Windows. However, 
>>>>>>> >>>>>> in 32
>>>>>>> >>>>>> bits Window doubles have an 8 byte alignment, unlike Linux where 
>>>>>>> >>>>>> they have a
>>>>>>> >>>>>> 4 byte alignment.
>>>>>>> >>>>>>
>>>>>>> >>>>>> Can you try doing the following before performing the ffi call in
>>>>>>> >>>>>> Windows, if you are moving an image from Linux or OS X:
>>>>>>> >>>>>>
>>>>>>> >>>>>> Vec3 rebuildFieldAccessors.
>>>>>>> >>>>>> Position rebuildFieldAccessors.
>>>>>>> >>>>>>
>>>>>>> >>>>>> Best regards,
>>>>>>> >>>>>> Ronie
>>>>>>> >>>>>>
>>>>>>> >>>>>> 2016-07-05 11:11 GMT+02:00 Merwan Ouddane 
>>>>>>> >>>>>> <merwanoudd...@gmail.com <mailto:merwanoudd...@gmail.com>>:
>>>>>>> >>>>>>>
>>>>>>> >>>>>>> Hi,
>>>>>>> >>>>>>>
>>>>>>> >>>>>>> I have an issue whith nested structures.
>>>>>>> >>>>>>>
>>>>>>> >>>>>>> I made some "dummy" structures in c:
>>>>>>> >>>>>>>
>>>>>>> >>>>>>>
>>>>>>> >>>>>>> typedef struct vec3 {
>>>>>>> >>>>>>>     double data[3];
>>>>>>> >>>>>>> } vec3;
>>>>>>> >>>>>>>
>>>>>>> >>>>>>> typedef struct position {
>>>>>>> >>>>>>>     int i;
>>>>>>> >>>>>>>     vec3 vec;
>>>>>>> >>>>>>> } position;
>>>>>>> >>>>>>>
>>>>>>> >>>>>>> And a "dummy" function to fill it:
>>>>>>> >>>>>>> void fillStruct(position *position)
>>>>>>> >>>>>>> {
>>>>>>> >>>>>>>    position -> i = 19;
>>>>>>> >>>>>>>    (position -> vec).data[0] = 1;
>>>>>>> >>>>>>>    (position -> vec).data[1] = 2;
>>>>>>> >>>>>>>    (position -> vec).data[2] = 3;
>>>>>>> >>>>>>> }
>>>>>>> >>>>>>>
>>>>>>> >>>>>>> But I can't make the nested structure work.
>>>>>>> >>>>>>> The "i" is correctly set to 19 but I have values that doesn't 
>>>>>>> >>>>>>> make any
>>>>>>> >>>>>>> sense in the vec3 structure.
>>>>>>> >>>>>>>
>>>>>>> >>>>>>> In Pharo
>>>>>>> >>>>>>> I declared the Double3 type for the array inside Vec3:
>>>>>>> >>>>>>> Double3 := FFITypeArray ofType: 'double' size: 3
>>>>>>> >>>>>>>
>>>>>>> >>>>>>> Vec3>>fieldsDesc
>>>>>>> >>>>>>>    ^ #(
>>>>>>> >>>>>>>    Double3 v;
>>>>>>> >>>>>>> )
>>>>>>> >>>>>>>
>>>>>>> >>>>>>> And the position:
>>>>>>> >>>>>>> Position>>fieldsDesc
>>>>>>> >>>>>>>    ^ #(
>>>>>>> >>>>>>>    int i;
>>>>>>> >>>>>>>    Vec3 vec;
>>>>>>> >>>>>>> )
>>>>>>> >>>>>>>
>>>>>>> >>>>>>> The ffi call:
>>>>>>> >>>>>>> ^ self ffiCall: #(void fillStruct(Position *position)) module:
>>>>>>> >>>>>>> 'Test.dll'
>>>>>>> >>>>>>>
>>>>>>> >>>>>>> Sorry for the long / messy mail :p
>>>>>>> >>>>>>>
>>>>>>> >>>>>>> Any clues ?
>>>>>>> >>>>>>>
>>>>>>> >>>>>>> Cheers,
>>>>>>> >>>>>>> Merwan
>>>>>>> >>>>>>
>>>>>>> >>>>>>
>>>>>>> >>>>>
>>>>>>> >>>>
>>>>>>> >>>
>>>>>>> >>
>>>>>>> >>
>>>>>>> >
>>>>>>> 
>>>>>>> 
>>>>>>> 
>>>>>> 
>>>>>> 
>>>>> 
>>>> 
>>>> <FFITest.st <http://ffitest.st/>>
>>> 
>> 
> 

Reply via email to