X-Git-Url: https://git.m6w6.name/?p=m6w6%2Fext-psi;a=blobdiff_plain;f=src%2Fdata.c;h=7e52be5543a3e186034b8e12576782add2665ab7;hp=9c2cefbea63cc8da9319a9362a2d971ca6b0aecf;hb=c9384515a81cb64d345b299908b2852f51bb8e6e;hpb=9bcb1df0786a8193d65949c857baaba2f4296e84 diff --git a/src/data.c b/src/data.c index 9c2cefb..7e52be5 100644 --- a/src/data.c +++ b/src/data.c @@ -29,6 +29,7 @@ #include "php_globals.h" #include +#include struct psi_data *psi_data_ctor_with_dtors(struct psi_data *data, psi_error_cb error, unsigned flags) @@ -58,6 +59,9 @@ struct psi_data *psi_data_ctor_with_dtors(struct psi_data *data, if (!data->decls) { data->decls = psi_plist_init((psi_plist_dtor) psi_decl_free); } + if (!data->vars) { + data->vars = psi_plist_init((psi_plist_dtor) psi_decl_extvar_free); + } if (!data->impls) { data->impls = psi_plist_init((psi_plist_dtor) psi_impl_free); } @@ -95,6 +99,9 @@ struct psi_data *psi_data_ctor(struct psi_data *data, psi_error_cb error, if (!data->decls) { data->decls = psi_plist_init(NULL); } + if (!data->vars) { + data->vars = psi_plist_init(NULL); + } if (!data->impls) { data->impls = psi_plist_init(NULL); } @@ -134,6 +141,9 @@ void psi_data_dtor(struct psi_data *data) if (data->decls) { psi_plist_free(data->decls); } + if (data->vars) { + psi_plist_free(data->vars); + } if (data->impls) { psi_plist_free(data->impls); } @@ -221,213 +231,23 @@ void psi_data_dump(int fd, struct psi_data *D) } dprintf(fd, "\n"); } - if (psi_plist_count(D->impls)) { + if (psi_plist_count(D->vars)) { size_t i = 0; - struct psi_impl *impl; + struct psi_decl_extvar *evar; - while (psi_plist_get(D->impls, i++, &impl)) { - psi_impl_dump(fd, impl); - dprintf(fd, "\n"); + while (psi_plist_get(D->vars, i++, &evar)) { + psi_decl_extvar_dump(fd, evar); } dprintf(fd, "\n"); } -} - -bool psi_data_validate(struct psi_data *dst, struct psi_data *src) -{ - void *dlopened = NULL; - size_t check_count = ~0; - struct psi_plist *check_types = src->types; - struct psi_plist *check_structs = src->structs; - struct psi_plist *check_unions = src->unions; - struct psi_plist *check_enums = src->enums; - unsigned flags = dst->flags; - unsigned errors = src->errors; - - /* fail early if library is not found */ - if (!psi_decl_file_validate(dst, src, &dlopened)) { - return false; - } - - dst->flags |= PSI_SILENT; - - while (check_count) { - struct psi_plist *recheck_types; - struct psi_plist *recheck_structs; - struct psi_plist *recheck_unions; - struct psi_plist *recheck_enums; - size_t count_types = psi_plist_count(check_types); - size_t count_structs = psi_plist_count(check_structs); - size_t count_unions = psi_plist_count(check_unions); - size_t count_enums = psi_plist_count(check_enums); - size_t count_all = count_types + count_structs + count_unions - + count_enums; - - if (check_count == count_all) { - /* nothing changed; bail out */ - if (count_all && (dst->flags & PSI_SILENT) && !(flags & PSI_SILENT)) { - /* one last error-spitting round, if not explicitly suppressed */ - dst->flags ^= PSI_SILENT; - check_count = ~0; - - PSI_DEBUG_PRINT(dst, "PSI: validation bail out with %zu" - " type checks remaining, errors follow\n", count_all); - continue; - } - check_count = 0; - } else { - recheck_types = count_types ? psi_plist_init(NULL) : NULL; - recheck_structs = count_structs ? psi_plist_init(NULL) : NULL; - recheck_unions = count_unions ? psi_plist_init(NULL) : NULL; - recheck_enums = count_enums ? psi_plist_init(NULL) : NULL; - - check_count = count_all; - src->errors = errors + check_count; - - PSI_DEBUG_PRINT(dst, "PSI: validate data(%p) %zu type checks remaining\n", - src, check_count); - - if (count_types) { - size_t i = 0; - struct psi_decl_arg *def; - - while (psi_plist_get(check_types, i++, &def)) { - *dst->last_error = 0; - PSI_DEBUG_PRINT(dst, "PSI: validate typedef %s ", def->var->name); - if (psi_decl_arg_validate_typedef(PSI_DATA(dst), def)) { - PSI_DEBUG_PRINT(dst, "%s\n", "✔"); - dst->types = psi_plist_add(dst->types, &def); - } else { - PSI_DEBUG_PRINT(dst, "%s (%s)\n", "✘", dst->last_error); - recheck_types = psi_plist_add(recheck_types, &def); - } - } - } - if (count_structs) { - size_t i = 0; - struct psi_decl_struct *str; - - while (psi_plist_get(check_structs, i++, &str)) { - *dst->last_error = 0; - dst->structs = psi_plist_add(dst->structs, &str); - PSI_DEBUG_PRINT(dst, "PSI: validate struct %s ", str->name); - if (psi_decl_struct_validate(PSI_DATA(dst), str)) { - PSI_DEBUG_PRINT(dst, "%s ::(%zu, %zu)\n", "✔", str->align, str->size); - } else { - PSI_DEBUG_PRINT(dst, "%s (%s)\n", "✘", dst->last_error); - recheck_structs = psi_plist_add(recheck_structs, &str); - psi_plist_pop(dst->structs, NULL); - } - } - } - if (count_unions) { - size_t i = 0; - struct psi_decl_union *unn; - - while (psi_plist_get(check_unions, i++, &unn)) { - *dst->last_error = 0; - dst->unions = psi_plist_add(dst->unions, &unn); - PSI_DEBUG_PRINT(dst, "PSI: validate union %s ", unn->name); - if (psi_decl_union_validate(PSI_DATA(dst), unn)) { - PSI_DEBUG_PRINT(dst, "%s ::(%zu, %zu)\n", "✔", unn->align, unn->size); - - } else { - PSI_DEBUG_PRINT(dst, "%s (%s)\n", "✘", dst->last_error); - recheck_unions = psi_plist_add(recheck_unions, &unn); - psi_plist_pop(dst->unions, NULL); - } - } - } - if (count_enums) { - size_t i = 0; - struct psi_decl_enum *enm; - - while (psi_plist_get(check_enums, i++, &enm)) { - *dst->last_error = 0; - PSI_DEBUG_PRINT(dst, "PSI: validate enum %s ", enm->name); - if (psi_decl_enum_validate(PSI_DATA(dst), enm)) { - PSI_DEBUG_PRINT(dst, "%s\n", "✔"); - dst->enums = psi_plist_add(dst->enums, &enm); - } else { - PSI_DEBUG_PRINT(dst, "%s (%s)\n", "✘", dst->last_error); - recheck_enums = psi_plist_add(recheck_enums, &enm); - } - } - } - } - - if (check_types && check_types != src->types) { - psi_plist_free(check_types); - } - check_types = recheck_types; - if (check_structs && check_structs != src->structs) { - psi_plist_free(check_structs); - } - check_structs = recheck_structs; - if (check_unions && check_unions != src->unions) { - psi_plist_free(check_unions); - } - check_unions = recheck_unions; - if (check_enums && check_enums != src->enums) { - psi_plist_free(check_enums); - } - check_enums = recheck_enums; - } - - /* reset original flags */ - dst->flags = flags; - - if (src->consts) { - size_t i = 0; - struct psi_const *cnst; - - while (psi_plist_get(src->consts, i++, &cnst)) { - *dst->last_error = 0; - PSI_DEBUG_PRINT(dst, "PSI: validate const %s ", cnst->name); - if (psi_const_validate(PSI_DATA(dst), cnst)) { - PSI_DEBUG_PRINT(dst, "%s\n", "✔"); - dst->consts = psi_plist_add(dst->consts, &cnst); - } else { - PSI_DEBUG_PRINT(dst, "%s (%s)\n", "✘", dst->last_error); - ++src->errors; - } - } - } - - if (src->decls) { - size_t i = 0; - struct psi_decl *decl; - - while (psi_plist_get(src->decls, i++, &decl)) { - *dst->last_error = 0; - PSI_DEBUG_PRINT(dst, "PSI: validate decl %s ", decl->func->var->name); - if (psi_decl_validate(PSI_DATA(dst), decl, dlopened)) { - PSI_DEBUG_PRINT(dst, "%s\n", "✔"); - dst->decls = psi_plist_add(dst->decls, &decl); - } else { - PSI_DEBUG_PRINT(dst, "%s (%s)\n", "✘", dst->last_error); - ++src->errors; - } - } - } - - if (src->impls) { + if (psi_plist_count(D->impls)) { size_t i = 0; struct psi_impl *impl; - while (psi_plist_get(src->impls, i++, &impl)) { - *dst->last_error = 0; - PSI_DEBUG_PRINT(dst, "PSI: validate impl %s ", impl->func->name); - if (psi_impl_validate(PSI_DATA(dst), impl)) { - PSI_DEBUG_PRINT(dst, "%s\n", "✔"); - dst->impls = psi_plist_add(dst->impls, &impl); - } else { - PSI_DEBUG_PRINT(dst, "%s (%s)\n", "✘", dst->last_error); - ++src->errors; - } + while (psi_plist_get(D->impls, i++, &impl)) { + psi_impl_dump(fd, impl); + dprintf(fd, "\n"); } + dprintf(fd, "\n"); } - - return true; } -