flush
[m6w6/ext-psi] / src / parser.h
index 3d2dd6fefb9bf5e7ddeca8be285cb665652a225f..a9060bd5a67d5973edeae5b486935ce751fa52f2 100644 (file)
@@ -573,6 +573,7 @@ static inline void free_let_stmt(let_stmt *stmt) {
 typedef struct set_func {
        token_t type;
        char *name;
+       void (*handler)(zval *, token_t, impl_val *, decl_var *);
 } set_func;
 
 static inline set_func *init_set_func(token_t type, const char *name) {
@@ -590,6 +591,8 @@ static inline void free_set_func(set_func *func) {
 typedef struct set_value {
        set_func *func;
        decl_vars *vars;
+       struct set_value **inner;
+       size_t count;
 } set_value;
 
 static inline set_value *init_set_value(set_func *func, decl_vars *vars) {
@@ -598,10 +601,21 @@ static inline set_value *init_set_value(set_func *func, decl_vars *vars) {
        val->vars = vars;
        return val;
 }
+static inline set_value *add_inner_set_value(set_value *val, set_value *inner) {
+       val->inner = realloc(val->inner, ++val->count * sizeof(*val->inner));
+       val->inner[val->count-1] = inner;
+       return val;
+}
 
 static inline void free_set_value(set_value *val) {
        free_set_func(val->func);
        free_decl_vars(val->vars);
+       if (val->inner) {
+               size_t i;
+               for (i = 0; i < val->count; ++i) {
+                       free_set_value(val->inner[i]);
+               }
+       }
        free(val);
 }
 
@@ -625,20 +639,20 @@ static inline void free_set_stmt(set_stmt *set) {
 }
 
 typedef struct return_stmt {
-       set_func *func;
-       decl_var *decl;
+       set_value *set;
+       decl_arg *decl;
 } return_stmt;
 
-static inline return_stmt *init_return_stmt(set_func *func, decl_var *decl) {
+static inline return_stmt *init_return_stmt(set_value *val) {
        return_stmt *ret = calloc(1, sizeof(*ret));
-       ret->func = func;
-       ret->decl = decl;
+       ret->set = val;
        return ret;
 }
 
 static inline void free_return_stmt(return_stmt *ret) {
-       free_set_func(ret->func);
-       free_decl_var(ret->decl);
+       //free_set_func(ret->func);
+       //free_decl_var(ret->decl);
+       free_set_value(ret->set);
        free(ret);
 }