X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;ds=sidebyside;f=src%2Fcode%2Ftarget-alieneval.lisp;h=21134891caf7afb780488161ff1bf6bcfc6116c4;hb=7717fef2d28f273185838304a20bafe660a1fde2;hp=14782074151717016c17b89bf3f1374cd1789845;hpb=06a3d298cb7b8220ef04a50805c01ac1be34d845;p=sbcl.git diff --git a/src/code/target-alieneval.lisp b/src/code/target-alieneval.lisp index 1478207..2113489 100644 --- a/src/code/target-alieneval.lisp +++ b/src/code/target-alieneval.lisp @@ -145,8 +145,8 @@ ,@body)))) (:local (/show0 ":LOCAL case") - (let* ((var (gensym)) - (initval (if initial-value (gensym))) + (let* ((var (sb!xc:gensym "VAR")) + (initval (if initial-value (sb!xc:gensym "INITVAL"))) (info (make-local-alien-info :type alien-type)) (inner-body `((note-local-alien-type ',info ,var) @@ -608,7 +608,7 @@ allocated using ``malloc'', so it can be passed to foreign functions which use (let ((stub (alien-fun-type-stub type))) (unless stub (setf stub - (let ((fun (gensym)) + (let ((fun (sb!xc:gensym "FUN")) (parms (make-gensym-list (length args)))) (compile nil `(lambda (,fun ,@parms) @@ -822,22 +822,31 @@ ENTER-ALIEN-CALLBACK pulls the corresponsing trampoline out and calls it.") :local ,(alien-callback-accessor-form spec 'args-sap offset)) do (incf offset (alien-callback-argument-bytes spec env))) - ,(flet ((store (spec) + ,(flet ((store (spec real-type) (if spec `(setf (deref (sap-alien res-sap (* ,spec))) - (funcall function ,@arguments)) + ,(if real-type + `(the ,real-type + (funcall function ,@arguments)) + `(funcall function ,@arguments))) `(funcall function ,@arguments)))) (cond ((alien-void-type-p result-type) - (store nil)) + (store nil nil)) ((alien-integer-type-p result-type) + ;; Integer types should be padded out to a full + ;; register width, to comply with most ABI calling + ;; conventions, but should be typechecked on the + ;; declared type width, hence the following: (if (alien-integer-type-signed result-type) (store `(signed - ,(alien-type-word-aligned-bits result-type))) + ,(alien-type-word-aligned-bits result-type)) + `(signed-byte ,(alien-type-bits result-type))) (store `(unsigned - ,(alien-type-word-aligned-bits result-type))))) + ,(alien-type-word-aligned-bits result-type)) + `(unsigned-byte ,(alien-type-bits result-type))))) (t - (store (unparse-alien-type result-type))))))) + (store (unparse-alien-type result-type) nil)))))) (values)))) (defun invalid-alien-callback (&rest arguments)