Changeset b8524ca for src/InitTweak


Ignore:
Timestamp:
Jun 20, 2019, 6:50:42 PM (6 years ago)
Author:
Aaron Moss <a3moss@…>
Branches:
ADT, arm-eh, ast-experimental, enum, forall-pointer-decay, jacob/cs343-translation, jenkins-sandbox, master, new-ast, new-ast-unique-expr, pthread-emulation, qualifiedEnum
Children:
9af00d23
Parents:
234b1cb
Message:

new AST porting

  • mostly InitTweak? autogeneration
  • added some convenience methods
    • nullptr assignment for ast::ptr
    • convenience wrapper ctors for AddressExpr?, CastExpr? that draw location from first arg
Location:
src/InitTweak
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • TabularUnified src/InitTweak/FixInit.cc

    r234b1cb rb8524ca  
    11111111                                                arg2 = new MemberExpr( field, new VariableExpr( params.back() ) );
    11121112                                        }
    1113                                         InitExpander srcParam( arg2 );
     1113                                        InitExpander_old srcParam( arg2 );
    11141114                                        // cast away reference type and construct field.
    11151115                                        Expression * thisExpr = new CastExpr( new VariableExpr( thisParam ), thisParam->get_type()->stripReferences()->clone() );
  • TabularUnified src/InitTweak/GenInit.cc

    r234b1cb rb8524ca  
    1818#include <algorithm>                   // for any_of
    1919#include <cassert>                     // for assert, strict_dynamic_cast, assertf
     20#include <deque>
    2021#include <iterator>                    // for back_inserter, inserter, back_inse...
    2122#include <list>                        // for _List_iterator, list
    2223
     24#include "AST/Decl.hpp"
     25#include "AST/Init.hpp"
     26#include "AST/Node.hpp"
     27#include "AST/Stmt.hpp"
    2328#include "CodeGen/OperatorTable.h"
    2429#include "Common/PassVisitor.h"        // for PassVisitor, WithGuards, WithShort...
     
    274279                assertf( objDecl, "genCtorDtor passed null objDecl" );
    275280                std::list< Statement * > stmts;
    276                 InitExpander srcParam( maybeClone( arg ) );
     281                InitExpander_old srcParam( maybeClone( arg ) );
    277282                SymTab::genImplicitCall( srcParam, new VariableExpr( objDecl ), fname, back_inserter( stmts ), objDecl );
    278283                assert( stmts.size() <= 1 );
     
    286291                std::list< Statement * > dtor;
    287292
    288                 InitExpander srcParam( objDecl->get_init() );
    289                 InitExpander nullParam( (Initializer *)NULL );
     293                InitExpander_old srcParam( objDecl->get_init() );
     294                InitExpander_old nullParam( (Initializer *)NULL );
    290295                SymTab::genImplicitCall( srcParam, new VariableExpr( objDecl ), "?{}", back_inserter( ctor ), objDecl );
    291296                SymTab::genImplicitCall( nullParam, new VariableExpr( objDecl ), "^?{}", front_inserter( dtor ), objDecl, false );
     
    354359        }
    355360
    356 ast::ConstructorInit * genCtorInit( const ast::ObjectDecl * objDecl ) {
    357         #warning unimplemented
    358         (void)objDecl;
    359         assert( false );
     361ast::ConstructorInit * genCtorInit( const CodeLocation & loc, const ast::ObjectDecl * objDecl ) {
     362        // call into genImplicitCall from Autogen.h to generate calls to ctor/dtor for each
     363        // constructable object
     364        InitExpander_new srcParam{ objDecl->init }, nullParam{ (const ast::Init *)nullptr };
     365       
     366        ast::ptr< ast::Stmt > ctor = SymTab::genImplicitCall(
     367                srcParam, new ast::VariableExpr{ loc, objDecl }, loc, "?{}", objDecl );
     368        ast::ptr< ast::Stmt > dtor = SymTab::genImplicitCall(
     369                nullParam, new ast::VariableExpr{ loc, objDecl }, loc, "^?{}", objDecl,
     370                SymTab::LoopBackward );
     371       
     372        // check that either both ctor and dtor are present, or neither
     373        assert( (bool)ctor == (bool)dtor );
     374
     375        if ( ctor ) {
     376                // need to remember init expression, in case no ctors exist. If ctor does exist, want to
     377                // use ctor expression instead of init.
     378                ctor.strict_as< ast::ImplicitCtorDtorStmt >();
     379                dtor.strict_as< ast::ImplicitCtorDtorStmt >();
     380
     381                return new ast::ConstructorInit{ loc, ctor, dtor, objDecl->init };
     382        }
     383
    360384        return nullptr;
    361385}
  • TabularUnified src/InitTweak/GenInit.h

    r234b1cb rb8524ca  
    2020
    2121#include "AST/Fwd.hpp"
     22#include "Common/CodeLocation.h"
    2223#include "GenPoly/ScopedSet.h" // for ScopedSet
    2324#include "SynTree/SynTree.h"   // for Visitor Nodes
     
    3536        /// creates an appropriate ConstructorInit node which contains a constructor, destructor, and C-initializer
    3637        ConstructorInit * genCtorInit( ObjectDecl * objDecl );
    37         ast::ConstructorInit * genCtorInit( const ast::ObjectDecl * objDecl );
     38        ast::ConstructorInit * genCtorInit( const CodeLocation & loc, const ast::ObjectDecl * objDecl );
    3839
    3940        class ManagedTypes {
  • TabularUnified src/InitTweak/InitTweak.cc

    r234b1cb rb8524ca  
    2222
    2323#include "AST/Expr.hpp"
     24#include "AST/Node.hpp"
    2425#include "AST/Stmt.hpp"
    2526#include "AST/Type.hpp"
     
    112113        }
    113114
    114         class InitExpander::ExpanderImpl {
     115std::vector< ast::ptr< ast::Expr > > makeInitList( const ast::Init * init ) {
     116        #warning unimplmented
     117        (void)init;
     118        assert(false);
     119        return {};
     120}
     121
     122        class InitExpander_old::ExpanderImpl {
    115123        public:
    116124                virtual ~ExpanderImpl() = default;
     
    119127        };
    120128
    121         class InitImpl : public InitExpander::ExpanderImpl {
     129        class InitImpl_old : public InitExpander_old::ExpanderImpl {
    122130        public:
    123                 InitImpl( Initializer * init ) : init( init ) {}
    124                 virtual ~InitImpl() = default;
     131                InitImpl_old( Initializer * init ) : init( init ) {}
     132                virtual ~InitImpl_old() = default;
    125133
    126134                virtual std::list< Expression * > next( __attribute((unused)) std::list< Expression * > & indices ) {
     
    136144        };
    137145
    138         class ExprImpl : public InitExpander::ExpanderImpl {
     146        class ExprImpl_old : public InitExpander_old::ExpanderImpl {
    139147        public:
    140                 ExprImpl( Expression * expr ) : arg( expr ) {}
    141                 virtual ~ExprImpl() { delete arg; }
     148                ExprImpl_old( Expression * expr ) : arg( expr ) {}
     149                virtual ~ExprImpl_old() { delete arg; }
    142150
    143151                virtual std::list< Expression * > next( std::list< Expression * > & indices ) {
     
    163171        };
    164172
    165         InitExpander::InitExpander( Initializer * init ) : expander( new InitImpl( init ) ) {}
    166 
    167         InitExpander::InitExpander( Expression * expr ) : expander( new ExprImpl( expr ) ) {}
    168 
    169         std::list< Expression * > InitExpander::operator*() {
     173        InitExpander_old::InitExpander_old( Initializer * init ) : expander( new InitImpl_old( init ) ) {}
     174
     175        InitExpander_old::InitExpander_old( Expression * expr ) : expander( new ExprImpl_old( expr ) ) {}
     176
     177        std::list< Expression * > InitExpander_old::operator*() {
    170178                return cur;
    171179        }
    172180
    173         InitExpander & InitExpander::operator++() {
     181        InitExpander_old & InitExpander_old::operator++() {
    174182                cur = expander->next( indices );
    175183                return *this;
     
    177185
    178186        // use array indices list to build switch statement
    179         void InitExpander::addArrayIndex( Expression * index, Expression * dimension ) {
     187        void InitExpander_old::addArrayIndex( Expression * index, Expression * dimension ) {
    180188                indices.push_back( index );
    181189                indices.push_back( dimension );
    182190        }
    183191
    184         void InitExpander::clearArrayIndices() {
     192        void InitExpander_old::clearArrayIndices() {
    185193                deleteAll( indices );
    186194                indices.clear();
    187195        }
    188196
    189         bool InitExpander::addReference() {
     197        bool InitExpander_old::addReference() {
    190198                bool added = false;
    191199                for ( Expression *& expr : cur ) {
     
    218226
    219227                template< typename OutIterator >
    220                 void build( UntypedExpr * callExpr, InitExpander::IndexList::iterator idx, InitExpander::IndexList::iterator idxEnd, Initializer * init, OutIterator out ) {
     228                void build( UntypedExpr * callExpr, InitExpander_old::IndexList::iterator idx, InitExpander_old::IndexList::iterator idxEnd, Initializer * init, OutIterator out ) {
    221229                        if ( idx == idxEnd ) return;
    222230                        Expression * index = *idx++;
     
    275283        // remaining elements.
    276284        // To accomplish this, generate switch statement, consuming all of expander's elements
    277         Statement * InitImpl::buildListInit( UntypedExpr * dst, std::list< Expression * > & indices ) {
     285        Statement * InitImpl_old::buildListInit( UntypedExpr * dst, std::list< Expression * > & indices ) {
    278286                if ( ! init ) return nullptr;
    279287                CompoundStmt * block = new CompoundStmt();
     
    288296        }
    289297
    290         Statement * ExprImpl::buildListInit( UntypedExpr *, std::list< Expression * > & ) {
     298        Statement * ExprImpl_old::buildListInit( UntypedExpr *, std::list< Expression * > & ) {
    291299                return nullptr;
    292300        }
    293301
    294         Statement * InitExpander::buildListInit( UntypedExpr * dst ) {
     302        Statement * InitExpander_old::buildListInit( UntypedExpr * dst ) {
    295303                return expander->buildListInit( dst, indices );
    296304        }
     305
     306class InitExpander_new::ExpanderImpl {
     307public:
     308        virtual ~ExpanderImpl() = default;
     309        virtual std::vector< ast::ptr< ast::Expr > > next( IndexList & indices ) = 0;
     310        virtual ast::ptr< ast::Stmt > buildListInit(
     311                const ast::UntypedExpr * callExpr, IndexList & indices ) = 0;
     312};
     313
     314namespace {
     315        class InitImpl_new final : public InitExpander_new::ExpanderImpl {
     316                ast::ptr< ast::Init > init;
     317        public:
     318                InitImpl_new( const ast::Init * i ) : init( i ) {}
     319
     320                std::vector< ast::ptr< ast::Expr > > next( InitExpander_new::IndexList & ) override {
     321                        return makeInitList( init );
     322                }
     323               
     324                ast::ptr< ast::Stmt > buildListInit(
     325                        const ast::UntypedExpr * callExpr, InitExpander_new::IndexList & indices
     326                ) override {
     327                        #warning unimplemented
     328                        (void)callExpr; (void)indices;
     329                        assert(false);
     330                        return {};
     331                }
     332        };
     333
     334        class ExprImpl_new final : public InitExpander_new::ExpanderImpl {
     335                ast::ptr< ast::Expr > arg;
     336        public:
     337                ExprImpl_new( const ast::Expr * a ) : arg( a ) {}
     338
     339                std::vector< ast::ptr< ast::Expr > > next(
     340                        InitExpander_new::IndexList & indices
     341                ) override {
     342                        #warning unimplemented
     343                        (void)indices;
     344                        assert(false);
     345                        return {};
     346                }
     347               
     348                ast::ptr< ast::Stmt > buildListInit(
     349                        const ast::UntypedExpr *, InitExpander_new::IndexList &
     350                ) override {
     351                        return {};
     352                }
     353        };
     354} // anonymous namespace
     355
     356InitExpander_new::InitExpander_new( const ast::Init * init )
     357: expander( new InitImpl_new{ init } ), crnt(), indices() {}
     358
     359InitExpander_new::InitExpander_new( const ast::Expr * expr )
     360: expander( new ExprImpl_new{ expr } ), crnt(), indices() {}
     361
     362std::vector< ast::ptr< ast::Expr > > InitExpander_new::operator* () { return crnt; }
     363
     364InitExpander_new & InitExpander_new::operator++ () {
     365        crnt = expander->next( indices );
     366        return *this;
     367}
     368
     369/// builds statement which has the same semantics as a C-style list initializer (for array
     370/// initializers) using callExpr as the base expression to perform initialization
     371ast::ptr< ast::Stmt > InitExpander_new::buildListInit( const ast::UntypedExpr * callExpr ) {
     372        return expander->buildListInit( callExpr, indices );
     373}
     374
     375void InitExpander_new::addArrayIndex( const ast::Expr * index, const ast::Expr * dimension ) {
     376        indices.emplace_back( index );
     377        indices.emplace_back( dimension );
     378}
     379
     380void InitExpander_new::clearArrayIndices() { indices.clear(); }
     381
     382bool InitExpander_new::addReference() {
     383        for ( ast::ptr< ast::Expr > & expr : crnt ) {
     384                expr = new ast::AddressExpr{ expr };
     385        }
     386        return ! crnt.empty();
     387}
    297388
    298389        Type * getTypeofThis( FunctionType * ftype ) {
  • TabularUnified src/InitTweak/InitTweak.h

    r234b1cb rb8524ca  
    4444        /// transform Initializer into an argument list that can be passed to a call expression
    4545        std::list< Expression * > makeInitList( Initializer * init );
     46        std::vector< ast::ptr< ast::Expr > > makeInitList( const ast::Init * init );
    4647
    4748        /// True if the resolver should try to construct dwt
     
    101102        bool isConstExpr( Initializer * init );
    102103
    103         class InitExpander {
     104        class InitExpander_old {
    104105        public:
    105106                // expand by stepping through init to get each list of arguments
    106                 InitExpander( Initializer * init );
     107                InitExpander_old( Initializer * init );
    107108
    108109                // always expand to expr
    109                 InitExpander( Expression * expr );
     110                InitExpander_old( Expression * expr );
    110111
    111112                // iterator-like interface
    112113                std::list< Expression * > operator*();
    113                 InitExpander & operator++();
     114                InitExpander_old & operator++();
    114115
    115116                // builds statement which has the same semantics as a C-style list initializer
     
    130131                IndexList indices;
    131132        };
     133
     134        class InitExpander_new {
     135        public:
     136                using IndexList = std::vector< ast::ptr< ast::Expr > >;
     137                class ExpanderImpl;
     138
     139        private:
     140                std::shared_ptr< ExpanderImpl > expander;
     141                std::vector< ast::ptr< ast::Expr > > crnt;
     142                // invariant: list of size 2N (elements come in pairs [index, dimension])
     143                IndexList indices;
     144
     145        public:
     146                /// Expand by stepping through init to get each list of arguments
     147                InitExpander_new( const ast::Init * init );
     148
     149                /// Always expand to expression
     150                InitExpander_new( const ast::Expr * expr );
     151
     152                std::vector< ast::ptr< ast::Expr > > operator* ();
     153                InitExpander_new & operator++ ();
     154
     155                /// builds statement which has the same semantics as a C-style list initializer (for array
     156                /// initializers) using callExpr as the base expression to perform initialization
     157                ast::ptr< ast::Stmt > buildListInit( const ast::UntypedExpr * callExpr );
     158
     159                void addArrayIndex( const ast::Expr * index, const ast::Expr * dimension );
     160
     161                void clearArrayIndices();
     162
     163                bool addReference();
     164        };
    132165} // namespace
    133166
Note: See TracChangeset for help on using the changeset viewer.