Changeset a085470 for src/ResolvExpr


Ignore:
Timestamp:
Apr 10, 2023, 12:03:31 PM (3 years ago)
Author:
Mike Brooks <mlbrooks@…>
Branches:
ADT, ast-experimental, master
Children:
6adeb5f
Parents:
2b01f8e (diff), ea2759b (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.
Message:

Merge branch 'master' of plg.uwaterloo.ca:software/cfa/cfa-cc

Location:
src/ResolvExpr
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • src/ResolvExpr/CurrentObject.cc

    r2b01f8e ra085470  
    99// Author           : Rob Schluntz
    1010// Created On       : Tue Jun 13 15:28:32 2017
    11 // Last Modified By : Peter A. Buhr
    12 // Last Modified On : Fri Jul  1 09:16:01 2022
    13 // Update Count     : 15
     11// Last Modified By : Andrew Beach
     12// Last Modified On : Mon Apr 10  9:40:00 2023
     13// Update Count     : 18
    1414//
    1515
     
    593593
    594594namespace ast {
     595        /// Iterates members of a type by initializer.
     596        class MemberIterator {
     597        public:
     598                virtual ~MemberIterator() {}
     599
     600                /// Internal set position based on iterator ranges.
     601                virtual void setPosition(
     602                        std::deque< ptr< Expr > >::const_iterator it,
     603                        std::deque< ptr< Expr > >::const_iterator end ) = 0;
     604
     605                /// Walks the current object using the given designators as a guide.
     606                void setPosition( const std::deque< ptr< Expr > > & designators ) {
     607                        setPosition( designators.begin(), designators.end() );
     608                }
     609
     610                /// Retrieve the list of possible (Type,Designation) pairs for the
     611                /// current position in the current object.
     612                virtual std::deque< InitAlternative > operator* () const = 0;
     613
     614                /// True if the iterator is not currently at the end.
     615                virtual operator bool() const = 0;
     616
     617                /// Moves the iterator by one member in the current object.
     618                virtual MemberIterator & bigStep() = 0;
     619
     620                /// Moves the iterator by one member in the current subobject.
     621                virtual MemberIterator & smallStep() = 0;
     622
     623                /// The type of the current object.
     624                virtual const Type * getType() = 0;
     625
     626                /// The type of the current subobject.
     627                virtual const Type * getNext() = 0;
     628
     629                /// Helper for operator*; aggregates must add designator to each init
     630                /// alternative, but adding designators in operator* creates duplicates.
     631                virtual std::deque< InitAlternative > first() const = 0;
     632        };
     633
    595634        /// create a new MemberIterator that traverses a type correctly
    596635        MemberIterator * createMemberIterator( const CodeLocation & loc, const Type * type );
     
    684723
    685724                void setPosition(
    686                         std::deque< ptr< Expr > >::const_iterator begin,
    687                         std::deque< ptr< Expr > >::const_iterator end
     725                        std::deque<ast::ptr<ast::Expr>>::const_iterator begin,
     726                        std::deque<ast::ptr<ast::Expr>>::const_iterator end
    688727                ) override {
    689728                        if ( begin == end ) return;
     
    898937        };
    899938
    900         class TupleIterator final : public AggregateIterator {
    901         public:
    902                 TupleIterator( const CodeLocation & loc, const TupleType * inst )
    903                 : AggregateIterator(
    904                         loc, "TupleIterator", toString("Tuple", inst->size()), inst, inst->members
    905                 ) {}
     939        /// Iterates across the positions in a tuple:
     940        class TupleIterator final : public MemberIterator {
     941                CodeLocation location;
     942                ast::TupleType const * const tuple;
     943                size_t index = 0;
     944                size_t size = 0;
     945                std::unique_ptr<MemberIterator> sub_iter;
     946
     947                const ast::Type * typeAtIndex() const {
     948                        assert( index < size );
     949                        return tuple->types[ index ].get();
     950                }
     951
     952        public:
     953                TupleIterator( const CodeLocation & loc, const TupleType * type )
     954                : location( loc ), tuple( type ), size( type->size() ) {
     955                        PRINT( std::cerr << "Creating tuple iterator: " << type << std::endl; )
     956                        sub_iter.reset( createMemberIterator( loc, typeAtIndex() ) );
     957                }
     958
     959                void setPosition( const ast::Expr * expr ) {
     960                        auto arg = eval( expr );
     961                        index = arg.first;
     962                }
     963
     964                void setPosition(
     965                                std::deque< ptr< Expr > >::const_iterator begin,
     966                                std::deque< ptr< Expr > >::const_iterator end ) {
     967                        if ( begin == end ) return;
     968
     969                        setPosition( *begin );
     970                        sub_iter->setPosition( ++begin, end );
     971                }
     972
     973                std::deque< InitAlternative > operator*() const override {
     974                        return first();
     975                }
    906976
    907977                operator bool() const override {
    908                         return curMember != members.end() || (memberIter && *memberIter);
     978                        return index < size;
    909979                }
    910980
    911981                TupleIterator & bigStep() override {
    912                         PRINT( std::cerr << "bigStep in " << kind << std::endl; )
    913                         atbegin = false;
    914                         memberIter = nullptr;
    915                         curType = nullptr;
    916                         while ( curMember != members.end() ) {
    917                                 ++curMember;
    918                                 if ( init() ) return *this;
    919                         }
     982                        ++index;
     983                        sub_iter.reset( index < size ?
     984                                createMemberIterator( location, typeAtIndex() ) : nullptr );
    920985                        return *this;
     986                }
     987
     988                TupleIterator & smallStep() override {
     989                        if ( sub_iter ) {
     990                                PRINT( std::cerr << "has member iter: " << *sub_iter << std::endl; )
     991                                sub_iter->smallStep();
     992                                if ( !sub_iter ) {
     993                                        PRINT( std::cerr << "has valid member iter" << std::endl; )
     994                                        return *this;
     995                                }
     996                        }
     997                        return bigStep();
     998                }
     999
     1000                const ast::Type * getType() override {
     1001                        return tuple;
     1002                }
     1003
     1004                const ast::Type * getNext() override {
     1005                        return ( sub_iter && *sub_iter ) ? sub_iter->getType() : nullptr;
     1006                }
     1007
     1008                std::deque< InitAlternative > first() const override {
     1009                        PRINT( std::cerr << "first in TupleIterator (" << index << "/" << size << ")" << std::endl; )
     1010                        if ( sub_iter && *sub_iter ) {
     1011                                std::deque< InitAlternative > ret = sub_iter->first();
     1012                                for ( InitAlternative & alt : ret ) {
     1013                                        alt.designation.get_and_mutate()->designators.emplace_front(
     1014                                                ConstantExpr::from_ulong( location, index ) );
     1015                                }
     1016                                return ret;
     1017                        }
     1018                        return {};
    9211019                }
    9221020        };
  • src/ResolvExpr/CurrentObject.h

    r2b01f8e ra085470  
    99// Author           : Rob Schluntz
    1010// Created On       : Thu Jun  8 11:07:25 2017
    11 // Last Modified By : Peter A. Buhr
    12 // Last Modified On : Sat Jul 22 09:36:48 2017
    13 // Update Count     : 3
     11// Last Modified By : Andrew Beach
     12// Last Modified On : Thu Apr  6 16:14:00 2023
     13// Update Count     : 4
    1414//
    1515
     
    6565
    6666        /// Iterates members of a type by initializer
    67         class MemberIterator {
    68         public:
    69                 virtual ~MemberIterator() {}
    70 
    71                 /// Internal set position based on iterator ranges
    72                 virtual void setPosition(
    73                         std::deque< ptr< Expr > >::const_iterator it,
    74                         std::deque< ptr< Expr > >::const_iterator end ) = 0;
    75 
    76                 /// walks the current object using the given designators as a guide
    77                 void setPosition( const std::deque< ptr< Expr > > & designators ) {
    78                         setPosition( designators.begin(), designators.end() );
    79                 }
    80 
    81                 /// retrieve the list of possible (Type,Designation) pairs for the current position in the
    82                 /// current object
    83                 virtual std::deque< InitAlternative > operator* () const = 0;
    84 
    85                 /// true if the iterator is not currently at the end
    86                 virtual operator bool() const = 0;
    87 
    88                 /// moves the iterator by one member in the current object
    89                 virtual MemberIterator & bigStep() = 0;
    90 
    91                 /// moves the iterator by one member in the current subobject
    92                 virtual MemberIterator & smallStep() = 0;
    93 
    94                 /// the type of the current object
    95                 virtual const Type * getType() = 0;
    96 
    97                 /// the type of the current subobject
    98                 virtual const Type * getNext() = 0;
    99        
    100                 /// helper for operator*; aggregates must add designator to each init alternative, but
    101                 /// adding designators in operator* creates duplicates
    102                 virtual std::deque< InitAlternative > first() const = 0;
    103         };
     67        class MemberIterator;
    10468
    10569        /// Builds initializer lists in resolution
Note: See TracChangeset for help on using the changeset viewer.