[plt-scheme] Questions about modules, compilation, namespaces, planet and ffi
[Sorry for not replying when you first posted this...]
On May 5, Bruno Deferrari wrote:
>
> * The first one: mzscheme crashes when loading this lib (it only
> happens with this lib, an only from mzscheme, on mred it loads it
> without crashing). I'm running plt-scheme 299.100.
>
> [...]
> ; gdb output
> #0 0x49c157a5 in __pthread_unlock () from /lib/libpthread.so.0
> [...]
This seems like some threading issue. I can't say more so I won't...
> * The second one: I have problems with callbacks, I cant get them to
> work. This code for example, I hava a callback thats going to be
> called when the window is rezised (resize-cb), but when that
> happens, the program stops with an error.
>
> ...
> (define (resize-cb ee) ; the func called when the win is resized
> (display "a\n"))
> ...
> (ecore-evas-callback-resize-set ee resize-cb) ; I set the callback
> ...
> (ecore-main-loop-begin) ; I start the main loop
>
> Then when I resize the window resize-cb gets called, and after it
> prints "a" it stops giving the following error:
>
> Scheme->C: expects argument of type <non-void-C-type>; given #<ctype>
That's a known problem, and I'll fix it at some point. The problem is
that it tries to convert the void result to a Scheme value, but there
is no void value to convert. The naive temporary solution is to
simply use _int for the return value of the callback function -- the
calling C code doesn't expect a return value so there's no harm done.
A slightly better temporary solution is to create a new _void type
that `translates' any Scheme object to a 0 _int value. Obviously, the
fix in the C code should be simple but I want to see what's the right
way to do this with libffi (in case there is some weird platform where
a void return value means different code from an int return value).
On May 8, Bruno Deferrari wrote:
> Well, after looking at foreign.c I found that on ffi_do_callback the
> return value's type isn't compared with _void before calling
> scheme_to_c. If the type is _void, scheme_to_c will always fail.
... and from the above explanation:
> Is this whats wrong??
Probably, and will require some care in making it work with _void by
avoiding the scheme_to_c call completely.
> or is it simply wrong to have a _void return type on callbacks??
That's the way things currently stand, but it should be fixed.
--
((lambda (x) (x x)) (lambda (x) (x x))) Eli Barzilay:
http://www.barzilay.org/ Maze is Life!