X-Git-Url: https://git.m6w6.name/?p=m6w6%2Fext-psi;a=blobdiff_plain;f=src%2Fdata.c;h=193f49c94fbf68f1b67650dd7e04323b9126f1e2;hp=454f9f5fb47435e9cf6fe5fd0f2107e3f9c30c55;hb=02e801eabbe26a129ea05e6723c94e10bb653dab;hpb=4b4fbf6b17943b9558538a6d8ebb47f29ae6a97c diff --git a/src/data.c b/src/data.c index 454f9f5..193f49c 100644 --- a/src/data.c +++ b/src/data.c @@ -40,6 +40,12 @@ struct psi_data *psi_data_ctor_with_dtors(struct psi_data *data, data->error = error; data->flags = flags; + if (!data->file.libnames) { + data->file.libnames = psi_plist_init((psi_plist_dtor) psi_names_free); + } + if (!data->file.dlopened) { + data->file.dlopened = psi_plist_init((psi_plist_dtor) psi_libs_free); + } if (!data->consts) { data->consts = psi_plist_init((psi_plist_dtor) psi_const_free); @@ -59,12 +65,12 @@ 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); } - if (!data->libs) { - data->libs = psi_plist_init((psi_plist_dtor) psi_libs_free); - } return data; } @@ -78,6 +84,13 @@ struct psi_data *psi_data_ctor(struct psi_data *data, psi_error_cb error, data->error = error; data->flags = flags; + if (!data->file.libnames) { + data->file.libnames = psi_plist_init(NULL); + } + if (!data->file.dlopened) { + data->file.dlopened = psi_plist_init(NULL); + } + if (!data->consts) { data->consts = psi_plist_init(NULL); } @@ -96,12 +109,12 @@ 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); } - if (!data->libs) { - data->libs = psi_plist_init(NULL); - } return data; } @@ -135,22 +148,25 @@ 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); } - if (data->libs) { - psi_plist_free(data->libs); - } psi_decl_file_dtor(&data->file); } void psi_data_dump(int fd, struct psi_data *D) { - if (D->file.fn) { - dprintf(fd, "// filename=%s (%u errors)\n", D->file.fn, D->errors); - if (D->file.ln) { - dprintf(fd, "lib \"%s\";\n", D->file.ln); + if (D->file.filename) { + size_t i = 0; + char *libname; + + dprintf(fd, "// filename=%s (%u errors)\n", D->file.filename, D->errors); + while (psi_plist_get(D->file.libnames, i++, &libname)) { + dprintf(fd, "lib \"%s\";\n", libname); } } else { dprintf(fd, "// builtin predef\n"); @@ -222,266 +238,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; - struct psi_plist *check_decls = src->decls; - unsigned flags = dst->flags; - unsigned errors = src->errors; - struct psi_validate_stack type_stack; - - /* fail early if library is not found */ - if (!psi_decl_file_validate(dst, src, &dlopened)) { - return false; - } - - psi_validate_stack_ctor(&type_stack); - - 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; - struct psi_plist *recheck_decls; - 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_decls = psi_plist_count(check_decls); - size_t count_all = count_types + count_structs + count_unions - + count_enums + count_decls; - - 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; - recheck_decls = count_decls ? 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; - dst->types = psi_plist_add(dst->types, &def); - PSI_DEBUG_PRINT(dst, "PSI: validate typedef %s ", def->var->name); - if (psi_decl_arg_validate_typedef(PSI_DATA(dst), def, &type_stack)) { - PSI_DEBUG_PRINT(dst, "%s\n", "✔"); - } else { - PSI_DEBUG_PRINT(dst, "%s (%s)\n", "✘", dst->last_error); - recheck_types = psi_plist_add(recheck_types, &def); - psi_plist_pop(dst->types, NULL); - } - } - } - 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, &type_stack)) { - 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, &type_stack)) { - 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 (count_decls) { - size_t i = 0; - struct psi_decl *decl; - - while (psi_plist_get(check_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, &type_stack)) { - 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); - recheck_decls = psi_plist_add(recheck_decls, &decl); - } - } - } - } - - 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; - if (check_decls && check_decls != src->decls) { - psi_plist_free(check_decls); - } - check_decls = recheck_decls; - } - - /* reset original flags */ - dst->flags = flags; - - if (dst->structs) { - size_t i = 0; - struct psi_decl_struct *str; - - while (psi_plist_get(dst->structs, i++, &str)) { - size_t nlen = strlen(str->name); - size_t slen = sizeof("psi\\SIZEOF_STRUCT_"); - size_t alen = sizeof("psi\\ALIGNOF_STRUCT_"); - char *nptr = str->name, *sname, *aname; - struct psi_const *cnst; - struct psi_const_type *ctyp; - struct psi_impl_def_val *cval; - - sname = malloc(slen + nlen + 1); - strcpy(sname, "psi\\SIZEOF_STRUCT_"); - aname = malloc(alen + nlen + 1); - strcpy(aname, "psi\\ALIGNOF_STRUCT_"); - - nptr = str->name; - while (*nptr) { - size_t off = nptr - str->name; - sname[slen - 1 + off] = aname[alen - 1 + off] = toupper(*nptr++); - } - sname[slen - 1 + nlen] = aname[alen - 1 + nlen] = 0; - - ctyp = psi_const_type_init(PSI_T_INT, "int"); - cval = psi_impl_def_val_init(PSI_T_INT, NULL); - cval->ival.zend.lval = str->size; - cnst = psi_const_init(ctyp, sname, cval); - dst->consts = psi_plist_add(dst->consts, &cnst); - free(sname); - - ctyp = psi_const_type_init(PSI_T_INT, "int"); - cval = psi_impl_def_val_init(PSI_T_INT, NULL); - cval->ival.zend.lval = str->align; - cnst = psi_const_init(ctyp, aname, cval); - dst->consts = psi_plist_add(dst->consts, &cnst); - free(aname); - } - } - - 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->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"); } - - psi_validate_stack_dtor(&type_stack); - - return true; } -