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()) {