Mercurial > hg > graal-jvmci-8
comparison src/share/vm/oops/methodOop.cpp @ 6213:8150fa46d2ed
7178145: Change constMethodOop::_exception_table to optionally inlined u2 table.
Summary: Change constMethodOop::_exception_table to optionally inlined u2 table.
Reviewed-by: bdelsart, coleenp, kamg
author | jiangli |
---|---|
date | Tue, 26 Jun 2012 19:08:44 -0400 |
parents | eba1d5bce9e8 |
children | 161ae369407d |
comparison
equal
deleted
inserted
replaced
6177:06320b1578cb | 6213:8150fa46d2ed |
---|---|
109 return buf; | 109 return buf; |
110 } | 110 } |
111 | 111 |
112 int methodOopDesc::fast_exception_handler_bci_for(KlassHandle ex_klass, int throw_bci, TRAPS) { | 112 int methodOopDesc::fast_exception_handler_bci_for(KlassHandle ex_klass, int throw_bci, TRAPS) { |
113 // exception table holds quadruple entries of the form (beg_bci, end_bci, handler_bci, klass_index) | 113 // exception table holds quadruple entries of the form (beg_bci, end_bci, handler_bci, klass_index) |
114 const int beg_bci_offset = 0; | |
115 const int end_bci_offset = 1; | |
116 const int handler_bci_offset = 2; | |
117 const int klass_index_offset = 3; | |
118 const int entry_size = 4; | |
119 // access exception table | 114 // access exception table |
120 typeArrayHandle table (THREAD, constMethod()->exception_table()); | 115 ExceptionTable table(this); |
121 int length = table->length(); | 116 int length = table.length(); |
122 assert(length % entry_size == 0, "exception table format has changed"); | |
123 // iterate through all entries sequentially | 117 // iterate through all entries sequentially |
124 constantPoolHandle pool(THREAD, constants()); | 118 constantPoolHandle pool(THREAD, constants()); |
125 for (int i = 0; i < length; i += entry_size) { | 119 for (int i = 0; i < length; i ++) { |
126 int beg_bci = table->int_at(i + beg_bci_offset); | 120 //reacquire the table in case a GC happened |
127 int end_bci = table->int_at(i + end_bci_offset); | 121 ExceptionTable table(this); |
122 int beg_bci = table.start_pc(i); | |
123 int end_bci = table.end_pc(i); | |
128 assert(beg_bci <= end_bci, "inconsistent exception table"); | 124 assert(beg_bci <= end_bci, "inconsistent exception table"); |
129 if (beg_bci <= throw_bci && throw_bci < end_bci) { | 125 if (beg_bci <= throw_bci && throw_bci < end_bci) { |
130 // exception handler bci range covers throw_bci => investigate further | 126 // exception handler bci range covers throw_bci => investigate further |
131 int handler_bci = table->int_at(i + handler_bci_offset); | 127 int handler_bci = table.handler_pc(i); |
132 int klass_index = table->int_at(i + klass_index_offset); | 128 int klass_index = table.catch_type_index(i); |
133 if (klass_index == 0) { | 129 if (klass_index == 0) { |
134 return handler_bci; | 130 return handler_bci; |
135 } else if (ex_klass.is_null()) { | 131 } else if (ex_klass.is_null()) { |
136 return handler_bci; | 132 return handler_bci; |
137 } else { | 133 } else { |
978 cp->pseudo_string_at_put(_imcp_method_type_value, method_type()); | 974 cp->pseudo_string_at_put(_imcp_method_type_value, method_type()); |
979 methodHandle m; | 975 methodHandle m; |
980 { | 976 { |
981 int flags_bits = (JVM_MH_INVOKE_BITS | JVM_ACC_PUBLIC | JVM_ACC_FINAL); | 977 int flags_bits = (JVM_MH_INVOKE_BITS | JVM_ACC_PUBLIC | JVM_ACC_FINAL); |
982 methodOop m_oop = oopFactory::new_method(0, accessFlags_from(flags_bits), | 978 methodOop m_oop = oopFactory::new_method(0, accessFlags_from(flags_bits), |
983 0, 0, 0, IsSafeConc, CHECK_(empty)); | 979 0, 0, 0, 0, IsSafeConc, CHECK_(empty)); |
984 m = methodHandle(THREAD, m_oop); | 980 m = methodHandle(THREAD, m_oop); |
985 } | 981 } |
986 m->set_constants(cp()); | 982 m->set_constants(cp()); |
987 m->set_name_index(_imcp_invoke_name); | 983 m->set_name_index(_imcp_invoke_name); |
988 m->set_signature_index(_imcp_invoke_signature); | 984 m->set_signature_index(_imcp_invoke_signature); |
992 #ifdef CC_INTERP | 988 #ifdef CC_INTERP |
993 ResultTypeFinder rtf(signature); | 989 ResultTypeFinder rtf(signature); |
994 m->set_result_index(rtf.type()); | 990 m->set_result_index(rtf.type()); |
995 #endif | 991 #endif |
996 m->compute_size_of_parameters(THREAD); | 992 m->compute_size_of_parameters(THREAD); |
997 m->set_exception_table(Universe::the_empty_int_array()); | |
998 m->init_intrinsic_id(); | 993 m->init_intrinsic_id(); |
999 assert(m->intrinsic_id() == vmIntrinsics::_invokeExact || | 994 assert(m->intrinsic_id() == vmIntrinsics::_invokeExact || |
1000 m->intrinsic_id() == vmIntrinsics::_invokeGeneric, "must be an invoker"); | 995 m->intrinsic_id() == vmIntrinsics::_invokeGeneric, "must be an invoker"); |
1001 | 996 |
1002 // Finally, set up its entry points. | 997 // Finally, set up its entry points. |
1036 assert(!m->is_native(), "cannot rewrite native methods"); | 1031 assert(!m->is_native(), "cannot rewrite native methods"); |
1037 // Allocate new methodOop | 1032 // Allocate new methodOop |
1038 AccessFlags flags = m->access_flags(); | 1033 AccessFlags flags = m->access_flags(); |
1039 int checked_exceptions_len = m->checked_exceptions_length(); | 1034 int checked_exceptions_len = m->checked_exceptions_length(); |
1040 int localvariable_len = m->localvariable_table_length(); | 1035 int localvariable_len = m->localvariable_table_length(); |
1036 int exception_table_len = m->exception_table_length(); | |
1041 // Allocate newm_oop with the is_conc_safe parameter set | 1037 // Allocate newm_oop with the is_conc_safe parameter set |
1042 // to IsUnsafeConc to indicate that newm_oop is not yet | 1038 // to IsUnsafeConc to indicate that newm_oop is not yet |
1043 // safe for concurrent processing by a GC. | 1039 // safe for concurrent processing by a GC. |
1044 methodOop newm_oop = oopFactory::new_method(new_code_length, | 1040 methodOop newm_oop = oopFactory::new_method(new_code_length, |
1045 flags, | 1041 flags, |
1046 new_compressed_linenumber_size, | 1042 new_compressed_linenumber_size, |
1047 localvariable_len, | 1043 localvariable_len, |
1044 exception_table_len, | |
1048 checked_exceptions_len, | 1045 checked_exceptions_len, |
1049 IsUnsafeConc, | 1046 IsUnsafeConc, |
1050 CHECK_(methodHandle())); | 1047 CHECK_(methodHandle())); |
1051 methodHandle newm (THREAD, newm_oop); | 1048 methodHandle newm (THREAD, newm_oop); |
1052 NOT_PRODUCT(int nmsz = newm->is_parsable() ? newm->size() : -1;) | 1049 NOT_PRODUCT(int nmsz = newm->is_parsable() ? newm->size() : -1;) |