Ignore:
Timestamp:
Jun 29, 2018, 4:14:15 PM (6 years ago)
Author:
Aaron Moss <a3moss@…>
Branches:
new-env
Children:
184557e
Parents:
97397a26 (diff), 28f3a19 (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 remote-tracking branch 'origin/with_gc' into new-env

File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/ResolvExpr/TypeEnvironment.cc

    r97397a26 rb21c77a  
    77// TypeEnvironment.cc --
    88//
    9 // Author           : Richard C. Bilson
     9// Author           : Aaron B. Moss
    1010// Created On       : Sun May 17 12:19:47 2015
    11 // Last Modified By : Peter A. Buhr
    12 // Last Modified On : Sun May 17 12:23:36 2015
    13 // Update Count     : 3
     11// Last Modified By : Aaron B. Moss
     12// Last Modified On : Fri Jun 29 15:51:00 2018
     13// Update Count     : 5
    1414//
    1515
     
    2727#include "SynTree/TypeSubstitution.h"  // for TypeSubstitution
    2828#include "TypeEnvironment.h"
     29#include "typeops.h"                   // for occurs
    2930#include "Unify.h"                     // for unifyInexact
    3031
     
    5051#if 0
    5152        void EqvClass::initialize( const EqvClass &src, EqvClass &dest ) {
     53                initialize( src, dest, src.type );
     54        }
     55
     56        void EqvClass::initialize( const EqvClass &src, EqvClass &dest, const Type *ty ) {
    5257                dest.vars = src.vars;
    53                 dest.type = maybeClone( src.type );
     58                dest.type = maybeClone( ty );
    5459                dest.allowWidening = src.allowWidening;
    5560                dest.data = src.data;
    5661        }
    5762
    58         EqvClass::EqvClass() : vars(), type( 0 ), allowWidening( true ), data() {}
    59 
    60         EqvClass::EqvClass( std::vector<interned_string>&& vs, BoundType&& bound )
    61                 : vars( vs.begin(), vs.end() ), type( maybeClone( bound.type ) ),
    62                   allowWidening( bound.allowWidening ), data( bound.data ) {}
     63        EqvClass::EqvClass() : type( nullptr ), allowWidening( true ) {
     64        }
    6365
    6466        EqvClass::EqvClass( const EqvClass &other ) {
    6567                initialize( other, *this );
     68        }
     69
     70        EqvClass::EqvClass( const EqvClass &other, const Type *ty ) {
     71                initialize( other, *this, ty );
     72        }
     73
     74        EqvClass::EqvClass( EqvClass &&other )
     75        : vars{std::move(other.vars)}, type{other.type},
     76          allowWidening{std::move(other.allowWidening)}, data{std::move(other.data)} {
     77                  other.type = nullptr;
    6678        }
    6779
     
    7183                return *this;
    7284        }
     85
     86        EqvClass &EqvClass::operator=( EqvClass &&other ) {
     87                if ( this == &other ) return *this;
     88               
     89                vars = std::move(other.vars);
     90                type = other.type;
     91                allowWidening = std::move(other.allowWidening);
     92                data = std::move(other.data);
     93
     94                return *this;
     95        }
     96
     97        void EqvClass::set_type( Type* ty ) { type = ty; }
    7398
    7499        void EqvClass::print( std::ostream &os, Indenter indent ) const {
     
    88113        const EqvClass* TypeEnvironment::lookup( const std::string &var ) const {
    89114                for ( std::list< EqvClass >::const_iterator i = env.begin(); i != env.end(); ++i ) {
    90                         if ( i->vars.find( var ) != i->vars.end() ) {
    91 ///       std::cout << var << " is in class ";
    92 ///       i->print( std::cout );
    93                                 return &*i;
    94                         }
    95 ///     std::cout << var << " is not in class ";
    96 ///     i->print( std::cout );
     115                        if ( i->vars.find( var ) != i->vars.end() ) return &*i;
    97116                } // for
    98117                return nullptr;
     
    118137                if ( root ) return { this, root };
    119138                else return { nullptr, var };
     139        }
     140
     141        bool isFtype( Type *type ) {
     142                if ( dynamic_cast< FunctionType* >( type ) ) {
     143                        return true;
     144                } else if ( TypeInstType *typeInst = dynamic_cast< TypeInstType* >( type ) ) {
     145                        return typeInst->get_isFtype();
     146                } // if
     147                return false;
    120148        }
    121149
     
    288316        }
    289317
    290         void TypeEnvironment::add( const EqvClass &eqvClass ) {
    291                 filterOverlappingClasses( env, eqvClass );
    292                 env.push_back( eqvClass );
    293         }
    294 
    295318        void TypeEnvironment::add( EqvClass &&eqvClass ) {
    296319                filterOverlappingClasses( env, eqvClass );
     
    303326                        newClass.vars.insert( (*i)->get_name() );
    304327                        newClass.data = TypeDecl::Data{ (*i) };
    305                         env.push_back( newClass );
     328                        env.push_back( std::move(newClass) );
    306329                } // for
    307330        }
     
    317340                        // transition to TypeSubstitution
    318341                        newClass.data = TypeDecl::Data{ TypeDecl::Dtype, false };
    319                         add( newClass );
     342                        add( std::move(newClass) );
    320343                }
    321344        }
     
    324347                for ( std::list< EqvClass >::const_iterator theClass = env.begin(); theClass != env.end(); ++theClass ) {
    325348                        for ( std::set< std::string >::const_iterator theVar = theClass->vars.begin(); theVar != theClass->vars.end(); ++theVar ) {
    326 ///       std::cerr << "adding " << *theVar;
    327349                                if ( theClass->type ) {
    328 ///         std::cerr << " bound to ";
    329 ///         theClass->type->print( std::cerr );
    330 ///         std::cerr << std::endl;
    331350                                        sub.add( *theVar, theClass->type );
    332351                                } else if ( theVar != theClass->vars.begin() ) {
    333352                                        TypeInstType *newTypeInst = new TypeInstType( Type::Qualifiers(), *theClass->vars.begin(), theClass->data.kind == TypeDecl::Ftype );
    334 ///         std::cerr << " bound to variable " << *theClass->vars.begin() << std::endl;
    335353                                        sub.add( *theVar, newTypeInst );
    336354                                } // if
    337355                        } // for
    338356                } // for
    339 ///   std::cerr << "input env is:" << std::endl;
    340 ///   print( std::cerr, 8 );
    341 ///   std::cerr << "sub is:" << std::endl;
    342 ///   sub.print( std::cerr, 8 );
    343357                sub.normalize();
    344358        }
    345359
    346360        void TypeEnvironment::print( std::ostream &os, Indenter indent ) const {
    347                 for ( std::list< EqvClass >::const_iterator i = env.begin(); i != env.end(); ++i ) {
    348                         i->print( os, indent );
     361                for ( const EqvClass & theClass : env ) {
     362                        theClass.print( os, indent );
    349363                } // for
    350364        }
     
    352366        std::list< EqvClass >::iterator TypeEnvironment::internal_lookup( const std::string &var ) {
    353367                for ( std::list< EqvClass >::iterator i = env.begin(); i != env.end(); ++i ) {
    354                         if ( i->vars.find( var ) == i->vars.end() ) {
    355                                 return i;
    356                         } // if
     368                        if ( i->vars.count( var ) ) return i;
    357369                } // for
    358370                return env.end();
Note: See TracChangeset for help on using the changeset viewer.