HandlerTableEntry* ExceptionHandlerTable::entry_for(int catch_pco, int handler_bci, int scope_depth) const { HandlerTableEntry* t = subtable_for(catch_pco); if (t != NULL) { int l = t->len(); while (l-- > 0) { t++; if (t->bci() == handler_bci && t->scope_depth() == scope_depth) return t; } } return NULL; }
void ExceptionHandlerTable::add_subtable( int catch_pco, GrowableArray<intptr_t>* handler_bcis, GrowableArray<intptr_t>* scope_depths_from_top_scope, GrowableArray<intptr_t>* handler_pcos ) { assert(subtable_for(catch_pco) == NULL, "catch handlers for this catch_pco added twice"); assert(handler_bcis->length() == handler_pcos->length(), "bci & pc table have different length"); assert(scope_depths_from_top_scope == NULL || handler_bcis->length() == scope_depths_from_top_scope->length(), "bci & scope_depths table have different length"); if (handler_bcis->length() > 0) { // add subtable header add_entry(HandlerTableEntry(handler_bcis->length(), catch_pco, 0)); // add individual entries for (int i = 0; i < handler_bcis->length(); i++) { intptr_t scope_depth = 0; if (scope_depths_from_top_scope != NULL) { scope_depth = scope_depths_from_top_scope->at(i); } add_entry(HandlerTableEntry(handler_bcis->at(i), handler_pcos->at(i), scope_depth)); assert(entry_for(catch_pco, handler_bcis->at(i), scope_depth)->pco() == handler_pcos->at(i), "entry not added correctly (1)"); assert(entry_for(catch_pco, handler_bcis->at(i), scope_depth)->scope_depth() == scope_depth, "entry not added correctly (2)"); } } }
void ExceptionHandlerTable::print_subtable_for(int catch_pco) const { HandlerTableEntry* subtable = subtable_for(catch_pco); if( subtable != NULL ) { print_subtable( subtable ); } }
void ExceptionHandlerTable::print_subtable_for(int catch_pco, outputStream* out) const { HandlerTableEntry* subtable = subtable_for(catch_pco); if( subtable != NULL ) { print_subtable( subtable, out ); } }