ART: Support object tagging
Add support for tagging in the JVMTI plugin.
Bug: 31385027
Test: m test-art-host
Change-Id: I4d8fb12cd23ca60dc0b0ce9051d1c77e5eb18aa9
diff --git a/runtime/openjdkjvmti/OpenjdkJvmTi.cc b/runtime/openjdkjvmti/OpenjdkJvmTi.cc
index a1a2361..bebc2fc 100644
--- a/runtime/openjdkjvmti/OpenjdkJvmTi.cc
+++ b/runtime/openjdkjvmti/OpenjdkJvmTi.cc
@@ -38,7 +38,11 @@
#include "art_jvmti.h"
#include "jni_env_ext-inl.h"
+#include "object_tagging.h"
+#include "obj_ptr-inl.h"
#include "runtime.h"
+#include "scoped_thread_state_change-inl.h"
+#include "thread_list.h"
#include "transform.h"
// TODO Remove this at some point by annotating all the methods. It was put in to make the skeleton
@@ -47,6 +51,8 @@
namespace openjdkjvmti {
+ObjectTagTable gObjectTagTable;
+
class JvmtiFunctions {
private:
static bool IsValidEnv(jvmtiEnv* env) {
@@ -270,11 +276,42 @@
}
static jvmtiError GetTag(jvmtiEnv* env, jobject object, jlong* tag_ptr) {
- return ERR(NOT_IMPLEMENTED);
+ if (object == nullptr || tag_ptr == nullptr) {
+ return ERR(NULL_POINTER);
+ }
+
+ JNIEnv* jni_env = GetJniEnv(env);
+ if (jni_env == nullptr) {
+ return ERR(INTERNAL);
+ }
+
+ art::ScopedObjectAccess soa(jni_env);
+ art::ObjPtr<art::mirror::Object> obj = soa.Decode<art::mirror::Object>(object);
+ if (!gObjectTagTable.GetTag(obj.Ptr(), tag_ptr)) {
+ *tag_ptr = 0;
+ }
+
+ return ERR(NONE);
}
static jvmtiError SetTag(jvmtiEnv* env, jobject object, jlong tag) {
- return ERR(NOT_IMPLEMENTED);
+ if (object == nullptr) {
+ return ERR(NULL_POINTER);
+ }
+
+ JNIEnv* jni_env = GetJniEnv(env);
+ if (jni_env == nullptr) {
+ return ERR(INTERNAL);
+ }
+
+ art::ScopedObjectAccess soa(jni_env);
+ art::ObjPtr<art::mirror::Object> obj = soa.Decode<art::mirror::Object>(object);
+ gObjectTagTable.Remove(obj.Ptr(), /* tag* */ nullptr);
+ if (tag != 0) {
+ gObjectTagTable.Add(obj.Ptr(), tag);
+ }
+
+ return ERR(NONE);
}
static jvmtiError GetObjectsWithTags(jvmtiEnv* env,