Changes in src/SymTab/Autogen.h [1a5ad8c:a4477db]
- File:
-
- 1 edited
-
src/SymTab/Autogen.h (modified) (10 diffs)
Legend:
- Unmodified
- Added
- Removed
-
src/SymTab/Autogen.h
r1a5ad8c ra4477db 19 19 #include <string> // for string 20 20 21 #include "CodeGen/OperatorTable.h"22 21 #include "Common/UniqueName.h" // for UniqueName 23 22 #include "InitTweak/InitTweak.h" // for InitExpander … … 52 51 53 52 // generate the type of a copy constructor for paramType 54 FunctionType * gen CopyType( Type * paramType );53 FunctionType * genDefaultType( Type * paramType ); 55 54 56 55 /// inserts into out a generated call expression to function fname with arguments dstParam and srcParam. Intended to be used with generated ?=?, ?{}, and ^?{} calls. … … 61 60 /// optionally returns a statement which must be inserted prior to the containing loop, if there is one 62 61 template< typename OutputIterator > 63 Statement * genScalarCall( InitTweak::InitExpander & srcParam, Expression * dstParam, std::string fname, OutputIterator out, Type * type, bool addCast = false ) { 64 bool isReferenceCtorDtor = false; 65 if ( dynamic_cast< ReferenceType * >( type ) && CodeGen::isCtorDtor( fname ) ) { 66 // reference constructors are essentially application of the rebind operator. 67 // apply & to both arguments, do not need a cast 68 fname = "?=?"; 69 dstParam = new AddressExpr( dstParam ); 70 addCast = false; 71 isReferenceCtorDtor = true; 72 } 73 62 Statement * genScalarCall( InitTweak::InitExpander & srcParam, Expression *dstParam, const std::string & fname, OutputIterator out, Type * type, bool addCast = false ) { 74 63 // want to be able to generate assignment, ctor, and dtor generically, 75 64 // so fname is either ?=?, ?{}, or ^?{} 76 UntypedExpr * fExpr = new UntypedExpr( new NameExpr( fname ) );65 UntypedExpr *fExpr = new UntypedExpr( new NameExpr( fname ) ); 77 66 78 67 if ( addCast ) { … … 89 78 dstParam = new CastExpr( dstParam, new ReferenceType( Type::Qualifiers(), castType ) ); 90 79 } 91 fExpr-> args.push_back( dstParam );80 fExpr->get_args().push_back( dstParam ); 92 81 93 82 Statement * listInit = srcParam.buildListInit( fExpr ); 94 83 95 // fetch next set of arguments 96 ++srcParam; 97 98 // return if adding reference fails - will happen on default constructor and destructor 99 if ( isReferenceCtorDtor && ! srcParam.addReference() ) { 100 delete fExpr; 101 return listInit; 102 } 103 104 std::list< Expression * > args = *srcParam; 105 fExpr->args.splice( fExpr->args.end(), args ); 84 std::list< Expression * > args = *++srcParam; 85 fExpr->get_args().splice( fExpr->get_args().end(), args ); 106 86 107 87 *out++ = new ExprStmt( noLabels, fExpr ); … … 125 105 // generate: for ( int i = 0; i < N; ++i ) 126 106 begin = new ConstantExpr( Constant::from_int( 0 ) ); 127 end = array-> dimension->clone();107 end = array->get_dimension()->clone(); 128 108 cmp = new NameExpr( "?<?" ); 129 109 update = new NameExpr( "++?" ); … … 131 111 // generate: for ( int i = N-1; i >= 0; --i ) 132 112 begin = new UntypedExpr( new NameExpr( "?-?" ) ); 133 ((UntypedExpr*)begin)-> args.push_back( array->dimension->clone() );134 ((UntypedExpr*)begin)-> args.push_back( new ConstantExpr( Constant::from_int( 1 ) ) );113 ((UntypedExpr*)begin)->get_args().push_back( array->get_dimension()->clone() ); 114 ((UntypedExpr*)begin)->get_args().push_back( new ConstantExpr( Constant::from_int( 1 ) ) ); 135 115 end = new ConstantExpr( Constant::from_int( 0 ) ); 136 116 cmp = new NameExpr( "?>=?" ); … … 141 121 142 122 UntypedExpr *cond = new UntypedExpr( cmp ); 143 cond-> args.push_back( new VariableExpr( index ) );144 cond-> args.push_back( end );123 cond->get_args().push_back( new VariableExpr( index ) ); 124 cond->get_args().push_back( end ); 145 125 146 126 UntypedExpr *inc = new UntypedExpr( update ); 147 inc-> args.push_back( new VariableExpr( index ) );127 inc->get_args().push_back( new VariableExpr( index ) ); 148 128 149 129 UntypedExpr *dstIndex = new UntypedExpr( new NameExpr( "?[?]" ) ); 150 dstIndex-> args.push_back( dstParam );151 dstIndex-> args.push_back( new VariableExpr( index ) );130 dstIndex->get_args().push_back( dstParam ); 131 dstIndex->get_args().push_back( new VariableExpr( index ) ); 152 132 dstParam = dstIndex; 153 133 154 134 // srcParam must keep track of the array indices to build the 155 135 // source parameter and/or array list initializer 156 srcParam.addArrayIndex( new VariableExpr( index ), array-> dimension->clone() );136 srcParam.addArrayIndex( new VariableExpr( index ), array->get_dimension()->clone() ); 157 137 158 138 // for stmt's body, eventually containing call 159 139 CompoundStmt * body = new CompoundStmt( noLabels ); 160 Statement * listInit = genCall( srcParam, dstParam, fname, back_inserter( body-> kids ), array->base, addCast, forward );140 Statement * listInit = genCall( srcParam, dstParam, fname, back_inserter( body->get_kids() ), array->get_base(), addCast, forward ); 161 141 162 142 // block containing for stmt and index variable 163 143 std::list<Statement *> initList; 164 144 CompoundStmt * block = new CompoundStmt( noLabels ); 165 block-> push_back( new DeclStmt( noLabels, index ) );145 block->get_kids().push_back( new DeclStmt( noLabels, index ) ); 166 146 if ( listInit ) block->get_kids().push_back( listInit ); 167 block-> push_back( new ForStmt( noLabels, initList, cond, inc, body ) );147 block->get_kids().push_back( new ForStmt( noLabels, initList, cond, inc, body ) ); 168 148 169 149 *out++ = block; … … 171 151 172 152 template< typename OutputIterator > 173 Statement * genCall( InitTweak::InitExpander & srcParam, Expression * dstParam, const std::string & fname, OutputIterator out, Type * type, bool addCast, bool forward ) {153 Statement * genCall( InitTweak::InitExpander & srcParam, Expression * dstParam, const std::string & fname, OutputIterator out, Type * type, bool addCast, bool forward ) { 174 154 if ( ArrayType * at = dynamic_cast< ArrayType * >( type ) ) { 175 155 genArrayCall( srcParam, dstParam, fname, out, at, addCast, forward ); … … 185 165 /// ImplicitCtorDtorStmt node. 186 166 template< typename OutputIterator > 187 void genImplicitCall( InitTweak::InitExpander & srcParam, Expression * dstParam, const std::string & fname, OutputIterator out, DeclarationWithType * decl, bool forward = true ) {167 void genImplicitCall( InitTweak::InitExpander & srcParam, Expression * dstParam, const std::string & fname, OutputIterator out, DeclarationWithType * decl, bool forward = true ) { 188 168 ObjectDecl *obj = dynamic_cast<ObjectDecl *>( decl ); 189 169 assert( obj ); … … 193 173 bool addCast = (fname == "?{}" || fname == "^?{}") && ( !obj || ( obj && ! obj->get_bitfieldWidth() ) ); 194 174 std::list< Statement * > stmts; 195 genCall( srcParam, dstParam, fname, back_inserter( stmts ), obj-> type, addCast, forward );175 genCall( srcParam, dstParam, fname, back_inserter( stmts ), obj->get_type(), addCast, forward ); 196 176 197 177 // currently genCall should produce at most one element, but if that changes then the next line needs to be updated to grab the statement which contains the call
Note:
See TracChangeset
for help on using the changeset viewer.