create new_*_expr functions for all basic expression types except ex_poitner

and use them instead of new_expr and setting the fields each time. Serious
code cleanup :)
This commit is contained in:
Bill Currie 2002-09-11 16:21:26 +00:00
parent cb241c50bf
commit 324b89696a
4 changed files with 174 additions and 124 deletions

View file

@ -127,15 +127,31 @@ struct type_s *get_type (expr_t *e);
etype_t extract_type (expr_t *e);
expr_t *new_expr (void);
const char *new_label_name (void);
expr_t *new_label_expr (void);
expr_t *new_block_expr (void);
expr_t *new_binary_expr (int op, expr_t *e1, expr_t *e2);
expr_t *new_unary_expr (int op, expr_t *e1);
expr_t *new_temp_def_expr (struct type_s *type);
expr_t *new_bind_expr (expr_t *e1, expr_t *e2);
expr_t *new_name_expr (const char *name);
expr_t *new_def_expr (struct def_s *def);
expr_t *new_temp_def_expr (struct type_s *type);
expr_t *new_nil_expr (void);
expr_t *new_name_expr (const char *name);
expr_t *new_string_expr (const char *string_val);
expr_t *new_float_expr (float float_val);
expr_t *new_vector_expr (float *vector_val);
expr_t *new_entity_expr (int entity_val);
expr_t *new_field_expr (int field_val);
expr_t *new_func_expr (int func_val);
//expr_t *new_pointer_expr ();
expr_t *new_quaternion_expr (float *quaternion_val);
expr_t *new_integer_expr (int integer_val);
expr_t *new_uinteger_expr (unsigned int uinteger_val);
expr_t *new_short_expr (short short_val);
expr_t *new_bind_expr (expr_t *e1, expr_t *e2);
expr_t *new_self_expr (void);
expr_t *new_this_expr (void);

View file

@ -476,6 +476,15 @@ new_unary_expr (int op, expr_t *e1)
return e;
}
expr_t *
new_def_expr (def_t *def)
{
expr_t *e = new_expr ();
e->type = ex_def;
e->e.def = def;
return e;
}
expr_t *
new_temp_def_expr (type_t *type)
{
@ -486,6 +495,114 @@ new_temp_def_expr (type_t *type)
return e;
}
expr_t *
new_nil_expr (void)
{
expr_t *e = new_expr ();
e->type = ex_nil;
return e;
}
expr_t *
new_name_expr (const char *name)
{
expr_t *e = new_expr ();
e->type = ex_name;
e->e.string_val = name;
return e;
}
expr_t *
new_string_expr (const char *string_val)
{
expr_t *e = new_expr ();
e->type = ex_string;
e->e.string_val = string_val;
return e;
}
expr_t *
new_float_expr (float float_val)
{
expr_t *e = new_expr ();
e->type = ex_float;
e->e.float_val = float_val;
return e;
}
expr_t *
new_vector_expr (float *vector_val)
{
expr_t *e = new_expr ();
e->type = ex_vector;
memcpy (e->e.vector_val, vector_val, sizeof (e->e.vector_val));
return e;
}
expr_t *
new_entity_expr (int entity_val)
{
expr_t *e = new_expr ();
e->type = ex_entity;
e->e.entity_val = entity_val;
return e;
}
expr_t *
new_field_expr (int field_val)
{
expr_t *e = new_expr ();
e->type = ex_field;
e->e.field_val = field_val;
return e;
}
expr_t *
new_func_expr (int func_val)
{
expr_t *e = new_expr ();
e->type = ex_func;
e->e.func_val = func_val;
return e;
}
//expr_t *new_pointer_expr ();
expr_t *
new_quaternion_expr (float *quaternion_val)
{
expr_t *e = new_expr ();
e->type = ex_quaternion;
memcpy (e->e.quaternion_val, quaternion_val, sizeof (e->e.quaternion_val));
return e;
}
expr_t *
new_integer_expr (int integer_val)
{
expr_t *e = new_expr ();
e->type = ex_integer;
e->e.integer_val = integer_val;
return e;
}
expr_t *
new_uinteger_expr (unsigned int uinteger_val)
{
expr_t *e = new_expr ();
e->type = ex_uinteger;
e->e.uinteger_val = uinteger_val;
return e;
}
expr_t *
new_short_expr (short short_val)
{
expr_t *e = new_expr ();
e->type = ex_short;
e->e.short_val = short_val;
return e;
}
expr_t *
new_bind_expr (expr_t *e1, expr_t *e2)
{
@ -503,24 +620,6 @@ new_bind_expr (expr_t *e1, expr_t *e2)
return e;
}
expr_t *
new_name_expr (const char *name)
{
expr_t *e = new_expr ();
e->type = ex_name;
e->e.string_val = name;
return e;
}
expr_t *
new_def_expr (def_t *def)
{
expr_t *e = new_expr ();
e->type = ex_def;
e->e.def = def;
return e;
}
expr_t *
new_self_expr (void)
{
@ -1121,6 +1220,7 @@ field_expr (expr_t *e1, expr_t *e2)
expr_t *
test_expr (expr_t *e, int test)
{
static float zero[4] = {0, 0, 0, 0};
expr_t *new = 0;
etype_t type;
@ -1142,8 +1242,7 @@ test_expr (expr_t *e, int test)
case ev_void:
return error (e, "void has no value");
case ev_string:
new = new_expr ();
new->type = ex_string;
new = new_string_expr (0);
break;
case ev_uinteger:
case ev_integer:
@ -1152,32 +1251,25 @@ test_expr (expr_t *e, int test)
case ev_float:
if (options.code.progsversion == PROG_ID_VERSION)
return e;
new = new_expr ();
new->type = ex_float;
new = new_float_expr (0);
break;
case ev_vector:
new = new_expr ();
new->type = ex_vector;
new = new_vector_expr (zero);
break;
case ev_entity:
new = new_expr ();
new->type = ex_entity;
new = new_entity_expr (0);
break;
case ev_field:
new = new_expr ();
new->type = ex_nil;
new = new_field_expr (0);
break;
case ev_func:
new = new_expr ();
new->type = ex_nil;
new = new_func_expr (0);
break;
case ev_pointer:
new = new_expr ();
new->type = ex_nil;
new = new_nil_expr ();
break;
case ev_quaternion:
new = new_expr ();
new->type = ex_quaternion;
new = new_quaternion_expr (zero);
break;
case ev_struct:
case ev_object:
@ -1509,10 +1601,7 @@ unary_expr (int op, expr_t *e)
case ex_temp:
bitnot_expr:
if (options.code.progsversion == PROG_ID_VERSION) {
expr_t *n1 = new_expr ();
n1->type = ex_integer;
n1->e.integer_val = -1;
expr_t *n1 = new_integer_expr (-1);
return binary_expr ('-', n1, e);
} else {
expr_t *n = new_unary_expr (op, e);
@ -1716,12 +1805,9 @@ function_expr (expr_t *e1, expr_t *e2)
e->e.expr.type = ftype->aux_type;
append_expr (call, e);
if (ftype->aux_type != &type_void) {
expr_t *ret = new_expr ();
expr_t *ret = new_def_expr (new_def (ftype->aux_type, 0, 0));
ret->type = ex_def;
ret->e.def = new_def (ftype->aux_type, 0, 0);
ret->e.def->ofs = def_ret.ofs;
call->e.block.result = ret;
}
return call;
@ -1734,8 +1820,7 @@ return_expr (function_t *f, expr_t *e)
if (f->def->type->aux_type != &type_void) {
if (options.traditional) {
warning (e, "return from non-void function without a value");
e = new_expr ();
e->type = ex_nil;
e = new_nil_expr ();
} else {
e = error (e, "return from non-void function without a value");
return e;
@ -1800,14 +1885,13 @@ conditional_expr (expr_t *cond, expr_t *e1, expr_t *e2)
expr_t *
incop_expr (int op, expr_t *e, int postop)
{
expr_t *one = new_expr ();
expr_t *one;
expr_t *incop;
if (e->type == ex_error)
return e;
one->type = ex_integer; // integer constants get auto-cast to float
one->e.integer_val = 1;
one = new_integer_expr (1); // integer constants get auto-cast to float
incop = asx_expr (op, e, one);
if (postop) {
expr_t *temp;
@ -2149,11 +2233,10 @@ expr_t *
encode_expr (type_t *type)
{
dstring_t *encoding = dstring_newstr ();
expr_t *e = new_expr ();
expr_t *e;
encode_type (encoding, type);
e->type = ex_string;
e->e.string_val = encoding->str;
e = new_string_expr (encoding->str);
free (encoding);
return e;
}
@ -2216,8 +2299,6 @@ sizeof_expr (expr_t *expr, struct type_s *type)
}
if (!type)
type = get_type (expr);
expr = new_expr ();
expr->type = ex_integer;
expr->e.integer_val = type_size (type);
expr = new_integer_expr (type_size (type));
return expr;
}

View file

@ -183,13 +183,9 @@ copy_keywordargs (const keywordarg_t *kwargs)
expr_t *
send_message (int super)
{
expr_t *e;
e = new_expr ();
e->type = ex_def;
e->e.def = get_def (&type_IMP, super ? "obj_msgSend_super" : "obj_msgSend",
pr.scope, st_extern);
return e;
return new_def_expr (get_def (&type_IMP,
super ? "obj_msgSend_super" : "obj_msgSend",
pr.scope, st_extern));
}
void

View file

@ -832,54 +832,19 @@ arg_list
;
const
: FLOAT_VAL
{
$$ = new_expr ();
$$->type = ex_float;
$$->e.float_val = $1;
}
| string_val
{
$$ = $1;
}
| VECTOR_VAL
{
$$ = new_expr ();
$$->type = ex_vector;
memcpy ($$->e.vector_val, $1, sizeof ($$->e.vector_val));
}
| QUATERNION_VAL
{
$$ = new_expr ();
$$->type = ex_quaternion;
memcpy ($$->e.quaternion_val, $1, sizeof ($$->e.quaternion_val));
}
| INT_VAL
{
$$ = new_expr ();
$$->type = ex_integer;
$$->e.integer_val = $1;
}
| NIL
{
$$ = new_expr ();
$$->type = ex_nil;
}
: FLOAT_VAL { $$ = new_float_expr ($1); }
| string_val { $$ = $1; }
| VECTOR_VAL { $$ = new_vector_expr ($1); }
| QUATERNION_VAL { $$ = new_quaternion_expr ($1); }
| INT_VAL { $$ = new_integer_expr ($1); }
| NIL { $$ = new_nil_expr (); }
;
string_val
: STRING_VAL
{
$$ = new_expr ();
$$->type = ex_string;
$$->e.string_val = $1;
}
: STRING_VAL { $$ = new_string_expr ($1); }
| string_val STRING_VAL
{
expr_t *e = new_expr ();
e->type = ex_string;
e->e.string_val = $2;
$$ = binary_expr ('+', $1, e);
$$ = binary_expr ('+', $1, new_string_expr ($2));
}
;
@ -1277,12 +1242,12 @@ obj_messageexpr
receiver
: expr
| CLASS_NAME { $$ = new_name_expr ($1); }
| SUPER { $$ = new_name_expr ("super"); }
| CLASS_NAME { $$ = new_name_expr ($1); }
| SUPER { $$ = new_name_expr ("super"); }
;
messageargs
: selector { $$ = new_keywordarg ($1, 0); }
: selector { $$ = new_keywordarg ($1, 0); }
| keywordarglist
;
@ -1296,12 +1261,12 @@ keywordarglist
;
keywordarg
: selector ':' arg_list { $$ = new_keywordarg ($1, $3); }
| ':' arg_list { $$ = new_keywordarg ("", $2); }
: selector ':' arg_list { $$ = new_keywordarg ($1, $3); }
| ':' arg_list { $$ = new_keywordarg ("", $2); }
;
selectorarg
: selector { $$ = new_keywordarg ($1, 0); }
: selector { $$ = new_keywordarg ($1, 0); }
| keywordnamelist
;
@ -1315,23 +1280,15 @@ keywordnamelist
;
keywordname
: selector ':' { $$ = new_keywordarg ($1, 0); }
| ':' { $$ = new_keywordarg ("", 0); }
: selector ':' { $$ = new_keywordarg ($1, 0); }
| ':' { $$ = new_keywordarg ("", 0); }
;
obj_string
: '@' STRING_VAL
{
$$ = new_expr ();
$$->type = ex_string;
$$->e.string_val = $2;
}
: '@' STRING_VAL { $$ = new_string_expr ($2); }
| obj_string '@' STRING_VAL
{
expr_t *e = new_expr ();
e->type = ex_string;
e->e.string_val = $3;
$$ = binary_expr ('+', $1, e);
$$ = binary_expr ('+', $1, new_string_expr ($3));
}
;