Hi,
please review this patch, it allows to export to Java the host_class used
to create the anonymous class.

cheers,
Rémi

diff --git a/src/share/vm/oops/instanceKlass.hpp b/src/share/vm/oops/instanceKlass.hpp
--- a/src/share/vm/oops/instanceKlass.hpp
+++ b/src/share/vm/oops/instanceKlass.hpp
@@ -373,8 +373,8 @@ class instanceKlass: public Klass {
   void set_protection_domain(oop pd)       { oop_store((oop*) &_protection_domain, pd); }
 
   // host class
-  oop host_klass() const                   { return _host_klass; }
-  void set_host_klass(oop host)            { oop_store((oop*) &_host_klass, host); }
+  klassOop host_klass() const              { return _host_klass; }
+  void set_host_klass(klassOop host)       { oop_store((oop*) &_host_klass, host); }
   bool is_anonymous() const                { return _host_klass != NULL; }
 
   // signers
diff --git a/src/share/vm/prims/unsafe.cpp b/src/share/vm/prims/unsafe.cpp
--- a/src/share/vm/prims/unsafe.cpp
+++ b/src/share/vm/prims/unsafe.cpp
@@ -861,6 +861,26 @@ UNSAFE_END
 UNSAFE_END
 
 
+UNSAFE_ENTRY(jclass, Unsafe_GetAnonymousHostClass(JNIEnv *env, jobject unsafe, jclass cls))
+  UnsafeWrapper("Unsafe_GetAnonymousHostClass");
+  {
+    oop mirror = JNIHandles::resolve_non_null(cls);
+    KlassHandle klass(THREAD, java_lang_Class::as_klassOop(mirror));
+    if (java_lang_Class::is_primitive(mirror) ||
+        !(Klass::cast(klass())->oop_is_instance())) {
+      return NULL;
+    }
+
+    klassOop host_klass = instanceKlass::cast(klass())->host_klass();
+    if (host_klass == NULL) 
+      return NULL;
+
+    return (jclass) JNIHandles::make_local(env, 
+      instanceKlassHandle(THREAD, host_klass)->java_mirror());
+  }
+UNSAFE_END
+
+
 UNSAFE_ENTRY(void, Unsafe_MonitorEnter(JNIEnv *env, jobject unsafe, jobject jobj))
   UnsafeWrapper("Unsafe_MonitorEnter");
   {
@@ -1315,7 +1335,8 @@ JNINativeMethod memcopy_methods_15[] = {
 };
 
 JNINativeMethod dynlang_methods[] = {
-    {CC"defineAnonymousClass", CC"("DAC_Args")"CLS,      FN_PTR(Unsafe_DefineAnonymousClass)},
+    {CC"defineAnonymousClass",  CC"("DAC_Args")"CLS,     FN_PTR(Unsafe_DefineAnonymousClass)},
+    {CC"getAnonymousHostClass", CC"("CLS")"CLS,          FN_PTR(Unsafe_GetAnonymousHostClass)},
 };
 
 #undef CC
_______________________________________________
mlvm-dev mailing list
[email protected]
http://mail.openjdk.java.net/mailman/listinfo/mlvm-dev

Reply via email to