< prev index next >

src/share/vm/prims/jvmtiTagMap.cpp

Print this page

        

*** 1055,1079 **** return 0; } // get the string value and length // (string value may be offset from the base) int s_len = java_lang_String::length(str); ! int s_offset = java_lang_String::offset(str); jchar* value; if (s_len > 0) { ! value = s_value->char_at_addr(s_offset); } else { value = (jchar*) s_value->base(T_CHAR); } // invoke the callback ! return (*cb)(wrapper->klass_tag(), wrapper->obj_size(), wrapper->obj_tag_p(), value, (jint)s_len, user_data); } // helper function to invoke string primitive value callback // returns visit control flags static jint invoke_array_primitive_value_callback(jvmtiArrayPrimitiveValueCallback cb, --- 1055,1094 ---- return 0; } // get the string value and length // (string value may be offset from the base) int s_len = java_lang_String::length(str); ! bool is_latin1 = java_lang_String::is_latin1(str); jchar* value; if (s_len > 0) { ! if (!is_latin1) { ! value = s_value->char_at_addr(0); } else { + // Inflate latin1 encoded string to UTF16 + jchar* buf = NEW_C_HEAP_ARRAY(jchar, s_len, mtInternal); + for (int i = 0; i < s_len; i++) { + buf[i] = ((jchar) s_value->byte_at(i)) & 0xff; + } + value = &buf[0]; + } + } else { + // Don't use char_at_addr(0) if length is 0 value = (jchar*) s_value->base(T_CHAR); } // invoke the callback ! jint res = (*cb)(wrapper->klass_tag(), wrapper->obj_size(), wrapper->obj_tag_p(), value, (jint)s_len, user_data); + + if (is_latin1 && s_len > 0) { + FREE_C_HEAP_ARRAY(jchar, value); + } + return res; } // helper function to invoke string primitive value callback // returns visit control flags static jint invoke_array_primitive_value_callback(jvmtiArrayPrimitiveValueCallback cb,
< prev index next >