diff options
author | 2017-02-16 10:34:05 -0800 | |
---|---|---|
committer | 2017-02-16 10:34:05 -0800 | |
commit | 188abab46185604c097c19a011e66bafc1f59846 (patch) | |
tree | c8df004299c9ee89dc4fa92935e528d98d2ffc48 | |
parent | 0eb36438abb475aeffb8611cb99d1502e0df32fc (diff) |
ART: Add support for generic field signature
Add support for generic_ptr to GetFieldName.
Bug: 34615460
Test: m test-art-host-run-test-918-fields
Change-Id: If754461e1dbbfd775746d0883d0cb7e613b494e4
-rw-r--r-- | runtime/openjdkjvmti/ti_field.cc | 22 | ||||
-rw-r--r-- | test/918-fields/expected.txt | 4 | ||||
-rw-r--r-- | test/918-fields/src/Main.java | 5 |
3 files changed, 31 insertions, 0 deletions
diff --git a/runtime/openjdkjvmti/ti_field.cc b/runtime/openjdkjvmti/ti_field.cc index a762830d85..131e6c3632 100644 --- a/runtime/openjdkjvmti/ti_field.cc +++ b/runtime/openjdkjvmti/ti_field.cc @@ -34,7 +34,9 @@ #include "art_jvmti.h" #include "art_field-inl.h" #include "base/enums.h" +#include "dex_file_annotations.h" #include "jni_internal.h" +#include "mirror/object_array-inl.h" #include "modifiers.h" #include "scoped_thread_state_change-inl.h" #include "thread-inl.h" @@ -91,6 +93,26 @@ jvmtiError FieldUtil::GetFieldName(jvmtiEnv* env, // TODO: Support generic signature. if (generic_ptr != nullptr) { *generic_ptr = nullptr; + if (!art_field->GetDeclaringClass()->IsProxyClass()) { + art::mirror::ObjectArray<art::mirror::String>* str_array = + art::annotations::GetSignatureAnnotationForField(art_field); + if (str_array != nullptr) { + std::ostringstream oss; + for (int32_t i = 0; i != str_array->GetLength(); ++i) { + oss << str_array->Get(i)->ToModifiedUtf8(); + } + std::string output_string = oss.str(); + unsigned char* tmp; + jvmtiError ret = CopyString(env, output_string.c_str(), &tmp); + if (ret != ERR(NONE)) { + return ret; + } + *generic_ptr = reinterpret_cast<char*>(tmp); + } else if (soa.Self()->IsExceptionPending()) { + // TODO: Should we report an error here? + soa.Self()->ClearException(); + } + } } // Everything is fine, release the buffers. diff --git a/test/918-fields/expected.txt b/test/918-fields/expected.txt index 39d3e70550..1a1209c34c 100644 --- a/test/918-fields/expected.txt +++ b/test/918-fields/expected.txt @@ -14,3 +14,7 @@ true interface Main$Bar 25 false +[generics, Ljava/lang/Object;, TT;] +class Main$Generics +0 +false diff --git a/test/918-fields/src/Main.java b/test/918-fields/src/Main.java index 3ba535b31b..ad0d0c5dc2 100644 --- a/test/918-fields/src/Main.java +++ b/test/918-fields/src/Main.java @@ -27,6 +27,7 @@ public class Main { testField(Integer.class, "value"); testField(Foo.class, "this$0"); testField(Bar.class, "VAL"); + testField(Generics.class, "generics"); } private static void testField(Class<?> base, String fieldName) @@ -65,4 +66,8 @@ public class Main { private static interface Bar { public static int VAL = 1; } + + private static class Generics<T> { + T generics; + } } |