From db31a896d88bc059633fc521ebdfebdd7df9a596 Mon Sep 17 00:00:00 2001 From: Bharadwaj Yadavalli Date: Wed, 13 Feb 2013 16:09:13 -0500 Subject: [PATCH] 8007888: jdk fix default method: VerifyError: Illegal use of nonvirtual Recognize VM generated method in old verifier. With 8004967 Reviewed-by: coleenp, acorn --- jdk/src/share/javavm/export/jvm.h | 7 +++++++ jdk/src/share/native/common/check_code.c | 8 +++++++- 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/jdk/src/share/javavm/export/jvm.h b/jdk/src/share/javavm/export/jvm.h index 1f785f1a108..44b0be576d4 100644 --- a/jdk/src/share/javavm/export/jvm.h +++ b/jdk/src/share/javavm/export/jvm.h @@ -821,6 +821,13 @@ JVM_GetMethodIxMaxStack(JNIEnv *env, jclass cb, int index); JNIEXPORT jboolean JNICALL JVM_IsConstructorIx(JNIEnv *env, jclass cb, int index); +/* + * Is the given method generated by the VM. + * The method is identified by method_index. + */ +JNIEXPORT jboolean JNICALL +JVM_IsVMGeneratedMethodIx(JNIEnv *env, jclass cb, int index); + /* * Returns the name of a given method in UTF format. * The result remains valid until JVM_ReleaseUTF is called. diff --git a/jdk/src/share/native/common/check_code.c b/jdk/src/share/native/common/check_code.c index c5e8855ee68..c761a3d9158 100644 --- a/jdk/src/share/native/common/check_code.c +++ b/jdk/src/share/native/common/check_code.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 1994, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1994, 2013, 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 @@ -983,6 +983,12 @@ verify_method(context_type *context, jclass cb, int method_index, CCerror(context, "Inconsistent access bits."); } + // If this method is an overpass method, which is generated by the VM, + // we trust the code and no check needs to be done. + if (JVM_IsVMGeneratedMethodIx(env, cb, method_index)) { + return; + } + /* Run through the code. Mark the start of each instruction, and give * the instruction a number */ for (i = 0, offset = 0; offset < code_length; i++) {