mescc: Tinycc support: sizeof struct field.
* module/language/c99/compiler.mes (expr->accu): Sizeof struct field. * scaffold/tests/72-typedef-struct-def.c (test): Test it.
This commit is contained in:
parent
d393785381
commit
8ec7e1225b
|
@ -511,6 +511,11 @@
|
||||||
(size (ast-type->size info type)))
|
(size (ast-type->size info type)))
|
||||||
(append-text info (wrap-as (i386:value->accu size)))))
|
(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)))))
|
((sizeof-type (type-name (decl-spec-list (type-spec (fixed-type ,name)))))
|
||||||
(let* ((type name)
|
(let* ((type name)
|
||||||
(size (ast-type->size info type)))
|
(size (ast-type->size info type)))
|
||||||
|
@ -1040,6 +1045,13 @@
|
||||||
(prefix (and=> (member field (reverse fields) (lambda (a b) (equal? a (car b)))) cdr)))
|
(prefix (and=> (member field (reverse fields) (lambda (a b) (equal? a (car b)))) cdr)))
|
||||||
(apply + (map field:size prefix))))))
|
(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)
|
(define (ast->type o)
|
||||||
(pmatch o
|
(pmatch o
|
||||||
((fixed-type ,type)
|
((fixed-type ,type)
|
||||||
|
|
|
@ -54,5 +54,7 @@ test ()
|
||||||
(*pp)->i = 3;
|
(*pp)->i = 3;
|
||||||
printf ("(*pp)->i=%d\n", b.i);
|
printf ("(*pp)->i=%d\n", b.i);
|
||||||
|
|
||||||
|
printf ("sizeof i:%d\n", sizeof (p->i));
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue