diff options
-rw-r--r-- | vm/oo/Class.cpp | 32 |
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; } } |