const char *member_caret;
unsigned long member_line;
-
int offset = 0;
+
int size = DATA_INT & 0x1f;
int elem_size = DATA_INT & 0x1f;
+
+ int array_dimensions = 0;
int pointer_depth = 0;
+
int is_array = 0;
int is_floating = 0;
int is_unsigned = 0;
}
is_unsigned = last_found_member_is_unsigned;
+ array_dimensions = last_found_member_array_dimensions;
{
}
+ } else if (array_dimensions > 1) {
+ emit_parse_postfix_subscripts_to_reg_dims_now (reg, subscript_elem_size, pointer_depth, elem_size, array_dimensions, is_unsigned, &subscript_elem_size);
} else {
emit_parse_postfix_subscript_scaled_address_to_reg_now (reg, subscript_elem_size);
- }
+ }
if (tok.kind == TOK_ARROW && subscript_elem_size <= (DATA_PTR & 0x1f)) {
postfix_member_pointer_depth--;
}
- if (postfix_member_pointer_depth != 0 || postfix_member_size <= (DATA_PTR & 0x1f)) {
+ if (array_dimensions <= 1 && (postfix_member_pointer_depth != 0 || postfix_member_size <= (DATA_PTR & 0x1f))) {
emit_load_deref_reg_ex_now (reg, subscript_elem_size, is_unsigned);
}
const char *member_caret;
unsigned long member_line;
-
int offset = 0;
+
int size = DATA_INT & 0x1f;
int elem_size = DATA_INT & 0x1f;
+
+ int array_dimensions = 0;
int pointer_depth = 0;
+
int is_array = 0;
int is_floating = 0;
int is_unsigned = 0;
}
is_unsigned = last_found_member_is_unsigned;
+ array_dimensions = last_found_member_array_dimensions;
{
}
+ } else if (array_dimensions > 1) {
+ emit_parse_postfix_subscripts_to_reg_dims_now (reg, subscript_elem_size, pointer_depth, elem_size, array_dimensions, is_unsigned, &subscript_elem_size);
} else {
emit_parse_postfix_subscript_scaled_address_to_reg_now (reg, subscript_elem_size);
- }
+ }
if (tok.kind == TOK_ARROW && subscript_elem_size <= (DATA_PTR & 0x1f)) {
postfix_member_pointer_depth--;
}
- if (postfix_member_pointer_depth != 0 || postfix_member_size <= (DATA_PTR & 0x1f)) {
+ if (array_dimensions <= 1 && (postfix_member_pointer_depth != 0 || postfix_member_size <= (DATA_PTR & 0x1f))) {
emit_load_deref_reg_ex_now (reg, subscript_elem_size, is_unsigned);
}
struct member_info_entry member_infos[MAX_MEMBER_INFOS];
int member_info_count = 0;
-const char *last_found_member_tag_name = 0;
+int last_found_member_array_dimensions = 0;
int last_found_member_is_unsigned = 0;
struct pending_param pending_params[MAX_PENDING_PARAMS];
+const char *last_found_member_tag_name = 0;
int pending_param_count;
int preserve_pending_params;
last_found_member_tag_name = 0;
last_found_member_is_unsigned = 0;
+ last_found_member_array_dimensions = 0;
last_found_member_calling_convention = TOK_EOF;
if (!name) {
last_found_member_tag_name = member_infos[best].tag_name;
last_found_member_is_unsigned = member_infos[best].is_unsigned ? 1 : 0;
+ last_found_member_array_dimensions = member_infos[best].array_dimensions;
last_found_member_calling_convention = member_infos[best].calling_convention;
if (offset) {
last_found_member_tag_name = 0;
last_found_member_is_unsigned = 0;
+ last_found_member_array_dimensions = 0;
last_found_member_calling_convention = TOK_EOF;
if (!name) {
last_found_member_tag_name = member_infos[best].tag_name;
last_found_member_is_unsigned = member_infos[best].is_unsigned ? 1 : 0;
+ last_found_member_array_dimensions = member_infos[best].array_dimensions;
last_found_member_calling_convention = member_infos[best].calling_convention;
if (offset) {
member_infos[member_info_count].size = size;
member_infos[member_info_count].elem_size = elem_size > 0 ? elem_size : size;
member_infos[member_info_count].pointer_depth = pointer_depth;
+ member_infos[member_info_count].array_dimensions = is_array ? declarator_array_dimensions : 0;
member_infos[member_info_count].is_array = is_array;
member_infos[member_info_count].is_floating = is_floating ? 1 : 0;
member_infos[member_info_count].is_unsigned = parsed_type_is_unsigned ? 1 : 0;
dst->size = src->size;
dst->elem_size = src->elem_size;
dst->pointer_depth = src->pointer_depth;
+ dst->array_dimensions = src->array_dimensions;
dst->is_array = src->is_array;
dst->is_floating = src->is_floating;
dst->is_unsigned = src->is_unsigned;
if (declarator_has_array && declarator_is_pointer) {
member_info_elem_size = DATA_PTR;
+ } else if (declarator_has_array && declarator_first_array_count > 0) {
+
+ /*
+ * One subscript of a multidimensional array member
+ * selects the complete object after the first
+ * dimension. member_size already contains the
+ * storage for every dimension, so divide by the
+ * first dimension rather than recording the scalar
+ * base type.
+ *
+ * char segment[32][4];
+ *
+ * segment[i] therefore has a four-byte stride.
+ */
+ member_info_elem_size = member_size / declarator_first_array_count;
+
} else {
member_info_elem_size = declarator_is_pointer ?
(parsed_type_is_aggregate ? parsed_type_size : (parsed_type_size & 0x1f)) :
- (declarator_has_array ? member_type_size : member_size);
+ member_size;
}