X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=src%2Fcode%2Ftarget-alieneval.lisp;h=1c421f107fe433640aff321679401721a509d881;hb=854a7c8f6987e05b6aebe186f30b7e125693afaf;hp=d6cb2be7289c9f83e0c96c3373fd549d293490ba;hpb=495f7dfb9c4ce0ba965f3297a4c94f6c75691b70;p=sbcl.git diff --git a/src/code/target-alieneval.lisp b/src/code/target-alieneval.lisp index d6cb2be..1c421f1 100644 --- a/src/code/target-alieneval.lisp +++ b/src/code/target-alieneval.lisp @@ -235,7 +235,7 @@ (when (constantp size) (setf alien-type (copy-alien-array-type alien-type)) (setf (alien-array-type-dimensions alien-type) - (cons (eval size) (cdr dims))))) + (cons (constant-form-value size) (cdr dims))))) (dims (setf size (car dims))) (t @@ -797,14 +797,15 @@ ENTER-ALIEN-CALLBACK pulls the corresponsing trampoline out and calls it.") (sb!kernel:get-lisp-obj-address args-pointer))) (res-sap (int-sap (sb!kernel:get-lisp-obj-address result-pointer)))) + (declare (ignorable args-sap res-sap)) (with-alien ,(loop + with offset = 0 for spec in argument-specs - for offset = 0 ; FIXME: Should this not be AND OFFSET ...? - then (+ offset (alien-callback-argument-bytes spec env)) collect `(,(pop argument-names) ,spec :local ,(alien-callback-accessor-form - spec 'args-sap offset))) + spec 'args-sap offset)) + do (incf offset (alien-callback-argument-bytes spec env))) ,(flet ((store (spec) (if spec `(setf (deref (sap-alien res-sap (* ,spec))) @@ -838,7 +839,8 @@ ENTER-ALIEN-CALLBACK pulls the corresponsing trampoline out and calls it.") (destructuring-bind (function result-type &rest argument-types) specifier (aver (eq 'function function)) - (values (parse-alien-type result-type env) + (values (let ((*values-type-okay* t)) + (parse-alien-type result-type env)) (mapcar (lambda (spec) (parse-alien-type spec env)) argument-types)))) @@ -863,6 +865,11 @@ ENTER-ALIEN-CALLBACK pulls the corresponsing trampoline out and calls it.") return arguments)) +;;; To ensure that callback wrapper functions continue working even +;;; if #'ENTER-ALIEN-CALLBACK moves in memory, access to it is indirected +;;; through the *ENTER-ALIEN-CALLBACK* static symbol. -- JES, 2006-01-01 +(defvar *enter-alien-callback* #'enter-alien-callback) + ;;;; interface (not public, yet) for alien callbacks (defmacro alien-callback (specifier function &environment env)