This patch looks fine to me. Please go ahead and check it in.
2010/9/10 Yiran Wang <yiran.w...@gmail.com>
> Hi All,
>
> Could some gatekeeper please review this change?
>
> The issue is as following:
>
> For a goto to outer block, the cleanup of local objects are needed. While, for
> call of destructor for each of them, the call is nested in a eh-region, as the
> destructor itself may throw exceptions. As we can see, the cleanup of such an
> eh-region, destructor of all remaining objects should be called. While,
> currently, open64 compiler would call destructor for all local objects,
> including the one being destructed.
> The case for an early exit is similar.
>
> The following is a test case to reproduce the issue.
>
> #include<iostream>
> class c1{
> int i;
> public:
> c1(int j):i(j){};
> ~c1(){
> std::cout<<"destructing "<<i<<"\n";
> if (i ==2 ) throw i;
> }
> };
>
> int main()
> {
> try{
> c1 o1(1);
> {
> c1 o2(2);
> goto s1;
> }
> }catch(int i){
>
> }
> s1:
> try{
> c1 o1(1);
> {
> c1 o2(2);
> return 1;
> }
> }catch(int i){
>
> }
> return 0;
> }
>
>
> The fix is to temporarily modify the cleanup stack pointer, say, lower it for
> each clean-up being issued, and then restore the state. It should be safe as
> no new scope or objects would be introduced during this process.
>
> Best Regards,
> yiran
>
>
> Index: wgen_stmt.cxx
> ===================================================================
> --- wgen_stmt.cxx (revision 3338)
> +++ wgen_stmt.cxx (working copy)
> @@ -2133,13 +2133,17 @@
> if (*li != *ci) break;
> if (ci!=Current_scope_nest.rend())
> {
> + int scope_cleanup_i_save;
> + scope_cleanup_i_save = scope_cleanup_i;
> i = scope_cleanup_i;
> Is_True(i != -1, ("WGEN_Expand_Goto: scope_cleanup_stack empty"));
> while ((i >= 0) && (scope_cleanup_stack [i].stmt != *ci))
> {
> + scope_cleanup_i --;
> Maybe_Emit_Cleanup (i, FALSE);
> --i;
> }
> + scope_cleanup_i = scope_cleanup_i_save;
> if (i == -1)
> {
> #ifdef FE_GNU_4_2_0
> @@ -2291,8 +2295,10 @@
> #endif
>
> int i = scope_cleanup_i;
> + int scope_cleanup_i_save = scope_cleanup_i;
> while (i != -1) {
> #ifdef KEY
> + scope_cleanup_i--;
> Maybe_Emit_Cleanup (i, FALSE);
> #else
> if (gs_tree_code(scope_cleanup_stack [i].stmt) == GS_CLEANUP_STMT)
> @@ -2301,6 +2307,7 @@
> --i;
> }
> #ifdef KEY
> + scope_cleanup_i = scope_cleanup_i_save;
> if (emit_exceptions && processing_handler) {
> HANDLER_INFO hi = handler_stack.top();
> FmtAssert (hi.scope, ("NULL scope"));
> @@ -2397,8 +2404,10 @@
> #endif
>
> int i = scope_cleanup_i;
> + int scope_cleanup_i_save = scope_cleanup_i;
> while (i != -1) {
> #ifdef KEY
> + scope_cleanup_i--;
> Maybe_Emit_Cleanup (i, FALSE);
> #else
> if (gs_tree_code(scope_cleanup_stack [i].stmt) == GS_CLEANUP_STMT)
> @@ -2407,6 +2416,7 @@
> --i;
> }
> #ifdef KEY
> + scope_cleanup_i = scope_cleanup_i_save;
> if (emit_exceptions && processing_handler) {
> HANDLER_INFO hi = handler_stack.top();
> FmtAssert (hi.scope, ("NULL scope"));
>
>
>
> ------------------------------------------------------------------------------
> Start uncovering the many advantages of virtual appliances
> and start using them to simplify application deployment and
> accelerate your shift to cloud computing
> http://p.sf.net/sfu/novell-sfdev2dev
>
> _______________________________________________
> Open64-devel mailing list
> Open64-devel@lists.sourceforge.net
> https://lists.sourceforge.net/lists/listinfo/open64-devel
>
>
--
Regards,
Lai Jian-Xin
------------------------------------------------------------------------------
Nokia and AT&T present the 2010 Calling All Innovators-North America contest
Create new apps & games for the Nokia N8 for consumers in U.S. and Canada
$10 million total in prizes - $4M cash, 500 devices, nearly $6M in marketing
Develop with Nokia Qt SDK, Web Runtime, or Java and Publish to Ovi Store
http://p.sf.net/sfu/nokia-dev2dev
_______________________________________________
Open64-devel mailing list
Open64-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/open64-devel