hotspot/src/share/vm/classfile/javaClasses.cpp
changeset 33628 09241459a8b8
parent 33198 b37ad9fbf681
child 33638 ef49ed90010b
equal deleted inserted replaced
33627:c5b7455f846e 33628:09241459a8b8
   145   }
   145   }
   146 }
   146 }
   147 
   147 
   148 
   148 
   149 int java_lang_String::value_offset  = 0;
   149 int java_lang_String::value_offset  = 0;
   150 int java_lang_String::offset_offset = 0;
       
   151 int java_lang_String::count_offset  = 0;
       
   152 int java_lang_String::hash_offset   = 0;
   150 int java_lang_String::hash_offset   = 0;
       
   151 int java_lang_String::coder_offset  = 0;
   153 
   152 
   154 bool java_lang_String::initialized  = false;
   153 bool java_lang_String::initialized  = false;
   155 
   154 
   156 bool java_lang_String::is_instance(oop obj) {
   155 bool java_lang_String::is_instance(oop obj) {
   157   return is_instance_inlined(obj);
   156   return is_instance_inlined(obj);
   159 
   158 
   160 void java_lang_String::compute_offsets() {
   159 void java_lang_String::compute_offsets() {
   161   assert(!initialized, "offsets should be initialized only once");
   160   assert(!initialized, "offsets should be initialized only once");
   162 
   161 
   163   Klass* k = SystemDictionary::String_klass();
   162   Klass* k = SystemDictionary::String_klass();
   164   compute_offset(value_offset,           k, vmSymbols::value_name(),  vmSymbols::char_array_signature());
   163   compute_offset(value_offset,           k, vmSymbols::value_name(),  vmSymbols::byte_array_signature());
   165   compute_optional_offset(offset_offset, k, vmSymbols::offset_name(), vmSymbols::int_signature());
       
   166   compute_optional_offset(count_offset,  k, vmSymbols::count_name(),  vmSymbols::int_signature());
       
   167   compute_optional_offset(hash_offset,   k, vmSymbols::hash_name(),   vmSymbols::int_signature());
   164   compute_optional_offset(hash_offset,   k, vmSymbols::hash_name(),   vmSymbols::int_signature());
       
   165   compute_optional_offset(coder_offset,  k, vmSymbols::coder_name(),  vmSymbols::byte_signature());
   168 
   166 
   169   initialized = true;
   167   initialized = true;
   170 }
   168 }
   171 
   169 
   172 Handle java_lang_String::basic_create(int length, TRAPS) {
   170 class CompactStringsFixup : public FieldClosure {
       
   171 private:
       
   172   bool _value;
       
   173 
       
   174 public:
       
   175   CompactStringsFixup(bool value) : _value(value) {}
       
   176 
       
   177   void do_field(fieldDescriptor* fd) {
       
   178     if (fd->name() == vmSymbols::compact_strings_name()) {
       
   179       oop mirror = fd->field_holder()->java_mirror();
       
   180       assert(fd->field_holder() == SystemDictionary::String_klass(), "Should be String");
       
   181       assert(mirror != NULL, "String must have mirror already");
       
   182       mirror->bool_field_put(fd->offset(), _value);
       
   183     }
       
   184   }
       
   185 };
       
   186 
       
   187 void java_lang_String::set_compact_strings(bool value) {
       
   188   CompactStringsFixup fix(value);
       
   189   InstanceKlass::cast(SystemDictionary::String_klass())->do_local_static_fields(&fix);
       
   190 }
       
   191 
       
   192 Handle java_lang_String::basic_create(int length, bool is_latin1, TRAPS) {
   173   assert(initialized, "Must be initialized");
   193   assert(initialized, "Must be initialized");
       
   194   assert(CompactStrings || !is_latin1, "Must be UTF16 without CompactStrings");
       
   195 
   174   // Create the String object first, so there's a chance that the String
   196   // Create the String object first, so there's a chance that the String
   175   // and the char array it points to end up in the same cache line.
   197   // and the char array it points to end up in the same cache line.
   176   oop obj;
   198   oop obj;
   177   obj = InstanceKlass::cast(SystemDictionary::String_klass())->allocate_instance(CHECK_NH);
   199   obj = InstanceKlass::cast(SystemDictionary::String_klass())->allocate_instance(CHECK_NH);
   178 
   200 
   179   // Create the char array.  The String object must be handlized here
   201   // Create the char array.  The String object must be handlized here
   180   // because GC can happen as a result of the allocation attempt.
   202   // because GC can happen as a result of the allocation attempt.
   181   Handle h_obj(THREAD, obj);
   203   Handle h_obj(THREAD, obj);
   182   typeArrayOop buffer;
   204   int arr_length = is_latin1 ? length : length << 1; // 2 bytes per UTF16.
   183     buffer = oopFactory::new_charArray(length, CHECK_NH);
   205   typeArrayOop buffer = oopFactory::new_byteArray(arr_length, CHECK_NH);;
   184 
   206 
   185   // Point the String at the char array
   207   // Point the String at the char array
   186   obj = h_obj();
   208   obj = h_obj();
   187   set_value(obj, buffer);
   209   set_value(obj, buffer);
   188   // No need to zero the offset, allocation zero'ed the entire String object
   210   // No need to zero the offset, allocation zero'ed the entire String object
   189   assert(offset(obj) == 0, "initial String offset should be zero");
   211   set_coder(obj, is_latin1 ? CODER_LATIN1 : CODER_UTF16);
   190 //set_offset(obj, 0);
       
   191   set_count(obj, length);
       
   192 
       
   193   return h_obj;
   212   return h_obj;
   194 }
   213 }
   195 
   214 
   196 Handle java_lang_String::create_from_unicode(jchar* unicode, int length, TRAPS) {
   215 Handle java_lang_String::create_from_unicode(jchar* unicode, int length, TRAPS) {
   197   Handle h_obj = basic_create(length, CHECK_NH);
   216   bool is_latin1 = CompactStrings && UNICODE::is_latin1(unicode, length);
       
   217   Handle h_obj = basic_create(length, is_latin1, CHECK_NH);
   198   typeArrayOop buffer = value(h_obj());
   218   typeArrayOop buffer = value(h_obj());
   199   for (int index = 0; index < length; index++) {
   219   assert(TypeArrayKlass::cast(buffer->klass())->element_type() == T_BYTE, "only byte[]");
   200     buffer->char_at_put(index, unicode[index]);
   220   if (is_latin1) {
   201   }
   221     for (int index = 0; index < length; index++) {
       
   222       buffer->byte_at_put(index, (jbyte)unicode[index]);
       
   223     }
       
   224   } else {
       
   225     for (int index = 0; index < length; index++) {
       
   226       buffer->char_at_put(index, unicode[index]);
       
   227     }
       
   228   }
       
   229 
       
   230 #ifdef ASSERT
       
   231   {
       
   232     ResourceMark rm;
       
   233     char* expected = UNICODE::as_utf8(unicode, length);
       
   234     char* actual = as_utf8_string(h_obj());
       
   235     if (strcmp(expected, actual) != 0) {
       
   236       tty->print_cr("Unicode conversion failure: %s --> %s", expected, actual);
       
   237       ShouldNotReachHere();
       
   238     }
       
   239   }
       
   240 #endif
       
   241 
   202   return h_obj;
   242   return h_obj;
   203 }
   243 }
   204 
   244 
   205 oop java_lang_String::create_oop_from_unicode(jchar* unicode, int length, TRAPS) {
   245 oop java_lang_String::create_oop_from_unicode(jchar* unicode, int length, TRAPS) {
   206   Handle h_obj = create_from_unicode(unicode, length, CHECK_0);
   246   Handle h_obj = create_from_unicode(unicode, length, CHECK_0);
   209 
   249 
   210 Handle java_lang_String::create_from_str(const char* utf8_str, TRAPS) {
   250 Handle java_lang_String::create_from_str(const char* utf8_str, TRAPS) {
   211   if (utf8_str == NULL) {
   251   if (utf8_str == NULL) {
   212     return Handle();
   252     return Handle();
   213   }
   253   }
   214   int length = UTF8::unicode_length(utf8_str);
   254   bool has_multibyte, is_latin1;
   215   Handle h_obj = basic_create(length, CHECK_NH);
   255   int length = UTF8::unicode_length(utf8_str, is_latin1, has_multibyte);
       
   256   if (!CompactStrings) {
       
   257     has_multibyte = true;
       
   258     is_latin1 = false;
       
   259   }
       
   260 
       
   261   Handle h_obj = basic_create(length, is_latin1, CHECK_NH);
   216   if (length > 0) {
   262   if (length > 0) {
   217     UTF8::convert_to_unicode(utf8_str, value(h_obj())->char_at_addr(0), length);
   263     if (!has_multibyte) {
   218   }
   264       strncpy((char*)value(h_obj())->byte_at_addr(0), utf8_str, length);
       
   265     } else if (is_latin1) {
       
   266       UTF8::convert_to_unicode(utf8_str, value(h_obj())->byte_at_addr(0), length);
       
   267     } else {
       
   268       UTF8::convert_to_unicode(utf8_str, value(h_obj())->char_at_addr(0), length);
       
   269     }
       
   270   }
       
   271 
       
   272 #ifdef ASSERT
       
   273   // This check is too strict because the input string is not necessarily valid UTF8.
       
   274   // For example, it may be created with arbitrary content via jni_NewStringUTF.
       
   275   /*
       
   276   {
       
   277     ResourceMark rm;
       
   278     const char* expected = utf8_str;
       
   279     char* actual = as_utf8_string(h_obj());
       
   280     if (strcmp(expected, actual) != 0) {
       
   281       tty->print_cr("String conversion failure: %s --> %s", expected, actual);
       
   282       ShouldNotReachHere();
       
   283     }
       
   284   }
       
   285   */
       
   286 #endif
       
   287 
   219   return h_obj;
   288   return h_obj;
   220 }
   289 }
   221 
   290 
   222 oop java_lang_String::create_oop_from_str(const char* utf8_str, TRAPS) {
   291 oop java_lang_String::create_oop_from_str(const char* utf8_str, TRAPS) {
   223   Handle h_obj = create_from_str(utf8_str, CHECK_0);
   292   Handle h_obj = create_from_str(utf8_str, CHECK_0);
   224   return h_obj();
   293   return h_obj();
   225 }
   294 }
   226 
   295 
   227 Handle java_lang_String::create_from_symbol(Symbol* symbol, TRAPS) {
   296 Handle java_lang_String::create_from_symbol(Symbol* symbol, TRAPS) {
   228   int length = UTF8::unicode_length((char*)symbol->bytes(), symbol->utf8_length());
   297   const char* utf8_str = (char*)symbol->bytes();
   229   Handle h_obj = basic_create(length, CHECK_NH);
   298   int utf8_len = symbol->utf8_length();
       
   299 
       
   300   bool has_multibyte, is_latin1;
       
   301   int length = UTF8::unicode_length(utf8_str, utf8_len, is_latin1, has_multibyte);
       
   302   if (!CompactStrings) {
       
   303     has_multibyte = true;
       
   304     is_latin1 = false;
       
   305   }
       
   306 
       
   307   Handle h_obj = basic_create(length, is_latin1, CHECK_NH);
   230   if (length > 0) {
   308   if (length > 0) {
   231     UTF8::convert_to_unicode((char*)symbol->bytes(), value(h_obj())->char_at_addr(0), length);
   309     if (!has_multibyte) {
   232   }
   310       strncpy((char*)value(h_obj())->byte_at_addr(0), utf8_str, length);
       
   311     } else if (is_latin1) {
       
   312       UTF8::convert_to_unicode(utf8_str, value(h_obj())->byte_at_addr(0), length);
       
   313     } else {
       
   314       UTF8::convert_to_unicode(utf8_str, value(h_obj())->char_at_addr(0), length);
       
   315     }
       
   316   }
       
   317 
       
   318 #ifdef ASSERT
       
   319   {
       
   320     ResourceMark rm;
       
   321     const char* expected = symbol->as_utf8();
       
   322     char* actual = as_utf8_string(h_obj());
       
   323     if (strncmp(expected, actual, utf8_len) != 0) {
       
   324       tty->print_cr("Symbol conversion failure: %s --> %s", expected, actual);
       
   325       ShouldNotReachHere();
       
   326     }
       
   327   }
       
   328 #endif
       
   329 
   233   return h_obj;
   330   return h_obj;
   234 }
   331 }
   235 
   332 
   236 // Converts a C string to a Java String based on current encoding
   333 // Converts a C string to a Java String based on current encoding
   237 Handle java_lang_String::create_from_platform_dependent_str(const char* str, TRAPS) {
   334 Handle java_lang_String::create_from_platform_dependent_str(const char* str, TRAPS) {
   259 }
   356 }
   260 
   357 
   261 // Converts a Java String to a native C string that can be used for
   358 // Converts a Java String to a native C string that can be used for
   262 // native OS calls.
   359 // native OS calls.
   263 char* java_lang_String::as_platform_dependent_str(Handle java_string, TRAPS) {
   360 char* java_lang_String::as_platform_dependent_str(Handle java_string, TRAPS) {
   264 
       
   265   typedef char* (*to_platform_string_fn_t)(JNIEnv*, jstring, bool*);
   361   typedef char* (*to_platform_string_fn_t)(JNIEnv*, jstring, bool*);
   266   static to_platform_string_fn_t _to_platform_string_fn = NULL;
   362   static to_platform_string_fn_t _to_platform_string_fn = NULL;
   267 
   363 
   268   if (_to_platform_string_fn == NULL) {
   364   if (_to_platform_string_fn == NULL) {
   269     void *lib_handle = os::native_java_library();
   365     void *lib_handle = os::native_java_library();
   290 
   386 
   291 Handle java_lang_String::char_converter(Handle java_string, jchar from_char, jchar to_char, TRAPS) {
   387 Handle java_lang_String::char_converter(Handle java_string, jchar from_char, jchar to_char, TRAPS) {
   292   oop          obj    = java_string();
   388   oop          obj    = java_string();
   293   // Typical usage is to convert all '/' to '.' in string.
   389   // Typical usage is to convert all '/' to '.' in string.
   294   typeArrayOop value  = java_lang_String::value(obj);
   390   typeArrayOop value  = java_lang_String::value(obj);
   295   int          offset = java_lang_String::offset(obj);
       
   296   int          length = java_lang_String::length(obj);
   391   int          length = java_lang_String::length(obj);
       
   392   bool      is_latin1 = java_lang_String::is_latin1(obj);
   297 
   393 
   298   // First check if any from_char exist
   394   // First check if any from_char exist
   299   int index; // Declared outside, used later
   395   int index; // Declared outside, used later
   300   for (index = 0; index < length; index++) {
   396   for (index = 0; index < length; index++) {
   301     if (value->char_at(index + offset) == from_char) {
   397     jchar c = !is_latin1 ? value->char_at(index) :
       
   398                   ((jchar) value->byte_at(index)) & 0xff;
       
   399     if (c == from_char) {
   302       break;
   400       break;
   303     }
   401     }
   304   }
   402   }
   305   if (index == length) {
   403   if (index == length) {
   306     // No from_char, so do not copy.
   404     // No from_char, so do not copy.
   307     return java_string;
   405     return java_string;
   308   }
   406   }
   309 
   407 
   310   // Create new UNICODE buffer. Must handlize value because GC
   408   // Check if result string will be latin1
       
   409   bool to_is_latin1 = false;
       
   410 
       
   411   // Replacement char must be latin1
       
   412   if (CompactStrings && UNICODE::is_latin1(to_char)) {
       
   413     if (is_latin1) {
       
   414       // Source string is latin1 as well
       
   415       to_is_latin1 = true;
       
   416     } else if (!UNICODE::is_latin1(from_char)) {
       
   417       // We are replacing an UTF16 char. Scan string to
       
   418       // check if result can be latin1 encoded.
       
   419       to_is_latin1 = true;
       
   420       for (index = 0; index < length; index++) {
       
   421         jchar c = value->char_at(index);
       
   422         if (c != from_char && !UNICODE::is_latin1(c)) {
       
   423           to_is_latin1 = false;
       
   424           break;
       
   425         }
       
   426       }
       
   427     }
       
   428   }
       
   429 
       
   430   // Create new UNICODE (or byte) buffer. Must handlize value because GC
   311   // may happen during String and char array creation.
   431   // may happen during String and char array creation.
   312   typeArrayHandle h_value(THREAD, value);
   432   typeArrayHandle h_value(THREAD, value);
   313   Handle string = basic_create(length, CHECK_NH);
   433   Handle string = basic_create(length, to_is_latin1, CHECK_NH);
   314 
       
   315   typeArrayOop from_buffer = h_value();
   434   typeArrayOop from_buffer = h_value();
   316   typeArrayOop to_buffer   = java_lang_String::value(string());
   435   typeArrayOop to_buffer = java_lang_String::value(string());
   317 
   436 
   318   // Copy contents
   437   // Copy contents
   319   for (index = 0; index < length; index++) {
   438   for (index = 0; index < length; index++) {
   320     jchar c = from_buffer->char_at(index + offset);
   439     jchar c = (!is_latin1) ? from_buffer->char_at(index) :
       
   440                     ((jchar) from_buffer->byte_at(index)) & 0xff;
   321     if (c == from_char) {
   441     if (c == from_char) {
   322       c = to_char;
   442       c = to_char;
   323     }
   443     }
   324     to_buffer->char_at_put(index, c);
   444     if (!to_is_latin1) {
       
   445       to_buffer->char_at_put(index, c);
       
   446     } else {
       
   447       to_buffer->byte_at_put(index, (jbyte) c);
       
   448     }
   325   }
   449   }
   326   return string;
   450   return string;
   327 }
   451 }
   328 
   452 
   329 jchar* java_lang_String::as_unicode_string(oop java_string, int& length, TRAPS) {
   453 jchar* java_lang_String::as_unicode_string(oop java_string, int& length, TRAPS) {
   330   typeArrayOop value  = java_lang_String::value(java_string);
   454   typeArrayOop value  = java_lang_String::value(java_string);
   331   int          offset = java_lang_String::offset(java_string);
       
   332                length = java_lang_String::length(java_string);
   455                length = java_lang_String::length(java_string);
       
   456   bool      is_latin1 = java_lang_String::is_latin1(java_string);
   333 
   457 
   334   jchar* result = NEW_RESOURCE_ARRAY_RETURN_NULL(jchar, length);
   458   jchar* result = NEW_RESOURCE_ARRAY_RETURN_NULL(jchar, length);
   335   if (result != NULL) {
   459   if (result != NULL) {
   336     for (int index = 0; index < length; index++) {
   460     if (!is_latin1) {
   337       result[index] = value->char_at(index + offset);
   461       for (int index = 0; index < length; index++) {
       
   462         result[index] = value->char_at(index);
       
   463       }
       
   464     } else {
       
   465       for (int index = 0; index < length; index++) {
       
   466         result[index] = ((jchar) value->byte_at(index)) & 0xff;
       
   467       }
   338     }
   468     }
   339   } else {
   469   } else {
   340     THROW_MSG_0(vmSymbols::java_lang_OutOfMemoryError(), "could not allocate Unicode string");
   470     THROW_MSG_0(vmSymbols::java_lang_OutOfMemoryError(), "could not allocate Unicode string");
   341   }
   471   }
   342   return result;
   472   return result;
   346   int          length = java_lang_String::length(java_string);
   476   int          length = java_lang_String::length(java_string);
   347   // Zero length string will hash to zero with String.hashCode() function.
   477   // Zero length string will hash to zero with String.hashCode() function.
   348   if (length == 0) return 0;
   478   if (length == 0) return 0;
   349 
   479 
   350   typeArrayOop value  = java_lang_String::value(java_string);
   480   typeArrayOop value  = java_lang_String::value(java_string);
   351   int          offset = java_lang_String::offset(java_string);
   481   bool      is_latin1 = java_lang_String::is_latin1(java_string);
   352   return java_lang_String::hash_code(value->char_at_addr(offset), length);
   482 
       
   483   if (is_latin1) {
       
   484     return java_lang_String::hash_code(value->byte_at_addr(0), length);
       
   485   } else {
       
   486     return java_lang_String::hash_code(value->char_at_addr(0), length);
       
   487   }
   353 }
   488 }
   354 
   489 
   355 char* java_lang_String::as_quoted_ascii(oop java_string) {
   490 char* java_lang_String::as_quoted_ascii(oop java_string) {
   356   typeArrayOop value  = java_lang_String::value(java_string);
   491   typeArrayOop value  = java_lang_String::value(java_string);
   357   int          offset = java_lang_String::offset(java_string);
       
   358   int          length = java_lang_String::length(java_string);
   492   int          length = java_lang_String::length(java_string);
   359 
   493   bool      is_latin1 = java_lang_String::is_latin1(java_string);
   360   jchar* base = (length == 0) ? NULL : value->char_at_addr(offset);
   494 
   361   if (base == NULL) return NULL;
   495   if (length == 0) return NULL;
   362 
   496 
   363   int result_length = UNICODE::quoted_ascii_length(base, length) + 1;
   497   char* result;
   364   char* result = NEW_RESOURCE_ARRAY(char, result_length);
   498   int result_length;
   365   UNICODE::as_quoted_ascii(base, length, result, result_length);
   499   if (!is_latin1) {
       
   500     jchar* base = value->char_at_addr(0);
       
   501     result_length = UNICODE::quoted_ascii_length(base, length) + 1;
       
   502     result = NEW_RESOURCE_ARRAY(char, result_length);
       
   503     UNICODE::as_quoted_ascii(base, length, result, result_length);
       
   504   } else {
       
   505     jbyte* base = value->byte_at_addr(0);
       
   506     result_length = UNICODE::quoted_ascii_length(base, length) + 1;
       
   507     result = NEW_RESOURCE_ARRAY(char, result_length);
       
   508     UNICODE::as_quoted_ascii(base, length, result, result_length);
       
   509   }
   366   assert(result_length >= length + 1, "must not be shorter");
   510   assert(result_length >= length + 1, "must not be shorter");
   367   assert(result_length == (int)strlen(result) + 1, "must match");
   511   assert(result_length == (int)strlen(result) + 1, "must match");
   368   return result;
   512   return result;
   369 }
   513 }
   370 
   514 
   371 unsigned int java_lang_String::hash_string(oop java_string) {
   515 unsigned int java_lang_String::hash_string(oop java_string) {
   372   int          length = java_lang_String::length(java_string);
   516   int          length = java_lang_String::length(java_string);
   373   // Zero length string doesn't hash necessarily hash to zero.
   517   // Zero length string doesn't necessarily hash to zero.
   374   if (length == 0) {
   518   if (length == 0) {
   375     return StringTable::hash_string(NULL, 0);
   519     return StringTable::hash_string((jchar*) NULL, 0);
   376   }
   520   }
   377 
   521 
   378   typeArrayOop value  = java_lang_String::value(java_string);
   522   typeArrayOop value  = java_lang_String::value(java_string);
   379   int          offset = java_lang_String::offset(java_string);
   523   bool      is_latin1 = java_lang_String::is_latin1(java_string);
   380   return StringTable::hash_string(value->char_at_addr(offset), length);
   524   if (is_latin1) {
       
   525     return StringTable::hash_string(value->byte_at_addr(0), length);
       
   526   } else {
       
   527     return StringTable::hash_string(value->char_at_addr(0), length);
       
   528   }
   381 }
   529 }
   382 
   530 
   383 Symbol* java_lang_String::as_symbol(Handle java_string, TRAPS) {
   531 Symbol* java_lang_String::as_symbol(Handle java_string, TRAPS) {
   384   oop          obj    = java_string();
   532   oop          obj    = java_string();
   385   typeArrayOop value  = java_lang_String::value(obj);
   533   typeArrayOop value  = java_lang_String::value(obj);
   386   int          offset = java_lang_String::offset(obj);
       
   387   int          length = java_lang_String::length(obj);
   534   int          length = java_lang_String::length(obj);
   388   jchar* base = (length == 0) ? NULL : value->char_at_addr(offset);
   535   bool      is_latin1 = java_lang_String::is_latin1(obj);
   389   Symbol* sym = SymbolTable::lookup_unicode(base, length, THREAD);
   536   if (!is_latin1) {
   390   return sym;
   537     jchar* base = (length == 0) ? NULL : value->char_at_addr(0);
       
   538     Symbol* sym = SymbolTable::lookup_unicode(base, length, THREAD);
       
   539     return sym;
       
   540   } else {
       
   541     ResourceMark rm;
       
   542     jbyte* position = (length == 0) ? NULL : value->byte_at_addr(0);
       
   543     const char* base = UNICODE::as_utf8(position, length);
       
   544     Symbol* sym = SymbolTable::lookup(base, length, THREAD);
       
   545     return sym;
       
   546   }
   391 }
   547 }
   392 
   548 
   393 Symbol* java_lang_String::as_symbol_or_null(oop java_string) {
   549 Symbol* java_lang_String::as_symbol_or_null(oop java_string) {
   394   typeArrayOop value  = java_lang_String::value(java_string);
   550   typeArrayOop value  = java_lang_String::value(java_string);
   395   int          offset = java_lang_String::offset(java_string);
       
   396   int          length = java_lang_String::length(java_string);
   551   int          length = java_lang_String::length(java_string);
   397   jchar* base = (length == 0) ? NULL : value->char_at_addr(offset);
   552   bool      is_latin1 = java_lang_String::is_latin1(java_string);
   398   return SymbolTable::probe_unicode(base, length);
   553   if (!is_latin1) {
   399 }
   554     jchar* base = (length == 0) ? NULL : value->char_at_addr(0);
   400 
   555     return SymbolTable::probe_unicode(base, length);
       
   556   } else {
       
   557     ResourceMark rm;
       
   558     jbyte* position = (length == 0) ? NULL : value->byte_at_addr(0);
       
   559     const char* base = UNICODE::as_utf8(position, length);
       
   560     return SymbolTable::probe(base, length);
       
   561   }
       
   562 }
   401 
   563 
   402 int java_lang_String::utf8_length(oop java_string) {
   564 int java_lang_String::utf8_length(oop java_string) {
   403   typeArrayOop value  = java_lang_String::value(java_string);
   565   typeArrayOop value  = java_lang_String::value(java_string);
   404   int          offset = java_lang_String::offset(java_string);
       
   405   int          length = java_lang_String::length(java_string);
   566   int          length = java_lang_String::length(java_string);
   406   jchar* position = (length == 0) ? NULL : value->char_at_addr(offset);
   567   bool      is_latin1 = java_lang_String::is_latin1(java_string);
   407   return UNICODE::utf8_length(position, length);
   568   if (length == 0) {
       
   569     return 0;
       
   570   }
       
   571   if (!is_latin1) {
       
   572     return UNICODE::utf8_length(value->char_at_addr(0), length);
       
   573   } else {
       
   574     return UNICODE::utf8_length(value->byte_at_addr(0), length);
       
   575   }
   408 }
   576 }
   409 
   577 
   410 char* java_lang_String::as_utf8_string(oop java_string) {
   578 char* java_lang_String::as_utf8_string(oop java_string) {
   411   typeArrayOop value  = java_lang_String::value(java_string);
   579   typeArrayOop value  = java_lang_String::value(java_string);
   412   int          offset = java_lang_String::offset(java_string);
       
   413   int          length = java_lang_String::length(java_string);
   580   int          length = java_lang_String::length(java_string);
   414   jchar* position = (length == 0) ? NULL : value->char_at_addr(offset);
   581   bool      is_latin1 = java_lang_String::is_latin1(java_string);
   415   return UNICODE::as_utf8(position, length);
   582   if (!is_latin1) {
       
   583     jchar* position = (length == 0) ? NULL : value->char_at_addr(0);
       
   584     return UNICODE::as_utf8(position, length);
       
   585   } else {
       
   586     jbyte* position = (length == 0) ? NULL : value->byte_at_addr(0);
       
   587     return UNICODE::as_utf8(position, length);
       
   588   }
   416 }
   589 }
   417 
   590 
   418 char* java_lang_String::as_utf8_string(oop java_string, char* buf, int buflen) {
   591 char* java_lang_String::as_utf8_string(oop java_string, char* buf, int buflen) {
   419   typeArrayOop value  = java_lang_String::value(java_string);
   592   typeArrayOop value  = java_lang_String::value(java_string);
   420   int          offset = java_lang_String::offset(java_string);
       
   421   int          length = java_lang_String::length(java_string);
   593   int          length = java_lang_String::length(java_string);
   422   jchar* position = (length == 0) ? NULL : value->char_at_addr(offset);
   594   bool      is_latin1 = java_lang_String::is_latin1(java_string);
   423   return UNICODE::as_utf8(position, length, buf, buflen);
   595   if (!is_latin1) {
       
   596     jchar* position = (length == 0) ? NULL : value->char_at_addr(0);
       
   597     return UNICODE::as_utf8(position, length, buf, buflen);
       
   598   } else {
       
   599     jbyte* position = (length == 0) ? NULL : value->byte_at_addr(0);
       
   600     return UNICODE::as_utf8(position, length, buf, buflen);
       
   601   }
   424 }
   602 }
   425 
   603 
   426 char* java_lang_String::as_utf8_string(oop java_string, int start, int len) {
   604 char* java_lang_String::as_utf8_string(oop java_string, int start, int len) {
   427   typeArrayOop value  = java_lang_String::value(java_string);
   605   typeArrayOop value  = java_lang_String::value(java_string);
   428   int          offset = java_lang_String::offset(java_string);
       
   429   int          length = java_lang_String::length(java_string);
   606   int          length = java_lang_String::length(java_string);
   430   assert(start + len <= length, "just checking");
   607   assert(start + len <= length, "just checking");
   431   jchar* position = value->char_at_addr(offset + start);
   608   bool      is_latin1 = java_lang_String::is_latin1(java_string);
   432   return UNICODE::as_utf8(position, len);
   609   if (!is_latin1) {
       
   610     jchar* position = value->char_at_addr(start);
       
   611     return UNICODE::as_utf8(position, len);
       
   612   } else {
       
   613     jbyte* position = value->byte_at_addr(start);
       
   614     return UNICODE::as_utf8(position, len);
       
   615   }
   433 }
   616 }
   434 
   617 
   435 char* java_lang_String::as_utf8_string(oop java_string, int start, int len, char* buf, int buflen) {
   618 char* java_lang_String::as_utf8_string(oop java_string, int start, int len, char* buf, int buflen) {
   436   typeArrayOop value  = java_lang_String::value(java_string);
   619   typeArrayOop value  = java_lang_String::value(java_string);
   437   int          offset = java_lang_String::offset(java_string);
       
   438   int          length = java_lang_String::length(java_string);
   620   int          length = java_lang_String::length(java_string);
   439   assert(start + len <= length, "just checking");
   621   assert(start + len <= length, "just checking");
   440   jchar* position = value->char_at_addr(offset + start);
   622   bool      is_latin1 = java_lang_String::is_latin1(java_string);
   441   return UNICODE::as_utf8(position, len, buf, buflen);
   623   if (!is_latin1) {
       
   624     jchar* position = value->char_at_addr(start);
       
   625     return UNICODE::as_utf8(position, len, buf, buflen);
       
   626   } else {
       
   627     jbyte* position = value->byte_at_addr(start);
       
   628     return UNICODE::as_utf8(position, len, buf, buflen);
       
   629   }
   442 }
   630 }
   443 
   631 
   444 bool java_lang_String::equals(oop java_string, jchar* chars, int len) {
   632 bool java_lang_String::equals(oop java_string, jchar* chars, int len) {
   445   assert(java_string->klass() == SystemDictionary::String_klass(),
   633   assert(java_string->klass() == SystemDictionary::String_klass(),
   446          "must be java_string");
   634          "must be java_string");
   447   typeArrayOop value  = java_lang_String::value(java_string);
   635   typeArrayOop value  = java_lang_String::value(java_string);
   448   int          offset = java_lang_String::offset(java_string);
       
   449   int          length = java_lang_String::length(java_string);
   636   int          length = java_lang_String::length(java_string);
   450   if (length != len) {
   637   if (length != len) {
   451     return false;
   638     return false;
   452   }
   639   }
   453   for (int i = 0; i < len; i++) {
   640   bool      is_latin1 = java_lang_String::is_latin1(java_string);
   454     if (value->char_at(i + offset) != chars[i]) {
   641   if (!is_latin1) {
   455       return false;
   642     for (int i = 0; i < len; i++) {
       
   643       if (value->char_at(i) != chars[i]) {
       
   644         return false;
       
   645       }
       
   646     }
       
   647   } else {
       
   648     for (int i = 0; i < len; i++) {
       
   649       if ((((jchar) value->byte_at(i)) & 0xff) != chars[i]) {
       
   650         return false;
       
   651       }
   456     }
   652     }
   457   }
   653   }
   458   return true;
   654   return true;
   459 }
   655 }
   460 
   656 
   462   assert(str1->klass() == SystemDictionary::String_klass(),
   658   assert(str1->klass() == SystemDictionary::String_klass(),
   463          "must be java String");
   659          "must be java String");
   464   assert(str2->klass() == SystemDictionary::String_klass(),
   660   assert(str2->klass() == SystemDictionary::String_klass(),
   465          "must be java String");
   661          "must be java String");
   466   typeArrayOop value1  = java_lang_String::value(str1);
   662   typeArrayOop value1  = java_lang_String::value(str1);
   467   int          offset1 = java_lang_String::offset(str1);
       
   468   int          length1 = java_lang_String::length(str1);
   663   int          length1 = java_lang_String::length(str1);
       
   664   bool       is_latin1 = java_lang_String::is_latin1(str1);
   469   typeArrayOop value2  = java_lang_String::value(str2);
   665   typeArrayOop value2  = java_lang_String::value(str2);
   470   int          offset2 = java_lang_String::offset(str2);
       
   471   int          length2 = java_lang_String::length(str2);
   666   int          length2 = java_lang_String::length(str2);
   472 
   667   bool       is_latin2 = java_lang_String::is_latin1(str2);
   473   if (length1 != length2) {
   668 
       
   669   if ((length1 != length2) || (is_latin1 != is_latin2)) {
       
   670     // Strings of different size or with different
       
   671     // coders are never equal.
   474     return false;
   672     return false;
   475   }
   673   }
   476   for (int i = 0; i < length1; i++) {
   674   int blength1 = value1->length();
   477     if (value1->char_at(i + offset1) != value2->char_at(i + offset2)) {
   675   for (int i = 0; i < value1->length(); i++) {
       
   676     if (value1->byte_at(i) != value2->byte_at(i)) {
   478       return false;
   677       return false;
   479     }
   678     }
   480   }
   679   }
   481   return true;
   680   return true;
   482 }
   681 }
   490     // object before its initializer has been called
   689     // object before its initializer has been called
   491     st->print("NULL");
   690     st->print("NULL");
   492     return;
   691     return;
   493   }
   692   }
   494 
   693 
   495   int offset = java_lang_String::offset(java_string);
       
   496   int length = java_lang_String::length(java_string);
   694   int length = java_lang_String::length(java_string);
       
   695   bool is_latin1 = java_lang_String::is_latin1(java_string);
   497 
   696 
   498   st->print("\"");
   697   st->print("\"");
   499   for (int index = 0; index < length; index++) {
   698   for (int index = 0; index < length; index++) {
   500     st->print("%c", value->char_at(index + offset));
   699     st->print("%c", (!is_latin1) ?  value->char_at(index) :
       
   700                            ((jchar) value->byte_at(index)) & 0xff );
   501   }
   701   }
   502   st->print("\"");
   702   st->print("\"");
   503 }
   703 }
   504 
   704 
   505 
   705 
  1167   return java_thread_group->obj_field(_parent_offset);
  1367   return java_thread_group->obj_field(_parent_offset);
  1168 }
  1368 }
  1169 
  1369 
  1170 // ("name as oop" accessor is not necessary)
  1370 // ("name as oop" accessor is not necessary)
  1171 
  1371 
  1172 typeArrayOop java_lang_ThreadGroup::name(oop java_thread_group) {
  1372 const char* java_lang_ThreadGroup::name(oop java_thread_group) {
  1173   oop name = java_thread_group->obj_field(_name_offset);
  1373   oop name = java_thread_group->obj_field(_name_offset);
  1174   // ThreadGroup.name can be null
  1374   // ThreadGroup.name can be null
  1175   return name == NULL ? (typeArrayOop)NULL : java_lang_String::value(name);
  1375   if (name != NULL) {
       
  1376     return java_lang_String::as_utf8_string(name);
       
  1377   }
       
  1378   return NULL;
  1176 }
  1379 }
  1177 
  1380 
  1178 int java_lang_ThreadGroup::nthreads(oop java_thread_group) {
  1381 int java_lang_ThreadGroup::nthreads(oop java_thread_group) {
  1179   assert(java_thread_group->is_oop(), "thread group must be oop");
  1382   assert(java_thread_group->is_oop(), "thread group must be oop");
  1180   return java_thread_group->int_field(_nthreads_offset);
  1383   return java_thread_group->int_field(_nthreads_offset);
  3539 #define CHECK_CONSTANT(klass_name, cpp_klass_name, field_name, field_sig) \
  3742 #define CHECK_CONSTANT(klass_name, cpp_klass_name, field_name, field_sig) \
  3540   valid &= check_constant(klass_name, cpp_klass_name :: field_name, #field_name, field_sig)
  3743   valid &= check_constant(klass_name, cpp_klass_name :: field_name, #field_name, field_sig)
  3541 
  3744 
  3542   // java.lang.String
  3745   // java.lang.String
  3543 
  3746 
  3544   CHECK_OFFSET("java/lang/String", java_lang_String, value, "[C");
  3747   CHECK_OFFSET("java/lang/String", java_lang_String, value, "[B");
  3545   if (java_lang_String::has_offset_field()) {
       
  3546     CHECK_OFFSET("java/lang/String", java_lang_String, offset, "I");
       
  3547     CHECK_OFFSET("java/lang/String", java_lang_String, count, "I");
       
  3548   }
       
  3549   if (java_lang_String::has_hash_field()) {
  3748   if (java_lang_String::has_hash_field()) {
  3550     CHECK_OFFSET("java/lang/String", java_lang_String, hash, "I");
  3749     CHECK_OFFSET("java/lang/String", java_lang_String, hash, "I");
       
  3750   }
       
  3751   if (java_lang_String::has_coder_field()) {
       
  3752     CHECK_OFFSET("java/lang/String", java_lang_String, coder, "B");
  3551   }
  3753   }
  3552 
  3754 
  3553   // java.lang.Class
  3755   // java.lang.Class
  3554 
  3756 
  3555   // Fake fields
  3757   // Fake fields