mescc: Bugfix non-char* *x x[] test.
authorJan Nieuwenhuizen <janneke@gnu.org>
Sun, 23 Jul 2017 06:44:48 +0000 (08:44 +0200)
committerJan Nieuwenhuizen <janneke@gnu.org>
Wed, 26 Jul 2017 09:36:08 +0000 (11:36 +0200)
* module/language/c99/compiler.mes (expr->pointer): New function.
  (test-jump-label->info): Use it to fix non char* while (*x | x[i]).

module/language/c99/compiler.mes

index 921694d5550116aee6ccca34971815458eab1a7c..2ab55fd669ce7d40b7cc440a8187f3bb3e01d2df 100644 (file)
 
 (define (ast-type->type info o)
   (pmatch o
+    ((p-expr ,expr) (ast-type->type info (p-expr->type info o)))
     ((decl-spec-list (type-spec (fixed-type ,type)))
      (ast-type->type info type))
     ((decl-spec-list (type-qual ,qual) (type-spec (fixed-type ,type)))
               (info (append-text info (wrap-as `((#:label ,skip-b-label))))))
          info))
 
-      ((array-ref . _) ((jump i386:jump-byte-z
-                              (wrap-as (i386:accu-zero?))) o))
+      ((array-ref ,index ,expr) (let* ((ptr (expr->pointer info expr))
+                                       (size (if (= ptr 1) (ast-type->size info expr)
+                                                 4)))
+                                  ((jump (if (= size 1) i386:jump-byte-z
+                                             i386:jump-z)
+                                         (wrap-as (i386:accu-zero?))) o)))
 
-      ((de-ref _) ((jump i386:jump-byte-z
-                         (wrap-as (i386:accu-zero?))) o))
+      ((de-ref ,expr) (let* ((ptr (expr->pointer info expr))
+                             (size (if (= ptr 1) (ast-type->size info expr)
+                                       4)))
+                        ((jump (if (= size 1) i386:jump-byte-z
+                                   i386:jump-z)
+                               (wrap-as (i386:accu-zero?))) o)))
 
       ((assn-expr (p-expr (ident ,name)) ,op ,expr)
        ((jump i386:jump-z
     (if local (local:pointer local)
         (or (and=> (ident->decl info o) global:pointer) 0))))
 
+(define (expr->pointer info o)
+  (pmatch o
+    ((p-expr (ident ,name)) (ident->pointer info name))
+    (_ (stderr "expr->pointer: unsupported: ~s\n" o) 0)))
+
 (define (p-expr->type info o)
   (pmatch o
     ((p-expr (ident ,name)) (ident->type info name))