1 /* |
1 /* |
2 * Copyright 1998-2009 Sun Microsystems, Inc. All Rights Reserved. |
2 * Copyright 1998-2010 Sun Microsystems, Inc. All Rights Reserved. |
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
4 * |
4 * |
5 * This code is free software; you can redistribute it and/or modify it |
5 * This code is free software; you can redistribute it and/or modify it |
6 * under the terms of the GNU General Public License version 2 only, as |
6 * under the terms of the GNU General Public License version 2 only, as |
7 * published by the Free Software Foundation. |
7 * published by the Free Software Foundation. |
408 current_frame.push_stack( |
408 current_frame.push_stack( |
409 VerificationType::integer_type(), CHECK_VERIFY(this)); |
409 VerificationType::integer_type(), CHECK_VERIFY(this)); |
410 no_control_flow = false; break; |
410 no_control_flow = false; break; |
411 case Bytecodes::_ldc : |
411 case Bytecodes::_ldc : |
412 verify_ldc( |
412 verify_ldc( |
413 opcode, bcs.get_index(), ¤t_frame, |
413 opcode, bcs.get_index_u1(), ¤t_frame, |
414 cp, bci, CHECK_VERIFY(this)); |
414 cp, bci, CHECK_VERIFY(this)); |
415 no_control_flow = false; break; |
415 no_control_flow = false; break; |
416 case Bytecodes::_ldc_w : |
416 case Bytecodes::_ldc_w : |
417 case Bytecodes::_ldc2_w : |
417 case Bytecodes::_ldc2_w : |
418 verify_ldc( |
418 verify_ldc( |
419 opcode, bcs.get_index_big(), ¤t_frame, |
419 opcode, bcs.get_index_u2(), ¤t_frame, |
420 cp, bci, CHECK_VERIFY(this)); |
420 cp, bci, CHECK_VERIFY(this)); |
421 no_control_flow = false; break; |
421 no_control_flow = false; break; |
422 case Bytecodes::_iload : |
422 case Bytecodes::_iload : |
423 verify_iload(bcs.get_index(), ¤t_frame, CHECK_VERIFY(this)); |
423 verify_iload(bcs.get_index(), ¤t_frame, CHECK_VERIFY(this)); |
424 no_control_flow = false; break; |
424 no_control_flow = false; break; |
1180 &bcs, code_length, ¤t_frame, |
1180 &bcs, code_length, ¤t_frame, |
1181 &this_uninit, return_type, cp, CHECK_VERIFY(this)); |
1181 &this_uninit, return_type, cp, CHECK_VERIFY(this)); |
1182 no_control_flow = false; break; |
1182 no_control_flow = false; break; |
1183 case Bytecodes::_new : |
1183 case Bytecodes::_new : |
1184 { |
1184 { |
1185 index = bcs.get_index_big(); |
1185 index = bcs.get_index_u2(); |
1186 verify_cp_class_type(index, cp, CHECK_VERIFY(this)); |
1186 verify_cp_class_type(index, cp, CHECK_VERIFY(this)); |
1187 VerificationType new_class_type = |
1187 VerificationType new_class_type = |
1188 cp_index_to_type(index, cp, CHECK_VERIFY(this)); |
1188 cp_index_to_type(index, cp, CHECK_VERIFY(this)); |
1189 if (!new_class_type.is_object()) { |
1189 if (!new_class_type.is_object()) { |
1190 verify_error(bci, "Illegal new instruction"); |
1190 verify_error(bci, "Illegal new instruction"); |
1200 VerificationType::integer_type(), CHECK_VERIFY(this)); |
1200 VerificationType::integer_type(), CHECK_VERIFY(this)); |
1201 current_frame.push_stack(type, CHECK_VERIFY(this)); |
1201 current_frame.push_stack(type, CHECK_VERIFY(this)); |
1202 no_control_flow = false; break; |
1202 no_control_flow = false; break; |
1203 case Bytecodes::_anewarray : |
1203 case Bytecodes::_anewarray : |
1204 verify_anewarray( |
1204 verify_anewarray( |
1205 bcs.get_index_big(), cp, ¤t_frame, CHECK_VERIFY(this)); |
1205 bcs.get_index_u2(), cp, ¤t_frame, CHECK_VERIFY(this)); |
1206 no_control_flow = false; break; |
1206 no_control_flow = false; break; |
1207 case Bytecodes::_arraylength : |
1207 case Bytecodes::_arraylength : |
1208 type = current_frame.pop_stack( |
1208 type = current_frame.pop_stack( |
1209 VerificationType::reference_check(), CHECK_VERIFY(this)); |
1209 VerificationType::reference_check(), CHECK_VERIFY(this)); |
1210 if (!(type.is_null() || type.is_array())) { |
1210 if (!(type.is_null() || type.is_array())) { |
1213 current_frame.push_stack( |
1213 current_frame.push_stack( |
1214 VerificationType::integer_type(), CHECK_VERIFY(this)); |
1214 VerificationType::integer_type(), CHECK_VERIFY(this)); |
1215 no_control_flow = false; break; |
1215 no_control_flow = false; break; |
1216 case Bytecodes::_checkcast : |
1216 case Bytecodes::_checkcast : |
1217 { |
1217 { |
1218 index = bcs.get_index_big(); |
1218 index = bcs.get_index_u2(); |
1219 verify_cp_class_type(index, cp, CHECK_VERIFY(this)); |
1219 verify_cp_class_type(index, cp, CHECK_VERIFY(this)); |
1220 current_frame.pop_stack( |
1220 current_frame.pop_stack( |
1221 VerificationType::reference_check(), CHECK_VERIFY(this)); |
1221 VerificationType::reference_check(), CHECK_VERIFY(this)); |
1222 VerificationType klass_type = cp_index_to_type( |
1222 VerificationType klass_type = cp_index_to_type( |
1223 index, cp, CHECK_VERIFY(this)); |
1223 index, cp, CHECK_VERIFY(this)); |
1224 current_frame.push_stack(klass_type, CHECK_VERIFY(this)); |
1224 current_frame.push_stack(klass_type, CHECK_VERIFY(this)); |
1225 no_control_flow = false; break; |
1225 no_control_flow = false; break; |
1226 } |
1226 } |
1227 case Bytecodes::_instanceof : { |
1227 case Bytecodes::_instanceof : { |
1228 index = bcs.get_index_big(); |
1228 index = bcs.get_index_u2(); |
1229 verify_cp_class_type(index, cp, CHECK_VERIFY(this)); |
1229 verify_cp_class_type(index, cp, CHECK_VERIFY(this)); |
1230 current_frame.pop_stack( |
1230 current_frame.pop_stack( |
1231 VerificationType::reference_check(), CHECK_VERIFY(this)); |
1231 VerificationType::reference_check(), CHECK_VERIFY(this)); |
1232 current_frame.push_stack( |
1232 current_frame.push_stack( |
1233 VerificationType::integer_type(), CHECK_VERIFY(this)); |
1233 VerificationType::integer_type(), CHECK_VERIFY(this)); |
1238 current_frame.pop_stack( |
1238 current_frame.pop_stack( |
1239 VerificationType::reference_check(), CHECK_VERIFY(this)); |
1239 VerificationType::reference_check(), CHECK_VERIFY(this)); |
1240 no_control_flow = false; break; |
1240 no_control_flow = false; break; |
1241 case Bytecodes::_multianewarray : |
1241 case Bytecodes::_multianewarray : |
1242 { |
1242 { |
1243 index = bcs.get_index_big(); |
1243 index = bcs.get_index_u2(); |
1244 u2 dim = *(bcs.bcp()+3); |
1244 u2 dim = *(bcs.bcp()+3); |
1245 verify_cp_class_type(index, cp, CHECK_VERIFY(this)); |
1245 verify_cp_class_type(index, cp, CHECK_VERIFY(this)); |
1246 VerificationType new_array_type = |
1246 VerificationType new_array_type = |
1247 cp_index_to_type(index, cp, CHECK_VERIFY(this)); |
1247 cp_index_to_type(index, cp, CHECK_VERIFY(this)); |
1248 if (!new_array_type.is_array()) { |
1248 if (!new_array_type.is_array()) { |
1297 RawBytecodeStream bcs(m); |
1297 RawBytecodeStream bcs(m); |
1298 |
1298 |
1299 while (!bcs.is_last_bytecode()) { |
1299 while (!bcs.is_last_bytecode()) { |
1300 if (bcs.raw_next() != Bytecodes::_illegal) { |
1300 if (bcs.raw_next() != Bytecodes::_illegal) { |
1301 int bci = bcs.bci(); |
1301 int bci = bcs.bci(); |
1302 if (bcs.code() == Bytecodes::_new) { |
1302 if (bcs.raw_code() == Bytecodes::_new) { |
1303 code_data[bci] = NEW_OFFSET; |
1303 code_data[bci] = NEW_OFFSET; |
1304 } else { |
1304 } else { |
1305 code_data[bci] = BYTECODE_OFFSET; |
1305 code_data[bci] = BYTECODE_OFFSET; |
1306 } |
1306 } |
1307 } else { |
1307 } else { |
1652 } |
1652 } |
1653 int default_offset = (int) Bytes::get_Java_u4(aligned_bcp); |
1653 int default_offset = (int) Bytes::get_Java_u4(aligned_bcp); |
1654 int keys, delta; |
1654 int keys, delta; |
1655 current_frame->pop_stack( |
1655 current_frame->pop_stack( |
1656 VerificationType::integer_type(), CHECK_VERIFY(this)); |
1656 VerificationType::integer_type(), CHECK_VERIFY(this)); |
1657 if (bcs->code() == Bytecodes::_tableswitch) { |
1657 if (bcs->raw_code() == Bytecodes::_tableswitch) { |
1658 jint low = (jint)Bytes::get_Java_u4(aligned_bcp + jintSize); |
1658 jint low = (jint)Bytes::get_Java_u4(aligned_bcp + jintSize); |
1659 jint high = (jint)Bytes::get_Java_u4(aligned_bcp + 2*jintSize); |
1659 jint high = (jint)Bytes::get_Java_u4(aligned_bcp + 2*jintSize); |
1660 if (low > high) { |
1660 if (low > high) { |
1661 verify_error(bci, |
1661 verify_error(bci, |
1662 "low must be less than or equal to high in tableswitch"); |
1662 "low must be less than or equal to high in tableswitch"); |
1708 |
1708 |
1709 void ClassVerifier::verify_field_instructions(RawBytecodeStream* bcs, |
1709 void ClassVerifier::verify_field_instructions(RawBytecodeStream* bcs, |
1710 StackMapFrame* current_frame, |
1710 StackMapFrame* current_frame, |
1711 constantPoolHandle cp, |
1711 constantPoolHandle cp, |
1712 TRAPS) { |
1712 TRAPS) { |
1713 u2 index = bcs->get_index_big(); |
1713 u2 index = bcs->get_index_u2(); |
1714 verify_cp_type(index, cp, 1 << JVM_CONSTANT_Fieldref, CHECK_VERIFY(this)); |
1714 verify_cp_type(index, cp, 1 << JVM_CONSTANT_Fieldref, CHECK_VERIFY(this)); |
1715 |
1715 |
1716 // Get field name and signature |
1716 // Get field name and signature |
1717 symbolHandle field_name = symbolHandle(THREAD, cp->name_ref_at(index)); |
1717 symbolHandle field_name = symbolHandle(THREAD, cp->name_ref_at(index)); |
1718 symbolHandle field_sig = symbolHandle(THREAD, cp->signature_ref_at(index)); |
1718 symbolHandle field_sig = symbolHandle(THREAD, cp->signature_ref_at(index)); |
1748 VerificationType stack_object_type; |
1748 VerificationType stack_object_type; |
1749 int n = change_sig_to_verificationType( |
1749 int n = change_sig_to_verificationType( |
1750 &sig_stream, field_type, CHECK_VERIFY(this)); |
1750 &sig_stream, field_type, CHECK_VERIFY(this)); |
1751 u2 bci = bcs->bci(); |
1751 u2 bci = bcs->bci(); |
1752 bool is_assignable; |
1752 bool is_assignable; |
1753 switch (bcs->code()) { |
1753 switch (bcs->raw_code()) { |
1754 case Bytecodes::_getstatic: { |
1754 case Bytecodes::_getstatic: { |
1755 for (int i = 0; i < n; i++) { |
1755 for (int i = 0; i < n; i++) { |
1756 current_frame->push_stack(field_type[i], CHECK_VERIFY(this)); |
1756 current_frame->push_stack(field_type[i], CHECK_VERIFY(this)); |
1757 } |
1757 } |
1758 break; |
1758 break; |
1868 if (name_in_supers(ref_class_type.name(), current_class())) { |
1868 if (name_in_supers(ref_class_type.name(), current_class())) { |
1869 klassOop ref_klass = load_class( |
1869 klassOop ref_klass = load_class( |
1870 ref_class_type.name(), CHECK_VERIFY(this)); |
1870 ref_class_type.name(), CHECK_VERIFY(this)); |
1871 methodOop m = instanceKlass::cast(ref_klass)->uncached_lookup_method( |
1871 methodOop m = instanceKlass::cast(ref_klass)->uncached_lookup_method( |
1872 vmSymbols::object_initializer_name(), |
1872 vmSymbols::object_initializer_name(), |
1873 cp->signature_ref_at(bcs->get_index_big())); |
1873 cp->signature_ref_at(bcs->get_index_u2())); |
1874 instanceKlassHandle mh(THREAD, m->method_holder()); |
1874 instanceKlassHandle mh(THREAD, m->method_holder()); |
1875 if (m->is_protected() && !mh->is_same_class_package(_klass())) { |
1875 if (m->is_protected() && !mh->is_same_class_package(_klass())) { |
1876 bool assignable = current_type().is_assignable_from( |
1876 bool assignable = current_type().is_assignable_from( |
1877 objectref_type, current_class(), CHECK_VERIFY(this)); |
1877 objectref_type, current_class(), CHECK_VERIFY(this)); |
1878 if (!assignable) { |
1878 if (!assignable) { |
1891 void ClassVerifier::verify_invoke_instructions( |
1891 void ClassVerifier::verify_invoke_instructions( |
1892 RawBytecodeStream* bcs, u4 code_length, StackMapFrame* current_frame, |
1892 RawBytecodeStream* bcs, u4 code_length, StackMapFrame* current_frame, |
1893 bool *this_uninit, VerificationType return_type, |
1893 bool *this_uninit, VerificationType return_type, |
1894 constantPoolHandle cp, TRAPS) { |
1894 constantPoolHandle cp, TRAPS) { |
1895 // Make sure the constant pool item is the right type |
1895 // Make sure the constant pool item is the right type |
1896 u2 index = bcs->get_index_big(); |
1896 u2 index = bcs->get_index_u2(); |
1897 Bytecodes::Code opcode = bcs->code(); |
1897 Bytecodes::Code opcode = bcs->raw_code(); |
1898 unsigned int types = (opcode == Bytecodes::_invokeinterface |
1898 unsigned int types = (opcode == Bytecodes::_invokeinterface |
1899 ? 1 << JVM_CONSTANT_InterfaceMethodref |
1899 ? 1 << JVM_CONSTANT_InterfaceMethodref |
1900 : opcode == Bytecodes::_invokedynamic |
1900 : opcode == Bytecodes::_invokedynamic |
1901 ? 1 << JVM_CONSTANT_NameAndType |
1901 ? 1 << JVM_CONSTANT_NameAndType |
1902 : 1 << JVM_CONSTANT_Methodref); |
1902 : 1 << JVM_CONSTANT_Methodref); |