- Timestamp:
- Apr 28, 2024, 7:50:11 PM (8 months ago)
- Branches:
- master
- Children:
- c5c123f
- Parents:
- 7042c60
- Location:
- src
- Files:
-
- 5 edited
Legend:
- Unmodified
- Added
- Removed
-
src/ResolvExpr/CandidateFinder.cpp
r7042c60 reb7586e 906 906 } 907 907 CandidateRef & choice = winners.front(); 908 choice->cost.inc Var();908 choice->cost.incSafe(); 909 909 candidates.emplace_back( std::move(choice) ); 910 910 } … … 1376 1376 ast::Expr * newExpr = data.combine( nameExpr->location, cost ); 1377 1377 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 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 ); 1385 1388 CandidateRef newCand = std::make_shared<Candidate>( 1386 newExpr, copy( tenv ), ast::OpenVarSet{}, ast::AssertionSet{}, bentConversion? Cost::safe:Cost::zero,1389 newExpr, copy( tenv ), ast::OpenVarSet{}, ast::AssertionSet{}, Cost::zero, 1387 1390 cost ); 1388 1389 1391 if (newCand->expr->env) { 1390 1392 newCand->env.add(*newCand->expr->env); … … 1829 1831 Cost cost = Cost::zero; 1830 1832 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 // ); 1831 1838 CandidateRef newCand = 1832 1839 std::make_shared<Candidate>( 1833 1840 newExpr, copy( tenv ), ast::OpenVarSet{}, 1834 ast::AssertionSet{}, Cost:: safe, cost1841 ast::AssertionSet{}, Cost::zero, cost 1835 1842 ); 1836 1837 1843 if (newCand->expr->env) { 1838 1844 newCand->env.add(*newCand->expr->env); -
src/ResolvExpr/CastCost.cc
r7042c60 reb7586e 53 53 } else { 54 54 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 } 55 61 } 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 // } 56 94 } 57 95 … … 80 118 cost = Cost::unsafe; 81 119 } 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; 82 126 } 83 127 } -
src/ResolvExpr/ConversionCost.cc
r7042c60 reb7586e 284 284 } else if ( auto dstAsEnumInst = dynamic_cast< const ast::EnumInstType * >( dst ) ) { 285 285 if ( dstAsEnumInst->base && !dstAsEnumInst->base->base ) { 286 cost = Cost::zero; 287 cost.incUnsafe(); 286 cost = Cost::unsafe; 288 287 } 289 288 } … … 482 481 } else if ( auto dstAsEnumInst = dynamic_cast< const ast::EnumInstType * >( dst ) ) { 483 482 if ( dstAsEnumInst->base && !dstAsEnumInst->base->base ) { 484 cost = Cost::zero; 485 cost.incUnsafe(); 483 cost = Cost::unsafe; 486 484 } 487 485 } … … 504 502 } else if ( auto dstAsEnumInst = dynamic_cast< const ast::EnumInstType * >( dst ) ) { 505 503 if ( dstAsEnumInst->base && !dstAsEnumInst->base->base ) { 506 cost = Cost::zero; 507 cost.incUnsafe(); 504 cost = Cost::unsafe; 508 505 } 509 506 } -
src/Validate/ImplementEnumFunc.cpp
r7042c60 reb7586e 30 30 void genAttrFunctions(); 31 31 void genSuccPredPosn(); 32 void genSuccPredDecl();32 // void genSuccPredDecl(); 33 33 34 34 void appendReturnThis(ast::FunctionDecl* decl) { … … 73 73 const ast::Decl* getDecl() const { return decl; } 74 74 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 75 86 ast::FunctionDecl* genPosnProto() const; 76 87 ast::FunctionDecl* genLabelProto() const; 77 88 ast::FunctionDecl* genValueProto() const; 89 90 // Serial trait 91 ast::FunctionDecl* genFromIntProto() const; 92 ast::FunctionDecl* genFromInstanceProto() const; 78 93 ast::FunctionDecl* genSuccProto() const; 79 94 ast::FunctionDecl* genPredProto() const; 95 96 void genFromIntBody(ast::FunctionDecl *) const; 97 void genFromInstanceBody(ast::FunctionDecl *) const; 98 //////////////// 80 99 81 100 ast::FunctionDecl* genSuccPosProto() const; … … 313 332 } 314 333 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 315 393 ast::FunctionDecl* EnumAttrFuncGenerator::genSuccProto() const { 316 394 return genProto( … … 327 405 {new ast::ObjectDecl(getLocation(), "_ret", 328 406 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); 329 448 } 330 449 … … 373 492 func->location, "?[?]", 374 493 {new ast::NameExpr(func->location, arrDecl->name), 375 376 377 378 379 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))}); 380 499 func->stmts = new ast::CompoundStmt( 381 500 func->location, {new ast::ReturnStmt(func->location, untyped)}); … … 450 569 451 570 void EnumAttrFuncGenerator::genAttrFunctions() { 452 if (decl->base) { 453 genAttributesDecls(ast::EnumAttribute::Value); 454 genAttributesDecls(ast::EnumAttribute::Label); 455 genAttributesDecls(ast::EnumAttribute::Posn); 456 } 457 } 458 459 void EnumAttrFuncGenerator::genSuccPredDecl() { 460 if (decl->base) { 461 auto succProto = genSuccProto(); 462 auto predProto = genPredProto(); 463 464 produceForwardDecl(succProto); 465 produceForwardDecl(predProto); 466 } 467 } 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 // } 468 583 469 584 void EnumAttrFuncGenerator::genSuccPredPosn() { 470 if (decl->base) { 471 ast::FunctionDecl* succ = genSuccPredFunc(true); 472 ast::FunctionDecl* pred = genSuccPredFunc(false); 473 474 produceDecl(succ); 475 produceDecl(pred); 476 } 585 ast::FunctionDecl* succ = genSuccPredFunc(true); 586 ast::FunctionDecl* pred = genSuccPredFunc(false); 587 588 produceDecl(succ); 589 produceDecl(pred); 477 590 } 478 591 … … 482 595 genAttrStandardFuncs(); 483 596 genAttrFunctions(); 484 genSuccPredDecl(); 485 genSuccPredPosn(); // Posn 597 genSerialTraitFuncs(); 598 genSuccPredPosn(); 599 // problematic 600 genBoundedFunctions(); 486 601 // Now export the lists contents. 487 602 decls.splice(decls.end(), forwards); -
src/main.cc
r7042c60 reb7586e 325 325 PASS( "Validate Generic Parameters", Validate::fillGenericParameters, transUnit ); 326 326 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 ); 327 330 PASS( "Check Function Returns", Validate::checkReturnStatements, transUnit ); 328 331 PASS( "Fix Return Statements", InitTweak::fixReturnStatements, transUnit ); … … 333 336 334 337 PASS( "Generate Autogen Routines", Validate::autogenerateRoutines, transUnit ); 335 PASS( "Generate Enum Attributes Functions", Validate::implementEnumFunc, transUnit ); 336 338 337 339 PASS( "Implement Actors", Concurrency::implementActors, transUnit ); 338 340 PASS( "Implement Virtual Destructors", Virtual::implementVirtDtors, transUnit );
Note: See TracChangeset
for help on using the changeset viewer.