X-Git-Url: https://git.m6w6.name/?a=blobdiff_plain;f=src%2Fparser.h;h=34e849e712dc38a4ed4e90f90ce3df985592b4db;hb=cbdcfd25784d00b309573f5e2de35538e9efa8af;hp=3a00d6d766a5d75dea7a20fb7380c2aa2aae36c1;hpb=8d2ff6a3b85203ea5f8398f846a7764fd0e1d126;p=m6w6%2Fext-psi diff --git a/src/parser.h b/src/parser.h index 3a00d6d..34e849e 100644 --- a/src/parser.h +++ b/src/parser.h @@ -60,7 +60,6 @@ typedef union impl_val { zend_fcall *cb; } zend; void *ptr; - uint8_t _dbg[sizeof(void *)]; } impl_val; typedef struct decl_type { @@ -157,9 +156,9 @@ typedef struct decl_arg { decl_type *type; decl_var *var; decl_struct_layout *layout; - struct let_stmt *let; impl_val val; void *ptr; + void *let; void *mem; } decl_arg; @@ -170,6 +169,7 @@ static inline decl_arg *init_decl_arg(decl_type *type, decl_var *var) { arg->var = var; var->arg = arg; arg->ptr = &arg->val; + arg->let = arg->ptr; return arg; } @@ -297,10 +297,6 @@ typedef struct decl_callinfo { size_t argc; void **args; void **rval; - struct { - void *data; - void (*dtor)(void *data); - } closure; } decl_callinfo; typedef struct decl { @@ -481,6 +477,7 @@ static inline void free_impl_type(impl_type *type) { typedef struct impl_var { PSI_Token *token; char *name; + struct impl_arg *arg; unsigned reference:1; } impl_var; @@ -601,6 +598,7 @@ static inline impl_arg *init_impl_arg(impl_type *type, impl_var *var, impl_def_v impl_arg *arg = calloc(1, sizeof(*arg)); arg->type = type; arg->var = var; + arg->var->arg = arg; arg->def = def; return arg; } @@ -902,6 +900,7 @@ static inline void free_let_calloc(let_calloc *alloc) { typedef struct let_callback { struct let_func *func; struct set_values *args; + decl *decl; } let_callback; static inline void free_let_func(struct let_func *func); @@ -924,7 +923,7 @@ typedef struct let_func { token_t type; char *name; impl_var *var; - impl_arg *arg; + impl_val *(*handler)(impl_val *tmp, decl_type *type, impl_arg *iarg, void **to_free); } let_func; static inline let_func *init_let_func(token_t type, const char *name, impl_var *var) { @@ -1018,8 +1017,6 @@ static inline void free_let_val(let_val *let) { typedef struct let_stmt { decl_var *var; let_val *val; - - void *ptr; } let_stmt; static inline let_stmt *init_let_stmt(decl_var *var, let_val *val) { @@ -1087,9 +1084,10 @@ static inline set_value *init_set_value(set_func *func, decl_vars *vars) { val->vars = vars; return val; } + +static inline set_values *add_set_value(set_values *vals, set_value *val); static inline set_value *add_inner_set_value(set_value *val, set_value *inner) { - val->inner->vals = realloc(val->inner->vals, ++val->inner->count * sizeof(*val->inner->vals)); - val->inner->vals[val->inner->count-1] = inner; + val->inner = add_set_value(val->inner, inner); inner->outer.set = val; return val; } @@ -1102,11 +1100,7 @@ static inline void free_set_value(set_value *val) { free_decl_vars(val->vars); } if (val->inner && (!val->outer.set || val->outer.set->inner != val->inner)) { - size_t i; - for (i = 0; i < val->inner->count; ++i) { - free_set_value(val->inner->vals[i]); - } - free(val->inner->vals); + free_set_values(val->inner); } if (val->num) { free_num_exp(val->num); @@ -1125,6 +1119,9 @@ static inline set_values *init_set_values(set_value *val) { } static inline set_values *add_set_value(set_values *vals, set_value *val) { + if (!vals) { + vals = calloc(1, sizeof(*vals)); + } vals->vals = realloc(vals->vals, ++vals->count * sizeof(val)); vals->vals[vals->count-1] = val; return vals; @@ -1132,6 +1129,11 @@ static inline set_values *add_set_value(set_values *vals, set_value *val) { static inline void free_set_values(set_values *vals) { if (vals->vals) { + size_t i; + + for (i = 0; i < vals->count; ++i) { + free_set_value(vals->vals[i]); + } free(vals->vals); } free(vals);