0.9.13.30
[sbcl.git] / src / code / target-alieneval.lisp
index 70fb7bb..c4f4e2f 100644 (file)
                 (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
       (t
        (error "~S is not an alien function." alien)))))
 
-(defun alien-funcall-stdcall (alien &rest args)
-  #!+sb-doc
-  "Call the foreign function ALIEN with the specified arguments. ALIEN's
-   type specifies the argument and result types."
-  (declare (type alien-value alien))
-  (let ((type (alien-value-type alien)))
-    (typecase type
-      (alien-pointer-type
-       (apply #'alien-funcall-stdcall (deref alien) args))
-      (alien-fun-type
-       (unless (= (length (alien-fun-type-arg-types type))
-                  (length args))
-         (error "wrong number of arguments for ~S~%expected ~W, got ~W"
-                type
-                (length (alien-fun-type-arg-types type))
-                (length args)))
-       (let ((stub (alien-fun-type-stub type)))
-         (unless stub
-           (setf stub
-                 (let ((fun (gensym))
-                       (parms (make-gensym-list (length args))))
-                   (compile nil
-                            `(lambda (,fun ,@parms)
-                               (declare (optimize (sb!c::insert-step-conditions 0)))
-                               (declare (type (alien ,type) ,fun))
-                               (alien-funcall-stdcall ,fun ,@parms)))))
-           (setf (alien-fun-type-stub type) stub))
-         (apply stub alien args)))
-      (t
-       (error "~S is not an alien function." alien)))))
-
 (defmacro define-alien-routine (name result-type
                                      &rest args
                                      &environment lexenv)
@@ -828,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)))
@@ -895,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)
@@ -958,8 +933,8 @@ callback signal an error."
       (setf (callback-info-function info) nil)
       t)))
 
-;;; FIXME: This calls assembles a new callback for every closure,
-;;; which suck hugely. ...not that I can think of an obvious
+;;; FIXME: This call assembles a new callback for every closure,
+;;; which sucks hugely. ...not that I can think of an obvious
 ;;; solution. Possibly maybe we could write a generalized closure
 ;;; callback analogous to closure_tramp, and share the actual wrapper?
 ;;;