diff options
author | Mathieu Chartier <mathieuc@google.com> | 2014-05-16 10:59:25 -0700 |
---|---|---|
committer | Mathieu Chartier <mathieuc@google.com> | 2014-05-18 12:50:33 -0700 |
commit | f832284dd847ff077577bb5712225430bbbb3b67 (patch) | |
tree | 44f6b91098639c6ebc438b4ec998d0dc128cef9a /runtime/proxy_test.cc | |
parent | 8f0776768712b2021aa8fb649b51017b9f0fc7a9 (diff) | |
download | art-f832284dd847ff077577bb5712225430bbbb3b67.tar.gz art-f832284dd847ff077577bb5712225430bbbb3b67.tar.bz2 art-f832284dd847ff077577bb5712225430bbbb3b67.zip |
Delete ClassHelper and fix compaction bug in GetDirectInterface
Cleanup helps to prevent compaction bugs. Fixed a fairly serious
compaction error caused by calling ClassHelper::GetDirectInterface
without handling the case where it causes thread suspension due to
ResolveType.
Bug: 8981901
Change-Id: I82b3bb6dd48d21eb6ece7aae0733c4a23c2bc408
Diffstat (limited to 'runtime/proxy_test.cc')
-rw-r--r-- | runtime/proxy_test.cc | 39 |
1 files changed, 21 insertions, 18 deletions
diff --git a/runtime/proxy_test.cc b/runtime/proxy_test.cc index 8517e34969..f38fb2155b 100644 --- a/runtime/proxy_test.cc +++ b/runtime/proxy_test.cc @@ -107,30 +107,33 @@ class ProxyTest : public CommonCompilerTest { TEST_F(ProxyTest, ProxyClassHelper) { ScopedObjectAccess soa(Thread::Current()); jobject jclass_loader = LoadDex("Interfaces"); - StackHandleScope<1> hs(soa.Self()); + StackHandleScope<4> hs(soa.Self()); Handle<mirror::ClassLoader> class_loader( hs.NewHandle(soa.Decode<mirror::ClassLoader*>(jclass_loader))); - mirror::Class* I = class_linker_->FindClass(soa.Self(), "LInterfaces$I;", class_loader); - mirror::Class* J = class_linker_->FindClass(soa.Self(), "LInterfaces$J;", class_loader); - ASSERT_TRUE(I != nullptr); - ASSERT_TRUE(J != nullptr); - std::vector<mirror::Class*> interfaces; - interfaces.push_back(I); - interfaces.push_back(J); + Handle<mirror::Class> I(hs.NewHandle( + class_linker_->FindClass(soa.Self(), "LInterfaces$I;", class_loader))); + Handle<mirror::Class> J(hs.NewHandle( + class_linker_->FindClass(soa.Self(), "LInterfaces$J;", class_loader))); + ASSERT_TRUE(I.Get() != nullptr); + ASSERT_TRUE(J.Get() != nullptr); - mirror::Class* proxyClass = GenerateProxyClass(soa, jclass_loader, "$Proxy1234", interfaces); - ASSERT_TRUE(proxyClass != nullptr); - ASSERT_TRUE(proxyClass->IsProxyClass()); - ASSERT_TRUE(proxyClass->IsInitialized()); + std::vector<mirror::Class*> interfaces; + interfaces.push_back(I.Get()); + interfaces.push_back(J.Get()); + Handle<mirror::Class> proxy_class(hs.NewHandle( + GenerateProxyClass(soa, jclass_loader, "$Proxy1234", interfaces))); + interfaces.clear(); // Don't least possibly stale objects in the array as good practice. + ASSERT_TRUE(proxy_class.Get() != nullptr); + ASSERT_TRUE(proxy_class->IsProxyClass()); + ASSERT_TRUE(proxy_class->IsInitialized()); // Check ClassHelper for proxy. - ClassHelper kh(proxyClass); - EXPECT_EQ(kh.NumDirectInterfaces(), 2U); // Interfaces$I and Interfaces$J. - EXPECT_EQ(I, kh.GetDirectInterface(0)); - EXPECT_EQ(J, kh.GetDirectInterface(1)); - std::string proxyClassDescriptor(kh.GetDescriptor()); - EXPECT_EQ("L$Proxy1234;", proxyClassDescriptor); + EXPECT_EQ(proxy_class->NumDirectInterfaces(), 2U); // Interfaces$I and Interfaces$J. + EXPECT_EQ(I.Get(), mirror::Class::GetDirectInterface(soa.Self(), proxy_class, 0)); + EXPECT_EQ(J.Get(), mirror::Class::GetDirectInterface(soa.Self(), proxy_class, 1)); + std::string proxy_class_descriptor(proxy_class->GetDescriptor()); + EXPECT_STREQ("L$Proxy1234;", proxy_class_descriptor.c_str()); } // Creates a proxy class and check FieldHelper works correctly. |