Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/InitTweak/InitTweak.h

    r0bd3faf re01eb4a  
    2222
    2323#include "AST/Fwd.hpp"        // for AST nodes
     24#include "SynTree/SynTree.h"  // for Visitor Nodes
    2425
    2526// helper functions for initialization
    2627namespace InitTweak {
     28        const FunctionDecl * isAssignment( const Declaration * decl );
     29        const FunctionDecl * isDestructor( const Declaration * decl );
     30        const FunctionDecl * isDefaultConstructor( const Declaration * decl );
     31        const FunctionDecl * isCopyConstructor( const Declaration * decl );
     32        const FunctionDecl * isCopyFunction( const Declaration * decl, const std::string & fname );
    2733        bool isAssignment( const ast::FunctionDecl * decl );
    2834        bool isDestructor( const ast::FunctionDecl * decl );
     
    3238
    3339        /// returns the base type of the first parameter to a constructor/destructor/assignment function
     40        Type * getTypeofThis( FunctionType * ftype );
    3441        const ast::Type * getTypeofThis( const ast::FunctionType * ftype );
    3542
    3643        /// returns the first parameter of a constructor/destructor/assignment function
     44        ObjectDecl * getParamThis( FunctionType * ftype );
    3745        const ast::ObjectDecl * getParamThis(const ast::FunctionDecl * func);
    3846
    3947        /// generate a bitwise assignment operation.
     48        ApplicationExpr * createBitwiseAssignment( Expression * dst, Expression * src );
     49
    4050        ast::Expr * createBitwiseAssignment( const ast::Expr * dst, const ast::Expr * src);
    4151
    4252        /// transform Initializer into an argument list that can be passed to a call expression
     53        std::list< Expression * > makeInitList( Initializer * init );
    4354        std::vector< ast::ptr< ast::Expr > > makeInitList( const ast::Init * init );
    4455
    4556        /// True if the resolver should try to construct dwt
     57        bool tryConstruct( DeclarationWithType * dwt );
    4658        bool tryConstruct( const ast::DeclWithType * dwt );
    4759
    4860        /// True if the type can have a user-defined constructor
     61        bool isConstructable( Type * t );
    4962        bool isConstructable( const ast::Type * t );
    5063
    5164        /// True if the Initializer contains designations
     65        bool isDesignated( Initializer * init );
    5266        bool isDesignated( const ast::Init * init );
    5367
    5468        /// True if the ObjectDecl's Initializer nesting level is not deeper than the depth of its
    5569        /// type, where the depth of its type is the number of nested ArrayTypes + 1
     70        bool checkInitDepth( ObjectDecl * objDecl );
    5671        bool checkInitDepth( const ast::ObjectDecl * objDecl );
     72
     73        /// returns the declaration of the function called by the expr (must be ApplicationExpr or UntypedExpr)
     74        DeclarationWithType * getFunction( Expression * expr );
     75        const DeclarationWithType * getFunction( const Expression * expr );
     76
     77        /// Non-Null if expr is a call expression whose target function is intrinsic
     78        ApplicationExpr * isIntrinsicCallExpr( Expression * expr );
    5779
    5880        /// True if stmt is a call statement where the function called is intrinsic and takes one parameter.
    5981        /// Intended to be used for default ctor/dtor calls, but might have use elsewhere.
    6082        /// Currently has assertions that make it less than fully general.
     83        bool isIntrinsicSingleArgCallStmt( Statement * stmt );
    6184        bool isIntrinsicSingleArgCallStmt( const ast::Stmt * stmt );
    6285
     86        /// True if stmt is a call statement where the function called is intrinsic.
     87        bool isIntrinsicCallStmt( Statement * stmt );
     88
    6389        /// get all Ctor/Dtor call expressions from a Statement
     90        void collectCtorDtorCalls( Statement * stmt, std::list< Expression * > & matches );
    6491        std::vector< const ast::Expr * > collectCtorDtorCalls( const ast::Stmt * stmt );
    6592
     93        /// get the Ctor/Dtor call expression from a Statement that looks like a generated ctor/dtor call
     94        Expression * getCtorDtorCall( Statement * stmt );
     95
     96        /// returns the name of the function being called
     97        std::string getFunctionName( Expression * expr );
     98
     99        /// returns the argument to a call expression in position N indexed from 0
     100        Expression *& getCallArg( Expression * callExpr, unsigned int pos );
     101
     102        /// returns the base type of a PointerType or ArrayType, else returns NULL
     103        Type * getPointerBase( Type * );
     104
     105        /// returns the argument if it is a PointerType or ArrayType, else returns NULL
     106        Type * isPointerType( Type * );
     107
    66108        /// returns true if expr is trivially a compile-time constant
     109        bool isConstExpr( Expression * expr );
     110        bool isConstExpr( Initializer * init );
     111
    67112        bool isConstExpr( const ast::Expr * expr );
    68113        bool isConstExpr( const ast::Init * init );
     
    77122        ///    .section .data#,"a"
    78123        /// to avoid assembler warning "ignoring changed section attributes for .data"
     124        void addDataSectionAttribute( ObjectDecl * objDecl );
     125
    79126        void addDataSectionAttribute( ast::ObjectDecl * objDecl );
    80127
    81         class InitExpander final {
     128        class InitExpander_old {
     129        public:
     130                // expand by stepping through init to get each list of arguments
     131                InitExpander_old( Initializer * init );
     132
     133                // always expand to expr
     134                InitExpander_old( Expression * expr );
     135
     136                // iterator-like interface
     137                std::list< Expression * > operator*();
     138                InitExpander_old & operator++();
     139
     140                // builds statement which has the same semantics as a C-style list initializer
     141                // (for array initializers) using callExpr as the base expression to perform initialization
     142                Statement * buildListInit( UntypedExpr * callExpr );
     143                void addArrayIndex( Expression * index, Expression * dimension );
     144                void clearArrayIndices();
     145                bool addReference();
     146
     147                class ExpanderImpl;
     148
     149                typedef std::list< Expression * > IndexList;
     150        private:
     151                std::shared_ptr< ExpanderImpl > expander;
     152                std::list< Expression * > cur;
     153
     154                // invariant: list of size 2N (elements come in pairs [index, dimension])
     155                IndexList indices;
     156        };
     157
     158        class InitExpander_new {
    82159        public:
    83160                using IndexList = std::vector< ast::ptr< ast::Expr > >;
     
    92169        public:
    93170                /// Expand by stepping through init to get each list of arguments
    94                 InitExpander( const ast::Init * init );
     171                InitExpander_new( const ast::Init * init );
    95172
    96173                /// Always expand to expression
    97                 InitExpander( const ast::Expr * expr );
     174                InitExpander_new( const ast::Expr * expr );
    98175
    99176                std::vector< ast::ptr< ast::Expr > > operator* ();
    100                 InitExpander & operator++ ();
     177                InitExpander_new & operator++ ();
    101178
    102179                /// builds statement which has the same semantics as a C-style list initializer (for array
     
    111188                bool addReference();
    112189        };
    113 } // namespace InitTweak
     190} // namespace
    114191
    115192// Local Variables: //
Note: See TracChangeset for help on using the changeset viewer.