X-Git-Url: https://git.distorted.org.uk/~mdw/clg/blobdiff_plain/0d07716fe78436ae6c9c324cabdd401c25e336af..080853ba4bd7b4c5a79a8a2706f8047b246dd633:/glib/gforeign.lisp diff --git a/glib/gforeign.lisp b/glib/gforeign.lisp index e94db37..b8cc178 100644 --- a/glib/gforeign.lisp +++ b/glib/gforeign.lisp @@ -15,7 +15,7 @@ ;; License along with this library; if not, write to the Free Software ;; Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -;; $Id: gforeign.lisp,v 1.1 2000/08/14 16:44:38 espen Exp $ +;; $Id: gforeign.lisp,v 1.3 2000/08/23 14:27:41 espen Exp $ (in-package "GLIB") @@ -182,7 +182,7 @@ `(lambda (sap offset) (declare (ignorable sap offset)) ,(translate-from-alien - type-spec `(,(sap-ref-fname type-spec) sap offset) :copy)))))) + type-spec `(,(sap-ref-fname type-spec) sap offset) :reference)))))) (defun get-destroy-function (type-spec) @@ -296,9 +296,11 @@ (push doc/arg docs) (progn (destructuring-bind (expr type &optional (style :in)) doc/arg - (unless (member style '(:in :out)) + (unless (member style '(:in :out :in-out)) (error "Bogus argument style ~S in ~S." style doc/arg)) - (when (and (not supplied-lambda-list) (namep expr) (eq style :in)) + (when (and + (not supplied-lambda-list) + (namep expr) (member style '(:in :in-out))) (push expr lambda-list)) (push (list (if (namep expr) expr (gensym)) expr type style) args))))) @@ -318,10 +320,13 @@ (let ((declaration (translate-type-spec type-spec)) (deallocation (cleanup-alien type-spec expr))) (cond - ((eq style :out) + ((member style '(:out :in-out)) (alien-types `(* ,declaration)) (alien-parameters `(addr ,var)) - (alien-bindings `(,var ,declaration)) + (alien-bindings + `(,var ,declaration + ,@(when (eq style :in-out) + (list (translate-to-alien type-spec expr))))) (alien-values (translate-from-alien type-spec var))) (deallocation (alien-types declaration) @@ -511,13 +516,13 @@ `(make-pointer (1+ (kernel:get-lisp-obj-address ,string))))) (deftype-method - translate-from-alien string (type-spec sap &optional (alloc :dynamic)) + translate-from-alien string (type-spec sap &optional (alloc :copy)) (declare (ignore type-spec)) `(let ((sap ,sap)) (unless (null-pointer-p sap) (prog1 (c-call::%naturalize-c-string sap) - ,(when (eq alloc :dynamic) `(deallocate-memory ,sap)))))) + ,(when (eq alloc :copy) `(deallocate-memory ,sap)))))) (deftype-method cleanup-alien string (type-spec sap &optional copied) (declare (ignore type-spec))