Changeset 11643
- Timestamp:
- 02/08/09 13:14:20 (14 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/abcl/src/org/armedbear/lisp/compiler-pass1.lisp
r11473 r11643 391 391 (if (eq state '&optional) "optional" "keyword"))))))))) 392 392 393 (defmacro with-local-functions-for-flet/labels 394 (form local-functions-var lambda-name lambda-list-var name-var body-var body1 body2) 395 `(progn (incf (compiland-children *current-compiland*) (length (cadr ,form))) 396 (let ((*visible-variables* *visible-variables*) 397 (*local-functions* *local-functions*) 398 (*current-compiland* *current-compiland*) 399 (,local-functions-var '())) 400 (dolist (definition (cadr ,form)) 401 (let ((,name-var (car definition)) 402 (,lambda-list-var (cadr definition))) 403 (validate-name-and-lambda-list ,name-var ,lambda-list-var ,lambda-name) 404 405 (let* ((,body-var (cddr definition)) 406 (compiland (make-compiland :name ,name-var 407 :parent *current-compiland*))) 408 ,@body1))) 409 (setf ,local-functions-var (nreverse ,local-functions-var)) 410 ,@body2))) 411 393 412 (defun p1-flet (form) 394 (incf (compiland-children *current-compiland*) (length (cadr form))) 395 (let ((*visible-variables* *visible-variables*) 396 (*local-functions* *local-functions*) 397 (*current-compiland* *current-compiland*) 398 (local-functions '())) 399 (dolist (definition (cadr form)) 400 (let ((name (car definition)) 401 (lambda-list (cadr definition))) 402 (validate-name-and-lambda-list name lambda-list 'FLET) 403 (let* ((body (cddr definition)) 404 (compiland (make-compiland :name name 405 :parent *current-compiland*)) 406 (local-function (make-local-function :name name 407 :compiland compiland))) 408 (multiple-value-bind (body decls) (parse-body body) 409 (let* ((block-name (fdefinition-block-name name)) 410 (lambda-expression 411 `(lambda ,lambda-list ,@decls (block ,block-name ,@body))) 412 (*visible-variables* *visible-variables*) 413 (*local-functions* *local-functions*) 414 (*current-compiland* compiland)) 415 (setf (compiland-lambda-expression compiland) lambda-expression) 416 (setf (local-function-inline-expansion local-function) 417 (generate-inline-expansion block-name lambda-list body)) 418 (p1-compiland compiland))) 419 (when *closure-variables* 420 (let ((variable (make-variable :name (gensym)))) 421 (setf (local-function-variable local-function) variable) 422 (push variable *all-variables*))) 423 (push local-function local-functions)))) 424 (setf local-functions (nreverse local-functions)) 425 ;; Make the local functions visible. 426 (dolist (local-function local-functions) 427 (push local-function *local-functions*) 428 (let ((variable (local-function-variable local-function))) 429 (when variable 430 (push variable *visible-variables*)))) 431 (with-saved-compiler-policy 432 (process-optimization-declarations (cddr form)) 433 (list* (car form) local-functions (p1-body (cddr form)))))) 413 (with-local-functions-for-flet/labels 414 form local-functions 'FLET lambda-list name body 415 ((let ((local-function (make-local-function :name name 416 :compiland compiland))) 417 (multiple-value-bind (body decls) (parse-body body) 418 (let* ((block-name (fdefinition-block-name name)) 419 (lambda-expression 420 `(lambda ,lambda-list ,@decls (block ,block-name ,@body))) 421 (*visible-variables* *visible-variables*) 422 (*local-functions* *local-functions*) 423 (*current-compiland* compiland)) 424 (setf (compiland-lambda-expression compiland) lambda-expression) 425 (setf (local-function-inline-expansion local-function) 426 (generate-inline-expansion block-name lambda-list body)) 427 (p1-compiland compiland))) 428 (when *closure-variables* 429 (let ((variable (make-variable :name (gensym)))) 430 (setf (local-function-variable local-function) variable) 431 (push variable *all-variables*))) 432 (push local-function local-functions))) 433 ;; Make the local functions visible. 434 ((dolist (local-function local-functions) 435 (push local-function *local-functions*) 436 (let ((variable (local-function-variable local-function))) 437 (when variable 438 (push variable *visible-variables*)))) 439 (with-saved-compiler-policy 440 (process-optimization-declarations (cddr form)) 441 (list* (car form) local-functions (p1-body (cddr form))))))) 442 434 443 435 444 (defun p1-labels (form) 436 (incf (compiland-children *current-compiland*) (length (cadr form))) 437 (let ((*visible-variables* *visible-variables*) 438 (*local-functions* *local-functions*) 439 (*current-compiland* *current-compiland*) 440 (local-functions '())) 441 (dolist (definition (cadr form)) 442 (let ((name (car definition)) 443 (lambda-list (cadr definition))) 444 (validate-name-and-lambda-list name lambda-list 'LABELS) 445 (let* ((body (cddr definition)) 446 (compiland (make-compiland :name name 447 :parent *current-compiland*)) 448 (variable (make-variable :name (gensym))) 449 (local-function (make-local-function :name name 450 :compiland compiland 451 :variable variable))) 452 (multiple-value-bind (body decls) (parse-body body) 453 (setf (compiland-lambda-expression compiland) 454 `(lambda ,lambda-list ,@decls (block ,name ,@body)))) 455 (push variable *all-variables*) 456 (push local-function local-functions)))) 457 (setf local-functions (nreverse local-functions)) 458 ;; Make the local functions visible. 459 (dolist (local-function local-functions) 460 (push local-function *local-functions*) 461 (push (local-function-variable local-function) *visible-variables*)) 462 (dolist (local-function local-functions) 463 (let ((*visible-variables* *visible-variables*) 464 (*current-compiland* (local-function-compiland local-function))) 465 (p1-compiland (local-function-compiland local-function)))) 466 (list* (car form) local-functions (p1-body (cddr form))))) 445 (with-local-functions-for-flet/labels 446 form local-functions 'LABELS lambda-list name body 447 ((let* ((variable (make-variable :name (gensym))) 448 (local-function (make-local-function :name name 449 :compiland compiland 450 :variable variable))) 451 (multiple-value-bind (body decls) (parse-body body) 452 (setf (compiland-lambda-expression compiland) 453 `(lambda ,lambda-list ,@decls (block ,name ,@body)))) 454 (push variable *all-variables*) 455 (push local-function local-functions))) 456 ;; Make the local functions visible. 457 ((dolist (local-function local-functions) 458 (push local-function *local-functions*) 459 (push (local-function-variable local-function) *visible-variables*)) 460 (dolist (local-function local-functions) 461 (let ((*visible-variables* *visible-variables*) 462 (*current-compiland* (local-function-compiland local-function))) 463 (p1-compiland (local-function-compiland local-function)))) 464 (list* (car form) local-functions (p1-body (cddr form)))))) 467 465 468 466 (defknown p1-funcall (t) t)
Note: See TracChangeset
for help on using the changeset viewer.