src/hotspot/share/classfile/classFileParser.hpp
changeset 47216 71c04702a3d5
parent 46513 c61eea516a0a
child 49364 601146c66cad
equal deleted inserted replaced
47215:4ebc2e2fb97c 47216:71c04702a3d5
       
     1 /*
       
     2  * Copyright (c) 1997, 2017, Oracle and/or its affiliates. All rights reserved.
       
     3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
       
     4  *
       
     5  * This code is free software; you can redistribute it and/or modify it
       
     6  * under the terms of the GNU General Public License version 2 only, as
       
     7  * published by the Free Software Foundation.
       
     8  *
       
     9  * This code is distributed in the hope that it will be useful, but WITHOUT
       
    10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
       
    11  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
       
    12  * version 2 for more details (a copy is included in the LICENSE file that
       
    13  * accompanied this code).
       
    14  *
       
    15  * You should have received a copy of the GNU General Public License version
       
    16  * 2 along with this work; if not, write to the Free Software Foundation,
       
    17  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
       
    18  *
       
    19  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
       
    20  * or visit www.oracle.com if you need additional information or have any
       
    21  * questions.
       
    22  *
       
    23  */
       
    24 
       
    25 #ifndef SHARE_VM_CLASSFILE_CLASSFILEPARSER_HPP
       
    26 #define SHARE_VM_CLASSFILE_CLASSFILEPARSER_HPP
       
    27 
       
    28 #include "memory/referenceType.hpp"
       
    29 #include "runtime/handles.inline.hpp"
       
    30 #include "oops/constantPool.hpp"
       
    31 #include "oops/typeArrayOop.hpp"
       
    32 #include "utilities/accessFlags.hpp"
       
    33 
       
    34 class Annotations;
       
    35 template <typename T>
       
    36 class Array;
       
    37 class ClassFileStream;
       
    38 class ClassLoaderData;
       
    39 class CompressedLineNumberWriteStream;
       
    40 class ConstMethod;
       
    41 class FieldInfo;
       
    42 template <typename T>
       
    43 class GrowableArray;
       
    44 class InstanceKlass;
       
    45 class Symbol;
       
    46 class TempNewSymbol;
       
    47 
       
    48 // Parser for for .class files
       
    49 //
       
    50 // The bytes describing the class file structure is read from a Stream object
       
    51 
       
    52 class ClassFileParser VALUE_OBJ_CLASS_SPEC {
       
    53 
       
    54  class ClassAnnotationCollector;
       
    55  class FieldAllocationCount;
       
    56  class FieldAnnotationCollector;
       
    57  class FieldLayoutInfo;
       
    58 
       
    59  public:
       
    60   // The ClassFileParser has an associated "publicity" level
       
    61   // It is used to control which subsystems (if any)
       
    62   // will observe the parsing (logging, events, tracing).
       
    63   // Default level is "BROADCAST", which is equivalent to
       
    64   // a "public" parsing attempt.
       
    65   //
       
    66   // "INTERNAL" level should be entirely private to the
       
    67   // caller - this allows for internal reuse of ClassFileParser
       
    68   //
       
    69   enum Publicity {
       
    70     INTERNAL,
       
    71     BROADCAST,
       
    72     NOF_PUBLICITY_LEVELS
       
    73   };
       
    74 
       
    75   enum { LegalClass, LegalField, LegalMethod }; // used to verify unqualified names
       
    76 
       
    77  private:
       
    78   // Potentially unaligned pointer to various 16-bit entries in the class file
       
    79   typedef void unsafe_u2;
       
    80 
       
    81   const ClassFileStream* _stream; // Actual input stream
       
    82   const Symbol* _requested_name;
       
    83   Symbol* _class_name;
       
    84   mutable ClassLoaderData* _loader_data;
       
    85   const InstanceKlass* _host_klass;
       
    86   GrowableArray<Handle>* _cp_patches; // overrides for CP entries
       
    87   int _num_patched_klasses;
       
    88   int _max_num_patched_klasses;
       
    89   int _orig_cp_size;
       
    90   int _first_patched_klass_resolved_index;
       
    91 
       
    92   // Metadata created before the instance klass is created.  Must be deallocated
       
    93   // if not transferred to the InstanceKlass upon successful class loading
       
    94   // in which case these pointers have been set to NULL.
       
    95   const InstanceKlass* _super_klass;
       
    96   ConstantPool* _cp;
       
    97   Array<u2>* _fields;
       
    98   Array<Method*>* _methods;
       
    99   Array<u2>* _inner_classes;
       
   100   Array<Klass*>* _local_interfaces;
       
   101   Array<Klass*>* _transitive_interfaces;
       
   102   Annotations* _combined_annotations;
       
   103   AnnotationArray* _annotations;
       
   104   AnnotationArray* _type_annotations;
       
   105   Array<AnnotationArray*>* _fields_annotations;
       
   106   Array<AnnotationArray*>* _fields_type_annotations;
       
   107   InstanceKlass* _klass;  // InstanceKlass* once created.
       
   108   InstanceKlass* _klass_to_deallocate; // an InstanceKlass* to be destroyed
       
   109 
       
   110   ClassAnnotationCollector* _parsed_annotations;
       
   111   FieldAllocationCount* _fac;
       
   112   FieldLayoutInfo* _field_info;
       
   113   const intArray* _method_ordering;
       
   114   GrowableArray<Method*>* _all_mirandas;
       
   115 
       
   116   enum { fixed_buffer_size = 128 };
       
   117   u_char _linenumbertable_buffer[fixed_buffer_size];
       
   118 
       
   119   // Size of Java vtable (in words)
       
   120   int _vtable_size;
       
   121   int _itable_size;
       
   122 
       
   123   int _num_miranda_methods;
       
   124 
       
   125   ReferenceType _rt;
       
   126   Handle _protection_domain;
       
   127   AccessFlags _access_flags;
       
   128 
       
   129   // for tracing and notifications
       
   130   Publicity _pub_level;
       
   131 
       
   132   // Used to keep track of whether a constant pool item 19 or 20 is found.  These
       
   133   // correspond to CONSTANT_Module and CONSTANT_Package tags and are not allowed
       
   134   // in regular class files.  For class file version >= 53, a CFE cannot be thrown
       
   135   // immediately when these are seen because a NCDFE must be thrown if the class's
       
   136   // access_flags have ACC_MODULE set.  But, the access_flags haven't been looked
       
   137   // at yet.  So, the bad constant pool item is cached here.  A value of zero
       
   138   // means that no constant pool item 19 or 20 was found.
       
   139   short _bad_constant_seen;
       
   140 
       
   141   // class attributes parsed before the instance klass is created:
       
   142   bool _synthetic_flag;
       
   143   int _sde_length;
       
   144   const char* _sde_buffer;
       
   145   u2 _sourcefile_index;
       
   146   u2 _generic_signature_index;
       
   147 
       
   148   u2 _major_version;
       
   149   u2 _minor_version;
       
   150   u2 _this_class_index;
       
   151   u2 _super_class_index;
       
   152   u2 _itfs_len;
       
   153   u2 _java_fields_count;
       
   154 
       
   155   bool _need_verify;
       
   156   bool _relax_verify;
       
   157 
       
   158   bool _has_nonstatic_concrete_methods;
       
   159   bool _declares_nonstatic_concrete_methods;
       
   160   bool _has_final_method;
       
   161 
       
   162   // precomputed flags
       
   163   bool _has_finalizer;
       
   164   bool _has_empty_finalizer;
       
   165   bool _has_vanilla_constructor;
       
   166   int _max_bootstrap_specifier_index;  // detects BSS values
       
   167 
       
   168   void parse_stream(const ClassFileStream* const stream, TRAPS);
       
   169 
       
   170   void post_process_parsed_stream(const ClassFileStream* const stream,
       
   171                                   ConstantPool* cp,
       
   172                                   TRAPS);
       
   173 
       
   174   void prepend_host_package_name(const InstanceKlass* host_klass, TRAPS);
       
   175   void fix_anonymous_class_name(TRAPS);
       
   176 
       
   177   void fill_instance_klass(InstanceKlass* ik, bool cf_changed_in_CFLH, TRAPS);
       
   178   void set_klass(InstanceKlass* instance);
       
   179 
       
   180   void set_class_bad_constant_seen(short bad_constant);
       
   181   short class_bad_constant_seen() { return  _bad_constant_seen; }
       
   182   void set_class_synthetic_flag(bool x)        { _synthetic_flag = x; }
       
   183   void set_class_sourcefile_index(u2 x)        { _sourcefile_index = x; }
       
   184   void set_class_generic_signature_index(u2 x) { _generic_signature_index = x; }
       
   185   void set_class_sde_buffer(const char* x, int len)  { _sde_buffer = x; _sde_length = len; }
       
   186 
       
   187   void create_combined_annotations(TRAPS);
       
   188   void apply_parsed_class_attributes(InstanceKlass* k);  // update k
       
   189   void apply_parsed_class_metadata(InstanceKlass* k, int fields_count, TRAPS);
       
   190   void clear_class_metadata();
       
   191 
       
   192   // Constant pool parsing
       
   193   void parse_constant_pool_entries(const ClassFileStream* const stream,
       
   194                                    ConstantPool* cp,
       
   195                                    const int length,
       
   196                                    TRAPS);
       
   197 
       
   198   void parse_constant_pool(const ClassFileStream* const cfs,
       
   199                            ConstantPool* const cp,
       
   200                            const int length,
       
   201                            TRAPS);
       
   202 
       
   203   // Interface parsing
       
   204   void parse_interfaces(const ClassFileStream* const stream,
       
   205                         const int itfs_len,
       
   206                         ConstantPool* const cp,
       
   207                         bool* has_nonstatic_concrete_methods,
       
   208                         TRAPS);
       
   209 
       
   210   const InstanceKlass* parse_super_class(ConstantPool* const cp,
       
   211                                          const int super_class_index,
       
   212                                          const bool need_verify,
       
   213                                          TRAPS);
       
   214 
       
   215   // Field parsing
       
   216   void parse_field_attributes(const ClassFileStream* const cfs,
       
   217                               u2 attributes_count,
       
   218                               bool is_static,
       
   219                               u2 signature_index,
       
   220                               u2* const constantvalue_index_addr,
       
   221                               bool* const is_synthetic_addr,
       
   222                               u2* const generic_signature_index_addr,
       
   223                               FieldAnnotationCollector* parsed_annotations,
       
   224                               TRAPS);
       
   225 
       
   226   void parse_fields(const ClassFileStream* const cfs,
       
   227                     bool is_interface,
       
   228                     FieldAllocationCount* const fac,
       
   229                     ConstantPool* cp,
       
   230                     const int cp_size,
       
   231                     u2* const java_fields_count_ptr,
       
   232                     TRAPS);
       
   233 
       
   234   // Method parsing
       
   235   Method* parse_method(const ClassFileStream* const cfs,
       
   236                        bool is_interface,
       
   237                        const ConstantPool* cp,
       
   238                        AccessFlags* const promoted_flags,
       
   239                        TRAPS);
       
   240 
       
   241   void parse_methods(const ClassFileStream* const cfs,
       
   242                      bool is_interface,
       
   243                      AccessFlags* const promoted_flags,
       
   244                      bool* const has_final_method,
       
   245                      bool* const declares_nonstatic_concrete_methods,
       
   246                      TRAPS);
       
   247 
       
   248   const unsafe_u2* parse_exception_table(const ClassFileStream* const stream,
       
   249                                          u4 code_length,
       
   250                                          u4 exception_table_length,
       
   251                                          TRAPS);
       
   252 
       
   253   void parse_linenumber_table(u4 code_attribute_length,
       
   254                               u4 code_length,
       
   255                               CompressedLineNumberWriteStream**const write_stream,
       
   256                               TRAPS);
       
   257 
       
   258   const unsafe_u2* parse_localvariable_table(const ClassFileStream* const cfs,
       
   259                                              u4 code_length,
       
   260                                              u2 max_locals,
       
   261                                              u4 code_attribute_length,
       
   262                                              u2* const localvariable_table_length,
       
   263                                              bool isLVTT,
       
   264                                              TRAPS);
       
   265 
       
   266   const unsafe_u2* parse_checked_exceptions(const ClassFileStream* const cfs,
       
   267                                             u2* const checked_exceptions_length,
       
   268                                             u4 method_attribute_length,
       
   269                                             TRAPS);
       
   270 
       
   271   void parse_type_array(u2 array_length,
       
   272                         u4 code_length,
       
   273                         u4* const u1_index,
       
   274                         u4* const u2_index,
       
   275                         u1* const u1_array,
       
   276                         u2* const u2_array,
       
   277                         TRAPS);
       
   278 
       
   279   // Classfile attribute parsing
       
   280   u2 parse_generic_signature_attribute(const ClassFileStream* const cfs, TRAPS);
       
   281   void parse_classfile_sourcefile_attribute(const ClassFileStream* const cfs, TRAPS);
       
   282   void parse_classfile_source_debug_extension_attribute(const ClassFileStream* const cfs,
       
   283                                                         int length,
       
   284                                                         TRAPS);
       
   285 
       
   286   u2   parse_classfile_inner_classes_attribute(const ClassFileStream* const cfs,
       
   287                                                const u1* const inner_classes_attribute_start,
       
   288                                                bool parsed_enclosingmethod_attribute,
       
   289                                                u2 enclosing_method_class_index,
       
   290                                                u2 enclosing_method_method_index,
       
   291                                                TRAPS);
       
   292 
       
   293   void parse_classfile_attributes(const ClassFileStream* const cfs,
       
   294                                   ConstantPool* cp,
       
   295                                   ClassAnnotationCollector* parsed_annotations,
       
   296                                   TRAPS);
       
   297 
       
   298   void parse_classfile_synthetic_attribute(TRAPS);
       
   299   void parse_classfile_signature_attribute(const ClassFileStream* const cfs, TRAPS);
       
   300   void parse_classfile_bootstrap_methods_attribute(const ClassFileStream* const cfs,
       
   301                                                    ConstantPool* cp,
       
   302                                                    u4 attribute_length,
       
   303                                                    TRAPS);
       
   304 
       
   305   // Annotations handling
       
   306   AnnotationArray* assemble_annotations(const u1* const runtime_visible_annotations,
       
   307                                         int runtime_visible_annotations_length,
       
   308                                         const u1* const runtime_invisible_annotations,
       
   309                                         int runtime_invisible_annotations_length,
       
   310                                         TRAPS);
       
   311 
       
   312   void set_precomputed_flags(InstanceKlass* k);
       
   313 
       
   314   // Format checker methods
       
   315   void classfile_parse_error(const char* msg, TRAPS) const;
       
   316   void classfile_parse_error(const char* msg, int index, TRAPS) const;
       
   317   void classfile_parse_error(const char* msg, const char *name, TRAPS) const;
       
   318   void classfile_parse_error(const char* msg,
       
   319                              int index,
       
   320                              const char *name,
       
   321                              TRAPS) const;
       
   322   void classfile_parse_error(const char* msg,
       
   323                              const char* name,
       
   324                              const char* signature,
       
   325                              TRAPS) const;
       
   326 
       
   327   inline void guarantee_property(bool b, const char* msg, TRAPS) const {
       
   328     if (!b) { classfile_parse_error(msg, CHECK); }
       
   329   }
       
   330 
       
   331   void report_assert_property_failure(const char* msg, TRAPS) const PRODUCT_RETURN;
       
   332   void report_assert_property_failure(const char* msg, int index, TRAPS) const PRODUCT_RETURN;
       
   333 
       
   334   inline void assert_property(bool b, const char* msg, TRAPS) const {
       
   335 #ifdef ASSERT
       
   336     if (!b) {
       
   337       report_assert_property_failure(msg, THREAD);
       
   338     }
       
   339 #endif
       
   340   }
       
   341 
       
   342   inline void assert_property(bool b, const char* msg, int index, TRAPS) const {
       
   343 #ifdef ASSERT
       
   344     if (!b) {
       
   345       report_assert_property_failure(msg, index, THREAD);
       
   346     }
       
   347 #endif
       
   348   }
       
   349 
       
   350   inline void check_property(bool property,
       
   351                              const char* msg,
       
   352                              int index,
       
   353                              TRAPS) const {
       
   354     if (_need_verify) {
       
   355       guarantee_property(property, msg, index, CHECK);
       
   356     } else {
       
   357       assert_property(property, msg, index, CHECK);
       
   358     }
       
   359   }
       
   360 
       
   361   inline void check_property(bool property, const char* msg, TRAPS) const {
       
   362     if (_need_verify) {
       
   363       guarantee_property(property, msg, CHECK);
       
   364     } else {
       
   365       assert_property(property, msg, CHECK);
       
   366     }
       
   367   }
       
   368 
       
   369   inline void guarantee_property(bool b,
       
   370                                  const char* msg,
       
   371                                  int index,
       
   372                                  TRAPS) const {
       
   373     if (!b) { classfile_parse_error(msg, index, CHECK); }
       
   374   }
       
   375 
       
   376   inline void guarantee_property(bool b,
       
   377                                  const char* msg,
       
   378                                  const char *name,
       
   379                                  TRAPS) const {
       
   380     if (!b) { classfile_parse_error(msg, name, CHECK); }
       
   381   }
       
   382 
       
   383   inline void guarantee_property(bool b,
       
   384                                  const char* msg,
       
   385                                  int index,
       
   386                                  const char *name,
       
   387                                  TRAPS) const {
       
   388     if (!b) { classfile_parse_error(msg, index, name, CHECK); }
       
   389   }
       
   390 
       
   391   void throwIllegalSignature(const char* type,
       
   392                              const Symbol* name,
       
   393                              const Symbol* sig,
       
   394                              TRAPS) const;
       
   395 
       
   396   void verify_constantvalue(const ConstantPool* const cp,
       
   397                             int constantvalue_index,
       
   398                             int signature_index,
       
   399                             TRAPS) const;
       
   400 
       
   401   void verify_legal_utf8(const unsigned char* buffer, int length, TRAPS) const;
       
   402   void verify_legal_class_name(const Symbol* name, TRAPS) const;
       
   403   void verify_legal_field_name(const Symbol* name, TRAPS) const;
       
   404   void verify_legal_method_name(const Symbol* name, TRAPS) const;
       
   405 
       
   406   void verify_legal_field_signature(const Symbol* fieldname,
       
   407                                     const Symbol* signature,
       
   408                                     TRAPS) const;
       
   409   int  verify_legal_method_signature(const Symbol* methodname,
       
   410                                      const Symbol* signature,
       
   411                                      TRAPS) const;
       
   412 
       
   413   void verify_legal_class_modifiers(jint flags, TRAPS) const;
       
   414   void verify_legal_field_modifiers(jint flags, bool is_interface, TRAPS) const;
       
   415   void verify_legal_method_modifiers(jint flags,
       
   416                                      bool is_interface,
       
   417                                      const Symbol* name,
       
   418                                      TRAPS) const;
       
   419 
       
   420   const char* skip_over_field_signature(const char* signature,
       
   421                                         bool void_ok,
       
   422                                         unsigned int length,
       
   423                                         TRAPS) const;
       
   424 
       
   425   bool has_cp_patch_at(int index) const {
       
   426     assert(index >= 0, "oob");
       
   427     return (_cp_patches != NULL
       
   428             && index < _cp_patches->length()
       
   429             && _cp_patches->adr_at(index)->not_null());
       
   430   }
       
   431 
       
   432   Handle cp_patch_at(int index) const {
       
   433     assert(has_cp_patch_at(index), "oob");
       
   434     return _cp_patches->at(index);
       
   435   }
       
   436 
       
   437   Handle clear_cp_patch_at(int index) {
       
   438     Handle patch = cp_patch_at(index);
       
   439     _cp_patches->at_put(index, Handle());
       
   440     assert(!has_cp_patch_at(index), "");
       
   441     return patch;
       
   442   }
       
   443 
       
   444   void patch_class(ConstantPool* cp, int class_index, Klass* k, Symbol* name);
       
   445   void patch_constant_pool(ConstantPool* cp,
       
   446                            int index,
       
   447                            Handle patch,
       
   448                            TRAPS);
       
   449 
       
   450   // Wrapper for constantTag.is_klass_[or_]reference.
       
   451   // In older versions of the VM, Klass*s cannot sneak into early phases of
       
   452   // constant pool construction, but in later versions they can.
       
   453   // %%% Let's phase out the old is_klass_reference.
       
   454   bool valid_klass_reference_at(int index) const {
       
   455     return _cp->is_within_bounds(index) &&
       
   456              _cp->tag_at(index).is_klass_or_reference();
       
   457   }
       
   458 
       
   459   // Checks that the cpool index is in range and is a utf8
       
   460   bool valid_symbol_at(int cpool_index) const {
       
   461     return _cp->is_within_bounds(cpool_index) &&
       
   462              _cp->tag_at(cpool_index).is_utf8();
       
   463   }
       
   464 
       
   465   void copy_localvariable_table(const ConstMethod* cm,
       
   466                                 int lvt_cnt,
       
   467                                 u2* const localvariable_table_length,
       
   468                                 const unsafe_u2** const localvariable_table_start,
       
   469                                 int lvtt_cnt,
       
   470                                 u2* const localvariable_type_table_length,
       
   471                                 const unsafe_u2** const localvariable_type_table_start,
       
   472                                 TRAPS);
       
   473 
       
   474   void copy_method_annotations(ConstMethod* cm,
       
   475                                const u1* runtime_visible_annotations,
       
   476                                int runtime_visible_annotations_length,
       
   477                                const u1* runtime_invisible_annotations,
       
   478                                int runtime_invisible_annotations_length,
       
   479                                const u1* runtime_visible_parameter_annotations,
       
   480                                int runtime_visible_parameter_annotations_length,
       
   481                                const u1* runtime_invisible_parameter_annotations,
       
   482                                int runtime_invisible_parameter_annotations_length,
       
   483                                const u1* runtime_visible_type_annotations,
       
   484                                int runtime_visible_type_annotations_length,
       
   485                                const u1* runtime_invisible_type_annotations,
       
   486                                int runtime_invisible_type_annotations_length,
       
   487                                const u1* annotation_default,
       
   488                                int annotation_default_length,
       
   489                                TRAPS);
       
   490 
       
   491   // lays out fields in class and returns the total oopmap count
       
   492   void layout_fields(ConstantPool* cp,
       
   493                      const FieldAllocationCount* fac,
       
   494                      const ClassAnnotationCollector* parsed_annotations,
       
   495                      FieldLayoutInfo* info,
       
   496                      TRAPS);
       
   497 
       
   498  public:
       
   499   ClassFileParser(ClassFileStream* stream,
       
   500                   Symbol* name,
       
   501                   ClassLoaderData* loader_data,
       
   502                   Handle protection_domain,
       
   503                   const InstanceKlass* host_klass,
       
   504                   GrowableArray<Handle>* cp_patches,
       
   505                   Publicity pub_level,
       
   506                   TRAPS);
       
   507 
       
   508   ~ClassFileParser();
       
   509 
       
   510   InstanceKlass* create_instance_klass(bool cf_changed_in_CFLH, TRAPS);
       
   511 
       
   512   const ClassFileStream* clone_stream() const;
       
   513 
       
   514   void set_klass_to_deallocate(InstanceKlass* klass);
       
   515 
       
   516   int static_field_size() const;
       
   517   int total_oop_map_count() const;
       
   518   jint layout_size() const;
       
   519 
       
   520   int vtable_size() const { return _vtable_size; }
       
   521   int itable_size() const { return _itable_size; }
       
   522 
       
   523   u2 this_class_index() const { return _this_class_index; }
       
   524   u2 super_class_index() const { return _super_class_index; }
       
   525 
       
   526   bool is_anonymous() const { return _host_klass != NULL; }
       
   527   bool is_interface() const { return _access_flags.is_interface(); }
       
   528 
       
   529   const InstanceKlass* host_klass() const { return _host_klass; }
       
   530   const GrowableArray<Handle>* cp_patches() const { return _cp_patches; }
       
   531   ClassLoaderData* loader_data() const { return _loader_data; }
       
   532   const Symbol* class_name() const { return _class_name; }
       
   533   const Klass* super_klass() const { return _super_klass; }
       
   534 
       
   535   ReferenceType reference_type() const { return _rt; }
       
   536   AccessFlags access_flags() const { return _access_flags; }
       
   537 
       
   538   bool is_internal() const { return INTERNAL == _pub_level; }
       
   539 
       
   540   static bool verify_unqualified_name(const char* name, unsigned int length, int type);
       
   541 
       
   542 #ifdef ASSERT
       
   543   static bool is_internal_format(Symbol* class_name);
       
   544 #endif
       
   545 
       
   546 };
       
   547 
       
   548 #endif // SHARE_VM_CLASSFILE_CLASSFILEPARSER_HPP