[gambit-list] os_dyn

Michele Zaffalon michele.zaffalon at gmail.com
Mon Oct 5 21:02:05 EDT 2009


> It used to work!  I noticed a stupid bug in lib/os_dyn.c .  You have to
> replace all the ___WORD_SIZE by ___WORD_WIDTH and then recompile the system
> with "make".
>
> Then, on supported platforms such as 32 bit intel, you'll be able to run
> code like this which passes a closure to a foreign function:
>
> (c-declare "
>
> int f( int g( int x ) )
> { return g(1) + g(2); }
>
> ")
>
> (define f (c-lambda ((function (int) int)) int "f"))
>
> (c-define (square n) (int) int "square" ""
>  (* n n))
>
> (pp (square 10)) ;; prints 100
>
> (pp (f square)) ;; prints 5 (i.e. 1^2 + 2^2)
>
> (pp (f (lambda (x) (expt 2 x)))) ;; prints 6 (i.e. 2^1 + 2^2)
>
> It is the last expression, i.e. the call (f (lambda (x) (expt 2 x))), which
> is enabled by the dynamic code generation.  The call (f square) is always
> supported because it does not require dynamic code generation (because
> square is defined with a c-define form).
>
> Marc
>
>

I made clean ./configure CFLAGS="-g" and make after replacing
___WORD_SIZE by ___WORD_WIDTH in os_dyn.c

This is what I then do: bind.scm contains
(c-declare "
int f(int g(int x)) {return g(1)+g(2);}
")

(define f
  (c-lambda ((function (int) int)) int "f"))

after doing gsc bind.scm, I invoke gsi

> (load "bind")
"/home/michele/src/scheme/gambit/ffi/4/bind.o1"
> (f (lambda (x) (expt 2 x)))
I get a segmentation fault

bt full is provided.

System is
OpenBSD 4.5 (GENERIC) #1749: Sat Feb 28 14:51:18 MST 2009
    deraadt at i386.openbsd.org:/usr/src/sys/arch/i386/compile/GENERIC
cpu0: Mobile Intel(R) Pentium(R) 4 CPU 2.30GHz ("GenuineIntel"
686-class) 2.16 GHz

michele
-------------- next part --------------
An embedded and charset-unspecified text was scrubbed...
Name: gdb.txt
URL: <http://mailman.iro.umontreal.ca/pipermail/gambit-list/attachments/20091005/4b2188cd/attachment.txt>


More information about the Gambit-list mailing list