void visit(GotoDefaultStatement *s) { block *b; Blockx *blx = irs->blx; block *bdest = irs->getDefaultBlock(); b = blx->curblock; // The rest is equivalent to GotoStatement // Adjust exception handler scope index if in different try blocks if (b->Btry != bdest->Btry) { // Check that bdest is in an enclosing try block for (block *bt = b->Btry; bt != bdest->Btry; bt = bt->Btry) { if (!bt) { //printf("b->Btry = %p, bdest->Btry = %p\n", b->Btry, bdest->Btry); s->error("cannot goto into try block"); break; } } //setScopeIndex(blx, b, bdest->Btry ? bdest->Btry->Bscope_index : -1); } b->appendSucc(bdest); incUsage(irs, s->loc); block_next(blx,BCgoto,NULL); }
void visit(DefaultStatement *s) { Blockx *blx = irs->blx; block *bcase = blx->curblock; block *bdefault = irs->getDefaultBlock(); block_next(blx,BCgoto,bdefault); bcase->appendSucc(blx->curblock); if (blx->tryblock != irs->getSwitchBlock()->Btry) s->error("default cannot be in different try block level from switch"); incUsage(irs, s->loc); if (s->statement) Statement_toIR(s->statement, irs); }