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
diff --git a/runtime/interpreter/unstarted_runtime.cc b/runtime/interpreter/unstarted_runtime.cc
index feb6e08..371e2f1 100644
--- a/runtime/interpreter/unstarted_runtime.cc
+++ b/runtime/interpreter/unstarted_runtime.cc
@@ -401,6 +401,25 @@
result->SetL(constructor);
}
+void UnstartedRuntime::UnstartedClassGetDeclaringClass(
+ Thread* self, ShadowFrame* shadow_frame, JValue* result, size_t arg_offset) {
+ StackHandleScope<1> hs(self);
+ Handle<mirror::Class> klass(hs.NewHandle(
+ reinterpret_cast<mirror::Class*>(shadow_frame->GetVRegReference(arg_offset))));
+ if (klass->IsProxyClass() || klass->GetDexCache() == nullptr) {
+ result->SetL(nullptr);
+ return;
+ }
+ // Return null for anonymous classes.
+ JValue is_anon_result;
+ UnstartedClassIsAnonymousClass(self, shadow_frame, &is_anon_result, arg_offset);
+ if (is_anon_result.GetZ() != 0) {
+ result->SetL(nullptr);
+ return;
+ }
+ result->SetL(annotations::GetDeclaringClass(klass));
+}
+
void UnstartedRuntime::UnstartedClassGetEnclosingClass(
Thread* self, ShadowFrame* shadow_frame, JValue* result, size_t arg_offset) {
StackHandleScope<1> hs(self);
@@ -420,6 +439,23 @@
result->SetI(mirror::Class::GetInnerClassFlags(klass, default_value));
}
+void UnstartedRuntime::UnstartedClassIsAnonymousClass(
+ Thread* self, ShadowFrame* shadow_frame, JValue* result, size_t arg_offset) {
+ StackHandleScope<1> hs(self);
+ Handle<mirror::Class> klass(hs.NewHandle(
+ reinterpret_cast<mirror::Class*>(shadow_frame->GetVRegReference(arg_offset))));
+ if (klass->IsProxyClass() || klass->GetDexCache() == nullptr) {
+ result->SetZ(false);
+ return;
+ }
+ mirror::String* class_name = nullptr;
+ if (!annotations::GetInnerClass(klass, &class_name)) {
+ result->SetZ(false);
+ return;
+ }
+ result->SetZ(class_name == nullptr);
+}
+
static std::unique_ptr<MemMap> FindAndExtractEntry(const std::string& jar_file,
const char* entry_name,
size_t* size,