summaryrefslogtreecommitdiff
path: root/runtime/interpreter/unstarted_runtime_test.cc
diff options
context:
space:
mode:
Diffstat (limited to 'runtime/interpreter/unstarted_runtime_test.cc')
-rw-r--r--runtime/interpreter/unstarted_runtime_test.cc59
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