X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=doc%2Fmanual%2Fffi.texinfo;h=0c4eb4945875a66264c11a3be5ea49e4c3b3d2b0;hb=43df38a2fe89c376ee6791899ec52736054dcfb0;hp=d6b6d05adb368027d61679bbffd957f5216e4312;hpb=bb3994fcc9a556d1a26d35f6ff9386d01030821d;p=sbcl.git diff --git a/doc/manual/ffi.texinfo b/doc/manual/ffi.texinfo index d6b6d05..0c4eb49 100644 --- a/doc/manual/ffi.texinfo +++ b/doc/manual/ffi.texinfo @@ -49,12 +49,11 @@ by the Lisp implementation. This can require a considerable amount of dependent on the internal implementation details of the Lisp system. @item -The Lisp system can automatically convert objects back and forth -between the Lisp and foreign representations. This is convenient, but +The Lisp system can automatically convert objects back and forth between +the Lisp and foreign representations. This is convenient, but translation becomes prohibitively slow when large or complex data structures must be shared. This approach is supported by the SBCL -@acronym{FFI}, and used automatically by the when passing integers and -strings. +@acronym{FFI}, and used automatically when passing integers and strings. @item The Lisp program can directly manipulate foreign objects through the @@ -342,13 +341,17 @@ the variable. @item @code{sb-alien} also exports translations of these C type -specifiers as foreign type specifiers: @code{sb-alien:char}, -@code{sb-alien:short}, @code{sb-alien:int}, -@code{sb-alien:long}, @code{sb-alien:unsigned-char}, -@code{sb-alien:unsigned-short}, -@code{sb-alien:unsigned-int}, -@code{sb-alien:unsigned-long}, @code{sb-alien:float}, and -@code{sb-alien:double}. +specifiers as foreign type specifiers: +@code{char}, +@code{short}, +@code{int}, +@code{long}, +@code{unsigned-char}, +@code{unsigned-short}, +@code{unsigned-int}, +@code{unsigned-long}, +@code{float}, @code{double}, +@code{size-t}, and @code{off-t}. @end itemize @@ -477,60 +480,15 @@ record type. @subsection Foreign Dynamic Allocation Lisp code can call the C standard library functions @code{malloc} and -@code{free} to dynamically allocate and deallocate foreign -variables. The Lisp code shares the same allocator with foreign C -code, so it's OK for foreign code to call @code{free} on the result of -Lisp @code{sb-alien:make-alien}, or for Lisp code to call -@code{sb-alien:free-alien} on foreign objects allocated by C -code. - -@defmac @sbalien{make-alien} @var{type} @var{size} - -The @code{sb-alien:make-alien} macro -returns a dynamically allocated foreign value of the specified -@var{type} (which is not evaluated.) The allocated memory is not -initialized, and may contain arbitrary junk. If supplied, -@var{size} is an expression to evaluate to compute the size of the -allocated object. There are two major cases: - -@itemize -@item -When @var{type} is a foreign array type, an array of that type is -allocated and a pointer to it is returned. Note that you must use -@code{deref} to change the result to an array before you can use -@code{deref} to read or write elements: - -@lisp -(cl:in-package "CL-USER") ; which USEs package "SB-ALIEN" -(defvar *foo* (make-alien (array char 10))) -(type-of *foo*) @result{} (alien (* (array (signed 8) 10))) -(setf (deref (deref foo) 0) 10) @result{} 10 -@end lisp - -If supplied, @var{size} is used as the first dimension for the - array. - -@item -When @var{type} is any other foreign type, then an object for that -type is allocated, and a pointer to it is returned. So -@code{(make-alien int)} returns a @code{(* int)}. If @var{size} is -specified, then a block of that many objects is allocated, with the -result pointing to the first one. - -@end itemize - -@end defmac - -@defun @sbalien{free-alien} @var{foreign-value} - -The @code{sb-alien:free-alien} macro -frees the storage for @var{foreign-value}, -which must have been allocated with Lisp @code{make-alien} -or C @code{malloc}. - -See also the @code{sb-alien:with-alien} macro, which allocates foreign -values on the stack. -@end defun +@code{free} to dynamically allocate and deallocate foreign variables. +The Lisp code shares the same allocator with foreign C code, so it's +OK for foreign code to call @code{free} on the result of Lisp +@code{sb-alien:make-alien}, or for Lisp code to call +@code{sb-alien:free-alien} on foreign objects allocated by C code. + +@include macro-sb-alien-make-alien.texinfo +@include fun-sb-alien-make-alien-string.texinfo +@include fun-sb-alien-free-alien.texinfo @node Foreign Variables @comment node-name, next, previous, up