Changes in / [22a0e87:88ac843e]
- Location:
- src
- Files:
-
- 9 edited
-
AST/Type.cpp (modified) (2 diffs)
-
AST/Type.hpp (modified) (1 diff)
-
GenPoly/GenPoly.cc (modified) (5 diffs)
-
GenPoly/GenPoly.h (modified) (6 diffs)
-
GenPoly/ScrubTyVars.cc (modified) (4 diffs)
-
ResolvExpr/SatisfyAssertions.cpp (modified) (1 diff)
-
SymTab/Mangler.cc (modified) (4 diffs)
-
SymTab/Mangler.h (modified) (4 diffs)
-
Virtual/ExpandCasts.cc (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
-
src/AST/Type.cpp
r22a0e87 r88ac843e 147 147 // --- TypeInstType 148 148 149 bool TypeInstType::operator==( const TypeInstType & other ) const {150 return base == other.base151 && formal_usage == other.formal_usage152 && expr_id == other.expr_id;153 }154 155 149 TypeInstType::TypeInstType( const TypeDecl * b, 156 150 CV::Qualifiers q, std::vector<ptr<Attribute>> && as ) … … 163 157 164 158 bool TypeInstType::isComplete() const { return base->sized; } 165 166 std::string TypeInstType::TypeEnvKey::typeString() const {167 return std::string("_") + std::to_string(formal_usage)168 + "_" + std::to_string(expr_id) + "_" + base->name;169 }170 171 bool TypeInstType::TypeEnvKey::operator==(172 const TypeInstType::TypeEnvKey & other ) const {173 return base == other.base174 && formal_usage == other.formal_usage175 && expr_id == other.expr_id;176 }177 178 bool TypeInstType::TypeEnvKey::operator<(179 const TypeInstType::TypeEnvKey & other ) const {180 // TypeEnvKey ordering is an arbitrary total ordering.181 // It doesn't mean anything but allows for a sorting.182 if ( base < other.base ) {183 return true;184 } else if ( other.base < base ) {185 return false;186 } else if ( formal_usage < other.formal_usage ) {187 return true;188 } else if ( other.formal_usage < formal_usage ) {189 return false;190 } else {191 return expr_id < other.expr_id;192 }193 }194 159 195 160 // --- TupleType -
src/AST/Type.hpp
r22a0e87 r88ac843e 408 408 409 409 TypeEnvKey() = default; 410 TypeEnvKey(const TypeDecl * base, int formal_usage = 0, int expr_id = 0) 411 : base(base), formal_usage(formal_usage), expr_id(expr_id) {} 412 TypeEnvKey(const TypeInstType & inst) 413 : base(inst.base), formal_usage(inst.formal_usage), expr_id(inst.expr_id) {} 414 std::string typeString() const; 415 bool operator==(const TypeEnvKey & other) const; 416 bool operator<(const TypeEnvKey & other) const; 410 TypeEnvKey(const TypeDecl * base, int formal_usage = 0, int expr_id = 0): base(base), formal_usage(formal_usage), expr_id(expr_id) {} 411 TypeEnvKey(const TypeInstType & inst): base(inst.base), formal_usage(inst.formal_usage), expr_id(inst.expr_id) {} 412 std::string typeString() const { return std::string("_") + std::to_string(formal_usage) + "_" + std::to_string(expr_id) + "_" + base->name; } 413 bool operator==(const TypeEnvKey & other) const { return base == other.base && formal_usage == other.formal_usage && expr_id == other.expr_id; } 417 414 }; 418 415 419 bool operator==(const TypeInstType & other) const ;416 bool operator==(const TypeInstType & other) const { return base == other.base && formal_usage == other.formal_usage && expr_id == other.expr_id; } 420 417 421 418 TypeInstType( -
src/GenPoly/GenPoly.cc
r22a0e87 r88ac843e 10 10 // Created On : Mon May 18 07:44:20 2015 11 11 // Last Modified By : Andrew Beach 12 // Last Modified On : Mon Oct 24 15:19:00 202213 // Update Count : 1 712 // Last Modified On : Fri Oct 7 15:25:00 2022 13 // Update Count : 16 14 14 // 15 15 … … 194 194 195 195 if ( auto inst = dynamic_cast< const ast::TypeInstType * >( type ) ) { 196 if ( typeVars.find( *inst) != typeVars.end() ) return type;196 if ( typeVars.find( inst->typeString() ) != typeVars.end() ) return type; 197 197 } else if ( auto array = dynamic_cast< const ast::ArrayType * >( type ) ) { 198 198 return isPolyType( array->base, subst ); … … 227 227 228 228 if ( auto inst = dynamic_cast<ast::TypeInstType const *>( type ) ) { 229 auto var = typeVars.find( *inst);229 auto var = typeVars.find( inst->name ); 230 230 if ( var != typeVars.end() && var->second.isComplete ) { 231 231 … … 784 784 785 785 void addToTypeVarMap( const ast::TypeInstType * type, TypeVarMap & typeVars ) { 786 typeVars.insert( *type, ast::TypeDecl::Data( type->base ) );786 typeVars.insert( type->typeString(), ast::TypeDecl::Data( type->base ) ); 787 787 } 788 788 … … 816 816 } 817 817 818 void printTypeVarMap( std::ostream &os, const TypeVarMap & typeVars ) { 819 for ( auto const & pair : typeVars ) { 820 os << pair.first << " (" << pair.second << ") "; 821 } // for 822 os << std::endl; 823 } 824 818 825 } // namespace GenPoly 819 826 -
src/GenPoly/GenPoly.h
r22a0e87 r88ac843e 10 10 // Created On : Mon May 18 07:44:20 2015 11 11 // Last Modified By : Andrew Beach 12 // Last Modified On : Mon Oct 24 15:18:00 202213 // Update Count : 1112 // Last Modified On : Fri Oct 7 15:06:00 2022 13 // Update Count : 9 14 14 // 15 15 … … 22 22 #include "AST/Decl.hpp" // for TypeDecl::Data 23 23 #include "AST/Fwd.hpp" // for ApplicationExpr, BaseInstType, Func... 24 #include "AST/Type.hpp" // for TypeInstType::TypeEnvKey25 24 #include "SymTab/Mangler.h" // for Mangler 26 25 #include "SynTree/Declaration.h" // for TypeDecl::Data, AggregateDecl, Type... … … 29 28 namespace GenPoly { 30 29 30 // TODO Via some tricks this works for ast::TypeDecl::Data as well. 31 31 typedef ErasableScopedMap< std::string, TypeDecl::Data > TyVarMap; 32 using TypeVarMap = ErasableScopedMap< ast::TypeInstType::TypeEnvKey, ast::TypeDecl::Data >;32 using TypeVarMap = ErasableScopedMap< std::string, ast::TypeDecl::Data >; 33 33 34 34 /// Replaces a TypeInstType by its referrent in the environment, if applicable 35 35 Type* replaceTypeInst( Type* type, const TypeSubstitution* env ); 36 const ast::Type * replaceTypeInst( const ast::Type *, const ast::TypeSubstitution * );37 36 38 37 /// returns polymorphic type if is polymorphic type, NULL otherwise; will look up substitution in env if provided … … 54 53 /// true iff function has dynamic-layout return type under the type variable map generated from its forall-parameters 55 54 ReferenceToType *isDynRet( FunctionType *function ); 56 const ast::BaseInstType *isDynRet( const ast::FunctionType * func );57 55 58 56 /// A function needs an adapter if it returns a dynamic-layout value or if any of its parameters have dynamic-layout type … … 114 112 /// Prints type variable map 115 113 void printTyVarMap( std::ostream &os, const TyVarMap &tyVarMap ); 114 void printTypeVarMap( std::ostream &os, const TypeVarMap & typeVars ); 116 115 117 116 /// Gets the mangled name of this type; alias for SymTab::Mangler::mangleType(). … … 129 128 /// Gets the name of the layout function for a given aggregate type, given its declaration 130 129 inline std::string layoutofName( AggregateDecl *decl ) { return std::string( "_layoutof_" ) + decl->get_name(); } 131 inline std::string layoutofName( ast::AggregateDecl const * decl ) {132 return std::string( "_layoutof_" ) + decl->name;133 }134 130 135 131 } // namespace GenPoly -
src/GenPoly/ScrubTyVars.cc
r22a0e87 r88ac843e 20 20 #include "GenPoly/ErasableScopedMap.h" // for ErasableScopedMap<>::const_it... 21 21 #include "ScrubTyVars.h" 22 #include "SymTab/Mangler.h" // for mangle Type22 #include "SymTab/Mangler.h" // for mangle, typeMode 23 23 #include "SynTree/Declaration.h" // for TypeDecl, TypeDecl::Data, Typ... 24 24 #include "SynTree/Expression.h" // for Expression (ptr only), NameExpr … … 195 195 } 196 196 197 auto typeVar = typeVars->find( *type );197 auto typeVar = typeVars->find( type->name ); 198 198 if ( typeVar == typeVars->end() ) { 199 199 return type; … … 227 227 if ( dynType ) { 228 228 return new ast::NameExpr( expr->location, 229 sizeofName( Mangle::mangle Type( dynType) ) );229 sizeofName( Mangle::mangle( dynType, Mangle::typeMode() ) ) ); 230 230 } else { 231 231 return expr; … … 237 237 if ( dynType ) { 238 238 return new ast::NameExpr( expr->location, 239 alignofName( Mangle::mangle Type( dynType) ) );239 alignofName( Mangle::mangle( dynType, Mangle::typeMode() ) ) ); 240 240 } else { 241 241 return expr; -
src/ResolvExpr/SatisfyAssertions.cpp
r22a0e87 r88ac843e 268 268 ast::ptr< ast::Type > resType = cand.expr->result; 269 269 cand.env.apply( resType ); 270 return Mangle::mangle Type( resType);270 return Mangle::mangle( resType, Mangle::typeMode() ); 271 271 } 272 272 -
src/SymTab/Mangler.cc
r22a0e87 r88ac843e 9 9 // Author : Richard C. Bilson 10 10 // Created On : Sun May 17 21:40:29 2015 11 // Last Modified By : Andrew Beach12 // Last Modified On : Fri Oct 21 16:18:00 202213 // Update Count : 7 511 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Mon Jan 11 21:56:06 2021 13 // Update Count : 74 14 14 // 15 15 #include "Mangler.h" … … 418 418 void postvisit( const ast::QualifiedType * qualType ); 419 419 420 /// The result is the current constructed mangled name. 421 std::string result() const { return mangleName; } 420 std::string get_mangleName() { return mangleName; } 422 421 private: 423 422 std::string mangleName; ///< Mangled name being constructed … … 445 444 } // namespace 446 445 446 447 447 std::string mangle( const ast::Node * decl, Mangle::Mode mode ) { 448 return ast::Pass<Mangler_new>::read( decl, mode ); 448 ast::Pass<Mangler_new> mangler( mode ); 449 maybeAccept( decl, mangler ); 450 return mangler.core.get_mangleName(); 449 451 } 450 452 … … 687 689 } // for 688 690 for ( auto & assert : ptype->assertions ) { 689 assertionNames.push_back( ast::Pass<Mangler_new>::read( 690 assert->var.get(), 691 mangleOverridable, typeMode, mangleGenericParams, nextVarNum, varNums ) ); 691 ast::Pass<Mangler_new> sub_mangler( 692 mangleOverridable, typeMode, mangleGenericParams, nextVarNum, varNums ); 693 assert->var->accept( sub_mangler ); 694 assertionNames.push_back( sub_mangler.core.get_mangleName() ); 692 695 acount++; 693 696 } // for -
src/SymTab/Mangler.h
r22a0e87 r88ac843e 9 9 // Author : Richard C. Bilson 10 10 // Created On : Sun May 17 21:44:03 2015 11 // Last Modified By : Andrew Beach12 // Last Modified On : Thu Oct 27 11:58:00 202213 // Update Count : 1 611 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Sat Jul 22 09:45:30 2017 13 // Update Count : 15 14 14 // 15 15 … … 22 22 23 23 #include "AST/Bitfield.hpp" 24 #include "AST/Fwd.hpp" 24 25 #include "SynTree/SynTree.h" // for Types 25 26 #include "SynTree/Visitor.h" // for Visitor, maybeAccept … … 32 33 // * Currently name compression is not implemented. 33 34 34 namespace ast {35 class Node;36 }37 35 namespace ResolvExpr { 38 36 class TypeEnvironment; … … 103 101 using Mode = bitfield<mangle_flags>; 104 102 105 /// Mangle declaration name. 103 static inline Mode typeMode() { return NoOverrideable | Type; } 104 105 /// Mangle declaration name 106 106 std::string mangle( const ast::Node * decl, Mode mode = {} ); 107 108 /// Most common mangle configuration for types.109 static inline std::string mangleType( const ast::Node * type ) {110 return mangle( type, { NoOverrideable | Type } );111 }112 107 113 108 namespace Encoding { -
src/Virtual/ExpandCasts.cc
r22a0e87 r88ac843e 295 295 // returns the previous declaration for error messages. 296 296 ast::ObjectDecl const * insert( ast::ObjectDecl const * typeIdDecl ) { 297 std::string mangledName = Mangle::mangleType( typeIdDecl->type ); 297 std::string const & mangledName = 298 Mangle::mangle( typeIdDecl->type, Mangle::typeMode() ); 298 299 ast::ObjectDecl const *& value = instances[ mangledName ]; 299 300 if ( value ) { … … 309 310 310 311 ast::ObjectDecl const * lookup( ast::Type const * typeIdType ) { 311 std::string mangledName = Mangle::mangleType( typeIdType ); 312 std::string const & mangledName = 313 Mangle::mangle( typeIdType, Mangle::typeMode() ); 312 314 auto const it = instances.find( mangledName ); 313 315 return ( instances.end() == it ) ? nullptr : it->second;
Note:
See TracChangeset
for help on using the changeset viewer.