1
Fork 0
mirror of https://git.savannah.gnu.org/git/guile.git synced 2025-05-02 04:40:29 +02:00

(translate-and, translate-or): Don't branch on the last expression.

This commit is contained in:
Keisuke Nishida 2000-08-22 18:25:36 +00:00
parent fd329e8725
commit e54350691e

View file

@ -166,37 +166,47 @@
(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)