/* *breif:获取表的间接引用对象. *param[iref]:间接引用表. */ Object* IndirectRefTable::get(IndirectRef iref) const { IndirectRefKind kind = indirectRefKind(iref); if (kind != kind_) { if (iref == NULL) { ALOGW("Attempt to look up NULL %s reference", indirectRefKindToString(kind_)); return kInvalidIndirectRefObject; } if (kind == kIndirectKindInvalid) { ALOGE("JNI ERROR (app bug): invalid %s reference %p", indirectRefKindToString(kind_), iref); abortMaybe(); return kInvalidIndirectRefObject; } // References of the requested kind cannot appear within this table. return kInvalidIndirectRefObject; } u4 topIndex = segmentState.parts.topIndex; u4 index = extractIndex(iref); if (index >= topIndex) { /* bad -- stale reference? */ ALOGE("JNI ERROR (app bug): accessed stale %s reference %p (index %d in a table of size %d)", indirectRefKindToString(kind_), iref, index, topIndex); abortMaybe(); return kInvalidIndirectRefObject; } Object* obj = table_[index].obj; if (obj == NULL) { ALOGI("JNI ERROR (app bug): accessed deleted %s reference %p", indirectRefKindToString(kind_), iref); abortMaybe(); return kInvalidIndirectRefObject; } u4 serial = extractSerial(iref); if (serial != table_[index].serial) { ALOGE("JNI ERROR (app bug): attempt to use stale %s reference %p", indirectRefKindToString(kind_), iref); abortMaybe(); return kInvalidIndirectRefObject; } return obj; }
/* * Make sure that the entry at "idx" is correctly paired with "iref". */ bool IndirectRefTable::checkEntry(const char* what, IndirectRef iref, int idx) const { Object* obj = table_[idx]; IndirectRef checkRef = toIndirectRef(obj, idx); if (checkRef != iref) { LOGE("JNI ERROR (app bug): attempt to %s stale %s reference %p (should be %p)", what, indirectRefKindToString(kind_), iref, checkRef); abortMaybe(); return false; } return true; }
/* * Verify that the indirect table lookup is valid. * * Returns "false" if something looks bad. */ bool IndirectRefTable::getChecked(IndirectRef iref) const { if (iref == NULL) { LOGW("Attempt to look up NULL %s reference", indirectRefKindToString(kind_)); return false; } if (indirectRefKind(iref) == kIndirectKindInvalid) { LOGE("JNI ERROR (app bug): invalid %s reference %p", indirectRefKindToString(kind_), iref); abortMaybe(); return false; } int topIndex = segmentState.parts.topIndex; int idx = extractIndex(iref); if (idx >= topIndex) { /* bad -- stale reference? */ LOGE("JNI ERROR (app bug): accessed stale %s reference %p (index %d in a table of size %d)", indirectRefKindToString(kind_), iref, idx, topIndex); abortMaybe(); return false; } if (table_[idx] == NULL) { LOGI("JNI ERROR (app bug): accessed deleted %s reference %p", indirectRefKindToString(kind_), iref); abortMaybe(); return false; } if (!checkEntry("use", iref, idx)) { return false; } return true; }