Changeset View
Changeset View
Standalone View
Standalone View
src/lib/eo/eo.c
Show First 20 Lines • Show All 813 Lines • ▼ Show 20 Line(s) | 812 | #endif | |||
---|---|---|---|---|---|
814 | if (!_vtable_func_set(vtable, klass, override_class, op, op_desc->func, EINA_TRUE)) | 814 | if (!_vtable_func_set(vtable, klass, override_class, op, op_desc->func, EINA_TRUE)) | ||
815 | return EINA_FALSE; | 815 | return EINA_FALSE; | ||
816 | } | 816 | } | ||
817 | 817 | | |||
818 | return EINA_TRUE; | 818 | return EINA_TRUE; | ||
819 | } | 819 | } | ||
820 | 820 | | |||
821 | EAPI Eina_Bool | 821 | EAPI Eina_Bool | ||
822 | efl_class_functions_set(const Efl_Class *klass_id, const Efl_Object_Ops *object_ops, const Efl_Object_Ops *class_ops, const Efl_Object_Property_Reflection_Ops *reflection_table) | 822 | efl_class_functions_set(const Efl_Class *klass_id, const Efl_Object_Ops *object_ops, const Efl_Object_Property_Reflection_Ops *reflection_table) | ||
823 | { | 823 | { | ||
824 | EO_CLASS_POINTER_GOTO(klass_id, klass, err_klass); | 824 | EO_CLASS_POINTER_GOTO(klass_id, klass, err_klass); | ||
825 | Efl_Object_Ops empty_ops = { 0 }; | 825 | Efl_Object_Ops empty_ops = { 0 }; | ||
826 | 826 | | |||
827 | // not likely so use goto to alleviate l1 instruction cache of rare code | 827 | // not likely so use goto to alleviate l1 instruction cache of rare code | ||
828 | if (klass->functions_set) goto err_funcs; | 828 | if (klass->functions_set) goto err_funcs; | ||
829 | klass->functions_set = EINA_TRUE; | 829 | klass->functions_set = EINA_TRUE; | ||
830 | 830 | | |||
831 | if (!object_ops) object_ops = &empty_ops; | 831 | if (!object_ops) object_ops = &empty_ops; | ||
832 | 832 | | |||
833 | if (!class_ops) class_ops = &empty_ops; | | |||
834 | | ||||
835 | klass->reflection = reflection_table; | 833 | klass->reflection = reflection_table; | ||
836 | 834 | | |||
837 | klass->ops_count = object_ops->count + class_ops->count; | 835 | klass->ops_count = object_ops->count; | ||
838 | 836 | | |||
839 | klass->base_id = _eo_ops_last_id; | 837 | klass->base_id = _eo_ops_last_id; | ||
840 | _eo_ops_last_id += klass->ops_count + 1; | 838 | _eo_ops_last_id += klass->ops_count + 1; | ||
841 | 839 | | |||
842 | _vtable_init(&klass->vtable, DICH_CHAIN1(_eo_ops_last_id) + 1); | 840 | _vtable_init(&klass->vtable, DICH_CHAIN1(_eo_ops_last_id) + 1); | ||
843 | 841 | | |||
844 | /* Flatten the function array */ | 842 | /* Flatten the function array */ | ||
845 | { | 843 | { | ||
846 | const _Efl_Class **mro_itr = klass->mro; | 844 | const _Efl_Class **mro_itr = klass->mro; | ||
847 | for ( ; *mro_itr ; mro_itr++) ; | 845 | for ( ; *mro_itr ; mro_itr++) ; | ||
848 | 846 | | |||
849 | /* Skip ourselves. */ | 847 | /* Skip ourselves. */ | ||
850 | for ( mro_itr-- ; mro_itr > klass->mro ; mro_itr--) | 848 | for ( mro_itr-- ; mro_itr > klass->mro ; mro_itr--) | ||
851 | _vtable_copy_all(&klass->vtable, &(*mro_itr)->vtable); | 849 | _vtable_copy_all(&klass->vtable, &(*mro_itr)->vtable); | ||
852 | } | 850 | } | ||
853 | 851 | | |||
854 | return _eo_class_funcs_set(&klass->vtable, object_ops, klass, klass, 0, EINA_FALSE) && | 852 | return _eo_class_funcs_set(&klass->vtable, object_ops, klass, klass, 0, EINA_FALSE); | ||
855 | _eo_class_funcs_set(&klass->vtable, class_ops, klass, klass, object_ops->count, EINA_FALSE); | | |||
856 | 853 | | |||
857 | err_funcs: | 854 | err_funcs: | ||
858 | ERR("Class %s already had its functions set..", klass->desc->name); | 855 | ERR("Class %s already had its functions set..", klass->desc->name); | ||
859 | return EINA_FALSE; | 856 | return EINA_FALSE; | ||
860 | err_klass: | 857 | err_klass: | ||
861 | _EO_POINTER_ERR(klass_id, "Class (%p) is an invalid ref.", klass_id); | 858 | _EO_POINTER_ERR(klass_id, "Class (%p) is an invalid ref.", klass_id); | ||
862 | return EINA_FALSE; | 859 | return EINA_FALSE; | ||
863 | } | 860 | } | ||
▲ Show 20 Lines • Show All 824 Lines • ▼ Show 20 Line(s) | 1470 | { | |||
1688 | if (!_eo_class_initializer(klass)) | 1685 | if (!_eo_class_initializer(klass)) | ||
1689 | { | 1686 | { | ||
1690 | return NULL; | 1687 | return NULL; | ||
1691 | } | 1688 | } | ||
1692 | 1689 | | |||
1693 | /* If functions haven't been set, invoke it with an empty ops structure. */ | 1690 | /* If functions haven't been set, invoke it with an empty ops structure. */ | ||
1694 | if (!klass->functions_set) | 1691 | if (!klass->functions_set) | ||
1695 | { | 1692 | { | ||
1696 | efl_class_functions_set(_eo_class_id_get(klass), NULL, NULL, NULL); | 1693 | efl_class_functions_set(_eo_class_id_get(klass), NULL, NULL); | ||
1697 | } | 1694 | } | ||
1698 | 1695 | | |||
1699 | /* Mark which classes we implement */ | 1696 | /* Mark which classes we implement */ | ||
1700 | if (klass->vtable.size) | 1697 | if (klass->vtable.size) | ||
1701 | { | 1698 | { | ||
1702 | _eo_class_isa_recursive_set(klass, klass); | 1699 | _eo_class_isa_recursive_set(klass, klass); | ||
1703 | } | 1700 | } | ||
1704 | 1701 | | |||
▲ Show 20 Lines • Show All 1957 Lines • Show Last 20 Lines |