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 <dlfcn.h>
#include <ctype.h>
+#if PSI_THREADED_PARSER
+# include <pthread.h>
+
+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)
{
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);
}
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);
void psi_data_dtor(struct psi_data *data)
{
+ if (data->debug_fd) {
+ close(data->debug_fd);
+ }
if (data->consts) {
psi_plist_free(data->consts);
}
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) {
- dprintf(fd, "// filename=%s (%u errors)\n", D->file.filename->val, 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;
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;
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;
while (psi_plist_get(D->decls, i++, &decl)) {
if (decl->extvar) {
- dprintf(fd, "/* extvar accessor\n");
+ PSI_DUMP(dump, "/* extvar accessor \n");
}
- psi_decl_dump(fd, decl);
- dprintf(fd, "\n");
+ psi_decl_dump(dump, decl);
if (decl->extvar) {
- dprintf(fd, " extvar accessor */\n");
+ 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");
}
}