X-Git-Url: https://git.m6w6.name/?a=blobdiff_plain;ds=sidebyside;f=src%2Fparser.h;h=ce74067db65a94d4ba3f6c9f458a1fda5a3504b8;hb=633acd548ce5da37812bca7119e57c8f56e974e2;hp=d7393d443cb831b0cde5a08d7d8e1db3a287d921;hpb=762750b4a3f4e0471993849c4bd12965f6b62356;p=m6w6%2Fext-psi diff --git a/src/parser.h b/src/parser.h index d7393d4..ce74067 100644 --- a/src/parser.h +++ b/src/parser.h @@ -89,16 +89,6 @@ static void free_decl_typedefs(decl_typedefs *defs) { free(defs); } -typedef union impl_val { - char cval; - short sval; - int ival; - double dval; - zend_long lval; - zend_string *str; - void *ptr; -} impl_val; - typedef struct decl_var { char *name; unsigned pointer_level; @@ -256,6 +246,26 @@ static inline void free_decls(decls *decls) { free(decls); } +typedef union impl_val { + unsigned char bval; + char cval; + short sval; + int ival; + double dval; + zend_long lval; + zend_string *str; + void *ptr; +} impl_val; + +static inline impl_val *deref_impl_val(unsigned level, impl_val *ret_val, decl_arg *darg) { + unsigned i; + + for (i = level; i < darg->var->pointer_level && ret_val->ptr; ++i) { + ret_val = *(void **)ret_val; + } + return ret_val; +} + typedef struct impl_type { char *name; token_t type; @@ -616,6 +626,7 @@ static inline impl_stmts *add_impl_stmt(impl_stmts *stmts, impl_stmt *stmt) { stmts->fre.list = add_impl_stmt_ex(stmts->fre.list, ++stmts->fre.count, stmt->s.fre); break; } + free(stmt); return stmts; }