From e54350691e7dd47d6823b86c960a43b6fa7fb6a7 Mon Sep 17 00:00:00 2001 From: Keisuke Nishida Date: Tue, 22 Aug 2000 18:25:36 +0000 Subject: [PATCH] (translate-and, translate-or): Don't branch on the last expression. --- vm/bytecomp.scm | 38 ++++++++++++++++++++++++-------------- 1 file changed, 24 insertions(+), 14 deletions(-) diff --git a/vm/bytecomp.scm b/vm/bytecomp.scm index d46016b79..076f38d3d 100644 --- a/vm/bytecomp.scm +++ b/vm/bytecomp.scm @@ -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)