Changeset cb98d9d for src/Parser/TypeData.cc
- Timestamp:
- Apr 8, 2024, 11:57:37 AM (21 months ago)
- Branches:
- master
- Children:
- 485cf59, dd37afa
- Parents:
- d3a49864 (diff), d9bad51 (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/Parser/TypeData.cc (modified) (5 diffs)
Legend:
- Unmodified
- Added
- Removed
-
src/Parser/TypeData.cc
rd3a49864 rcb98d9d 475 475 476 476 477 // Wrap an aggregate up in an instance. Takes and gives ownership. 478 static TypeData * makeInstance( TypeData * type ) { 479 assert( TypeData::Aggregate == type->kind ); 480 TypeData * out = new TypeData( TypeData::AggregateInst ); 481 out->aggInst.aggregate = type; 482 out->aggInst.params = maybeCopy( type->aggregate.actuals ); 483 out->aggInst.hoistType = type->aggregate.body; 484 out->qualifiers |= type->qualifiers; 485 return out; 486 } 487 488 477 489 TypeData * build_type_qualifier( ast::CV::Qualifiers tq ) { 478 490 TypeData * type = new TypeData; … … 564 576 565 577 // Takes ownership of all arguments, gives ownership of return value. 566 TypeData * addQualifiers( TypeData * ltype, TypeData * rtype ) { 567 if ( ltype->forall ) { 568 if ( rtype->forall ) { 569 rtype->forall->set_last( ltype->forall ); 570 } else if ( TypeData::Aggregate != rtype->kind ) { 571 rtype->forall = ltype->forall; 572 } else if ( rtype->aggregate.params ) { 573 rtype->aggregate.params->set_last( ltype->forall ); 578 TypeData * addQualifiers( TypeData * dst, TypeData * src ) { 579 if ( src->forall ) { 580 if ( dst->forall || TypeData::Aggregate != dst->kind ) { 581 extend( dst->forall, src->forall ); 574 582 } else { 575 rtype->aggregate.params = ltype->forall;583 extend( dst->aggregate.params, src->forall ); 576 584 } 577 ltype->forall = nullptr;585 src->forall = nullptr; 578 586 } 579 587 580 addQualifiersToType( rtype, ltype);581 return rtype;588 addQualifiersToType( dst, src ); 589 return dst; 582 590 } 583 591 … … 585 593 static void addTypeToType( TypeData *& dst, TypeData *& src ) { 586 594 if ( src->forall && dst->kind == TypeData::Function ) { 587 if ( dst->forall ) { 588 dst->forall->set_last( src->forall ); 589 } else { 590 dst->forall = src->forall; 591 } // if 595 extend( dst->forall, src->forall ); 592 596 src->forall = nullptr; 593 597 } // if … … 641 645 break; 642 646 default: 643 switch ( src->kind ) { 644 case TypeData::Aggregate: 645 dst->base = new TypeData( TypeData::AggregateInst ); 646 dst->base->aggInst.aggregate = src; 647 if ( src->kind == TypeData::Aggregate ) { 648 dst->base->aggInst.params = maybeCopy( src->aggregate.actuals ); 649 } // if 650 dst->base->qualifiers |= src->qualifiers; 651 src = nullptr; 652 break; 653 default: 654 if ( dst->forall ) { 655 dst->forall->set_last( src->forall ); 656 } else { 657 dst->forall = src->forall; 658 } // if 647 if ( TypeData::Aggregate == src->kind ) { 648 dst->base = makeInstance( src ); 649 } else { 650 extend( dst->forall, src->forall ); 659 651 src->forall = nullptr; 660 652 dst->base = src; 661 src = nullptr;662 } // switch653 } 654 src = nullptr; 663 655 } // switch 664 656 } 665 657 666 658 // Takes ownership of all arguments, gives ownership of return value. 667 TypeData * addType( TypeData * ltype, TypeData * rtype, std::vector<ast::ptr<ast::Attribute>> & attributes ) { 668 if ( rtype ) { 669 addTypeToType( rtype, ltype ); 670 return rtype; 659 TypeData * addType( TypeData * dst, TypeData * src, std::vector<ast::ptr<ast::Attribute>> & attributes ) { 660 if ( dst ) { 661 addTypeToType( dst, src ); 662 } else if ( src->kind == TypeData::Aggregate ) { 663 // Hide type information aggregate instances. 664 dst = makeInstance( src ); 665 dst->aggInst.aggregate->aggregate.attributes.swap( attributes ); 671 666 } else { 672 if ( ltype->kind == TypeData::Aggregate ) { 673 // Hide type information aggregate instances. 674 rtype = new TypeData( TypeData::AggregateInst ); 675 rtype->aggInst.aggregate = ltype; 676 rtype->aggInst.aggregate->aggregate.attributes.swap( attributes ); // change ownership 677 rtype->aggInst.hoistType = ltype->aggregate.body; 678 rtype->aggInst.params = maybeCopy( ltype->aggregate.actuals ); 679 rtype->qualifiers |= ltype->qualifiers; 680 } else { 681 rtype = ltype; 682 } // if 683 return rtype; 667 dst = src; 684 668 } // if 685 } 686 687 TypeData * addType( TypeData * ltype, TypeData * rtype ) { 669 return dst; 670 } 671 672 TypeData * addType( TypeData * dst, TypeData * src ) { 688 673 std::vector<ast::ptr<ast::Attribute>> attributes; 689 return addType( ltype, rtype, attributes );674 return addType( dst, src, attributes ); 690 675 } 691 676 … … 713 698 714 699 TypeData * makeNewBase( TypeData * type ) { 715 switch ( type->kind ) { 716 case TypeData::Aggregate: { 717 TypeData * out = new TypeData( TypeData::AggregateInst ); 718 out->aggInst.aggregate = type; 719 if ( TypeData::Aggregate == type->kind ) { 720 out->aggInst.params = maybeCopy( type->aggregate.actuals ); 721 } 722 out->qualifiers |= type->qualifiers; 723 return out; 724 } 725 default: 726 return type; 727 } // switch 700 return ( TypeData::Aggregate == type->kind ) ? makeInstance( type ) : type; 728 701 } 729 702
Note:
See TracChangeset
for help on using the changeset viewer.