| 1228 | } |
| 1229 | |
| 1230 | ExpressionPtr replaceGeneratorIfThenElse ( ExprIfThenElse * expr, const FunctionPtr & func ) { |
| 1231 | auto blk = new ExprBlock(); |
| 1232 | blk->at = expr->at; |
| 1233 | blk->isCollapseable = true; |
| 1234 | if ( expr->if_false ) { |
| 1235 | auto else_label = func->totalGenLabel ++; |
| 1236 | auto end_label = func->totalGenLabel ++; |
| 1237 | auto gtel = new ExprGoto(expr->at, else_label); |
| 1238 | auto btel = new ExprBlock(); |
| 1239 | btel->at = expr->at; |
| 1240 | btel->list.push_back(gtel); |
| 1241 | auto ncnd = new ExprOp1(expr->cond->at, "!", expr->cond->clone()); |
| 1242 | auto ifnc = new ExprIfThenElse(expr->at, ncnd, btel, nullptr); |
| 1243 | blk->list.push_back(ifnc); |
| 1244 | auto ift = expr->if_true->clone(); |
| 1245 | if ( ift->rtti_isBlock() ){ |
| 1246 | auto iftb = static_cast<ExprBlock*>(ift); |
| 1247 | iftb->isCollapseable = true; |
| 1248 | giveBlockVariablesUniqueNames(ift); |
| 1249 | } |
| 1250 | blk->list.push_back(ift); |
| 1251 | auto gten = new ExprGoto(expr->at, end_label); |
| 1252 | blk->list.push_back(gten); |
| 1253 | auto elsel = new ExprLabel(expr->at, else_label, |
| 1254 | "else if at line " + to_string(expr->at.line)); |
| 1255 | blk->list.push_back(elsel); |
| 1256 | auto iff = expr->if_false->clone(); |
| 1257 | if ( iff->rtti_isBlock() ){ |
| 1258 | auto iffb = static_cast<ExprBlock*>(iff); |
| 1259 | iffb->isCollapseable = true; |
| 1260 | giveBlockVariablesUniqueNames(iff); |
| 1261 | } |
| 1262 | blk->list.push_back(iff); |
| 1263 | auto enddl = new ExprLabel(expr->at, end_label, |
| 1264 | "end if at line " + to_string(expr->at.line)); |
| 1265 | blk->list.push_back(enddl); |
| 1266 | } else { |
| 1267 | auto end_label = func->totalGenLabel ++; |
| 1268 | auto gtel = new ExprGoto(expr->at, end_label); |
| 1269 | auto btel = new ExprBlock(); |
| 1270 | btel->at = expr->at; |
| 1271 | btel->list.push_back(gtel); |
| 1272 | auto ncnd = new ExprOp1(expr->cond->at, "!", expr->cond->clone()); |
| 1273 | auto ifnc = new ExprIfThenElse(expr->at, ncnd, btel, nullptr); |
| 1274 | blk->list.push_back(ifnc); |
| 1275 | auto ift = expr->if_true->clone(); |
| 1276 | if ( ift->rtti_isBlock() ){ |
| 1277 | auto iftb = static_cast<ExprBlock*>(ift); |
| 1278 | iftb->isCollapseable = true; |
| 1279 | giveBlockVariablesUniqueNames(ift); |
| 1280 | } |
| 1281 | blk->list.push_back(ift); |
| 1282 | auto enddl = new ExprLabel(expr->at, end_label, |
| 1283 | "end if at line " + to_string(expr->at.line)); |
| 1284 | blk->list.push_back(enddl); |
| 1285 | } |
| 1286 | verifyGenerated(blk); |
| 1287 | return blk; |
no test coverage detected