@@ -2956,15 +2956,78 @@ void java_lang_StackTraceElement::decode(const methodHandle& method, int bci,
29562956}
29572957#endif // INCLUDE_JVMCI
29582958
2959+ // java_lang_ClassFrameInfo
2960+
2961+ int java_lang_ClassFrameInfo::_classOrMemberName_offset;
2962+ int java_lang_ClassFrameInfo::_flags_offset;
2963+
2964+ #define CLASSFRAMEINFO_FIELDS_DO (macro ) \
2965+ macro (_classOrMemberName_offset, k, " classOrMemberName" , object_signature, false ); \
2966+ macro (_flags_offset, k, vmSymbols::flags_name(), int_signature, false)
2967+
2968+ void java_lang_ClassFrameInfo::compute_offsets() {
2969+ InstanceKlass* k = vmClasses::ClassFrameInfo_klass ();
2970+ CLASSFRAMEINFO_FIELDS_DO (FIELD_COMPUTE_OFFSET);
2971+ }
2972+
2973+ #if INCLUDE_CDS
2974+ void java_lang_ClassFrameInfo::serialize_offsets (SerializeClosure* f) {
2975+ CLASSFRAMEINFO_FIELDS_DO (FIELD_SERIALIZE_OFFSET);
2976+ }
2977+ #endif
2978+
2979+ static int get_flags (const methodHandle& m) {
2980+ int flags = (jushort)( m->access_flags ().as_short () & JVM_RECOGNIZED_METHOD_MODIFIERS );
2981+ if (m->is_initializer ()) {
2982+ flags |= java_lang_invoke_MemberName::MN_IS_CONSTRUCTOR;
2983+ } else {
2984+ flags |= java_lang_invoke_MemberName::MN_IS_METHOD;
2985+ }
2986+ if (m->caller_sensitive ()) {
2987+ flags |= java_lang_invoke_MemberName::MN_CALLER_SENSITIVE;
2988+ }
2989+ if (m->is_hidden ()) {
2990+ flags |= java_lang_invoke_MemberName::MN_HIDDEN_MEMBER;
2991+ }
2992+ assert ((flags & 0xFF000000 ) == 0 , " unexpected flags" );
2993+ return flags;
2994+ }
2995+
2996+ oop java_lang_ClassFrameInfo::classOrMemberName (oop obj) {
2997+ return obj->obj_field (_classOrMemberName_offset);
2998+ }
2999+
3000+ int java_lang_ClassFrameInfo::flags (oop obj) {
3001+ return obj->int_field (_flags_offset);
3002+ }
3003+
3004+ void java_lang_ClassFrameInfo::init_class (Handle stackFrame, const methodHandle& m) {
3005+ stackFrame->obj_field_put (_classOrMemberName_offset, m->method_holder ()->java_mirror ());
3006+ // flags is initialized when ClassFrameInfo object is constructed and retain the value
3007+ int flags = java_lang_ClassFrameInfo::flags (stackFrame ()) | get_flags (m);
3008+ stackFrame->int_field_put (_flags_offset, flags);
3009+ }
3010+
3011+ void java_lang_ClassFrameInfo::init_method (Handle stackFrame, const methodHandle& m, TRAPS) {
3012+ oop rmethod_name = java_lang_invoke_ResolvedMethodName::find_resolved_method (m, CHECK);
3013+ stackFrame->obj_field_put (_classOrMemberName_offset, rmethod_name);
3014+ // flags is initialized when ClassFrameInfo object is constructed and retain the value
3015+ int flags = java_lang_ClassFrameInfo::flags (stackFrame ()) | get_flags (m);
3016+ stackFrame->int_field_put (_flags_offset, flags);
3017+ }
3018+
3019+
29593020// java_lang_StackFrameInfo
29603021
2961- int java_lang_StackFrameInfo::_memberName_offset;
3022+ int java_lang_StackFrameInfo::_type_offset;
3023+ int java_lang_StackFrameInfo::_name_offset;
29623024int java_lang_StackFrameInfo::_bci_offset;
29633025int java_lang_StackFrameInfo::_version_offset;
29643026int java_lang_StackFrameInfo::_contScope_offset;
29653027
29663028#define STACKFRAMEINFO_FIELDS_DO (macro ) \
2967- macro (_memberName_offset, k, " memberName" , object_signature, false ); \
3029+ macro (_type_offset, k, " type" , object_signature, false ); \
3030+ macro (_name_offset, k, " name" , string_signature, false ); \
29683031 macro (_bci_offset, k, " bci" , int_signature, false ); \
29693032 macro (_contScope_offset, k, " contScope" , continuationscope_signature, false )
29703033
@@ -2981,23 +3044,18 @@ void java_lang_StackFrameInfo::serialize_offsets(SerializeClosure* f) {
29813044}
29823045#endif
29833046
2984- Method* java_lang_StackFrameInfo::get_method (Handle stackFrame, InstanceKlass* holder, TRAPS) {
2985- HandleMark hm (THREAD);
2986- Handle mname (THREAD, stackFrame->obj_field (_memberName_offset));
2987- Method* method = (Method*)java_lang_invoke_MemberName::vmtarget (mname ());
2988- // we should expand MemberName::name when Throwable uses StackTrace
2989- // MethodHandles::expand_MemberName(mname, MethodHandles::_suppress_defc|MethodHandles::_suppress_type, CHECK_NULL);
3047+ Method* java_lang_StackFrameInfo::get_method (oop obj) {
3048+ oop m = java_lang_ClassFrameInfo::classOrMemberName (obj);
3049+ Method* method = java_lang_invoke_ResolvedMethodName::vmtarget (m);
29903050 return method;
29913051}
29923052
29933053void java_lang_StackFrameInfo::set_method_and_bci (Handle stackFrame, const methodHandle& method, int bci, oop cont, TRAPS) {
29943054 // set Method* or mid/cpref
29953055 HandleMark hm (THREAD);
2996- Handle mname (THREAD, stackFrame->obj_field (_memberName_offset));
2997- Handle cont_h (THREAD, cont);
2998- InstanceKlass* ik = method->method_holder ();
2999- CallInfo info (method (), ik, CHECK);
3000- MethodHandles::init_method_MemberName (mname, info);
3056+ Handle cont_h (THREAD, cont);
3057+ java_lang_ClassFrameInfo::init_method (stackFrame, method, CHECK);
3058+
30013059 // set bci
30023060 java_lang_StackFrameInfo::set_bci (stackFrame (), bci);
30033061 // method may be redefined; store the version
@@ -3012,28 +3070,42 @@ void java_lang_StackFrameInfo::set_method_and_bci(Handle stackFrame, const metho
30123070void java_lang_StackFrameInfo::to_stack_trace_element (Handle stackFrame, Handle stack_trace_element, TRAPS) {
30133071 ResourceMark rm (THREAD);
30143072 HandleMark hm (THREAD);
3015- Handle mname (THREAD, stackFrame->obj_field (java_lang_StackFrameInfo::_memberName_offset));
3016- Klass* clazz = java_lang_Class::as_Klass (java_lang_invoke_MemberName::clazz (mname ()));
3017- InstanceKlass* holder = InstanceKlass::cast (clazz);
3018- Method* method = java_lang_StackFrameInfo::get_method (stackFrame, holder, CHECK);
30193073
3074+ Method* method = java_lang_StackFrameInfo::get_method (stackFrame ());
3075+ InstanceKlass* holder = method->method_holder ();
30203076 short version = stackFrame->short_field (_version_offset);
30213077 int bci = stackFrame->int_field (_bci_offset);
30223078 Symbol* name = method->name ();
30233079 java_lang_StackTraceElement::fill_in (stack_trace_element, holder, methodHandle (THREAD, method), version, bci, name, CHECK);
30243080}
30253081
3026- void java_lang_StackFrameInfo::set_version (oop element, short value ) {
3027- element-> short_field_put (_version_offset, value );
3082+ oop java_lang_StackFrameInfo::type (oop obj ) {
3083+ return obj-> obj_field (_type_offset );
30283084}
30293085
3030- void java_lang_StackFrameInfo::set_bci (oop element, int value) {
3086+ void java_lang_StackFrameInfo::set_type (oop obj, oop value) {
3087+ obj->obj_field_put (_type_offset, value);
3088+ }
3089+
3090+ oop java_lang_StackFrameInfo::name (oop obj) {
3091+ return obj->obj_field (_name_offset);
3092+ }
3093+
3094+ void java_lang_StackFrameInfo::set_name (oop obj, oop value) {
3095+ obj->obj_field_put (_name_offset, value);
3096+ }
3097+
3098+ void java_lang_StackFrameInfo::set_version (oop obj, short value) {
3099+ obj->short_field_put (_version_offset, value);
3100+ }
3101+
3102+ void java_lang_StackFrameInfo::set_bci (oop obj, int value) {
30313103 assert (value >= 0 && value < max_jushort, " must be a valid bci value" );
3032- element ->int_field_put (_bci_offset, value);
3104+ obj ->int_field_put (_bci_offset, value);
30333105}
30343106
3035- void java_lang_StackFrameInfo::set_contScope (oop element , oop value) {
3036- element ->obj_field_put (_contScope_offset, value);
3107+ void java_lang_StackFrameInfo::set_contScope (oop obj , oop value) {
3108+ obj ->obj_field_put (_contScope_offset, value);
30373109}
30383110
30393111int java_lang_LiveStackFrameInfo::_monitors_offset;
@@ -3058,20 +3130,20 @@ void java_lang_LiveStackFrameInfo::serialize_offsets(SerializeClosure* f) {
30583130}
30593131#endif
30603132
3061- void java_lang_LiveStackFrameInfo::set_monitors (oop element , oop value) {
3062- element ->obj_field_put (_monitors_offset, value);
3133+ void java_lang_LiveStackFrameInfo::set_monitors (oop obj , oop value) {
3134+ obj ->obj_field_put (_monitors_offset, value);
30633135}
30643136
3065- void java_lang_LiveStackFrameInfo::set_locals (oop element , oop value) {
3066- element ->obj_field_put (_locals_offset, value);
3137+ void java_lang_LiveStackFrameInfo::set_locals (oop obj , oop value) {
3138+ obj ->obj_field_put (_locals_offset, value);
30673139}
30683140
3069- void java_lang_LiveStackFrameInfo::set_operands (oop element , oop value) {
3070- element ->obj_field_put (_operands_offset, value);
3141+ void java_lang_LiveStackFrameInfo::set_operands (oop obj , oop value) {
3142+ obj ->obj_field_put (_operands_offset, value);
30713143}
30723144
3073- void java_lang_LiveStackFrameInfo::set_mode (oop element , int value) {
3074- element ->int_field_put (_mode_offset, value);
3145+ void java_lang_LiveStackFrameInfo::set_mode (oop obj , int value) {
3146+ obj ->int_field_put (_mode_offset, value);
30753147}
30763148
30773149
@@ -3947,14 +4019,19 @@ void java_lang_invoke_MemberName::serialize_offsets(SerializeClosure* f) {
39474019}
39484020#endif
39494021
4022+ #define RESOLVEDMETHOD_FIELDS_DO (macro ) \
4023+ macro (_vmholder_offset, k, " vmholder" , class_signature, false )
4024+
39504025void java_lang_invoke_ResolvedMethodName::compute_offsets() {
39514026 InstanceKlass* k = vmClasses::ResolvedMethodName_klass ();
39524027 assert (k != nullptr , " jdk mismatch" );
4028+ RESOLVEDMETHOD_FIELDS_DO (FIELD_COMPUTE_OFFSET);
39534029 RESOLVEDMETHOD_INJECTED_FIELDS (INJECTED_FIELD_COMPUTE_OFFSET);
39544030}
39554031
39564032#if INCLUDE_CDS
39574033void java_lang_invoke_ResolvedMethodName::serialize_offsets (SerializeClosure* f) {
4034+ RESOLVEDMETHOD_FIELDS_DO (FIELD_SERIALIZE_OFFSET);
39584035 RESOLVEDMETHOD_INJECTED_FIELDS (INJECTED_FIELD_SERIALIZE_OFFSET);
39594036}
39604037#endif
@@ -5217,6 +5294,7 @@ void java_lang_InternalError::serialize_offsets(SerializeClosure* f) {
52175294 f(java_lang_reflect_Parameter) \
52185295 f(java_lang_Module) \
52195296 f(java_lang_StackTraceElement) \
5297+ f(java_lang_ClassFrameInfo) \
52205298 f(java_lang_StackFrameInfo) \
52215299 f(java_lang_LiveStackFrameInfo) \
52225300 f(jdk_internal_vm_ContinuationScope) \
0 commit comments