hotspot/src/share/vm/classfile/classFileParser.cpp
changeset 8883 5569135acca3
parent 8725 8c1e3dd5fe1b
child 9116 9bc44be338d6
equal deleted inserted replaced
8882:f852635a6383 8883:5569135acca3
   150         if (_major_version < Verifier::INVOKEDYNAMIC_MAJOR_VERSION) {
   150         if (_major_version < Verifier::INVOKEDYNAMIC_MAJOR_VERSION) {
   151           classfile_parse_error(
   151           classfile_parse_error(
   152             "Class file version does not support constant tag %u in class file %s",
   152             "Class file version does not support constant tag %u in class file %s",
   153             tag, CHECK);
   153             tag, CHECK);
   154         }
   154         }
   155         if (!EnableMethodHandles) {
   155         if (!EnableInvokeDynamic) {
   156           classfile_parse_error(
   156           classfile_parse_error(
   157             "This JVM does not support constant tag %u in class file %s",
   157             "This JVM does not support constant tag %u in class file %s",
   158             tag, CHECK);
   158             tag, CHECK);
   159         }
   159         }
   160         if (tag == JVM_CONSTANT_MethodHandle) {
   160         if (tag == JVM_CONSTANT_MethodHandle) {
   258           // Before storing the symbol, make sure it's legal
   258           // Before storing the symbol, make sure it's legal
   259           if (_need_verify) {
   259           if (_need_verify) {
   260             verify_legal_utf8((unsigned char*)utf8_buffer, utf8_length, CHECK);
   260             verify_legal_utf8((unsigned char*)utf8_buffer, utf8_length, CHECK);
   261           }
   261           }
   262 
   262 
   263           if (AnonymousClasses && has_cp_patch_at(index)) {
   263           if (EnableInvokeDynamic && has_cp_patch_at(index)) {
   264             Handle patch = clear_cp_patch_at(index);
   264             Handle patch = clear_cp_patch_at(index);
   265             guarantee_property(java_lang_String::is_instance(patch()),
   265             guarantee_property(java_lang_String::is_instance(patch()),
   266                                "Illegal utf8 patch at %d in class file %s",
   266                                "Illegal utf8 patch at %d in class file %s",
   267                                index, CHECK);
   267                                index, CHECK);
   268             char* str = java_lang_String::as_utf8_string(patch());
   268             char* str = java_lang_String::as_utf8_string(patch());
   441       case JVM_CONSTANT_MethodHandle :
   441       case JVM_CONSTANT_MethodHandle :
   442         {
   442         {
   443           int ref_index = cp->method_handle_index_at(index);
   443           int ref_index = cp->method_handle_index_at(index);
   444           check_property(
   444           check_property(
   445             valid_cp_range(ref_index, length) &&
   445             valid_cp_range(ref_index, length) &&
   446                 EnableMethodHandles,
   446                 EnableInvokeDynamic,
   447               "Invalid constant pool index %u in class file %s",
   447               "Invalid constant pool index %u in class file %s",
   448               ref_index, CHECK_(nullHandle));
   448               ref_index, CHECK_(nullHandle));
   449           constantTag tag = cp->tag_at(ref_index);
   449           constantTag tag = cp->tag_at(ref_index);
   450           int ref_kind  = cp->method_handle_ref_kind_at(index);
   450           int ref_kind  = cp->method_handle_ref_kind_at(index);
   451           switch (ref_kind) {
   451           switch (ref_kind) {
   485         {
   485         {
   486           int ref_index = cp->method_type_index_at(index);
   486           int ref_index = cp->method_type_index_at(index);
   487           check_property(
   487           check_property(
   488             valid_cp_range(ref_index, length) &&
   488             valid_cp_range(ref_index, length) &&
   489                 cp->tag_at(ref_index).is_utf8() &&
   489                 cp->tag_at(ref_index).is_utf8() &&
   490                 EnableMethodHandles,
   490                 EnableInvokeDynamic,
   491               "Invalid constant pool index %u in class file %s",
   491               "Invalid constant pool index %u in class file %s",
   492               ref_index, CHECK_(nullHandle));
   492               ref_index, CHECK_(nullHandle));
   493         }
   493         }
   494         break;
   494         break;
   495       case JVM_CONSTANT_InvokeDynamicTrans :
   495       case JVM_CONSTANT_InvokeDynamicTrans :
   520     } // end of switch
   520     } // end of switch
   521   } // end of for
   521   } // end of for
   522 
   522 
   523   if (_cp_patches != NULL) {
   523   if (_cp_patches != NULL) {
   524     // need to treat this_class specially...
   524     // need to treat this_class specially...
   525     assert(AnonymousClasses, "");
   525     assert(EnableInvokeDynamic, "");
   526     int this_class_index;
   526     int this_class_index;
   527     {
   527     {
   528       cfs->guarantee_more(8, CHECK_(nullHandle));  // flags, this_class, super_class, infs_len
   528       cfs->guarantee_more(8, CHECK_(nullHandle));  // flags, this_class, super_class, infs_len
   529       u1* mark = cfs->current();
   529       u1* mark = cfs->current();
   530       u2 flags         = cfs->get_u2_fast();
   530       u2 flags         = cfs->get_u2_fast();
   675   return cp;
   675   return cp;
   676 }
   676 }
   677 
   677 
   678 
   678 
   679 void ClassFileParser::patch_constant_pool(constantPoolHandle cp, int index, Handle patch, TRAPS) {
   679 void ClassFileParser::patch_constant_pool(constantPoolHandle cp, int index, Handle patch, TRAPS) {
   680   assert(AnonymousClasses, "");
   680   assert(EnableInvokeDynamic, "");
   681   BasicType patch_type = T_VOID;
   681   BasicType patch_type = T_VOID;
   682   switch (cp->tag_at(index).value()) {
   682   switch (cp->tag_at(index).value()) {
   683 
   683 
   684   case JVM_CONSTANT_UnresolvedClass :
   684   case JVM_CONSTANT_UnresolvedClass :
   685     // Patching a class means pre-resolving it.
   685     // Patching a class means pre-resolving it.
  2101       signature == vmSymbols::void_method_signature() &&
  2101       signature == vmSymbols::void_method_signature() &&
  2102       m->is_vanilla_constructor()) {
  2102       m->is_vanilla_constructor()) {
  2103     _has_vanilla_constructor = true;
  2103     _has_vanilla_constructor = true;
  2104   }
  2104   }
  2105 
  2105 
  2106   if (EnableMethodHandles && (m->is_method_handle_invoke() ||
  2106   if (EnableInvokeDynamic && (m->is_method_handle_invoke() ||
  2107                               m->is_method_handle_adapter())) {
  2107                               m->is_method_handle_adapter())) {
  2108     THROW_MSG_(vmSymbols::java_lang_VirtualMachineError(),
  2108     THROW_MSG_(vmSymbols::java_lang_VirtualMachineError(),
  2109                "Method handle invokers must be defined internally to the VM", nullHandle);
  2109                "Method handle invokers must be defined internally to the VM", nullHandle);
  2110   }
  2110   }
  2111 
  2111 
  2769   // Add fake fields for java.lang.invoke.MethodHandle instances
  2769   // Add fake fields for java.lang.invoke.MethodHandle instances
  2770   //
  2770   //
  2771   // This is not particularly nice, but since there is no way to express
  2771   // This is not particularly nice, but since there is no way to express
  2772   // a native wordSize field in Java, we must do it at this level.
  2772   // a native wordSize field in Java, we must do it at this level.
  2773 
  2773 
  2774   if (!EnableMethodHandles)  return;
  2774   if (!EnableInvokeDynamic)  return;
  2775 
  2775 
  2776   int word_sig_index = 0;
  2776   int word_sig_index = 0;
  2777   const int cp_size = cp->length();
  2777   const int cp_size = cp->length();
  2778   for (int index = 1; index < cp_size; index++) {
  2778   for (int index = 1; index < cp_size; index++) {
  2779     if (cp->tag_at(index).is_utf8() &&
  2779     if (cp->tag_at(index).is_utf8() &&
  3189     first_nonstatic_field_offset = instanceOopDesc::base_offset_in_bytes() +
  3189     first_nonstatic_field_offset = instanceOopDesc::base_offset_in_bytes() +
  3190                                    nonstatic_field_size * heapOopSize;
  3190                                    nonstatic_field_size * heapOopSize;
  3191     next_nonstatic_field_offset = first_nonstatic_field_offset;
  3191     next_nonstatic_field_offset = first_nonstatic_field_offset;
  3192 
  3192 
  3193     // adjust the vmentry field declaration in java.lang.invoke.MethodHandle
  3193     // adjust the vmentry field declaration in java.lang.invoke.MethodHandle
  3194     if (EnableMethodHandles && class_name == vmSymbols::java_lang_invoke_MethodHandle() && class_loader.is_null()) {
  3194     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));
  3195       java_lang_invoke_MethodHandle_fix_pre(cp, fields, &fac, CHECK_(nullHandle));
  3196     }
  3196     }
  3197     if (AllowTransitionalJSR292 &&
  3197     if (AllowTransitionalJSR292 &&
  3198         EnableMethodHandles && class_name == vmSymbols::java_dyn_MethodHandle() && class_loader.is_null()) {
  3198         EnableInvokeDynamic && class_name == vmSymbols::java_dyn_MethodHandle() && class_loader.is_null()) {
  3199       java_lang_invoke_MethodHandle_fix_pre(cp, fields, &fac, CHECK_(nullHandle));
  3199       java_lang_invoke_MethodHandle_fix_pre(cp, fields, &fac, CHECK_(nullHandle));
  3200     }
  3200     }
  3201     if (AllowTransitionalJSR292 &&
  3201     if (AllowTransitionalJSR292 &&
  3202         EnableMethodHandles && class_name == vmSymbols::sun_dyn_MethodHandleImpl() && class_loader.is_null()) {
  3202         EnableInvokeDynamic && class_name == vmSymbols::sun_dyn_MethodHandleImpl() && class_loader.is_null()) {
  3203       // allow vmentry field in MethodHandleImpl also
  3203       // allow vmentry field in MethodHandleImpl also
  3204       java_lang_invoke_MethodHandle_fix_pre(cp, fields, &fac, CHECK_(nullHandle));
  3204       java_lang_invoke_MethodHandle_fix_pre(cp, fields, &fac, CHECK_(nullHandle));
  3205     }
  3205     }
  3206 
  3206 
  3207     // Add a fake "discovered" field if it is not present
  3207     // Add a fake "discovered" field if it is not present