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) { |
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 |