Changeset c92c09c for src/Tuples
- Timestamp:
- Aug 8, 2017, 2:50:30 PM (8 years ago)
- Branches:
- ADT, aaron-thesis, arm-eh, ast-experimental, cleanup-dtors, deferred_resn, demangler, enum, forall-pointer-decay, jacob/cs343-translation, jenkins-sandbox, master, new-ast, new-ast-unique-expr, new-env, no_list, persistent-indexer, pthread-emulation, qualifiedEnum, resolv-new, with_gc
- Children:
- 43f8fd8
- Parents:
- acd7c5dd
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
src/Tuples/TupleExpansion.cc
racd7c5dd rc92c09c 66 66 }; 67 67 68 class TupleTypeReplacer : public GenPoly::DeclMutator { 69 public: 70 typedef GenPoly::DeclMutator Parent; 71 using Parent::mutate; 72 73 virtual Type * mutate( TupleType * tupleType ) override; 74 75 virtual CompoundStmt * mutate( CompoundStmt * stmt ) override { 76 typeMap.beginScope(); 77 stmt = Parent::mutate( stmt ); 78 typeMap.endScope(); 79 return stmt; 68 struct TupleTypeReplacer : public WithDeclsToAdd, public WithGuards, public WithTypeSubstitution { 69 Type * postmutate( TupleType * tupleType ); 70 71 void premutate( CompoundStmt * ) { 72 GuardScope( typeMap ); 80 73 } 81 74 private: … … 111 104 mutateAll( translationUnit, assnExpander ); 112 105 113 TupleTypeReplacerreplacer;114 replacer.mutateDeclarationList( translationUnit);106 PassVisitor<TupleTypeReplacer> replacer; 107 mutateAll( translationUnit, replacer ); 115 108 116 109 PassVisitor<TupleIndexExpander> idxExpander; … … 218 211 } 219 212 220 Type * TupleTypeReplacer::mutate( TupleType * tupleType ) { 221 tupleType = safe_dynamic_cast< TupleType * > ( Parent::mutate( tupleType ) ); 213 Type * TupleTypeReplacer::postmutate( TupleType * tupleType ) { 222 214 unsigned tupleSize = tupleType->size(); 223 215 if ( ! typeMap.count( tupleSize ) ) { … … 226 218 decl->set_body( true ); 227 219 for ( size_t i = 0; i < tupleSize; ++i ) { 228 TypeDecl * tyParam = new TypeDecl( toString( "tuple_param_", i ), Type::StorageClasses(), nullptr, TypeDecl::Any );220 TypeDecl * tyParam = new TypeDecl( toString( "tuple_param_", tupleSize, "_", i ), Type::StorageClasses(), nullptr, TypeDecl::Any ); 229 221 decl->get_members().push_back( new ObjectDecl( toString("field_", i ), Type::StorageClasses(), LinkageSpec::C, nullptr, new TypeInstType( Type::Qualifiers(), tyParam->get_name(), tyParam ), nullptr ) ); 230 222 decl->get_parameters().push_back( tyParam ); … … 235 227 } 236 228 typeMap[tupleSize] = decl; 237 addDeclaration( decl );229 declsToAddBefore.push_back( decl ); 238 230 } 239 231 Type::Qualifiers qualifiers = tupleType->get_qualifiers(); … … 241 233 StructDecl * decl = typeMap[tupleSize]; 242 234 StructInstType * newType = new StructInstType( qualifiers, decl ); 243 for ( Type * t : *tupleType ) { 235 for ( auto p : group_iterate( tupleType->get_types(), decl->get_parameters() ) ) { 236 Type * t = std::get<0>(p); 237 TypeDecl * td = std::get<1>(p); 244 238 newType->get_parameters().push_back( new TypeExpr( t->clone() ) ); 239 if ( env ) { 240 // add bindings to the type environment. 241 // xxx - This may not be sufficient, it may be necessary to rename type variables on StructInstType? 242 env->add( td->get_name(), t->clone() ); 243 } 245 244 } 246 245 delete tupleType;
Note: See TracChangeset
for help on using the changeset viewer.