From fc5eaf662d027ddec57605fed0c554ca55dd6736 Mon Sep 17 00:00:00 2001 From: Tom Hacohen Date: Mon, 23 Jul 2012 08:43:35 +0000 Subject: [PATCH] Eo: Fixed bug with calling multiple ops in some cases. SVN revision: 74313 --- legacy/eobj/src/lib/eo.c | 11 ++-- legacy/eobj/src/tests/eo_suite/eo_test_general.c | 75 ++++++++++++++++++++++++ legacy/eobj/src/tests/function_overrides/main.c | 3 +- 3 files changed, 83 insertions(+), 6 deletions(-) diff --git a/legacy/eobj/src/lib/eo.c b/legacy/eobj/src/lib/eo.c index 3d0f498..2dc7a2e 100644 --- a/legacy/eobj/src/lib/eo.c +++ b/legacy/eobj/src/lib/eo.c @@ -375,20 +375,22 @@ eo_do_internal(Eo *obj, Eo_Op_Type op_type, ...) prev_error = obj->do_error; _eo_ref(obj); - _eo_kls_itr_init(obj->klass, &obj->mro_itr, &prev_state); va_start(p_list, op_type); op = va_arg(p_list, Eo_Op); while (op) { + _eo_kls_itr_init(obj->klass, &obj->mro_itr, &prev_state); if (!_eo_op_internal(obj, op_type, op, &p_list)) { _EO_OP_ERR_NO_OP_PRINT(op, obj->klass); ret = EINA_FALSE; + _eo_kls_itr_end(&obj->mro_itr, &prev_state); break; } op = va_arg(p_list, Eo_Op); + _eo_kls_itr_end(&obj->mro_itr, &prev_state); } va_end(p_list); @@ -400,7 +402,6 @@ eo_do_internal(Eo *obj, Eo_Op_Type op_type, ...) obj->do_error = prev_error; - _eo_kls_itr_end(&obj->mro_itr, &prev_state); return ret; } @@ -470,25 +471,25 @@ eo_class_do_internal(const Eo_Class *klass, ...) EO_MAGIC_RETURN_VAL(klass, EO_CLASS_EINA_MAGIC, EINA_FALSE); - _eo_kls_itr_init(klass, &((Eo_Class *) klass)->mro_itr, &prev_state); - va_start(p_list, klass); op = va_arg(p_list, Eo_Op); while (op) { + _eo_kls_itr_init(klass, &((Eo_Class *) klass)->mro_itr, &prev_state); if (!_eo_class_op_internal((Eo_Class *) klass, op, &p_list)) { _EO_OP_ERR_NO_OP_PRINT(op, klass); ret = EINA_FALSE; + _eo_kls_itr_end(&((Eo_Class *) klass)->mro_itr, &prev_state); break; } + _eo_kls_itr_end(&((Eo_Class *) klass)->mro_itr, &prev_state); op = va_arg(p_list, Eo_Op); } va_end(p_list); - _eo_kls_itr_end(&((Eo_Class *) klass)->mro_itr, &prev_state); return ret; } diff --git a/legacy/eobj/src/tests/eo_suite/eo_test_general.c b/legacy/eobj/src/tests/eo_suite/eo_test_general.c index 0624f61..f6d872f 100644 --- a/legacy/eobj/src/tests/eo_suite/eo_test_general.c +++ b/legacy/eobj/src/tests/eo_suite/eo_test_general.c @@ -654,6 +654,80 @@ START_TEST(eo_magic_checks) } END_TEST +/* MULTI */ +static Eo_Op MULTI_BASE_ID; +#define MULTI_ID(sub_id) (MULTI_BASE_ID + sub_id) +#define multi_a_print() MULTI_ID(MULTI_SUB_ID_A_PRINT) +#define multi_class_hi_print() MULTI_ID(MULTI_SUB_ID_CLASS_HI_PRINT) + +static void +_a_print(Eo *obj EINA_UNUSED, void *class_data EINA_UNUSED, va_list *list EINA_UNUSED) +{ + printf("Hey\n"); +} + +static void +_class_hi_print(const Eo_Class *klass EINA_UNUSED, va_list *list EINA_UNUSED) +{ + printf("Hi\n"); +} + +enum { + MULTI_SUB_ID_A_PRINT, + MULTI_SUB_ID_CLASS_HI_PRINT, + MULTI_SUB_ID_LAST +}; + +static void +_eo_multiple_do_class_constructor(Eo_Class *klass) +{ + const Eo_Op_Func_Description func_desc[] = { + EO_OP_FUNC(MULTI_ID(MULTI_SUB_ID_A_PRINT), _a_print), + EO_OP_FUNC_CLASS(MULTI_ID(MULTI_SUB_ID_CLASS_HI_PRINT), _class_hi_print), + EO_OP_FUNC_SENTINEL + }; + + eo_class_funcs_set(klass, func_desc); +} + +static const Eo_Op_Description _eo_multiple_do_op_desc[] = { + EO_OP_DESCRIPTION(MULTI_SUB_ID_A_PRINT, "Print property A"), + EO_OP_DESCRIPTION_CLASS(MULTI_SUB_ID_CLASS_HI_PRINT, "Print Hi"), + EO_OP_DESCRIPTION_SENTINEL +}; + + +START_TEST(eo_multiple_do) +{ + eo_init(); + + /* Usually should be const, not const only for the test... */ + static Eo_Class_Description class_desc = { + EO_VERSION, + "Inherit", + EO_CLASS_TYPE_REGULAR, + EO_CLASS_DESCRIPTION_OPS(&MULTI_BASE_ID, _eo_multiple_do_op_desc, MULTI_SUB_ID_LAST), + NULL, + 0, + _eo_multiple_do_class_constructor, + NULL + }; + + const Eo_Class *klass = eo_class_new(&class_desc, 0, SIMPLE_CLASS, NULL); + fail_if(!klass); + + Eo *obj = eo_add(klass, NULL); + fail_if(!obj); + + fail_if(!eo_do(obj, simple_a_print(), multi_a_print(), multi_a_print())); + fail_if(!eo_class_do(klass, simple_class_hi_print(), multi_class_hi_print(), multi_class_hi_print())); + + eo_unref(obj); + + eo_shutdown(); +} +END_TEST + void eo_test_general(TCase *tc) { tcase_add_test(tc, eo_generic_data); @@ -667,4 +741,5 @@ void eo_test_general(TCase *tc) tcase_add_test(tc, eo_static_classes); tcase_add_test(tc, eo_composite_tests); tcase_add_test(tc, eo_isa_tests); + tcase_add_test(tc, eo_multiple_do); } diff --git a/legacy/eobj/src/tests/function_overrides/main.c b/legacy/eobj/src/tests/function_overrides/main.c index 7e9d2e1..af39c67 100644 --- a/legacy/eobj/src/tests/function_overrides/main.c +++ b/legacy/eobj/src/tests/function_overrides/main.c @@ -30,7 +30,8 @@ main(int argc, char *argv[]) eo_unref(obj); obj = eo_add(INHERIT2_CLASS, NULL); - eo_do(obj, inherit2_print()); + fail_if(!eo_do(obj, inherit2_print())); + fail_if(!eo_do(obj, inherit2_print(), inherit2_print())); eo_unref(obj); obj = eo_add(SIMPLE_CLASS, NULL); -- 2.7.4