Merge
authortrims
Fri, 21 Aug 2009 20:39:41 -0700
changeset 3675 abd5656ec01e
parent 3671 910dce153b56 (current diff)
parent 3674 6dc179b981ff (diff)
child 3689 ae24bdd7408b
child 3809 a68ba546e735
child 3811 e8139278d5d7
Merge
--- a/hotspot/src/share/vm/prims/jniCheck.cpp	Fri Aug 21 20:38:36 2009 -0700
+++ b/hotspot/src/share/vm/prims/jniCheck.cpp	Fri Aug 21 20:39:41 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;
 }
 
--- a/hotspot/src/share/vm/runtime/jniHandles.hpp	Fri Aug 21 20:38:36 2009 -0700
+++ b/hotspot/src/share/vm/runtime/jniHandles.hpp	Fri Aug 21 20:39:41 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;
 };