(abort-ir1-transform "too many indices for pointer deref: ~W"
(length indices)))
(let ((element-type (alien-pointer-type-to alien-type)))
+ (unless element-type
+ (give-up-ir1-transform "unable to open code deref of wild pointer type"))
(if indices
(let ((bits (alien-type-bits element-type))
(alignment (alien-type-alignment element-type)))
`(lambda (function ,@names)
(alien-funcall (deref function) ,@names))))
-;;; A per-thread list of frame pointer, program counter conses.
-(defvar *saved-fp-and-pcs* ())
+;;; Frame pointer, program counter conses. In each thread it's bound
+;;; locally or not bound at all.
+(defvar *saved-fp-and-pcs*)
#!+:c-stack-is-control-stack
(declaim (inline invoke-with-saved-fp-and-pc))
#!+:c-stack-is-control-stack
(defun invoke-with-saved-fp-and-pc (fn)
- (let* ((fp-and-pc (multiple-value-bind (fp pc)
- (%caller-frame-and-pc)
- (cons fp pc)))
- (*saved-fp-and-pcs* (cons fp-and-pc *saved-fp-and-pcs*)))
- (declare (truly-dynamic-extent fp-and-pc *saved-fp-and-pcs*))
- (funcall fn)))
+ (declare #-sb-xc-host (muffle-conditions compiler-note)
+ (optimize (speed 3)))
+ (let* ((fp-and-pc (cons (%caller-frame)
+ (sap-int (%caller-pc)))))
+ (declare (truly-dynamic-extent fp-and-pc))
+ (let ((*saved-fp-and-pcs* (if (boundp '*saved-fp-and-pcs*)
+ (cons fp-and-pc *saved-fp-and-pcs*)
+ (list fp-and-pc))))
+ (declare (truly-dynamic-extent *saved-fp-and-pcs*))
+ (funcall fn))))
(defun find-saved-fp-and-pc (fp)
- (dolist (x *saved-fp-and-pcs*)
- (when (#!+:stack-grows-downward-not-upward
- sap>
- #!-:stack-grows-downward-not-upward
- sap<
- (int-sap (get-lisp-obj-address (car x))) fp)
- (return (values (car x) (cdr x))))))
-
-(deftransform alien-funcall ((function &rest args) * * :important t)
+ (when (boundp '*saved-fp-and-pcs*)
+ (dolist (x *saved-fp-and-pcs*)
+ (when (#!+:stack-grows-downward-not-upward
+ sap>
+ #!-:stack-grows-downward-not-upward
+ sap<
+ (int-sap (get-lisp-obj-address (car x))) fp)
+ (return (values (car x) (cdr x)))))))
+
+(deftransform alien-funcall ((function &rest args) * * :node node :important t)
(let ((type (lvar-type function)))
(unless (alien-type-type-p type)
(give-up-ir1-transform "can't tell function type at compile time"))
;; to it later regardless of how the foreign stack looks
;; like.
#!+:c-stack-is-control-stack
- (setf body `(invoke-with-saved-fp-and-pc (lambda () ,body)))
+ (when (policy node (<= speed debug))
+ (setf body `(invoke-with-saved-fp-and-pc (lambda () ,body))))
(/noshow "returning from DEFTRANSFORM ALIEN-FUNCALL" (params) body)
`(lambda (function ,@(params))
+ (declare (optimize (let-conversion 3)))
,body)))))))
(defoptimizer (%alien-funcall derive-type) ((function type &rest args))
(error "Something is broken."))
(values-specifier-type
(compute-alien-rep-type
- (alien-fun-type-result-type type)))))
+ (alien-fun-type-result-type type)
+ :result))))
(defoptimizer (%alien-funcall ltn-annotate)
((function type &rest args) node ltn-policy)