--- a/hotspot/src/share/vm/classfile/verifier.cpp Mon Jun 07 14:17:01 2010 -0700
+++ b/hotspot/src/share/vm/classfile/verifier.cpp Wed Jun 09 18:50:45 2010 -0700
@@ -1598,7 +1598,10 @@
if (opcode == Bytecodes::_ldc || opcode == Bytecodes::_ldc_w) {
if (!tag.is_unresolved_string() && !tag.is_unresolved_klass()) {
types = (1 << JVM_CONSTANT_Integer) | (1 << JVM_CONSTANT_Float)
- | (1 << JVM_CONSTANT_String) | (1 << JVM_CONSTANT_Class);
+ | (1 << JVM_CONSTANT_String) | (1 << JVM_CONSTANT_Class)
+ | (1 << JVM_CONSTANT_MethodHandle) | (1 << JVM_CONSTANT_MethodType);
+ // Note: The class file parser already verified the legality of
+ // MethodHandle and MethodType constants.
verify_cp_type(index, cp, types, CHECK_VERIFY(this));
}
} else {
@@ -1632,6 +1635,14 @@
current_frame->push_stack_2(
VerificationType::long_type(),
VerificationType::long2_type(), CHECK_VERIFY(this));
+ } else if (tag.is_method_handle()) {
+ current_frame->push_stack(
+ VerificationType::reference_type(
+ vmSymbols::java_dyn_MethodHandle()), CHECK_VERIFY(this));
+ } else if (tag.is_method_type()) {
+ current_frame->push_stack(
+ VerificationType::reference_type(
+ vmSymbols::java_dyn_MethodType()), CHECK_VERIFY(this));
} else {
verify_error(bci, "Invalid index in ldc");
return;
@@ -1920,9 +1931,12 @@
// Get referenced class type
VerificationType ref_class_type;
if (opcode == Bytecodes::_invokedynamic) {
- if (!EnableInvokeDynamic) {
+ if (!EnableInvokeDynamic ||
+ _klass->major_version() < Verifier::INVOKEDYNAMIC_MAJOR_VERSION) {
class_format_error(
- "invokedynamic instructions not enabled on this JVM",
+ (!EnableInvokeDynamic ?
+ "invokedynamic instructions not enabled in this JVM" :
+ "invokedynamic instructions not supported by this class file version"),
_klass->external_name());
return;
}