mescc: Fix global creation in AND/OR clause.
authorJan Nieuwenhuizen <janneke@gnu.org>
Sun, 23 Apr 2017 11:53:08 +0000 (13:53 +0200)
committerJan Nieuwenhuizen <janneke@gnu.org>
Sun, 23 Apr 2017 11:53:08 +0000 (13:53 +0200)
* module/language/c99/compiler.mes (test->jump->info): Retain globals
  created in AND/OR test.

module/language/c99/compiler.mes

index 331c7edca45de145cd82578f4424050dafb95984..56d0dddc86521dffffc03f8d7e6243f1715c0453 100644 (file)
       ((eq ,a ,b) ((jump i386:Xjump-nz) o))
       ((not _) ((jump i386:Xjump-z) o))
       ((and ,a ,b)
-       (let* ((text (.text info))
+       (let* ((globals (.globals info))
+              (text (.text info))
               (info (clone info #:text '()))
 
               (a-jump ((test->jump->info info) a))
               (b-length (length (text->list b-text))))
 
          (lambda (body-length)
-           (clone info #:text
-                  (append text
-                          (.text (a-jump (+ b-length body-length)))
-                          (.text (b-jump body-length)))))))
+           (let* ((info (append-text info text))
+                  (a-info (a-jump (+ b-length body-length)))
+                  (info (append-text info (.text a-info)))
+                  (b-info (b-jump body-length))
+                  (info (append-text info (.text b-info))))
+            (clone info
+                   #:globals (append globals
+                                     (list-tail (.globals a-info) (length globals))
+                                     (list-tail (.globals b-info) (length globals))))))))
+
       ((or ,a ,b)
-       (let* ((text (.text info))
+       (let* ((globals (.globals info))
+              (text (.text info))
               (info (clone info #:text '()))
 
               (a-jump ((test->jump->info info) a))
               (jump-text (wrap-as (i386:Xjump b-length))))
 
          (lambda (body-length)
-           (clone info #:text
-                  (append text
-                          (.text (a-jump jump-length))
-                          jump-text
-                          (.text (b-jump body-length)))))))
+           (let* ((info (append-text info text))
+                  (a-info (a-jump jump-length))
+                  (info (append-text info (.text a-info)))
+                  (info (append-text info jump-text))
+                  (b-info (b-jump body-length))
+                  (info (append-text info (.text b-info))))
+            (clone info
+                   #:globals (append globals
+                                     (list-tail (.globals a-info) (length globals))
+                                     (list-tail (.globals b-info) (length globals))))))))
 
       ((array-ref . _) ((jump i386:jump-byte-z
                               (wrap-as (i386:accu-zero?))) o))