Changes in src/GenPoly/Box.cc [e9b5043:331ee52c]
- File:
-
- 1 edited
-
src/GenPoly/Box.cc (modified) (10 diffs)
Legend:
- Unmodified
- Added
- Removed
-
src/GenPoly/Box.cc
re9b5043 r331ee52c 14 14 // 15 15 16 #include "Box.h"17 18 16 #include <algorithm> // for mismatch 19 17 #include <cassert> // for assert, strict_dynamic_cast … … 25 23 #include <string> // for string, allocator, basic_string 26 24 #include <utility> // for pair 25 26 #include "Box.h" 27 27 28 28 #include "CodeGen/OperatorTable.h" … … 37 37 #include "InitTweak/InitTweak.h" // for getFunctionName, isAssignment 38 38 #include "Lvalue.h" // for generalizedLvalue 39 #include "ResolvExpr/ Unify.h"// for typesCompatible39 #include "ResolvExpr/typeops.h" // for typesCompatible 40 40 #include "ScopedSet.h" // for ScopedSet, ScopedSet<>::iter... 41 41 #include "ScrubTyVars.h" // for ScrubTyVars … … 488 488 for ( FunctionType const * const funType : functions ) { 489 489 std::string mangleName = mangleAdapterName( funType, scopeTyVars ); 490 if ( !adapters.contains( mangleName) ) {490 if ( adapters.find( mangleName ) == adapters.end() ) { 491 491 std::string adapterName = makeAdapterName( mangleName ); 492 492 adapters.insert( std::pair< std::string, DeclarationWithType *>( mangleName, new ObjectDecl( adapterName, Type::StorageClasses(), LinkageSpec::C, nullptr, new PointerType( Type::Qualifiers(), makeAdapterType( funType, scopeTyVars ) ), nullptr ) ) ); … … 911 911 912 912 for ( FunctionType const * const funType : functions ) { 913 std::string mangleName = SymTab::Mangler::mangle( funType ); 913 FunctionType *originalFunction = funType->clone(); 914 FunctionType *realFunction = funType->clone(); 915 std::string mangleName = SymTab::Mangler::mangle( realFunction ); 914 916 915 917 // only attempt to create an adapter or pass one as a parameter if we haven't already done so for this 916 918 // pre-substitution parameter function type. 917 919 // The second part of the insert result is "is the value new". 918 if ( !adaptersDone.insert( mangleName ).second ) continue; 919 920 // Apply substitution to type variables to figure out what the adapter's type should look like. 921 assert( env ); 922 FunctionType *realType = funType->clone(); 923 env->apply( realType ); 924 mangleName = SymTab::Mangler::mangle( realType ); 925 mangleName += makePolyMonoSuffix( funType, exprTyVars ); 926 927 typedef ScopedMap< std::string, DeclarationWithType* >::iterator AdapterIter; 928 AdapterIter adapter = adapters.find( mangleName ); 929 if ( adapter == adapters.end() ) { 930 // Adapter has not been created yet in the current scope, so define it. 931 FunctionDecl *newAdapter = makeAdapter( funType, realType, mangleName, exprTyVars ); 932 std::pair< AdapterIter, bool > answer = adapters.insert( mangleName, newAdapter ); 933 adapter = answer.first; 934 stmtsToAddBefore.push_back( new DeclStmt( newAdapter ) ); 920 if ( adaptersDone.insert( mangleName ).second ) { 921 922 // apply substitution to type variables to figure out what the adapter's type should look like 923 assert( env ); 924 env->apply( realFunction ); 925 mangleName = SymTab::Mangler::mangle( realFunction ); 926 mangleName += makePolyMonoSuffix( originalFunction, exprTyVars ); 927 928 typedef ScopedMap< std::string, DeclarationWithType* >::iterator AdapterIter; 929 AdapterIter adapter = adapters.find( mangleName ); 930 if ( adapter == adapters.end() ) { 931 // adapter has not been created yet in the current scope, so define it 932 FunctionDecl *newAdapter = makeAdapter( funType, realFunction, mangleName, exprTyVars ); 933 std::pair< AdapterIter, bool > answer = adapters.insert( std::pair< std::string, DeclarationWithType *>( mangleName, newAdapter ) ); 934 adapter = answer.first; 935 stmtsToAddBefore.push_back( new DeclStmt( newAdapter ) ); 936 } // if 937 assert( adapter != adapters.end() ); 938 939 // add the appropriate adapter as a parameter 940 appExpr->get_args().push_front( new VariableExpr( adapter->second ) ); 935 941 } // if 936 assert( adapter != adapters.end() );937 938 // Add the appropriate adapter as a parameter.939 appExpr->args.push_front( new VariableExpr( adapter->second ) );940 942 } // for 941 943 } // passAdapters … … 1487 1489 if ( TypeInstType *typeInst = dynamic_cast< TypeInstType* >( ty ) ) { 1488 1490 // do not try to monomorphize generic parameters 1489 if ( scopeTyVars. contains( typeInst->get_name()) && ! genericParams.count( typeInst->name ) ) {1491 if ( scopeTyVars.find( typeInst->get_name() ) != scopeTyVars.end() && ! genericParams.count( typeInst->name ) ) { 1490 1492 // polymorphic aggregate members should be converted into monomorphic members. 1491 1493 // Using char[size_T] here respects the expected sizing rules of an aggregate type. … … 1696 1698 1697 1699 if ( auto typeInst = dynamic_cast< TypeInstType const * >( ty ) ) { 1698 if ( scopeTyVars. contains( typeInst->get_name()) ) {1700 if ( scopeTyVars.find( typeInst->get_name() ) != scopeTyVars.end() ) { 1699 1701 // NOTE assumes here that getting put in the scopeTyVars included having the layout variables set 1700 1702 return true; … … 1704 1706 // check if this type already has a layout generated for it 1705 1707 std::string typeName = mangleType( ty ); 1706 if ( knownLayouts. contains( typeName) ) return true;1708 if ( knownLayouts.find( typeName ) != knownLayouts.end() ) return true; 1707 1709 1708 1710 // check if any of the type parameters have dynamic layout; if none do, this type is (or will be) monomorphized … … 1741 1743 // check if this type already has a layout generated for it 1742 1744 std::string typeName = mangleType( ty ); 1743 if ( knownLayouts. contains( typeName) ) return true;1745 if ( knownLayouts.find( typeName ) != knownLayouts.end() ) return true; 1744 1746 1745 1747 // check if any of the type parameters have dynamic layout; if none do, this type is (or will be) monomorphized … … 1832 1834 } else { 1833 1835 std::string offsetName = offsetofName( mangleType( ty ) ); 1834 if ( knownOffsets. contains( offsetName) ) {1836 if ( knownOffsets.find( offsetName ) != knownOffsets.end() ) { 1835 1837 // use the already-generated offsets for this type 1836 1838 ret = new NameExpr( offsetName );
Note:
See TracChangeset
for help on using the changeset viewer.