src/share/vm/classfile/javaClasses.cpp

changeset 1100
c89f86385056
parent 1014
0fbdb4381b99
child 1145
e5b0439ef4ae
     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());

mercurial