Changeset 6d2b3dc for src/ControlStruct


Ignore:
Timestamp:
Jul 3, 2024, 5:32:06 PM (5 months ago)
Author:
JiadaL <j82liang@…>
Branches:
master
Children:
39cf5cc
Parents:
597f284
Message:

Change (enum) range loop so that it works on any type that define succ() and upperBound()

File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/ControlStruct/TranslateEnumRange.cpp

    r597f284 r6d2b3dc  
    2222        auto typeExpr = stmt->range_over.strict_as<ast::TypeExpr>();
    2323        auto type = typeExpr->type;
    24         auto inits = stmt->inits;
    25         auto enumInst = type.strict_as<ast::EnumInstType>();
    26         auto enumDecl = enumInst->base;
    2724
    2825        auto objInit = stmt->inits.front();
    29         auto initLocation = objInit->location;
    30         auto rangeLocation = stmt->range_over->location;
    3126        assert( stmt->inits.size() == 1 );
    3227
     
    4742const ast::Stmt* addInit::postvisit( const ast::ForStmt * stmt ) {
    4843    if ( stmt->range_over ) {
    49         auto typeExpr = stmt->range_over.strict_as<ast::TypeExpr>();
    50         auto type = typeExpr->type;
    5144        auto inits = stmt->inits;
    52         auto enumInst = type.strict_as<ast::EnumInstType>();
    53         auto enumDecl = enumInst->base;
    54 
    5545        auto init = stmt->inits.front();
    5646
     
    6050                if ( !objDecl->init ) {
    6151                    auto location = stmt->location;
    62                     // auto newInit = new ast::SingleInit( location, new ast::NameExpr( location, enumDecl->members.front()->name ) );
    6352                    ast::SingleInit * newInit = new ast::SingleInit( location,
    64                         new ast::NameExpr( location,
    65                            stmt->is_inc? enumDecl->members.front()->name: enumDecl->members.back()->name ) );
     53                        stmt->is_inc?
     54                        ast::UntypedExpr::createCall( location, "lowerBound", {} ):
     55                        ast::UntypedExpr::createCall( location, "upperBound", {} ),
     56                        ast::ConstructFlag::MaybeConstruct
     57                    );
    6658                    auto objDeclWithInit = ast::mutate_field( objDecl, &ast::ObjectDecl::init, newInit );
    6759                    auto declWithInit = ast::mutate_field( declStmt, &ast::DeclStmt::decl, objDeclWithInit );
     
    8072    auto initDecl = declStmt->decl.strict_as<ast::ObjectDecl>();
    8173    auto indexName = initDecl->name;
    82    
    83     auto typeExpr = stmt->range_over.strict_as<ast::TypeExpr>();
    84     auto enumInst = typeExpr->type.strict_as<ast::EnumInstType>();
    85     auto enumDecl = enumInst->base;
    8674
    8775    // Both inc and dec check if the current posn less than the number of enumerator
     
    9078    ast::UntypedExpr * condition = ast::UntypedExpr::createCall( location,
    9179        "?<=?",
    92         {new ast::CastExpr(location,
    93             new ast::NameExpr( location, indexName ),
    94             new ast::BasicType( ast::BasicKind::UnsignedInt
    95         ),ast::GeneratedFlag::ExplicitCast),
    96         ast::ConstantExpr::from_ulong( location, enumDecl->members.size()-1 ) });
     80        {   new ast::NameExpr( location, indexName ),
     81            ast::UntypedExpr::createCall( location, "upperBound", {} )  });
    9782    auto increment = ast::UntypedExpr::createCall( location,
    98         stmt->is_inc? "succ": "pred",{
    99         new ast::NameExpr( location, indexName )
    100     });
     83        stmt->is_inc? "succ": "pred",
     84        { new ast::NameExpr( location, indexName ) });
    10185    auto assig = ast::UntypedExpr::createAssign( location, new ast::NameExpr( location, indexName ), increment );
    10286    auto mut = ast::mutate_field( stmt, &ast::ForStmt::cond, condition );
     
    10690
    10791void translateEnumRange( ast::TranslationUnit & translationUnit ) {
    108     ast::Pass<addInitType>::run( translationUnit );
    10992    ast::Pass<addInit>::run( translationUnit );
    11093    ast::Pass<translateEnumRangeCore>::run( translationUnit );
Note: See TracChangeset for help on using the changeset viewer.