Get message checking working properly.

This commit is contained in:
Bill Currie 2010-12-16 16:41:16 +09:00
parent 8bb507f220
commit eace5b3c81
2 changed files with 24 additions and 7 deletions

View file

@ -507,19 +507,23 @@ class_message_response (class_t *class, int class_msg, expr_t *sel)
while (c) { while (c) {
for (cat = c->categories; cat; cat = cat->next) { for (cat = c->categories; cat; cat = cat->next) {
for (m = cat->methods->head; m; m = m->next) { for (m = cat->methods->head; m; m = m->next) {
if (strcmp (selector->name, m->name) == 0) if (((!c->super_class && class_msg)
|| class_msg != m->instance)
&& strcmp (selector->name, m->name) == 0)
return m; return m;
} }
} }
for (m = c->methods->head; m; m = m->next) { for (m = c->methods->head; m; m = m->next) {
if (strcmp (selector->name, m->name) == 0) if (((!c->super_class && class_msg)
|| class_msg != m->instance)
&& strcmp (selector->name, m->name) == 0)
return m; return m;
} }
c = c->super_class; c = c->super_class;
} }
//FIXME right option? //FIXME right option?
if (options.warnings.interface_check) if (options.warnings.interface_check)
warning (sel, "%s does not respond to %c%s", class->name, warning (sel, "%s may not respond to %c%s", class->name,
class_msg ? '+' : '-', selector->name); class_msg ? '+' : '-', selector->name);
} }
return 0; return 0;

View file

@ -2774,7 +2774,7 @@ message_expr (expr_t *receiver, keywordarg_t *message)
expr_t *selector = selector_expr (message); expr_t *selector = selector_expr (message);
expr_t *call; expr_t *call;
keywordarg_t *m; keywordarg_t *m;
int super = 0, class_msg = 0; int self = 0, super = 0, class_msg = 0;
type_t *rec_type; type_t *rec_type;
class_t *class; class_t *class;
method_t *method; method_t *method;
@ -2793,8 +2793,12 @@ message_expr (expr_t *receiver, keywordarg_t *message)
class = current_class->c.category->class; class = current_class->c.category->class;
rec_type = class->type; rec_type = class->type;
} else { } else {
if (receiver->type == ex_name && get_class (receiver->e.string_val, 0)) if (receiver->type == ex_name) {
class_msg = 1; if (strcmp (receiver->e.string_val, "self") == 0)
self = 1;
if (get_class (receiver->e.string_val, 0))
class_msg = 1;
}
rec_type = get_type (receiver); rec_type = get_type (receiver);
if (receiver->type == ex_error) if (receiver->type == ex_error)
@ -2804,7 +2808,16 @@ message_expr (expr_t *receiver, keywordarg_t *message)
|| (rec_type->aux_type->type != ev_object || (rec_type->aux_type->type != ev_object
&& rec_type->aux_type->type != ev_class)) && rec_type->aux_type->type != ev_class))
return error (receiver, "not a class/object"); return error (receiver, "not a class/object");
class = rec_type->aux_type->s.class; if (self) {
if (current_class->is_class)
class = current_class->c.class;
else
class = current_class->c.category->class;
if (rec_type == &type_Class)
class_msg = 1;
} else {
class = rec_type->aux_type->s.class;
}
} }
method = class_message_response (class, class_msg, selector); method = class_message_response (class, class_msg, selector);