summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBenjamin Otte <otte@gnome.org>2008-08-20 03:33:11 +0100
committerBenjamin Otte <otte@gnome.org>2008-08-20 03:33:11 +0100
commitaaef7960708f0a8ac0f6f0dd7cc276689a855c1c (patch)
tree41196937443d6f8965219f9b401a4d5f082a55c9
parent86b256c5408dffc36f25d760f814b3686df0bebf (diff)
move argument verification and coercion to swfdec_abc_function_call()
-rw-r--r--swfdec/swfdec_abc_function.c24
-rw-r--r--swfdec/swfdec_abc_method.c32
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);
}