Mercurial > hg > truffle
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