Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/ControlStruct/ExceptTranslate.cc

    r1abc5ab rad0be81  
    1010// Created On       : Wed Jun 14 16:49:00 2017
    1111// Last Modified By : Andrew Beach
    12 // Last Modified On : Thr Jun 29 15:18:00 2017
     12// Last Modified On : Fri Jun 30 13:30:00 2017
    1313// Update Count     : 1
    1414//
     
    2222#include "SynTree/Attribute.h"
    2323
    24 namespace ControlFlow {
     24namespace ControlStruct {
    2525
    2626        // This (large) section could probably be moved out of the class
     
    2929        // Type(Qualifiers &, false, std::list<Attribute *> &)
    3030
    31         // void (*function)()
    32         static FunctionType void_func_t(Type::Qualifiers(), false);
     31        // void (*function)();
     32        static FunctionType try_func_t(Type::Qualifiers(), false);
    3333        // void (*function)(int, exception);
    3434        static FunctionType catch_func_t(Type::Qualifiers(), false);
     
    3737        // bool (*function)(exception);
    3838        static FunctionType handle_func_t(Type::Qualifiers(), false);
     39        // void (*function)(__attribute__((unused)) void *);
     40        static FunctionType finally_func_t(Type::Qualifiers(), false);
    3941
    4042        static void init_func_types() {
     
    4850                        LinkageSpec::Cforall,
    4951                        /*bitfieldWidth*/ NULL,
    50                         new BasicType(emptyQualifiers, BasicType::UnsignedInt),
     52                        new BasicType( emptyQualifiers, BasicType::SignedInt ),
    5153                        /*init*/ NULL
    52                 );
     54                        );
    5355                ObjectDecl exception_obj(
    5456                        "__exception_inst",
     
    5658                        LinkageSpec::Cforall,
    5759                        /*bitfieldWidth*/ NULL,
    58                         new BasicType(emptyQualifiers, BasicType::UnsignedInt),
     60                        new PointerType(
     61                                emptyQualifiers,
     62                                new BasicType( emptyQualifiers, BasicType::SignedInt )
     63                                ),
    5964                        /*init*/ NULL
    60                 );
     65                        );
    6166                ObjectDecl bool_obj(
    6267                        "__ret_bool",
     
    6671                        new BasicType(emptyQualifiers, BasicType::Bool),
    6772                        /*init*/ NULL
    68                 );
    69 
    70                 catch_func_t.get_parameters().push_back(index_obj.clone());
    71                 catch_func_t.get_parameters().push_back(exception_obj.clone());
    72                 match_func_t.get_returnVals().push_back(index_obj.clone());
    73                 match_func_t.get_parameters().push_back(exception_obj.clone());
    74                 handle_func_t.get_returnVals().push_back(bool_obj.clone());
    75                 handle_func_t.get_parameters().push_back(exception_obj.clone());
     73                        );
     74                ObjectDecl voidptr_obj(
     75                        "__hook",
     76                        Type::StorageClasses(),
     77                        LinkageSpec::Cforall,
     78                        NULL,
     79                        new PointerType(
     80                                emptyQualifiers,
     81                                new VoidType(
     82                                        emptyQualifiers
     83                                        ),
     84                                std::list<Attribute *>{new Attribute("unused")}
     85                                ),
     86                        NULL
     87                        );
     88
     89                catch_func_t.get_parameters().push_back( index_obj.clone() );
     90                catch_func_t.get_parameters().push_back( exception_obj.clone() );
     91                match_func_t.get_returnVals().push_back( index_obj.clone() );
     92                match_func_t.get_parameters().push_back( exception_obj.clone() );
     93                handle_func_t.get_returnVals().push_back( bool_obj.clone() );
     94                handle_func_t.get_parameters().push_back( exception_obj.clone() );
     95                finally_func_t.get_parameters().push_back( voidptr_obj.clone() );
    7696
    7797                init_complete = true;
     
    114134        // ThrowStmt Mutation Helpers
    115135
    116         Statement * create_terminate_throw( ThrowStmt *throwStmt ) {
    117                 // __throw_terminate( EXPR );
    118                 UntypedExpr * call = new UntypedExpr( new NameExpr(
    119                         "__cfaehm__throw_termination" ) );
    120                 call->get_args().push_back( throwStmt->get_expr() );
    121                 Statement * result = new ExprStmt( throwStmt->get_labels(), call );
     136        Statement * create_given_throw(
     137                        const char * throwFunc, ThrowStmt * throwStmt ) {
     138                // { int NAME = EXPR; throwFunc( &NAME ); }
     139                CompoundStmt * result = new CompoundStmt( noLabels );
     140                ObjectDecl * local = new ObjectDecl(
     141                        "__local_exception_copy",
     142                        Type::StorageClasses(),
     143                        LinkageSpec::Cforall,
     144                        NULL,
     145                        new BasicType( emptyQualifiers, BasicType::SignedInt ),
     146                        new SingleInit( throwStmt->get_expr() )
     147                        );
     148                appendDeclStmt( result, local );
     149                UntypedExpr * call = new UntypedExpr( new NameExpr( throwFunc ) );
     150                call->get_args().push_back( new AddressExpr( nameOf( local ) ) );
     151                result->push_back( new ExprStmt( throwStmt->get_labels(), call ) );
    122152                throwStmt->set_expr( nullptr );
    123153                delete throwStmt;
    124154                return result;
     155        }
     156
     157        Statement * create_terminate_throw( ThrowStmt *throwStmt ) {
     158                // { int NAME = EXPR; __throw_terminate( &NAME ); }
     159                return create_given_throw( "__cfaehm__throw_termination", throwStmt );
    125160        }
    126161        Statement * create_terminate_rethrow( ThrowStmt *throwStmt ) {
     
    136171        Statement * create_resume_throw( ThrowStmt *throwStmt ) {
    137172                // __throw_resume( EXPR );
    138                 UntypedExpr * call = new UntypedExpr( new NameExpr(
    139                         "__cfaehm__throw_resumption" ) );
    140                 call->get_args().push_back( throwStmt->get_expr() );
    141                 Statement * result = new ExprStmt( throwStmt->get_labels(), call );
    142                 throwStmt->set_expr( nullptr );
    143                 delete throwStmt;
    144                 return result;
     173                return create_given_throw( "__cfaehm__throw_resumption", throwStmt );
    145174        }
    146175        Statement * create_resume_rethrow( ThrowStmt *throwStmt ) {
     
    164193
    165194                return new FunctionDecl( "try", Type::StorageClasses(),
    166                         LinkageSpec::Cforall, void_func_t.clone(), body );
     195                        LinkageSpec::Cforall, try_func_t.clone(), body );
    167196        }
    168197
     
    235264                        std::list<Expression *> args;
    236265                        args.push_back( number );
    237                         args.push_back( nameOf( except_obj ) );
     266
     267                        std::list<Expression *> rhs_args;
     268                        rhs_args.push_back( nameOf( except_obj ) );
     269                        Expression * rhs = new UntypedExpr(
     270                                new NameExpr( "*?" ), rhs_args );
     271                        args.push_back( rhs );
     272
    238273                        cond = new UntypedExpr( new NameExpr( "?==?" /*???*/), args );
    239274                }
     
    276311                        *it = nullptr;
    277312                }
     313
     314                body->push_back( new ReturnStmt( noLabels, new ConstantExpr(
     315                        Constant::from_int( 0 ) ) ) );
    278316
    279317                return new FunctionDecl("match", Type::StorageClasses(),
     
    316354                        }
    317355                        handling_code->push_back( new ReturnStmt( noLabels,
    318                                 new ConstantExpr( Constant::from_bool( false ) ) ) );
     356                                new ConstantExpr( Constant::from_bool( true ) ) ) );
    319357                        handler->set_body( handling_code );
    320358
     
    323361                        *it = nullptr;
    324362                }
     363
     364                body->push_back( new ReturnStmt( noLabels, new ConstantExpr(
     365                        Constant::from_bool( false ) ) ) );
    325366
    326367                return new FunctionDecl("handle", Type::StorageClasses(),
     
    364405                UntypedExpr *setup = new UntypedExpr( new NameExpr(
    365406                        "__cfaehm__try_resume_setup" ) );
    366                 setup->get_args().push_back( nameOf( obj ) );
     407                setup->get_args().push_back( new AddressExpr( nameOf( obj ) ) );
    367408                setup->get_args().push_back( nameOf( resume_handler ) );
    368409
     
    381422
    382423                return new FunctionDecl("finally", Type::StorageClasses(),
    383                         LinkageSpec::Cforall, void_func_t.clone(), body);
     424                        LinkageSpec::Cforall, finally_func_t.clone(), body);
    384425        }
    385426
Note: See TracChangeset for help on using the changeset viewer.