Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/SymTab/Mangler.cc

    re35f30a rf0ecf9b  
    3232namespace SymTab {
    3333        std::string Mangler::mangleType( Type * ty ) {
    34                 Mangler mangler( false, true, true );
     34                Mangler mangler( false, true );
    3535                maybeAccept( ty, mangler );
    3636                return mangler.get_mangleName();
    3737        }
    3838
    39         std::string Mangler::mangleConcrete( Type* ty ) {
    40                 Mangler mangler( false, false, false );
    41                 maybeAccept( ty, mangler );
    42                 return mangler.get_mangleName();
    43         }
    44 
    45         Mangler::Mangler( bool mangleOverridable, bool typeMode, bool mangleGenericParams )
    46                 : nextVarNum( 0 ), isTopLevel( true ), mangleOverridable( mangleOverridable ), typeMode( typeMode ), mangleGenericParams( mangleGenericParams ) {}
     39        Mangler::Mangler( bool mangleOverridable, bool typeMode )
     40                : nextVarNum( 0 ), isTopLevel( true ), mangleOverridable( mangleOverridable ), typeMode( typeMode ) {}
    4741
    4842        Mangler::Mangler( const Mangler &rhs ) : mangleName() {
     
    172166
    173167                mangleName << ( refType->get_name().length() + prefix.length() ) << prefix << refType->get_name();
    174 
    175                 if ( mangleGenericParams ) {
    176                         std::list< Expression* >& params = refType->get_parameters();
    177                         if ( ! params.empty() ) {
    178                                 mangleName << "_";
    179                                 for ( std::list< Expression* >::const_iterator param = params.begin(); param != params.end(); ++param ) {
    180                                         TypeExpr *paramType = dynamic_cast< TypeExpr* >( *param );
    181                                         assertf(paramType, "Aggregate parameters should be type expressions: %s", toString(*param).c_str());
    182                                         maybeAccept( paramType->get_type(), *this );
    183                                 }
    184                                 mangleName << "_";
     168        }
     169
     170        void Mangler::mangleGenericRef( ReferenceToType * refType, std::string prefix ) {
     171                printQualifiers( refType );
     172
     173                std::ostringstream oldName( mangleName.str() );
     174                mangleName.clear();
     175
     176                mangleName << prefix << refType->get_name();
     177
     178                std::list< Expression* >& params = refType->get_parameters();
     179                if ( ! params.empty() ) {
     180                        mangleName << "_";
     181                        for ( std::list< Expression* >::const_iterator param = params.begin(); param != params.end(); ++param ) {
     182                                TypeExpr *paramType = dynamic_cast< TypeExpr* >( *param );
     183                                assertf(paramType, "Aggregate parameters should be type expressions: %s", toString(*param).c_str());
     184                                maybeAccept( paramType->get_type(), *this );
    185185                        }
     186                        mangleName << "_";
    186187                }
     188
     189                oldName << mangleName.str().length() << mangleName.str();
     190                mangleName.str( oldName.str() );
    187191        }
    188192
    189193        void Mangler::visit( StructInstType * aggregateUseType ) {
    190                 mangleRef( aggregateUseType, "s" );
     194                if ( typeMode ) mangleGenericRef( aggregateUseType, "s" );
     195                else mangleRef( aggregateUseType, "s" );
    191196        }
    192197
    193198        void Mangler::visit( UnionInstType * aggregateUseType ) {
    194                 mangleRef( aggregateUseType, "u" );
     199                if ( typeMode ) mangleGenericRef( aggregateUseType, "u" );
     200                else mangleRef( aggregateUseType, "u" );
    195201        }
    196202
     
    279285                                varNums[ (*i)->name ] = std::pair< int, int >( nextVarNum++, (int)(*i)->get_kind() );
    280286                                for ( std::list< DeclarationWithType* >::iterator assert = (*i)->assertions.begin(); assert != (*i)->assertions.end(); ++assert ) {
    281                                         Mangler sub_mangler( mangleOverridable, typeMode, mangleGenericParams );
     287                                        Mangler sub_mangler( mangleOverridable, typeMode );
    282288                                        sub_mangler.nextVarNum = nextVarNum;
    283289                                        sub_mangler.isTopLevel = false;
Note: See TracChangeset for help on using the changeset viewer.