commit after reset fuckup
[m6w6/ext-psi] / src / types / set_exp.c
index 4ae7a45f48ae1bc944b01b77e411cd575d4fb631..80c166c072f32f50e28230648535ee26708ae9cb 100644 (file)
 #include "calc.h"
 #include "marshal.h"
 
+#include <Zend/zend_smart_str.h>
+
 struct psi_set_exp *psi_set_exp_init(enum psi_set_exp_kind kind, void *data)
 {
-       struct psi_set_exp *val = calloc(1, sizeof(*val));
+       struct psi_set_exp *val = pecalloc(1, sizeof(*val), 1);
 
        switch (val->kind = kind) {
        case PSI_SET_FUNC:
@@ -75,7 +77,7 @@ void psi_set_exp_exec_ex(struct psi_set_exp *val, zval *zv, impl_val *iv,
                val->data.func->handler(zv, val, iv, frame);
                break;
        case PSI_SET_NUMEXP:
-               switch (psi_num_exp_exec(val->data.num, iv, frame)) {
+               switch (psi_num_exp_exec(val->data.num, iv, frame, NULL)) {
                case PSI_T_FLOAT:
                case PSI_T_DOUBLE:
                case PSI_T_LONG_DOUBLE:
@@ -121,37 +123,37 @@ void psi_set_exp_free(struct psi_set_exp **exp_ptr)
        }
 }
 
-void psi_set_exp_dump(int fd, struct psi_set_exp *set, unsigned level, int last)
+void psi_set_exp_dump(struct psi_dump *dump, struct psi_set_exp *set, unsigned level, int last)
 {
        if (level > 1) {
                /* only if not directly after `set ...` */
-               dprintf(fd, "%s", psi_t_indent(level));
+               PSI_DUMP(dump, "%s", psi_t_indent(level));
        }
 
        if (set->var) {
                /* parsed, or generated */
                if (set->var->token) {
-                       dprintf(fd, "%s = ", set->var->name);
+                       PSI_DUMP(dump, "%s = ", set->var->name->val);
                }
        }
 
        switch (set->kind) {
        case PSI_SET_FUNC:
-               psi_set_func_dump(fd, set->data.func, level);
+               psi_set_func_dump(dump, set->data.func, level);
                break;
        case PSI_SET_NUMEXP:
-               psi_num_exp_dump(fd, set->data.num);
+               psi_num_exp_dump(dump, set->data.num);
                break;
        default:
                assert(0);
        }
 
        if (!last) {
-               dprintf(fd, ",");
+               PSI_DUMP(dump, ",");
        }
 
        if (set->var) {
-               dprintf(fd, "\t/* fqn=%s */", set->var->fqn);
+               PSI_DUMP(dump, "\t/* fqn=%s */", set->var->fqn->val);
        }
 }
 
@@ -169,39 +171,42 @@ struct psi_impl_var *psi_set_exp_get_impl_var(struct psi_set_exp *exp)
 {
        if (!exp->var) {
                struct psi_decl_var *dvar = psi_set_exp_get_decl_var(exp);
-               char *dollar_name;
+               zend_string *dollar_name;
+               smart_str name = {0};
 
                if (!dvar) {
                        return NULL;
                }
 
-               dollar_name = psi_impl_var_name_prepend(strdup("$"), dvar->name);
+               smart_str_appendc_ex(&name, '$', 1);
+               smart_str_append_ex(&name, dvar->name, 1);
+               dollar_name = smart_str_extract(&name);
                exp->var = psi_impl_var_init(dollar_name, 0);
-               free(dollar_name);
+               zend_string_release(dollar_name);
        }
 
        return exp->var;
 }
 
 bool psi_set_exp_validate(struct psi_data *data, struct psi_set_exp *set,
-               struct psi_impl *impl, struct psi_decl *cb_decl)
+               struct psi_validate_scope *scope)
 {
        struct psi_impl_var *ivar = psi_set_exp_get_impl_var(set);
 
-       if (ivar && !psi_impl_var_validate(data, ivar, impl, NULL, set)) {
+       if (ivar && !psi_impl_var_validate(data, ivar, scope)) {
                data->error(data, ivar->token ? : **(struct psi_token ***) &set->data,
-                               PSI_WARNING, "Unknown variable '%s'", ivar->name);
+                               PSI_WARNING, "Unknown variable '%s'", ivar->name->val);
                return false;
        }
 
        switch (set->kind) {
        case PSI_SET_NUMEXP:
-               if (!psi_num_exp_validate(data, set->data.num, impl, cb_decl, NULL, set, NULL)) {
+               if (!psi_num_exp_validate(data, set->data.num, scope)) {
                        return false;
                }
                break;
        case PSI_SET_FUNC:
-               if (!psi_set_func_validate(data, set->data.func, set, impl, cb_decl)) {
+               if (!psi_set_func_validate(data, set->data.func, scope)) {
                        return false;
                }
                break;