Warn if we see a class whose behavior has changed because of https://android-review.googlesource.com/#/c/32480/.
Change-Id: Ic7ca229a92c8d1bd666ecf64209d061301dcb0c9
diff --git a/vm/oo/Class.cpp b/vm/oo/Class.cpp
index cc31e4e..eb816b0 100644
--- a/vm/oo/Class.cpp
+++ b/vm/oo/Class.cpp
@@ -2913,20 +2913,26 @@
for (si = 0; si < clazz->super->vtableCount; si++) {
Method* superMeth = clazz->vtable[si];
- if (dvmCompareMethodNamesAndProtos(localMeth, superMeth) == 0 &&
- dvmCheckMethodAccess(clazz, superMeth)) {
- /* verify */
- if (dvmIsFinalMethod(superMeth)) {
- ALOGW("Method %s.%s overrides final %s.%s",
- localMeth->clazz->descriptor, localMeth->name,
- superMeth->clazz->descriptor, superMeth->name);
- goto bail;
+ if (dvmCompareMethodNamesAndProtos(localMeth, superMeth) == 0) {
+ if (dvmCheckMethodAccess(clazz, superMeth)) {
+ /* verify */
+ if (dvmIsFinalMethod(superMeth)) {
+ ALOGW("Method %s.%s overrides final %s.%s",
+ localMeth->clazz->descriptor, localMeth->name,
+ superMeth->clazz->descriptor, superMeth->name);
+ goto bail;
+ }
+ clazz->vtable[si] = localMeth;
+ localMeth->methodIndex = (u2) si;
+ //ALOGV("+++ override %s.%s (slot %d)",
+ // clazz->descriptor, localMeth->name, si);
+ break;
+ } else {
+ ALOGW("in older versions of dalvik, method %s.%s would have incorrectly "
+ "overridden package-private method with same name in %s",
+ localMeth->clazz->descriptor, localMeth->name,
+ superMeth->clazz->descriptor);
}
- clazz->vtable[si] = localMeth;
- localMeth->methodIndex = (u2) si;
- //ALOGV("+++ override %s.%s (slot %d)",
- // clazz->descriptor, localMeth->name, si);
- break;
}
}