Mercurial > projects > ldc
comparison gen/statements.cpp @ 652:c8fcde3337b0
Fix TryFinally without body or finalbody.
author | Christian Kamm <kamm incasoftware de> |
---|---|
date | Sun, 05 Oct 2008 22:26:25 +0200 |
parents | df196c8dea26 |
children | b411c41a9716 |
comparison
equal
deleted
inserted
replaced
651:5709381df7e8 | 652:c8fcde3337b0 |
---|---|
509 LOG_SCOPE; | 509 LOG_SCOPE; |
510 | 510 |
511 if (global.params.symdebug) | 511 if (global.params.symdebug) |
512 DtoDwarfStopPoint(loc.linnum); | 512 DtoDwarfStopPoint(loc.linnum); |
513 | 513 |
514 // if there's no finalbody or no body, things are simple | |
515 if (!finalbody) { | |
516 if (body) | |
517 body->toIR(p); | |
518 return; | |
519 } | |
520 if (!body) { | |
521 finalbody->toIR(p); | |
522 return; | |
523 } | |
524 | |
514 // create basic blocks | 525 // create basic blocks |
515 llvm::BasicBlock* oldend = p->scopeend(); | 526 llvm::BasicBlock* oldend = p->scopeend(); |
516 | 527 |
517 llvm::BasicBlock* trybb = llvm::BasicBlock::Create("try", p->topfunc(), oldend); | 528 llvm::BasicBlock* trybb = llvm::BasicBlock::Create("try", p->topfunc(), oldend); |
518 llvm::BasicBlock* finallybb = llvm::BasicBlock::Create("finally", p->topfunc(), oldend); | 529 llvm::BasicBlock* finallybb = llvm::BasicBlock::Create("finally", p->topfunc(), oldend); |
527 // | 538 // |
528 // set up the landing pad | 539 // set up the landing pad |
529 // | 540 // |
530 p->scope() = IRScope(landingpadbb, endbb); | 541 p->scope() = IRScope(landingpadbb, endbb); |
531 | 542 |
543 assert(finalbody); | |
532 gIR->func()->landingPad.addFinally(finalbody); | 544 gIR->func()->landingPad.addFinally(finalbody); |
533 gIR->func()->landingPad.push(landingpadbb); | 545 gIR->func()->landingPad.push(landingpadbb); |
534 | 546 |
535 // | 547 // |
536 // do the try block | 548 // do the try block |
548 | 560 |
549 // | 561 // |
550 // do finally block | 562 // do finally block |
551 // | 563 // |
552 p->scope() = IRScope(finallybb,landingpadbb); | 564 p->scope() = IRScope(finallybb,landingpadbb); |
553 assert(finalbody); | |
554 finalbody->toIR(p); | 565 finalbody->toIR(p); |
555 | 566 |
556 // terminate finally | 567 // terminate finally |
557 //TODO: isn't it an error to have a 'returned' finally block? | 568 //TODO: isn't it an error to have a 'returned' finally block? |
558 if (!gIR->scopereturned()) { | 569 if (!gIR->scopereturned()) { |