basic support for builtins
[m6w6/ext-psi] / src / types / decl_extvar.c
index c6a77aa436d6db0dda922b1ce536112a0f097a28..24304544ec3d6c4aa47ebe56be9246ea002c9f11 100644 (file)
 
 #include "php_psi.h"
 
 
 #include "php_psi.h"
 
-#include <dlfcn.h>
 #include <fnmatch.h>
 #include <fnmatch.h>
-
 #include <Zend/zend_smart_str.h>
 
 #include "data.h"
 
 struct psi_decl_extvar *psi_decl_extvar_init(struct psi_decl_arg *arg)
 {
 #include <Zend/zend_smart_str.h>
 
 #include "data.h"
 
 struct psi_decl_extvar *psi_decl_extvar_init(struct psi_decl_arg *arg)
 {
-       struct psi_decl_extvar *evar = calloc(1, sizeof(*evar));
+       struct psi_decl_extvar *evar = pecalloc(1, sizeof(*evar), 1);
 
        evar->arg = arg;
        return evar;
 
        evar->arg = arg;
        return evar;
@@ -71,27 +69,14 @@ bool psi_decl_extvar_validate(struct psi_data *data,
        }
 
        if (!evar->sym) {
        }
 
        if (!evar->sym) {
-               size_t i = 0;
-               void *dl;
-
-               while (!evar->sym && psi_plist_get(data->file.dlopened, i++, &dl)) {
-                       evar->sym = dlsym(dl, evar->arg->var->name->val);
-               }
+               evar->sym = psi_dlsym(data->file.dlopened, evar->arg->var->name->val,
+                       evar->redir ? evar->redir->val : NULL);
        }
        if (!evar->sym) {
        }
        if (!evar->sym) {
-#ifndef RTLD_NEXT
-# define RTLD_NEXT ((void *) -1l)
-#endif
-#ifndef RTLD_DEFAULT
-# define RTLD_DEFAULT ((void *) 0)
-#endif
-               evar->sym = dlsym(RTLD_DEFAULT, evar->arg->var->name->val);
-               if (!evar->sym) {
-                       data->error(data, evar->arg->var->token, PSI_WARNING,
-                                       "Failed to locate symbol '%s': %s", evar->arg->var->name->val,
-                                       dlerror() ?: "not found");
-                       return false;
-               }
+               data->error(data, evar->arg->var->token, PSI_WARNING,
+                               "Failed to locate symbol '%s': %s", evar->arg->var->name->val,
+                               dlerror() ?: "not found");
+               return false;
        }
 
        evar->getter = psi_decl_extvar_getter(evar);
        }
 
        evar->getter = psi_decl_extvar_getter(evar);
@@ -134,7 +119,7 @@ struct psi_decl *psi_decl_extvar_setter(struct psi_decl_extvar *evar)
        smart_str_append_ex(&name, func_var->name, 1);
        smart_str_appendl_ex(&name, ZEND_STRL("_set"), 1);
        zend_string_release(func_var->name);
        smart_str_append_ex(&name, func_var->name, 1);
        smart_str_appendl_ex(&name, ZEND_STRL("_set"), 1);
        zend_string_release(func_var->name);
-       func_var->name = smart_str_extract(&name);
+       func_var->name = zend_new_interned_string(smart_str_extract(&name));
 
        decl->extvar = 1;
 
 
        decl->extvar = 1;
 
@@ -157,7 +142,7 @@ struct psi_decl *psi_decl_extvar_getter(struct psi_decl_extvar *evar)
        smart_str_append_ex(&name, func_var->name, 1);
        smart_str_appendl_ex(&name, ZEND_STRL("_get"), 1);
        zend_string_release(func_var->name);
        smart_str_append_ex(&name, func_var->name, 1);
        smart_str_appendl_ex(&name, ZEND_STRL("_get"), 1);
        zend_string_release(func_var->name);
-       func_var->name = smart_str_extract(&name);
+       func_var->name = zend_new_interned_string(smart_str_extract(&name));
 
        decl->extvar = 1;
 
 
        decl->extvar = 1;
 
@@ -182,4 +167,3 @@ bool psi_decl_extvar_is_blacklisted(const char *name)
        }
        return false;
 }
        }
        return false;
 }
-