psi_error_cb error, unsigned flags)
{
if (!data) {
- data = calloc(1, sizeof(*data));
+ data = pecalloc(1, sizeof(*data), 1);
}
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);
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;
}
unsigned flags)
{
if (!data) {
- data = calloc(1, sizeof(*data));
+ data = pecalloc(1, sizeof(*data), 1);
}
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);
}
if (!data->impls) {
data->impls = psi_plist_init(NULL);
}
- if (!data->libs) {
- data->libs = psi_plist_init(NULL);
- }
return data;
}
struct psi_data *psi_data_exchange(struct psi_data *dest, struct psi_data *src)
{
if (!dest) {
- dest = malloc(sizeof(*dest));
+ dest = pemalloc(sizeof(*dest), 1);
}
*dest = *src;
memset(src, 0, sizeof(*src));
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);
- }
- } else {
- dprintf(fd, "// builtin predef\n");
+ size_t i = 0;
+ char *libname;
+
+ if (D->file.filename) {
+ dprintf(fd, "// filename=%s (%u errors)\n", D->file.filename->val, D->errors);
+ }
+ while (psi_plist_get(D->file.libnames, i++, &libname)) {
+ dprintf(fd, "lib \"%s\";\n", libname);
}
if (psi_plist_count(D->types)) {
size_t i = 0;
struct psi_decl *decl;
while (psi_plist_get(D->decls, i++, &decl)) {
+ if (decl->extvar) {
+ dprintf(fd, "/* extvar accessor\n");
+ }
psi_decl_dump(fd, decl);
dprintf(fd, "\n");
+ if (decl->extvar) {
+ dprintf(fd, " extvar accessor */\n");
+ }
}
dprintf(fd, "\n");
}