1172 verify_invoke_instructions( |
1172 verify_invoke_instructions( |
1173 &bcs, code_length, ¤t_frame, |
1173 &bcs, code_length, ¤t_frame, |
1174 &this_uninit, return_type, cp, CHECK_VERIFY(this)); |
1174 &this_uninit, return_type, cp, CHECK_VERIFY(this)); |
1175 no_control_flow = false; break; |
1175 no_control_flow = false; break; |
1176 case Bytecodes::_invokeinterface : |
1176 case Bytecodes::_invokeinterface : |
|
1177 case Bytecodes::_invokedynamic : |
1177 verify_invoke_instructions( |
1178 verify_invoke_instructions( |
1178 &bcs, code_length, ¤t_frame, |
1179 &bcs, code_length, ¤t_frame, |
1179 &this_uninit, return_type, cp, CHECK_VERIFY(this)); |
1180 &this_uninit, return_type, cp, CHECK_VERIFY(this)); |
1180 no_control_flow = false; break; |
1181 no_control_flow = false; break; |
1181 case Bytecodes::_new : |
1182 case Bytecodes::_new : |
1893 // Make sure the constant pool item is the right type |
1894 // Make sure the constant pool item is the right type |
1894 u2 index = bcs->get_index_big(); |
1895 u2 index = bcs->get_index_big(); |
1895 Bytecodes::Code opcode = bcs->code(); |
1896 Bytecodes::Code opcode = bcs->code(); |
1896 unsigned int types = (opcode == Bytecodes::_invokeinterface |
1897 unsigned int types = (opcode == Bytecodes::_invokeinterface |
1897 ? 1 << JVM_CONSTANT_InterfaceMethodref |
1898 ? 1 << JVM_CONSTANT_InterfaceMethodref |
|
1899 : opcode == Bytecodes::_invokedynamic |
|
1900 ? 1 << JVM_CONSTANT_NameAndType |
1898 : 1 << JVM_CONSTANT_Methodref); |
1901 : 1 << JVM_CONSTANT_Methodref); |
1899 verify_cp_type(index, cp, types, CHECK_VERIFY(this)); |
1902 verify_cp_type(index, cp, types, CHECK_VERIFY(this)); |
1900 |
1903 |
1901 // Get method name and signature |
1904 // Get method name and signature |
1902 symbolHandle method_name(THREAD, cp->name_ref_at(index)); |
1905 symbolHandle method_name; |
1903 symbolHandle method_sig(THREAD, cp->signature_ref_at(index)); |
1906 symbolHandle method_sig; |
|
1907 if (opcode == Bytecodes::_invokedynamic) { |
|
1908 int name_index = cp->name_ref_index_at(index); |
|
1909 int sig_index = cp->signature_ref_index_at(index); |
|
1910 method_name = symbolHandle(THREAD, cp->symbol_at(name_index)); |
|
1911 method_sig = symbolHandle(THREAD, cp->symbol_at(sig_index)); |
|
1912 } else { |
|
1913 method_name = symbolHandle(THREAD, cp->name_ref_at(index)); |
|
1914 method_sig = symbolHandle(THREAD, cp->signature_ref_at(index)); |
|
1915 } |
1904 |
1916 |
1905 if (!SignatureVerifier::is_valid_method_signature(method_sig)) { |
1917 if (!SignatureVerifier::is_valid_method_signature(method_sig)) { |
1906 class_format_error( |
1918 class_format_error( |
1907 "Invalid method signature in class %s referenced " |
1919 "Invalid method signature in class %s referenced " |
1908 "from constant pool index %d", _klass->external_name(), index); |
1920 "from constant pool index %d", _klass->external_name(), index); |
1909 return; |
1921 return; |
1910 } |
1922 } |
1911 |
1923 |
1912 // Get referenced class type |
1924 // Get referenced class type |
1913 VerificationType ref_class_type = cp_ref_index_to_type( |
1925 VerificationType ref_class_type; |
1914 index, cp, CHECK_VERIFY(this)); |
1926 if (opcode == Bytecodes::_invokedynamic) { |
|
1927 if (!EnableInvokeDynamic) { |
|
1928 class_format_error( |
|
1929 "invokedynamic instructions not enabled on this JVM", |
|
1930 _klass->external_name()); |
|
1931 return; |
|
1932 } |
|
1933 } else { |
|
1934 ref_class_type = cp_ref_index_to_type(index, cp, CHECK_VERIFY(this)); |
|
1935 } |
1915 |
1936 |
1916 // For a small signature length, we just allocate 128 bytes instead |
1937 // For a small signature length, we just allocate 128 bytes instead |
1917 // of parsing the signature once to find its size. |
1938 // of parsing the signature once to find its size. |
1918 // -3 is for '(', ')' and return descriptor; multiply by 2 is for |
1939 // -3 is for '(', ')' and return descriptor; multiply by 2 is for |
1919 // longs/doubles to be consertive. |
1940 // longs/doubles to be consertive. |
1968 verify_error(bci, "Fourth operand byte of invokeinterface must be zero"); |
1989 verify_error(bci, "Fourth operand byte of invokeinterface must be zero"); |
1969 return; |
1990 return; |
1970 } |
1991 } |
1971 } |
1992 } |
1972 |
1993 |
|
1994 if (opcode == Bytecodes::_invokedynamic) { |
|
1995 address bcp = bcs->bcp(); |
|
1996 if (*(bcp+3) != 0 || *(bcp+4) != 0) { |
|
1997 verify_error(bci, "Third and fourth operand bytes of invokedynamic must be zero"); |
|
1998 return; |
|
1999 } |
|
2000 } |
|
2001 |
1973 if (method_name->byte_at(0) == '<') { |
2002 if (method_name->byte_at(0) == '<') { |
1974 // Make sure <init> can only be invoked by invokespecial |
2003 // Make sure <init> can only be invoked by invokespecial |
1975 if (opcode != Bytecodes::_invokespecial || |
2004 if (opcode != Bytecodes::_invokespecial || |
1976 method_name() != vmSymbols::object_initializer_name()) { |
2005 method_name() != vmSymbols::object_initializer_name()) { |
1977 verify_error(bci, "Illegal call to internal method"); |
2006 verify_error(bci, "Illegal call to internal method"); |
1992 // Match method descriptor with operand stack |
2021 // Match method descriptor with operand stack |
1993 for (int i = nargs - 1; i >= 0; i--) { // Run backwards |
2022 for (int i = nargs - 1; i >= 0; i--) { // Run backwards |
1994 current_frame->pop_stack(sig_types[i], CHECK_VERIFY(this)); |
2023 current_frame->pop_stack(sig_types[i], CHECK_VERIFY(this)); |
1995 } |
2024 } |
1996 // Check objectref on operand stack |
2025 // Check objectref on operand stack |
1997 if (opcode != Bytecodes::_invokestatic) { |
2026 if (opcode != Bytecodes::_invokestatic && |
|
2027 opcode != Bytecodes::_invokedynamic) { |
1998 if (method_name() == vmSymbols::object_initializer_name()) { // <init> method |
2028 if (method_name() == vmSymbols::object_initializer_name()) { // <init> method |
1999 verify_invoke_init(bcs, ref_class_type, current_frame, |
2029 verify_invoke_init(bcs, ref_class_type, current_frame, |
2000 code_length, this_uninit, cp, CHECK_VERIFY(this)); |
2030 code_length, this_uninit, cp, CHECK_VERIFY(this)); |
2001 } else { // other methods |
2031 } else { // other methods |
2002 // Ensures that target class is assignable to method class. |
2032 // Ensures that target class is assignable to method class. |