- struct psi_data *D;
- void *dlopened = NULL;
- size_t i, count = C->count++, check_round, check_count;
- decl_typedefs *check_defs = P->defs;
- decl_structs *check_structs = P->structs;
- decl_unions *check_unions = P->unions;
- decl_enums *check_enums = P->enums;
- unsigned flags = C->flags;
-
- C->data = realloc(C->data, C->count * sizeof(*C->data));
- D = psi_data_exchange(&C->data[count], PSI_DATA(P));
-
-#define REVALIDATE(what) do { \
- if (check_round && check_ ##what) { \
- free(check_ ##what->list); \
- free(check_ ##what); \
- } \
- check_ ##what = recheck_ ##what; \
-} while (0)
-#define CHECK_TOTAL (CHECK_COUNT(defs) + CHECK_COUNT(structs) + CHECK_COUNT(enums))
-#define CHECK_COUNT(of) (check_ ##of ? check_ ##of->count : 0)
-
- if (!(flags & PSI_PARSER_SILENT)) {
- /* no warnings on first round */
- C->flags |= PSI_PARSER_SILENT;
- }
- for (check_round = 0, check_count = 0; CHECK_TOTAL && check_count != CHECK_TOTAL; ++check_round) {
- decl_typedefs *recheck_defs = NULL;
- decl_structs *recheck_structs = NULL;
- decl_unions *recheck_unions = NULL;
- decl_enums *recheck_enums = NULL;
-
- check_count = CHECK_TOTAL;
-
- for (i = 0; i < CHECK_COUNT(defs); ++i) {
- if (validate_decl_typedef(PSI_DATA(C), check_defs->list[i])) {
- C->defs = add_decl_typedef(C->defs, check_defs->list[i]);
- } else {
- recheck_defs = add_decl_typedef(recheck_defs, check_defs->list[i]);
- }
- }
- for (i = 0; i < CHECK_COUNT(structs); ++i) {
- if (validate_decl_struct(PSI_DATA(C), check_structs->list[i])) {
- C->structs = add_decl_struct(C->structs, check_structs->list[i]);
- } else {
- recheck_structs = add_decl_struct(recheck_structs, check_structs->list[i]);
- }
- }
- for (i = 0; i < CHECK_COUNT(unions); ++i) {
- if (validate_decl_union(PSI_DATA(C), check_unions->list[i])) {
- C->unions = add_decl_union(C->unions, check_unions->list[i]);
- } else {
- recheck_unions = add_decl_union(recheck_unions, check_unions->list[i]);
- }
+ if (darg->var->array_size) {
+ C->ops->composite_init(C, darg);
+ return darg->engine.type;
+ }
+ if (darg->var->pointer_level) {
+ return C->ops->typeof_decl(C, PSI_T_POINTER);
+ }
+
+ return psi_context_decl_arg_type(C, darg);
+}
+
+void **psi_context_composite_type_elements(struct psi_context *C,
+ struct psi_decl_arg *darg, struct psi_plist **eles)
+{
+ struct psi_decl_type *dtype;
+ struct psi_decl_arg *tmp;
+ void *type, *copy;
+ size_t i;
+
+ dtype = psi_decl_type_get_real(darg->type);
+
+ switch (dtype->type) {
+ case PSI_T_STRUCT:
+ psi_context_decl_struct_type_elements(C, dtype->real.strct, eles);
+ break;
+ case PSI_T_UNION:
+ if (psi_plist_bottom(dtype->real.unn->args, &tmp)) {
+ type = psi_context_decl_arg_full_type(C, tmp);
+ copy = C->ops->copyof_type(C, type);
+ *eles = psi_plist_add(*eles, ©);