Changeset 43c89a7 for src/Parser


Ignore:
Timestamp:
Feb 24, 2017, 3:58:03 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:
167a9c8
Parents:
24cde55
Message:

add hoistType flag (currently unused)

Location:
src/Parser
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • TabularUnified src/Parser/DeclarationNode.cc

    r24cde55 r43c89a7  
    1010// Created On       : Sat May 16 12:34:05 2015
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Thu Feb 23 15:45:02 2017
    13 // Update Count     : 759
     12// Last Modified On : Thu Feb 23 22:21:06 2017
     13// Update Count     : 775
    1414//
    1515
     
    607607                                        type->aggInst.aggregate = o->type;
    608608                                        if ( o->type->kind == TypeData::Aggregate ) {
     609                                                type->aggInst.hoistType = o->type->aggregate.body;
    609610                                                type->aggInst.params = maybeClone( o->type->aggregate.actuals );
     611                                        } else {
     612                                                type->aggInst.hoistType = o->type->enumeration.body;
    610613                                        } // if
    611614                                        type->qualifiers |= o->type->qualifiers;
     
    881884                                newType->aggInst.aggregate->aggregate.fields = nullptr;
    882885                        } // if
     886                        // don't hoist twice
     887                        newType->aggInst.hoistType = false;
    883888                } // if
    884889
     
    941946        SemanticError errors;
    942947        std::back_insert_iterator< std::list< DeclarationWithType * > > out( outputList );
    943        
     948
    944949        for ( const DeclarationNode * cur = firstNode; cur; cur = dynamic_cast< DeclarationNode * >( cur->get_next() ) ) {
    945950                try {
     
    953958                                        auto obj = new ObjectDecl( "", DeclarationNode::NoStorageClass, linkage, nullptr, inst, nullptr );
    954959                                        obj->location = cur->location;
    955                                         * out++ = obj; 
     960                                        * out++ = obj;
    956961                                        delete agg;
    957962                                } else if ( UnionDecl * agg = dynamic_cast< UnionDecl * >( decl ) ) {
     
    10351040
    10361041        switch ( type->kind ) {
    1037           case TypeData::Enum: {
    1038                   if ( type->enumeration.body ) {
    1039                           EnumDecl * typedecl = buildEnum( type, attributes );
    1040                           return new EnumInstType( buildQualifiers( type ), typedecl );
    1041                   } else {
    1042                           return new EnumInstType( buildQualifiers( type ), *type->enumeration.name );
    1043                   }
    1044           }
     1042          case TypeData::Enum:
    10451043          case TypeData::Aggregate: {
    1046                   ReferenceToType * ret;
    1047                   if ( type->aggregate.body ) {
    1048                           AggregateDecl * typedecl = buildAggregate( type, attributes );
    1049                           switch ( type->aggregate.kind ) {
    1050                                 case DeclarationNode::Struct:
    1051                                   ret = new StructInstType( buildQualifiers( type ), (StructDecl *)typedecl );
    1052                                   break;
    1053                                 case DeclarationNode::Union:
    1054                                   ret = new UnionInstType( buildQualifiers( type ), (UnionDecl *)typedecl );
    1055                                   break;
    1056                                 case DeclarationNode::Trait:
    1057                                   assert( false );
    1058                                   //ret = new TraitInstType( buildQualifiers( type ), (TraitDecl *)typedecl );
    1059                                   break;
    1060                                 default:
    1061                                   assert( false );
    1062                           } // switch
    1063                   } else {
    1064                           switch ( type->aggregate.kind ) {
    1065                                 case DeclarationNode::Struct:
    1066                                   ret = new StructInstType( buildQualifiers( type ), *type->aggregate.name );
    1067                                   break;
    1068                                 case DeclarationNode::Union:
    1069                                   ret = new UnionInstType( buildQualifiers( type ), *type->aggregate.name );
    1070                                   break;
    1071                                 case DeclarationNode::Trait:
    1072                                   assert( false );
    1073                                   //ret = new TraitInstType( buildQualifiers( type ), (TraitDecl *)typedecl );
    1074                                   break;
    1075                                 default:
    1076                                   assert( false );
    1077                           } // switch
    1078                   } // if
     1044                  ReferenceToType * ret = buildComAggInst( type, attributes );
    10791045                  buildList( type->aggregate.actuals, ret->get_parameters() );
    10801046                  return ret;
  • TabularUnified src/Parser/TypeData.cc

    r24cde55 r43c89a7  
    1010// Created On       : Sat May 16 15:12:51 2015
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Thu Feb 23 16:26:39 2017
    13 // Update Count     : 477
     12// Last Modified On : Thu Feb 23 21:48:55 2017
     13// Update Count     : 485
    1414//
    1515
     
    6262                aggInst.aggregate = nullptr;
    6363                aggInst.params = nullptr;
     64                aggInst.hoistType = false;;
    6465                break;
    6566          case Enum:
     
    195196                newtype->aggInst.aggregate = maybeClone( aggInst.aggregate );
    196197                newtype->aggInst.params = maybeClone( aggInst.params );
     198                newtype->aggInst.hoistType = aggInst.hoistType;
    197199                break;
    198200          case Enum:
     
    644646} // buildAggregate
    645647
     648ReferenceToType * buildComAggInst( const TypeData * type, std::list< Attribute * > attributes ) {
     649        switch ( type->kind ) {
     650          case TypeData::Enum: {
     651                  if ( type->enumeration.body ) {
     652                          EnumDecl * typedecl = buildEnum( type, attributes );
     653                          return new EnumInstType( buildQualifiers( type ), typedecl );
     654                  } else {
     655                          return new EnumInstType( buildQualifiers( type ), *type->enumeration.name );
     656                  } // if
     657          }
     658          case TypeData::Aggregate: {
     659                  ReferenceToType * ret;
     660                  if ( type->aggregate.body ) {
     661                          AggregateDecl * typedecl = buildAggregate( type, attributes );
     662                          switch ( type->aggregate.kind ) {
     663                                case DeclarationNode::Struct:
     664                                  ret = new StructInstType( buildQualifiers( type ), (StructDecl *)typedecl );
     665                                  break;
     666                                case DeclarationNode::Union:
     667                                  ret = new UnionInstType( buildQualifiers( type ), (UnionDecl *)typedecl );
     668                                  break;
     669                                case DeclarationNode::Trait:
     670                                  assert( false );
     671                                  //ret = new TraitInstType( buildQualifiers( type ), (TraitDecl *)typedecl );
     672                                  break;
     673                                default:
     674                                  assert( false );
     675                          } // switch
     676                  } else {
     677                          switch ( type->aggregate.kind ) {
     678                                case DeclarationNode::Struct:
     679                                  ret = new StructInstType( buildQualifiers( type ), *type->aggregate.name );
     680                                  break;
     681                                case DeclarationNode::Union:
     682                                  ret = new UnionInstType( buildQualifiers( type ), *type->aggregate.name );
     683                                  break;
     684                                case DeclarationNode::Trait:
     685                                  ret = new TraitInstType( buildQualifiers( type ), *type->aggregate.name );
     686                                  break;
     687                                default:
     688                                  assert( false );
     689                          } // switch
     690                  } // if
     691                  return ret;
     692          }
     693          default:
     694                assert( false );
     695        } // switch
     696} // buildAggInst
     697
    646698ReferenceToType * buildAggInst( const TypeData * td ) {
    647699        assert( td->kind == TypeData::AggregateInst );
    648700
    649         ReferenceToType * ret;
    650         if ( td->aggInst.aggregate->kind == TypeData::Enum ) {
    651                 ret = new EnumInstType( buildQualifiers( td ), *td->aggInst.aggregate->enumeration.name );
    652         } else {
    653                 assert( td->aggInst.aggregate->kind == TypeData::Aggregate );
    654                 switch ( td->aggInst.aggregate->aggregate.kind ) {
    655                   case DeclarationNode::Struct:
    656                         assert( td->aggInst.aggregate->aggregate.name );
    657                         ret = new StructInstType( buildQualifiers( td ), *td->aggInst.aggregate->aggregate.name );
    658                         break;
    659                   case DeclarationNode::Union:
    660                         ret = new UnionInstType( buildQualifiers( td ), *td->aggInst.aggregate->aggregate.name );
    661                         break;
    662                   case DeclarationNode::Trait:
    663                         ret = new TraitInstType( buildQualifiers( td ), *td->aggInst.aggregate->aggregate.name );
    664                         break;
    665                   default:
    666                         assert( false );
    667                 } // switch
    668         } // if
     701        // ReferenceToType * ret = buildComAggInst( td->aggInst.aggregate, std::list< Attribute * >() );
     702        ReferenceToType * ret = nullptr;
     703        TypeData * type = td->aggInst.aggregate;
     704        switch ( type->kind ) {
     705          case TypeData::Enum: {
     706                  return new EnumInstType( buildQualifiers( type ), *type->enumeration.name );
     707          }
     708          case TypeData::Aggregate: {
     709                  switch ( type->aggregate.kind ) {
     710                        case DeclarationNode::Struct:
     711                          ret = new StructInstType( buildQualifiers( type ), *type->aggregate.name );
     712                          break;
     713                        case DeclarationNode::Union:
     714                          ret = new UnionInstType( buildQualifiers( type ), *type->aggregate.name );
     715                          break;
     716                        case DeclarationNode::Trait:
     717                          ret = new TraitInstType( buildQualifiers( type ), *type->aggregate.name );
     718                          break;
     719                        default:
     720                          assert( false );
     721                  } // switch
     722          }
     723          break;
     724          default:
     725                assert( false );
     726        } // switch
     727
     728        ret->set_hoistType( td->aggInst.hoistType );
    669729        buildList( td->aggInst.params, ret->get_parameters() );
    670730        buildForall( td->forall, ret->get_forall() );
  • TabularUnified src/Parser/TypeData.h

    r24cde55 r43c89a7  
    1010// Created On       : Sat May 16 15:18:36 2015
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Thu Feb 23 15:16:18 2017
    13 // Update Count     : 155
     12// Last Modified On : Thu Feb 23 17:14:46 2017
     13// Update Count     : 158
    1414//
    1515
     
    3838                TypeData * aggregate;
    3939                ExpressionNode * params;
     40                bool hoistType;
    4041        };
    4142
     
    104105ArrayType * buildArray( const TypeData * );
    105106AggregateDecl * buildAggregate( const TypeData *, std::list< Attribute * > );
     107ReferenceToType * buildComAggInst( const TypeData *, std::list< Attribute * > attributes );
    106108ReferenceToType * buildAggInst( const TypeData * );
    107109NamedTypeDecl * buildSymbolic( const TypeData *, const std::string &name, DeclarationNode::StorageClass sc );
Note: See TracChangeset for help on using the changeset viewer.