basic support for builtins
[m6w6/ext-psi] / src / types / decl.c
index 56ba81d9b4dd956e1e3479658bc4dad0c4d9ea38..780b924566d90c8d57ac8296e5ea5ffe844f7df0 100644 (file)
@@ -38,7 +38,7 @@
 
 struct psi_decl *psi_decl_init(struct psi_decl_arg *func, struct psi_plist *args)
 {
-       struct psi_decl *d = calloc(1, sizeof(*d));
+       struct psi_decl *d = pecalloc(1, sizeof(*d), 1);
 
        d->func = func;
        d->args = args;
@@ -111,32 +111,20 @@ static inline bool psi_decl_validate_func(struct psi_data *data,
        for (redir = &psi_func_redirs[0]; redir->name; ++redir) {
                if (!strcmp(func->var->name->val, redir->name)) {
                        decl->sym = redir->func;
+                       break;
                }
        }
        if (!decl->sym) {
-               size_t i = 0;
-               void *dl;
-
-               while (!decl->sym && psi_plist_get(data->file.dlopened, i++, &dl)) {
-                       decl->sym = dlsym(dl, decl->redir ? decl->redir->val : func->var->name->val);
-               }
+               decl->sym = psi_dlsym(data->file.dlopened, func->var->name->val,
+                       decl->redir ? decl->redir->val : NULL);
        }
        if (!decl->sym) {
-#ifndef RTLD_NEXT
-# define RTLD_NEXT ((void *) -1l)
-#endif
-#ifndef RTLD_DEFAULT
-# define RTLD_DEFAULT ((void *) 0)
-#endif
-               decl->sym = dlsym(RTLD_DEFAULT, decl->redir ? decl->redir->val : func->var->name->val);
-               if (!decl->sym) {
-                       data->error(data, func->token, PSI_WARNING,
-                                       "Failed to locate symbol '%s(%s)': %s",
-                                       func->var->name->val,
-                                       decl->redir ? decl->redir->val : "",
-                                       dlerror() ?: "not found");
-                       return false;
-               }
+               data->error(data, func->token, PSI_WARNING,
+                               "Failed to locate symbol '%s(%s)': %s",
+                               func->var->name->val,
+                               decl->redir ? decl->redir->val : "",
+                               dlerror() ?: "not found");
+               return false;
        }
        return true;
 }
@@ -158,10 +146,11 @@ bool psi_decl_validate_nodl(struct psi_data *data, struct psi_decl *decl,
                struct psi_validate_scope *scope)
 {
        if (!decl->abi) {
-               decl->abi = psi_decl_abi_init(zend_string_init(ZEND_STRL("default"), 1));
+               decl->abi = psi_decl_abi_init(NULL);
        } else if (!psi_decl_abi_validate(data, decl->abi)) {
                data->error(data, decl->abi->token, PSI_WARNING,
-                               "Invalid calling convention: '%s'", decl->abi->token->text->val);
+                               "Invalid calling convention: '%s'",
+                               decl->abi->token->text->val);
                return false;
        }
        if (!psi_decl_arg_validate(data, decl->func, scope)) {
@@ -217,4 +206,3 @@ struct psi_decl_arg *psi_decl_get_arg(struct psi_decl *decl, struct psi_decl_var
 
        return psi_decl_arg_get_by_var(var, decl->args, decl->func);
 }
-