X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=src%2Fcode%2Flate-alieneval.lisp;fp=src%2Fcode%2Flate-alieneval.lisp;h=b9d9aab9abd5450dc68c9604dbd0de23a7121742;hb=dcb73f3edef1e31078fbe585e2fafbd26743efd7;hp=0000000000000000000000000000000000000000;hpb=17c3cee2f470fab2dd332cf9d5f63d7c572bd5a0;p=sbcl.git diff --git a/src/code/late-alieneval.lisp b/src/code/late-alieneval.lisp new file mode 100644 index 0000000..b9d9aab --- /dev/null +++ b/src/code/late-alieneval.lisp @@ -0,0 +1,59 @@ +;;;; This file contains parts of the ALIEN implementation that +;;;; are not part of the compiler, but depend on it. + +;;;; This software is part of the SBCL system. See the README file for +;;;; more information. +;;;; +;;;; This software is derived from the CMU CL system, which was +;;;; written at Carnegie Mellon University and released into the +;;;; public domain. The software is in the public domain and is +;;;; provided with absolutely no warranty. See the COPYING and CREDITS +;;;; files for more information. + +(in-package "SB!ALIEN") + +(defmacro make-alien (type &optional size &environment env) + #!+sb-doc + "Allocate an alien of type TYPE and return an alien pointer to it. If SIZE +is supplied, how it is interpreted depends on TYPE. If TYPE is an array type, +SIZE is used as the first dimension for the allocated array. If TYPE is not an +array, then SIZE is the number of elements to allocate. The memory is +allocated using ``malloc'', so it can be passed to foreign functions which use +``free''." + (let ((alien-type (if (alien-type-p type) + type + (parse-alien-type type env)))) + (multiple-value-bind (size-expr element-type) + (if (alien-array-type-p alien-type) + (let ((dims (alien-array-type-dimensions alien-type))) + (cond + (size + (unless dims + (error + "cannot override the size of zero-dimensional arrays")) + (when (constantp size) + (setf alien-type (copy-alien-array-type alien-type)) + (setf (alien-array-type-dimensions alien-type) + (cons (constant-form-value size) (cdr dims))))) + (dims + (setf size (car dims))) + (t + (setf size 1))) + (values `(* ,size ,@(cdr dims)) + (alien-array-type-element-type alien-type))) + (values (or size 1) alien-type)) + (let ((bits (alien-type-bits element-type)) + (alignment (alien-type-alignment element-type))) + (unless bits + (error "The size of ~S is unknown." + (unparse-alien-type element-type))) + (unless alignment + (error "The alignment of ~S is unknown." + (unparse-alien-type element-type))) + (let ((alloc-form `(%sap-alien (%make-alien (* ,(align-offset bits alignment) + ,size-expr)) + ',(make-alien-pointer-type :to alien-type)))) + (if (sb!c:policy env (> speed 1)) + alloc-form + `(locally (declare (muffle-conditions compiler-note)) + ,alloc-form)))))))