Changes in / [69867ad9:caaf424]


Ignore:
Files:
3 deleted
12 edited

Legend:

Unmodified
Added
Removed
  • src/ResolvExpr/CandidateFinder.cpp

    r69867ad9 rcaaf424  
    906906                                }
    907907                                CandidateRef & choice = winners.front();
    908                                 choice->cost.incSafe();
     908                                choice->cost.incVar();
    909909                                candidates.emplace_back( std::move(choice) );
    910910                        }
     
    13761376                        ast::Expr * newExpr = data.combine( nameExpr->location, cost );
    13771377
    1378                         // bool bentConversion = false;
    1379                         // if ( auto inst = newExpr->result.as<ast::EnumInstType>() ) {
    1380                         //      if ( inst->base && inst->base->base ) {
    1381                         //              bentConversion = true;
    1382                         //      }
    1383                         // }
    1384 
    1385                         // CandidateRef newCand = std::make_shared<Candidate>(
    1386                         //      newExpr, copy( tenv ), ast::OpenVarSet{}, ast::AssertionSet{}, bentConversion? Cost::safe: Cost::zero,
    1387                         //      cost );
     1378                        bool bentConversion = false;
     1379                        if ( auto inst = newExpr->result.as<ast::EnumInstType>() ) {
     1380                                if ( inst->base && inst->base->base ) {
     1381                                        bentConversion = true;
     1382                                }
     1383                        }
     1384
    13881385                        CandidateRef newCand = std::make_shared<Candidate>(
    1389                                 newExpr, copy( tenv ), ast::OpenVarSet{}, ast::AssertionSet{}, Cost::zero,
     1386                                newExpr, copy( tenv ), ast::OpenVarSet{}, ast::AssertionSet{}, bentConversion? Cost::safe: Cost::zero,
    13901387                                cost );
     1388
    13911389                        if (newCand->expr->env) {
    13921390                                newCand->env.add(*newCand->expr->env);
     
    18311829                                        Cost cost = Cost::zero;
    18321830                                        ast::Expr * newExpr = data.combine( expr->location, cost );
    1833                                         // CandidateRef newCand =
    1834                                         //      std::make_shared<Candidate>(
    1835                                         //              newExpr, copy( tenv ), ast::OpenVarSet{},
    1836                                         //              ast::AssertionSet{}, Cost::safe, cost
    1837                                         //      );
    18381831                                        CandidateRef newCand =
    18391832                                                std::make_shared<Candidate>(
    18401833                                                        newExpr, copy( tenv ), ast::OpenVarSet{},
    1841                                                         ast::AssertionSet{}, Cost::zero, cost
     1834                                                        ast::AssertionSet{}, Cost::safe, cost
    18421835                                                );
     1836
    18431837                                        if (newCand->expr->env) {
    18441838                                                newCand->env.add(*newCand->expr->env);
  • src/ResolvExpr/CastCost.cc

    r69867ad9 rcaaf424  
    5353                        } else {
    5454                                cost = conversionCost( basicType, dst, srcIsLvalue, symtab, env );
    55                                 if ( Cost::unsafe < cost ) {
    56                                         if (auto enumInst =  dynamic_cast<const ast::EnumInstType *>(dst)) {
    57                                                 assert(enumInst->base->base);
    58                                                 cost = Cost::unsafe;
    59                                         }
    60                                 }
    6155                        }
    62                 }
    63 
    64                 void postvisit( const ast::ZeroType * zero ) {
    65                         // auto ptr = dynamic_cast< const ast::PointerType * >( dst );
    66                         // if ( ptr && basicType->isInteger() ) {
    67                         //      // needed for, e.g. unsigned long => void *
    68                         //      cost = Cost::unsafe;
    69                         // } else {
    70                         cost = conversionCost( zero, dst, srcIsLvalue, symtab, env );
    71                         if ( Cost::unsafe < cost ) {
    72                                 if (auto enumInst =  dynamic_cast<const ast::EnumInstType *>(dst)) {
    73                                         assert(enumInst->base->base);
    74                                         cost = Cost::unsafe;
    75                                 }
    76                         }
    77                         // }
    78                 }
    79 
    80                 void postvisit( const ast::OneType * one ) {
    81                         // auto ptr = dynamic_cast< const ast::PointerType * >( dst );
    82                         // if ( ptr && basicType->isInteger() ) {
    83                         //      // needed for, e.g. unsigned long => void *
    84                         //      cost = Cost::unsafe;
    85                         // } else {
    86                         cost = conversionCost( one, dst, srcIsLvalue, symtab, env );
    87                         if ( Cost::unsafe < cost ) {
    88                                 if (auto enumInst =  dynamic_cast<const ast::EnumInstType *>(dst)) {
    89                                         assert(enumInst->base->base);
    90                                         cost = Cost::unsafe;
    91                                 }
    92                         }
    93                         // }
    9456                }
    9557
     
    11880                                        cost = Cost::unsafe;
    11981                                }
    120                         }
    121                 }
    122 
    123                 void postvist( const ast::EnumInstType * ) {
    124                         if ( auto basic = dynamic_cast< const ast::BasicType * >(dst) ) {
    125                                 if ( basic->isInteger() ) cost = Cost::unsafe;
    12682                        }
    12783                }
  • src/ResolvExpr/ConversionCost.cc

    r69867ad9 rcaaf424  
    284284        } else if ( auto dstAsEnumInst = dynamic_cast< const ast::EnumInstType * >( dst ) ) {
    285285                if ( dstAsEnumInst->base && !dstAsEnumInst->base->base ) {
    286                         cost = Cost::unsafe;
     286                        cost = Cost::zero;
     287                        cost.incUnsafe();
    287288                }
    288289        }
     
    481482        } else if ( auto dstAsEnumInst = dynamic_cast< const ast::EnumInstType * >( dst ) ) {
    482483                if ( dstAsEnumInst->base && !dstAsEnumInst->base->base ) {
    483                         cost = Cost::unsafe;
     484                        cost = Cost::zero;
     485                        cost.incUnsafe();
    484486                }
    485487        }
     
    502504        } else if ( auto dstAsEnumInst = dynamic_cast< const ast::EnumInstType * >( dst ) ) {
    503505                if ( dstAsEnumInst->base && !dstAsEnumInst->base->base ) {
    504                         cost = Cost::unsafe;
     506                        cost = Cost::zero;
     507                        cost.incUnsafe();
    505508                }
    506509        }
  • src/Validate/HoistStruct.cpp

    r69867ad9 rcaaf424  
    2727namespace {
    2828
    29 /// Is this a declaration can appear in a struct/union and should be hoisted?
    3029bool shouldHoist( ast::Decl const * decl ) {
    3130        return dynamic_cast< ast::StructDecl const * >( decl )
     
    3534}
    3635
    37 /// Helper that updates an InstType if the base name could be updated.
    38 template<typename InstType>
    39 InstType const * preInstType( InstType const * type ) {
    40         assert( type->base );
    41         if ( nullptr == type->base->parent ) return type;
    42         auto mut = ast::mutate( type );
    43         mut->name = mut->base->name;
    44         return mut;
    45 }
    46 
    47 /// Update StructInstType and UnionInstType names.
    48 struct NameUpdater {
    49         ast::StructInstType const * previsit( ast::StructInstType const * type ) {
    50                 return preInstType( type );
    51         }
    52 
    53         ast::UnionInstType const * previsit( ast::UnionInstType const * type ) {
    54                 return preInstType( type );
    55         }
    56 };
    57 
    58 ast::Decl const * updateNames( ast::Decl const * decl ) {
    59         ast::Pass<NameUpdater> visitor;
    60         return decl->accept( visitor );
    61 }
    62 
    63 /* This pass hoists from structs/unions. Hoisted declarations should always
     36/* This pass also does some renaming and internal field alteration, but the
     37 * complex part is the actual hoisting. Hoisted declarations should always
    6438 * appear before the declaration they are hoisted out of and if two types are
    6539 * nested in the same declaration their order should not change.
    66  * It also sets up parent relationships, does name mangling of hoisted types
    67  * and updates instance types of the hoisted types.
    6840 */
    6941struct HoistStructCore final :
     
    12496                auto mut = ast::mutate( decl );
    12597                mut->parent = parent;
     98                mut->name = qualifiedName( mut );
    12699                extendParams( mut->params, parent->params );
    127100                decl = mut;
     
    143116                }
    144117        }
    145         // Is this a nested type? Then update the name, after the parent's name
    146         // has been updated (hence the post visit).
    147         if ( mut->parent ) {
    148                 mut->name = qualifiedName( mut );
    149         // Top level type that has hoisted? Then do a second pass subpass to make
    150         // sure we update instance type names after the declaration is renamed.
    151         } else if ( !declsToAddBefore.empty() ) {
    152                 for ( ast::ptr<ast::Decl> & member : mut->members ) {
    153                         member = updateNames( member.get() );
    154                 }
    155                 for ( ast::ptr<ast::Decl> & declToAdd : declsToAddBefore ) {
    156                         declToAdd = updateNames( declToAdd );
    157                 }
    158         }
    159118        return mut;
    160119}
     
    208167}
    209168
     169template<typename InstType>
     170InstType const * preInstType( InstType const * type ) {
     171        assert( type->base );
     172        auto mut = ast::mutate( type );
     173        mut->name = mut->base->name;
     174        return mut;
     175}
     176
    210177ast::StructInstType const * HoistStructCore::previsit( ast::StructInstType const * type ) {
    211178        return preInstType( preCollectionInstType( type ) );
  • src/Validate/ImplementEnumFunc.cpp

    r69867ad9 rcaaf424  
    3030        void genAttrFunctions();
    3131        void genSuccPredPosn();
    32         // void genSuccPredDecl();
     32        void genSuccPredDecl();
    3333
    3434        void appendReturnThis(ast::FunctionDecl* decl) {
     
    7373        const ast::Decl* getDecl() const { return decl; }
    7474
    75         // Implement Bounded trait for enum
    76     void genBoundedFunctions();
    77         // Implement Serial trait for enum
    78         void genSerialTraitFuncs();
    79 
    80         // Bounded trait
    81         ast::FunctionDecl* genLowerBoundProto() const;
    82         ast::FunctionDecl* genUpperBoundProto() const;
    83         void genLowerBoundBody(ast::FunctionDecl* func) const;
    84         void genUpperBoundBody(ast::FunctionDecl* func) const;
    85 
    8675        ast::FunctionDecl* genPosnProto() const;
    8776        ast::FunctionDecl* genLabelProto() const;
    8877        ast::FunctionDecl* genValueProto() const;
    89 
    90         // Serial trait
    91         ast::FunctionDecl* genFromIntProto() const;
    92         ast::FunctionDecl* genFromInstanceProto() const;
    9378        ast::FunctionDecl* genSuccProto() const;
    9479        ast::FunctionDecl* genPredProto() const;
    95 
    96         void genFromIntBody(ast::FunctionDecl *) const;
    97         void genFromInstanceBody(ast::FunctionDecl *) const;
    98         ////////////////
    9980
    10081        ast::FunctionDecl* genSuccPosProto() const;
     
    308289
    309290ast::FunctionDecl* EnumAttrFuncGenerator::genPosnProto() const {
    310     return genProto(
    311         "posE",
    312         {new ast::ObjectDecl(getLocation(), "_i", new ast::EnumInstType(decl))},
    313         {new ast::ObjectDecl(getLocation(), "_ret",
    314             new ast::BasicType(ast::BasicKind::UnsignedInt))});
     291        return genProto(
     292                "posE",
     293                {new ast::ObjectDecl(getLocation(), "_i", new ast::EnumInstType(decl))},
     294                {new ast::ObjectDecl(getLocation(), "_ret",
     295                        new ast::BasicType(ast::BasicKind::UnsignedInt))});
    315296}
    316297
     
    332313}
    333314
    334 ast::FunctionDecl* EnumAttrFuncGenerator::genFromIntProto() const {
    335         return genProto(
    336                 "fromInt",
    337                 {new ast::ObjectDecl(getLocation(), "_i", new ast::BasicType(ast::BasicKind::UnsignedInt))},
    338                 {new ast::ObjectDecl(getLocation(), "_ret", new ast::EnumInstType(decl))}
    339         );
    340 }
    341 
    342 ast::FunctionDecl* EnumAttrFuncGenerator::genFromInstanceProto() const {
    343         return genProto(
    344                 "fromInstance",
    345                 {new ast::ObjectDecl(getLocation(), "_i", new ast::EnumInstType(decl))},
    346                 {new ast::ObjectDecl(getLocation(), "_ret", new ast::BasicType(ast::BasicKind::UnsignedInt))}
    347         );
    348 }
    349 
    350 void EnumAttrFuncGenerator::genFromIntBody(ast::FunctionDecl* func) const {
    351         auto params = func->params;
    352         assert( params.size() == 1 );
    353         auto param = params.front();
    354         auto castExpr = new ast::CastExpr(
    355                 func->location,
    356                 new ast::VariableExpr(func->location, param),
    357                 new ast::EnumInstType(decl),
    358                 ast::GeneratedFlag::ExplicitCast
    359         );
    360         func->stmts = new ast::CompoundStmt(
    361                 func->location, {new ast::ReturnStmt(func->location, castExpr)}
    362         );
    363 }
    364 
    365 void EnumAttrFuncGenerator::genFromInstanceBody(ast::FunctionDecl* func) const {
    366         auto params = func->params;
    367         assert( params.size() == 1 );
    368         auto param = params.front();
    369         ast::UntypedExpr* untyped = ast::UntypedExpr::createCall(
    370                 func->location, "posE", { new ast::VariableExpr(func->location, param) });
    371         func->stmts = new ast::CompoundStmt(
    372                 func->location, {new ast::ReturnStmt(func->location, untyped)}
    373         );
    374 }
    375 
    376 void EnumAttrFuncGenerator::genSerialTraitFuncs() {
    377         auto fromIntProto = genFromIntProto();
    378         produceForwardDecl(fromIntProto);
    379         genFromIntBody(fromIntProto);
    380         produceDecl(fromIntProto);
    381 
    382         auto fromInstanceProto = genFromInstanceProto();
    383         produceForwardDecl(fromInstanceProto);
    384         genFromInstanceBody(fromInstanceProto);
    385         produceDecl(fromInstanceProto);
    386 
    387         auto succProto = genSuccProto();
    388         auto predProto = genPredProto();
    389         produceForwardDecl(succProto);
    390         produceForwardDecl(predProto);
    391 }
    392 
    393315ast::FunctionDecl* EnumAttrFuncGenerator::genSuccProto() const {
    394316        return genProto(
     
    405327                {new ast::ObjectDecl(getLocation(), "_ret",
    406328                                     new ast::EnumInstType(decl))});
    407 }
    408 
    409 ast::FunctionDecl* EnumAttrFuncGenerator::genLowerBoundProto() const {
    410     return genProto("lowerBound", {}, {
    411         new ast::ObjectDecl(getLocation(), "_i", new ast::EnumInstType(decl))
    412     });
    413 }
    414 
    415 ast::FunctionDecl* EnumAttrFuncGenerator::genUpperBoundProto() const {
    416     return genProto("upperBound", {}, {
    417         new ast::ObjectDecl(getLocation(), "_i", new ast::EnumInstType(decl))
    418     });
    419 }
    420 
    421 void EnumAttrFuncGenerator::genLowerBoundBody(ast::FunctionDecl* func) const {
    422         const CodeLocation & loc = func->location;
    423         auto mem = decl->members.front();
    424         // auto expr = new ast::QualifiedNameExpr( loc, decl, mem->name );
    425         // expr->result = new ast::EnumInstType( decl );
    426         auto expr = new ast::NameExpr( loc, mem->name );
    427         func->stmts = new ast::CompoundStmt( loc, {new ast::ReturnStmt(loc, expr)});
    428 }
    429 
    430 void EnumAttrFuncGenerator::genUpperBoundBody(ast::FunctionDecl* func) const {
    431         const CodeLocation & loc = func->location;
    432         auto mem = decl->members.back();
    433         auto expr = new ast::NameExpr( loc, mem->name );
    434         // expr->result = new ast::EnumInstType( decl );
    435         func->stmts = new ast::CompoundStmt( loc, {new ast::ReturnStmt(loc, expr)});   
    436 }
    437 
    438 void EnumAttrFuncGenerator::genBoundedFunctions() {
    439         ast::FunctionDecl * upperDecl = genUpperBoundProto();
    440         produceForwardDecl(upperDecl);
    441         genUpperBoundBody(upperDecl);
    442         produceDecl(upperDecl);
    443 
    444         ast::FunctionDecl * lowerDecl = genLowerBoundProto();
    445         produceForwardDecl(lowerDecl);
    446         genLowerBoundBody(lowerDecl);
    447         produceDecl(lowerDecl);
    448329}
    449330
     
    492373                func->location, "?[?]",
    493374                {new ast::NameExpr(func->location, arrDecl->name),
    494                 new ast::CastExpr(
    495                         func->location,
    496                         new ast::VariableExpr( func->location, func->params.front() ),
    497                         new ast::EnumAttrType( new ast::EnumInstType(decl),
    498                                 ast::EnumAttribute::Posn))});
     375                        new ast::CastExpr(
     376                                func->location,
     377                                new ast::VariableExpr( func->location, func->params.front() ),
     378                                new ast::EnumAttrType( new ast::EnumInstType(decl),
     379                                        ast::EnumAttribute::Posn))});
    499380        func->stmts = new ast::CompoundStmt(
    500381                func->location, {new ast::ReturnStmt(func->location, untyped)});
     
    569450
    570451void EnumAttrFuncGenerator::genAttrFunctions() {
    571         genAttributesDecls(ast::EnumAttribute::Value);
    572         genAttributesDecls(ast::EnumAttribute::Label);
    573         genAttributesDecls(ast::EnumAttribute::Posn);   
    574 }
    575 
    576 // void EnumAttrFuncGenerator::genSuccPredDecl() {
    577 //      auto succProto = genSuccProto();
    578 //      auto predProto = genPredProto();
    579 
    580 //      produceForwardDecl(succProto);
    581 //      produceForwardDecl(predProto);
    582 // }
     452        if (decl->base) {
     453                genAttributesDecls(ast::EnumAttribute::Value);
     454                genAttributesDecls(ast::EnumAttribute::Label);
     455                genAttributesDecls(ast::EnumAttribute::Posn);
     456        }
     457}
     458
     459void EnumAttrFuncGenerator::genSuccPredDecl() {
     460        if (decl->base) {
     461                auto succProto = genSuccProto();
     462                auto predProto = genPredProto();
     463
     464                produceForwardDecl(succProto);
     465                produceForwardDecl(predProto);
     466        }
     467}
    583468
    584469void EnumAttrFuncGenerator::genSuccPredPosn() {
    585         ast::FunctionDecl* succ = genSuccPredFunc(true);
    586         ast::FunctionDecl* pred = genSuccPredFunc(false);
    587 
    588         produceDecl(succ);
    589         produceDecl(pred);
     470        if (decl->base) {
     471                ast::FunctionDecl* succ = genSuccPredFunc(true);
     472                ast::FunctionDecl* pred = genSuccPredFunc(false);
     473
     474                produceDecl(succ);
     475                produceDecl(pred);
     476        }
    590477}
    591478
     
    595482        genAttrStandardFuncs();
    596483        genAttrFunctions();
    597         genSerialTraitFuncs();
    598         genSuccPredPosn();
    599         // problematic
    600         genBoundedFunctions();
     484        genSuccPredDecl();
     485        genSuccPredPosn(); // Posn
    601486        // Now export the lists contents.
    602487        decls.splice(decls.end(), forwards);
  • src/main.cc

    r69867ad9 rcaaf424  
    325325                PASS( "Validate Generic Parameters", Validate::fillGenericParameters, transUnit );
    326326                PASS( "Translate Dimensions", Validate::translateDimensionParameters, transUnit );
    327                 // Need to happen before fixing returns because implementEnumFunc has ReturnStmt
    328                
    329                 PASS( "Generate Enum Attributes Functions", Validate::implementEnumFunc, transUnit );
    330327                PASS( "Check Function Returns", Validate::checkReturnStatements, transUnit );
    331328                PASS( "Fix Return Statements", InitTweak::fixReturnStatements, transUnit );
     
    336333
    337334                PASS( "Generate Autogen Routines", Validate::autogenerateRoutines, transUnit );
    338                
     335                PASS( "Generate Enum Attributes Functions", Validate::implementEnumFunc, transUnit );
     336
    339337                PASS( "Implement Actors", Concurrency::implementActors, transUnit );
    340338                PASS( "Implement Virtual Destructors", Virtual::implementVirtDtors, transUnit );
  • tests/enum_tests/.expect/stringEnum.txt

    r69867ad9 rcaaf424  
    11zero: zero, one: one
    2 zero: 0, one: 1
  • tests/enum_tests/anonymous.cfa

    r69867ad9 rcaaf424  
    1 #include <fstream.hfa>
     1#include <stdio.h>
    22enum(unsigned long int ) { nthreads = 17 };
    33
    44int main() {
    5     sout | nthreads;
     5    printf("%lu", nthreads);
    66}
    77
  • tests/enum_tests/enumInlineValue.cfa

    r69867ad9 rcaaf424  
    1212    enum enumB val = A;
    1313    sout | "enumB.A is" | val;
    14     enum enumB val2 = enumB.B;
     14    enum enumB val2= enumB.B;
    1515    sout | "enumB.B is" | val2;
    1616    sout | "enumB.D is" | enumB.D;
  • tests/enum_tests/position.cfa

    r69867ad9 rcaaf424  
    1212
    1313int main () {
    14     Colour fishy;
    15     fishy = Colour.Green;
    16     fishy;
     14    Colour fishy; // posE()
     15    fishy = Colour.Green; // value(fishy) = Colour.Green;
     16    fishy; // valueE( fishy );
     17
     18    printf( "Compile Time: blue value: %s, position: %d, label: %s, default return value: %s \n", valueE(Colour.Blue), posE(Colour.Blue), labelE(Colour.Blue), Colour.Blue );
     19    printf( "Runtime: fishy value: %s, position: %d, label: %s, default return value: %s\n", valueE(fishy), posE(fishy), labelE(fishy), fishy );
    1720    Colour c2 = fishy;
    18 
    19     sout | "Compile Time: blue value: " | valueE(Colour.Blue) | ", position: " | posE(Colour.Blue) | ", label: " | labelE(Colour.Blue) | ", default return value: " | Colour.Blue;
    20     sout | "Runtime: fishy value: " | valueE(fishy) | ", position: " | posE(fishy) | ", label: " | labelE(fishy) | ", default return value: " | fishy;
    21     sout | "Runtime: C2 value: " | valueE(c2) | ", position: " | posE(c2) | ", label: " | labelE(c2) | ", default return value: " | c2;
     21    printf( "Runtime: C2 value: %s, position: %d, label: %s, default return value: %s\n", valueE(c2), posE(c2), labelE(c2), c2 );
    2222    Colour.Red;
    2323    char * ao = Colour.Red;
     
    2929    Plain a = B;
    3030    printf( "%d \n", a );
    31    
    3231}
  • tests/enum_tests/stringEnum.cfa

    r69867ad9 rcaaf424  
    1 #include <fstream.hfa>
    21#include <stdio.h>
    32
     
    87
    98int main() {
    10     sout | "zero: "| zero | ", one: " | one;
    11     printf("zero: %d, one: %d\n", zero, one);
     9    printf("zero: %s, one: %s\n", zero, one);
    1210    return 0;
    1311}
  • tests/enum_tests/typedIntEnum.cfa

    r69867ad9 rcaaf424  
    1 #include <fstream.hfa>
     1#include <stdio.h>
    22
    33enum(int) IntEnum {
     
    1212
    1313int main() {
    14     sout | "0=" | zero;
    15     sout | "1=" | one;
    16     sout | "1000=" | thousand;
    17     sout | "1001=" | thousand_one;
    18     sout | "2000=" | two_thousand;
    19     sout | "2001=" | two_thousand_one;
    20     sout | "2002=" | two_thousand_two;
     14    printf("0=%d\n", zero);
     15    printf("1=%d\n", one);
     16    printf("1000=%d\n", thousand);
     17    printf("1001=%d\n", thousand_one);
     18    printf("2000=%d\n", two_thousand);
     19    printf("2001=%d\n", two_thousand_one);
     20    printf("2002=%d\n", two_thousand_two);
    2121    return 0;
    2222}
Note: See TracChangeset for help on using the changeset viewer.