X-Git-Url: https://git.m6w6.name/?p=m6w6%2Fext-psi;a=blobdiff_plain;f=src%2Fcontext.c;h=218da24abb541a0a45d012650f51fa46550822e0;hp=d1c1655792cabac455ddba5faba9ca1b0d209e53;hb=d3171526ab7658114cac4ebe1098af4b038e576e;hpb=9bd48d16d68944f3a1e9366fe8c6f3c6d985bf56 diff --git a/src/context.c b/src/context.c index d1c1655..218da24 100644 --- a/src/context.c +++ b/src/context.c @@ -35,14 +35,15 @@ #include "php_psi_decls.h" #include "php_psi_va_decls.h" #include "php_psi_structs.h" +#include "php_psi_unions.h" - -PSI_Context *PSI_ContextInit(PSI_Context *C, PSI_ContextOps *ops, PSI_ContextErrorFunc error) +PSI_Context *PSI_ContextInit(PSI_Context *C, PSI_ContextOps *ops, PSI_ContextErrorFunc error, unsigned flags) { PSI_Data T; struct psi_predef_type *predef_type; struct psi_predef_const *predef_const; struct psi_predef_struct *predef_struct; + struct psi_predef_union *predef_union; struct psi_predef_decl *predef_decl; if (!C) { @@ -51,6 +52,7 @@ PSI_Context *PSI_ContextInit(PSI_Context *C, PSI_ContextOps *ops, PSI_ContextErr memset(C, 0, sizeof(*C)); C->error = error; + C->flags = flags; C->ops = ops; if (ops->init) { @@ -84,6 +86,7 @@ PSI_Context *PSI_ContextInit(PSI_Context *C, PSI_ContextOps *ops, PSI_ContextErr decl_struct *dstruct = init_decl_struct(predef_struct->var_name, dargs); dstruct->size = predef_struct->size; + dstruct->align = predef_struct->offset; for (member = &predef_struct[1]; member->type_tag; ++member) { decl_type *type; decl_var *dvar; @@ -99,6 +102,28 @@ PSI_Context *PSI_ContextInit(PSI_Context *C, PSI_ContextOps *ops, PSI_ContextErr T.structs = add_decl_struct(T.structs, dstruct); predef_struct = member; } + for (predef_union = &psi_predef_unions[0]; predef_union->type_tag; ++predef_union) { + struct psi_predef_union *member; + decl_args *dargs = init_decl_args(NULL); + decl_union *dunion = init_decl_union(predef_union->var_name, dargs); + + dunion->size = predef_union->size; + dunion->align = predef_union->offset; + for (member = &predef_union[1]; member->type_tag; ++member) { + decl_type *type; + decl_var *dvar; + decl_arg *darg; + + type = init_decl_type(member->type_tag, member->type_name); + dvar = init_decl_var(member->var_name, member->pointer_level, member->array_size); + darg = init_decl_arg(type, dvar); + darg->layout = init_decl_struct_layout(member->offset, member->size); + dargs = add_decl_arg(dargs, darg); + } + + T.unions = add_decl_union(T.unions, dunion); + predef_union = member; + } for (predef_decl = &psi_predef_decls[0]; predef_decl->type_tag; ++predef_decl) { struct psi_predef_decl *farg; decl_type *ftype = init_decl_type(predef_decl->type_tag, predef_decl->type_name); @@ -157,11 +182,10 @@ static int psi_select_dirent(const struct dirent *entry) void PSI_ContextBuild(PSI_Context *C, const char *paths) { - int i, n, flags = psi_check_env("PSI_DEBUG") ? PSI_PARSER_DEBUG : 0; + int i, n; char *sep = NULL, *cpy = strdup(paths), *ptr = cpy; struct dirent **entries = NULL; - do { sep = strchr(ptr, ':'); @@ -177,11 +201,11 @@ void PSI_ContextBuild(PSI_Context *C, const char *paths) PSI_Parser P; if (MAXPATHLEN <= slprintf(psi, MAXPATHLEN, "%s/%s", ptr, entries[i]->d_name)) { - C->error(NULL, PSI_WARNING, "Path to PSI file too long: %s/%s", + C->error(C, NULL, PSI_WARNING, "Path to PSI file too long: %s/%s", ptr, entries[i]->d_name); } - if (!PSI_ParserInit(&P, psi, C->error, flags)) { - C->error(NULL, PSI_WARNING, "Failed to init PSI parser (%s): %s", + if (!PSI_ParserInit(&P, psi, C->error, C->flags)) { + C->error(C, NULL, PSI_WARNING, "Failed to init PSI parser (%s): %s", psi, strerror(errno)); continue; } @@ -211,7 +235,7 @@ void PSI_ContextBuild(PSI_Context *C, const char *paths) if (PSI_ContextCompile(C) && SUCCESS != zend_register_functions(NULL, C->closures, NULL, MODULE_PERSISTENT)) { - C->error(NULL, PSI_WARNING, "Failed to register functions!"); + C->error(C, NULL, PSI_WARNING, "Failed to register functions!"); } free(cpy);