X-Git-Url: https://git.m6w6.name/?p=m6w6%2Fext-psi;a=blobdiff_plain;f=src%2Fparser_proc_grammar.y;h=af5216514061644518283d7f23593199f7dde66e;hp=a50127c5bf0d06412a1ca20e089cc50d918fe492;hb=a2a2428b6e50787a7f33151275fb5ceabc7c5621;hpb=858a7fb4796b921cc594ab0c74b3ff01a8771522 diff --git a/src/parser_proc_grammar.y b/src/parser_proc_grammar.y index a50127c..af52165 100644 --- a/src/parser_proc_grammar.y +++ b/src/parser_proc_grammar.y @@ -62,7 +62,6 @@ static inline void psi_parser_proc_add_typedef(struct psi_parser *P, struct psi_ P->types = psi_plist_init((psi_plist_dtor) psi_decl_arg_free); } P->types = psi_plist_add(P->types, &def); - psi_parser_proc_add_from_typedef(P, def); } static inline void psi_parser_proc_add_const(struct psi_parser *P, struct psi_const *cnst) { assert(cnst); @@ -719,13 +718,13 @@ impl_def_val[val]: if (psi_num_exp_validate(PSI_DATA(P), $num, NULL, NULL, NULL, NULL, NULL)) { impl_val res = {0}; token_t type = psi_num_exp_exec($num, &res, NULL, &P->preproc->defs); - + if (type == PSI_T_FLOAT || type == PSI_T_DOUBLE) { $val = psi_impl_def_val_init(type, NULL); } else { $val = psi_impl_def_val_init(PSI_T_INT, NULL); } - + switch (type) { case PSI_T_UINT8: $val->ival.zend.lval = res.u8; break; case PSI_T_UINT16: $val->ival.zend.lval = res.u16; break; @@ -739,7 +738,7 @@ impl_def_val[val]: case PSI_T_DOUBLE: $val->ival.dval = res.dval; break; default: assert(0); - + } } else { $val = NULL; @@ -787,6 +786,7 @@ typedef[def]: $def->var->token = psi_token_copy($name_token); $def->type->token = psi_token_copy($enum->token); $def->type->real.enm = $enum; + psi_parser_proc_add_enum(P, $enum); } | struct_name[struct] align_and_size[as] struct_args_block[args] decl_var[var] { $def = psi_decl_arg_init(psi_decl_type_init(PSI_T_STRUCT, $struct->text), $var); @@ -795,6 +795,7 @@ typedef[def]: $def->type->real.strct->token = psi_token_copy($struct); $def->type->real.strct->align = $as.pos; $def->type->real.strct->size = $as.len; + psi_parser_proc_add_struct(P, $def->type->real.strct); } | union_name[union] align_and_size[as] struct_args_block[args] decl_var[var] { $def = psi_decl_arg_init(psi_decl_type_init(PSI_T_UNION, $union->text), $var); @@ -803,6 +804,7 @@ typedef[def]: $def->type->real.unn->token = psi_token_copy($union); $def->type->real.unn->align = $as.pos; $def->type->real.unn->size = $as.len; + psi_parser_proc_add_union(P, $def->type->real.unn); } | const_decl_type[type] decl_stdint_type[stdint] { $stdint->type = PSI_T_NAME; @@ -1633,6 +1635,10 @@ let_exp_byref[exp]: | let_calloc[calloc] { $exp = psi_let_exp_init(PSI_LET_CALLOC, $calloc); } +| STATIC let_calloc[calloc] { + $exp = psi_let_exp_init(PSI_LET_CALLOC, $calloc); + $calloc->static_memory = 1; +} | let_callback[callback] { $exp = psi_let_exp_init(PSI_LET_CALLBACK, $callback); }