Changeset 5802


Ignore:
Timestamp:
Jan 28, 2007, 8:46:47 PM (18 years ago)
Author:
Gary Byers
Message:

For linuxppc, use the new callback mechanism. (Other platforms still need
more bootstrapping.)

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/ccl/lib/macros.lisp

    r5721 r5802  
    23572357
    23582358(defun define-callback (name args body env)
     2359  #+linuxppc-target
     2360  (let* ((stack-word (gensym))
     2361         (stack-ptr (gensym))
     2362         (fp-args-ptr (gensym))
     2363         (result-type-spec :void)
     2364         (args args)
     2365         (woi nil)
     2366         (monitor nil)
     2367         (need-struct-arg)
     2368         (struct-return-arg-name)
     2369         (error-return nil))
     2370    (collect ((arg-names)
     2371              (arg-specs))
     2372      (let* ((spec (car (last args)))
     2373             (rtype (ignore-errors (parse-foreign-type spec))))
     2374        (setq need-struct-arg (typep rtype 'foreign-record-type))
     2375        (if rtype
     2376          (setq result-type-spec spec args (butlast args))))
     2377      (loop
     2378        (when (null args) (return))
     2379        (if (eq (car args) :without-interrupts)
     2380          (setq woi (cadr args) args (cddr args))
     2381          (if (eq (car args) :monitor-exception-ports)
     2382            (setq monitor (cadr args) args (cddr args))
     2383           
     2384            (if (eq (car args) :error-return)
     2385              (setq error-return
     2386                    (cadr args)                 
     2387                    args (cddr args))
     2388              (if need-struct-arg
     2389                (setq struct-return-arg-name (pop args) need-struct-arg nil)
     2390                (progn
     2391                  (arg-specs (pop args))
     2392                  (arg-names (pop args))))))))
     2393      (multiple-value-bind (rlets lets dynamic-extent-names inits foreign-return-type fp-args-form error-return-offset)
     2394          (funcall (ftd-callback-bindings-function *target-ftd*)
     2395                   stack-ptr fp-args-ptr (arg-names) (arg-specs) result-type-spec struct-return-arg-name)
     2396        (multiple-value-bind (body decls doc) (parse-body body env t)
     2397          `(progn
     2398            (declaim (special ,name))
     2399            (define-callback-function
     2400                (nfunction ,name
     2401                 (lambda (,stack-word)
     2402                   (declare (ignorable ,stack-word))
     2403                   (block ,name
     2404                     (with-macptrs ((,stack-ptr))
     2405                       (%setf-macptr-to-object ,stack-ptr ,stack-word)
     2406                       (with-macptrs (,@(when fp-args-form
     2407                                             `((,fp-args-ptr ,fp-args-form))))
     2408                         ,(defcallback-body  stack-ptr
     2409                                             fp-args-ptr
     2410                                             lets
     2411                                             rlets
     2412                                             inits
     2413                                             `(declare (dynamic-extent ,@dynamic-extent-names))
     2414                                             decls
     2415                                             body
     2416                                             foreign-return-type
     2417                                             struct-return-arg-name
     2418                                             error-return
     2419                                             error-return-offset
     2420                                             ))))))
     2421                ,doc
     2422              ,woi
     2423              ,monitor))))))
     2424  #-linuxppc-target
    23592425  (funcall (backend-define-callback *target-backend*)
    23602426           name
     
    23652431
    23662432(defun defcallback-body (&rest args)
     2433  (declare (dynamic-extent args))
     2434  #+linuxppc-target
     2435  (destructuring-bind (stack-ptr fp-args-ptr lets rlets inits dynamic-extent-decls other-decls body return-type struct-return-arg error-return error-delta) args
     2436      (let* ((result (gensym))
     2437         (condition-name (if (atom error-return) 'error (car error-return)))
     2438         (error-return-function (if (atom error-return) error-return (cadr error-return)))
     2439         (body
     2440          `(rlet ,rlets
     2441            (let ,lets
     2442              ,dynamic-extent-decls
     2443              ,@other-decls
     2444              ,@inits
     2445              (let ((,result (progn ,@body)))
     2446                (declare (ignorable ,result))
     2447                ,@(progn
     2448                   ;; Coerce SINGLE-FLOAT result to DOUBLE-FLOAT
     2449                   (when (typep return-type 'foreign-single-float-type)
     2450                     (setq result `(float ,result 0.0d0)))
     2451                   nil)
     2452                ,(funcall (ftd-callback-return-value-function *target-ftd*)
     2453                          stack-ptr
     2454                          fp-args-ptr
     2455                          result
     2456                          return-type
     2457                          struct-return-arg))))))
     2458    (if error-return
     2459      (let* ((cond (gensym)))
     2460        `(handler-case ,body
     2461          (,condition-name (,cond) (,error-return-function ,cond ,stack-ptr (%inc-ptr ,stack-ptr ,error-delta)))))
     2462      body)))
     2463  #-linuxppc-target
    23672464  (apply (backend-defcallback-body *target-backend*) args))
    23682465
Note: See TracChangeset for help on using the changeset viewer.