Changeset 13120
- Timestamp:
- 01/03/11 12:09:37 (13 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/abcl/src/org/armedbear/lisp/jvm.lisp
r13115 r13120 372 372 (references-allowed-p t) ;;whether a reference to the function CAN be captured 373 373 (references-needed-p nil) ;;whether a reference to the function NEEDS to be 374 374 ;;captured, because the function name is used in a 375 375 ;;(function ...) form. Obviously implies 376 376 ;;references-allowed-p. … … 387 387 (defvar *using-arg-array* nil) 388 388 (defvar *hairy-arglist-p* nil) 389 390 391 (defvar *block* nil 392 "The innermost block applicable to the current lexical environment.") 393 (defvar *blocks* () 394 "The list of blocks in effect in the current lexical environment. 395 396 The top node does not need to be equal to the value of `*block*`. E.g. 397 when processing the bindings of a LET form, `*block*` is bound to the node 398 of that LET, while the block is not considered 'in effect': that only happens 399 until the body is being processed.") 389 400 390 401 (defstruct node … … 416 427 (defstruct (tagbody-node (:conc-name tagbody-) 417 428 (:include control-transferring-node) 418 429 (:constructor %make-tagbody-node ())) 419 430 ;; True if a tag in this tagbody is the target of a non-local GO. 420 431 non-local-go-p … … 428 439 (let ((block (%make-tagbody-node))) 429 440 (push block (compiland-blocks *current-compiland*)) 430 (add-node-child (car *blocks*)block)441 (add-node-child *block* block) 431 442 block)) 432 443 433 444 (defstruct (catch-node (:conc-name catch-) 434 445 (:include control-transferring-node) 435 446 (:constructor %make-catch-node ())) 436 447 ;; The catch tag-form is evaluated, meaning we 437 448 ;; have no predefined value to store here … … 441 452 (let ((block (%make-catch-node))) 442 453 (push block (compiland-blocks *current-compiland*)) 443 (add-node-child (car *blocks*)block)454 (add-node-child *block* block) 444 455 block)) 445 456 … … 459 470 (let ((block (%make-block-node name))) 460 471 (push block (compiland-blocks *current-compiland*)) 461 (add-node-child (car *blocks*)block)472 (add-node-child *block* block) 462 473 block)) 463 474 … … 478 489 (defstruct (let/let*-node (:conc-name let-) 479 490 (:include binding-node) 480 491 (:constructor %make-let/let*-node ()))) 481 492 (defknown make-let/let*-node () t) 482 493 (defun make-let/let*-node () 483 494 (let ((block (%make-let/let*-node))) 484 495 (push block (compiland-blocks *current-compiland*)) 485 (add-node-child (car *blocks*)block)496 (add-node-child *block* block) 486 497 block)) 487 498 488 499 (defstruct (flet-node (:conc-name flet-) 489 500 (:include binding-node) 490 501 (:constructor %make-flet-node ()))) 491 502 (defknown make-flet-node () t) 492 503 (defun make-flet-node () 493 504 (let ((block (%make-flet-node))) 494 505 (push block (compiland-blocks *current-compiland*)) 495 (add-node-child (car *blocks*)block)506 (add-node-child *block* block) 496 507 block)) 497 508 498 509 (defstruct (labels-node (:conc-name labels-) 499 510 (:include binding-node) 500 511 (:constructor %make-labels-node ()))) 501 512 (defknown make-labels-node () t) 502 513 (defun make-labels-node () 503 514 (let ((block (%make-labels-node))) 504 515 (push block (compiland-blocks *current-compiland*)) 505 (add-node-child (car *blocks*)block)516 (add-node-child *block* block) 506 517 block)) 507 518 508 519 (defstruct (m-v-b-node (:conc-name m-v-b-) 509 520 (:include binding-node) 510 521 (:constructor %make-m-v-b-node ()))) 511 522 (defknown make-m-v-b-node () t) 512 523 (defun make-m-v-b-node () 513 524 (let ((block (%make-m-v-b-node))) 514 525 (push block (compiland-blocks *current-compiland*)) 515 (add-node-child (car *blocks*)block)526 (add-node-child *block* block) 516 527 block)) 517 528 518 529 (defstruct (progv-node (:conc-name progv-) 519 530 (:include binding-node) 520 531 (:constructor %make-progv-node ()))) 521 532 (defknown make-progv-node () t) 522 533 (defun make-progv-node () … … 527 538 (defstruct (locally-node (:conc-name locally-) 528 539 (:include binding-node) 529 540 (:constructor %make-locally-node ()))) 530 541 (defknown make-locally-node () t) 531 542 (defun make-locally-node () 532 543 (let ((block (%make-locally-node))) 533 544 (push block (compiland-blocks *current-compiland*)) 534 (add-node-child (car *blocks*)block)545 (add-node-child *block* block) 535 546 block)) 536 547 … … 538 549 539 550 (defstruct (protected-node (:include node) 540 551 (:constructor %make-protected-node ()))) 541 552 (defknown make-protected-node () t) 542 553 (defun make-protected-node () 543 554 (let ((block (%make-protected-node))) 544 555 (push block (compiland-blocks *current-compiland*)) 545 (add-node-child (car *blocks*)block)556 (add-node-child *block* block) 546 557 block)) 547 558 548 559 (defstruct (unwind-protect-node (:conc-name unwind-protect-) 549 560 (:include protected-node) 550 561 (:constructor %make-unwind-protect-node ()))) 551 562 (defknown make-unwind-protect-node () t) 552 563 (defun make-unwind-protect-node () 553 564 (let ((block (%make-unwind-protect-node))) 554 565 (push block (compiland-blocks *current-compiland*)) 555 (add-node-child (car *blocks*)block)566 (add-node-child *block* block) 556 567 block)) 557 568 558 569 (defstruct (synchronized-node (:conc-name synchronized-) 559 570 (:include protected-node) 560 571 (:constructor %make-synchronized-node ()))) 561 572 (defknown make-synchronized-node () t) 562 573 (defun make-synchronized-node () 563 574 (let ((block (%make-synchronized-node))) 564 575 (push block (compiland-blocks *current-compiland*)) 565 (add-node-child (car *blocks*) block) 566 block)) 567 568 569 (defvar *blocks* ()) 576 (add-node-child *block* block) 577 block)) 570 578 571 579 (defun find-block (name) … … 575 583 (return block)))) 576 584 577 (defun some-nested-block (block predicate) 578 "Applies `predicate` recursively to the children of `block`, 579 until predicate returns non-NIL, returning that value." 580 (some #'(lambda (b) 581 (or (funcall predicate b) 582 (some-nested-block b predicate))) 583 (node-children block))) 585 (defun %find-enclosed-blocks (form) 586 "Helper function for `find-enclosed-blocks`, implementing the actual 587 algorithm specified there." 588 (cond 589 ((node-p form) (list form)) 590 ((atom form) nil) 591 (t 592 ;; We can't use MAPCAN or DOLIST here: they'll choke on dotted lists 593 (do* ((tail form (cdr tail)) 594 blocks) 595 ((null tail) blocks) 596 (setf blocks 597 (nconc (%find-enclosed-blocks (if (consp tail) 598 (car tail) tail)) 599 blocks)) 600 (when (not (listp tail)) 601 (return blocks)))))) 602 603 (defun find-enclosed-blocks (form) 604 "Returns the immediate enclosed blocks by searching the form's subforms. 605 606 More deeply nested blocks can be reached through the `node-children` 607 field of the immediate enclosed blocks." 608 (when *blocks* 609 ;; when the innermost enclosing block doesn't have node-children, 610 ;; there's really nothing to search for. 611 (when (null (node-children (car *blocks*))) 612 (return-from find-enclosed-blocks))) 613 614 (%find-enclosed-blocks form)) 615 616 617 (defun some-nested-block (predicate blocks) 618 "Applies `predicate` recursively to the `blocks` and its children, 619 until predicate returns non-NIL, returning that value. 620 621 `blocks` may be a single block or a list of blocks." 622 (when blocks 623 (some #'(lambda (b) 624 (or (funcall predicate b) 625 (some-nested-block predicate (node-children b)))) 626 (if (listp blocks) 627 blocks 628 (list blocks))))) 584 629 585 630 (defknown node-constant-p (t) boolean) … … 605 650 (catch-node-p object) 606 651 (synchronized-node-p object))) 652 653 (defun block-opstack-unsafe-p (block) 654 (or (when (tagbody-node-p block) (tagbody-non-local-go-p block)) 655 (when (block-node-p block) (block-non-local-return-p block)) 656 (catch-node-p block))) 607 657 608 658 (defknown block-creates-runtime-bindings-p (t) boolean)
Note: See TracChangeset
for help on using the changeset viewer.