On 29/07/13 16:04, Jérémy Zurcher wrote: > On Monday 29 July 2013 10:31, Lucas De Marchi wrote : >> On Sat, Jul 27, 2013 at 5:54 PM, Jérémy Zurcher <jer...@asynk.ch> wrote: >>> On Saturday 27 July 2013 11:10, Carsten Haitzler wrote : >>>> On Fri, 26 Jul 2013 14:57:28 -0300 Lucas De Marchi >>>> <lucas.demar...@profusion.mobi> said: >>>> >>>>> On Thu, Jul 25, 2013 at 8:54 PM, Carsten Haitzler <ras...@rasterman.com> >>>>> wrote: >>>>>> On Thu, 25 Jul 2013 14:58:30 -0300 Gustavo Sverzut Barbieri >>>>>> <barbi...@profusion.mobi> said: >>>>>> >>>>>>> On Thu, Jul 25, 2013 at 1:46 PM, Tom Hacohen <tom.haco...@samsung.com> >>>>>>> wrote: >>>>>>>> On 24/07/13 03:09, Carsten Haitzler (The Rasterman) wrote: >>>>>>>>> On Tue, 23 Jul 2013 18:22:02 +0200 Jérémy Zurcher <jer...@asynk.ch> >>>>>>>>> said: >>>>>>>>> >>>>>>>>>> just to clarify a few points: >>>>>>>>>> >>>>>>>>>> - I think the less macro we have in an eo class declaration the best, >>>>>>>>>> actually we have nothing but that extra first parameter called >>>>>>>>>> eo2_o, wich is either an obj_ptr (devs/tasn/eo2) or a call_ctx >>>>>>>>>> (devs/jeyzu/eo2) >>>>>>>>>> >>>>>>>>>> this should go away if we use a stack per thread in eo private >>>>>>>>>> code, >>>>>>>>>> so we end up with a clean >>>>>>>>>> EAPI float times(float f, float t); >>>>>>>>>> >>>>>>>>>> - since day 1 break is supported in eo2_do: >>>>>>>>>> #define eo2_do(obj_id, ...) >>>>>>>>>> do >>>>>>>>>> { >>>>>>>>>> obj_ptr_or_ctx = eo2_do_start(obj_id); >>>>>>>>>> if(!obj_ptr_or_ctx) break; >>>>>>>>>> do { __VA_ARGS__ ; } while (0); >>>>>>>>>> eo2_do_end(obj_ptr_or_ctx); >>>>>>>>>> } while (0) >>>>>>>>> >>>>>>>>> i'm worried about people doing return there. seriously - objid came in >>>>>>>>> becau se of experience that people using efl are in general >>>>>>>>> inexperienced programmers who don't take the time to do things right. >>>>>>>>> they do things quickly and take shortcuts, and they ignore warnings. >>>>>>>>> they'd rather patch out abort()s in efl code forcing them to fix their >>>>>>>>> bugs, than fix their bugs. i am fearful that they will stuff in >>>>>>>>> returns >>>>>>>>> quite happily and think it mostly works most of the time... and then >>>>>>>>> find subtle issues and waste our time finding them. >>>>>>>>> >>>>>>>>> how do we protect/stop returns (or goto's for that matter) within the >>>>>>>>> while block. i looked for some pragmas - can't find any to do this. >>>>>>>>> this would be a really useful compiler feature though (to maybe >>>>>>>>> disable >>>>>>>>> some constructs for a sequence of code). >>>>> >>>>> What you seem to be looking for is the cleanup attribute. >>>>> >>>>> #define eo2_do(obj_id, ...) >>>>> do >>>>> { >>>>> obj_ptr_or_ctx = eo2_do_start(obj_id); >>>>> if(!obj_ptr_or_ctx) break; >>>>> do >>>>> { >>>>> obj_ptr_or_ctx_type __attribute__((cleanup(eo2_do_end)) >>>>> dummy = obj_ptr_or_ctx; >>>>> __VA_ARGS__ ; >>>>> } while (0); >>>>> } while (0); >>>>> >>>>> >>>>> But then we need to take a look if the cleanup function will run when >>>>> the actual function returns, or when the second "do" runs out of >>>>> scope. This attribute is more commonly used to call free on the >>>>> variable, so it doesn't matter much.... but for us this would make a >>>>> difference if it involves locking. >>>>> >>>>> Then you just allow break and return, and the right thing will happen, >>>>> even in those cases. >>>> >>>> voila! that would do it (if it does work on return as well as break and any >>>> goto that jumps out of the while scope). if course it'd be dependant on >>>> compiler supporting it - if it doesnt, then we cleanup by hand as normal >>>> on a >>>> break and return/goto just create bugs. i'd be ok with that. need to add >>>> -fexceptions maybe too from a quick read. needs a little experimenting and >>>> some >>>> method of detection. looks like its single parameter only and i guess it is >>>> done variable by variable which is good enough for us. :) i wonder how new >>>> it >>>> is. hmm looks like gcc 3.3 - that means it's rather old by now. GOOD. i >>>> hope >>>> clang supports it too and.... it seems not. :( oh well. let's hope most >>>> devs >>>> still use gcc. :) >>>> >>> >>> nice one, >>> implemented and tested with gcc 4.8.1 and clang 3.3 >>> >>> http://git.enlightenment.org/core/efl.git/commit/?h=devs/tasn/eo2&id=275280c3e0fb74e01ffd682acfb69f6a2700dc40 >> >> Humn... taking what you committed: >> >> // 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__; \ >> >> you still need to stuff the __VA_ARGS__ into a do { } while (0). >> Otherwise you are calling eo2_do_end() when eo2_do_start() failed. > thanks a lot, I forgot about that ! > as cleanup is related to variable scope, __VA_ARGS__ is not part of the story, > just move _objid_ down to fix, checked with clang and gcc > http://git.enlightenment.org/core/efl.git/commit/?h=devs/tasn/eo2&id=a4818d13150114ed0909014c658996be07cf272a
It's better to create a new scope. What Lucas meant is that you need to put the __VA_ARGS__ in a sub-scope and then move the variable creation in the same scope, shuffling things around. I'm committing what he meant which I also find cleaner. I think that what you do is something that might break in a future version and something that is probably not promised in this extension's documentation. -- Tom. ------------------------------------------------------------------------------ See everything from the browser to the database with AppDynamics Get end-to-end visibility with application monitoring from AppDynamics Isolate bottlenecks and diagnose root cause in seconds. Start your free trial of AppDynamics Pro today! http://pubads.g.doubleclick.net/gampad/clk?id=48808831&iu=/4140/ostg.clktrk _______________________________________________ enlightenment-devel mailing list enlightenment-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/enlightenment-devel