Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/ControlStruct/ExceptTranslate.cc

    rad0be81 r1abc5ab  
    1010// Created On       : Wed Jun 14 16:49:00 2017
    1111// Last Modified By : Andrew Beach
    12 // Last Modified On : Fri Jun 30 13:30:00 2017
     12// Last Modified On : Thr Jun 29 15:18:00 2017
    1313// Update Count     : 1
    1414//
     
    2222#include "SynTree/Attribute.h"
    2323
    24 namespace ControlStruct {
     24namespace ControlFlow {
    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 try_func_t(Type::Qualifiers(), false);
     31        // void (*function)()
     32        static FunctionType void_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);
    4139
    4240        static void init_func_types() {
     
    5048                        LinkageSpec::Cforall,
    5149                        /*bitfieldWidth*/ NULL,
    52                         new BasicType( emptyQualifiers, BasicType::SignedInt ),
     50                        new BasicType(emptyQualifiers, BasicType::UnsignedInt),
    5351                        /*init*/ NULL
    54                         );
     52                );
    5553                ObjectDecl exception_obj(
    5654                        "__exception_inst",
     
    5856                        LinkageSpec::Cforall,
    5957                        /*bitfieldWidth*/ NULL,
    60                         new PointerType(
    61                                 emptyQualifiers,
    62                                 new BasicType( emptyQualifiers, BasicType::SignedInt )
    63                                 ),
     58                        new BasicType(emptyQualifiers, BasicType::UnsignedInt),
    6459                        /*init*/ NULL
    65                         );
     60                );
    6661                ObjectDecl bool_obj(
    6762                        "__ret_bool",
     
    7166                        new BasicType(emptyQualifiers, BasicType::Bool),
    7267                        /*init*/ NULL
    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() );
     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());
    9676
    9777                init_complete = true;
     
    134114        // ThrowStmt Mutation Helpers
    135115
    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 ) );
     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 );
    152122                throwStmt->set_expr( nullptr );
    153123                delete throwStmt;
    154124                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 );
    160125        }
    161126        Statement * create_terminate_rethrow( ThrowStmt *throwStmt ) {
     
    171136        Statement * create_resume_throw( ThrowStmt *throwStmt ) {
    172137                // __throw_resume( EXPR );
    173                 return create_given_throw( "__cfaehm__throw_resumption", throwStmt );
     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;
    174145        }
    175146        Statement * create_resume_rethrow( ThrowStmt *throwStmt ) {
     
    193164
    194165                return new FunctionDecl( "try", Type::StorageClasses(),
    195                         LinkageSpec::Cforall, try_func_t.clone(), body );
     166                        LinkageSpec::Cforall, void_func_t.clone(), body );
    196167        }
    197168
     
    264235                        std::list<Expression *> args;
    265236                        args.push_back( number );
    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 
     237                        args.push_back( nameOf( except_obj ) );
    273238                        cond = new UntypedExpr( new NameExpr( "?==?" /*???*/), args );
    274239                }
     
    311276                        *it = nullptr;
    312277                }
    313 
    314                 body->push_back( new ReturnStmt( noLabels, new ConstantExpr(
    315                         Constant::from_int( 0 ) ) ) );
    316278
    317279                return new FunctionDecl("match", Type::StorageClasses(),
     
    354316                        }
    355317                        handling_code->push_back( new ReturnStmt( noLabels,
    356                                 new ConstantExpr( Constant::from_bool( true ) ) ) );
     318                                new ConstantExpr( Constant::from_bool( false ) ) ) );
    357319                        handler->set_body( handling_code );
    358320
     
    361323                        *it = nullptr;
    362324                }
    363 
    364                 body->push_back( new ReturnStmt( noLabels, new ConstantExpr(
    365                         Constant::from_bool( false ) ) ) );
    366325
    367326                return new FunctionDecl("handle", Type::StorageClasses(),
     
    405364                UntypedExpr *setup = new UntypedExpr( new NameExpr(
    406365                        "__cfaehm__try_resume_setup" ) );
    407                 setup->get_args().push_back( new AddressExpr( nameOf( obj ) ) );
     366                setup->get_args().push_back( nameOf( obj ) );
    408367                setup->get_args().push_back( nameOf( resume_handler ) );
    409368
     
    422381
    423382                return new FunctionDecl("finally", Type::StorageClasses(),
    424                         LinkageSpec::Cforall, finally_func_t.clone(), body);
     383                        LinkageSpec::Cforall, void_func_t.clone(), body);
    425384        }
    426385
Note: See TracChangeset for help on using the changeset viewer.