full struct typedefs
authorMichael Wallner <mike@php.net>
Thu, 28 Jan 2016 09:05:22 +0000 (10:05 +0100)
committerMichael Wallner <mike@php.net>
Thu, 28 Jan 2016 09:05:22 +0000 (10:05 +0100)
TODO
src/context_validate.c
src/parser.h
src/parser_proc.y

diff --git a/TODO b/TODO
index 9ed0e5e54469f70f980c827c2c52e37dfa6e9923..ee63abe58cf690118489fa11ee906b9ec94ee5c8 100644 (file)
--- a/TODO
+++ b/TODO
@@ -6,4 +6,3 @@
 * pemalloc
 * unions
 * callbacks and function pointers
-* full struct typedefs
\ No newline at end of file
index 66b2a77f0b3a7ee2dcb2a6f0d49b7f0781ef1da8..6a89d6ec9bc2fbadedb8b9f2f957b07b87e93908 100644 (file)
@@ -222,6 +222,7 @@ static inline int validate_decl_struct(PSI_Data *data, decl_struct *s) {
                        }
                } else {
                        token_t t;
+                       size_t size, align;
 
                        if (darg->var->pointer_level && (!darg->var->array_size || darg->var->pointer_level == 1)) {
                                t = PSI_T_POINTER;
@@ -229,17 +230,21 @@ static inline int validate_decl_struct(PSI_Data *data, decl_struct *s) {
                                t = real_decl_type(darg->type)->type;
                        }
 
+                       size = psi_t_size(t) * (darg->var->array_size ?: 1);
+
                        if (i) {
                                decl_arg *last = s->args->args[i-1];
-                               darg->layout = init_decl_struct_layout(
-                                               psi_t_align(t, last->layout->pos + last->layout->len),
-                                               psi_t_size(t) * darg->var->array_size);
+
+                               align = psi_t_align(t, last->layout->pos + last->layout->len);
                        } else {
-                               darg->layout = init_decl_struct_layout(0, psi_t_size(t));
+                               align = 0;
                        }
+
+                       darg->layout = init_decl_struct_layout(align, size);
                }
                if (s->size < darg->layout->pos + darg->layout->len) {
                        s->size = darg->layout->pos + darg->layout->len;
+                       /* FIXME: align struct */
                }
        }
 
index daf99dc8eda359cc02e2a1d0fba8ae75bbee7ced..6710996912d9cdea419f8b22ef65c97328466933 100644 (file)
@@ -162,7 +162,7 @@ typedef struct decl_struct_layout {
 
 static inline decl_struct_layout *init_decl_struct_layout(size_t pos, size_t len) {
        decl_struct_layout *l = calloc(1, sizeof(*l));
-
+       ZEND_ASSERT(pos+len);
        l->pos = pos;
        l->len = len;
        return l;
index 328bd10b7648f4b058e8e13be6c3f4be2313e287..2068105e7886a4a3ef4bae9057c3e49abca4de9d 100644 (file)
@@ -106,9 +106,14 @@ struct_name(n) ::= STRUCT NAME(N). {
        n = N;
 }
 
+%type decl_struct_args_block {decl_args*}
+%destructor decl_struct_args_block {free_decl_args($$);}
+decl_struct_args_block(args_) ::= LBRACE struct_args(args) RBRACE. {
+       args_ = args;
+}
 %type decl_struct_args {decl_args*}
 %destructor decl_struct_args {free_decl_args($$);}
-decl_struct_args(args_) ::= LBRACE struct_args(args) RBRACE. {
+decl_struct_args(args_) ::= decl_struct_args_block(args). {
        args_ = args;
 }
 decl_struct_args(args_) ::= EOS. {
@@ -154,11 +159,17 @@ decl_typedef(def) ::= TYPEDEF decl_typedef_body(def_) EOS. {
 }
 %type decl_typedef_body {decl_typedef*}
 %destructor decl_typedef_body {free_decl_typedef($$);}
+decl_typedef_body(def) ::= struct_name(N) struct_size(size_) decl_struct_args_block(args) NAME(ALIAS). {
+       def = init_decl_typedef(ALIAS->text, init_decl_type(PSI_T_STRUCT, N->text));
+       def->token = ALIAS;
+       def->type->strct = init_decl_struct(N->text, args);
+       def->type->strct->token = N;
+       def->type->strct->size = size_;
+}
 decl_typedef_body(def) ::= decl_type(type) NAME(ALIAS). {
        def = init_decl_typedef(ALIAS->text, type);
        def->token = ALIAS;
 }
-
 /* support opaque types */
 decl_typedef_body(def) ::= VOID(V) indirection(i) NAME(ALIAS). {
        def = init_decl_typedef(ALIAS->text, init_decl_type(i?PSI_T_POINTER:V->type, V->text));