Changeset 14911 for trunk/abcl/src/org/armedbear/lisp/precompiler.lisp
- Timestamp:
- 11/17/16 19:22:56 (7 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/abcl/src/org/armedbear/lisp/precompiler.lisp
r14763 r14911 383 383 (when (and (consp op) (eq (%car op) 'LAMBDA)) 384 384 (return-from precompile-function-call 385 (cons (precompile-lambda op) 386 (mapcar #'precompile1 (cdr form))))) 385 (or (precompile-function-position-lambda op (cdr form)) 386 (cons (precompile-lambda op) 387 (mapcar #'precompile1 (cdr form)))))) 387 388 (when (or (not *in-jvm-compile*) (notinline-p op)) 388 389 (return-from precompile-function-call (precompile-cons form))) … … 399 400 (return-from precompile-function-call (precompile1 (expand-inline form expansion)))))) 400 401 (cons op (mapcar #'precompile1 (cdr form))))) 402 403 (defun precompile-function-position-lambda (lambda args) 404 (let* ((arglist (second lambda)) 405 (body (cddr lambda)) 406 (simple-arglist? (not (or (memq '&KEY arglist) (memq '&OPTIONAL arglist) (memq '&REST arglist))))) 407 (or 408 ;;give a chance for someone to transform single-form function bodies 409 (and (= (length body) 1) (consp (car body)) (get (caar body) 'sys::function-position-lambda-transform) 410 (funcall (get (caar body) 'sys::function-position-lambda-transform) (caar body) (car body) (mapcar #'precompile1 args))) 411 (and simple-arglist? 412 (let ((arglist-length (if (memq '&aux arglist) (position '&aux arglist) (length arglist)))) 413 (if (= (length args) arglist-length) 414 ;; simplest case - we have a simple arglist with as many 415 ;; arguments as call args. Transform to let. 416 (return-from precompile-function-position-lambda 417 `(let* ,(append 418 (loop for arg-name in arglist 419 for arg in (mapcar #'precompile1 args) 420 until (eq arg-name '&aux) 421 collect (list arg-name arg)) 422 (subseq arglist (1+ arglist-length))) 423 ,@body)) 424 (error "Argument mismatch for lambda in function position: ~a applied to ~a" `(lambda ,arglist body) args))))))) 425 426 (defmacro define-function-position-lambda-transform (body-function-name (arglist form args) &body body) 427 `(put ',body-function-name 'sys::function-position-lambda-transform 428 #'(lambda(,arglist ,form ,args) 429 ,@body))) 401 430 402 431 (defun precompile-locally (form)
Note: See TracChangeset
for help on using the changeset viewer.