Mercurial > hg > truffle
comparison src/share/vm/classfile/classFileParser.cpp @ 6227:dd785aabe02b
Merge
author | kvn |
---|---|
date | Tue, 17 Jul 2012 11:16:13 -0700 |
parents | 9c9fb30d2b3b e74da3c2b827 |
children | 1d7922586cf6 |
comparison
equal
deleted
inserted
replaced
6226:9c9fb30d2b3b | 6227:dd785aabe02b |
---|---|
1294 *dest++ = Bytes::get_Java_u2((u1*) (src++)); | 1294 *dest++ = Bytes::get_Java_u2((u1*) (src++)); |
1295 } | 1295 } |
1296 } | 1296 } |
1297 | 1297 |
1298 | 1298 |
1299 typeArrayHandle ClassFileParser::parse_exception_table(u4 code_length, | 1299 u2* ClassFileParser::parse_exception_table(u4 code_length, |
1300 u4 exception_table_length, | 1300 u4 exception_table_length, |
1301 constantPoolHandle cp, | 1301 constantPoolHandle cp, |
1302 TRAPS) { | 1302 TRAPS) { |
1303 ClassFileStream* cfs = stream(); | 1303 ClassFileStream* cfs = stream(); |
1304 typeArrayHandle nullHandle; | 1304 |
1305 | 1305 u2* exception_table_start = cfs->get_u2_buffer(); |
1306 // 4-tuples of ints [start_pc, end_pc, handler_pc, catch_type index] | 1306 assert(exception_table_start != NULL, "null exception table"); |
1307 typeArrayOop eh = oopFactory::new_permanent_intArray(exception_table_length*4, CHECK_(nullHandle)); | 1307 cfs->guarantee_more(8 * exception_table_length, CHECK_NULL); // start_pc, end_pc, handler_pc, catch_type_index |
1308 typeArrayHandle exception_handlers = typeArrayHandle(THREAD, eh); | 1308 // Will check legal target after parsing code array in verifier. |
1309 | 1309 if (_need_verify) { |
1310 int index = 0; | 1310 for (unsigned int i = 0; i < exception_table_length; i++) { |
1311 cfs->guarantee_more(8 * exception_table_length, CHECK_(nullHandle)); // start_pc, end_pc, handler_pc, catch_type_index | 1311 u2 start_pc = cfs->get_u2_fast(); |
1312 for (unsigned int i = 0; i < exception_table_length; i++) { | 1312 u2 end_pc = cfs->get_u2_fast(); |
1313 u2 start_pc = cfs->get_u2_fast(); | 1313 u2 handler_pc = cfs->get_u2_fast(); |
1314 u2 end_pc = cfs->get_u2_fast(); | 1314 u2 catch_type_index = cfs->get_u2_fast(); |
1315 u2 handler_pc = cfs->get_u2_fast(); | |
1316 u2 catch_type_index = cfs->get_u2_fast(); | |
1317 // Will check legal target after parsing code array in verifier. | |
1318 if (_need_verify) { | |
1319 guarantee_property((start_pc < end_pc) && (end_pc <= code_length), | 1315 guarantee_property((start_pc < end_pc) && (end_pc <= code_length), |
1320 "Illegal exception table range in class file %s", CHECK_(nullHandle)); | 1316 "Illegal exception table range in class file %s", |
1317 CHECK_NULL); | |
1321 guarantee_property(handler_pc < code_length, | 1318 guarantee_property(handler_pc < code_length, |
1322 "Illegal exception table handler in class file %s", CHECK_(nullHandle)); | 1319 "Illegal exception table handler in class file %s", |
1320 CHECK_NULL); | |
1323 if (catch_type_index != 0) { | 1321 if (catch_type_index != 0) { |
1324 guarantee_property(valid_cp_range(catch_type_index, cp->length()) && | 1322 guarantee_property(valid_cp_range(catch_type_index, cp->length()) && |
1325 is_klass_reference(cp, catch_type_index), | 1323 is_klass_reference(cp, catch_type_index), |
1326 "Catch type in exception table has bad constant type in class file %s", CHECK_(nullHandle)); | 1324 "Catch type in exception table has bad constant type in class file %s", CHECK_NULL); |
1327 } | 1325 } |
1328 } | 1326 } |
1329 exception_handlers->int_at_put(index++, start_pc); | 1327 } else { |
1330 exception_handlers->int_at_put(index++, end_pc); | 1328 cfs->skip_u2_fast(exception_table_length * 4); |
1331 exception_handlers->int_at_put(index++, handler_pc); | 1329 } |
1332 exception_handlers->int_at_put(index++, catch_type_index); | 1330 return exception_table_start; |
1333 } | |
1334 return exception_handlers; | |
1335 } | 1331 } |
1336 | 1332 |
1337 void ClassFileParser::parse_linenumber_table( | 1333 void ClassFileParser::parse_linenumber_table( |
1338 u4 code_attribute_length, u4 code_length, | 1334 u4 code_attribute_length, u4 code_length, |
1339 CompressedLineNumberWriteStream** write_stream, TRAPS) { | 1335 CompressedLineNumberWriteStream** write_stream, TRAPS) { |
1868 u2 max_stack = 0; | 1864 u2 max_stack = 0; |
1869 u2 max_locals = 0; | 1865 u2 max_locals = 0; |
1870 u4 code_length = 0; | 1866 u4 code_length = 0; |
1871 u1* code_start = 0; | 1867 u1* code_start = 0; |
1872 u2 exception_table_length = 0; | 1868 u2 exception_table_length = 0; |
1869 u2* exception_table_start = NULL; | |
1873 typeArrayHandle exception_handlers(THREAD, Universe::the_empty_int_array()); | 1870 typeArrayHandle exception_handlers(THREAD, Universe::the_empty_int_array()); |
1874 u2 checked_exceptions_length = 0; | 1871 u2 checked_exceptions_length = 0; |
1875 u2* checked_exceptions_start = NULL; | 1872 u2* checked_exceptions_start = NULL; |
1876 CompressedLineNumberWriteStream* linenumber_table = NULL; | 1873 CompressedLineNumberWriteStream* linenumber_table = NULL; |
1877 int linenumber_table_length = 0; | 1874 int linenumber_table_length = 0; |
1955 | 1952 |
1956 // Exception handler table | 1953 // Exception handler table |
1957 cfs->guarantee_more(2, CHECK_(nullHandle)); // exception_table_length | 1954 cfs->guarantee_more(2, CHECK_(nullHandle)); // exception_table_length |
1958 exception_table_length = cfs->get_u2_fast(); | 1955 exception_table_length = cfs->get_u2_fast(); |
1959 if (exception_table_length > 0) { | 1956 if (exception_table_length > 0) { |
1960 exception_handlers = | 1957 exception_table_start = |
1961 parse_exception_table(code_length, exception_table_length, cp, CHECK_(nullHandle)); | 1958 parse_exception_table(code_length, exception_table_length, cp, CHECK_(nullHandle)); |
1962 } | 1959 } |
1963 | 1960 |
1964 // Parse additional attributes in code attribute | 1961 // Parse additional attributes in code attribute |
1965 cfs->guarantee_more(2, CHECK_(nullHandle)); // code_attributes_count | 1962 cfs->guarantee_more(2, CHECK_(nullHandle)); // code_attributes_count |
2160 guarantee_property(access_flags.is_native() || access_flags.is_abstract() || parsed_code_attribute, | 2157 guarantee_property(access_flags.is_native() || access_flags.is_abstract() || parsed_code_attribute, |
2161 "Absent Code attribute in method that is not native or abstract in class file %s", CHECK_(nullHandle)); | 2158 "Absent Code attribute in method that is not native or abstract in class file %s", CHECK_(nullHandle)); |
2162 } | 2159 } |
2163 | 2160 |
2164 // All sizing information for a methodOop is finally available, now create it | 2161 // All sizing information for a methodOop is finally available, now create it |
2165 methodOop m_oop = oopFactory::new_method(code_length, access_flags, linenumber_table_length, | 2162 methodOop m_oop = oopFactory::new_method(code_length, access_flags, |
2166 total_lvt_length, checked_exceptions_length, | 2163 linenumber_table_length, |
2167 oopDesc::IsSafeConc, CHECK_(nullHandle)); | 2164 total_lvt_length, |
2165 exception_table_length, | |
2166 checked_exceptions_length, | |
2167 oopDesc::IsSafeConc, | |
2168 CHECK_(nullHandle)); | |
2168 methodHandle m (THREAD, m_oop); | 2169 methodHandle m (THREAD, m_oop); |
2169 | 2170 |
2170 ClassLoadingService::add_class_method_size(m_oop->size()*HeapWordSize); | 2171 ClassLoadingService::add_class_method_size(m_oop->size()*HeapWordSize); |
2171 | 2172 |
2172 // Fill in information from fixed part (access_flags already set) | 2173 // Fill in information from fixed part (access_flags already set) |
2193 #endif | 2194 #endif |
2194 | 2195 |
2195 // Fill in code attribute information | 2196 // Fill in code attribute information |
2196 m->set_max_stack(max_stack); | 2197 m->set_max_stack(max_stack); |
2197 m->set_max_locals(max_locals); | 2198 m->set_max_locals(max_locals); |
2198 m->constMethod()->set_stackmap_data(stackmap_data()); | |
2199 | 2199 |
2200 /** | 2200 /** |
2201 * The exception_table field is the flag used to indicate | 2201 * The stackmap_data field is the flag used to indicate |
2202 * that the methodOop and it's associated constMethodOop are partially | 2202 * that the methodOop and it's associated constMethodOop are partially |
2203 * initialized and thus are exempt from pre/post GC verification. Once | 2203 * initialized and thus are exempt from pre/post GC verification. Once |
2204 * the field is set, the oops are considered fully initialized so make | 2204 * the field is set, the oops are considered fully initialized so make |
2205 * sure that the oops can pass verification when this field is set. | 2205 * sure that the oops can pass verification when this field is set. |
2206 */ | 2206 */ |
2207 m->set_exception_table(exception_handlers()); | 2207 m->constMethod()->set_stackmap_data(stackmap_data()); |
2208 | 2208 |
2209 // Copy byte codes | 2209 // Copy byte codes |
2210 m->set_code(code_start); | 2210 m->set_code(code_start); |
2211 | 2211 |
2212 // Copy line number table | 2212 // Copy line number table |
2213 if (linenumber_table != NULL) { | 2213 if (linenumber_table != NULL) { |
2214 memcpy(m->compressed_linenumber_table(), | 2214 memcpy(m->compressed_linenumber_table(), |
2215 linenumber_table->buffer(), linenumber_table_length); | 2215 linenumber_table->buffer(), linenumber_table_length); |
2216 } | |
2217 | |
2218 // Copy exception table | |
2219 if (exception_table_length > 0) { | |
2220 int size = | |
2221 exception_table_length * sizeof(ExceptionTableElement) / sizeof(u2); | |
2222 copy_u2_with_conversion((u2*) m->exception_table_start(), | |
2223 exception_table_start, size); | |
2216 } | 2224 } |
2217 | 2225 |
2218 // Copy checked exceptions | 2226 // Copy checked exceptions |
2219 if (checked_exceptions_length > 0) { | 2227 if (checked_exceptions_length > 0) { |
2220 int size = checked_exceptions_length * sizeof(CheckedExceptionElement) / sizeof(u2); | 2228 int size = checked_exceptions_length * sizeof(CheckedExceptionElement) / sizeof(u2); |