168 cp->method_type_index_at_put(index, signature_index); |
168 cp->method_type_index_at_put(index, signature_index); |
169 } else { |
169 } else { |
170 ShouldNotReachHere(); |
170 ShouldNotReachHere(); |
171 } |
171 } |
172 break; |
172 break; |
173 case JVM_CONSTANT_InvokeDynamicTrans : // this tag appears only in old classfiles |
|
174 case JVM_CONSTANT_InvokeDynamic : |
173 case JVM_CONSTANT_InvokeDynamic : |
175 { |
174 { |
176 if (_major_version < Verifier::INVOKEDYNAMIC_MAJOR_VERSION) { |
175 if (_major_version < Verifier::INVOKEDYNAMIC_MAJOR_VERSION) { |
177 classfile_parse_error( |
176 classfile_parse_error( |
178 "Class file version does not support constant tag %u in class file %s", |
177 "Class file version does not support constant tag %u in class file %s", |
184 tag, CHECK); |
183 tag, CHECK); |
185 } |
184 } |
186 cfs->guarantee_more(5, CHECK); // bsm_index, nt, tag/access_flags |
185 cfs->guarantee_more(5, CHECK); // bsm_index, nt, tag/access_flags |
187 u2 bootstrap_specifier_index = cfs->get_u2_fast(); |
186 u2 bootstrap_specifier_index = cfs->get_u2_fast(); |
188 u2 name_and_type_index = cfs->get_u2_fast(); |
187 u2 name_and_type_index = cfs->get_u2_fast(); |
189 if (tag == JVM_CONSTANT_InvokeDynamicTrans) { |
|
190 if (!AllowTransitionalJSR292) |
|
191 classfile_parse_error( |
|
192 "This JVM does not support transitional InvokeDynamic tag %u in class file %s", |
|
193 tag, CHECK); |
|
194 cp->invoke_dynamic_trans_at_put(index, bootstrap_specifier_index, name_and_type_index); |
|
195 break; |
|
196 } |
|
197 if (_max_bootstrap_specifier_index < (int) bootstrap_specifier_index) |
188 if (_max_bootstrap_specifier_index < (int) bootstrap_specifier_index) |
198 _max_bootstrap_specifier_index = (int) bootstrap_specifier_index; // collect for later |
189 _max_bootstrap_specifier_index = (int) bootstrap_specifier_index; // collect for later |
199 cp->invoke_dynamic_at_put(index, bootstrap_specifier_index, name_and_type_index); |
190 cp->invoke_dynamic_at_put(index, bootstrap_specifier_index, name_and_type_index); |
200 } |
191 } |
201 break; |
192 break; |
490 EnableInvokeDynamic, |
481 EnableInvokeDynamic, |
491 "Invalid constant pool index %u in class file %s", |
482 "Invalid constant pool index %u in class file %s", |
492 ref_index, CHECK_(nullHandle)); |
483 ref_index, CHECK_(nullHandle)); |
493 } |
484 } |
494 break; |
485 break; |
495 case JVM_CONSTANT_InvokeDynamicTrans : |
|
496 case JVM_CONSTANT_InvokeDynamic : |
486 case JVM_CONSTANT_InvokeDynamic : |
497 { |
487 { |
498 int name_and_type_ref_index = cp->invoke_dynamic_name_and_type_ref_index_at(index); |
488 int name_and_type_ref_index = cp->invoke_dynamic_name_and_type_ref_index_at(index); |
499 check_property(valid_cp_range(name_and_type_ref_index, length) && |
489 check_property(valid_cp_range(name_and_type_ref_index, length) && |
500 cp->tag_at(name_and_type_ref_index).is_name_and_type(), |
490 cp->tag_at(name_and_type_ref_index).is_name_and_type(), |
501 "Invalid constant pool index %u in class file %s", |
491 "Invalid constant pool index %u in class file %s", |
502 name_and_type_ref_index, |
492 name_and_type_ref_index, |
503 CHECK_(nullHandle)); |
493 CHECK_(nullHandle)); |
504 if (tag == JVM_CONSTANT_InvokeDynamicTrans) { |
|
505 int bootstrap_method_ref_index = cp->invoke_dynamic_bootstrap_method_ref_index_at(index); |
|
506 check_property(valid_cp_range(bootstrap_method_ref_index, length) && |
|
507 cp->tag_at(bootstrap_method_ref_index).is_method_handle(), |
|
508 "Invalid constant pool index %u in class file %s", |
|
509 bootstrap_method_ref_index, |
|
510 CHECK_(nullHandle)); |
|
511 } |
|
512 // bootstrap specifier index must be checked later, when BootstrapMethods attr is available |
494 // bootstrap specifier index must be checked later, when BootstrapMethods attr is available |
513 break; |
495 break; |
514 } |
496 } |
515 default: |
497 default: |
516 fatal(err_msg("bad constant pool tag value %u", |
498 fatal(err_msg("bad constant pool tag value %u", |
2781 word_sig_index = index; |
2763 word_sig_index = index; |
2782 break; |
2764 break; |
2783 } |
2765 } |
2784 } |
2766 } |
2785 |
2767 |
2786 if (AllowTransitionalJSR292 && word_sig_index == 0) return; |
|
2787 if (word_sig_index == 0) |
2768 if (word_sig_index == 0) |
2788 THROW_MSG(vmSymbols::java_lang_VirtualMachineError(), |
2769 THROW_MSG(vmSymbols::java_lang_VirtualMachineError(), |
2789 "missing I or J signature (for vmentry) in java.lang.invoke.MethodHandle"); |
2770 "missing I or J signature (for vmentry) in java.lang.invoke.MethodHandle"); |
2790 |
2771 |
2791 // Find vmentry field and change the signature. |
2772 // Find vmentry field and change the signature. |
3190 nonstatic_field_size * heapOopSize; |
3170 nonstatic_field_size * heapOopSize; |
3191 next_nonstatic_field_offset = first_nonstatic_field_offset; |
3171 next_nonstatic_field_offset = first_nonstatic_field_offset; |
3192 |
3172 |
3193 // adjust the vmentry field declaration in java.lang.invoke.MethodHandle |
3173 // adjust the vmentry field declaration in java.lang.invoke.MethodHandle |
3194 if (EnableInvokeDynamic && class_name == vmSymbols::java_lang_invoke_MethodHandle() && class_loader.is_null()) { |
3174 if (EnableInvokeDynamic && class_name == vmSymbols::java_lang_invoke_MethodHandle() && class_loader.is_null()) { |
3195 java_lang_invoke_MethodHandle_fix_pre(cp, fields, &fac, CHECK_(nullHandle)); |
|
3196 } |
|
3197 if (AllowTransitionalJSR292 && |
|
3198 EnableInvokeDynamic && class_name == vmSymbols::java_dyn_MethodHandle() && class_loader.is_null()) { |
|
3199 java_lang_invoke_MethodHandle_fix_pre(cp, fields, &fac, CHECK_(nullHandle)); |
|
3200 } |
|
3201 if (AllowTransitionalJSR292 && |
|
3202 EnableInvokeDynamic && class_name == vmSymbols::sun_dyn_MethodHandleImpl() && class_loader.is_null()) { |
|
3203 // allow vmentry field in MethodHandleImpl also |
|
3204 java_lang_invoke_MethodHandle_fix_pre(cp, fields, &fac, CHECK_(nullHandle)); |
3175 java_lang_invoke_MethodHandle_fix_pre(cp, fields, &fac, CHECK_(nullHandle)); |
3205 } |
3176 } |
3206 |
3177 |
3207 // Add a fake "discovered" field if it is not present |
3178 // Add a fake "discovered" field if it is not present |
3208 // for compatibility with earlier jdk's. |
3179 // for compatibility with earlier jdk's. |