mescc: Tinycc support: sizeof struct field.
authorJan Nieuwenhuizen <janneke@gnu.org>
Mon, 17 Jul 2017 05:54:48 +0000 (07:54 +0200)
committerJan Nieuwenhuizen <janneke@gnu.org>
Wed, 26 Jul 2017 09:36:08 +0000 (11:36 +0200)
* module/language/c99/compiler.mes (expr->accu): Sizeof struct field.
* scaffold/tests/72-typedef-struct-def.c (test): Test it.

module/language/c99/compiler.mes
scaffold/tests/72-typedef-struct-def.c

index cf0c56eaaac12392bfda71fa9154ad6e6f23da2b..b74be83a43d736acfe04d89a8f1aa49e6595221c 100644 (file)
                 (size (ast-type->size info type)))
            (append-text info (wrap-as (i386:value->accu size)))))
 
+        ((sizeof-expr (i-sel (ident ,field) (p-expr (ident ,array))))
+         (let* ((type (ident->type info array))
+                (size (field-size info type field)))
+           (append-text info (wrap-as (i386:value->accu size)))))
+
         ((sizeof-type (type-name (decl-spec-list (type-spec (fixed-type ,name)))))
          (let* ((type name)
                 (size (ast-type->size info type)))
                (prefix (and=> (member field (reverse fields) (lambda (a b) (equal? a (car b)))) cdr)))
           (apply + (map field:size prefix))))))
 
+(define (field-size info struct field)
+  (let ((xtype (ast-type->type info struct)))
+    (if (eq? (type:type xtype) 'union) 0
+        (let* ((fields (type:description xtype))
+               (field (and=> (member field fields (lambda (a b) (equal? a (car b)))) car)))
+          (field:size field)))))
+
 (define (ast->type o)
   (pmatch o
     ((fixed-type ,type)
index 73ff7356daffc55b70dd5d37ef2d1246a3f12c10..b6565cc7640426fe633791e1687e714e879597ad 100644 (file)
@@ -54,5 +54,7 @@ test ()
   (*pp)->i = 3;
   printf ("(*pp)->i=%d\n", b.i);
 
+  printf ("sizeof i:%d\n", sizeof (p->i));
+
   return 0;
 }