}
struct psi_context_build_worker {
+#if PSI_THREADED_PARSER
pthread_t tid;
+#endif
struct psi_parser parser;
struct psi_parser_input *input;
- char psi_file[MAXPATHLEN];
+ char psi_file[PATH_MAX];
};
static struct psi_context_build_worker *psi_context_build_worker_init(
{
struct psi_context_build_worker *w = pecalloc(1, sizeof(*w), 1);
- if (MAXPATHLEN <= slprintf(w->psi_file, MAXPATHLEN, "%s/%s", dir, file)) {
+ if (PATH_MAX <= slprintf(w->psi_file, PATH_MAX, "%s/%s", dir, file)) {
C->error(PSI_DATA(C), NULL, PSI_WARNING, "Path to PSI file too long: %s/%s",
dir, file);
pefree(w, 1);
n = php_scandir(ptr, &entries, psi_select_dirent, alphasort);
if (n < 0) {
+ char cwd[PATH_MAX];
C->error(PSI_DATA(C), NULL, PSI_WARNING,
- "Failed to scan PSI directory '%s':%s", strerror(errno));
+ "Failed to scan PSI directory '%s%s%s': %s",
+ *ptr == '/' ? "" : getcwd(cwd, PATH_MAX),
+ *ptr != '/' && *ptr != '.' ? "/" : "",
+ ptr, strerror(errno));
} else {
for (i = 0; i < n; ++i) {
worker = psi_context_build_worker_init(C, ptr, entries[i]->d_name);
+ PSI_DEBUG_PRINT(C, "PSI: init worker(%p) for %s/%s\n",
+ worker, ptr, entries[i]->d_name);
if (worker) {
workers = psi_plist_add(workers, &worker);
}
while (psi_plist_count(workers) && active < pool) {
if (psi_plist_pop(workers, &worker)) {
+ PSI_DEBUG_PRINT(C, "PSI: starting worker %p\n", worker);
if (psi_context_build_worker_exec(worker)) {
running = psi_plist_add(running, &worker);
++active;
while (psi_plist_get(running, i++, &worker)) {
if (psi_context_build_worker_done(worker)) {
+ PSI_DEBUG_PRINT(C, "PSI: collecting worker %p\n", worker);
psi_context_add(C, &worker->parser);
psi_plist_del(running, --i, NULL);
psi_context_build_worker_free(&worker);
if (psi_plist_pop(workers, &worker)) {
- psi_plist_add(running, &worker);
+ PSI_DEBUG_PRINT(C, "PSI: starting worker %p\n", worker);
+ if (psi_context_build_worker_exec(worker)) {
+ running = psi_plist_add(running, &worker);
+ }
} else {
--active;
}
}
}
}
+ psi_plist_free(running);
}
+ psi_plist_free(workers);
psi_context_compile(C);
}
return psi_plist_eles(*eles);
}
-/*
-void psi_context_decl_func_array_elements(struct psi_context *C,
- struct psi_decl *fn, struct psi_plist **els)
-{
- void *type;
- size_t i;
-
- if (fn->func->var->pointer_level > 1) {
- type = C->ops->typeof_decl(C, PSI_T_POINTER);
- } else {
- type = psi_context_decl_type(C, fn->func->type);
- }
-
- for (i = 0; i < fn->func->var->array_size; ++i) {
- void *copy = C->ops->copyof_type(C, type);
- *els = psi_plist_add(*els, ©);
- }
-}
-
-void *psi_context_decl_func_type(struct psi_context *C, struct psi_decl *fn)
-{
- struct psi_decl_arg *darg = fn->func;
-
- if (darg->engine.type) {
- return darg->engine.type;
- }
-
- if (darg->var->pointer_level) {
- if (!darg->var->array_size) {
- return C->ops->typeof_decl(C, PSI_T_POINTER);
- } else {
- C->ops->composite_init(C, darg);
- return darg->engine.type;
- }
- }
-
- return psi_context_decl_type(C, darg->type);
-}
-*/
-
void psi_context_compile(struct psi_context *C)
{
psi_context_consts_init(C);
EG(current_module) = NULL;
}
-ZEND_RESULT_CODE psi_context_call(struct psi_context *C, zend_execute_data *execute_data, zval *return_value, struct psi_impl *impl)
+bool psi_context_call(struct psi_context *C, zend_execute_data *execute_data, zval *return_value, struct psi_impl *impl)
{
struct psi_call_frame *frame;
frame = psi_call_frame_init(C, impl->decl, impl);
- if (SUCCESS != psi_call_frame_parse_args(frame, execute_data)) {
+ if (!psi_call_frame_parse_args(frame, execute_data)) {
psi_call_frame_free(frame);
- return FAILURE;
+ return false;
}
psi_call_frame_enter(frame);
- if (SUCCESS != psi_call_frame_do_let(frame)) {
+ if (!psi_call_frame_do_let(frame)) {
psi_call_frame_do_return(frame, return_value);
psi_call_frame_free(frame);
- return FAILURE;
+ return false;
}
- if (SUCCESS != psi_call_frame_do_assert(frame, PSI_ASSERT_PRE)) {
+ if (!psi_call_frame_do_assert(frame, PSI_ASSERT_PRE)) {
psi_call_frame_do_return(frame, return_value);
psi_call_frame_free(frame);
- return FAILURE;
+ return false;
}
if (psi_call_frame_num_var_args(frame)) {
C->ops->call(frame);
}
- if (SUCCESS != psi_call_frame_do_assert(frame, PSI_ASSERT_POST)) {
+ if (!psi_call_frame_do_assert(frame, PSI_ASSERT_POST)) {
psi_call_frame_do_return(frame, return_value);
psi_call_frame_free(frame);
- return FAILURE;
+ return false;
}
psi_call_frame_do_return(frame, return_value);
psi_call_frame_do_free(frame);
psi_call_frame_free(frame);
- return SUCCESS;
+ return true;
}