Changeset d9fa60a for src/Tuples


Ignore:
Timestamp:
Nov 16, 2016, 4:37:50 PM (8 years ago)
Author:
Rob Schluntz <rschlunt@…>
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:
186fd86
Parents:
33a7b6d
Message:

moved substituion into MemberExpr? constructor, change generated tuple structs to generic structs, tuples containing type variables almost works

File:
1 edited

Legend:

Unmodified
Added
Removed
  • TabularUnified src/Tuples/TupleExpansion.cc

    r33a7b6d rd9fa60a  
    9393                        typedef Mutator Parent;
    9494                        using Parent::mutate;
    95                        
     95
    9696                        virtual Expression * mutate( TupleExpr * tupleExpr ) override;
    9797                };
     
    218218        Type * TupleTypeReplacer::mutate( TupleType * tupleType ) {
    219219                std::string mangleName = SymTab::Mangler::mangleType( tupleType );
    220                 TupleType * newType = safe_dynamic_cast< TupleType * > ( Parent::mutate( tupleType ) );
     220                tupleType = safe_dynamic_cast< TupleType * > ( Parent::mutate( tupleType ) );
    221221                if ( ! typeMap.count( mangleName ) ) {
    222222                        // generate struct type to replace tuple type
    223223                        StructDecl * decl = new StructDecl( "_tuple_type_" + mangleName );
    224224                        decl->set_body( true );
    225                         int cnt = 0;
    226                         for ( Type * t : *newType ) {
    227                                 decl->get_members().push_back( new ObjectDecl( toString("field_", cnt++), DeclarationNode::NoStorageClass, LinkageSpec::C, nullptr, t->clone(), nullptr ) );
     225                        for ( size_t i = 0; i < tupleType->size(); ++i ) {
     226                                TypeDecl * tyParam = new TypeDecl( toString("tuple_param_", i), DeclarationNode::NoStorageClass, nullptr, TypeDecl::Any );
     227                                decl->get_members().push_back( new ObjectDecl( toString("field_", i), DeclarationNode::NoStorageClass, LinkageSpec::C, nullptr, new TypeInstType( Type::Qualifiers(), tyParam->get_name(), tyParam ), nullptr ) );
     228                                decl->get_parameters().push_back( tyParam );
    228229                        }
    229230                        typeMap[mangleName] = decl;
    230231                        addDeclaration( decl );
    231232                }
    232                 Type::Qualifiers qualifiers = newType->get_qualifiers();
    233                 delete newType;
    234                 return new StructInstType( qualifiers, typeMap[mangleName] );
     233                Type::Qualifiers qualifiers = tupleType->get_qualifiers();
     234
     235                StructDecl * decl = typeMap[mangleName];
     236                StructInstType * newType = new StructInstType( qualifiers, decl );
     237                for ( Type * t : *tupleType ) {
     238                        newType->get_parameters().push_back( new TypeExpr( t->clone() ) );
     239                }
     240                delete tupleType;
     241                return newType;
    235242        }
    236243
Note: See TracChangeset for help on using the changeset viewer.