comparison src/share/vm/classfile/classFileParser.cpp @ 6831:d8ce2825b193

8000213: NPG: Should have renamed arrayKlass and typeArrayKlass Summary: Capitalize these metadata types (and objArrayKlass) Reviewed-by: stefank, twisti, kvn
author coleenp
date Sat, 29 Sep 2012 06:40:00 -0400
parents aed758eda82a
children d804e148cff8 48a75d2640a5
comparison
equal deleted inserted replaced
6811:1b582b1bf7cb 6831:d8ce2825b193
780 } 780 }
781 781
782 782
783 Array<Klass*>* ClassFileParser::parse_interfaces(constantPoolHandle cp, 783 Array<Klass*>* ClassFileParser::parse_interfaces(constantPoolHandle cp,
784 int length, 784 int length,
785 ClassLoaderData* loader_data, 785 ClassLoaderData* loader_data,
786 Handle protection_domain, 786 Handle protection_domain,
787 Symbol* class_name, 787 Symbol* class_name,
788 TRAPS) { 788 TRAPS) {
789 ClassFileStream* cfs = stream(); 789 ClassFileStream* cfs = stream();
790 assert(length > 0, "only called for length>0"); 790 assert(length > 0, "only called for length>0");
1070 } 1070 }
1071 }; 1071 };
1072 1072
1073 Array<u2>* ClassFileParser::parse_fields(ClassLoaderData* loader_data, 1073 Array<u2>* ClassFileParser::parse_fields(ClassLoaderData* loader_data,
1074 Symbol* class_name, 1074 Symbol* class_name,
1075 constantPoolHandle cp, bool is_interface, 1075 constantPoolHandle cp,
1076 FieldAllocationCount *fac, 1076 bool is_interface,
1077 FieldAllocationCount *fac,
1077 Array<AnnotationArray*>** fields_annotations, 1078 Array<AnnotationArray*>** fields_annotations,
1078 u2* java_fields_count_ptr, TRAPS) { 1079 u2* java_fields_count_ptr, TRAPS) {
1079 ClassFileStream* cfs = stream(); 1080 ClassFileStream* cfs = stream();
1080 cfs->guarantee_more(2, CHECK_NULL); // length 1081 cfs->guarantee_more(2, CHECK_NULL); // length
1081 u2 length = cfs->get_u2_fast(); 1082 u2 length = cfs->get_u2_fast();
1082 *java_fields_count_ptr = length; 1083 *java_fields_count_ptr = length;
1083 1084
2167 guarantee_property(access_flags.is_native() || access_flags.is_abstract() || parsed_code_attribute, 2168 guarantee_property(access_flags.is_native() || access_flags.is_abstract() || parsed_code_attribute,
2168 "Absent Code attribute in method that is not native or abstract in class file %s", CHECK_(nullHandle)); 2169 "Absent Code attribute in method that is not native or abstract in class file %s", CHECK_(nullHandle));
2169 } 2170 }
2170 2171
2171 // All sizing information for a Method* is finally available, now create it 2172 // All sizing information for a Method* is finally available, now create it
2172 Method* m = Method::allocate(loader_data, 2173 Method* m = Method::allocate(loader_data, code_length, access_flags,
2173 code_length, 2174 linenumber_table_length,
2174 access_flags, 2175 total_lvt_length,
2175 linenumber_table_length, 2176 exception_table_length,
2176 total_lvt_length, 2177 checked_exceptions_length,
2177 exception_table_length, 2178 CHECK_(nullHandle));
2178 checked_exceptions_length,
2179 CHECK_(nullHandle));
2180 2179
2181 ClassLoadingService::add_class_method_size(m->size()*HeapWordSize); 2180 ClassLoadingService::add_class_method_size(m->size()*HeapWordSize);
2182 2181
2183 // Fill in information from fixed part (access_flags already set) 2182 // Fill in information from fixed part (access_flags already set)
2184 m->set_constants(cp()); 2183 m->set_constants(cp());
2349 // The promoted_flags parameter is used to pass relevant access_flags 2348 // The promoted_flags parameter is used to pass relevant access_flags
2350 // from the methods back up to the containing klass. These flag values 2349 // from the methods back up to the containing klass. These flag values
2351 // are added to klass's access_flags. 2350 // are added to klass's access_flags.
2352 2351
2353 Array<Method*>* ClassFileParser::parse_methods(ClassLoaderData* loader_data, 2352 Array<Method*>* ClassFileParser::parse_methods(ClassLoaderData* loader_data,
2354 constantPoolHandle cp, 2353 constantPoolHandle cp,
2355 bool is_interface, 2354 bool is_interface,
2356 AccessFlags* promoted_flags, 2355 AccessFlags* promoted_flags,
2357 bool* has_final_method, 2356 bool* has_final_method,
2358 Array<AnnotationArray*>** methods_annotations, 2357 Array<AnnotationArray*>** methods_annotations,
2359 Array<AnnotationArray*>** methods_parameter_annotations, 2358 Array<AnnotationArray*>** methods_parameter_annotations,
2360 Array<AnnotationArray*>** methods_default_annotations, 2359 Array<AnnotationArray*>** methods_default_annotations,
2361 TRAPS) { 2360 TRAPS) {
2362 ClassFileStream* cfs = stream(); 2361 ClassFileStream* cfs = stream();
2363 AnnotationArray* method_annotations = NULL; 2362 AnnotationArray* method_annotations = NULL;
2364 AnnotationArray* method_parameter_annotations = NULL; 2363 AnnotationArray* method_parameter_annotations = NULL;
2365 AnnotationArray* method_default_annotations = NULL; 2364 AnnotationArray* method_default_annotations = NULL;
2366 cfs->guarantee_more(2, CHECK_NULL); // length 2365 cfs->guarantee_more(2, CHECK_NULL); // length
2448 m->set_vtable_index(index); 2447 m->set_vtable_index(index);
2449 } 2448 }
2450 } 2449 }
2451 // Sort method array by ascending method name (for faster lookups & vtable construction) 2450 // Sort method array by ascending method name (for faster lookups & vtable construction)
2452 // Note that the ordering is not alphabetical, see Symbol::fast_compare 2451 // Note that the ordering is not alphabetical, see Symbol::fast_compare
2453 Method::sort_methods(methods, 2452 Method::sort_methods(methods, methods_annotations,
2454 methods_annotations, 2453 methods_parameter_annotations,
2455 methods_parameter_annotations, 2454 methods_default_annotations);
2456 methods_default_annotations);
2457 2455
2458 // If JVMTI original method ordering or sharing is enabled construct int 2456 // If JVMTI original method ordering or sharing is enabled construct int
2459 // array remembering the original ordering 2457 // array remembering the original ordering
2460 if (JvmtiExport::can_maintain_original_method_order() || DumpSharedSpaces) { 2458 if (JvmtiExport::can_maintain_original_method_order() || DumpSharedSpaces) {
2461 Array<int>* method_ordering = MetadataFactory::new_array<int>(loader_data, length, CHECK_NULL); 2459 Array<int>* method_ordering = MetadataFactory::new_array<int>(loader_data, length, CHECK_NULL);
2833 cfs->skip_u1(attribute_length, CHECK); 2831 cfs->skip_u1(attribute_length, CHECK);
2834 } 2832 }
2835 } 2833 }
2836 AnnotationArray* annotations = assemble_annotations(loader_data, 2834 AnnotationArray* annotations = assemble_annotations(loader_data,
2837 runtime_visible_annotations, 2835 runtime_visible_annotations,
2838 runtime_visible_annotations_length, 2836 runtime_visible_annotations_length,
2839 runtime_invisible_annotations, 2837 runtime_invisible_annotations,
2840 runtime_invisible_annotations_length, 2838 runtime_invisible_annotations_length,
2841 CHECK); 2839 CHECK);
2842 set_class_annotations(annotations); 2840 set_class_annotations(annotations);
2843 2841
2844 if (parsed_innerclasses_attribute || parsed_enclosingmethod_attribute) { 2842 if (parsed_innerclasses_attribute || parsed_enclosingmethod_attribute) {
2845 u2 num_of_classes = parse_classfile_inner_classes_attribute( 2843 u2 num_of_classes = parse_classfile_inner_classes_attribute(
2846 loader_data, 2844 loader_data,
2882 } 2880 }
2883 } 2881 }
2884 2882
2885 AnnotationArray* ClassFileParser::assemble_annotations(ClassLoaderData* loader_data, 2883 AnnotationArray* ClassFileParser::assemble_annotations(ClassLoaderData* loader_data,
2886 u1* runtime_visible_annotations, 2884 u1* runtime_visible_annotations,
2887 int runtime_visible_annotations_length, 2885 int runtime_visible_annotations_length,
2888 u1* runtime_invisible_annotations, 2886 u1* runtime_invisible_annotations,
2889 int runtime_invisible_annotations_length, TRAPS) { 2887 int runtime_invisible_annotations_length, TRAPS) {
2890 AnnotationArray* annotations = NULL; 2888 AnnotationArray* annotations = NULL;
2891 if (runtime_visible_annotations != NULL || 2889 if (runtime_visible_annotations != NULL ||
2892 runtime_invisible_annotations != NULL) { 2890 runtime_invisible_annotations != NULL) {
2893 annotations = MetadataFactory::new_array<u1>(loader_data, 2891 annotations = MetadataFactory::new_array<u1>(loader_data,
2894 runtime_visible_annotations_length + 2892 runtime_visible_annotations_length +
3159 // inside parse_methods inside a nested HandleMark 3157 // inside parse_methods inside a nested HandleMark
3160 Array<AnnotationArray*>* methods_annotations = NULL; 3158 Array<AnnotationArray*>* methods_annotations = NULL;
3161 Array<AnnotationArray*>* methods_parameter_annotations = NULL; 3159 Array<AnnotationArray*>* methods_parameter_annotations = NULL;
3162 Array<AnnotationArray*>* methods_default_annotations = NULL; 3160 Array<AnnotationArray*>* methods_default_annotations = NULL;
3163 Array<Method*>* methods = parse_methods(loader_data, 3161 Array<Method*>* methods = parse_methods(loader_data,
3164 cp, access_flags.is_interface(), 3162 cp, access_flags.is_interface(),
3165 &promoted_flags, 3163 &promoted_flags,
3166 &has_final_method, 3164 &has_final_method,
3167 &methods_annotations, 3165 &methods_annotations,
3168 &methods_parameter_annotations, 3166 &methods_parameter_annotations,
3169 &methods_default_annotations, 3167 &methods_default_annotations,
3170 CHECK_(nullHandle)); 3168 CHECK_(nullHandle));
3171 3169
3172 // Additional attributes 3170 // Additional attributes
3173 ClassAnnotationCollector parsed_annotations; 3171 ClassAnnotationCollector parsed_annotations;
3174 parse_classfile_attributes(loader_data, cp, &parsed_annotations, CHECK_(nullHandle)); 3172 parse_classfile_attributes(loader_data, cp, &parsed_annotations, CHECK_(nullHandle));
3175 3173
3184 // errors not checked yet. 3182 // errors not checked yet.
3185 guarantee_property(sk == vmSymbols::java_lang_Object(), 3183 guarantee_property(sk == vmSymbols::java_lang_Object(),
3186 "Interfaces must have java.lang.Object as superclass in class file %s", 3184 "Interfaces must have java.lang.Object as superclass in class file %s",
3187 CHECK_(nullHandle)); 3185 CHECK_(nullHandle));
3188 } 3186 }
3189 Klass* k = SystemDictionary::resolve_super_or_fail(class_name, 3187 Klass* k = SystemDictionary::resolve_super_or_fail(class_name, sk,
3190 sk, 3188 class_loader,
3191 class_loader, 3189 protection_domain,
3192 protection_domain, 3190 true,
3193 true, 3191 CHECK_(nullHandle));
3194 CHECK_(nullHandle));
3195 3192
3196 KlassHandle kh (THREAD, k); 3193 KlassHandle kh (THREAD, k);
3197 super_klass = instanceKlassHandle(THREAD, kh()); 3194 super_klass = instanceKlassHandle(THREAD, kh());
3198 if (LinkWellKnownClasses) // my super class is well known to me 3195 if (LinkWellKnownClasses) // my super class is well known to me
3199 cp->klass_at_put(super_class_index, super_klass()); // eagerly resolve 3196 cp->klass_at_put(super_class_index, super_klass()); // eagerly resolve
3220 Array<Klass*>* transitive_interfaces = compute_transitive_interfaces(loader_data, super_klass, local_interfaces, CHECK_(nullHandle)); 3217 Array<Klass*>* transitive_interfaces = compute_transitive_interfaces(loader_data, super_klass, local_interfaces, CHECK_(nullHandle));
3221 3218
3222 // sort methods 3219 // sort methods
3223 Array<int>* method_ordering = sort_methods(loader_data, 3220 Array<int>* method_ordering = sort_methods(loader_data,
3224 methods, 3221 methods,
3225 methods_annotations, 3222 methods_annotations,
3226 methods_parameter_annotations, 3223 methods_parameter_annotations,
3227 methods_default_annotations, 3224 methods_default_annotations,
3228 CHECK_(nullHandle)); 3225 CHECK_(nullHandle));
3229 3226
3230 // promote flags from parse_methods() to the klass' flags 3227 // promote flags from parse_methods() to the klass' flags
3231 access_flags.add_promoted_flags(promoted_flags.as_int()); 3228 access_flags.add_promoted_flags(promoted_flags.as_int());
3232 3229
3233 // Size of Java vtable (in words) 3230 // Size of Java vtable (in words)
3589 // We can now create the basic Klass* for this klass 3586 // We can now create the basic Klass* for this klass
3590 int total_oop_map_size2 = 3587 int total_oop_map_size2 =
3591 InstanceKlass::nonstatic_oop_map_size(total_oop_map_count); 3588 InstanceKlass::nonstatic_oop_map_size(total_oop_map_count);
3592 3589
3593 Klass* ik = InstanceKlass::allocate_instance_klass(loader_data, 3590 Klass* ik = InstanceKlass::allocate_instance_klass(loader_data,
3594 vtable_size, 3591 vtable_size,
3595 itable_size, 3592 itable_size,
3596 static_field_size, 3593 static_field_size,
3597 total_oop_map_size2, 3594 total_oop_map_size2,
3598 rt, 3595 rt,
3599 access_flags, 3596 access_flags,
3600 name, 3597 name,
3601 super_klass(), 3598 super_klass(),
3602 host_klass, 3599 host_klass,
3603 CHECK_(nullHandle)); 3600 CHECK_(nullHandle));
3604 3601
3605 // Add all classes to our internal class loader list here, 3602 // Add all classes to our internal class loader list here,
3606 // including classes in the bootstrap (NULL) class loader. 3603 // including classes in the bootstrap (NULL) class loader.
3607 loader_data->add_class(ik); 3604 loader_data->add_class(ik);
3608 3605