Store the function type in function values.

This fixes IMP msg = nil;
This commit is contained in:
Bill Currie 2012-11-21 10:06:15 +09:00
parent 686937123c
commit 86968f662e
4 changed files with 19 additions and 8 deletions

View file

@ -106,6 +106,11 @@ typedef struct ex_pointer_s {
struct def_s *def;
} ex_pointer_t;
typedef struct ex_func_s {
int val;
struct type_s *type;
} ex_func_t;
typedef struct {
int size;
struct expr_s *e[1];
@ -166,7 +171,7 @@ typedef struct ex_value_s {
float float_val; ///< float constant
float vector_val[3]; ///< vector constant
int entity_val; ///< entity constant
int func_val; ///< function constant
ex_func_t func_val; ///< function constant
ex_pointer_t pointer; ///< pointer constant
float quaternion_val[4]; ///< quaternion constant
int integer_val; ///< integer constant
@ -406,10 +411,11 @@ expr_t *new_field_expr (int field_val, struct type_s *type, struct def_s *def);
/** Create a new function constant expression node.
\param func_val The function constant being represented.
\param type The type of the function
\return The new function constant expression node
(expr_t::e::func_val).
*/
expr_t *new_func_expr (int func_val);
expr_t *new_func_expr (int func_val, struct type_s *type);
/** Create a new pointer constant expression node.

View file

@ -45,7 +45,7 @@ struct ex_value_s *new_vector_val (const float *vector_val);
struct ex_value_s *new_entity_val (int entity_val);
struct ex_value_s *new_field_val (int field_val, struct type_s *type,
struct def_s *def);
struct ex_value_s *new_func_val (int func_val);
struct ex_value_s *new_func_val (int func_val, struct type_s *type);
struct ex_value_s *new_pointer_val (int val, struct type_s *type,
struct def_s *def);
struct ex_value_s *new_quaternion_val (const float *quaternion_val);

View file

@ -165,6 +165,8 @@ get_type (expr_t *e)
case ex_temp:
return e->e.temp.type;
case ex_value:
if (e->e.value->type == ev_func)
return e->e.value->v.func_val.type;
if (e->e.value->type == ev_pointer)
return pointer_type (e->e.value->v.pointer.type);
if (e->e.value->type == ev_field)
@ -552,11 +554,11 @@ new_field_expr (int field_val, type_t *type, def_t *def)
}
expr_t *
new_func_expr (int func_val)
new_func_expr (int func_val, type_t *type)
{
expr_t *e = new_expr ();
e->type = ex_value;
e->e.value = new_func_val (func_val);
e->e.value = new_func_val (func_val, type);
return e;
}

View file

@ -167,12 +167,13 @@ new_field_val (int field_val, type_t *type, def_t *def)
}
ex_value_t *
new_func_val (int func_val)
new_func_val (int func_val, type_t *type)
{
ex_value_t val;
memset (&val, 0, sizeof (val));
val.type = ev_func;
val.v.func_val = func_val;
val.v.func_val.val = func_val;
val.v.func_val.type = type;
return find_value (&val);
}
@ -236,6 +237,8 @@ new_nil_val (type_t *type)
val.type = low_level_type (type);
if (val.type == ev_pointer|| val.type == ev_field )
val.v.pointer.type = type->t.fldptr.type;
if (val.type == ev_func)
val.v.func_val.type = type;
return find_value (&val);
}
@ -501,7 +504,7 @@ emit_value (ex_value_t *value, def_t *def)
reloc_def_string (cn);
break;
case ev_func:
if (val.v.func_val) {
if (val.v.func_val.val) {
reloc_t *reloc;
reloc = new_reloc (cn->space, cn->offset, rel_def_func);
reloc->next = pr.relocs;