# HG changeset patch # User apangin # Date 1250721982 25200 # Node ID 585222cadf79ab48a20e498f8d9e227f67d53bbe # Parent 6ab1d6ece8bd7e0fb9bc16c2a1e03ca6b5402426# Parent ac59d4e6dae51ac5fc31a9a4940d1857f91161b1 Merge diff -r ac59d4e6dae5 -r 585222cadf79 src/share/vm/prims/jniCheck.cpp --- a/src/share/vm/prims/jniCheck.cpp Fri Aug 14 17:14:07 2009 -0700 +++ b/src/share/vm/prims/jniCheck.cpp Wed Aug 19 15:46:22 2009 -0700 @@ -1,5 +1,5 @@ /* - * Copyright 2001-2008 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2001-2009 Sun Microsystems, Inc. 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 @@ -96,6 +96,7 @@ static const char * fatal_class_not_a_class = "JNI received a class argument that is not a class"; static const char * fatal_class_not_a_throwable_class = "JNI Throw or ThrowNew received a class argument that is not a Throwable or Throwable subclass"; static const char * fatal_wrong_class_or_method = "Wrong object class or methodID passed to JNI call"; +static const char * fatal_non_weak_method = "non-weak methodID passed to JNI call"; static const char * fatal_unknown_array_object = "Unknown array object passed to JNI array operations"; static const char * fatal_object_array_expected = "Object array expected but not received for JNI array operation"; static const char * fatal_non_array = "Non-array passed to JNI array operations"; @@ -291,10 +292,16 @@ methodOop jniCheck::validate_jmethod_id(JavaThread* thr, jmethodID method_id) { ASSERT_OOPS_ALLOWED; + // do the fast jmethodID check first methodOop moop = JNIHandles::checked_resolve_jmethod_id(method_id); if (moop == NULL) { ReportJNIFatalError(thr, fatal_wrong_class_or_method); } + // jmethodIDs are supposed to be weak global handles, but that + // can be expensive so check it last + else if (!JNIHandles::is_weak_global_handle((jobject) method_id)) { + ReportJNIFatalError(thr, fatal_non_weak_method); + } return moop; } diff -r ac59d4e6dae5 -r 585222cadf79 src/share/vm/runtime/jniHandles.hpp --- a/src/share/vm/runtime/jniHandles.hpp Fri Aug 14 17:14:07 2009 -0700 +++ b/src/share/vm/runtime/jniHandles.hpp Wed Aug 19 15:46:22 2009 -0700 @@ -1,5 +1,5 @@ /* - * Copyright 1998-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1998-2009 Sun Microsystems, Inc. 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 @@ -196,12 +196,16 @@ }; inline methodOop JNIHandles::checked_resolve_jmethod_id(jmethodID mid) { - jobject handle = (jobject)mid; - if (is_weak_global_handle(handle)) { - return (methodOop) resolve_non_null(handle); - } else { + if (mid == NULL) { return (methodOop) NULL; } + + oop o = resolve_non_null((jobject) mid); + if (!o->is_method()) { + return (methodOop) NULL; + } + + return (methodOop) o; };