Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/ResolvExpr/PolyCost.cc

    rc6b4432 rbccd70a  
    1818#include "AST/Type.hpp"
    1919#include "AST/TypeEnvironment.hpp"
     20#include "Common/PassVisitor.h"
     21#include "SymTab/Indexer.h"   // for Indexer
     22#include "SynTree/Type.h"     // for TypeInstType, Type
     23#include "TypeEnvironment.h"  // for EqvClass, TypeEnvironment
    2024
    2125namespace ResolvExpr {
     26        struct PolyCost {
     27                PolyCost( const TypeEnvironment &env, const SymTab::Indexer &indexer );
     28
     29                void previsit( TypeInstType * aggregateUseType );
     30                int result;
     31                const TypeEnvironment &tenv;
     32                const SymTab::Indexer &indexer;
     33        };
     34
     35        int polyCost( Type *type, const TypeEnvironment & env, const SymTab::Indexer &indexer ) {
     36                PassVisitor<PolyCost> coster( env, indexer );
     37                type->accept( coster );
     38                return (coster.pass.result > 0) ? 1 : 0;
     39        }
     40
     41        PolyCost::PolyCost( const TypeEnvironment & env, const SymTab::Indexer & indexer ) : result( 0 ), tenv( env ), indexer( indexer ) {
     42        }
     43
     44        void PolyCost::previsit(TypeInstType * typeInst) {
     45                if ( const EqvClass *eqvClass = tenv.lookup( typeInst->name ) ) {
     46                        if ( eqvClass->type ) {
     47                                if ( TypeInstType * otherTypeInst = dynamic_cast< TypeInstType* >( eqvClass->type ) ) {
     48                                        if ( indexer.lookupType( otherTypeInst->name ) ) {
     49                                                // bound to opaque type
     50                                                result += 1;
     51                                        } // if
     52                                } else {
     53                                        // bound to concrete type
     54                                        result += 1;
     55                                } // if
     56                        } // if
     57                } // if
     58        }
    2259
    2360// TODO: When the old PolyCost is torn out get rid of the _new suffix.
Note: See TracChangeset for help on using the changeset viewer.