Expose and use field_expr().

This may cause problems later on, but it is needed for the binary_expr()
cleanup.
This commit is contained in:
Bill Currie 2013-09-27 17:43:33 +09:00
parent ca9693d9cd
commit 3295370328
6 changed files with 14 additions and 13 deletions

View file

@ -596,6 +596,7 @@ expr_t *convert_bool (expr_t *e, int block);
expr_t *convert_from_bool (expr_t *e, struct type_s *type);
expr_t *bool_expr (int op, expr_t *label, expr_t *e1, expr_t *e2);
expr_t *binary_expr (int op, expr_t *e1, expr_t *e2);
expr_t *field_expr (expr_t *e1, expr_t *e2);
expr_t *asx_expr (int op, expr_t *e1, expr_t *e2);
expr_t *unary_expr (int op, expr_t *e);
expr_t *build_function_call (expr_t *fexpr, struct type_s *ftype,

View file

@ -1576,8 +1576,8 @@ class_finish_ivar_scope (class_type_t *class_type, symtab_t *ivar_scope,
if (sym->sy_type != sy_var)
continue;
sym->sy_type = sy_expr;
sym->s.expr = binary_expr ('.', copy_expr (self_expr),
new_symbol_expr (new_symbol (sym->name)));
sym->s.expr = field_expr (copy_expr (self_expr),
new_symbol_expr (new_symbol (sym->name)));
}
}

View file

@ -426,8 +426,8 @@ init_vector_components (symbol_t *vector_sym, int is_field)
if (is_field) {
expr = new_field_expr (i, &type_float, vector_sym->s.def);
} else {
expr = binary_expr ('.', vector_expr,
new_symbol_expr (new_symbol (fields[i])));
expr = field_expr (vector_expr,
new_symbol_expr (new_symbol (fields[i])));
}
}
sym->sy_type = sy_expr;

View file

@ -1075,7 +1075,7 @@ get_struct_field (type_t *t1, expr_t *e1, expr_t *e2)
return field;
}
static expr_t *
expr_t *
field_expr (expr_t *e1, expr_t *e2)
{
type_t *t1, *t2;
@ -2756,10 +2756,10 @@ assign_expr (expr_t *e1, expr_t *e2)
warning (e1, "assignment between disparate function types");
} else if (t1->type == ev_float && t2->type == ev_vector) {
warning (e1, "assignment of vector to float");
e2 = binary_expr ('.', e2, new_name_expr ("x"));
e2 = field_expr (e2, new_name_expr ("x"));
} else if (t1->type == ev_vector && t2->type == ev_float) {
warning (e1, "assignment of float to vector");
e1 = binary_expr ('.', e1, new_name_expr ("x"));
e1 = field_expr (e1, new_name_expr ("x"));
} else {
return type_mismatch (e1, e2, op);
}
@ -2972,13 +2972,13 @@ super_expr (class_type_t *class_type)
super_block = new_block_expr ();
e = assign_expr (binary_expr ('.', super, new_name_expr ("self")),
new_name_expr ("self"));
e = assign_expr (field_expr (super, new_name_expr ("self")),
new_name_expr ("self"));
append_expr (super_block, e);
e = new_symbol_expr (class_pointer_symbol (class));
e = assign_expr (binary_expr ('.', super, new_name_expr ("class")),
binary_expr ('.', e, new_name_expr ("super_class")));
e = assign_expr (field_expr (super, new_name_expr ("class")),
field_expr (e, new_name_expr ("super_class")));
append_expr (super_block, e);
e = address_expr (super, 0, 0);

View file

@ -1231,7 +1231,7 @@ unary_expr
| '(' expr ')' { $$ = $2; $$->paren = 1; }
| unary_expr '(' opt_arg_list ')' { $$ = function_expr ($1, $3); }
| unary_expr '[' expr ']' { $$ = array_expr ($1, $3); }
| unary_expr '.' unary_expr { $$ = binary_expr ('.', $1, $3); }
| unary_expr '.' unary_expr { $$ = field_expr ($1, $3); }
| INCOP unary_expr { $$ = incop_expr ($1, $2, 0); }
| unary_expr INCOP { $$ = incop_expr ($2, $1, 1); }
| '+' cast_expr %prec UNARY { $$ = $2; }

View file

@ -624,7 +624,7 @@ vector_call (sblock_t *sblock, expr_t *earg, expr_t *param, int ind,
for (i = 0; i < 3; i++) {
n = new_name_expr (names[i]);
v = new_float_expr (earg->e.value->v.vector_val[i]);
a = assign_expr (binary_expr ('.', param, n), v);
a = assign_expr (field_expr (param, n), v);
param = new_param_expr (get_type (earg), ind);
a->line = earg->line;
a->file = earg->file;