diff options
author | 2012-12-15 21:36:16 -0800 | |
---|---|---|
committer | 2012-12-15 22:36:34 -0800 | |
commit | 4c5b265e66bebf890b6f9e53cddeb512774b1613 (patch) | |
tree | 8278a6619b4dc4ec6009dcac01cf3fd4046108cb | |
parent | 2933d538b45cae733349b81a6a1d4a6f4dc9d3ec (diff) |
Test and fixes for invoke-interface on java.lang.Object methods.
Bug: 7614818
Change-Id: I704596cf3d36887e6d6d589cb3ec89e31d5b8901
-rw-r--r-- | src/class_linker.cc | 12 | ||||
-rw-r--r-- | src/object.cc | 6 | ||||
-rw-r--r-- | src/object.h | 2 | ||||
-rw-r--r-- | test/022-interface/classes/Iface1.class | bin | 389 -> 389 bytes | |||
-rw-r--r-- | test/022-interface/classes/ImplA.class | bin | 321 -> 321 bytes | |||
-rw-r--r-- | test/022-interface/classes/ImplB.class | bin | 506 -> 506 bytes | |||
-rw-r--r-- | test/022-interface/classes/ImplBSub.class | bin | 309 -> 309 bytes | |||
-rw-r--r-- | test/022-interface/classes/Main$SubInterface.class | bin | 0 -> 221 bytes | |||
-rw-r--r-- | test/022-interface/classes/Main$SubInterfaceImpl.class | bin | 0 -> 606 bytes | |||
-rw-r--r-- | test/022-interface/classes/Main.class | bin | 1307 -> 1599 bytes | |||
-rw-r--r-- | test/022-interface/classes/ObjectOverridingInterface.class | bin | 227 -> 269 bytes | |||
-rw-r--r-- | test/022-interface/classes/SubObjectOverridingInterface.class | bin | 0 -> 170 bytes | |||
-rw-r--r-- | test/022-interface/src/Main.java | 21 | ||||
-rw-r--r-- | test/022-interface/src/ObjectOverridingInterface.java | 1 | ||||
-rw-r--r-- | test/022-interface/src/SubObjectOverridingInterface.java | 18 |
15 files changed, 51 insertions, 9 deletions
diff --git a/src/class_linker.cc b/src/class_linker.cc index ca8a53287a..6fc6a3d5d6 100644 --- a/src/class_linker.cc +++ b/src/class_linker.cc @@ -3603,11 +3603,11 @@ Class* ClassLinker::ResolveType(const DexFile& dex_file, } AbstractMethod* ClassLinker::ResolveMethod(const DexFile& dex_file, - uint32_t method_idx, - DexCache* dex_cache, - ClassLoader* class_loader, - const AbstractMethod* referrer, - InvokeType type) { + uint32_t method_idx, + DexCache* dex_cache, + ClassLoader* class_loader, + const AbstractMethod* referrer, + InvokeType type) { DCHECK(dex_cache != NULL); // Check for hit in the dex cache. AbstractMethod* resolved = dex_cache->GetResolvedMethod(method_idx); @@ -3630,6 +3630,7 @@ AbstractMethod* ClassLinker::ResolveMethod(const DexFile& dex_file, break; case kInterface: resolved = klass->FindInterfaceMethod(dex_cache, method_idx); + DCHECK(resolved == NULL || resolved->GetDeclaringClass()->IsInterface()); break; case kSuper: // Fall-through. case kVirtual: @@ -3649,6 +3650,7 @@ AbstractMethod* ClassLinker::ResolveMethod(const DexFile& dex_file, break; case kInterface: resolved = klass->FindInterfaceMethod(name, signature); + DCHECK(resolved == NULL || resolved->GetDeclaringClass()->IsInterface()); break; case kSuper: // Fall-through. case kVirtual: diff --git a/src/object.cc b/src/object.cc index df42f8cce1..8565c386d7 100644 --- a/src/object.cc +++ b/src/object.cc @@ -1098,7 +1098,7 @@ AbstractMethod* Class::FindVirtualMethodForInterface(AbstractMethod* method) { return NULL; } -AbstractMethod* Class::FindInterfaceMethod(const StringPiece& name, const StringPiece& signature) const { +AbstractMethod* Class::FindInterfaceMethod(const StringPiece& name, const StringPiece& signature) const { // Check the current class before checking the interfaces. AbstractMethod* method = FindDeclaredVirtualMethod(name, signature); if (method != NULL) { @@ -1108,7 +1108,7 @@ AbstractMethod* Class::FindInterfaceMethod(const StringPiece& name, const Strin int32_t iftable_count = GetIfTableCount(); IfTable* iftable = GetIfTable(); for (int32_t i = 0; i < iftable_count; i++) { - method = iftable->GetInterface(i)->FindVirtualMethod(name, signature); + method = iftable->GetInterface(i)->FindDeclaredVirtualMethod(name, signature); if (method != NULL) { return method; } @@ -1126,7 +1126,7 @@ AbstractMethod* Class::FindInterfaceMethod(const DexCache* dex_cache, uint32_t d int32_t iftable_count = GetIfTableCount(); IfTable* iftable = GetIfTable(); for (int32_t i = 0; i < iftable_count; i++) { - method = iftable->GetInterface(i)->FindVirtualMethod(dex_cache, dex_method_idx); + method = iftable->GetInterface(i)->FindDeclaredVirtualMethod(dex_cache, dex_method_idx); if (method != NULL) { return method; } diff --git a/src/object.h b/src/object.h index ecd086b9fd..0eea8c38b1 100644 --- a/src/object.h +++ b/src/object.h @@ -986,7 +986,7 @@ class MANAGED AbstractMethod : public Object { ObjectArray<StaticStorageBase>* dex_cache_initialized_static_storage_; // short cuts to declaring_class_->dex_cache_ member for fast compiled code access - ObjectArray<Class>* dex_cache_resolved_methods_; + ObjectArray<AbstractMethod>* dex_cache_resolved_methods_; // short cuts to declaring_class_->dex_cache_ member for fast compiled code access ObjectArray<Class>* dex_cache_resolved_types_; diff --git a/test/022-interface/classes/Iface1.class b/test/022-interface/classes/Iface1.class Binary files differindex d11704cc1d..c9e64adea2 100644 --- a/test/022-interface/classes/Iface1.class +++ b/test/022-interface/classes/Iface1.class diff --git a/test/022-interface/classes/ImplA.class b/test/022-interface/classes/ImplA.class Binary files differindex de175bfabf..88af79235c 100644 --- a/test/022-interface/classes/ImplA.class +++ b/test/022-interface/classes/ImplA.class diff --git a/test/022-interface/classes/ImplB.class b/test/022-interface/classes/ImplB.class Binary files differindex 951bebdceb..f0de5e235a 100644 --- a/test/022-interface/classes/ImplB.class +++ b/test/022-interface/classes/ImplB.class diff --git a/test/022-interface/classes/ImplBSub.class b/test/022-interface/classes/ImplBSub.class Binary files differindex 1c1dcfd69b..193e42ba48 100644 --- a/test/022-interface/classes/ImplBSub.class +++ b/test/022-interface/classes/ImplBSub.class diff --git a/test/022-interface/classes/Main$SubInterface.class b/test/022-interface/classes/Main$SubInterface.class Binary files differnew file mode 100644 index 0000000000..97e9ffded2 --- /dev/null +++ b/test/022-interface/classes/Main$SubInterface.class diff --git a/test/022-interface/classes/Main$SubInterfaceImpl.class b/test/022-interface/classes/Main$SubInterfaceImpl.class Binary files differnew file mode 100644 index 0000000000..2fd44e33ae --- /dev/null +++ b/test/022-interface/classes/Main$SubInterfaceImpl.class diff --git a/test/022-interface/classes/Main.class b/test/022-interface/classes/Main.class Binary files differindex d9f22f7c22..e12b3c9d0f 100644 --- a/test/022-interface/classes/Main.class +++ b/test/022-interface/classes/Main.class diff --git a/test/022-interface/classes/ObjectOverridingInterface.class b/test/022-interface/classes/ObjectOverridingInterface.class Binary files differindex e9e8db5a7d..2bf784b040 100644 --- a/test/022-interface/classes/ObjectOverridingInterface.class +++ b/test/022-interface/classes/ObjectOverridingInterface.class diff --git a/test/022-interface/classes/SubObjectOverridingInterface.class b/test/022-interface/classes/SubObjectOverridingInterface.class Binary files differnew file mode 100644 index 0000000000..d5f38aa9f5 --- /dev/null +++ b/test/022-interface/classes/SubObjectOverridingInterface.class diff --git a/test/022-interface/src/Main.java b/test/022-interface/src/Main.java index 3c3c21ad50..9010c9827c 100644 --- a/test/022-interface/src/Main.java +++ b/test/022-interface/src/Main.java @@ -67,10 +67,31 @@ public class Main { }; doObjectOverrideTests(o); } + + private static interface SubInterface extends Cloneable, SubObjectOverridingInterface { + } + + private static class SubInterfaceImpl implements SubInterface { + public int length() { + return 0; + } + public char charAt(int i) { + return '!'; + } + public CharSequence subSequence(int s, int e) { + return ""; + } + } + + static String subObjectOverrideTests(SubInterface i) { + return i.toString(); + } + static void doObjectOverrideTests(ObjectOverridingInterface o) { check(o.equals(null)); check(o.hashCode() == 0xC001D00D); check(o.toString().equals("Mallet's Mallet")); + check(subObjectOverrideTests(new SubInterfaceImpl()) != null); System.out.println("objectOverrideTests: SUCCESS"); } } diff --git a/test/022-interface/src/ObjectOverridingInterface.java b/test/022-interface/src/ObjectOverridingInterface.java index a44cdf5346..a9e0abdc66 100644 --- a/test/022-interface/src/ObjectOverridingInterface.java +++ b/test/022-interface/src/ObjectOverridingInterface.java @@ -20,4 +20,5 @@ public interface ObjectOverridingInterface extends CharSequence { public boolean equals(Object o); public int hashCode(); + public String toString(); } diff --git a/test/022-interface/src/SubObjectOverridingInterface.java b/test/022-interface/src/SubObjectOverridingInterface.java new file mode 100644 index 0000000000..7babdcd332 --- /dev/null +++ b/test/022-interface/src/SubObjectOverridingInterface.java @@ -0,0 +1,18 @@ +/* + * Copyright (C) 2012 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +public interface SubObjectOverridingInterface extends ObjectOverridingInterface { +} |