hotspot/src/share/vm/classfile/classFileParser.cpp
changeset 15194 a35093d73168
parent 15185 1ce0205b9a47
child 15195 6313e53c38a1
equal deleted inserted replaced
15192:f71a6fb9b532 15194:a35093d73168
    57 #include "runtime/signature.hpp"
    57 #include "runtime/signature.hpp"
    58 #include "runtime/timer.hpp"
    58 #include "runtime/timer.hpp"
    59 #include "services/classLoadingService.hpp"
    59 #include "services/classLoadingService.hpp"
    60 #include "services/threadService.hpp"
    60 #include "services/threadService.hpp"
    61 #include "utilities/array.hpp"
    61 #include "utilities/array.hpp"
       
    62 #include "utilities/globalDefinitions.hpp"
    62 
    63 
    63 // We generally try to create the oops directly when parsing, rather than
    64 // We generally try to create the oops directly when parsing, rather than
    64 // allocating temporary data structures and copying the bytes twice. A
    65 // allocating temporary data structures and copying the bytes twice. A
    65 // temporary area is only needed when parsing utf8 entries in the constant
    66 // temporary area is only needed when parsing utf8 entries in the constant
    66 // pool and when parsing line number tables.
    67 // pool and when parsing line number tables.
  2146             parse_checked_exceptions(&checked_exceptions_length,
  2147             parse_checked_exceptions(&checked_exceptions_length,
  2147                                      method_attribute_length,
  2148                                      method_attribute_length,
  2148                                      cp, CHECK_(nullHandle));
  2149                                      cp, CHECK_(nullHandle));
  2149     } else if (method_attribute_name == vmSymbols::tag_method_parameters()) {
  2150     } else if (method_attribute_name == vmSymbols::tag_method_parameters()) {
  2150       method_parameters_length = cfs->get_u1_fast();
  2151       method_parameters_length = cfs->get_u1_fast();
       
  2152       // Track the actual size (note: this is written for clarity; a
       
  2153       // decent compiler will CSE and constant-fold this into a single
       
  2154       // expression)
       
  2155       u2 actual_size = 1;
  2151       method_parameters_data = cfs->get_u1_buffer();
  2156       method_parameters_data = cfs->get_u1_buffer();
       
  2157       actual_size += 2 * method_parameters_length;
  2152       cfs->skip_u2_fast(method_parameters_length);
  2158       cfs->skip_u2_fast(method_parameters_length);
       
  2159       actual_size += 4 * method_parameters_length;
  2153       cfs->skip_u4_fast(method_parameters_length);
  2160       cfs->skip_u4_fast(method_parameters_length);
       
  2161       // Enforce attribute length
       
  2162       if (method_attribute_length != actual_size) {
       
  2163         classfile_parse_error(
       
  2164           "Invalid MethodParameters method attribute length %u in class file %s",
       
  2165           method_attribute_length, CHECK_(nullHandle));
       
  2166       }
  2154       // ignore this attribute if it cannot be reflected
  2167       // ignore this attribute if it cannot be reflected
  2155       if (!SystemDictionary::Parameter_klass_loaded())
  2168       if (!SystemDictionary::Parameter_klass_loaded())
  2156         method_parameters_length = 0;
  2169         method_parameters_length = 0;
  2157     } else if (method_attribute_name == vmSymbols::tag_synthetic()) {
  2170     } else if (method_attribute_name == vmSymbols::tag_synthetic()) {
  2158       if (method_attribute_length != 0) {
  2171       if (method_attribute_length != 0) {
  2295     MethodParametersElement* elem = m->constMethod()->method_parameters_start();
  2308     MethodParametersElement* elem = m->constMethod()->method_parameters_start();
  2296     for(int i = 0; i < method_parameters_length; i++) {
  2309     for(int i = 0; i < method_parameters_length; i++) {
  2297       elem[i].name_cp_index =
  2310       elem[i].name_cp_index =
  2298         Bytes::get_Java_u2(method_parameters_data);
  2311         Bytes::get_Java_u2(method_parameters_data);
  2299       method_parameters_data += 2;
  2312       method_parameters_data += 2;
  2300       elem[i].flags = Bytes::get_Java_u4(method_parameters_data);
  2313       u4 flags = Bytes::get_Java_u4(method_parameters_data);
       
  2314       // This caused an alignment fault on Sparc, if flags was a u4
       
  2315       elem[i].flags_lo = extract_low_short_from_int(flags);
       
  2316       elem[i].flags_hi = extract_high_short_from_int(flags);
  2301       method_parameters_data += 4;
  2317       method_parameters_data += 4;
  2302     }
  2318     }
  2303   }
  2319   }
  2304 
  2320 
  2305   // Copy checked exceptions
  2321   // Copy checked exceptions