Mercurial > hg > graal-jvmci-8
diff src/share/vm/prims/jvm.cpp @ 2177:3582bf76420e
6990754: Use native memory and reference counting to implement SymbolTable
Summary: move symbols from permgen into C heap and reference count them
Reviewed-by: never, acorn, jmasa, stefank
author | coleenp |
---|---|
date | Thu, 27 Jan 2011 16:11:27 -0800 |
parents | ccfcb502af3f |
children | d70fe6ab4436 |
line wrap: on
line diff
--- a/src/share/vm/prims/jvm.cpp Thu Jan 27 13:42:28 2011 -0800 +++ b/src/share/vm/prims/jvm.cpp Thu Jan 27 16:11:27 2011 -0800 @@ -124,9 +124,9 @@ vframeStream vfst(jthread); // scan up the stack skipping ClassLoader, AccessController and PrivilegedAction frames - symbolHandle access_controller = oopFactory::new_symbol_handle("java/security/AccessController", CHECK); + TempNewSymbol access_controller = SymbolTable::new_symbol("java/security/AccessController", CHECK); klassOop access_controller_klass = SystemDictionary::resolve_or_fail(access_controller, false, CHECK); - symbolHandle privileged_action = oopFactory::new_symbol_handle("java/security/PrivilegedAction", CHECK); + TempNewSymbol privileged_action = SymbolTable::new_symbol("java/security/PrivilegedAction", CHECK); klassOop privileged_action_klass = SystemDictionary::resolve_or_fail(privileged_action, false, CHECK); methodOop last_caller = NULL; @@ -175,7 +175,7 @@ // show method name if it's a native method trace = vfst.method()->name_and_sig_as_C_string(); } - symbolOop s = instanceKlass::cast(caller)->source_file_name(); + Symbol* s = instanceKlass::cast(caller)->source_file_name(); if (s != NULL) { source_file = s->as_C_string(); } @@ -311,8 +311,8 @@ JavaCalls::call_virtual(&r, props, KlassHandle(THREAD, SystemDictionary::Properties_klass()), - vmSymbolHandles::put_name(), - vmSymbolHandles::object_object_object_signature(), + vmSymbols::put_name(), + vmSymbols::object_object_object_signature(), key_str, value_str, THREAD); @@ -716,13 +716,13 @@ JVMWrapper2("JVM_FindClassFromBootLoader %s", name); // Java libraries should ensure that name is never null... - if (name == NULL || (int)strlen(name) > symbolOopDesc::max_length()) { + if (name == NULL || (int)strlen(name) > Symbol::max_length()) { // It's impossible to create this class; the name cannot fit // into the constant pool. return NULL; } - symbolHandle h_name = oopFactory::new_symbol_handle(name, CHECK_NULL); + TempNewSymbol h_name = SymbolTable::new_symbol(name, CHECK_NULL); klassOop k = SystemDictionary::resolve_or_null(h_name, CHECK_NULL); if (k == NULL) { return NULL; @@ -740,7 +740,7 @@ JVMWrapper3("JVM_FindClassFromClassLoader %s throw %s", name, throwError ? "error" : "exception"); // Java libraries should ensure that name is never null... - if (name == NULL || (int)strlen(name) > symbolOopDesc::max_length()) { + if (name == NULL || (int)strlen(name) > Symbol::max_length()) { // It's impossible to create this class; the name cannot fit // into the constant pool. if (throwError) { @@ -749,7 +749,7 @@ THROW_MSG_0(vmSymbols::java_lang_ClassNotFoundException(), name); } } - symbolHandle h_name = oopFactory::new_symbol_handle(name, CHECK_NULL); + TempNewSymbol h_name = SymbolTable::new_symbol(name, CHECK_NULL); Handle h_loader(THREAD, JNIHandles::resolve(loader)); jclass result = find_class_from_class_loader(env, h_name, init, h_loader, Handle(), throwError, THREAD); @@ -764,12 +764,12 @@ JVM_ENTRY(jclass, JVM_FindClassFromClass(JNIEnv *env, const char *name, jboolean init, jclass from)) JVMWrapper2("JVM_FindClassFromClass %s", name); - if (name == NULL || (int)strlen(name) > symbolOopDesc::max_length()) { + if (name == NULL || (int)strlen(name) > Symbol::max_length()) { // It's impossible to create this class; the name cannot fit // into the constant pool. THROW_MSG_0(vmSymbols::java_lang_NoClassDefFoundError(), name); } - symbolHandle h_name = oopFactory::new_symbol_handle(name, CHECK_NULL); + TempNewSymbol h_name = SymbolTable::new_symbol(name, CHECK_NULL); oop from_class_oop = JNIHandles::resolve(from); klassOop from_class = (from_class_oop == NULL) ? (klassOop)NULL @@ -838,15 +838,15 @@ // Since exceptions can be thrown, class initialization can take place // if name is NULL no check for class name in .class stream has to be made. - symbolHandle class_name; + TempNewSymbol class_name = NULL; if (name != NULL) { const int str_len = (int)strlen(name); - if (str_len > symbolOopDesc::max_length()) { + if (str_len > Symbol::max_length()) { // It's impossible to create this class; the name cannot fit // into the constant pool. THROW_MSG_0(vmSymbols::java_lang_NoClassDefFoundError(), name); } - class_name = oopFactory::new_symbol_handle(name, str_len, CHECK_NULL); + class_name = SymbolTable::new_symbol(name, str_len, CHECK_NULL); } ResourceMark rm(THREAD); @@ -905,12 +905,12 @@ if (str == NULL) return NULL; const int str_len = (int)strlen(str); - if (str_len > symbolOopDesc::max_length()) { + if (str_len > Symbol::max_length()) { // It's impossible to create this class; the name cannot fit // into the constant pool. return NULL; } - symbolHandle klass_name = oopFactory::new_symbol_handle(str, str_len,CHECK_NULL); + TempNewSymbol klass_name = SymbolTable::new_symbol(str, str_len, CHECK_NULL); // Security Note: // The Java level wrapper will perform the necessary security check allowing @@ -1155,8 +1155,8 @@ !pending_exception->is_a(SystemDictionary::RuntimeException_klass())) { // Throw a java.security.PrivilegedActionException(Exception e) exception JavaCallArguments args(pending_exception); - THROW_ARG_0(vmSymbolHandles::java_security_PrivilegedActionException(), - vmSymbolHandles::exception_void_signature(), + THROW_ARG_0(vmSymbols::java_security_PrivilegedActionException(), + vmSymbols::exception_void_signature(), &args); } } @@ -1452,8 +1452,8 @@ if (!java_lang_Class::is_primitive(JNIHandles::resolve(cls))) { klassOop k = java_lang_Class::as_klassOop(JNIHandles::resolve(cls)); if (Klass::cast(k)->oop_is_instance()) { - symbolHandle sym = symbolHandle(THREAD, instanceKlass::cast(k)->generic_signature()); - if (sym.is_null()) return NULL; + Symbol* sym = instanceKlass::cast(k)->generic_signature(); + if (sym == NULL) return NULL; Handle str = java_lang_String::create_from_symbol(sym, CHECK_NULL); return (jstring) JNIHandles::make_local(env, str()); } @@ -1842,8 +1842,8 @@ if (k_o == NULL) return NULL; } instanceKlassHandle k(THREAD, k_o); - symbolOop name = cp->uncached_name_ref_at(index); - symbolOop sig = cp->uncached_signature_ref_at(index); + Symbol* name = cp->uncached_name_ref_at(index); + Symbol* sig = cp->uncached_signature_ref_at(index); methodHandle m (THREAD, k->find_method(name, sig)); if (m.is_null()) { THROW_MSG_0(vmSymbols::java_lang_RuntimeException(), "Unable to look up method in target class"); @@ -1893,8 +1893,8 @@ if (k_o == NULL) return NULL; } instanceKlassHandle k(THREAD, k_o); - symbolOop name = cp->uncached_name_ref_at(index); - symbolOop sig = cp->uncached_signature_ref_at(index); + Symbol* name = cp->uncached_name_ref_at(index); + Symbol* sig = cp->uncached_signature_ref_at(index); fieldDescriptor fd; klassOop target_klass = k->find_field(name, sig, &fd); if (target_klass == NULL) { @@ -1937,9 +1937,9 @@ THROW_MSG_0(vmSymbols::java_lang_IllegalArgumentException(), "Wrong type at constant pool index"); } int klass_ref = cp->uncached_klass_ref_index_at(index); - symbolHandle klass_name (THREAD, cp->klass_name_at(klass_ref)); - symbolHandle member_name(THREAD, cp->uncached_name_ref_at(index)); - symbolHandle member_sig (THREAD, cp->uncached_signature_ref_at(index)); + Symbol* klass_name = cp->klass_name_at(klass_ref); + Symbol* member_name = cp->uncached_name_ref_at(index); + Symbol* member_sig = cp->uncached_signature_ref_at(index); objArrayOop dest_o = oopFactory::new_objArray(SystemDictionary::String_klass(), 3, CHECK_NULL); objArrayHandle dest(THREAD, dest_o); Handle str = java_lang_String::create_from_symbol(klass_name, CHECK_NULL); @@ -2028,8 +2028,7 @@ if (!tag.is_symbol()) { THROW_MSG_0(vmSymbols::java_lang_IllegalArgumentException(), "Wrong type at constant pool index"); } - symbolOop sym_o = cp->symbol_at(index); - symbolHandle sym(THREAD, sym_o); + Symbol* sym = cp->symbol_at(index); Handle str = java_lang_String::create_from_symbol(sym, CHECK_NULL); return (jstring) JNIHandles::make_local(str()); } @@ -2356,7 +2355,7 @@ klassOop k = java_lang_Class::as_klassOop(JNIHandles::resolve_non_null(cls)); k = JvmtiThreadState::class_to_verify_considering_redefinition(k, thread); constantPoolOop cp = instanceKlass::cast(k)->constants(); - symbolOop classname = cp->klass_name_at(cp_index); + Symbol* classname = cp->klass_name_at(cp_index); return classname->as_utf8(); JVM_END @@ -2369,7 +2368,7 @@ switch (cp->tag_at(cp_index).value()) { case JVM_CONSTANT_Fieldref: { int class_index = cp->uncached_klass_ref_index_at(cp_index); - symbolOop classname = cp->klass_name_at(class_index); + Symbol* classname = cp->klass_name_at(class_index); return classname->as_utf8(); } default: @@ -2389,7 +2388,7 @@ case JVM_CONSTANT_Methodref: case JVM_CONSTANT_InterfaceMethodref: { int class_index = cp->uncached_klass_ref_index_at(cp_index); - symbolOop classname = cp->klass_name_at(class_index); + Symbol* classname = cp->klass_name_at(class_index); return classname->as_utf8(); } default: @@ -2410,8 +2409,8 @@ constantPoolOop cp_called = instanceKlass::cast(k_called)->constants(); switch (cp->tag_at(cp_index).value()) { case JVM_CONSTANT_Fieldref: { - symbolOop name = cp->uncached_name_ref_at(cp_index); - symbolOop signature = cp->uncached_signature_ref_at(cp_index); + Symbol* name = cp->uncached_name_ref_at(cp_index); + Symbol* signature = cp->uncached_signature_ref_at(cp_index); typeArrayOop fields = instanceKlass::cast(k_called)->fields(); int fields_count = fields->length(); for (int i = 0; i < fields_count; i += instanceKlass::next_offset) { @@ -2440,8 +2439,8 @@ switch (cp->tag_at(cp_index).value()) { case JVM_CONSTANT_Methodref: case JVM_CONSTANT_InterfaceMethodref: { - symbolOop name = cp->uncached_name_ref_at(cp_index); - symbolOop signature = cp->uncached_signature_ref_at(cp_index); + Symbol* name = cp->uncached_name_ref_at(cp_index); + Symbol* signature = cp->uncached_signature_ref_at(cp_index); objArrayOop methods = instanceKlass::cast(k_called)->methods(); int methods_count = methods->length(); for (int i = 0; i < methods_count; i++) { @@ -2629,8 +2628,8 @@ JavaCalls::call_virtual(&result, obj, KlassHandle(THREAD, SystemDictionary::Thread_klass()), - vmSymbolHandles::run_method_name(), - vmSymbolHandles::void_method_signature(), + vmSymbols::run_method_name(), + vmSymbols::void_method_signature(), THREAD); } @@ -3113,9 +3112,8 @@ Handle class_name_str = java_lang_String::internalize_classname(h_name, CHECK_0); const char* str = java_lang_String::as_utf8_string(class_name_str()); - symbolHandle class_name_sym = - symbolHandle(THREAD, SymbolTable::probe(str, (int)strlen(str))); - if (class_name_sym.is_null()) { + TempNewSymbol class_name_sym = SymbolTable::probe(str, (int)strlen(str)); + if (class_name_sym == NULL) { return -1; } @@ -3125,7 +3123,7 @@ if (!vfst.method()->is_native()) { klassOop holder = vfst.method()->method_holder(); assert(holder->is_klass(), "just checking"); - if (instanceKlass::cast(holder)->name() == class_name_sym()) { + if (instanceKlass::cast(holder)->name() == class_name_sym) { return depth; } depth++; @@ -3324,13 +3322,13 @@ const char* str = java_lang_String::as_utf8_string(string()); - if (str == NULL || (int)strlen(str) > symbolOopDesc::max_length()) { + if (str == NULL || (int)strlen(str) > Symbol::max_length()) { // It's impossible to create this class; the name cannot fit // into the constant pool. THROW_MSG_0(vmSymbols::java_lang_NoClassDefFoundError(), str); } - symbolHandle name = oopFactory::new_symbol_handle(str, CHECK_NULL); + TempNewSymbol name = SymbolTable::new_symbol(str, CHECK_NULL); Handle curr_klass (THREAD, JNIHandles::resolve(currClass)); // Find the most recent class on the stack with a non-null classloader oop loader = NULL; @@ -3973,7 +3971,7 @@ // Shared JNI/JVM entry points ////////////////////////////////////////////////////////////// -jclass find_class_from_class_loader(JNIEnv* env, symbolHandle name, jboolean init, Handle loader, Handle protection_domain, jboolean throwError, TRAPS) { +jclass find_class_from_class_loader(JNIEnv* env, Symbol* name, jboolean init, Handle loader, Handle protection_domain, jboolean throwError, TRAPS) { // Security Note: // The Java level wrapper will perform the necessary security check allowing // us to pass the NULL as the initiating class loader. @@ -4069,14 +4067,13 @@ Handle str (THREAD, JNIHandles::resolve_non_null(name)); const char* cstr = java_lang_String::as_utf8_string(str()); - symbolHandle field_name = - symbolHandle(THREAD, SymbolTable::probe(cstr, (int)strlen(cstr))); - if (field_name.is_null()) { + TempNewSymbol field_name = SymbolTable::probe(cstr, (int)strlen(cstr)); + if (field_name == NULL) { THROW_0(vmSymbols::java_lang_NoSuchFieldException()); } oop mirror = JNIHandles::resolve_non_null(cls); - oop result = Reflection::reflect_field(mirror, field_name(), which, CHECK_NULL); + oop result = Reflection::reflect_field(mirror, field_name, which, CHECK_NULL); if (result == NULL) { THROW_0(vmSymbols::java_lang_NoSuchFieldException()); } @@ -4093,9 +4090,8 @@ Handle str (THREAD, JNIHandles::resolve_non_null(name)); const char* cstr = java_lang_String::as_utf8_string(str()); - symbolHandle method_name = - symbolHandle(THREAD, SymbolTable::probe(cstr, (int)strlen(cstr))); - if (method_name.is_null()) { + TempNewSymbol method_name = SymbolTable::probe(cstr, (int)strlen(cstr)); + if (method_name == NULL) { THROW_0(vmSymbols::java_lang_NoSuchMethodException()); } @@ -4468,16 +4464,14 @@ dest->obj_at_put(0, Klass::cast(enc_k)->java_mirror()); int encl_method_method_idx = ik_h->enclosing_method_method_index(); if (encl_method_method_idx != 0) { - symbolOop sym_o = ik_h->constants()->symbol_at( + Symbol* sym = ik_h->constants()->symbol_at( extract_low_short_from_int( ik_h->constants()->name_and_type_at(encl_method_method_idx))); - symbolHandle sym(THREAD, sym_o); Handle str = java_lang_String::create_from_symbol(sym, CHECK_NULL); dest->obj_at_put(1, str()); - sym_o = ik_h->constants()->symbol_at( + sym = ik_h->constants()->symbol_at( extract_high_short_from_int( ik_h->constants()->name_and_type_at(encl_method_method_idx))); - sym = symbolHandle(THREAD, sym_o); str = java_lang_String::create_from_symbol(sym, CHECK_NULL); dest->obj_at_put(2, str()); }