< prev index next >

src/hotspot/share/classfile/javaClasses.cpp

Print this page




 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),


< prev index next >