diff src/share/vm/prims/whitebox.cpp @ 6725:da91efe96a93

6964458: Reimplement class meta-data storage to use native memory Summary: Remove PermGen, allocate meta-data in metaspace linked to class loaders, rewrite GC walking, rewrite and rename metadata to be C++ classes Reviewed-by: jmasa, stefank, never, coleenp, kvn, brutisso, mgerdin, dholmes, jrose, twisti, roland Contributed-by: jmasa <jon.masamitsu@oracle.com>, stefank <stefan.karlsson@oracle.com>, mgerdin <mikael.gerdin@oracle.com>, never <tom.rodriguez@oracle.com>
author coleenp
date Sat, 01 Sep 2012 13:25:18 -0400
parents 5a1f452f8f90
children 4102b59539ce db9981fd3124
line wrap: on
line diff
--- a/src/share/vm/prims/whitebox.cpp	Fri Aug 31 16:39:35 2012 -0700
+++ b/src/share/vm/prims/whitebox.cpp	Sat Sep 01 13:25:18 2012 -0400
@@ -28,6 +28,7 @@
 #include "oops/oop.inline.hpp"
 
 #include "classfile/symbolTable.hpp"
+#include "classfile/classLoaderData.hpp"
 
 #include "prims/whitebox.hpp"
 #include "prims/wbtestmethods/parserTests.hpp"
@@ -52,6 +53,38 @@
   return heapOopSize;
 WB_END
 
+
+class WBIsKlassAliveClosure : public KlassClosure {
+    Symbol* _name;
+    bool _found;
+public:
+    WBIsKlassAliveClosure(Symbol* name) : _name(name), _found(false) {}
+
+    void do_klass(Klass* k) {
+      if (_found) return;
+      Symbol* ksym = k->name();
+      if (ksym->fast_compare(_name) == 0) {
+        _found = true;
+      }
+    }
+
+    bool found() const {
+        return _found;
+    }
+};
+
+WB_ENTRY(jboolean, WB_IsClassAlive(JNIEnv* env, jobject target, jstring name))
+  Handle h_name = JNIHandles::resolve(name);
+  if (h_name.is_null()) return false;
+  Symbol* sym = java_lang_String::as_symbol(h_name, CHECK_false);
+  TempNewSymbol tsym(sym); // Make sure to decrement reference count on sym on return
+
+  WBIsKlassAliveClosure closure(sym);
+  ClassLoaderDataGraph::classes_do(&closure);
+
+  return closure.found();
+WB_END
+
 #ifndef SERIALGC
 WB_ENTRY(jboolean, WB_G1IsHumongous(JNIEnv* env, jobject o, jobject obj))
   G1CollectedHeap* g1 = G1CollectedHeap::heap();
@@ -84,9 +117,9 @@
   Thread* THREAD = Thread::current();
 
   //Get the class of our object
-  klassOop arg_klass = object->klass();
+  Klass* arg_klass = object->klass();
   //Turn it into an instance-klass
-  instanceKlass* ik = instanceKlass::cast(arg_klass);
+  InstanceKlass* ik = InstanceKlass::cast(arg_klass);
 
   //Create symbols to look for in the class
   TempNewSymbol name_symbol = SymbolTable::lookup(field_name, (int) strlen(field_name),
@@ -95,7 +128,7 @@
   //To be filled in with an offset of the field we're looking for
   fieldDescriptor fd;
 
-  klassOop res = ik->find_field(name_symbol, signature_symbol, &fd);
+  Klass* res = ik->find_field(name_symbol, signature_symbol, &fd);
   if (res == NULL) {
     tty->print_cr("Invalid layout of %s at %s", ik->external_name(),
         name_symbol->as_C_string());
@@ -133,6 +166,7 @@
 static JNINativeMethod methods[] = {
   {CC"getObjectAddress",   CC"(Ljava/lang/Object;)J", (void*)&WB_GetObjectAddress  },
   {CC"getHeapOopSize",     CC"()I",                   (void*)&WB_GetHeapOopSize    },
+  {CC"isClassAlive0",       CC"(Ljava/lang/String;)Z", (void*)&WB_IsClassAlive      },
   {CC "parseCommandLine",
       CC "(Ljava/lang/String;[Lsun/hotspot/parser/DiagnosticCommand;)[Ljava/lang/Object;",
       (void*) &WB_ParseCommandLine