mescc: Support do .. while.
authorJan Nieuwenhuizen <janneke@gnu.org>
Sun, 12 Mar 2017 10:05:00 +0000 (11:05 +0100)
committerJan Nieuwenhuizen <janneke@gnu.org>
Sun, 12 Mar 2017 10:05:00 +0000 (11:05 +0100)
* module/language/c99/compiler.mes (ast->info): Support do-while.
* doc/examples/t.c (test): Test it.

module/language/c99/compiler.mes
scaffold/t.c

index 5cba1d783558d3e710759d482f15981430ed5625..e007fd97b0eb6be20573ee16bedb1b01d7a27823 100644 (file)
                    jump-text)
                   #:globals (.globals body-info))))
 
+        ((do-while ,body ,test)
+         (let* ((text-length (length text))
+
+                (body-info ((ast->info info) body))
+                (body-text (list-tail (.text body-info) text-length))
+                (body-length (length (text->list body-text)))
+
+                (empty (clone info #:text '()))
+                (test-jump->info ((test->jump->info empty) test))
+                (test+jump-info (test-jump->info 0))
+                (test-length (length (text->list (.text test+jump-info))))
+
+                (jump-text (list (lambda (f g ta t d)
+                                   (i386:Xjump (- (+ body-length test-length))))))
+                (jump-length (length (text->list jump-text)))
+
+                (test-text (.text (test-jump->info jump-length))))
+           (clone info #:text
+                  (append
+                   (.text body-info)
+                   test-text
+                   jump-text)
+                  #:globals (.globals body-info))))
+
         ((labeled-stmt (ident ,label) ,statement)
          (let ((info (clone info #:text (append text (list label)))))
            ((ast->info info) statement)))
index cfed350511037bcb696b2897a77882b4cc1b9847..7ba9cc84831233cd6a272c7916a84284bb2f4b0b 100644 (file)
@@ -395,6 +395,19 @@ test (char *p)
   char *x = arena;
   char *y = g_chars;
 
+  puts ("t: for (i=1; i<5; ++i)\n");
+  for (i=1; i<5; ++i);
+  if (i != 5) return i;
+
+  puts ("t: while (i<3) i++\n");
+  i = 1;
+  while (i<3) i++;
+  if (i != 3) return i;
+
+  puts ("t: do i-- while (i>0)\n");
+  do i--; while (i>0);
+  if (i != 0) return 1;
+
   puts ("t: if (0)\n");
   if (0) return 1;