eo2: eo2_do() uses __attribute__ cleanup
authorJérémy Zurcher <jeremy@asynk.ch>
Wed, 25 Dec 2013 15:22:42 +0000 (16:22 +0100)
committerTom Hacohen <tom@stosb.com>
Thu, 10 Apr 2014 03:20:16 +0000 (04:20 +0100)
to protect us against bad use of break, goto, return ... in eo2_do,
we use __attribute__((cleanup(eo2_do_end))) to ensure that eo2_do_end()
is called whatever.

src/lib/eo/Eo.h
src/lib/eo/eo.c

index ea3709f1712787ce6ec83c5fdf282d47118368b7..49b51792e95e3c4025650e8d2ca5709c15ddeb42 100644 (file)
@@ -678,28 +678,28 @@ EAPI Eina_Bool eo2_call_resolve_internal(const Eo_Class *klass, Eo_Op op, Eo2_Op
 EAPI Eina_Bool eo2_do_start(Eo *obj_id, Eina_Bool do_super);
 
 // end of the eo2_do barrier, unref the obj, move the stack pointer
-EAPI void eo2_do_end();
+EAPI void eo2_do_end(Eo **ojb);
 
 EAPI int eo2_call_stack_depth();
 
+#define EO2_DO_CLEANUP __attribute__((cleanup(eo2_do_end)))
+
 // eo object method calls batch,
 // DO NOT use return statement in it, use break if necessary
 #define eo2_do(objid, ...)                            \
   do                                                  \
     {                                                 \
-       Eo *_objid_ = objid;                           \
+       Eo *_objid_ EO2_DO_CLEANUP = objid;            \
        if (!eo2_do_start(_objid_, EINA_FALSE)) break; \
-       do { __VA_ARGS__ ; } while (0);                \
-       eo2_do_end();                                  \
+       __VA_ARGS__;                                   \
     } while (0)
 
 #define eo2_do_super(objid, ...)                      \
   do                                                  \
     {                                                 \
-       Eo *_objid_ = objid;                           \
+       Eo *_objid_ EO2_DO_CLEANUP = objid;            \
        if (!eo2_do_start(_objid_, EINA_TRUE)) break;  \
-       do { __VA_ARGS__ ; } while (0);                \
-       eo2_do_end();                                  \
+       __VA_ARGS__;                                   \
     } while (0)
 
 // FIXME
index bdb51059f8197c04a8b03602cc28bb87490f10ed..c18f8a31eb32cd3f43bf0c5c00525b66a0d0f7ea 100644 (file)
@@ -354,7 +354,7 @@ eo2_do_start(Eo *obj_id, Eina_Bool do_super)
 }
 
 EAPI void
-eo2_do_end()
+eo2_do_end(Eo **objid EINA_UNUSED)
 {
    Eo2_Stack_Frame *fptr;