hotspot/src/share/vm/classfile/classFileParser.cpp
changeset 5882 6b2aecc4f7d8
parent 5547 f4b087cbb361
child 5888 8eac4eb75d6e
equal deleted inserted replaced
5708:e92b3d8118f1 5882:6b2aecc4f7d8
   109       case JVM_CONSTANT_String :
   109       case JVM_CONSTANT_String :
   110         {
   110         {
   111           cfs->guarantee_more(3, CHECK);  // string_index, tag/access_flags
   111           cfs->guarantee_more(3, CHECK);  // string_index, tag/access_flags
   112           u2 string_index = cfs->get_u2_fast();
   112           u2 string_index = cfs->get_u2_fast();
   113           cp->string_index_at_put(index, string_index);
   113           cp->string_index_at_put(index, string_index);
       
   114         }
       
   115         break;
       
   116       case JVM_CONSTANT_MethodHandle :
       
   117       case JVM_CONSTANT_MethodType :
       
   118         if (!EnableMethodHandles ||
       
   119             _major_version < Verifier::INVOKEDYNAMIC_MAJOR_VERSION) {
       
   120           classfile_parse_error(
       
   121             (!EnableInvokeDynamic ?
       
   122              "This JVM does not support constant tag %u in class file %s" :
       
   123              "Class file version does not support constant tag %u in class file %s"),
       
   124             tag, CHECK);
       
   125         }
       
   126         if (tag == JVM_CONSTANT_MethodHandle) {
       
   127           cfs->guarantee_more(4, CHECK);  // ref_kind, method_index, tag/access_flags
       
   128           u1 ref_kind = cfs->get_u1_fast();
       
   129           u2 method_index = cfs->get_u2_fast();
       
   130           cp->method_handle_index_at_put(index, ref_kind, method_index);
       
   131         } else if (tag == JVM_CONSTANT_MethodType) {
       
   132           cfs->guarantee_more(3, CHECK);  // signature_index, tag/access_flags
       
   133           u2 signature_index = cfs->get_u2_fast();
       
   134           cp->method_type_index_at_put(index, signature_index);
       
   135         } else {
       
   136           ShouldNotReachHere();
   114         }
   137         }
   115         break;
   138         break;
   116       case JVM_CONSTANT_Integer :
   139       case JVM_CONSTANT_Integer :
   117         {
   140         {
   118           cfs->guarantee_more(5, CHECK);  // bytes, tag/access_flags
   141           cfs->guarantee_more(5, CHECK);  // bytes, tag/access_flags
   331             string_index, CHECK_(nullHandle));
   354             string_index, CHECK_(nullHandle));
   332           symbolOop sym = cp->symbol_at(string_index);
   355           symbolOop sym = cp->symbol_at(string_index);
   333           cp->unresolved_string_at_put(index, sym);
   356           cp->unresolved_string_at_put(index, sym);
   334         }
   357         }
   335         break;
   358         break;
       
   359       case JVM_CONSTANT_MethodHandle :
       
   360         {
       
   361           int ref_index = cp->method_handle_index_at(index);
       
   362           check_property(
       
   363             valid_cp_range(ref_index, length) &&
       
   364                 EnableMethodHandles,
       
   365               "Invalid constant pool index %u in class file %s",
       
   366               ref_index, CHECK_(nullHandle));
       
   367           constantTag tag = cp->tag_at(ref_index);
       
   368           int ref_kind  = cp->method_handle_ref_kind_at(index);
       
   369           switch (ref_kind) {
       
   370           case JVM_REF_getField:
       
   371           case JVM_REF_getStatic:
       
   372           case JVM_REF_putField:
       
   373           case JVM_REF_putStatic:
       
   374             check_property(
       
   375               tag.is_field(),
       
   376               "Invalid constant pool index %u in class file %s (not a field)",
       
   377               ref_index, CHECK_(nullHandle));
       
   378             break;
       
   379           case JVM_REF_invokeVirtual:
       
   380           case JVM_REF_invokeStatic:
       
   381           case JVM_REF_invokeSpecial:
       
   382           case JVM_REF_newInvokeSpecial:
       
   383             check_property(
       
   384               tag.is_method(),
       
   385               "Invalid constant pool index %u in class file %s (not a method)",
       
   386               ref_index, CHECK_(nullHandle));
       
   387             break;
       
   388           case JVM_REF_invokeInterface:
       
   389             check_property(
       
   390               tag.is_interface_method(),
       
   391               "Invalid constant pool index %u in class file %s (not an interface method)",
       
   392               ref_index, CHECK_(nullHandle));
       
   393             break;
       
   394           default:
       
   395             classfile_parse_error(
       
   396               "Bad method handle kind at constant pool index %u in class file %s",
       
   397               index, CHECK_(nullHandle));
       
   398           }
       
   399           // Keep the ref_index unchanged.  It will be indirected at link-time.
       
   400         }
       
   401         break;
       
   402       case JVM_CONSTANT_MethodType :
       
   403         {
       
   404           int ref_index = cp->method_type_index_at(index);
       
   405           check_property(
       
   406             valid_cp_range(ref_index, length) &&
       
   407                 cp->tag_at(ref_index).is_utf8() &&
       
   408                 EnableMethodHandles,
       
   409               "Invalid constant pool index %u in class file %s",
       
   410               ref_index, CHECK_(nullHandle));
       
   411         }
       
   412         break;
   336       default:
   413       default:
   337         fatal(err_msg("bad constant pool tag value %u",
   414         fatal(err_msg("bad constant pool tag value %u",
   338                       cp->tag_at(index).value()));
   415                       cp->tag_at(index).value()));
   339         ShouldNotReachHere();
   416         ShouldNotReachHere();
   340         break;
   417         break;
   414             }
   491             }
   415           }
   492           }
   416         }
   493         }
   417         break;
   494         break;
   418       }
   495       }
       
   496       case JVM_CONSTANT_MethodHandle: {
       
   497         int ref_index = cp->method_handle_index_at(index);
       
   498         int ref_kind  = cp->method_handle_ref_kind_at(index);
       
   499         switch (ref_kind) {
       
   500         case JVM_REF_invokeVirtual:
       
   501         case JVM_REF_invokeStatic:
       
   502         case JVM_REF_invokeSpecial:
       
   503         case JVM_REF_newInvokeSpecial:
       
   504           {
       
   505             int name_and_type_ref_index = cp->name_and_type_ref_index_at(ref_index);
       
   506             int name_ref_index = cp->name_ref_index_at(name_and_type_ref_index);
       
   507             symbolHandle name(THREAD, cp->symbol_at(name_ref_index));
       
   508             if (ref_kind == JVM_REF_newInvokeSpecial) {
       
   509               if (name() != vmSymbols::object_initializer_name()) {
       
   510                 classfile_parse_error(
       
   511                   "Bad constructor name at constant pool index %u in class file %s",
       
   512                   name_ref_index, CHECK_(nullHandle));
       
   513               }
       
   514             } else {
       
   515               if (name() == vmSymbols::object_initializer_name()) {
       
   516                 classfile_parse_error(
       
   517                   "Bad method name at constant pool index %u in class file %s",
       
   518                   name_ref_index, CHECK_(nullHandle));
       
   519               }
       
   520             }
       
   521           }
       
   522           break;
       
   523           // Other ref_kinds are already fully checked in previous pass.
       
   524         }
       
   525         break;
       
   526       }
       
   527       case JVM_CONSTANT_MethodType: {
       
   528         symbolHandle no_name = vmSymbolHandles::type_name(); // place holder
       
   529         symbolHandle signature(THREAD, cp->method_type_signature_at(index));
       
   530         verify_legal_method_signature(no_name, signature, CHECK_(nullHandle));
       
   531         break;
       
   532       }
   419     }  // end of switch
   533     }  // end of switch
   420   }  // end of for
   534   }  // end of for
   421 
   535 
   422   return cp;
   536   return cp;
   423 }
   537 }
   429   switch (cp->tag_at(index).value()) {
   543   switch (cp->tag_at(index).value()) {
   430 
   544 
   431   case JVM_CONSTANT_UnresolvedClass :
   545   case JVM_CONSTANT_UnresolvedClass :
   432     // Patching a class means pre-resolving it.
   546     // Patching a class means pre-resolving it.
   433     // The name in the constant pool is ignored.
   547     // The name in the constant pool is ignored.
   434     if (patch->klass() == SystemDictionary::Class_klass()) { // %%% java_lang_Class::is_instance
   548     if (java_lang_Class::is_instance(patch())) {
   435       guarantee_property(!java_lang_Class::is_primitive(patch()),
   549       guarantee_property(!java_lang_Class::is_primitive(patch()),
   436                          "Illegal class patch at %d in class file %s",
   550                          "Illegal class patch at %d in class file %s",
   437                          index, CHECK);
   551                          index, CHECK);
   438       cp->klass_at_put(index, java_lang_Class::as_klassOop(patch()));
   552       cp->klass_at_put(index, java_lang_Class::as_klassOop(patch()));
   439     } else {
   553     } else {