X-Git-Url: https://git.m6w6.name/?p=m6w6%2Fext-psi;a=blobdiff_plain;f=src%2Fdata.c;h=2898ff1e332ee8732dfcc26bf3bdba08eafbd21d;hp=4f7168facd6a822bdf2d508a7cad845bc58fadd4;hb=93d6b7f962a82b725d1918684297d68221b0b733;hpb=f15858adf036b3010895526eaf6d1b9711d48bc9 diff --git a/src/data.c b/src/data.c index 4f7168f..2898ff1 100644 --- a/src/data.c +++ b/src/data.c @@ -23,23 +23,75 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *******************************************************************************/ -#include "php_psi_stdinc.h" +#ifdef HAVE_CONFIG_H +# include "config.h" +#else +# include "php_config.h" +#endif +#include "php_psi.h" #include "data.h" #include "php_globals.h" +#include "zend_types.h" #include #include +#if PSI_THREADED_PARSER +# include + +static pthread_mutex_t psi_string_mutex = PTHREAD_MUTEX_INITIALIZER; + +zend_string *psi_string_init_interned(const char *buf, size_t len, int p) +{ + zend_string *str; + + pthread_mutex_lock(&psi_string_mutex); + str = zend_string_init_interned(buf, len, p); + pthread_mutex_unlock(&psi_string_mutex); + + return str; +} + +zend_string *psi_new_interned_string(zend_string *str) +{ + zend_string *new_str; + + pthread_mutex_lock(&psi_string_mutex); + new_str = zend_new_interned_string(str); + pthread_mutex_unlock(&psi_string_mutex); + + return new_str; +} + +#endif + +static void psi_data_ctor_internal(struct psi_data *data, + psi_error_cb error, unsigned flags) +{ + data->error = error; + data->flags = flags; + + if (data->flags & PSI_DEBUG) { + int fd = psi_fdopen(getenv("PSI_DEBUG")); + + if (fd > 0) { + data->debug_fd = fd; + } else { + data->debug_fd = STDERR_FILENO; + } + } +} + struct psi_data *psi_data_ctor_with_dtors(struct psi_data *data, 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; + psi_data_ctor_internal(data, error, flags); + if (!data->file.libnames) { data->file.libnames = psi_plist_init((psi_plist_dtor) psi_names_free); } @@ -78,11 +130,10 @@ struct psi_data *psi_data_ctor(struct psi_data *data, 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; + psi_data_ctor_internal(data, error, flags); if (!data->file.libnames) { data->file.libnames = psi_plist_init(NULL); @@ -121,7 +172,7 @@ struct psi_data *psi_data_ctor(struct psi_data *data, psi_error_cb error, 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)); @@ -130,6 +181,9 @@ struct psi_data *psi_data_exchange(struct psi_data *dest, struct psi_data *src) void psi_data_dtor(struct psi_data *data) { + if (data->debug_fd) { + close(data->debug_fd); + } if (data->consts) { psi_plist_free(data->consts); } @@ -158,30 +212,27 @@ void psi_data_dtor(struct psi_data *data) psi_decl_file_dtor(&data->file); } -void psi_data_dump(int fd, struct psi_data *D) +void psi_data_dump(struct psi_dump *dump, struct psi_data *D) { size_t i = 0; char *libname; if (D->file.filename) { - size_t i = 0; - char *libname; - - dprintf(fd, "// filename=%s (%u errors)\n", D->file.filename, D->errors); + PSI_DUMP(dump, "// 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); + PSI_DUMP(dump, "lib \"%s\";\n", libname); } if (psi_plist_count(D->types)) { size_t i = 0; struct psi_decl_arg *def; while (psi_plist_get(D->types, i++, &def)) { - dprintf(fd, "typedef "); - psi_decl_arg_dump(fd, def, 0); - dprintf(fd, ";\n"); + PSI_DUMP(dump, "typedef "); + psi_decl_arg_dump(dump, def, 0); + PSI_DUMP(dump, ";\n"); } - dprintf(fd, "\n"); + PSI_DUMP(dump, "\n"); } if (psi_plist_count(D->unions)) { size_t i = 0; @@ -189,11 +240,11 @@ void psi_data_dump(int fd, struct psi_data *D) while (psi_plist_get(D->unions, i++, &unn)) { if (!psi_decl_type_is_anon(unn->name, "union")) { - psi_decl_union_dump(fd, unn); - dprintf(fd, "\n"); + psi_decl_union_dump(dump, unn); + PSI_DUMP(dump, "\n"); } } - dprintf(fd, "\n"); + PSI_DUMP(dump, "\n"); } if (psi_plist_count(D->structs)) { size_t i = 0; @@ -201,61 +252,67 @@ void psi_data_dump(int fd, struct psi_data *D) while (psi_plist_get(D->structs, i++, &strct)) { if (!psi_decl_type_is_anon(strct->name, "struct")) { - psi_decl_struct_dump(fd, strct); - dprintf(fd, "\n"); + psi_decl_struct_dump(dump, strct); + PSI_DUMP(dump, "\n"); } } - dprintf(fd, "\n"); + PSI_DUMP(dump, "\n"); } if (psi_plist_count(D->enums)) { size_t i = 0; struct psi_decl_enum *enm; while (psi_plist_get(D->enums, i++, &enm)) { - if (!psi_decl_type_is_anon(enm->name, "enum")) { - psi_decl_enum_dump(fd, enm, 0); - dprintf(fd, "\n"); + if (true || !psi_decl_type_is_anon(enm->name, "enum")) { + psi_decl_enum_dump(dump, enm, 0); + PSI_DUMP(dump, "\n"); } } - dprintf(fd, "\n"); + PSI_DUMP(dump, "\n"); } if (psi_plist_count(D->consts)) { size_t i = 0; struct psi_const *c; while (psi_plist_get(D->consts, i++, &c)) { - psi_const_dump(fd, c); - dprintf(fd, "\n"); + psi_const_dump(dump, c); + PSI_DUMP(dump, "\n"); } - dprintf(fd, "\n"); + PSI_DUMP(dump, "\n"); } if (psi_plist_count(D->decls)) { size_t i = 0; struct psi_decl *decl; while (psi_plist_get(D->decls, i++, &decl)) { - psi_decl_dump(fd, decl); - dprintf(fd, "// %p \n", decl->sym); + if (decl->extvar) { + PSI_DUMP(dump, "/* extvar accessor \n"); + } + psi_decl_dump(dump, decl); + if (decl->extvar) { + PSI_DUMP(dump, " */"); + } + PSI_DUMP(dump, "\n"); } - dprintf(fd, "\n"); + PSI_DUMP(dump, "\n"); } if (psi_plist_count(D->vars)) { size_t i = 0; struct psi_decl_extvar *evar; while (psi_plist_get(D->vars, i++, &evar)) { - psi_decl_extvar_dump(fd, evar); + psi_decl_extvar_dump(dump, evar); } - dprintf(fd, "\n"); + PSI_DUMP(dump, "\n"); } if (psi_plist_count(D->impls)) { size_t i = 0; struct psi_impl *impl; while (psi_plist_get(D->impls, i++, &impl)) { - psi_impl_dump(fd, impl); - dprintf(fd, "\n"); + psi_impl_dump(dump, impl); + PSI_DUMP(dump, "\n"); } - dprintf(fd, "\n"); + PSI_DUMP(dump, "\n"); } }