(translate-and, translate-or): Don't branch on the last expression.
authorKeisuke Nishida <kxn30@po.cwru.edu>
Tue, 22 Aug 2000 18:25:36 +0000 (18:25 +0000)
committerKeisuke Nishida <kxn30@po.cwru.edu>
Tue, 22 Aug 2000 18:25:36 +0000 (18:25 +0000)
vm/bytecomp.scm

index d46016b..076f38d 100644 (file)
          (return-or-push))
 
        (define (translate-and . args)
-         ;; #:and ARG1 ARG2...
+         ;; #:and ARG1 ARG2... LAST
          ;;      ARG1
          ;;      %br-if-not L0
          ;;      ARG2
          ;;      %br-if-not L0
          ;;      ...
+         ;;      LAST
          ;;  L0:
          (assert-for-each code? args)
-         (let ((L0 (make-label)))
-           (for-each (lambda (arg)
-                       (trans-non-stack arg)
-                       (push-code! '%br-if-not L0))
-                     args)
-           (push-code! #:label L0))
+         (let* ((list (reverse args))
+                (last (car list))
+                (ARGS (reverse! (cdr list))))
+           (let ((L0 (make-label)))
+             (for-each (lambda (arg)
+                         (trans-non-stack arg)
+                         (push-code! '%br-if-not L0))
+                       args)
+             (trans-non-stack last)
+             (push-code! #:label L0)))
          (return-or-push))
 
        (define (translate-or . args)
-         ;; #:or ARG1 ARG2...
+         ;; #:or ARG1 ARG2... LAST
          ;;      ARG1
          ;;      %br-if L0
          ;;      ARG2
          ;;      %br-if L0
          ;;      ...
+         ;;      LAST
          ;;  L0:
          (assert-for-each code? args)
-         (let ((L0 (make-label)))
-           (for-each (lambda (arg)
-                       (trans-non-stack arg)
-                       (push-code! '%br-if L0))
-                     args)
-           (push-code! #:label L0))
+         (let* ((list (reverse args))
+                (last (car list))
+                (ARGS (reverse! (cdr list))))
+           (let ((L0 (make-label)))
+             (for-each (lambda (arg)
+                         (trans-non-stack arg)
+                         (push-code! '%br-if L0))
+                       args)
+             (trans-non-stack last)
+             (push-code! #:label L0)))
          (return-or-push))
 
        (define (translate-program nreqs restp code)