- Timestamp:
- Jun 27, 2024, 4:42:01 PM (6 months ago)
- Branches:
- master
- Children:
- 7552fde
- Parents:
- d5efcb7
- Location:
- src
- Files:
-
- 9 edited
Legend:
- Unmodified
- Added
- Removed
-
src/AST/Stmt.hpp
rd5efcb7 rd3aa55e9 238 238 ptr<Expr> inc; 239 239 ptr<Expr> range_over; 240 bool is_inc; 240 241 ptr<Stmt> body; 241 242 ptr<Stmt> else_; … … 251 252 range_over(nullptr), body(body), else_(else_) {} 252 253 253 ForStmt( const CodeLocation & loc, const std::vector<ptr<Stmt>> && inits, const Expr * range_over, 254 ForStmt( const CodeLocation & loc, const std::vector<ptr<Stmt>> && inits, const Expr * range_over, bool is_inc, 254 255 const Stmt * body, const Stmt * else_ ) 255 : Stmt(loc, std::move(labels)), inits(std::move(inits)), range_over(range_over), body(body), else_(else_) {} 256 : Stmt(loc, std::move(labels)), inits(std::move(inits)), range_over(range_over), is_inc(is_inc), 257 body(body), else_(else_) {} 256 258 257 259 const Stmt * accept( Visitor & v ) const override { return v.visit( this ); } -
src/ControlStruct/TranslateEnumRange.cpp
rd5efcb7 rd3aa55e9 26 26 auto enumDecl = enumInst->base; 27 27 28 auto init = stmt->inits.front();28 auto objInit = stmt->inits.front(); 29 29 30 if (auto declStmt = init.as<ast::DeclStmt>()) { 30 auto initLocation = objInit->location; 31 auto rangeLocation = stmt->range_over->location; 32 assert( stmt->inits.size() == 1 ); 33 34 if (auto declStmt = objInit.as<ast::DeclStmt>()) { 31 35 auto decl = declStmt->decl; 32 36 if ( auto objDecl = decl.as<ast::ObjectDecl>()) { … … 57 61 if ( !objDecl->init ) { 58 62 auto location = stmt->location; 59 auto newInit = new ast::SingleInit( location, new ast::NameExpr( location, enumDecl->members.front()->name ) ); 63 ast::SingleInit * newInit; 64 newInit = new ast::SingleInit( location, 65 new ast::NameExpr( location, 66 stmt->is_inc? enumDecl->members.front()->name: enumDecl->members.back()->name ) ); 60 67 auto objDeclWithInit = ast::mutate_field( objDecl, &ast::ObjectDecl::init, newInit ); 61 68 auto declWithInit = ast::mutate_field( declStmt, &ast::DeclStmt::decl, objDeclWithInit ); … … 78 85 auto enumInst = typeExpr->type.strict_as<ast::EnumInstType>(); 79 86 auto enumDecl = enumInst->base; 80 81 auto condition = ast::UntypedExpr::createCall( location, "?<=?", { 82 new ast::NameExpr( location, indexName ), 83 // ast::ConstantExpr::from_ulong( location, enumDecl->members.size() ) 84 new ast::NameExpr( location, enumDecl->members.back()->name ) 85 }); 86 auto increment = ast::UntypedExpr::createCall( location, "succ", { 87 new ast::NameExpr( location, indexName ) 88 }); 87 88 // Both inc and dec check if the current posn less than the number of enumerator 89 // for dec, it keeps call pred until it passes 0 (the first enumerator) and underflow, 90 // it wraps around and become unsigned max 91 ast::UntypedExpr * condition = ast::UntypedExpr::createCall( location, 92 "?<=?", 93 { 94 ast::UntypedExpr::createCall(location, "posn", { new ast::NameExpr( location, indexName ) } ), 95 ast::ConstantExpr::from_ulong( location, enumDecl->members.size()-1 ) 96 }); 97 auto increment = ast::UntypedExpr::createCall( location, 98 stmt->is_inc? "succ": "pred", 99 { new ast::NameExpr( location, indexName ) }); 89 100 auto assig = ast::UntypedExpr::createAssign( location, new ast::NameExpr( location, indexName ), increment ); 90 101 auto mut = ast::mutate_field( stmt, &ast::ForStmt::cond, condition ); -
src/Parser/StatementNode.cpp
rd5efcb7 rd3aa55e9 216 216 return new ast::ForStmt( location, 217 217 std::move( astinit ), 218 range_over, 218 range_over, forctl->kind == OperKinds::LThan, 219 219 buildMoveSingle( stmt ), 220 220 buildMoveOptional( else_ ) -
src/Parser/StatementNode.hpp
rd5efcb7 rd3aa55e9 64 64 ForCtrl( StatementNode * stmt, ExpressionNode * condition, ExpressionNode * change ) : 65 65 init( stmt ), condition( condition ), change( change ), range_over( nullptr ) {} 66 ForCtrl( StatementNode * decl, ExpressionNode * _range_over) :67 init( decl ), condition( nullptr ), change( nullptr ), range_over( _range_over) {}66 ForCtrl( StatementNode * decl, ExpressionNode * range_over, OperKinds kind ) : 67 init( decl ), condition( nullptr ), change( nullptr ), range_over( range_over ), kind( kind ) {} 68 68 69 69 StatementNode * init; … … 71 71 ExpressionNode * change; 72 72 ExpressionNode * range_over; 73 OperKinds kind; 73 74 }; 74 75 -
src/Parser/parser.yy
rd5efcb7 rd3aa55e9 279 279 DeclarationNode * indexDecl = DeclarationNode::newName( new std::string(identifier->name) ); 280 280 assert( range_over_expr ); 281 return new ForCtrl( new StatementNode( indexDecl ), range_over_expr );281 return new ForCtrl( new StatementNode( indexDecl ), range_over_expr, compop ); 282 282 } else { 283 283 SemanticError( yylloc, MISSING_LOOP_INDEX ); return nullptr; -
src/ResolvExpr/CandidateFinder.cpp
rd5efcb7 rd3aa55e9 698 698 void postvisit( const ast::CountExpr * countExpr ); 699 699 700 const ast::Expr * makeEnumOffsetCast( const ast::EnumInstType * src,701 const ast::EnumInstType * dst702 , const ast::Expr * expr, Cost minCost );703 704 700 void postvisit( const ast::InitExpr * ) { 705 701 assertf( false, "CandidateFinder should never see a resolved InitExpr." ); … … 1213 1209 } 1214 1210 1215 // src is a subset of dst1216 const ast::Expr * Finder::makeEnumOffsetCast( const ast::EnumInstType * src,1217 const ast::EnumInstType * dst,1218 const ast::Expr * expr,1219 Cost minCost ) {1220 1221 auto srcDecl = src->base;1222 auto dstDecl = dst->base;1223 1224 if (srcDecl->name == dstDecl->name) return expr;1225 1226 for (auto& dstChild: dstDecl->inlinedDecl) {1227 Cost c = castCost(src, dstChild, false, symtab, tenv);1228 ast::CastExpr * castToDst;1229 if (c<minCost) {1230 unsigned offset = dstDecl->calChildOffset(dstChild.get());1231 if (offset > 0) {1232 auto untyped = ast::UntypedExpr::createCall(1233 expr->location,1234 "?+?",1235 { new ast::CastExpr( expr, new ast::BasicType(ast::BasicKind::SignedInt) ),1236 ast::ConstantExpr::from_int(expr->location, offset)});1237 CandidateFinder finder(context, tenv);1238 finder.find( untyped );1239 CandidateList winners = findMinCost( finder.candidates );1240 CandidateRef & choice = winners.front();1241 // choice->expr = referenceToRvalueConversion( choice->expr, choice->cost );1242 choice->expr = new ast::CastExpr(expr->location, choice->expr, dstChild, ast::GeneratedFlag::ExplicitCast);1243 // castToDst = new ast::CastExpr(choice->expr, dstChild);1244 castToDst = new ast::CastExpr(1245 makeEnumOffsetCast( src, dstChild, choice->expr, minCost ),1246 dst);1247 1248 } else {1249 castToDst = new ast::CastExpr( expr, dst );1250 }1251 return castToDst;1252 }1253 }1254 SemanticError(expr, src->base->name + " is not a subtype of " + dst->base->name);1255 return nullptr;1256 }1257 1258 1211 void Finder::postvisit( const ast::CastExpr * castExpr ) { 1259 1212 ast::ptr< ast::Type > toType = castExpr->result; … … 1309 1262 auto argAsEnum = cand->expr->result.as<ast::EnumInstType>(); 1310 1263 auto toAsEnum = toType.as<ast::EnumInstType>(); 1311 if ( argAsEnum && toAsEnum && argAsEnum->name != toAsEnum->name ) { 1312 ast::ptr<ast::Expr> offsetExpr = makeEnumOffsetCast(argAsEnum, toAsEnum, cand->expr, thisCost); 1264 if ( argAsEnum && toAsEnum && argAsEnum->name != toAsEnum->name ) { 1265 CandidateFinder subFinder(context, tenv); 1266 ast::ptr<ast::Expr> offsetExpr = subFinder.makeEnumOffsetCast(argAsEnum, toAsEnum, cand->expr, thisCost); 1313 1267 cand->expr = offsetExpr; 1314 1268 } … … 2193 2147 expr->location, 2194 2148 "?+?", 2195 { new ast::CastExpr( expr, new ast::BasicType(ast::BasicKind::SignedInt) ), 2196 ast::ConstantExpr::from_int(expr->location, offset)}); 2149 { new ast::CastExpr( expr->location, 2150 expr, 2151 new ast::BasicType(ast::BasicKind::SignedInt), 2152 ast::GeneratedFlag::ExplicitCast ), 2153 ast::ConstantExpr::from_int(expr->location, offset)} ); 2197 2154 CandidateFinder finder(context, env); 2198 2155 finder.find( untyped ); -
src/ResolvExpr/CastCost.cpp
rd5efcb7 rd3aa55e9 53 53 void postvisit( const ast::EnumInstType * enumInst ) { 54 54 cost = conversionCost( enumInst, dst, srcIsLvalue, symtab, env ); 55 56 if (Cost::unsafe < cost) { 57 static ast::ptr<ast::BasicType> integer = { new ast::BasicType( ast::BasicKind::SignedInt ) }; 58 Cost intCost = costCalc( integer, dst, srcIsLvalue, symtab, env ); 59 cost = intCost < cost? intCost: cost; 60 } 61 if ( enumInst->base->isTyped && enumInst->base->base ) { 62 auto baseConversionCost = 63 castCost( enumInst->base->base, dst, srcIsLvalue, symtab, env ); 64 cost = baseConversionCost < cost? baseConversionCost: cost; 65 } 55 66 } 56 67 -
src/ResolvExpr/ConversionCost.cpp
rd5efcb7 rd3aa55e9 162 162 Cost conversionCost( 163 163 const ast::Type * src, const ast::Type * dst, bool srcIsLvalue, 164 164 const ast::SymbolTable & symtab, const ast::TypeEnvironment & env 165 165 ) { 166 166 if ( const ast::TypeInstType * inst = dynamic_cast< const ast::TypeInstType * >( dst ) ) { … … 284 284 if ( const ast::BasicType * dstAsBasic = dynamic_cast< const ast::BasicType * >( dst ) ) { 285 285 conversionCostFromBasicToBasic( basicType, dstAsBasic ); 286 } 286 } else if ( auto dstAsEnumInst = dynamic_cast< const ast::EnumInstType * >( dst ) ) { 287 287 if ( dstAsEnumInst->base && !dstAsEnumInst->base->isTyped ) { 288 288 cost = Cost::unsafe; … … 368 368 return; 369 369 } 370 static ast::ptr<ast::BasicType> integer = { new ast::BasicType( ast::BasicKind::SignedInt ) }; 371 cost = costCalc( integer, dst, srcIsLvalue, symtab, env ); 370 372 371 if ( !inst->base->isTyped ) { 372 static ast::ptr<ast::BasicType> integer = { new ast::BasicType( ast::BasicKind::SignedInt ) }; 373 cost = costCalc( integer, dst, srcIsLvalue, symtab, env ); 373 374 if ( cost < Cost::unsafe ) { 374 375 cost.incSafe(); … … 376 377 return; 377 378 } 378 cost.incUnsafe();379 // cost.incUnsafe(); 379 380 } 380 381 -
src/ResolvExpr/Unify.cpp
rd5efcb7 rd3aa55e9 276 276 void postvisit( const ast::VoidType * ) { 277 277 result = dynamic_cast< const ast::VoidType * >( type2 ); 278 // || tryToUnifyWithEnumValue(vt, type2, tenv, need, have, open, noWiden());279 ;280 278 } 281 279 … … 284 282 result = basic->kind == basic2->kind; 285 283 } 286 // result = result || tryToUnifyWithEnumValue(basic, type2, tenv, need, have, open, noWiden());287 284 } 288 285 … … 293 290 noWiden()); 294 291 } 295 // result = result || tryToUnifyWithEnumValue(pointer, type2, tenv, need, have, open, noWiden());296 292 } 297 293 … … 312 308 result = unifyExact( 313 309 array->base, array2->base, tenv, need, have, open, noWiden()); 314 // || tryToUnifyWithEnumValue(array, type2, tenv, need, have, open, noWiden());315 310 } 316 311 … … 607 602 608 603 result = unifyList( types, types2, tenv, need, have, open ); 609 // || tryToUnifyWithEnumValue(tuple, type2, tenv, need, have, open, noWiden());610 604 } 611 605 612 606 void postvisit( const ast::VarArgsType * ) { 613 607 result = dynamic_cast< const ast::VarArgsType * >( type2 ); 614 // || tryToUnifyWithEnumValue(vat, type2, tenv, need, have, open, noWiden());615 608 } 616 609 617 610 void postvisit( const ast::ZeroType * ) { 618 611 result = dynamic_cast< const ast::ZeroType * >( type2 ); 619 // || tryToUnifyWithEnumValue(zt, type2, tenv, need, have, open, noWiden());620 612 } 621 613 622 614 void postvisit( const ast::OneType * ) { 623 615 result = dynamic_cast< const ast::OneType * >( type2 ); 624 // || tryToUnifyWithEnumValue(ot, type2, tenv, need, have, open, noWiden());625 616 } 626 617 };
Note: See TracChangeset
for help on using the changeset viewer.