Changes in src/CodeGen/CodeGenerator.cc [8bb86ce:25b0fde]
- File:
-
- 1 edited
-
src/CodeGen/CodeGenerator.cc (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
-
src/CodeGen/CodeGenerator.cc
r8bb86ce r25b0fde 273 273 } 274 274 275 template<typename pass_type>276 inline void genEnumInitializer( PassVisitor<pass_type> * visitor, Type * baseType, std::ostream & output,277 Initializer * init, long long * cur_val, Options options) {278 auto baseTypeAsBasic = baseType ? dynamic_cast<BasicType *>( baseType ) : nullptr;279 if ( init ) { // If value has an explicit initiazatior280 output << " = ";281 output << "(" << genType(baseType, "", options) << ")";282 init->accept( *visitor );283 if ( baseTypeAsBasic && baseTypeAsBasic->isInteger() ) { // if it is an integral type and initilizer offered,284 // need to update the cur_val285 Expression* expr = ((SingleInit *)(init))->value;286 while ( auto temp = dynamic_cast<CastExpr *>(expr) ) { // unwrap introduced cast287 expr = temp->arg;288 }289 *cur_val = ((ConstantExpr *)expr)->constant.get_ival()+1;290 }291 } else if ( baseTypeAsBasic && baseTypeAsBasic->isInteger() ) { // integral implicitly init to cur_val + 1292 output << " = " << "(" << genType(baseType, "", options) << ")";293 output << (*cur_val)++;294 }295 }296 297 275 void CodeGenerator::postvisit( EnumDecl * enumDecl ) { 298 276 extension( enumDecl ); 299 277 std::list< Declaration* > &memb = enumDecl->get_members(); 300 278 if (enumDecl->base && ! memb.empty()) { 301 long long cur_val = 0; 279 unsigned long long last_val = -1; // if the first enum value has no explicit initializer, 280 // as other 302 281 for ( std::list< Declaration* >::iterator i = memb.begin(); i != memb.end(); i++) { 303 282 ObjectDecl * obj = dynamic_cast< ObjectDecl* >( *i ); 304 283 assert( obj ); 305 284 output << "static "; 306 output << genType(enumDecl->base, mangleName( obj ), options); 307 genEnumInitializer( visitor, enumDecl->base, output, obj->get_init(), &cur_val, options); 285 output << genType(enumDecl->base, "", options) << " const "; 286 output << mangleName( obj ) << " "; 287 output << " = "; 288 output << "(" << genType(enumDecl->base, "", options) << ")"; 289 if ( (BasicType *)(enumDecl->base) && ((BasicType *)(enumDecl->base))->isWholeNumber() ) { 290 if ( obj->get_init() ) { 291 obj->get_init()->accept( *visitor ); 292 Expression* expr = ((SingleInit *)(obj->init))->value; 293 while ( auto temp = dynamic_cast<CastExpr *>(expr) ) { 294 expr = temp->arg; 295 } 296 last_val = ((ConstantExpr *)expr)->constant.get_ival(); 297 } else { 298 output << ++last_val; 299 } // if 300 } else { 301 if ( obj->get_init() ) { 302 obj->get_init()->accept( *visitor ); 303 } else { 304 // Should not reach here! 305 } 306 } 308 307 output << ";" << endl; 309 308 } // for
Note:
See TracChangeset
for help on using the changeset viewer.