Ignore:
Timestamp:
Apr 10, 2018, 2:43:50 PM (6 years ago)
Author:
Aaron Moss <a3moss@…>
Branches:
new-env, with_gc
Children:
9f2012f
Parents:
dbc2c2c
Message:

Fix some GC bugs

File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/ControlStruct/ExceptTranslate.cc

    rdbc2c2c rbfc7811  
    104104                // Types used in translation, make sure to use clone.
    105105                // void (*function)();
    106                 FunctionType try_func_t;
     106                FunctionType * try_func_t;
    107107                // void (*function)(int, exception);
    108                 FunctionType catch_func_t;
     108                FunctionType * catch_func_t;
    109109                // int (*function)(exception);
    110                 FunctionType match_func_t;
     110                FunctionType * match_func_t;
    111111                // bool (*function)(exception);
    112                 FunctionType handle_func_t;
     112                FunctionType * handle_func_t;
    113113                // void (*function)(__attribute__((unused)) void *);
    114                 FunctionType finally_func_t;
     114                FunctionType * finally_func_t;
    115115
    116116                StructInstType * create_except_type() {
     
    125125                        handler_except_decl( nullptr ),
    126126                        except_decl( nullptr ), node_decl( nullptr ), hook_decl( nullptr ),
    127                         try_func_t( noQualifiers, false ),
    128                         catch_func_t( noQualifiers, false ),
    129                         match_func_t( noQualifiers, false ),
    130                         handle_func_t( noQualifiers, false ),
    131                         finally_func_t( noQualifiers, false )
     127                        try_func_t( new FunctionType(noQualifiers, false) ),
     128                        catch_func_t( new FunctionType(noQualifiers, false) ),
     129                        match_func_t( new FunctionType(noQualifiers, false) ),
     130                        handle_func_t( new FunctionType(noQualifiers, false) ),
     131                        finally_func_t( new FunctionType(noQualifiers, false) )
    132132                {}
    133133
     
    141141                assert( except_decl );
    142142
    143                 ObjectDecl index_obj(
     143                auto index_obj = new ObjectDecl(
    144144                        "__handler_index",
    145145                        Type::StorageClasses(),
     
    149149                        /*init*/ NULL
    150150                        );
    151                 ObjectDecl exception_obj(
     151                auto exception_obj = new ObjectDecl(
    152152                        "__exception_inst",
    153153                        Type::StorageClasses(),
     
    160160                        /*init*/ NULL
    161161                        );
    162                 ObjectDecl bool_obj(
     162                auto bool_obj = new ObjectDecl(
    163163                        "__ret_bool",
    164164                        Type::StorageClasses(),
     
    169169                        std::list<Attribute *>{ new Attribute( "unused" ) }
    170170                        );
    171                 ObjectDecl voidptr_obj(
     171                auto voidptr_obj = new ObjectDecl(
    172172                        "__hook",
    173173                        Type::StorageClasses(),
     
    184184                        );
    185185
    186                 ObjectDecl * unused_index_obj = index_obj.clone();
     186                ObjectDecl * unused_index_obj = index_obj->clone();
    187187                unused_index_obj->attributes.push_back( new Attribute( "unused" ) );
    188188
    189                 catch_func_t.get_parameters().push_back( index_obj.clone() );
    190                 catch_func_t.get_parameters().push_back( exception_obj.clone() );
    191                 match_func_t.get_returnVals().push_back( unused_index_obj );
    192                 match_func_t.get_parameters().push_back( exception_obj.clone() );
    193                 handle_func_t.get_returnVals().push_back( bool_obj.clone() );
    194                 handle_func_t.get_parameters().push_back( exception_obj.clone() );
    195                 finally_func_t.get_parameters().push_back( voidptr_obj.clone() );
     189                catch_func_t->get_parameters().push_back( index_obj );
     190                catch_func_t->get_parameters().push_back( exception_obj->clone() );
     191                match_func_t->get_returnVals().push_back( unused_index_obj );
     192                match_func_t->get_parameters().push_back( exception_obj->clone() );
     193                handle_func_t->get_returnVals().push_back( bool_obj );
     194                handle_func_t->get_parameters().push_back( exception_obj );
     195                finally_func_t->get_parameters().push_back( voidptr_obj );
    196196        }
    197197
     
    264264
    265265                return new FunctionDecl( "try", Type::StorageClasses(),
    266                         LinkageSpec::Cforall, try_func_t.clone(), body );
     266                        LinkageSpec::Cforall, try_func_t->clone(), body );
    267267        }
    268268
     
    271271                std::list<CaseStmt *> handler_wrappers;
    272272
    273                 FunctionType *func_type = catch_func_t.clone();
     273                FunctionType *func_type = catch_func_t->clone();
    274274                DeclarationWithType * index_obj = func_type->get_parameters().front();
    275275                DeclarationWithType * except_obj = func_type->get_parameters().back();
     
    392392                CompoundStmt * body = new CompoundStmt();
    393393
    394                 FunctionType * func_type = match_func_t.clone();
     394                FunctionType * func_type = match_func_t->clone();
    395395                DeclarationWithType * except_obj = func_type->get_parameters().back();
    396396
     
    446446                CompoundStmt * body = new CompoundStmt();
    447447
    448                 FunctionType * func_type = handle_func_t.clone();
     448                FunctionType * func_type = handle_func_t->clone();
    449449                DeclarationWithType * except_obj = func_type->get_parameters().back();
    450450
     
    529529
    530530                return new FunctionDecl("finally", Type::StorageClasses(),
    531                         LinkageSpec::Cforall, finally_func_t.clone(), body);
     531                        LinkageSpec::Cforall, finally_func_t->clone(), body);
    532532        }
    533533
Note: See TracChangeset for help on using the changeset viewer.