Changeset 2ed94a9 for src/GenPoly/Box.cc
- Timestamp:
- Feb 8, 2023, 2:27:55 PM (3 years ago)
- Branches:
- ADT, master
- Children:
- b110bcc
- Parents:
- 997185e (diff), ccb29b4 (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the(diff)links above to see all the changes relative to each parent. - File:
-
- 1 edited
-
src/GenPoly/Box.cc (modified) (10 diffs)
Legend:
- Unmodified
- Added
- Removed
-
src/GenPoly/Box.cc
r997185e r2ed94a9 14 14 // 15 15 16 #include "Box.h" 17 16 18 #include <algorithm> // for mismatch 17 19 #include <cassert> // for assert, strict_dynamic_cast … … 23 25 #include <string> // for string, allocator, basic_string 24 26 #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/ typeops.h"// for typesCompatible39 #include "ResolvExpr/Unify.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.find( mangleName ) == adapters.end() ) {490 if ( !adapters.contains( mangleName ) ) { 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 FunctionType *originalFunction = funType->clone(); 914 FunctionType *realFunction = funType->clone(); 915 std::string mangleName = SymTab::Mangler::mangle( realFunction ); 913 std::string mangleName = SymTab::Mangler::mangle( funType ); 916 914 917 915 // only attempt to create an adapter or pass one as a parameter if we haven't already done so for this 918 916 // pre-substitution parameter function type. 919 917 // The second part of the insert result is "is the value new". 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 ) ); 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 ) ); 941 935 } // if 936 assert( adapter != adapters.end() ); 937 938 // Add the appropriate adapter as a parameter. 939 appExpr->args.push_front( new VariableExpr( adapter->second ) ); 942 940 } // for 943 941 } // passAdapters … … 1489 1487 if ( TypeInstType *typeInst = dynamic_cast< TypeInstType* >( ty ) ) { 1490 1488 // do not try to monomorphize generic parameters 1491 if ( scopeTyVars. find( typeInst->get_name() ) != scopeTyVars.end() && ! genericParams.count( typeInst->name ) ) {1489 if ( scopeTyVars.contains( typeInst->get_name() ) && ! genericParams.count( typeInst->name ) ) { 1492 1490 // polymorphic aggregate members should be converted into monomorphic members. 1493 1491 // Using char[size_T] here respects the expected sizing rules of an aggregate type. … … 1698 1696 1699 1697 if ( auto typeInst = dynamic_cast< TypeInstType const * >( ty ) ) { 1700 if ( scopeTyVars. find( typeInst->get_name() ) != scopeTyVars.end() ) {1698 if ( scopeTyVars.contains( typeInst->get_name() ) ) { 1701 1699 // NOTE assumes here that getting put in the scopeTyVars included having the layout variables set 1702 1700 return true; … … 1706 1704 // check if this type already has a layout generated for it 1707 1705 std::string typeName = mangleType( ty ); 1708 if ( knownLayouts. find( typeName ) != knownLayouts.end() ) return true;1706 if ( knownLayouts.contains( typeName ) ) return true; 1709 1707 1710 1708 // check if any of the type parameters have dynamic layout; if none do, this type is (or will be) monomorphized … … 1743 1741 // check if this type already has a layout generated for it 1744 1742 std::string typeName = mangleType( ty ); 1745 if ( knownLayouts. find( typeName ) != knownLayouts.end() ) return true;1743 if ( knownLayouts.contains( typeName ) ) return true; 1746 1744 1747 1745 // check if any of the type parameters have dynamic layout; if none do, this type is (or will be) monomorphized … … 1834 1832 } else { 1835 1833 std::string offsetName = offsetofName( mangleType( ty ) ); 1836 if ( knownOffsets. find( offsetName ) != knownOffsets.end() ) {1834 if ( knownOffsets.contains( offsetName ) ) { 1837 1835 // use the already-generated offsets for this type 1838 1836 ret = new NameExpr( offsetName );
Note:
See TracChangeset
for help on using the changeset viewer.