jeyzu pushed a commit to branch master.
commit 5f83d1a80bf170afc577b2faf84fed2b55fbeda1
Author: Jérémy Zurcher <[email protected]>
Date: Mon Jun 17 23:41:45 2013 +0200
eo_class_new: check parent and desc before doing anything
---
src/lib/eo/eo.c | 83 +++++++++++++++++++++++++++------------------------------
1 file changed, 39 insertions(+), 44 deletions(-)
diff --git a/src/lib/eo/eo.c b/src/lib/eo/eo.c
index 3a317f1..d7c02f7 100644
--- a/src/lib/eo/eo.c
+++ b/src/lib/eo/eo.c
@@ -783,9 +783,8 @@ eo_class_free(_Eo_Class *klass)
/* DEVCHECK */
static Eina_Bool
-_eo_class_check_op_descs(const _Eo_Class *klass)
+_eo_class_check_op_descs(const Eo_Class_Description *desc)
{
- const Eo_Class_Description *desc = klass->desc;
const Eo_Op_Description *itr;
size_t i;
@@ -857,12 +856,44 @@ eo_class_new(const Eo_Class_Description *desc, const
Eo_Class *parent_id, ...)
EINA_SAFETY_ON_NULL_RETURN_VAL(desc, NULL);
EINA_SAFETY_ON_NULL_RETURN_VAL(desc->name, NULL);
+ if (!_eo_class_check_op_descs(desc))
+ return NULL;
+
/* Check restrictions on Interface types. */
if (desc->type == EO_CLASS_TYPE_INTERFACE)
{
EINA_SAFETY_ON_FALSE_RETURN_VAL(!desc->data_size, NULL);
}
+ /* Check parent */
+ if (parent)
+ {
+ /* Verify the inheritance is allowed. */
+ switch (desc->type)
+ {
+ case EO_CLASS_TYPE_REGULAR:
+ case EO_CLASS_TYPE_REGULAR_NO_INSTANT:
+ if ((parent->desc->type != EO_CLASS_TYPE_REGULAR) &&
+ (parent->desc->type != EO_CLASS_TYPE_REGULAR_NO_INSTANT))
+ {
+ ERR("Regular classes ('%s') aren't allowed to inherit from
non-regular classes ('%s').",
+ desc->name, parent->desc->name);
+ return NULL;
+ }
+ break;
+ case EO_CLASS_TYPE_INTERFACE:
+ case EO_CLASS_TYPE_MIXIN:
+ if ((parent->desc->type != EO_CLASS_TYPE_INTERFACE) &&
+ (parent->desc->type != EO_CLASS_TYPE_MIXIN))
+ {
+ ERR("Non-regular classes ('%s') aren't allowed to inherit
from regular classes ('%s').",
+ desc->name, parent->desc->name);
+ return NULL;
+ }
+ break;
+ }
+ }
+
/* Build class extensions list */
{
DBG("Started building extensions list for class '%s'", desc->name);
@@ -919,6 +950,12 @@ eo_class_new(const Eo_Class_Description *desc, const
Eo_Class *parent_id, ...)
klass->desc = desc;
klass->extensions = (const _Eo_Class **) ((char *) klass + _eo_class_sz);
klass->mro = (const _Eo_Class **) ((char *) klass->extensions + extn_sz);
+ if (klass->parent)
+ {
+ /* FIXME: Make sure this alignment is enough. */
+ klass->data_offset = klass->parent->data_offset +
+ EO_ALIGN_SIZE(klass->parent->desc->data_size);
+ }
mro = eina_list_remove(mro, NULL);
mro = eina_list_prepend(mro, klass);
@@ -949,44 +986,6 @@ eo_class_new(const Eo_Class_Description *desc, const
Eo_Class *parent_id, ...)
*(mro_itr) = NULL;
}
- /* Handle the inheritance */
- if (klass->parent)
- {
- /* Verify the inheritance is allowed. */
- switch (klass->desc->type)
- {
- case EO_CLASS_TYPE_REGULAR:
- case EO_CLASS_TYPE_REGULAR_NO_INSTANT:
- if ((klass->parent->desc->type != EO_CLASS_TYPE_REGULAR) &&
- (klass->parent->desc->type !=
EO_CLASS_TYPE_REGULAR_NO_INSTANT))
- {
- ERR("Regular classes ('%s') aren't allowed to inherit from
non-regular classes ('%s').", klass->desc->name, klass->parent->desc->name);
- goto cleanup;
- }
- break;
- case EO_CLASS_TYPE_INTERFACE:
- case EO_CLASS_TYPE_MIXIN:
- if ((klass->parent->desc->type != EO_CLASS_TYPE_INTERFACE) &&
- (klass->parent->desc->type != EO_CLASS_TYPE_MIXIN))
- {
- ERR("Non-regular classes ('%s') aren't allowed to inherit
from regular classes ('%s').", klass->desc->name, klass->parent->desc->name);
- goto cleanup;
- }
- break;
- }
-
-
- /* Update the current offset. */
- /* FIXME: Make sure this alignment is enough. */
- klass->data_offset = klass->parent->data_offset +
- EO_ALIGN_SIZE(klass->parent->desc->data_size);
- }
-
- if (!_eo_class_check_op_descs(klass))
- {
- goto cleanup;
- }
-
size_t extn_data_off = klass->data_offset +
EO_ALIGN_SIZE(klass->desc->data_size);
@@ -1097,10 +1096,6 @@ eo_class_new(const Eo_Class_Description *desc, const
Eo_Class *parent_id, ...)
}
return _eo_class_id_get(klass);
-
-cleanup:
- eo_class_free(klass);
- return NULL;
}
EAPI Eina_Bool
--
------------------------------------------------------------------------------
This SF.net email is sponsored by Windows:
Build for Windows Store.
http://p.sf.net/sfu/windows-dev2dev