Ignore:
Timestamp:
Jan 19, 2016, 1:28:25 PM (8 years ago)
Author:
Rob Schluntz <rschlunt@…>
Branches:
ADT, aaron-thesis, arm-eh, ast-experimental, cleanup-dtors, ctor, deferred_resn, demangler, enum, forall-pointer-decay, gc_noraii, jacob/cs343-translation, jenkins-sandbox, master, memory, new-ast, new-ast-unique-expr, new-env, no_list, persistent-indexer, pthread-emulation, qualifiedEnum, resolv-new, with_gc
Children:
ca1c11f
Parents:
71f4e4f
Message:

added intrinsic ctor/dtors to prelude, modified MakeLibCfa? to build prelude ctor/dtors, added ctor/dtor to polymorphic object type constraints, rudimentary fallback on initializer nodes if chosen ctor is intrinsic, remove intrinsic destructor statements to reduce output pollution

File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/ResolvExpr/Resolver.cc

    r71f4e4f rf1e012b  
    1010// Created On       : Sun May 17 12:17:01 2015
    1111// Last Modified By : Rob Schluntz
    12 // Last Modified On : Wed Jan 13 16:23:51 2016
    13 // Update Count     : 186
     12// Last Modified On : Thu Jan 14 16:45:32 2016
     13// Update Count     : 203
    1414//
    1515
     
    6060          void resolveAggrInit( AggregateDecl *, InitIterator &, InitIterator & );
    6161          void resolveSingleAggrInit( Declaration *, InitIterator &, InitIterator & );
     62          void fallbackInit( ConstructorInit * ctorInit );
    6263
    6364                std::list< Type * > functionReturn;
     
    467468        }
    468469
     470        // ConstructorInit - fall back on C-style initializer
     471        void Resolver::fallbackInit( ConstructorInit * ctorInit ) {
     472                // could not find valid constructor, or found an intrinsic constructor
     473                // fall back on C-style initializer
     474                delete ctorInit->get_ctor();
     475                ctorInit->set_ctor( NULL );
     476                maybeAccept( ctorInit->get_init(), *this );
     477        }
     478
    469479        void Resolver::visit( ConstructorInit *ctorInit ) {
    470480                TypeEnvironment env;
    471481                AlternativeFinder finder( *this, env );
    472482                finder.find( ctorInit->get_ctor() );
     483
    473484                if ( finder.get_alternatives().size() == 0 ) {
    474                         // could not find valid constructor
    475                         delete ctorInit->get_ctor();
    476                         ctorInit->set_ctor( NULL );
    477 
    478                         maybeAccept( ctorInit->get_init(), *this );
     485                        fallbackInit( ctorInit );
    479486                } else if ( finder.get_alternatives().size() == 1 ) {
     487                        Alternative &choice = finder.get_alternatives().front();
     488                        if ( ApplicationExpr * appExpr = dynamic_cast< ApplicationExpr * >( choice.expr ) ) {
     489                                if ( VariableExpr * function = dynamic_cast< VariableExpr * > ( appExpr->get_function() ) ) {
     490                                        if ( function->get_var()->get_linkage() == LinkageSpec::Intrinsic ) {
     491                                                // if the constructor that was found is intrinsic, reset to C-style
     492                                                // initializer so that code generation is easy to handle
     493                                                fallbackInit( ctorInit );
     494                                                return;
     495                                        }
     496                                }
     497                        }
    480498                        // found a constructor - can get rid of C-style initializer
    481                         Alternative &choice = finder.get_alternatives().front();
    482499                        Expression *newExpr = choice.expr->clone();
    483500                        finishExpr( newExpr, choice.env );
Note: See TracChangeset for help on using the changeset viewer.