[cffi-devel] Program hanging on foreign-funcall

Jakob Reschke jakres at googlemail.com
Sat Feb 13 21:04:57 UTC 2010


Hello,

I'm writing a binding to Agar (http://libagar.com), an SDL GUI library
(among other things), but I'm facing a problem:

AG_Editable objects can be bound to a text buffer so the text entered
into the editable widget is written into that buffer and vice
versa. The buffer can be set with
void AG_EditableSetString(AG_Editable *ed, char *text);

The following C Program works fine:

#include <agar/core.h>
#include <agar/gui.h>
int main(int argc, char **argv)
{
  AG_InitCore("myprog", 0);
  AG_InitVideo(320, 240, 32, 0);
  char buffer[100];		/* text buffer */  
  AG_Window *win = AG_WindowNew(0);
  AG_Textbox *tb = AG_TextboxNew(win, 0, "testbox:");
  AG_Editable *ed = tb->ed;
  AG_WindowShow(win);
  AG_EditableBindUTF8(ed, &buffer, 100); /* no hang here */
  AG_EditableSetString(ed, "foobar");
  AG_EventLoop();
  return 0;
}


Whereas the following CFFI Lisp, which is supposed to be equivalent,
at the REPL does not:

(with-core-and-video
 (cffi:with-foreign-object (buffer :char 100)
  (let* ((win (cffi::foreign-funcall "AG_WindowNew" :int 0 :pointer))
         (tb (cffi::foreign-funcall "AG_TextboxNew" :pointer win :int
               0 :string "box:" :pointer)) 
         (ed (cffi::foreign-slot-value tb 'ag-cffi::textbox
               'ag-cffi::editable)))
   (ag:window-show win)
   ;; hangs here:
   (cffi::foreign-funcall "AG_EditableBindUTF8" :pointer ed :pointer
     buffer :int 100 :void)
   (cffi::foreign-funcall "AG_EditableSetString" :pointer ed :string
     "foobar" :void)
   (cffi::foreign-funcall "AG_EventLoop_FixedFPS" :void))))

The program hangs at the line with the according comment. The window
shows up but doesn't get into the event loop, there are no error
conditions and if I interrupt in Slime with C-c C-c (which works), the
backtrace always reads
"bogus stack frame" > "foreign function" > "foreign function" >
(lambda ()) > (sb-int:simple-eval-in-lexenv ...) > ...

What could cause this and how do I fix it? Or did I do something wrong?

Best regards,
Jakob




More information about the cffi-devel mailing list