src/share/vm/classfile/verifier.cpp

Print this page

        

*** 1,7 **** /* ! * Copyright (c) 1998, 2011, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 only, as * published by the Free Software Foundation. --- 1,7 ---- /* ! * Copyright (c) 1998, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 only, as * published by the Free Software Foundation.
*** 1366,1383 **** return code_data; } void ClassVerifier::verify_exception_handler_table(u4 code_length, char* code_data, int& min, int& max, TRAPS) { ! typeArrayHandle exhandlers (THREAD, _method->exception_table()); constantPoolHandle cp (THREAD, _method->constants()); ! if (exhandlers() != NULL) { ! for(int i = 0; i < exhandlers->length();) { ! u2 start_pc = exhandlers->int_at(i++); ! u2 end_pc = exhandlers->int_at(i++); ! u2 handler_pc = exhandlers->int_at(i++); if (start_pc >= code_length || code_data[start_pc] == 0) { class_format_error("Illegal exception table start_pc %d", start_pc); return; } if (end_pc != code_length) { // special case: end_pc == code_length --- 1366,1384 ---- return code_data; } void ClassVerifier::verify_exception_handler_table(u4 code_length, char* code_data, int& min, int& max, TRAPS) { ! ExceptionTable exhandlers(_method()); constantPoolHandle cp (THREAD, _method->constants()); ! for(int i = 0; i < exhandlers.length(); i++) { ! //reacquire the table in case a GC happened ! ExceptionTable exhandlers(_method()); ! u2 start_pc = exhandlers.start_pc(i); ! u2 end_pc = exhandlers.end_pc(i); ! u2 handler_pc = exhandlers.handler_pc(i); if (start_pc >= code_length || code_data[start_pc] == 0) { class_format_error("Illegal exception table start_pc %d", start_pc); return; } if (end_pc != code_length) { // special case: end_pc == code_length
*** 1388,1398 **** } if (handler_pc >= code_length || code_data[handler_pc] == 0) { class_format_error("Illegal exception table handler_pc %d", handler_pc); return; } ! int catch_type_index = exhandlers->int_at(i++); if (catch_type_index != 0) { VerificationType catch_type = cp_index_to_type( catch_type_index, cp, CHECK_VERIFY(this)); VerificationType throwable = VerificationType::reference_type(vmSymbols::java_lang_Throwable()); --- 1389,1399 ---- } if (handler_pc >= code_length || code_data[handler_pc] == 0) { class_format_error("Illegal exception table handler_pc %d", handler_pc); return; } ! int catch_type_index = exhandlers.catch_type_index(i); if (catch_type_index != 0) { VerificationType catch_type = cp_index_to_type( catch_type_index, cp, CHECK_VERIFY(this)); VerificationType throwable = VerificationType::reference_type(vmSymbols::java_lang_Throwable());
*** 1407,1417 **** } } if (start_pc < min) min = start_pc; if (end_pc > max) max = end_pc; } - } } void ClassVerifier::verify_local_variable_table(u4 code_length, char* code_data, TRAPS) { int localvariable_table_length = _method()->localvariable_table_length(); if (localvariable_table_length > 0) { --- 1408,1417 ----
*** 1472,1488 **** } void ClassVerifier::verify_exception_handler_targets(u2 bci, bool this_uninit, StackMapFrame* current_frame, StackMapTable* stackmap_table, TRAPS) { constantPoolHandle cp (THREAD, _method->constants()); ! typeArrayHandle exhandlers (THREAD, _method->exception_table()); ! if (exhandlers() != NULL) { ! for(int i = 0; i < exhandlers->length();) { ! u2 start_pc = exhandlers->int_at(i++); ! u2 end_pc = exhandlers->int_at(i++); ! u2 handler_pc = exhandlers->int_at(i++); ! int catch_type_index = exhandlers->int_at(i++); if(bci >= start_pc && bci < end_pc) { u1 flags = current_frame->flags(); if (this_uninit) { flags |= FLAG_THIS_UNINIT; } StackMapFrame* new_frame = current_frame->frame_in_exception_handler(flags); if (catch_type_index != 0) { --- 1472,1489 ---- } void ClassVerifier::verify_exception_handler_targets(u2 bci, bool this_uninit, StackMapFrame* current_frame, StackMapTable* stackmap_table, TRAPS) { constantPoolHandle cp (THREAD, _method->constants()); ! ExceptionTable exhandlers(_method()); ! for(int i = 0; i < exhandlers.length(); i++) { ! //reacquire the table in case a GC happened ! ExceptionTable exhandlers(_method()); ! u2 start_pc = exhandlers.start_pc(i); ! u2 end_pc = exhandlers.end_pc(i); ! u2 handler_pc = exhandlers.handler_pc(i); ! int catch_type_index = exhandlers.catch_type_index(i); if(bci >= start_pc && bci < end_pc) { u1 flags = current_frame->flags(); if (this_uninit) { flags |= FLAG_THIS_UNINIT; } StackMapFrame* new_frame = current_frame->frame_in_exception_handler(flags); if (catch_type_index != 0) {
*** 1503,1513 **** handler_pc); return; } } } - } } void ClassVerifier::verify_cp_index(constantPoolHandle cp, int index, TRAPS) { int nconstants = cp->length(); if ((index <= 0) || (index >= nconstants)) { --- 1504,1513 ----