void nteh_gentables(Symbol *sfunc) { symbol *s = s_table; symbol_debug(s); #if MARS //except_fillInEHTable(s); #else /* NTEH table for C. * The table consists of triples: * parent index * filter address * handler address */ unsigned fsize = 4; // target size of function pointer DtBuilder dtb; int sz = 0; // size so far for (block *b = startblock; b; b = b->Bnext) { if (b->BC == BC_try) { block *bhandler; dtb.dword(b->Blast_index); // parent index // If try-finally if (b->numSucc() == 2) { dtb.dword(0); // filter address bhandler = b->nthSucc(1); assert(bhandler->BC == BC_finally); // To successor of BC_finally block bhandler = bhandler->nthSucc(0); } else // try-except { bhandler = b->nthSucc(1); assert(bhandler->BC == BC_filter); dtb.coff(bhandler->Boffset); // filter address bhandler = b->nthSucc(2); assert(bhandler->BC == BC_except); } dtb.coff(bhandler->Boffset); // handler address sz += 4 + fsize * 2; } } assert(sz != 0); s->Sdt = dtb.finish(); #endif outdata(s); // output the scope table #if MARS nteh_framehandler(sfunc, s); #endif s_table = NULL; }
void nteh_gentables() { symbol *s = s_table; symbol_debug(s); #if MARS //except_fillInEHTable(s); #else /* NTEH table for C. * The table consists of triples: * parent index * filter address * handler address */ unsigned fsize = 4; // target size of function pointer dt_t **pdt = &s->Sdt; int sz = 0; // size so far for (block *b = startblock; b; b = b->Bnext) { if (b->BC == BC_try) { dt_t *dt; block *bhandler; pdt = dtdword(pdt,b->Blast_index); // parent index // If try-finally if (list_nitems(b->Bsucc) == 2) { pdt = dtdword(pdt,0); // filter address bhandler = list_block(list_next(b->Bsucc)); assert(bhandler->BC == BC_finally); // To successor of BC_finally block bhandler = list_block(bhandler->Bsucc); } else // try-except { bhandler = list_block(list_next(b->Bsucc)); assert(bhandler->BC == BC_filter); pdt = dtcoff(pdt,bhandler->Boffset); // filter address bhandler = list_block(list_next(list_next(b->Bsucc))); assert(bhandler->BC == BC_except); } pdt = dtcoff(pdt,bhandler->Boffset); // handler address sz += 4 + fsize * 2; } } assert(sz != 0); #endif outdata(s); // output the scope table #if MARS nteh_framehandler(s); #endif s_table = NULL; }