Changes in src/Parser/ExpressionNode.cc [e82aa9df:ac71a86]
- File:
-
- 1 edited
-
src/Parser/ExpressionNode.cc (modified) (11 diffs)
Legend:
- Unmodified
- Added
- Removed
-
src/Parser/ExpressionNode.cc
re82aa9df rac71a86 10 10 // Created On : Sat May 16 13:17:07 2015 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Mon Aug 15 14:30:42201613 // Update Count : 49 012 // Last Modified On : Tue Aug 16 00:09:20 2016 13 // Update Count : 495 14 14 // 15 15 … … 32 32 using namespace std; 33 33 34 ExpressionNode::ExpressionNode( const ExpressionNode &other ) : ParseNode( other. name), extension( other.extension ) {}34 ExpressionNode::ExpressionNode( const ExpressionNode &other ) : ParseNode( other.get_name() ), extension( other.extension ) {} 35 35 36 36 //############################################################################## … … 57 57 static inline bool checkX( char c ) { return c == 'x' || c == 'X'; } 58 58 59 Expression *build_constantInteger( std::string & str ) {59 Expression *build_constantInteger( const std::string & str ) { 60 60 static const BasicType::Kind kind[2][3] = { 61 61 { BasicType::SignedInt, BasicType::LongSignedInt, BasicType::LongLongSignedInt }, … … 123 123 } // build_constantInteger 124 124 125 Expression *build_constantFloat( std::string & str ) {125 Expression *build_constantFloat( const std::string & str ) { 126 126 static const BasicType::Kind kind[2][3] = { 127 127 { BasicType::Float, BasicType::Double, BasicType::LongDouble }, … … 153 153 } // build_constantFloat 154 154 155 Expression *build_constantChar( std::string & str ) {155 Expression *build_constantChar( const std::string & str ) { 156 156 return new ConstantExpr( Constant( new BasicType( emptyQualifiers, BasicType::Char ), str ) ); 157 157 } // build_constantChar 158 158 159 ConstantExpr *build_constantStr( std::string & str ) {159 ConstantExpr *build_constantStr( const std::string & str ) { 160 160 // string should probably be a primitive type 161 161 ArrayType *at = new ArrayType( emptyQualifiers, new BasicType( emptyQualifiers, BasicType::Char ), … … 166 166 } // build_constantStr 167 167 168 //##############################################################################169 170 168 NameExpr * build_varref( const string *name, bool labelp ) { 171 returnnew NameExpr( *name, nullptr );172 } 173 174 //############################################################################## 169 NameExpr *expr = new NameExpr( *name, nullptr ); 170 delete name; 171 return expr; 172 } 175 173 176 174 static const char *OperName[] = { … … 184 182 }; 185 183 186 //##############################################################################187 188 184 Expression *build_cast( DeclarationNode *decl_node, ExpressionNode *expr_node ) { 189 185 Type *targetType = decl_node->buildType(); 190 186 if ( dynamic_cast< VoidType * >( targetType ) ) { 191 187 delete targetType; 192 return new CastExpr( maybe Build<Expression>(expr_node) );188 return new CastExpr( maybeMoveBuild< Expression >(expr_node) ); 193 189 } else { 194 return new CastExpr( maybe Build<Expression>(expr_node), targetType );190 return new CastExpr( maybeMoveBuild< Expression >(expr_node), targetType ); 195 191 } // if 196 192 } 197 193 198 194 Expression *build_fieldSel( ExpressionNode *expr_node, NameExpr *member ) { 199 UntypedMemberExpr *ret = new UntypedMemberExpr( member->get_name(), maybe Build<Expression>(expr_node) );195 UntypedMemberExpr *ret = new UntypedMemberExpr( member->get_name(), maybeMoveBuild< Expression >(expr_node) ); 200 196 delete member; 201 197 return ret; … … 204 200 Expression *build_pfieldSel( ExpressionNode *expr_node, NameExpr *member ) { 205 201 UntypedExpr *deref = new UntypedExpr( new NameExpr( "*?" ) ); 206 deref->get_args().push_back( maybe Build<Expression>(expr_node) );202 deref->get_args().push_back( maybeMoveBuild< Expression >(expr_node) ); 207 203 UntypedMemberExpr *ret = new UntypedMemberExpr( member->get_name(), deref ); 208 204 delete member; … … 211 207 212 208 Expression *build_addressOf( ExpressionNode *expr_node ) { 213 return new AddressExpr( maybe Build<Expression>(expr_node) );209 return new AddressExpr( maybeMoveBuild< Expression >(expr_node) ); 214 210 } 215 211 Expression *build_sizeOfexpr( ExpressionNode *expr_node ) { 216 return new SizeofExpr( maybe Build<Expression>(expr_node) );212 return new SizeofExpr( maybeMoveBuild< Expression >(expr_node) ); 217 213 } 218 214 Expression *build_sizeOftype( DeclarationNode *decl_node ) { 219 return new SizeofExpr( decl_node->buildType() ); 215 Expression* ret = new SizeofExpr( decl_node->buildType() ); 216 delete decl_node; 217 return ret; 220 218 } 221 219 Expression *build_alignOfexpr( ExpressionNode *expr_node ) { 222 return new AlignofExpr( maybe Build<Expression>(expr_node) );220 return new AlignofExpr( maybeMoveBuild< Expression >(expr_node) ); 223 221 } 224 222 Expression *build_alignOftype( DeclarationNode *decl_node ) { … … 226 224 } 227 225 Expression *build_offsetOf( DeclarationNode *decl_node, NameExpr *member ) { 228 return new UntypedOffsetofExpr( decl_node->buildType(), member->get_name() ); 226 Expression* ret = new UntypedOffsetofExpr( decl_node->buildType(), member->get_name() ); 227 delete decl_node; 228 delete member; 229 return ret; 229 230 } 230 231 231 232 Expression *build_and_or( ExpressionNode *expr_node1, ExpressionNode *expr_node2, bool kind ) { 232 return new LogicalExpr( notZeroExpr( maybe Build<Expression>(expr_node1) ), notZeroExpr( maybeBuild<Expression>(expr_node2) ), kind );233 return new LogicalExpr( notZeroExpr( maybeMoveBuild< Expression >(expr_node1) ), notZeroExpr( maybeMoveBuild< Expression >(expr_node2) ), kind ); 233 234 } 234 235 235 236 Expression *build_unary_val( OperKinds op, ExpressionNode *expr_node ) { 236 std::list< Expression *> args;237 args.push_back( maybe Build<Expression>(expr_node) );237 std::list< Expression * > args; 238 args.push_back( maybeMoveBuild< Expression >(expr_node) ); 238 239 return new UntypedExpr( new NameExpr( OperName[ (int)op ] ), args ); 239 240 } 240 241 Expression *build_unary_ptr( OperKinds op, ExpressionNode *expr_node ) { 241 std::list< Expression *> args;242 args.push_back( new AddressExpr( maybe Build<Expression>(expr_node) ) );242 std::list< Expression * > args; 243 args.push_back( new AddressExpr( maybeMoveBuild< Expression >(expr_node) ) ); 243 244 return new UntypedExpr( new NameExpr( OperName[ (int)op ] ), args ); 244 245 } 245 246 Expression *build_binary_val( OperKinds op, ExpressionNode *expr_node1, ExpressionNode *expr_node2 ) { 246 std::list< Expression *> args;247 args.push_back( maybe Build<Expression>(expr_node1) );248 args.push_back( maybe Build<Expression>(expr_node2) );247 std::list< Expression * > args; 248 args.push_back( maybeMoveBuild< Expression >(expr_node1) ); 249 args.push_back( maybeMoveBuild< Expression >(expr_node2) ); 249 250 return new UntypedExpr( new NameExpr( OperName[ (int)op ] ), args ); 250 251 } 251 252 Expression *build_binary_ptr( OperKinds op, ExpressionNode *expr_node1, ExpressionNode *expr_node2 ) { 252 std::list< Expression *> args;253 args.push_back( new AddressExpr( maybe Build<Expression>(expr_node1) ) );254 args.push_back( maybe Build<Expression>(expr_node2) );253 std::list< Expression * > args; 254 args.push_back( new AddressExpr( maybeMoveBuild< Expression >(expr_node1) ) ); 255 args.push_back( maybeMoveBuild< Expression >(expr_node2) ); 255 256 return new UntypedExpr( new NameExpr( OperName[ (int)op ] ), args ); 256 257 } 257 258 258 259 Expression *build_cond( ExpressionNode *expr_node1, ExpressionNode *expr_node2, ExpressionNode *expr_node3 ) { 259 return new ConditionalExpr( notZeroExpr( maybe Build<Expression>(expr_node1) ), maybeBuild<Expression>(expr_node2), maybeBuild<Expression>(expr_node3) );260 return new ConditionalExpr( notZeroExpr( maybeMoveBuild< Expression >(expr_node1) ), maybeMoveBuild< Expression >(expr_node2), maybeMoveBuild< Expression >(expr_node3) ); 260 261 } 261 262 262 263 Expression *build_comma( ExpressionNode *expr_node1, ExpressionNode *expr_node2 ) { 263 return new CommaExpr( maybe Build<Expression>(expr_node1), maybeBuild<Expression>(expr_node2) );264 return new CommaExpr( maybeMoveBuild< Expression >(expr_node1), maybeMoveBuild< Expression >(expr_node2) ); 264 265 } 265 266 266 267 Expression *build_attrexpr( NameExpr *var, ExpressionNode * expr_node ) { 267 return new AttrExpr( var, maybe Build<Expression>(expr_node) );268 return new AttrExpr( var, maybeMoveBuild< Expression >(expr_node) ); 268 269 } 269 270 Expression *build_attrtype( NameExpr *var, DeclarationNode * decl_node ) { … … 273 274 Expression *build_tuple( ExpressionNode * expr_node ) { 274 275 TupleExpr *ret = new TupleExpr(); 275 build List( expr_node, ret->get_exprs() );276 buildMoveList( expr_node, ret->get_exprs() ); 276 277 return ret; 277 278 } 278 279 279 280 Expression *build_func( ExpressionNode * function, ExpressionNode * expr_node ) { 280 std::list<Expression *> args; 281 282 buildList( expr_node, args ); 283 return new UntypedExpr( maybeBuild<Expression>(function), args, nullptr ); 281 std::list< Expression * > args; 282 buildMoveList( expr_node, args ); 283 return new UntypedExpr( maybeMoveBuild< Expression >(function), args, nullptr ); 284 284 } 285 285 286 286 Expression *build_range( ExpressionNode * low, ExpressionNode *high ) { 287 Expression *low_cexpr = maybeBuild<Expression>( low ); 288 Expression *high_cexpr = maybeBuild<Expression>( high ); 289 return new RangeExpr( low_cexpr, high_cexpr ); 290 } 291 292 //############################################################################## 287 return new RangeExpr( maybeMoveBuild< Expression >( low ), maybeMoveBuild< Expression >( high ) ); 288 } 293 289 294 290 Expression *build_asmexpr( ExpressionNode *inout, ConstantExpr *constraint, ExpressionNode *operand ) { 295 return new AsmExpr( maybeBuild< Expression >( inout ), constraint, maybeBuild<Expression>(operand) ); 296 } 297 298 //############################################################################## 299 300 //void LabelNode::print( std::ostream &os, int indent ) const {} 301 302 //void LabelNode::printOneLine( std::ostream &os, int indent ) const {} 303 304 //############################################################################## 291 return new AsmExpr( maybeMoveBuild< Expression >( inout ), constraint, maybeMoveBuild< Expression >(operand) ); 292 } 305 293 306 294 Expression *build_valexpr( StatementNode *s ) { 307 return new UntypedValofExpr( maybeBuild<Statement>(s), nullptr ); 308 } 309 310 //############################################################################## 311 295 return new UntypedValofExpr( maybeMoveBuild< Statement >(s), nullptr ); 296 } 312 297 Expression *build_typevalue( DeclarationNode *decl ) { 313 298 return new TypeExpr( decl->buildType() ); 314 299 } 315 300 316 //##############################################################################317 318 301 Expression *build_compoundLiteral( DeclarationNode *decl_node, InitializerNode *kids ) { 319 Declaration * newDecl = maybeBuild< Declaration>(decl_node); // compound literal type302 Declaration * newDecl = maybeBuild< Declaration >(decl_node); // compound literal type 320 303 if ( DeclarationWithType * newDeclWithType = dynamic_cast< DeclarationWithType * >( newDecl ) ) { // non-sue compound-literal type 321 return new CompoundLiteralExpr( newDeclWithType->get_type(), maybe Build<Initializer>(kids) );304 return new CompoundLiteralExpr( newDeclWithType->get_type(), maybeMoveBuild< Initializer >(kids) ); 322 305 // these types do not have associated type information 323 306 } else if ( StructDecl * newDeclStructDecl = dynamic_cast< StructDecl * >( newDecl ) ) { 324 return new CompoundLiteralExpr( new StructInstType( Type::Qualifiers(), newDeclStructDecl->get_name() ), maybe Build<Initializer>(kids) );307 return new CompoundLiteralExpr( new StructInstType( Type::Qualifiers(), newDeclStructDecl->get_name() ), maybeMoveBuild< Initializer >(kids) ); 325 308 } else if ( UnionDecl * newDeclUnionDecl = dynamic_cast< UnionDecl * >( newDecl ) ) { 326 return new CompoundLiteralExpr( new UnionInstType( Type::Qualifiers(), newDeclUnionDecl->get_name() ), maybe Build<Initializer>(kids) );309 return new CompoundLiteralExpr( new UnionInstType( Type::Qualifiers(), newDeclUnionDecl->get_name() ), maybeMoveBuild< Initializer >(kids) ); 327 310 } else if ( EnumDecl * newDeclEnumDecl = dynamic_cast< EnumDecl * >( newDecl ) ) { 328 return new CompoundLiteralExpr( new EnumInstType( Type::Qualifiers(), newDeclEnumDecl->get_name() ), maybe Build<Initializer>(kids) );311 return new CompoundLiteralExpr( new EnumInstType( Type::Qualifiers(), newDeclEnumDecl->get_name() ), maybeMoveBuild< Initializer >(kids) ); 329 312 } else { 330 313 assert( false );
Note:
See TracChangeset
for help on using the changeset viewer.