diff options
author | Benjamin Otte <otte@gnome.org> | 2008-08-20 03:33:11 +0100 |
---|---|---|
committer | Benjamin Otte <otte@gnome.org> | 2008-08-20 03:33:11 +0100 |
commit | aaef7960708f0a8ac0f6f0dd7cc276689a855c1c (patch) | |
tree | 41196937443d6f8965219f9b401a4d5f082a55c9 | |
parent | 86b256c5408dffc36f25d760f814b3686df0bebf (diff) |
move argument verification and coercion to swfdec_abc_function_call()
-rw-r--r-- | swfdec/swfdec_abc_function.c | 24 | ||||
-rw-r--r-- | swfdec/swfdec_abc_method.c | 32 |
2 files changed, 24 insertions, 32 deletions
diff --git a/swfdec/swfdec_abc_function.c b/swfdec/swfdec_abc_function.c index 7b284e46..3df99c13 100644 --- a/swfdec/swfdec_abc_function.c +++ b/swfdec/swfdec_abc_function.c @@ -186,15 +186,37 @@ swfdec_abc_function_call (SwfdecAbcFunction *fun, SwfdecAbcScopeChain *scope, { SwfdecAsFrame frame = { NULL, }; SwfdecAsContext *context; + guint i; g_return_val_if_fail (SWFDEC_IS_ABC_FUNCTION (fun), FALSE); g_return_val_if_fail (argv != NULL, FALSE); g_return_val_if_fail (ret != NULL, FALSE); + context = swfdec_gc_object_get_context (fun); + + if (argc < fun->min_args || (argc > fun->n_args && + !fun->need_arguments && ! fun->need_rest)) { + swfdec_as_context_throw_abc (context, SWFDEC_ABC_TYPE_ARGUMENT_ERROR, + "Argument count mismatch on %s. Expected %u, got %u.", + fun->name ? fun->name : "[unnamed]", fun->n_args, fun->min_args); + return FALSE; + } + + if (!swfdec_abc_function_resolve (fun)) + return FALSE; + + for (i = 0; i < MIN (argc, fun->n_args); i++) { + if (!swfdec_abc_traits_coerce (fun->args[i].traits, &argv[i + 1])) { + swfdec_as_context_throw_abc (context, SWFDEC_ABC_TYPE_TYPE_ERROR, + "Type Coercion failed: cannot convert %s to %s.", + swfdec_as_value_get_type_name (&argv[i + 1]), fun->args[i].traits->name); + return FALSE; + } + } + if (!swfdec_abc_function_verify (fun)) return FALSE; - context = swfdec_gc_object_get_context (fun); swfdec_as_frame_init_native (&frame, context); /* HACK! */ frame.function = (SwfdecAsFunction *) fun; diff --git a/swfdec/swfdec_abc_method.c b/swfdec/swfdec_abc_method.c index 00d93c98..e679e144 100644 --- a/swfdec/swfdec_abc_method.c +++ b/swfdec/swfdec_abc_method.c @@ -90,40 +90,10 @@ void swfdec_abc_method_call (SwfdecAbcMethod *method, guint argc, SwfdecAsValue *argv, SwfdecAsValue *ret) { - SwfdecAsContext *context; - SwfdecAbcFunction *fun; - guint i; - g_return_if_fail (SWFDEC_IS_ABC_METHOD (method)); g_return_if_fail (argv != NULL); g_return_if_fail (ret != NULL); - fun = method->function; - context = swfdec_gc_object_get_context (method); - SWFDEC_AS_VALUE_SET_UNDEFINED (ret); - if (argc < fun->min_args || (argc > fun->n_args && - !fun->need_arguments && ! fun->need_rest)) { - swfdec_as_context_throw_abc (context, SWFDEC_ABC_TYPE_ARGUMENT_ERROR, - "Argument count mismatch on %s. Expected %u, got %u.", - fun->name ? fun->name : "[unnamed]", fun->n_args, fun->min_args); - return; - } - - if (!swfdec_abc_function_resolve (fun)) - return; - - for (i = 0; i < argc; i++) { - if (!swfdec_abc_traits_coerce (fun->args[i].traits, &argv[i])) { - swfdec_as_context_throw_abc (context, SWFDEC_ABC_TYPE_TYPE_ERROR, - "Type Coercion failed: cannot convert %s to %s.", - swfdec_as_value_get_type_name (&argv[i]), fun->args[i].traits->name); - return; - } - } - - if (!swfdec_abc_function_verify (fun)) - return; - - swfdec_abc_function_call (fun, method->scope, argc, argv, ret); + swfdec_abc_function_call (method->function, method->scope, argc, argv, ret); } |