flush
authorMichael Wallner <mike@php.net>
Mon, 1 Feb 2016 15:44:04 +0000 (16:44 +0100)
committerMichael Wallner <mike@php.net>
Mon, 1 Feb 2016 15:44:04 +0000 (16:44 +0100)
m4/unistd.m4
src/context.c
src/context_dump.c
src/context_validate.c
src/libffi.c
src/parser_proc.y
tests/pipe/pipe.psi

index a5a4ff6..2126500 100644 (file)
@@ -310,7 +310,7 @@ PSI_CHECK_UNISTD() {
        PSI_DECL(int execvp, [(const char *file, char **argv)])
        PSI_DECL(int faccessat, [(int fd, const char *path, int amode, int flag)])
        PSI_DECL(int fchdir, [(int fildes)])
-       PSI_DECL(int fchown, [(int fildes, uid_t owner, gid_tgroup)])
+       PSI_DECL(int fchown, [(int fildes, uid_t owner, gid_t group)])
        PSI_DECL(int fchownat, [(int fd, const char *path, uid_t owner, gid_t group, int flag)])
        PSI_DECL(int fdatasync, [(int fildes)])
        PSI_DECL(int fexecve, [(int fd, char **argv, char **envp)])
@@ -343,7 +343,7 @@ PSI_CHECK_UNISTD() {
        PSI_DECL(int nice, [(int incr)])
        PSI_DECL(long pathconf, [(const char *path, int name)])
        PSI_DECL(int pause, [(void)])
-       PSI_DECL(int pipe, [(int fildes@<:@2:>@)])
+       PSI_DECL(int pipe, [(int fildes@<:@2@:>@)])
        PSI_DECL(ssize_t pread, [(int fildes, void *buf, size_t nbyte, off_t offset)])
        PSI_DECL(ssize_t pwrite, [(int fildes, const void *buf, size_t nbyte, off_t offset)])
        PSI_DECL(ssize_t read, [(int fd, void *buf, size_t count)])
index 17699a4..218da24 100644 (file)
@@ -108,7 +108,7 @@ PSI_Context *PSI_ContextInit(PSI_Context *C, PSI_ContextOps *ops, PSI_ContextErr
                decl_union *dunion = init_decl_union(predef_union->var_name, dargs);
 
                dunion->size = predef_union->size;
-               dunion->align = dunion->offset;
+               dunion->align = predef_union->offset;
                for (member = &predef_union[1]; member->type_tag; ++member) {
                        decl_type *type;
                        decl_var *dvar;
index c62ebf2..b778525 100644 (file)
@@ -167,7 +167,7 @@ static inline void dump_typedefs(int fd, decl_typedefs *defs) {
 static inline void dump_struct(int fd, decl_struct *strct) {
        size_t j;
 
-       dprintf(fd, "struct %s::(%zu)", strct->name, strct->size);
+       dprintf(fd, "struct %s::(%zu, %zu)", strct->name, strct->align, strct->size);
        if (strct->args && strct->args->count) {
                dprintf(fd, " {\n");
                for (j = 0; j < strct->args->count; ++j) {
@@ -189,12 +189,36 @@ static inline void dump_structs(int fd, decl_structs *structs) {
        for (i = 0; i < structs->count; ++i) {
                decl_struct *strct = structs->list[i];
 
-
                dump_struct(fd, strct);
                dprintf(fd, "\n");
        }
 }
 
+static inline void dump_union(int fd, decl_union *unn) {
+       size_t j;
+
+       dprintf(fd, "union %s::(%zu, %zu) {\n", unn->name, unn->align, unn->size);
+       for (j = 0; j < unn->args->count; ++j) {
+               decl_arg *uarg = unn->args->args[j];
+
+               dprintf(fd, "\t");
+               dump_decl_arg(fd, uarg);
+               dprintf(fd, "::(%zu, %zu);\n", uarg->layout->pos, uarg->layout->len);
+       }
+       dprintf(fd, "}");
+}
+
+static inline void dump_unions(int fd, decl_unions *unions) {
+       size_t i;
+
+       for (i = 0; i < unions->count; ++i) {
+               decl_union *unn = unions->list[i];
+
+               dump_union(fd, unn);
+               dprintf(fd, "\n");
+       }
+}
+
 static inline void dump_enum(int fd, decl_enum *e) {
        size_t j;
 
@@ -440,7 +464,10 @@ void PSI_ContextDump(PSI_Context *C, int fd)
                dump_typedefs(fd, C->defs);
                dprintf(fd, "\n");
        }
-
+       if (C->unions) {
+               dump_unions(fd, C->unions);
+               dprintf(fd, "\n");
+       }
        if (C->structs) {
                dump_structs(fd, C->structs);
                dprintf(fd, "\n");
index 826a6b3..cf0695f 100644 (file)
@@ -1,4 +1,4 @@
-       #ifdef HAVE_CONFIG_H
+#ifdef HAVE_CONFIG_H
 # include "config.h"
 #endif
 
@@ -207,17 +207,26 @@ static inline int validate_decl_struct_darg(PSI_Data *data, decl_arg *darg, void
        /* pre-validate any structs/unions/enums */
        switch (real->type) {
        case PSI_T_STRUCT:
-               if ((current && current == real->strct) || !validate_decl_struct(data, real->strct)) {
+               if (current && current == real->strct) {
+                       return 1;
+               }
+               if (!validate_decl_struct(data, real->strct)) {
                        return 0;
                }
                break;
        case PSI_T_UNION:
-               if ((current && current == real->unn) || !validate_decl_union(data, real->unn)) {
+               if (current && current == real->unn) {
+                       return 1;
+               }
+               if (!validate_decl_union(data, real->unn)) {
                        return 0;
                }
                break;
        case PSI_T_ENUM:
-               if ((current && current == real->enm) || !validate_decl_enum(data, real->enm)) {
+               if (current && current == real->enm) {
+                       return 1;
+               }
+               if (!validate_decl_enum(data, real->enm)) {
                        return 0;
                }
                break;
@@ -1167,6 +1176,7 @@ int PSI_ContextValidate(PSI_Context *C, PSI_Parser *P)
        size_t i, count = C->count++, check_round, check_count;
        decl_typedefs *check_defs = P->defs;
        decl_structs *check_structs = P->structs;
+       decl_unions *check_unions = P->unions;
        decl_enums *check_enums = P->enums;
        unsigned silent = C->flags & PSI_PARSER_SILENT;
 
@@ -1190,6 +1200,7 @@ int PSI_ContextValidate(PSI_Context *C, PSI_Parser *P)
        for (check_round = 0, check_count = 0; CHECK_TOTAL && check_count != CHECK_TOTAL; ++check_round) {
                decl_typedefs *recheck_defs = NULL;
                decl_structs *recheck_structs = NULL;
+               decl_unions *recheck_unions = NULL;
                decl_enums *recheck_enums = NULL;
 
                check_count = CHECK_TOTAL;
@@ -1208,6 +1219,13 @@ int PSI_ContextValidate(PSI_Context *C, PSI_Parser *P)
                                recheck_structs = add_decl_struct(recheck_structs, check_structs->list[i]);
                        }
                }
+               for (i = 0; i < CHECK_COUNT(unions); ++i) {
+                       if (validate_decl_union(PSI_DATA(C), check_unions->list[i])) {
+                               C->unions = add_decl_union(C->unions, check_unions->list[i]);
+                       } else {
+                               recheck_unions = add_decl_union(recheck_unions, check_unions->list[i]);
+                       }
+               }
                for (i = 0; i < CHECK_COUNT(enums); ++i) {
                        if (validate_decl_enum(PSI_DATA(C), check_enums->list[i])) {
                                C->enums = add_decl_enum(C->enums, check_enums->list[i]);
@@ -1218,6 +1236,7 @@ int PSI_ContextValidate(PSI_Context *C, PSI_Parser *P)
 
                REVALIDATE(defs);
                REVALIDATE(structs);
+               REVALIDATE(unions);
                REVALIDATE(enums);
 
                if (check_round == 0 && !silent) {
index 369fe33..301995e 100644 (file)
@@ -192,7 +192,8 @@ static ffi_type **psi_ffi_struct_type_elements(decl_struct *strct) {
 static inline ffi_type *psi_ffi_decl_type(decl_type *type) {
        decl_type *real = real_decl_type(type);
 
-       if (real->type == PSI_T_STRUCT) {
+       switch (real->type) {
+       case PSI_T_STRUCT:
                if (!real->strct->engine.type) {
                        ffi_type *strct = calloc(1, sizeof(ffi_type));
 
@@ -205,8 +206,13 @@ static inline ffi_type *psi_ffi_decl_type(decl_type *type) {
                }
 
                return real->strct->engine.type;
+
+       case PSI_T_UNION:
+               return psi_ffi_decl_arg_type(real->unn->args->args[0]);
+
+       default:
+               return psi_ffi_token_type(real->type);
        }
-       return psi_ffi_token_type(real->type);
 }
 static inline ffi_type *psi_ffi_decl_arg_type(decl_arg *darg) {
        if (darg->var->pointer_level) {
index 56938cf..b75ac67 100644 (file)
@@ -164,26 +164,31 @@ decl_struct_args(args_) ::= EOS. {
 
 %type decl_struct {decl_struct*}
 %destructor decl_struct {free_decl_struct($$);}
-decl_struct(strct) ::= STRUCT NAME(N) struct_size(size_) decl_struct_args(args). {
+decl_struct(strct) ::= STRUCT NAME(N) align_and_size(as) decl_struct_args(args). {
        strct = init_decl_struct(N->text, args);
-       strct->size = size_;
+       strct->align = as.a;
+       strct->size = as.s;
        strct->token = N;
 }
 
-%type struct_size {size_t}
-struct_size(size) ::= . {
-       size = 0;
+%type align_and_size { struct {size_t a; size_t s; } }
+align_and_size(as) ::= . {
+       as.a = 0;
+       as.s = 0;
 }
-struct_size(size) ::= COLON COLON LPAREN NUMBER(SIZ) RPAREN. {
-       size = atol(SIZ->text);
-       free(SIZ);
+align_and_size(as) ::= COLON COLON LPAREN NUMBER(A) COMMA NUMBER(S) RPAREN. {
+       as.a = atol(A->text);
+       as.s = atol(S->text);
+       free(A);
+       free(S);
 }
 
 %type decl_union {decl_union*}
 %destructor decl_union {free_decl_union($$);}
-decl_union(u) ::= UNION NAME(N) struct_size(size_) decl_struct_args(args). {
+decl_union(u) ::= UNION NAME(N) align_and_size(as) decl_struct_args(args). {
        u = init_decl_union(N->text, args);
-       u->size = size_;
+       u->align = as.a;
+       u->size = as.s;
        u->token = N;
 }
 
@@ -234,19 +239,21 @@ decl_typedef(def) ::= TYPEDEF(T) decl_typedef_body(def_) EOS. {
                free_decl($$->type->func);
        }
 }
-decl_typedef_body_ex(def) ::= struct_name(N) struct_size(size_) decl_struct_args_block(args) decl_var(var). {
+decl_typedef_body_ex(def) ::= struct_name(N) align_and_size(as) decl_struct_args_block(args) decl_var(var). {
        def = init_decl_arg(init_decl_type(PSI_T_STRUCT, N->text), var);
        def->type->token = PSI_TokenCopy(N);
        def->type->strct = init_decl_struct(N->text, args);
        def->type->strct->token = N;
-       def->type->strct->size = size_;
+       def->type->strct->align = as.a;
+       def->type->strct->size = as.s;
 }
-decl_typedef_body_ex(def) ::= union_name(N) struct_size(size_) decl_struct_args_block(args) decl_var(var). {
+decl_typedef_body_ex(def) ::= union_name(N) align_and_size(as) decl_struct_args_block(args) decl_var(var). {
        def = init_decl_arg(init_decl_type(PSI_T_UNION, N->text), var);
        def->type->token = PSI_TokenCopy(N);
        def->type->unn = init_decl_union(N->text, args);
        def->type->unn->token = N;
-       def->type->unn->size = size_;
+       def->type->unn->align = as.a;
+       def->type->unn->size = as.s;
 }
 decl_typedef_body_ex(def) ::= decl_enum(e) NAME(ALIAS). {
        def = init_decl_arg(init_decl_type(PSI_T_ENUM, e->name), init_decl_var(ALIAS->text, 0, 0));
index fd7e3ff..6fc9e89 100644 (file)
@@ -1,8 +1,8 @@
 
-extern int pipe(int fds[2]);
+//extern int pipe(int fildes[2]);
 
 function \pipe(array &$fds = null) : int {
        return to_int(pipe);
-       let fds = calloc(2, psi\SIZEOF_INT);
-       set $fds = to_array(fds[2]);
+       let fildes = calloc(2, psi\SIZEOF_INT);
+       set $fds = to_array(fildes[2]);
 }