1.1 --- a/src/share/vm/classfile/javaClasses.cpp Thu Mar 19 09:13:24 2009 -0700 1.2 +++ b/src/share/vm/classfile/javaClasses.cpp Fri Mar 20 23:19:36 2009 -0700 1.3 @@ -239,22 +239,20 @@ 1.4 typeArrayOop value = java_lang_String::value(obj); 1.5 int offset = java_lang_String::offset(obj); 1.6 int length = java_lang_String::length(obj); 1.7 - 1.8 - ResourceMark rm(THREAD); 1.9 - symbolHandle result; 1.10 - 1.11 - if (length > 0) { 1.12 - int utf8_length = UNICODE::utf8_length(value->char_at_addr(offset), length); 1.13 - char* chars = NEW_RESOURCE_ARRAY(char, utf8_length + 1); 1.14 - UNICODE::convert_to_utf8(value->char_at_addr(offset), length, chars); 1.15 - // Allocate the symbol 1.16 - result = oopFactory::new_symbol_handle(chars, utf8_length, CHECK_(symbolHandle())); 1.17 - } else { 1.18 - result = oopFactory::new_symbol_handle("", 0, CHECK_(symbolHandle())); 1.19 - } 1.20 - return result; 1.21 + jchar* base = value->char_at_addr(offset); 1.22 + symbolOop sym = SymbolTable::lookup_unicode(base, length, THREAD); 1.23 + return symbolHandle(THREAD, sym); 1.24 } 1.25 1.26 +symbolOop java_lang_String::as_symbol_or_null(oop java_string) { 1.27 + typeArrayOop value = java_lang_String::value(java_string); 1.28 + int offset = java_lang_String::offset(java_string); 1.29 + int length = java_lang_String::length(java_string); 1.30 + jchar* base = value->char_at_addr(offset); 1.31 + return SymbolTable::probe_unicode(base, length); 1.32 +} 1.33 + 1.34 + 1.35 int java_lang_String::utf8_length(oop java_string) { 1.36 typeArrayOop value = java_lang_String::value(java_string); 1.37 int offset = java_lang_String::offset(java_string); 1.38 @@ -385,6 +383,48 @@ 1.39 } 1.40 1.41 1.42 +void java_lang_Class::print_signature(oop java_class, outputStream* st) { 1.43 + assert(java_lang_Class::is_instance(java_class), "must be a Class object"); 1.44 + symbolOop name = NULL; 1.45 + bool is_instance = false; 1.46 + if (is_primitive(java_class)) { 1.47 + name = vmSymbols::type_signature(primitive_type(java_class)); 1.48 + } else { 1.49 + klassOop k = as_klassOop(java_class); 1.50 + is_instance = Klass::cast(k)->oop_is_instance(); 1.51 + name = Klass::cast(k)->name(); 1.52 + } 1.53 + if (name == NULL) { 1.54 + st->print("<null>"); 1.55 + return; 1.56 + } 1.57 + if (is_instance) st->print("L"); 1.58 + st->write((char*) name->base(), (int) name->utf8_length()); 1.59 + if (is_instance) st->print(";"); 1.60 +} 1.61 + 1.62 +symbolOop java_lang_Class::as_signature(oop java_class, bool intern_if_not_found, TRAPS) { 1.63 + assert(java_lang_Class::is_instance(java_class), "must be a Class object"); 1.64 + symbolOop name = NULL; 1.65 + if (is_primitive(java_class)) { 1.66 + return vmSymbols::type_signature(primitive_type(java_class)); 1.67 + } else { 1.68 + klassOop k = as_klassOop(java_class); 1.69 + if (!Klass::cast(k)->oop_is_instance()) { 1.70 + return Klass::cast(k)->name(); 1.71 + } else { 1.72 + ResourceMark rm; 1.73 + const char* sigstr = Klass::cast(k)->signature_name(); 1.74 + int siglen = (int) strlen(sigstr); 1.75 + if (!intern_if_not_found) 1.76 + return SymbolTable::probe(sigstr, siglen); 1.77 + else 1.78 + return oopFactory::new_symbol(sigstr, siglen, THREAD); 1.79 + } 1.80 + } 1.81 +} 1.82 + 1.83 + 1.84 klassOop java_lang_Class::array_klass(oop java_class) { 1.85 klassOop k = klassOop(java_class->obj_field(array_klass_offset)); 1.86 assert(k == NULL || k->is_klass() && Klass::cast(k)->oop_is_javaArray(), "should be array klass"); 1.87 @@ -412,6 +452,8 @@ 1.88 1.89 1.90 bool java_lang_Class::is_primitive(oop java_class) { 1.91 + // should assert: 1.92 + //assert(java_lang_Class::is_instance(java_class), "must be a Class object"); 1.93 klassOop k = klassOop(java_class->obj_field(klass_offset)); 1.94 return k == NULL; 1.95 } 1.96 @@ -431,6 +473,19 @@ 1.97 return type; 1.98 } 1.99 1.100 +BasicType java_lang_Class::as_BasicType(oop java_class, klassOop* reference_klass) { 1.101 + assert(java_lang_Class::is_instance(java_class), "must be a Class object"); 1.102 + if (is_primitive(java_class)) { 1.103 + if (reference_klass != NULL) 1.104 + (*reference_klass) = NULL; 1.105 + return primitive_type(java_class); 1.106 + } else { 1.107 + if (reference_klass != NULL) 1.108 + (*reference_klass) = as_klassOop(java_class); 1.109 + return T_OBJECT; 1.110 + } 1.111 +} 1.112 + 1.113 1.114 oop java_lang_Class::primitive_mirror(BasicType t) { 1.115 oop mirror = Universe::java_mirror(t); 1.116 @@ -1988,6 +2043,21 @@ 1.117 } 1.118 1.119 1.120 +void java_lang_boxing_object::print(BasicType type, jvalue* value, outputStream* st) { 1.121 + switch (type) { 1.122 + case T_BOOLEAN: st->print("%s", value->z ? "true" : "false"); break; 1.123 + case T_CHAR: st->print("%d", value->c); break; 1.124 + case T_BYTE: st->print("%d", value->b); break; 1.125 + case T_SHORT: st->print("%d", value->s); break; 1.126 + case T_INT: st->print("%d", value->i); break; 1.127 + case T_LONG: st->print(INT64_FORMAT, value->j); break; 1.128 + case T_FLOAT: st->print("%f", value->f); break; 1.129 + case T_DOUBLE: st->print("%lf", value->d); break; 1.130 + default: st->print("type %d?", type); break; 1.131 + } 1.132 +} 1.133 + 1.134 + 1.135 // Support for java_lang_ref_Reference 1.136 oop java_lang_ref_Reference::pending_list_lock() { 1.137 instanceKlass* ik = instanceKlass::cast(SystemDictionary::reference_klass());