forked from enlightenment/efl
eo: only return NULL when the object is destructed.
There is a problem with the previous version. The object can still be alive due to the use of manual_free in evas. So you wouldn't be able for example to remove a callback from an object that hasn't been destroyed yet. If that callback is triggered by the destruction of the object, you would end up with an unexpected and impossible to prevent effect of access after free on a callback that you had removed. Not sure if that still solve the original problem that the code was trying to prevent in Ecore_Evas.
This commit is contained in:
parent
190af04983
commit
87acc90fc7
|
@ -2053,7 +2053,10 @@ efl_data_scope_safe_get(const Eo *obj_id, const Efl_Class *klass_id)
|
||||||
if (!obj_id) return NULL;
|
if (!obj_id) return NULL;
|
||||||
EO_OBJ_POINTER_RETURN_VAL(obj_id, obj, NULL);
|
EO_OBJ_POINTER_RETURN_VAL(obj_id, obj, NULL);
|
||||||
EO_CLASS_POINTER_GOTO(klass_id, klass, err_klass);
|
EO_CLASS_POINTER_GOTO(klass_id, klass, err_klass);
|
||||||
if (obj->user_refcount <= 0) goto err_klass;
|
if (obj->destructed)
|
||||||
|
{
|
||||||
|
goto err_klass;
|
||||||
|
}
|
||||||
|
|
||||||
if (_eo_class_mro_has(obj->klass, klass))
|
if (_eo_class_mro_has(obj->klass, klass))
|
||||||
ret = _efl_data_scope_safe_get(obj, klass);
|
ret = _efl_data_scope_safe_get(obj, klass);
|
||||||
|
|
Loading…
Reference in New Issue