Pharo-dev
By thread
pharo-dev@lists.pharo.org
By month
Messages by month
- ----- 2026 -----
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2025 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2024 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2023 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2022 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2021 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2020 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2019 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2018 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2017 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2016 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2015 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2014 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2013 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2012 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2011 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2010 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2009 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2008 -----
- December
- November
- October
- September
- August
- July
- June
- May
- 3 participants
- 144622 messages
Re: [Pharo-project] NativeBoost help
by Igor Stasenko
On 4 May 2012 19:18, Nicolas Cellier <nicolas.cellier.aka.nice(a)gmail.com> wrote:
> Yes, on max too
> https://developer.apple.com/library/mac/#documentation/developertools/Conce…
>
> Structures. The called function returns structures according to their
> aligned size.
>
> Â Â Structures 1 or 2 bytes in size are placed in EAX.
>
> Â Â Structures 4 or 8 bytes in size are placed in: EAX and EDX.
>
okay.. i fixed it in NativeBoost-Core-IgorStasenko.58
> Â Â Structures of other sizes are placed at the address supplied by
> the caller. For example, the C++ language occasionally forces the
> compiler to return a value in memory when it would normally be
> returned in registers. See âPassing Argumentsâ for more information.
>
> I wonder if a structure of size 3 bytes can exist or is automatically
> extended on 4 bytes...
>
yes.. struct alignment is what i fear of..
IMO it is actually silly to not return struct in registers if it less
than 8 bytes
but not power of 2..
sounds like an artefact of establishing the standards :)
> $ cat > test_call.c <<END
>
> #include <stdio.h>
> typedef struct { char a,b,c; } abc;
> int main() {
> Â Â abc x;
> Â Â printf("sizeof(abc)=%d\n",sizeof x);
> Â Â return 0;
> }
> END
>
> $ gcc test_call.c
> $ ./a.exe
> sizeof(abc)=3
>
> And what would be the calling conventions of cygwin gcc ?
>
> $ cat > test_call.c <<END
>
> #include <stdio.h>
> typedef struct { char a,b,c; } abc;
> abc sub() {
> Â abc result;
> Â result.a='a';
> Â result.b='b';
> Â result.c='c';
> Â return result;
> }
> int main() {
> Â Â abc x=sub();
> Â Â printf("sizeof(abc)=%d abc.a=$c\n",sizeof x,x.a);
> Â Â return 0;
> }
> END
>
> $ gcc test_call.c
> $ ./a.exe
> sizeof(abc)=3 abc.a=a
>
> $ gcc -S test_call.c
> $ cat test_call.S
>
>     .file  "test_call.c"
> Â Â Â Â .text
> .globl _sub
>     .def   _sub;  .scl   2;    .type  32;   .endef
> _sub:
>     pushl  %ebp
>     movl   %esp, %ebp
>     subl   $16, %esp
>     movl   8(%ebp), %eax
>     movb   $97, -3(%ebp)
>     movb   $98, -2(%ebp)
>     movb   $99, -1(%ebp)
>     movzwl  -3(%ebp), %edx
>     movw   %dx, (%eax)
>     movzbl  -1(%ebp), %edx
>     movb   %dl, 2(%eax)
> Â Â Â Â leave
>     ret   $4
>     .def   ___main;     .scl   2;    .type  32;   .endef
> Â Â Â Â .section .rdata,"dr"
> LC0:
> Â Â Â Â .ascii "sizeof(abc)=%d\12\0"
> Â Â Â Â .text
> .globl _main
>     .def   _main;  .scl   2;    .type  32;   .endef
> _main:
>     leal   4(%esp), %ecx
>     andl   $-16, %esp
>     pushl  -4(%ecx)
>     pushl  %ebp
>     movl   %esp, %ebp
>     pushl  %ecx
>     subl   $36, %esp
>     call   ___main
>     leal   -11(%ebp), %eax
>     movl   %eax, (%esp)
>     call   _sub
>     subl   $4, %esp
>     movl   $3, 4(%esp)
>     movl   $LC0, (%esp)
>     call   _printf
>     movl   $0, %eax
>     movl   -4(%ebp), %ecx
> Â Â Â Â leave
>     leal   -4(%ecx), %esp
> Â Â Â Â ret
>     .def   _printf;     .scl   2;    .type  32;   .endef
>
> But of course, you already were faster than me...
>
> Nicolas
>
> 2012/5/4 Igor Stasenko <siguctua(a)gmail.com>:
>> On 4 May 2012 18:37, Eliot Miranda <eliot.miranda(a)gmail.com> wrote:
>>>
>>>
>>> On Fri, May 4, 2012 at 6:13 AM, Igor Stasenko <siguctua(a)gmail.com> wrote:
>>>>
>>>> On 4 May 2012 10:38, Luc Fabresse <luc.fabresse(a)gmail.com> wrote:
>>>> > 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?
>>>> >
>>>>
>>>> i don't know.. this is a bit shady part of C ABI.
>>>> Some compilers use return-by-value, some return by pointer
>>>> by forcing a caller to pass a hidden implicit argument as a pointer to
>>>> the struct, which then filled with values by
>>>> the function you call.
>>>
>>>
>>> IIRC x86 ABIs (all the ones I encountered at least, windows, mac, linux,
>>> solaris) Â support structure return (by-value structure return) by passing a
>>> hidden first argument which is a pointer to a structure into which to copy
>>> the result. Â The callee copies the result back through this pointer.
>>>
>>> Where these ABIs differ is in returning small structures. Â On win32
>>> structures a power-of-two in size of 8 bytes or less are returned in
>>> EAX:EDX. Â IIRC on linux and mac all structures are returned through the
>>> hidden first argument pointer. Â See
>>> ThreadedIA32FFIPlugin>>returnStructInRegisters:
>>>
>> on macs (at least what gcc generates) it also returns structs <=8
>> bytes size in registers:
>>
>>
>> so , currently i implemented it like that:
>> if sizeof(struct) <= 8 then i assume function returns it in EAX: EDX
>> otherwise via hidden pointer.
>>
>>>>
>>>>
>>>> It is easy to add support for that, but to make it work correctly can
>>>> be tricky.
>>>> See this, for example:
>>>>
>>>> http://stackoverflow.com/questions/161788/are-there-any-downsides-to-passin…
>>>>
>>>>
>>>> >>
>>>> >>
>>>> >> 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.
>>>> >
>>>>
>>>>
>>>> you don't. if function takes an implicit struct pointer, you can just
>>>> rewrite the function signature from
>>>> NBCvSize cvGetSize(IplImage self)
>>>> to:
>>>>
>>>> void cvGetSize(NBCvSize hidden, IplImage self)
>>>>
>>>> and so, you pass a fresh instance of NBCvSize as argument, which
>>>> function then fill.
>>>> But if C compiler using registers to return struct.. then you're screwed
>>>> :)
>>>>
>>>> Anyways, Luc i will try to read docs about C ABI and see if we can
>>>> easily add support for that.
>>>>
>>>> --
>>>> Best regards,
>>>> Igor Stasenko.
>>>>
>>>
>>>
>>>
>>> --
>>> best,
>>> Eliot
>>>
>>
>>
>>
>> --
>> Best regards,
>> Igor Stasenko.
>
--
Best regards,
Igor Stasenko.
May 4, 2012
Re: [Pharo-project] NativeBoost help
by Nicolas Cellier
2012/5/4 Nicolas Cellier <nicolas.cellier.aka.nice(a)gmail.com>:
> Yes, on max too
> https://developer.apple.com/library/mac/#documentation/developertools/Conce…
>
> Structures. The called function returns structures according to their
> aligned size.
>
> Â Â Structures 1 or 2 bytes in size are placed in EAX.
>
> Â Â Structures 4 or 8 bytes in size are placed in: EAX and EDX.
>
> Â Â Structures of other sizes are placed at the address supplied by
> the caller. For example, the C++ language occasionally forces the
> compiler to return a value in memory when it would normally be
> returned in registers. See âPassing Argumentsâ for more information.
>
> I wonder if a structure of size 3 bytes can exist or is automatically
> extended on 4 bytes...
>
> $ cat > test_call.c <<END
>
> #include <stdio.h>
> typedef struct { char a,b,c; } abc;
> int main() {
> Â Â abc x;
> Â Â printf("sizeof(abc)=%d\n",sizeof x);
> Â Â return 0;
> }
> END
>
> $ gcc test_call.c
> $ ./a.exe
> sizeof(abc)=3
>
> And what would be the calling conventions of cygwin gcc ?
>
> $ cat > test_call.c <<END
>
> #include <stdio.h>
> typedef struct { char a,b,c; } abc;
> abc sub() {
> Â abc result;
> Â result.a='a';
> Â result.b='b';
> Â result.c='c';
> Â return result;
> }
> int main() {
> Â Â abc x=sub();
> Â Â printf("sizeof(abc)=%d abc.a=$c\n",sizeof x,x.a);
> Â Â return 0;
> }
> END
>
> $ gcc test_call.c
> $ ./a.exe
> sizeof(abc)=3 abc.a=a
>
> $ gcc -S test_call.c
> $ cat test_call.S
>
>     .file  "test_call.c"
> Â Â Â Â .text
> .globl _sub
>     .def   _sub;  .scl   2;    .type  32;   .endef
> _sub:
>     pushl  %ebp
>     movl   %esp, %ebp
>     subl   $16, %esp
>     movl   8(%ebp), %eax
>     movb   $97, -3(%ebp)
>     movb   $98, -2(%ebp)
>     movb   $99, -1(%ebp)
>     movzwl  -3(%ebp), %edx
>     movw   %dx, (%eax)
>     movzbl  -1(%ebp), %edx
>     movb   %dl, 2(%eax)
> Â Â Â Â leave
>     ret   $4
>     .def   ___main;     .scl   2;    .type  32;   .endef
> Â Â Â Â .section .rdata,"dr"
> LC0:
> Â Â Â Â .ascii "sizeof(abc)=%d\12\0"
> Â Â Â Â .text
> .globl _main
>     .def   _main;  .scl   2;    .type  32;   .endef
> _main:
>     leal   4(%esp), %ecx
>     andl   $-16, %esp
>     pushl  -4(%ecx)
>     pushl  %ebp
>     movl   %esp, %ebp
>     pushl  %ecx
>     subl   $36, %esp
>     call   ___main
>     leal   -11(%ebp), %eax
>     movl   %eax, (%esp)
>     call   _sub
>     subl   $4, %esp
>     movl   $3, 4(%esp)
>     movl   $LC0, (%esp)
>     call   _printf
>     movl   $0, %eax
>     movl   -4(%ebp), %ecx
> Â Â Â Â leave
>     leal   -4(%ecx), %esp
> Â Â Â Â ret
>     .def   _printf;     .scl   2;    .type  32;   .endef
>
> But of course, you already were faster than me...
>
> Nicolas
>
Argh, no, copy paste error...
$ cat test_call.S
.file "test_call.c"
.text
.globl _sub
.def _sub; .scl 2; .type 32; .endef
_sub:
pushl %ebp
movl %esp, %ebp
subl $16, %esp
movl 8(%ebp), %eax
movb $97, -3(%ebp)
movb $98, -2(%ebp)
movb $99, -1(%ebp)
movzwl -3(%ebp), %edx
movw %dx, (%eax)
movzbl -1(%ebp), %edx
movb %dl, 2(%eax)
leave
ret $4
.def ___main; .scl 2; .type 32; .endef
.section .rdata,"dr"
LC0:
.ascii "sizeof(abc)=%d abc.a=%c\12\0"
.text
.globl _main
.def _main; .scl 2; .type 32; .endef
_main:
leal 4(%esp), %ecx
andl $-16, %esp
pushl -4(%ecx)
pushl %ebp
movl %esp, %ebp
pushl %ecx
subl $36, %esp
call ___main
leal -11(%ebp), %eax
movl %eax, (%esp)
call _sub
subl $4, %esp
movzbl -11(%ebp), %eax
movsbl %al, %eax
movl %eax, 8(%esp)
movl $3, 4(%esp)
movl $LC0, (%esp)
call _printf
movl $0, %eax
movl -4(%ebp), %ecx
leave
leal -4(%ecx), %esp
ret
.def _printf; .scl 2; .type 32; .endef
> 2012/5/4 Igor Stasenko <siguctua(a)gmail.com>:
>> On 4 May 2012 18:37, Eliot Miranda <eliot.miranda(a)gmail.com> wrote:
>>>
>>>
>>> On Fri, May 4, 2012 at 6:13 AM, Igor Stasenko <siguctua(a)gmail.com> wrote:
>>>>
>>>> On 4 May 2012 10:38, Luc Fabresse <luc.fabresse(a)gmail.com> wrote:
>>>> > 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?
>>>> >
>>>>
>>>> i don't know.. this is a bit shady part of C ABI.
>>>> Some compilers use return-by-value, some return by pointer
>>>> by forcing a caller to pass a hidden implicit argument as a pointer to
>>>> the struct, which then filled with values by
>>>> the function you call.
>>>
>>>
>>> IIRC x86 ABIs (all the ones I encountered at least, windows, mac, linux,
>>> solaris) Â support structure return (by-value structure return) by passing a
>>> hidden first argument which is a pointer to a structure into which to copy
>>> the result. Â The callee copies the result back through this pointer.
>>>
>>> Where these ABIs differ is in returning small structures. Â On win32
>>> structures a power-of-two in size of 8 bytes or less are returned in
>>> EAX:EDX. Â IIRC on linux and mac all structures are returned through the
>>> hidden first argument pointer. Â See
>>> ThreadedIA32FFIPlugin>>returnStructInRegisters:
>>>
>> on macs (at least what gcc generates) it also returns structs <=8
>> bytes size in registers:
>>
>>
>> so , currently i implemented it like that:
>> if sizeof(struct) <= 8 then i assume function returns it in EAX: EDX
>> otherwise via hidden pointer.
>>
>>>>
>>>>
>>>> It is easy to add support for that, but to make it work correctly can
>>>> be tricky.
>>>> See this, for example:
>>>>
>>>> http://stackoverflow.com/questions/161788/are-there-any-downsides-to-passin…
>>>>
>>>>
>>>> >>
>>>> >>
>>>> >> 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.
>>>> >
>>>>
>>>>
>>>> you don't. if function takes an implicit struct pointer, you can just
>>>> rewrite the function signature from
>>>> NBCvSize cvGetSize(IplImage self)
>>>> to:
>>>>
>>>> void cvGetSize(NBCvSize hidden, IplImage self)
>>>>
>>>> and so, you pass a fresh instance of NBCvSize as argument, which
>>>> function then fill.
>>>> But if C compiler using registers to return struct.. then you're screwed
>>>> :)
>>>>
>>>> Anyways, Luc i will try to read docs about C ABI and see if we can
>>>> easily add support for that.
>>>>
>>>> --
>>>> Best regards,
>>>> Igor Stasenko.
>>>>
>>>
>>>
>>>
>>> --
>>> best,
>>> Eliot
>>>
>>
>>
>>
>> --
>> Best regards,
>> Igor Stasenko.
May 4, 2012
Re: [Pharo-project] NativeBoost help
by Nicolas Cellier
Yes, on max too
https://developer.apple.com/library/mac/#documentation/developertools/Conce…
Structures. The called function returns structures according to their
aligned size.
Structures 1 or 2 bytes in size are placed in EAX.
Structures 4 or 8 bytes in size are placed in: EAX and EDX.
Structures of other sizes are placed at the address supplied by
the caller. For example, the C++ language occasionally forces the
compiler to return a value in memory when it would normally be
returned in registers. See âPassing Argumentsâ for more information.
I wonder if a structure of size 3 bytes can exist or is automatically
extended on 4 bytes...
$ cat > test_call.c <<END
#include <stdio.h>
typedef struct { char a,b,c; } abc;
int main() {
abc x;
printf("sizeof(abc)=%d\n",sizeof x);
return 0;
}
END
$ gcc test_call.c
$ ./a.exe
sizeof(abc)=3
And what would be the calling conventions of cygwin gcc ?
$ cat > test_call.c <<END
#include <stdio.h>
typedef struct { char a,b,c; } abc;
abc sub() {
abc result;
result.a='a';
result.b='b';
result.c='c';
return result;
}
int main() {
abc x=sub();
printf("sizeof(abc)=%d abc.a=$c\n",sizeof x,x.a);
return 0;
}
END
$ gcc test_call.c
$ ./a.exe
sizeof(abc)=3 abc.a=a
$ gcc -S test_call.c
$ cat test_call.S
.file "test_call.c"
.text
.globl _sub
.def _sub; .scl 2; .type 32; .endef
_sub:
pushl %ebp
movl %esp, %ebp
subl $16, %esp
movl 8(%ebp), %eax
movb $97, -3(%ebp)
movb $98, -2(%ebp)
movb $99, -1(%ebp)
movzwl -3(%ebp), %edx
movw %dx, (%eax)
movzbl -1(%ebp), %edx
movb %dl, 2(%eax)
leave
ret $4
.def ___main; .scl 2; .type 32; .endef
.section .rdata,"dr"
LC0:
.ascii "sizeof(abc)=%d\12\0"
.text
.globl _main
.def _main; .scl 2; .type 32; .endef
_main:
leal 4(%esp), %ecx
andl $-16, %esp
pushl -4(%ecx)
pushl %ebp
movl %esp, %ebp
pushl %ecx
subl $36, %esp
call ___main
leal -11(%ebp), %eax
movl %eax, (%esp)
call _sub
subl $4, %esp
movl $3, 4(%esp)
movl $LC0, (%esp)
call _printf
movl $0, %eax
movl -4(%ebp), %ecx
leave
leal -4(%ecx), %esp
ret
.def _printf; .scl 2; .type 32; .endef
But of course, you already were faster than me...
Nicolas
2012/5/4 Igor Stasenko <siguctua(a)gmail.com>:
> On 4 May 2012 18:37, Eliot Miranda <eliot.miranda(a)gmail.com> wrote:
>>
>>
>> On Fri, May 4, 2012 at 6:13 AM, Igor Stasenko <siguctua(a)gmail.com> wrote:
>>>
>>> On 4 May 2012 10:38, Luc Fabresse <luc.fabresse(a)gmail.com> wrote:
>>> > 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?
>>> >
>>>
>>> i don't know.. this is a bit shady part of C ABI.
>>> Some compilers use return-by-value, some return by pointer
>>> by forcing a caller to pass a hidden implicit argument as a pointer to
>>> the struct, which then filled with values by
>>> the function you call.
>>
>>
>> IIRC x86 ABIs (all the ones I encountered at least, windows, mac, linux,
>> solaris) Â support structure return (by-value structure return) by passing a
>> hidden first argument which is a pointer to a structure into which to copy
>> the result. Â The callee copies the result back through this pointer.
>>
>> Where these ABIs differ is in returning small structures. Â On win32
>> structures a power-of-two in size of 8 bytes or less are returned in
>> EAX:EDX. Â IIRC on linux and mac all structures are returned through the
>> hidden first argument pointer. Â See
>> ThreadedIA32FFIPlugin>>returnStructInRegisters:
>>
> on macs (at least what gcc generates) it also returns structs <=8
> bytes size in registers:
>
>
> so , currently i implemented it like that:
> if sizeof(struct) <= 8 then i assume function returns it in EAX: EDX
> otherwise via hidden pointer.
>
>>>
>>>
>>> It is easy to add support for that, but to make it work correctly can
>>> be tricky.
>>> See this, for example:
>>>
>>> http://stackoverflow.com/questions/161788/are-there-any-downsides-to-passin…
>>>
>>>
>>> >>
>>> >>
>>> >> 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.
>>> >
>>>
>>>
>>> you don't. if function takes an implicit struct pointer, you can just
>>> rewrite the function signature from
>>> NBCvSize cvGetSize(IplImage self)
>>> to:
>>>
>>> void cvGetSize(NBCvSize hidden, IplImage self)
>>>
>>> and so, you pass a fresh instance of NBCvSize as argument, which
>>> function then fill.
>>> But if C compiler using registers to return struct.. then you're screwed
>>> :)
>>>
>>> Anyways, Luc i will try to read docs about C ABI and see if we can
>>> easily add support for that.
>>>
>>> --
>>> Best regards,
>>> Igor Stasenko.
>>>
>>
>>
>>
>> --
>> best,
>> Eliot
>>
>
>
>
> --
> Best regards,
> Igor Stasenko.
May 4, 2012
Re: [Pharo-project] NativeBoost help
by Igor Stasenko
On 4 May 2012 18:52, Eliot Miranda <eliot.miranda(a)gmail.com> wrote:
>
>
> On Fri, May 4, 2012 at 9:44 AM, Igor Stasenko <siguctua(a)gmail.com> wrote:
>>
>> On 4 May 2012 18:37, Eliot Miranda <eliot.miranda(a)gmail.com> wrote:
>> >
>> >
>> > On Fri, May 4, 2012 at 6:13 AM, Igor Stasenko <siguctua(a)gmail.com>
>> > wrote:
>> >>
>> >> On 4 May 2012 10:38, Luc Fabresse <luc.fabresse(a)gmail.com> wrote:
>> >> > 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?
>> >> >
>> >>
>> >> i don't know.. this is a bit shady part of C ABI.
>> >> Some compilers use return-by-value, some return by pointer
>> >> by forcing a caller to pass a hidden implicit argument as a pointer to
>> >> the struct, which then filled with values by
>> >> the function you call.
>> >
>> >
>> > IIRC x86 ABIs (all the ones I encountered at least, windows, mac, linux,
>> > solaris) Â support structure return (by-value structure return) by
>> > passing a
>> > hidden first argument which is a pointer to a structure into which to
>> > copy
>> > the result. Â The callee copies the result back through this pointer.
>> >
>> > Where these ABIs differ is in returning small structures. Â On win32
>> > structures a power-of-two in size of 8 bytes or less are returned in
>> > EAX:EDX. Â IIRC on linux and mac all structures are returned through the
>> > hidden first argument pointer. Â See
>> > ThreadedIA32FFIPlugin>>returnStructInRegisters:
>> >
>> on macs (at least what gcc generates) it also returns structs <=8
>> bytes size in registers:
>>
>>
>> so , currently i implemented it like that:
>> if sizeof(struct) <= 8 then i assume function returns it in EAX: EDX
>> otherwise via hidden pointer.
>
>
> add a test for a structs like
>   typedef struct { char a; char b; char c; } threeBytes;
> Â Â typedef struct { short a; short b; short c; } sixBytes;
>
> (and 5 & 7). Â You should see on Mac and Windows these are not passed back in
> registers.
>
omg.. what a mess..
so it actually uses for structs with 1, 2, 4 and 8 bytes size...
>>
>> >>
>> >>
>> >> It is easy to add support for that, but to make it work correctly can
>> >> be tricky.
>> >> See this, for example:
>> >>
>> >>
>> >> http://stackoverflow.com/questions/161788/are-there-any-downsides-to-passin…
>> >>
>> >>
>> >> >>
>> >> >>
>> >> >> 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.
>> >> >
>> >>
>> >>
>> >> you don't. if function takes an implicit struct pointer, you can just
>> >> rewrite the function signature from
>> >> NBCvSize cvGetSize(IplImage self)
>> >> to:
>> >>
>> >> void cvGetSize(NBCvSize hidden, IplImage self)
>> >>
>> >> and so, you pass a fresh instance of NBCvSize as argument, which
>> >> function then fill.
>> >> But if C compiler using registers to return struct.. then you're
>> >> screwed
>> >> :)
>> >>
>> >> Anyways, Luc i will try to read docs about C ABI and see if we can
>> >> easily add support for that.
>> >>
>> >> --
>> >> Best regards,
>> >> Igor Stasenko.
>> >>
>> >
>> >
>> >
>> > --
>> > best,
>> > Eliot
>> >
>>
>>
>>
>> --
>> Best regards,
>> Igor Stasenko.
>
>
>
>
> --
> best,
> Eliot
>
--
Best regards,
Igor Stasenko.
May 4, 2012
[Pharo-project] Pharo Kernel 2.0
by Pavel Krivanek
Hi,
Markus added all packages to the Pharo 2.0 repository (THANKS!) so I was
able to bring Pharo Kernel 2.0 image to life. Few notices:
- I had to add FileSystem to the kernel. I added 'FileSystem-AnsiStreams'
'FileSystem-Core' 'FileSystem-Disk' and 'FileSystem-Memory' but maybe some
are not necessary.
- CommandLine has poor packaging because it includes tests too.
- SimpleCodeLoader is now not needed and can be removed
- CommandLine package will need some some next changes like to be
independent on Compiler (because of Fuel)
- KMPragmaKeymapBuilder needs better cleanup code.
- I added 'Ring-Core-Kernel' 'Ring-Core-Containers' and 'Fuel'
'FuelMetalevel' 'FuelPackageLoader' packages (Fuel from external repository)
I will open the issues.
Cheers,
-- Pavel
May 4, 2012
Re: [Pharo-project] NativeBoost help
by Eliot Miranda
On Fri, May 4, 2012 at 9:44 AM, Igor Stasenko <siguctua(a)gmail.com> wrote:
> On 4 May 2012 18:37, Eliot Miranda <eliot.miranda(a)gmail.com> wrote:
> >
> >
> > On Fri, May 4, 2012 at 6:13 AM, Igor Stasenko <siguctua(a)gmail.com>
> wrote:
> >>
> >> On 4 May 2012 10:38, Luc Fabresse <luc.fabresse(a)gmail.com> wrote:
> >> > 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?
> >> >
> >>
> >> i don't know.. this is a bit shady part of C ABI.
> >> Some compilers use return-by-value, some return by pointer
> >> by forcing a caller to pass a hidden implicit argument as a pointer to
> >> the struct, which then filled with values by
> >> the function you call.
> >
> >
> > IIRC x86 ABIs (all the ones I encountered at least, windows, mac, linux,
> > solaris) support structure return (by-value structure return) by
> passing a
> > hidden first argument which is a pointer to a structure into which to
> copy
> > the result. The callee copies the result back through this pointer.
> >
> > Where these ABIs differ is in returning small structures. On win32
> > structures a power-of-two in size of 8 bytes or less are returned in
> > EAX:EDX. IIRC on linux and mac all structures are returned through the
> > hidden first argument pointer. See
> > ThreadedIA32FFIPlugin>>returnStructInRegisters:
> >
> on macs (at least what gcc generates) it also returns structs <=8
> bytes size in registers:
>
>
> so , currently i implemented it like that:
> if sizeof(struct) <= 8 then i assume function returns it in EAX: EDX
> otherwise via hidden pointer.
>
add a test for a structs like
typedef struct { char a; char b; char c; } threeBytes;
typedef struct { short a; short b; short c; } sixBytes;
(and 5 & 7). You should see on Mac and Windows these are not passed back
in registers.
> >>
> >>
> >> It is easy to add support for that, but to make it work correctly can
> >> be tricky.
> >> See this, for example:
> >>
> >>
> http://stackoverflow.com/questions/161788/are-there-any-downsides-to-passin…
> >>
> >>
> >> >>
> >> >>
> >> >> 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.
> >> >
> >>
> >>
> >> you don't. if function takes an implicit struct pointer, you can just
> >> rewrite the function signature from
> >> NBCvSize cvGetSize(IplImage self)
> >> to:
> >>
> >> void cvGetSize(NBCvSize hidden, IplImage self)
> >>
> >> and so, you pass a fresh instance of NBCvSize as argument, which
> >> function then fill.
> >> But if C compiler using registers to return struct.. then you're screwed
> >> :)
> >>
> >> Anyways, Luc i will try to read docs about C ABI and see if we can
> >> easily add support for that.
> >>
> >> --
> >> Best regards,
> >> Igor Stasenko.
> >>
> >
> >
> >
> > --
> > best,
> > Eliot
> >
>
>
>
> --
> Best regards,
> Igor Stasenko.
>
--
best,
Eliot
May 4, 2012
Re: [Pharo-project] NativeBoost help
by Igor Stasenko
On 4 May 2012 18:37, Eliot Miranda <eliot.miranda(a)gmail.com> wrote:
>
>
> On Fri, May 4, 2012 at 6:13 AM, Igor Stasenko <siguctua(a)gmail.com> wrote:
>>
>> On 4 May 2012 10:38, Luc Fabresse <luc.fabresse(a)gmail.com> wrote:
>> > 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?
>> >
>>
>> i don't know.. this is a bit shady part of C ABI.
>> Some compilers use return-by-value, some return by pointer
>> by forcing a caller to pass a hidden implicit argument as a pointer to
>> the struct, which then filled with values by
>> the function you call.
>
>
> IIRC x86 ABIs (all the ones I encountered at least, windows, mac, linux,
> solaris) Â support structure return (by-value structure return) by passing a
> hidden first argument which is a pointer to a structure into which to copy
> the result. Â The callee copies the result back through this pointer.
>
> Where these ABIs differ is in returning small structures. Â On win32
> structures a power-of-two in size of 8 bytes or less are returned in
> EAX:EDX. Â IIRC on linux and mac all structures are returned through the
> hidden first argument pointer. Â See
> ThreadedIA32FFIPlugin>>returnStructInRegisters:
>
on macs (at least what gcc generates) it also returns structs <=8
bytes size in registers:
so , currently i implemented it like that:
if sizeof(struct) <= 8 then i assume function returns it in EAX: EDX
otherwise via hidden pointer.
>>
>>
>> It is easy to add support for that, but to make it work correctly can
>> be tricky.
>> See this, for example:
>>
>> http://stackoverflow.com/questions/161788/are-there-any-downsides-to-passin…
>>
>>
>> >>
>> >>
>> >> 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.
>> >
>>
>>
>> you don't. if function takes an implicit struct pointer, you can just
>> rewrite the function signature from
>> NBCvSize cvGetSize(IplImage self)
>> to:
>>
>> void cvGetSize(NBCvSize hidden, IplImage self)
>>
>> and so, you pass a fresh instance of NBCvSize as argument, which
>> function then fill.
>> But if C compiler using registers to return struct.. then you're screwed
>> :)
>>
>> Anyways, Luc i will try to read docs about C ABI and see if we can
>> easily add support for that.
>>
>> --
>> Best regards,
>> Igor Stasenko.
>>
>
>
>
> --
> best,
> Eliot
>
--
Best regards,
Igor Stasenko.
May 4, 2012
Re: [Pharo-project] Artefact - a PDF framework
by Igor Stasenko
On 2 May 2012 16:53, Sean P. DeNigris <sean(a)clipperadams.com> wrote:
>
> Stephan Eggermont wrote
>>
>> Don't you think it would be much less work
>> to port Christian Haider's work to Pharo? The namespace extensions to ring
>> should
>> be helpful to make two-way changes from both the VW and Pharo side.
>>
>
> I was thinking the same thing. The usual Smalltalk duplication of effort
> seems to have been taken to new heights with PDF libs ;-) I totally
> understand the enthusiasm, because I really want it to (although more
> viewing than generating)! I looked at doing the port at ESUG last year, but
> hit the namespace wall...
>
> Sean
>
> p.s. I was reading the Cairo website the other day and PDF is one of the
> "output targets". Could that be helpful here?
yes, you are right..
http://www.cairographics.org/manual/cairo-PDF-Surfaces.html
>
> --
> View this message in context: http://forum.world.st/Artefact-a-PDF-framework-tp4585877p4603431.html
> Sent from the Pharo Smalltalk mailing list archive at Nabble.com.
>
--
Best regards,
Igor Stasenko.
May 4, 2012
Re: [Pharo-project] NativeBoost help
by Eliot Miranda
On Fri, May 4, 2012 at 6:13 AM, Igor Stasenko <siguctua(a)gmail.com> wrote:
> On 4 May 2012 10:38, Luc Fabresse <luc.fabresse(a)gmail.com> wrote:
> > 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?
> >
>
> i don't know.. this is a bit shady part of C ABI.
> Some compilers use return-by-value, some return by pointer
> by forcing a caller to pass a hidden implicit argument as a pointer to
> the struct, which then filled with values by
> the function you call.
>
IIRC x86 ABIs (all the ones I encountered at least, windows, mac, linux,
solaris) support structure return (by-value structure return) by passing a
hidden first argument which is a pointer to a structure into which to copy
the result. The callee copies the result back through this pointer.
Where these ABIs differ is in returning small structures. On win32
structures a power-of-two in size of 8 bytes or less are returned in
EAX:EDX. IIRC on linux and mac all structures are returned through the
hidden first argument pointer. See
ThreadedIA32FFIPlugin>>returnStructInRegisters:
>
> It is easy to add support for that, but to make it work correctly can
> be tricky.
> See this, for example:
>
> http://stackoverflow.com/questions/161788/are-there-any-downsides-to-passin…
>
>
> >>
> >>
> >> 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.
> >
>
>
> you don't. if function takes an implicit struct pointer, you can just
> rewrite the function signature from
> NBCvSize cvGetSize(IplImage self)
> to:
>
> void cvGetSize(NBCvSize hidden, IplImage self)
>
> and so, you pass a fresh instance of NBCvSize as argument, which
> function then fill.
> But if C compiler using registers to return struct.. then you're screwed :)
>
> Anyways, Luc i will try to read docs about C ABI and see if we can
> easily add support for that.
>
> --
> Best regards,
> Igor Stasenko.
>
>
--
best,
Eliot
May 4, 2012
Re: [Pharo-project] Drawing speed for animations?
by Denis Kudriashov
Hello
Try World addDefferedUIMessage: [morph step].
and run your full loop with delays in separated process
2012/5/4, Martin Drautzburg <Martin.Drautzburg(a)web.de>:
> Hello all,
>
> I am doing some smooth scrolling expriments. I use a step method in which I
> adjust the display. When I set stepTime to 0, the time between steps is
> still
> between 10 and 40 msces. During a scroll which takes 10 steps I see apx 1000
> redraws of fairly simple Morphs. That is 100 redraws per step. When an
> average
> step takes apx. 20 msec this is 0.2 msec per redaw. Does this look normal,
> or
> should I hunt for flaws in my program?
>
> If this is the normal speed, then I cannot do animations in morphic, such
> that
> I get a new frame every 14 msec (70 Hz), at least not the way I am trying to
> do it.
>
> Another thing I cannot explain is the following: when I repeatedly call my
> step method from another method (putting a Delay between the calls), the
> display does not always update. I just see the end of the scroll, but not
> the
> steps in between. Only when I add a World displayWorld I see the
> intermediate
> scroll positions. However, when I call step from an explorer the Display
> updates just fine, without an explicit displayWorld. Why is that so?
>
> --
> Martin
>
>
May 4, 2012