1029 case JVMTI_PRIMITIVE_TYPE_BYTE : { v->b = *(jbyte*)addr; break; }
1030 case JVMTI_PRIMITIVE_TYPE_CHAR : { v->c = *(jchar*)addr; break; }
1031 case JVMTI_PRIMITIVE_TYPE_SHORT : { v->s = *(jshort*)addr; break; }
1032 case JVMTI_PRIMITIVE_TYPE_INT : { v->i = *(jint*)addr; break; }
1033 case JVMTI_PRIMITIVE_TYPE_LONG : { v->j = *(jlong*)addr; break; }
1034 case JVMTI_PRIMITIVE_TYPE_FLOAT : { v->f = *(jfloat*)addr; break; }
1035 case JVMTI_PRIMITIVE_TYPE_DOUBLE : { v->d = *(jdouble*)addr; break; }
1036 default: ShouldNotReachHere();
1037 }
1038 }
1039
1040 // helper function to invoke string primitive value callback
1041 // returns visit control flags
1042 static jint invoke_string_value_callback(jvmtiStringPrimitiveValueCallback cb,
1043 CallbackWrapper* wrapper,
1044 oop str,
1045 void* user_data)
1046 {
1047 assert(str->klass() == SystemDictionary::String_klass(), "not a string");
1048
1049 // get the string value and length
1050 // (string value may be offset from the base)
1051 int s_len = java_lang_String::length(str);
1052 typeArrayOop s_value = java_lang_String::value(str);
1053 int s_offset = java_lang_String::offset(str);
1054 jchar* value;
1055 if (s_len > 0) {
1056 value = s_value->char_at_addr(s_offset);
1057 } else {
1058 value = (jchar*) s_value->base(T_CHAR);
1059 }
1060
1061 // invoke the callback
1062 return (*cb)(wrapper->klass_tag(),
1063 wrapper->obj_size(),
1064 wrapper->obj_tag_p(),
1065 value,
1066 (jint)s_len,
1067 user_data);
1068 }
1069
1070 // helper function to invoke string primitive value callback
1071 // returns visit control flags
1072 static jint invoke_array_primitive_value_callback(jvmtiArrayPrimitiveValueCallback cb,
|
1029 case JVMTI_PRIMITIVE_TYPE_BYTE : { v->b = *(jbyte*)addr; break; }
1030 case JVMTI_PRIMITIVE_TYPE_CHAR : { v->c = *(jchar*)addr; break; }
1031 case JVMTI_PRIMITIVE_TYPE_SHORT : { v->s = *(jshort*)addr; break; }
1032 case JVMTI_PRIMITIVE_TYPE_INT : { v->i = *(jint*)addr; break; }
1033 case JVMTI_PRIMITIVE_TYPE_LONG : { v->j = *(jlong*)addr; break; }
1034 case JVMTI_PRIMITIVE_TYPE_FLOAT : { v->f = *(jfloat*)addr; break; }
1035 case JVMTI_PRIMITIVE_TYPE_DOUBLE : { v->d = *(jdouble*)addr; break; }
1036 default: ShouldNotReachHere();
1037 }
1038 }
1039
1040 // helper function to invoke string primitive value callback
1041 // returns visit control flags
1042 static jint invoke_string_value_callback(jvmtiStringPrimitiveValueCallback cb,
1043 CallbackWrapper* wrapper,
1044 oop str,
1045 void* user_data)
1046 {
1047 assert(str->klass() == SystemDictionary::String_klass(), "not a string");
1048
1049 typeArrayOop s_value = java_lang_String::value(str);
1050
1051 // JDK-6584008: the value field may be null if a String instance is
1052 // partially constructed.
1053 if (s_value == NULL) {
1054 return 0;
1055 }
1056 // get the string value and length
1057 // (string value may be offset from the base)
1058 int s_len = java_lang_String::length(str);
1059 int s_offset = java_lang_String::offset(str);
1060 jchar* value;
1061 if (s_len > 0) {
1062 value = s_value->char_at_addr(s_offset);
1063 } else {
1064 value = (jchar*) s_value->base(T_CHAR);
1065 }
1066
1067 // invoke the callback
1068 return (*cb)(wrapper->klass_tag(),
1069 wrapper->obj_size(),
1070 wrapper->obj_tag_p(),
1071 value,
1072 (jint)s_len,
1073 user_data);
1074 }
1075
1076 // helper function to invoke string primitive value callback
1077 // returns visit control flags
1078 static jint invoke_array_primitive_value_callback(jvmtiArrayPrimitiveValueCallback cb,
|