hotspot/src/share/vm/classfile/classFileParser.cpp
changeset 8725 8c1e3dd5fe1b
parent 8676 9098d4e927e1
child 8883 5569135acca3
equal deleted inserted replaced
8724:693c6b883b54 8725:8c1e3dd5fe1b
    35 #include "memory/gcLocker.hpp"
    35 #include "memory/gcLocker.hpp"
    36 #include "memory/oopFactory.hpp"
    36 #include "memory/oopFactory.hpp"
    37 #include "memory/universe.inline.hpp"
    37 #include "memory/universe.inline.hpp"
    38 #include "oops/constantPoolOop.hpp"
    38 #include "oops/constantPoolOop.hpp"
    39 #include "oops/instanceKlass.hpp"
    39 #include "oops/instanceKlass.hpp"
       
    40 #include "oops/instanceMirrorKlass.hpp"
    40 #include "oops/klass.inline.hpp"
    41 #include "oops/klass.inline.hpp"
    41 #include "oops/klassOop.hpp"
    42 #include "oops/klassOop.hpp"
    42 #include "oops/klassVtable.hpp"
    43 #include "oops/klassVtable.hpp"
    43 #include "oops/methodOop.hpp"
    44 #include "oops/methodOop.hpp"
    44 #include "oops/symbol.hpp"
    45 #include "oops/symbol.hpp"
  2604   }
  2605   }
  2605   return annotations;
  2606   return annotations;
  2606 }
  2607 }
  2607 
  2608 
  2608 
  2609 
  2609 static void initialize_static_field(fieldDescriptor* fd, TRAPS) {
       
  2610   KlassHandle h_k (THREAD, fd->field_holder());
       
  2611   assert(h_k.not_null() && fd->is_static(), "just checking");
       
  2612   if (fd->has_initial_value()) {
       
  2613     BasicType t = fd->field_type();
       
  2614     switch (t) {
       
  2615       case T_BYTE:
       
  2616         h_k()->byte_field_put(fd->offset(), fd->int_initial_value());
       
  2617               break;
       
  2618       case T_BOOLEAN:
       
  2619         h_k()->bool_field_put(fd->offset(), fd->int_initial_value());
       
  2620               break;
       
  2621       case T_CHAR:
       
  2622         h_k()->char_field_put(fd->offset(), fd->int_initial_value());
       
  2623               break;
       
  2624       case T_SHORT:
       
  2625         h_k()->short_field_put(fd->offset(), fd->int_initial_value());
       
  2626               break;
       
  2627       case T_INT:
       
  2628         h_k()->int_field_put(fd->offset(), fd->int_initial_value());
       
  2629         break;
       
  2630       case T_FLOAT:
       
  2631         h_k()->float_field_put(fd->offset(), fd->float_initial_value());
       
  2632         break;
       
  2633       case T_DOUBLE:
       
  2634         h_k()->double_field_put(fd->offset(), fd->double_initial_value());
       
  2635         break;
       
  2636       case T_LONG:
       
  2637         h_k()->long_field_put(fd->offset(), fd->long_initial_value());
       
  2638         break;
       
  2639       case T_OBJECT:
       
  2640         {
       
  2641           #ifdef ASSERT
       
  2642           TempNewSymbol sym = SymbolTable::new_symbol("Ljava/lang/String;", CHECK);
       
  2643           assert(fd->signature() == sym, "just checking");
       
  2644           #endif
       
  2645           oop string = fd->string_initial_value(CHECK);
       
  2646           h_k()->obj_field_put(fd->offset(), string);
       
  2647         }
       
  2648         break;
       
  2649       default:
       
  2650         THROW_MSG(vmSymbols::java_lang_ClassFormatError(),
       
  2651                   "Illegal ConstantValue attribute in class file");
       
  2652     }
       
  2653   }
       
  2654 }
       
  2655 
       
  2656 
       
  2657 void ClassFileParser::java_lang_ref_Reference_fix_pre(typeArrayHandle* fields_ptr,
  2610 void ClassFileParser::java_lang_ref_Reference_fix_pre(typeArrayHandle* fields_ptr,
  2658   constantPoolHandle cp, FieldAllocationCount *fac_ptr, TRAPS) {
  2611   constantPoolHandle cp, FieldAllocationCount *fac_ptr, TRAPS) {
  2659   // This code is for compatibility with earlier jdk's that do not
  2612   // This code is for compatibility with earlier jdk's that do not
  2660   // have the "discovered" field in java.lang.ref.Reference.  For 1.5
  2613   // have the "discovered" field in java.lang.ref.Reference.  For 1.5
  2661   // the check for the "discovered" field should issue a warning if
  2614   // the check for the "discovered" field should issue a warning if
  2767   }
  2720   }
  2768   return;
  2721   return;
  2769 }
  2722 }
  2770 
  2723 
  2771 
  2724 
  2772 void ClassFileParser::java_lang_Class_fix_pre(objArrayHandle* methods_ptr,
  2725 void ClassFileParser::java_lang_Class_fix_pre(int* nonstatic_field_size,
  2773   FieldAllocationCount *fac_ptr, TRAPS) {
  2726                                               FieldAllocationCount *fac_ptr) {
  2774   // Add fake fields for java.lang.Class instances
  2727   // Add fake fields for java.lang.Class instances
  2775   //
  2728   //
  2776   // This is not particularly nice. We should consider adding a
  2729   // This is not particularly nice. We should consider adding a
  2777   // private transient object field at the Java level to
  2730   // private transient object field at the Java level to
  2778   // java.lang.Class. Alternatively we could add a subclass of
  2731   // java.lang.Class. Alternatively we could add a subclass of
  2785   // nonstatic oop fields were added at the Java level. The offsets
  2738   // nonstatic oop fields were added at the Java level. The offsets
  2786   // of these fake fields can't change between these two JDK
  2739   // of these fake fields can't change between these two JDK
  2787   // versions because when the offsets are computed at bootstrap
  2740   // versions because when the offsets are computed at bootstrap
  2788   // time we don't know yet which version of the JDK we're running in.
  2741   // time we don't know yet which version of the JDK we're running in.
  2789 
  2742 
  2790   // The values below are fake but will force two non-static oop fields and
  2743   // The values below are fake but will force three non-static oop fields and
  2791   // a corresponding non-static oop map block to be allocated.
  2744   // a corresponding non-static oop map block to be allocated.
  2792   const int extra = java_lang_Class::number_of_fake_oop_fields;
  2745   const int extra = java_lang_Class::number_of_fake_oop_fields;
  2793   fac_ptr->nonstatic_oop_count += extra;
  2746   fac_ptr->nonstatic_oop_count += extra;
       
  2747 
       
  2748   // Reserve some leading space for fake ints
       
  2749   *nonstatic_field_size += align_size_up(java_lang_Class::hc_number_of_fake_int_fields * BytesPerInt, heapOopSize) / heapOopSize;
  2794 }
  2750 }
  2795 
  2751 
  2796 
  2752 
  2797 void ClassFileParser::java_lang_Class_fix_post(int* next_nonstatic_oop_offset_ptr) {
  2753 void ClassFileParser::java_lang_Class_fix_post(int* next_nonstatic_oop_offset_ptr) {
  2798   // Cause the extra fake fields in java.lang.Class to show up before
  2754   // Cause the extra fake fields in java.lang.Class to show up before
  3203     int first_nonstatic_oop_offset;
  3159     int first_nonstatic_oop_offset;
  3204     int first_nonstatic_field_offset;
  3160     int first_nonstatic_field_offset;
  3205     int next_nonstatic_field_offset;
  3161     int next_nonstatic_field_offset;
  3206 
  3162 
  3207     // Calculate the starting byte offsets
  3163     // Calculate the starting byte offsets
  3208     next_static_oop_offset      = (instanceKlass::header_size() +
  3164     next_static_oop_offset      = instanceMirrorKlass::offset_of_static_fields();
  3209                                   align_object_offset(vtable_size) +
       
  3210                                   align_object_offset(itable_size)) * wordSize;
       
  3211     next_static_double_offset   = next_static_oop_offset +
  3165     next_static_double_offset   = next_static_oop_offset +
  3212                                   (fac.static_oop_count * heapOopSize);
  3166                                   (fac.static_oop_count * heapOopSize);
  3213     if ( fac.static_double_count &&
  3167     if ( fac.static_double_count &&
  3214          (Universe::field_type_should_be_aligned(T_DOUBLE) ||
  3168          (Universe::field_type_should_be_aligned(T_DOUBLE) ||
  3215           Universe::field_type_should_be_aligned(T_LONG)) ) {
  3169           Universe::field_type_should_be_aligned(T_LONG)) ) {
  3224                                   (fac.static_short_count * BytesPerShort);
  3178                                   (fac.static_short_count * BytesPerShort);
  3225     next_static_type_offset     = align_size_up((next_static_byte_offset +
  3179     next_static_type_offset     = align_size_up((next_static_byte_offset +
  3226                                   fac.static_byte_count ), wordSize );
  3180                                   fac.static_byte_count ), wordSize );
  3227     static_field_size           = (next_static_type_offset -
  3181     static_field_size           = (next_static_type_offset -
  3228                                   next_static_oop_offset) / wordSize;
  3182                                   next_static_oop_offset) / wordSize;
       
  3183 
       
  3184     // Add fake fields for java.lang.Class instances (also see below)
       
  3185     if (class_name == vmSymbols::java_lang_Class() && class_loader.is_null()) {
       
  3186       java_lang_Class_fix_pre(&nonstatic_field_size, &fac);
       
  3187     }
       
  3188 
  3229     first_nonstatic_field_offset = instanceOopDesc::base_offset_in_bytes() +
  3189     first_nonstatic_field_offset = instanceOopDesc::base_offset_in_bytes() +
  3230                                    nonstatic_field_size * heapOopSize;
  3190                                    nonstatic_field_size * heapOopSize;
  3231     next_nonstatic_field_offset = first_nonstatic_field_offset;
  3191     next_nonstatic_field_offset = first_nonstatic_field_offset;
  3232 
       
  3233     // Add fake fields for java.lang.Class instances (also see below)
       
  3234     if (class_name == vmSymbols::java_lang_Class() && class_loader.is_null()) {
       
  3235       java_lang_Class_fix_pre(&methods, &fac, CHECK_(nullHandle));
       
  3236     }
       
  3237 
  3192 
  3238     // adjust the vmentry field declaration in java.lang.invoke.MethodHandle
  3193     // adjust the vmentry field declaration in java.lang.invoke.MethodHandle
  3239     if (EnableMethodHandles && class_name == vmSymbols::java_lang_invoke_MethodHandle() && class_loader.is_null()) {
  3194     if (EnableMethodHandles && class_name == vmSymbols::java_lang_invoke_MethodHandle() && class_loader.is_null()) {
  3240       java_lang_invoke_MethodHandle_fix_pre(cp, fields, &fac, CHECK_(nullHandle));
  3195       java_lang_invoke_MethodHandle_fix_pre(cp, fields, &fac, CHECK_(nullHandle));
  3241     }
  3196     }
  3564     } else {
  3519     } else {
  3565       rt = super_klass->reference_type();
  3520       rt = super_klass->reference_type();
  3566     }
  3521     }
  3567 
  3522 
  3568     // We can now create the basic klassOop for this klass
  3523     // We can now create the basic klassOop for this klass
  3569     klassOop ik = oopFactory::new_instanceKlass(vtable_size, itable_size,
  3524     klassOop ik = oopFactory::new_instanceKlass(name, vtable_size, itable_size,
  3570                                                 static_field_size,
  3525                                                 static_field_size,
  3571                                                 total_oop_map_count,
  3526                                                 total_oop_map_count,
  3572                                                 rt, CHECK_(nullHandle));
  3527                                                 rt, CHECK_(nullHandle));
  3573     instanceKlassHandle this_klass (THREAD, ik);
  3528     instanceKlassHandle this_klass (THREAD, ik);
  3574 
  3529 
  3586     // Not yet: supers are done below to support the new subtype-checking fields
  3541     // Not yet: supers are done below to support the new subtype-checking fields
  3587     //this_klass->set_super(super_klass());
  3542     //this_klass->set_super(super_klass());
  3588     this_klass->set_class_loader(class_loader());
  3543     this_klass->set_class_loader(class_loader());
  3589     this_klass->set_nonstatic_field_size(nonstatic_field_size);
  3544     this_klass->set_nonstatic_field_size(nonstatic_field_size);
  3590     this_klass->set_has_nonstatic_fields(has_nonstatic_fields);
  3545     this_klass->set_has_nonstatic_fields(has_nonstatic_fields);
  3591     this_klass->set_static_oop_field_size(fac.static_oop_count);
  3546     this_klass->set_static_oop_field_count(fac.static_oop_count);
  3592     cp->set_pool_holder(this_klass());
  3547     cp->set_pool_holder(this_klass());
  3593     error_handler.set_in_error(false);   // turn off error handler for cp
  3548     error_handler.set_in_error(false);   // turn off error handler for cp
  3594     this_klass->set_constants(cp());
  3549     this_klass->set_constants(cp());
  3595     this_klass->set_local_interfaces(local_interfaces());
  3550     this_klass->set_local_interfaces(local_interfaces());
  3596     this_klass->set_fields(fields());
  3551     this_klass->set_fields(fields());
  3647     parse_classfile_attributes(cp, this_klass, CHECK_(nullHandle));
  3602     parse_classfile_attributes(cp, this_klass, CHECK_(nullHandle));
  3648 
  3603 
  3649     // Make sure this is the end of class file stream
  3604     // Make sure this is the end of class file stream
  3650     guarantee_property(cfs->at_eos(), "Extra bytes at the end of class file %s", CHECK_(nullHandle));
  3605     guarantee_property(cfs->at_eos(), "Extra bytes at the end of class file %s", CHECK_(nullHandle));
  3651 
  3606 
  3652     // Initialize static fields
       
  3653     this_klass->do_local_static_fields(&initialize_static_field, CHECK_(nullHandle));
       
  3654 
       
  3655     // VerifyOops believes that once this has been set, the object is completely loaded.
  3607     // VerifyOops believes that once this has been set, the object is completely loaded.
  3656     // Compute transitive closure of interfaces this class implements
  3608     // Compute transitive closure of interfaces this class implements
  3657     this_klass->set_transitive_interfaces(transitive_interfaces());
  3609     this_klass->set_transitive_interfaces(transitive_interfaces());
  3658 
  3610 
  3659     // Fill in information needed to compute superclasses.
  3611     // Fill in information needed to compute superclasses.
  3682 
  3634 
  3683     // check that if this class is an interface then it doesn't have static methods
  3635     // check that if this class is an interface then it doesn't have static methods
  3684     if (this_klass->is_interface()) {
  3636     if (this_klass->is_interface()) {
  3685       check_illegal_static_method(this_klass, CHECK_(nullHandle));
  3637       check_illegal_static_method(this_klass, CHECK_(nullHandle));
  3686     }
  3638     }
       
  3639 
       
  3640     // Allocate mirror and initialize static fields
       
  3641     java_lang_Class::create_mirror(this_klass, CHECK_(nullHandle));
  3687 
  3642 
  3688     ClassLoadingService::notify_class_loaded(instanceKlass::cast(this_klass()),
  3643     ClassLoadingService::notify_class_loaded(instanceKlass::cast(this_klass()),
  3689                                              false /* not shared class */);
  3644                                              false /* not shared class */);
  3690 
  3645 
  3691     if (TraceClassLoading) {
  3646     if (TraceClassLoading) {