// Translate a bci to its corresponding data, or NULL. ProfileData* methodDataOopDesc::bci_to_data(int bci) { ProfileData* data = data_before(bci); for ( ; is_valid(data); data = next_data(data)) { if (data->bci() == bci) { set_hint_di(dp_to_di(data->dp())); return data; } else if (data->bci() > bci) { break; } } return bci_to_extra_data(bci, false); }
// Translate a bci to its corresponding data index (di). address methodDataOopDesc::bci_to_dp(int bci) { ResourceMark rm; ProfileData* data = data_before(bci); ProfileData* prev = NULL; for ( ; is_valid(data); data = next_data(data)) { if (data->bci() >= bci) { if (data->bci() == bci) set_hint_di(dp_to_di(data->dp())); else if (prev != NULL) set_hint_di(dp_to_di(prev->dp())); return data->dp(); } prev = data; } return (address)limit_data_position(); }
// Give each of the data entries a chance to perform specific // data initialization. void methodDataOopDesc::post_initialize(BytecodeStream* stream) { ResourceMark rm; ProfileData* data; for (data = first_data(); is_valid(data); data = next_data(data)) { stream->set_start(data->bci()); stream->next(); data->post_initialize(stream, this); } }