1055 return 0; |
1055 return 0; |
1056 } |
1056 } |
1057 // get the string value and length |
1057 // get the string value and length |
1058 // (string value may be offset from the base) |
1058 // (string value may be offset from the base) |
1059 int s_len = java_lang_String::length(str); |
1059 int s_len = java_lang_String::length(str); |
1060 int s_offset = java_lang_String::offset(str); |
1060 bool is_latin1 = java_lang_String::is_latin1(str); |
1061 jchar* value; |
1061 jchar* value; |
1062 if (s_len > 0) { |
1062 if (s_len > 0) { |
1063 value = s_value->char_at_addr(s_offset); |
1063 if (!is_latin1) { |
|
1064 value = s_value->char_at_addr(0); |
|
1065 } else { |
|
1066 // Inflate latin1 encoded string to UTF16 |
|
1067 jchar* buf = NEW_C_HEAP_ARRAY(jchar, s_len, mtInternal); |
|
1068 for (int i = 0; i < s_len; i++) { |
|
1069 buf[i] = ((jchar) s_value->byte_at(i)) & 0xff; |
|
1070 } |
|
1071 value = &buf[0]; |
|
1072 } |
1064 } else { |
1073 } else { |
|
1074 // Don't use char_at_addr(0) if length is 0 |
1065 value = (jchar*) s_value->base(T_CHAR); |
1075 value = (jchar*) s_value->base(T_CHAR); |
1066 } |
1076 } |
1067 |
1077 |
1068 // invoke the callback |
1078 // invoke the callback |
1069 return (*cb)(wrapper->klass_tag(), |
1079 jint res = (*cb)(wrapper->klass_tag(), |
1070 wrapper->obj_size(), |
1080 wrapper->obj_size(), |
1071 wrapper->obj_tag_p(), |
1081 wrapper->obj_tag_p(), |
1072 value, |
1082 value, |
1073 (jint)s_len, |
1083 (jint)s_len, |
1074 user_data); |
1084 user_data); |
|
1085 |
|
1086 if (is_latin1 && s_len > 0) { |
|
1087 FREE_C_HEAP_ARRAY(jchar, value); |
|
1088 } |
|
1089 return res; |
1075 } |
1090 } |
1076 |
1091 |
1077 // helper function to invoke string primitive value callback |
1092 // helper function to invoke string primitive value callback |
1078 // returns visit control flags |
1093 // returns visit control flags |
1079 static jint invoke_array_primitive_value_callback(jvmtiArrayPrimitiveValueCallback cb, |
1094 static jint invoke_array_primitive_value_callback(jvmtiArrayPrimitiveValueCallback cb, |