summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--vm/oo/Class.cpp32
1 files changed, 19 insertions, 13 deletions
diff --git a/vm/oo/Class.cpp b/vm/oo/Class.cpp
index cc31e4e57..eb816b0f3 100644
--- a/vm/oo/Class.cpp
+++ b/vm/oo/Class.cpp
@@ -2913,20 +2913,26 @@ static bool createVtable(ClassObject* clazz)
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;
}
}