hotspot/src/share/vm/prims/jvmtiTagMap.cpp
changeset 33628 09241459a8b8
parent 33151 686d694f5c6a
child 33638 ef49ed90010b
equal deleted inserted replaced
33627:c5b7455f846e 33628:09241459a8b8
  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,