X-Git-Url: https://git.m6w6.name/?a=blobdiff_plain;f=src%2Fparser.h;h=105e974a32efd407f777c734ca39d6e4711e6d1c;hb=6b2e6562e64a263a42910d28e23b6ca94f3ecb65;hp=34e849e712dc38a4ed4e90f90ce3df985592b4db;hpb=c264e2866e9d509e4ed73e2542e80d4c7fb0a92b;p=m6w6%2Fext-psi diff --git a/src/parser.h b/src/parser.h index 34e849e..105e974 100644 --- a/src/parser.h +++ b/src/parser.h @@ -66,11 +66,13 @@ typedef struct decl_type { PSI_Token *token; char *name; token_t type; - struct decl_type *real; - struct decl_struct *strct; - struct decl_union *unn; - struct decl_enum *enm; - struct decl *func; + union { + struct decl_arg *def; + struct decl_struct *strct; + struct decl_union *unn; + struct decl_enum *enm; + struct decl *func; + } real; } decl_type; static inline decl_type *init_decl_type(token_t type, const char *name) { @@ -80,11 +82,17 @@ static inline decl_type *init_decl_type(token_t type, const char *name) { return t; } -static inline decl_type *real_decl_type(decl_type *type) { - while (type->real) { - type = type->real; +static inline int weak_decl_type(decl_type *type) { + switch (type->type) { + case PSI_T_CHAR: + case PSI_T_SHORT: + case PSI_T_INT: + case PSI_T_LONG: + case PSI_T_NAME: + return type->type; + default: + return 0; } - return type; } static inline void free_decl(struct decl *decl); @@ -93,7 +101,7 @@ static inline void free_decl_type(decl_type *type) { free(type->token); } if (type->type == PSI_T_FUNCTION) { - free_decl(type->func); + free_decl(type->real.func); } free(type->name); free(type); @@ -185,6 +193,13 @@ static inline void free_decl_arg(decl_arg *arg) { free(arg); } +static inline decl_type *real_decl_type(decl_type *type) { + while (weak_decl_type(type)) { + type = type->real.def->type; + } + return type; +} + typedef struct decl_typedefs { size_t count; decl_arg **list; @@ -919,11 +934,13 @@ static inline void free_let_callback(let_callback *cb) { free(cb); } +typedef impl_val *(*let_func_handler)(impl_val *tmp, decl_type *type, impl_arg *iarg, void **to_free); + typedef struct let_func { token_t type; char *name; impl_var *var; - impl_val *(*handler)(impl_val *tmp, decl_type *type, impl_arg *iarg, void **to_free); + let_func_handler handler; } let_func; static inline let_func *init_let_func(token_t type, const char *name, impl_var *var) {