summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBenjamin Otte <otte@gnome.org>2008-08-20 14:11:18 +0100
committerBenjamin Otte <otte@gnome.org>2008-08-20 14:11:18 +0100
commit5c6ac7c02f03ec5b2fc1f4ca38611dd5b83c09bf (patch)
tree9986ebfe9983395a6b6660bee727812dd1b3da30
parentc76c19b030fedee1095a08e7374f2ab2d0732849 (diff)
implement swfdec_abc_function_is_override()
-rw-r--r--swfdec/swfdec_abc_function.c29
1 files changed, 28 insertions, 1 deletions
diff --git a/swfdec/swfdec_abc_function.c b/swfdec/swfdec_abc_function.c
index 55d94980..12da46c2 100644
--- a/swfdec/swfdec_abc_function.c
+++ b/swfdec/swfdec_abc_function.c
@@ -181,12 +181,39 @@ swfdec_abc_function_verify (SwfdecAbcFunction *fun)
gboolean
swfdec_abc_function_is_override (SwfdecAbcFunction *fun, SwfdecAbcFunction *base)
{
+ guint i;
+
g_return_val_if_fail (SWFDEC_IS_ABC_FUNCTION (fun), FALSE);
g_return_val_if_fail (fun->resolved, FALSE);
g_return_val_if_fail (SWFDEC_IS_ABC_FUNCTION (base), FALSE);
g_return_val_if_fail (base->resolved, FALSE);
- SWFDEC_FIXME ("implement");
+ if (fun->return_traits != base->return_traits) {
+ SWFDEC_WARNING ("return types don't match: %s => %s",
+ base->return_traits->name, fun->return_traits->name);
+ return FALSE;
+ }
+
+ if (fun->n_args != base->n_args) {
+ SWFDEC_WARNING ("argument count doesn't match: %u => %u",
+ base->n_args, fun->n_args);
+ return FALSE;
+ }
+
+ if (!swfdec_abc_traits_is_traits (fun->args[0].traits, base->args[0].traits)) {
+ SWFDEC_WARNING ("this traits %s aren't subtraits of %s",
+ fun->args[0].traits->name, base->args[0].traits->name);
+ return FALSE;
+ }
+
+ for (i = 1; i <= fun->n_args; i++) {
+ if (fun->args[i].traits != base->args[i].traits) {
+ SWFDEC_WARNING ("traits for argument %u don't match: %s => %s",
+ i, base->args[i].traits->name, fun->args[i].traits->name);
+ return FALSE;
+ }
+ }
+
return TRUE;
}