Changeset 2554f24 for src


Ignore:
Timestamp:
Dec 11, 2023, 1:05:50 PM (8 months ago)
Author:
Andrew Beach <ajbeach@…>
Branches:
master
Children:
dab9fb93
Parents:
81da3da4
Message:

Try terminate now does not call the catch function, now they have the same caller. This involved updating some platform dependent code which should be correct in all cases.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/ControlStruct/ExceptTranslate.cpp

    r81da3da4 r2554f24  
    482482                ast::FunctionDecl * terminate_catch,
    483483                ast::FunctionDecl * terminate_match ) {
    484         // { __cfaehm_try_terminate(`try`, `catch`, `match`); }
    485 
    486         ast::UntypedExpr * caller = new ast::UntypedExpr(loc, new ast::NameExpr(loc,
    487                 "__cfaehm_try_terminate" ) );
    488         caller->args.push_back( new ast::VariableExpr(loc, try_wrapper ) );
    489         caller->args.push_back( new ast::VariableExpr(loc, terminate_catch ) );
    490         caller->args.push_back( new ast::VariableExpr(loc, terminate_match ) );
    491 
    492         ast::CompoundStmt * callStmt = new ast::CompoundStmt(loc);
    493         callStmt->push_back( new ast::ExprStmt( loc, caller ) );
    494         return callStmt;
     484        // {
     485        //     int __handler_index = __cfaehm_try_terminate(`try`, `match`);
     486        //     if ( __handler_index ) {
     487        //         `catch`( __handler_index, __cfaehm_get_current_exception() );
     488        //     }
     489        // }
     490
     491        ast::ObjectDecl * index = new ast::ObjectDecl( loc, "__handler_index",
     492                new ast::BasicType( ast::BasicType::SignedInt ),
     493                new ast::SingleInit( loc,
     494                        new ast::UntypedExpr( loc,
     495                                new ast::NameExpr( loc, "__cfaehm_try_terminate" ),
     496                                {
     497                                        new ast::VariableExpr( loc, try_wrapper ),
     498                                        new ast::VariableExpr( loc, terminate_match ),
     499                                }
     500                        )
     501                )
     502        );
     503
     504        return new ast::CompoundStmt( loc, {
     505                new ast::DeclStmt( loc, index ),
     506                new ast::IfStmt( loc,
     507                        new ast::VariableExpr( loc, index ),
     508                        new ast::ExprStmt( loc,
     509                                new ast::UntypedExpr( loc,
     510                                        new ast::VariableExpr( loc, terminate_catch ),
     511                                        {
     512                                                new ast::VariableExpr( loc, index ),
     513                                                new ast::UntypedExpr( loc,
     514                                                        new ast::NameExpr( loc, "__cfaehm_get_current_exception" )
     515                                                ),
     516                                        }
     517                                )
     518                        )
     519                ),
     520        } );
    495521}
    496522
Note: See TracChangeset for help on using the changeset viewer.