commit after reset fuckup
[m6w6/ext-psi] / src / types / set_stmt.c
index e9f957ba2224b7ec26e3c1dba6348b3736adfde8..fca25197b381a332b6a2a6190a4ddbe08c0d284b 100644 (file)
@@ -29,7 +29,7 @@
 
 struct psi_set_stmt *psi_set_stmt_init(struct psi_set_exp *exp)
 {
-       struct psi_set_stmt *set = calloc(1, sizeof(*set));
+       struct psi_set_stmt *set = pecalloc(1, sizeof(*set), 1);
        set->exp = exp;
        return set;
 }
@@ -46,59 +46,64 @@ void psi_set_stmt_free(struct psi_set_stmt **set_ptr)
 
                *set_ptr = NULL;
                psi_set_exp_free(&set->exp);
-               if (set->token) {
-                       free(set->token);
-               }
+               psi_token_free(&set->token);
                free(set);
        }
 }
 
-void psi_set_stmt_dump(int fd, struct psi_set_stmt *set)
+void psi_set_stmt_dump(struct psi_dump *dump, struct psi_set_stmt *set)
 {
-       dprintf(fd, "\tset ");
-       psi_set_exp_dump(fd, set->exp, 1, 1);
-       dprintf(fd, ";\n");
+       PSI_DUMP(dump, "\tset ");
+       psi_set_exp_dump(dump, set->exp, 1, 1);
+       PSI_DUMP(dump, ";\n");
 }
 
 
-bool psi_set_stmts_validate(struct psi_data *data, struct psi_impl *impl)
+bool psi_set_stmts_validate(struct psi_data *data, struct psi_validate_scope *scope)
 {
        size_t i = 0;
        struct psi_set_stmt *set;
 
        /* we can have any count of set stmts; processing out vars */
        /* check that set stmts reference known variables */
-       while (psi_plist_get(impl->stmts.set, i++, &set)) {
+       while (psi_plist_get(scope->impl->stmts.set, i++, &set)) {
                if (!set->exp->var) {
                        data->error(data, set->token, PSI_WARNING,
                                        "Missing variable of `set` statement of implementation '%s'",
-                                       impl->func->name);
+                                       scope->impl->func->name->val);
                        return false;
                }
-               if (!psi_impl_get_arg(impl, set->exp->var)) {
+               if (!psi_impl_get_arg(scope->impl, set->exp->var)) {
                        data->error(data, set->token, PSI_WARNING,
                                        "Unknown variable '%s' of `set` statement of implementation '%s'",
-                                       set->exp->var->name, impl->func->name);
+                                       set->exp->var->name->val, scope->impl->func->name->val);
                        return false;
                }
 
+               scope->current_set = set->exp;
+
                switch (set->exp->kind) {
                case PSI_SET_NUMEXP:
                        break;
                case PSI_SET_FUNC:
-                       if (!psi_decl_get_arg(impl->decl, set->exp->data.func->var)) {
-                               if (!psi_impl_get_temp_let_arg(impl, set->exp->data.func->var)) {
+                       if (!psi_impl_get_decl_arg(scope->impl, set->exp->data.func->var)) {
+                               if (!psi_impl_get_temp_let_arg(scope->impl, set->exp->data.func->var)) {
                                        data->error(data, set->token, PSI_WARNING,
                                                        "Unknown variable '%s' of `set` statement of implementation '%s'",
-                                                       set->exp->data.func->var, impl->func->name);
+                                                       set->exp->data.func->var->name->val, scope->impl->func->name->val);
+                                       scope->current_set = NULL;
                                        return false;
                                }
                        }
                }
+
                /* validate the expression itself */
-               if (!psi_set_exp_validate(data, set->exp, impl, NULL)) {
+               if (!psi_set_exp_validate(data, set->exp, scope)) {
+                       scope->current_set = NULL;
                        return false;
                }
+
+               scope->current_set = NULL;
        }
 
        return true;