420 }
421
422 // Converts a Java String to a native C string that can be used for
423 // native OS calls.
424 char* java_lang_String::as_platform_dependent_str(Handle java_string, TRAPS) {
425 typedef char* (*to_platform_string_fn_t)(JNIEnv*, jstring, bool*);
426 static to_platform_string_fn_t _to_platform_string_fn = NULL;
427
428 if (_to_platform_string_fn == NULL) {
429 void *lib_handle = os::native_java_library();
430 _to_platform_string_fn = CAST_TO_FN_PTR(to_platform_string_fn_t, os::dll_lookup(lib_handle, "GetStringPlatformChars"));
431 if (_to_platform_string_fn == NULL) {
432 fatal("GetStringPlatformChars missing");
433 }
434 }
435
436 char *native_platform_string;
437 { JavaThread* thread = (JavaThread*)THREAD;
438 assert(thread->is_Java_thread(), "must be java thread");
439 JNIEnv *env = thread->jni_environment();
440 jstring js = (jstring) JNIHandles::make_local(env, java_string());
441 bool is_copy;
442 HandleMark hm(thread);
443 ThreadToNativeFromVM ttn(thread);
444 native_platform_string = (_to_platform_string_fn)(env, js, &is_copy);
445 assert(is_copy == JNI_TRUE, "is_copy value changed");
446 JNIHandles::destroy_local(js);
447 }
448 return native_platform_string;
449 }
450
451 Handle java_lang_String::char_converter(Handle java_string, jchar from_char, jchar to_char, TRAPS) {
452 oop obj = java_string();
453 // Typical usage is to convert all '/' to '.' in string.
454 typeArrayOop value = java_lang_String::value(obj);
455 int length = java_lang_String::length(obj, value);
456 bool is_latin1 = java_lang_String::is_latin1(obj);
457
458 // First check if any from_char exist
459 int index; // Declared outside, used later
460 for (index = 0; index < length; index++) {
2827
2828 #if INCLUDE_CDS
2829 void java_lang_StackFrameInfo::serialize_offsets(SerializeClosure* f) {
2830 STACKFRAMEINFO_FIELDS_DO(FIELD_SERIALIZE_OFFSET);
2831 STACKFRAMEINFO_INJECTED_FIELDS(INJECTED_FIELD_SERIALIZE_OFFSET);
2832 }
2833 #endif
2834
2835 Method* java_lang_StackFrameInfo::get_method(Handle stackFrame, InstanceKlass* holder, TRAPS) {
2836 HandleMark hm(THREAD);
2837 Handle mname(THREAD, stackFrame->obj_field(_memberName_offset));
2838 Method* method = (Method*)java_lang_invoke_MemberName::vmtarget(mname());
2839 // we should expand MemberName::name when Throwable uses StackTrace
2840 // MethodHandles::expand_MemberName(mname, MethodHandles::_suppress_defc|MethodHandles::_suppress_type, CHECK_NULL);
2841 return method;
2842 }
2843
2844 void java_lang_StackFrameInfo::set_method_and_bci(Handle stackFrame, const methodHandle& method, int bci, TRAPS) {
2845 // set Method* or mid/cpref
2846 HandleMark hm(THREAD);
2847 Handle mname(Thread::current(), stackFrame->obj_field(_memberName_offset));
2848 InstanceKlass* ik = method->method_holder();
2849 CallInfo info(method(), ik, CHECK);
2850 MethodHandles::init_method_MemberName(mname, info);
2851 // set bci
2852 java_lang_StackFrameInfo::set_bci(stackFrame(), bci);
2853 // method may be redefined; store the version
2854 int version = method->constants()->version();
2855 assert((jushort)version == version, "version should be short");
2856 java_lang_StackFrameInfo::set_version(stackFrame(), (short)version);
2857 }
2858
2859 void java_lang_StackFrameInfo::to_stack_trace_element(Handle stackFrame, Handle stack_trace_element, TRAPS) {
2860 ResourceMark rm(THREAD);
2861 HandleMark hm(THREAD);
2862 Handle mname(THREAD, stackFrame->obj_field(java_lang_StackFrameInfo::_memberName_offset));
2863 Klass* clazz = java_lang_Class::as_Klass(java_lang_invoke_MemberName::clazz(mname()));
2864 InstanceKlass* holder = InstanceKlass::cast(clazz);
2865 Method* method = java_lang_StackFrameInfo::get_method(stackFrame, holder, CHECK);
2866
2867 short version = stackFrame->short_field(_version_offset);
2868 int bci = stackFrame->int_field(_bci_offset);
2869 Symbol* name = method->name();
2870 java_lang_StackTraceElement::fill_in(stack_trace_element, holder, methodHandle(THREAD, method),
|
420 }
421
422 // Converts a Java String to a native C string that can be used for
423 // native OS calls.
424 char* java_lang_String::as_platform_dependent_str(Handle java_string, TRAPS) {
425 typedef char* (*to_platform_string_fn_t)(JNIEnv*, jstring, bool*);
426 static to_platform_string_fn_t _to_platform_string_fn = NULL;
427
428 if (_to_platform_string_fn == NULL) {
429 void *lib_handle = os::native_java_library();
430 _to_platform_string_fn = CAST_TO_FN_PTR(to_platform_string_fn_t, os::dll_lookup(lib_handle, "GetStringPlatformChars"));
431 if (_to_platform_string_fn == NULL) {
432 fatal("GetStringPlatformChars missing");
433 }
434 }
435
436 char *native_platform_string;
437 { JavaThread* thread = (JavaThread*)THREAD;
438 assert(thread->is_Java_thread(), "must be java thread");
439 JNIEnv *env = thread->jni_environment();
440 jstring js = (jstring) JNIHandles::make_local(thread, java_string());
441 bool is_copy;
442 HandleMark hm(thread);
443 ThreadToNativeFromVM ttn(thread);
444 native_platform_string = (_to_platform_string_fn)(env, js, &is_copy);
445 assert(is_copy == JNI_TRUE, "is_copy value changed");
446 JNIHandles::destroy_local(js);
447 }
448 return native_platform_string;
449 }
450
451 Handle java_lang_String::char_converter(Handle java_string, jchar from_char, jchar to_char, TRAPS) {
452 oop obj = java_string();
453 // Typical usage is to convert all '/' to '.' in string.
454 typeArrayOop value = java_lang_String::value(obj);
455 int length = java_lang_String::length(obj, value);
456 bool is_latin1 = java_lang_String::is_latin1(obj);
457
458 // First check if any from_char exist
459 int index; // Declared outside, used later
460 for (index = 0; index < length; index++) {
2827
2828 #if INCLUDE_CDS
2829 void java_lang_StackFrameInfo::serialize_offsets(SerializeClosure* f) {
2830 STACKFRAMEINFO_FIELDS_DO(FIELD_SERIALIZE_OFFSET);
2831 STACKFRAMEINFO_INJECTED_FIELDS(INJECTED_FIELD_SERIALIZE_OFFSET);
2832 }
2833 #endif
2834
2835 Method* java_lang_StackFrameInfo::get_method(Handle stackFrame, InstanceKlass* holder, TRAPS) {
2836 HandleMark hm(THREAD);
2837 Handle mname(THREAD, stackFrame->obj_field(_memberName_offset));
2838 Method* method = (Method*)java_lang_invoke_MemberName::vmtarget(mname());
2839 // we should expand MemberName::name when Throwable uses StackTrace
2840 // MethodHandles::expand_MemberName(mname, MethodHandles::_suppress_defc|MethodHandles::_suppress_type, CHECK_NULL);
2841 return method;
2842 }
2843
2844 void java_lang_StackFrameInfo::set_method_and_bci(Handle stackFrame, const methodHandle& method, int bci, TRAPS) {
2845 // set Method* or mid/cpref
2846 HandleMark hm(THREAD);
2847 Handle mname(THREAD, stackFrame->obj_field(_memberName_offset));
2848 InstanceKlass* ik = method->method_holder();
2849 CallInfo info(method(), ik, CHECK);
2850 MethodHandles::init_method_MemberName(mname, info, THREAD);
2851 // set bci
2852 java_lang_StackFrameInfo::set_bci(stackFrame(), bci);
2853 // method may be redefined; store the version
2854 int version = method->constants()->version();
2855 assert((jushort)version == version, "version should be short");
2856 java_lang_StackFrameInfo::set_version(stackFrame(), (short)version);
2857 }
2858
2859 void java_lang_StackFrameInfo::to_stack_trace_element(Handle stackFrame, Handle stack_trace_element, TRAPS) {
2860 ResourceMark rm(THREAD);
2861 HandleMark hm(THREAD);
2862 Handle mname(THREAD, stackFrame->obj_field(java_lang_StackFrameInfo::_memberName_offset));
2863 Klass* clazz = java_lang_Class::as_Klass(java_lang_invoke_MemberName::clazz(mname()));
2864 InstanceKlass* holder = InstanceKlass::cast(clazz);
2865 Method* method = java_lang_StackFrameInfo::get_method(stackFrame, holder, CHECK);
2866
2867 short version = stackFrame->short_field(_version_offset);
2868 int bci = stackFrame->int_field(_bci_offset);
2869 Symbol* name = method->name();
2870 java_lang_StackTraceElement::fill_in(stack_trace_element, holder, methodHandle(THREAD, method),
|