mescc: Proper support for i++,++i,i--,--i.
[mes.git] / module / language / c99 / compiler.mes
index 0b8721b4c6cfafa2e28cba490d9e945fa11e52bf..b1eb6cc1a60a158ead9af4ac23c39684bb8314d3 100644 (file)
           (locals (.locals info))
           (text (.text info)))
       (define (add-local name)
-         (acons name (1+ (or (and=> (member 1 (map cdr locals)) length) 0)) locals))
+        (let ((locals (acons name (1+ (length (filter positive? (map cdr locals)))) locals)))
+          locals))
 
       ;; (stderr "\nS=~a\n" o)
       ;; (stderr "  text=~a\n" text)
                           (list (lambda (f g t d)
                                   (i386:accu-zero?)))))))
 
+        ;; FIXME
+        ((post-inc ,expr) ((ast->info info) `(expr-stmt ,o)))
+        ((post-dec ,expr) ((ast->info info) `(expr-stmt ,o)))
+        ((pre-inc ,expr) ((ast->info info) `(expr-stmt ,o)))
+        ((pre-dec ,expr) ((ast->info info) `(expr-stmt ,o)))
+
         ;; i++
         ((expr-stmt (post-inc (p-expr (ident ,name))))
          (clone info #:text
                 (append text (list (lambda (f g t d)
-                                     (i386:local-add (assoc-ref locals name) 1))))))
+                                     (append (i386:local->accu (assoc-ref locals name))
+                                             (i386:local-add (assoc-ref locals name) 1)
+                                             (i386:accu-zero?)))))))
 
-        ;; ++i -- same for now FIXME
+        ;; ++i
         ((expr-stmt (pre-inc (p-expr (ident ,name))))
          (clone info #:text
                 (append text (list (lambda (f g t d)
-                                     (i386:local-add (assoc-ref locals name) 1))))))
+                                     (append (i386:local-add (assoc-ref locals name) 1)
+                                             (i386:local->accu (assoc-ref locals name))
+                                             (i386:accu-zero?)))))))
+
+        ;; i--
+        ((expr-stmt (post-dec (p-expr (ident ,name))))
+         (clone info #:text
+                (append text (list (lambda (f g t d)
+                                     (append (i386:local->accu (assoc-ref locals name))
+                                             (i386:local-add (assoc-ref locals name) -1)
+                                             (i386:accu-zero?)))))))
+
+        ;; --i
+        ((expr-stmt (pre-dec (p-expr (ident ,name))))
+         (clone info #:text
+                (append text (list (lambda (f g t d)
+                                     (append (i386:local-add (assoc-ref locals name) -1)
+                                             (i386:local->accu (assoc-ref locals name))
+                                             (i386:accu-zero?)))))))
 
         ((not ,expr)
          (let* ((test-info ((ast->info info) expr)))