source: src/ResolvExpr/AdjustExprType.cc @ 53449a4

ADTarm-ehast-experimentalenumforall-pointer-decayjacob/cs343-translationnew-ast-unique-exprpthread-emulationqualifiedEnum
Last change on this file since 53449a4 was 3e5dd913, checked in by Fangren Yu <f37yu@…>, 3 years ago

reimplement function type and eliminate deep copy

  • Property mode set to 100644
File size: 6.1 KB
RevLine 
[a32b204]1//
2// Cforall Version 1.0.0 Copyright (C) 2015 University of Waterloo
3//
4// The contents of this file are covered under the licence agreement in the
5// file "LICENCE" distributed with Cforall.
6//
[d57e349]7// AdjustExprType_old.cc --
[a32b204]8//
9// Author           : Richard C. Bilson
10// Created On       : Sat May 16 23:41:42 2015
11// Last Modified By : Peter A. Buhr
[07de76b]12// Last Modified On : Wed Dec 11 21:43:56 2019
13// Update Count     : 6
[834d4fc]14//
[a32b204]15
[d57e349]16#include "AST/Node.hpp"
17#include "AST/Pass.hpp"
18#include "AST/SymbolTable.hpp"
19#include "AST/Type.hpp"
20#include "AST/TypeEnvironment.hpp"
[93fe7141]21#include "Common/PassVisitor.h"
[ea6332d]22#include "SymTab/Indexer.h"       // for Indexer
23#include "SynTree/Declaration.h"  // for TypeDecl, TypeDecl::Kind::Ftype
24#include "SynTree/Mutator.h"      // for Mutator
25#include "SynTree/Type.h"         // for PointerType, TypeInstType, Type
26#include "TypeEnvironment.h"      // for EqvClass, TypeEnvironment
[51b7345]27
28namespace ResolvExpr {
[d57e349]29
30namespace {
31        class AdjustExprType_old final : public WithShortCircuiting {
32                public:
33                AdjustExprType_old( const TypeEnvironment & env, const SymTab::Indexer & indexer );
[93fe7141]34                void premutate( VoidType * ) { visit_children = false; }
35                void premutate( BasicType * ) { visit_children = false; }
36                void premutate( PointerType * ) { visit_children = false; }
[954ef5b]37                void premutate( ArrayType * ) { visit_children = false; }
[93fe7141]38                void premutate( FunctionType * ) { visit_children = false; }
39                void premutate( StructInstType * ) { visit_children = false; }
40                void premutate( UnionInstType * ) { visit_children = false; }
41                void premutate( EnumInstType * ) { visit_children = false; }
42                void premutate( TraitInstType * ) { visit_children = false; }
43                void premutate( TypeInstType * ) { visit_children = false; }
44                void premutate( TupleType * ) { visit_children = false; }
45                void premutate( VarArgsType * ) { visit_children = false; }
46                void premutate( ZeroType * ) { visit_children = false; }
47                void premutate( OneType * ) { visit_children = false; }
48
[ef5b828]49                Type * postmutate( ArrayType * arrayType );
50                Type * postmutate( FunctionType * functionType );
51                Type * postmutate( TypeInstType * aggregateUseType );
[a32b204]52
[d57e349]53                private:
[c20b0fea]54                const TypeEnvironment & env;
55                const SymTab::Indexer & indexer;
[a32b204]56        };
57
[d57e349]58        AdjustExprType_old::AdjustExprType_old( const TypeEnvironment &env, const SymTab::Indexer &indexer )
[a32b204]59                : env( env ), indexer( indexer ) {
60        }
61
[d57e349]62        Type * AdjustExprType_old::postmutate( ArrayType * arrayType ) {
[ef5b828]63                PointerType * pointerType = new PointerType{ arrayType->get_qualifiers(), arrayType->base };
[93fe7141]64                arrayType->base = nullptr;
[a32b204]65                delete arrayType;
66                return pointerType;
67        }
68
[d57e349]69        Type * AdjustExprType_old::postmutate( FunctionType * functionType ) {
[00ac42e]70                return new PointerType{ Type::Qualifiers(), functionType };
[a32b204]71        }
72
[d57e349]73        Type * AdjustExprType_old::postmutate( TypeInstType * typeInst ) {
[ef5b828]74                if ( const EqvClass * eqvClass = env.lookup( typeInst->get_name() ) ) {
[00ac42e]75                        if ( eqvClass->data.kind == TypeDecl::Ftype ) {
76                                return new PointerType{ Type::Qualifiers(), typeInst };
[a32b204]77                        }
[ef5b828]78                } else if ( const NamedTypeDecl * ntDecl = indexer.lookupType( typeInst->get_name() ) ) {
79                        if ( const TypeDecl * tyDecl = dynamic_cast< const TypeDecl * >( ntDecl ) ) {
[a32b204]80                                if ( tyDecl->get_kind() == TypeDecl::Ftype ) {
[00ac42e]81                                        return new PointerType{ Type::Qualifiers(), typeInst };
[a32b204]82                                } // if
83                        } // if
84                } // if
85                return typeInst;
86        }
[d57e349]87} // anonymous namespace
88
89void adjustExprType( Type *&type, const TypeEnvironment &env, const SymTab::Indexer &indexer ) {
90        PassVisitor<AdjustExprType_old> adjuster( env, indexer );
[ef5b828]91        Type * newType = type->acceptMutator( adjuster );
[d57e349]92        type = newType;
93}
94
95void adjustExprType( Type *& type ) {
96        TypeEnvironment env;
97        SymTab::Indexer indexer;
98        adjustExprType( type, env, indexer );
99}
100
101namespace {
[9ea38de]102        class AdjustExprType_new final : public ast::WithShortCircuiting {
[d57e349]103                const ast::SymbolTable & symtab;
[9ea38de]104        public:
105                const ast::TypeEnvironment & tenv;
[d57e349]106
107                AdjustExprType_new( const ast::TypeEnvironment & e, const ast::SymbolTable & syms )
[9ea38de]108                : symtab( syms ), tenv( e ) {}
[d57e349]109
[6be3b7d6]110                void previsit( const ast::VoidType * ) { visit_children = false; }
111                void previsit( const ast::BasicType * ) { visit_children = false; }
112                void previsit( const ast::PointerType * ) { visit_children = false; }
113                void previsit( const ast::ArrayType * ) { visit_children = false; }
114                void previsit( const ast::FunctionType * ) { visit_children = false; }
115                void previsit( const ast::StructInstType * ) { visit_children = false; }
116                void previsit( const ast::UnionInstType * ) { visit_children = false; }
117                void previsit( const ast::EnumInstType * ) { visit_children = false; }
118                void previsit( const ast::TraitInstType * ) { visit_children = false; }
119                void previsit( const ast::TypeInstType * ) { visit_children = false; }
120                void previsit( const ast::TupleType * ) { visit_children = false; }
121                void previsit( const ast::VarArgsType * ) { visit_children = false; }
122                void previsit( const ast::ZeroType * ) { visit_children = false; }
123                void previsit( const ast::OneType * ) { visit_children = false; }
124
125                const ast::Type * postvisit( const ast::ArrayType * at ) {
[d57e349]126                        return new ast::PointerType{ at->base, at->qualifiers };
127                }
128
[6be3b7d6]129                const ast::Type * postvisit( const ast::FunctionType * ft ) {
[d57e349]130                        return new ast::PointerType{ ft };
131                }
132
[6be3b7d6]133                const ast::Type * postvisit( const ast::TypeInstType * inst ) {
[d57e349]134                        // replace known function-type-variables with pointer-to-function
[3e5dd913]135                        if ( const ast::EqvClass * eqvClass = tenv.lookup( *inst ) ) {
[07de76b]136                                if ( eqvClass->data.kind == ast::TypeDecl::Ftype ) {
[d57e349]137                                        return new ast::PointerType{ inst };
138                                }
139                        } else if ( const ast::NamedTypeDecl * ntDecl = symtab.lookupType( inst->name ) ) {
140                                if ( auto tyDecl = dynamic_cast< const ast::TypeDecl * >( ntDecl ) ) {
[07de76b]141                                        if ( tyDecl->kind == ast::TypeDecl::Ftype ) {
[d57e349]142                                                return new ast::PointerType{ inst };
143                                        }
144                                }
145                        }
146                        return inst;
147                }
148        };
149} // anonymous namespace
150
[ef5b828]151const ast::Type * adjustExprType(
152        const ast::Type * type, const ast::TypeEnvironment & env, const ast::SymbolTable & symtab
[d57e349]153) {
154        ast::Pass<AdjustExprType_new> adjuster{ env, symtab };
155        return type->accept( adjuster );
156}
157
[51b7345]158} // namespace ResolvExpr
[a32b204]159
160// Local Variables: //
161// tab-width: 4 //
162// mode: c++ //
163// compile-command: "make install" //
164// End: //
Note: See TracBrowser for help on using the repository browser.