hotspot/src/share/vm/classfile/classFileParser.cpp
changeset 8676 9098d4e927e1
parent 8675 e9fef2a9bef7
child 8725 8c1e3dd5fe1b
equal deleted inserted replaced
8675:e9fef2a9bef7 8676:9098d4e927e1
  2804 }
  2804 }
  2805 
  2805 
  2806 
  2806 
  2807 // Force MethodHandle.vmentry to be an unmanaged pointer.
  2807 // Force MethodHandle.vmentry to be an unmanaged pointer.
  2808 // There is no way for a classfile to express this, so we must help it.
  2808 // There is no way for a classfile to express this, so we must help it.
  2809 void ClassFileParser::java_dyn_MethodHandle_fix_pre(constantPoolHandle cp,
  2809 void ClassFileParser::java_lang_invoke_MethodHandle_fix_pre(constantPoolHandle cp,
  2810                                                     typeArrayHandle fields,
  2810                                                     typeArrayHandle fields,
  2811                                                     FieldAllocationCount *fac_ptr,
  2811                                                     FieldAllocationCount *fac_ptr,
  2812                                                     TRAPS) {
  2812                                                     TRAPS) {
  2813   // Add fake fields for java.dyn.MethodHandle instances
  2813   // Add fake fields for java.lang.invoke.MethodHandle instances
  2814   //
  2814   //
  2815   // This is not particularly nice, but since there is no way to express
  2815   // This is not particularly nice, but since there is no way to express
  2816   // a native wordSize field in Java, we must do it at this level.
  2816   // a native wordSize field in Java, we must do it at this level.
  2817 
  2817 
  2818   if (!EnableMethodHandles)  return;
  2818   if (!EnableMethodHandles)  return;
  2828   }
  2828   }
  2829 
  2829 
  2830   if (AllowTransitionalJSR292 && word_sig_index == 0)  return;
  2830   if (AllowTransitionalJSR292 && word_sig_index == 0)  return;
  2831   if (word_sig_index == 0)
  2831   if (word_sig_index == 0)
  2832     THROW_MSG(vmSymbols::java_lang_VirtualMachineError(),
  2832     THROW_MSG(vmSymbols::java_lang_VirtualMachineError(),
  2833               "missing I or J signature (for vmentry) in java.dyn.MethodHandle");
  2833               "missing I or J signature (for vmentry) in java.lang.invoke.MethodHandle");
  2834 
  2834 
  2835   // Find vmentry field and change the signature.
  2835   // Find vmentry field and change the signature.
  2836   bool found_vmentry = false;
  2836   bool found_vmentry = false;
  2837   for (int i = 0; i < fields->length(); i += instanceKlass::next_offset) {
  2837   for (int i = 0; i < fields->length(); i += instanceKlass::next_offset) {
  2838     int name_index = fields->ushort_at(i + instanceKlass::name_index_offset);
  2838     int name_index = fields->ushort_at(i + instanceKlass::name_index_offset);
  2868   }
  2868   }
  2869 
  2869 
  2870   if (AllowTransitionalJSR292 && !found_vmentry)  return;
  2870   if (AllowTransitionalJSR292 && !found_vmentry)  return;
  2871   if (!found_vmentry)
  2871   if (!found_vmentry)
  2872     THROW_MSG(vmSymbols::java_lang_VirtualMachineError(),
  2872     THROW_MSG(vmSymbols::java_lang_VirtualMachineError(),
  2873               "missing vmentry byte field in java.dyn.MethodHandle");
  2873               "missing vmentry byte field in java.lang.invoke.MethodHandle");
  2874 }
  2874 }
  2875 
  2875 
  2876 
  2876 
  2877 instanceKlassHandle ClassFileParser::parseClassFile(Symbol* name,
  2877 instanceKlassHandle ClassFileParser::parseClassFile(Symbol* name,
  2878                                                     Handle class_loader,
  2878                                                     Handle class_loader,
  3233     // Add fake fields for java.lang.Class instances (also see below)
  3233     // Add fake fields for java.lang.Class instances (also see below)
  3234     if (class_name == vmSymbols::java_lang_Class() && class_loader.is_null()) {
  3234     if (class_name == vmSymbols::java_lang_Class() && class_loader.is_null()) {
  3235       java_lang_Class_fix_pre(&methods, &fac, CHECK_(nullHandle));
  3235       java_lang_Class_fix_pre(&methods, &fac, CHECK_(nullHandle));
  3236     }
  3236     }
  3237 
  3237 
  3238     // adjust the vmentry field declaration in java.dyn.MethodHandle
  3238     // adjust the vmentry field declaration in java.lang.invoke.MethodHandle
  3239     if (EnableMethodHandles && class_name == vmSymbols::java_dyn_MethodHandle() && class_loader.is_null()) {
  3239     if (EnableMethodHandles && class_name == vmSymbols::java_lang_invoke_MethodHandle() && class_loader.is_null()) {
  3240       java_dyn_MethodHandle_fix_pre(cp, fields, &fac, CHECK_(nullHandle));
  3240       java_lang_invoke_MethodHandle_fix_pre(cp, fields, &fac, CHECK_(nullHandle));
       
  3241     }
       
  3242     if (AllowTransitionalJSR292 &&
       
  3243         EnableMethodHandles && class_name == vmSymbols::java_dyn_MethodHandle() && class_loader.is_null()) {
       
  3244       java_lang_invoke_MethodHandle_fix_pre(cp, fields, &fac, CHECK_(nullHandle));
  3241     }
  3245     }
  3242     if (AllowTransitionalJSR292 &&
  3246     if (AllowTransitionalJSR292 &&
  3243         EnableMethodHandles && class_name == vmSymbols::sun_dyn_MethodHandleImpl() && class_loader.is_null()) {
  3247         EnableMethodHandles && class_name == vmSymbols::sun_dyn_MethodHandleImpl() && class_loader.is_null()) {
  3244       // allow vmentry field in MethodHandleImpl also
  3248       // allow vmentry field in MethodHandleImpl also
  3245       java_dyn_MethodHandle_fix_pre(cp, fields, &fac, CHECK_(nullHandle));
  3249       java_lang_invoke_MethodHandle_fix_pre(cp, fields, &fac, CHECK_(nullHandle));
  3246     }
  3250     }
  3247 
  3251 
  3248     // Add a fake "discovered" field if it is not present
  3252     // Add a fake "discovered" field if it is not present
  3249     // for compatibility with earlier jdk's.
  3253     // for compatibility with earlier jdk's.
  3250     if (class_name == vmSymbols::java_lang_ref_Reference()
  3254     if (class_name == vmSymbols::java_lang_ref_Reference()