From: Waldek H. <he...@ma...> - 2010-04-10 03:03:51
|
How can one pass Lisp data without any convertion to foreign routines? I would like to use GMP routines to perform some operations on sbcl bignums (on large numbers GMP is much faster than native sbcl routines). I tried: (defun ttt (x) (sb-sys:with-pinned-objects (x) (SB-ALIEN::alien-funcall (SB-ALIEN::extern-alien "ppp" (SB-ALIEN::function SB-ALIEN::void t)) x))) but I get compilation error "unknown alien type: T". When I replaced 't' by '(* t)' the function compiles fine but trying: (ttt (expt 10 30)) I get: debugger invoked on a TYPE-ERROR: The value 1000000000000000000000000000000 is not of type (OR NULL SYSTEM-AREA-POINTER (ALIEN (* T))). -- Waldek Hebisch he...@ma... |
From: Christophe R. <cs...@ca...> - 2010-04-10 16:54:03
|
Waldek Hebisch <he...@ma...> writes: > I tried: > > (defun ttt (x) > (sb-sys:with-pinned-objects (x) > (SB-ALIEN::alien-funcall > (SB-ALIEN::extern-alien "ppp" > (SB-ALIEN::function SB-ALIEN::void t)) > x))) Try (defun ttt (x) (sb-sys:with-pinned-objects (x) (let* ((addr (sb-kernel:get-lisp-obj-address x)) (sap (sb-sys:int-sap addr))) (sb-alien:alien-funcall (sb-alien:extern-alien "ppp" (sb-alien:function sb-alien:void (* t))) sap)))) The pointer that the C side will receive will still have its lisp tag on. Cheers, Christophe |
From: Waldek H. <he...@ma...> - 2010-04-10 18:27:44
|
Christophe Rhodes wrote: > > Try > > (defun ttt (x) > (sb-sys:with-pinned-objects (x) > (let* ((addr (sb-kernel:get-lisp-obj-address x)) > (sap (sb-sys:int-sap addr))) > (sb-alien:alien-funcall > (sb-alien:extern-alien "ppp" (sb-alien:function sb-alien:void (* t))) > sap)))) > > The pointer that the C side will receive will still have its lisp tag > on. > Thanks, that is what I needed. Now I can multiply sbcl bignums via GMP (division and GCD will require more effort). -- Waldek Hebisch he...@ma... |