diff options
author | 2017-02-01 20:40:44 -0800 | |
---|---|---|
committer | 2017-02-02 10:53:14 -0800 | |
commit | ae78c2643375c7536affcec318a60d13d430f181 (patch) | |
tree | d7299730b4e84107d544f66b6a046af75f367669 /runtime/interpreter/unstarted_runtime_test.cc | |
parent | a85111c5f25310e3d0eac68a6f0d8cd7c6612dfe (diff) |
ART: Add UnstartedRuntime support for Class.getSimpleName
This requires two native methods, isAnonymousClass and
getDeclaringClass.
Add tests.
Bug: 34890992
Test: m
Test: m test-art-host
Test: Device boots
Change-Id: Ib3fca2a6bb6e367ef202ff864719cab979d6c793
Diffstat (limited to 'runtime/interpreter/unstarted_runtime_test.cc')
-rw-r--r-- | runtime/interpreter/unstarted_runtime_test.cc | 59 |
1 files changed, 59 insertions, 0 deletions
diff --git a/runtime/interpreter/unstarted_runtime_test.cc b/runtime/interpreter/unstarted_runtime_test.cc index b190c81aff..ae55f4c2ef 100644 --- a/runtime/interpreter/unstarted_runtime_test.cc +++ b/runtime/interpreter/unstarted_runtime_test.cc @@ -885,5 +885,64 @@ TEST_F(UnstartedRuntimeTest, Pow) { ShadowFrame::DeleteDeoptimizedFrame(tmp); } +TEST_F(UnstartedRuntimeTest, IsAnonymousClass) { + Thread* self = Thread::Current(); + ScopedObjectAccess soa(self); + + JValue result; + ShadowFrame* shadow_frame = ShadowFrame::CreateDeoptimizedFrame(10, nullptr, nullptr, 0); + + mirror::Class* class_klass = mirror::Class::GetJavaLangClass(); + shadow_frame->SetVRegReference(0, class_klass); + UnstartedClassIsAnonymousClass(self, shadow_frame, &result, 0); + EXPECT_EQ(result.GetZ(), 0); + + jobject class_loader = LoadDex("Nested"); + StackHandleScope<1> hs(soa.Self()); + Handle<mirror::ClassLoader> loader( + hs.NewHandle(soa.Decode<mirror::ClassLoader>(class_loader))); + mirror::Class* c = class_linker_->FindClass(soa.Self(), "LNested$1;", loader); + ASSERT_TRUE(c != nullptr); + shadow_frame->SetVRegReference(0, c); + UnstartedClassIsAnonymousClass(self, shadow_frame, &result, 0); + EXPECT_EQ(result.GetZ(), 1); + + ShadowFrame::DeleteDeoptimizedFrame(shadow_frame); +} + +TEST_F(UnstartedRuntimeTest, GetDeclaringClass) { + Thread* self = Thread::Current(); + ScopedObjectAccess soa(self); + + JValue result; + ShadowFrame* shadow_frame = ShadowFrame::CreateDeoptimizedFrame(10, nullptr, nullptr, 0); + + jobject class_loader = LoadDex("Nested"); + StackHandleScope<4> hs(self); + Handle<mirror::ClassLoader> loader( + hs.NewHandle(soa.Decode<mirror::ClassLoader>(class_loader))); + + Handle<mirror::Class> nested_klass(hs.NewHandle( + class_linker_->FindClass(soa.Self(), "LNested;", loader))); + Handle<mirror::Class> inner_klass(hs.NewHandle( + class_linker_->FindClass(soa.Self(), "LNested$Inner;", loader))); + Handle<mirror::Class> anon_klass(hs.NewHandle( + class_linker_->FindClass(soa.Self(), "LNested$1;", loader))); + + shadow_frame->SetVRegReference(0, nested_klass.Get()); + UnstartedClassGetDeclaringClass(self, shadow_frame, &result, 0); + EXPECT_EQ(result.GetL(), nullptr); + + shadow_frame->SetVRegReference(0, inner_klass.Get()); + UnstartedClassGetDeclaringClass(self, shadow_frame, &result, 0); + EXPECT_EQ(result.GetL(), nested_klass.Get()); + + shadow_frame->SetVRegReference(0, anon_klass.Get()); + UnstartedClassGetDeclaringClass(self, shadow_frame, &result, 0); + EXPECT_EQ(result.GetL(), nullptr); + + ShadowFrame::DeleteDeoptimizedFrame(shadow_frame); +} + } // namespace interpreter } // namespace art |