Changeset 5802
- Timestamp:
- Jan 28, 2007, 8:46:47 PM (18 years ago)
- File:
-
- 1 edited
-
trunk/ccl/lib/macros.lisp (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/ccl/lib/macros.lisp
r5721 r5802 2357 2357 2358 2358 (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 2359 2425 (funcall (backend-define-callback *target-backend*) 2360 2426 name … … 2365 2431 2366 2432 (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 2367 2464 (apply (backend-defcallback-body *target-backend*) args)) 2368 2465
Note:
See TracChangeset
for help on using the changeset viewer.
