diff options
author | joth@chromium.org <joth@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-03-22 13:52:57 +0000 |
---|---|---|
committer | joth@chromium.org <joth@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-03-22 13:52:57 +0000 |
commit | 6b532429a47bc57fe44a6da06ddc69f4e9300829 (patch) | |
tree | 718e5a087826efd1d7f7ebe0ab3a66881d1c9bc2 /content/browser/renderer_host/java | |
parent | 23bd102d84b2561d5d7a8648a6a725858c47acd7 (diff) | |
download | chromium_src-6b532429a47bc57fe44a6da06ddc69f4e9300829.zip chromium_src-6b532429a47bc57fe44a6da06ddc69f4e9300829.tar.gz chromium_src-6b532429a47bc57fe44a6da06ddc69f4e9300829.tar.bz2 |
Remove env() getter from JavaRef<>
Due to threadsafety ambiguity, it's not generally safe to call env()
on a random Ref you've been passed, so this removes the temptation.
The useful LocalRef optimizations are retained though, just in that
sub-class.
(upstreaming CL, cherrypicked cleanly)
BUG=
TEST=
Review URL: http://codereview.chromium.org/9584014
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@128204 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'content/browser/renderer_host/java')
-rw-r--r-- | content/browser/renderer_host/java/java_bound_object.cc | 13 | ||||
-rw-r--r-- | content/browser/renderer_host/java/java_bound_object.h | 9 | ||||
-rw-r--r-- | content/browser/renderer_host/java/java_method.cc | 6 |
3 files changed, 12 insertions, 16 deletions
diff --git a/content/browser/renderer_host/java/java_bound_object.cc b/content/browser/renderer_host/java/java_bound_object.cc index ce13300..a9f7920 100644 --- a/content/browser/renderer_host/java/java_bound_object.cc +++ b/content/browser/renderer_host/java/java_bound_object.cc @@ -691,21 +691,18 @@ NPObject* JavaBoundObject::Create(const JavaRef<jobject>& object) { } JavaBoundObject::JavaBoundObject(const JavaRef<jobject>& object) - : java_object_(object.env()->NewGlobalRef(object.obj())) { + : java_object_(object) { // We don't do anything with our Java object when first created. We do it all // lazily when a method is first invoked. } JavaBoundObject::~JavaBoundObject() { - // Use the current thread's JNI env to release our global ref to the Java - // object. - AttachCurrentThread()->DeleteGlobalRef(java_object_); } jobject JavaBoundObject::GetJavaObject(NPObject* object) { DCHECK_EQ(&JavaNPObject::kNPClass, object->_class); JavaBoundObject* jbo = reinterpret_cast<JavaNPObject*>(object)->bound_object; - return jbo->java_object_; + return jbo->java_object_.obj(); } bool JavaBoundObject::HasMethod(const std::string& name) const { @@ -746,8 +743,8 @@ bool JavaBoundObject::Invoke(const std::string& name, const NPVariant* args, } // Call - *result = CallJNIMethod(java_object_, method->return_type(), method->id(), - ¶meters[0]); + *result = CallJNIMethod(java_object_.obj(), method->return_type(), + method->id(), ¶meters[0]); return true; } @@ -758,7 +755,7 @@ void JavaBoundObject::EnsureMethodsAreSetUp() const { JNIEnv* env = AttachCurrentThread(); ScopedJavaLocalRef<jclass> clazz(env, static_cast<jclass>( - env->CallObjectMethod(java_object_, GetMethodIDFromClassName( + env->CallObjectMethod(java_object_.obj(), GetMethodIDFromClassName( env, kJavaLangObject, kGetClass, diff --git a/content/browser/renderer_host/java/java_bound_object.h b/content/browser/renderer_host/java/java_bound_object.h index 61a1dfb..cf0c403 100644 --- a/content/browser/renderer_host/java/java_bound_object.h +++ b/content/browser/renderer_host/java/java_bound_object.h @@ -1,4 +1,4 @@ -// Copyright (c) 2011 The Chromium Authors. All rights reserved. +// Copyright (c) 2012 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. @@ -44,10 +44,9 @@ class JavaBoundObject { void EnsureMethodsAreSetUp() const; - // Global ref to the underlying Java object. We use a naked jobject, rather - // than a ScopedJavaGlobalRef, as the global ref will be added and dropped on - // different threads. - jobject java_object_; + // The global ref to the underlying Java object that this JavaBoundObject + // instance represents. + base::android::ScopedJavaGlobalRef<jobject> java_object_; // Map of public methods, from method name to Method instance. Multiple // entries will be present for overloaded methods. Note that we can't use diff --git a/content/browser/renderer_host/java/java_method.cc b/content/browser/renderer_host/java/java_method.cc index 01235e8..6f6878c 100644 --- a/content/browser/renderer_host/java/java_method.cc +++ b/content/browser/renderer_host/java/java_method.cc @@ -95,7 +95,7 @@ JavaMethod::JavaMethod(const base::android::JavaRef<jobject>& method) : java_method_(method), have_calculated_num_parameters_(false), id_(NULL) { - JNIEnv* env = java_method_.env(); + JNIEnv* env = AttachCurrentThread(); // On construction, we do nothing except get the name. Everything else is // done lazily. ScopedJavaLocalRef<jstring> name(env, static_cast<jstring>( @@ -139,7 +139,7 @@ void JavaMethod::EnsureNumParametersIsSetUp() const { // The number of parameters will be used frequently when determining // whether to call this method. We don't get the ID etc until actually // required. - JNIEnv* env = java_method_.env(); + JNIEnv* env = AttachCurrentThread(); ScopedJavaLocalRef<jarray> parameters(env, static_cast<jarray>( env->CallObjectMethod(java_method_.obj(), GetMethodIDFromClassName( env, @@ -155,7 +155,7 @@ void JavaMethod::EnsureTypesAndIDAreSetUp() const { } // Get the parameters - JNIEnv* env = java_method_.env(); + JNIEnv* env = AttachCurrentThread(); ScopedJavaLocalRef<jobjectArray> parameters(env, static_cast<jobjectArray>( env->CallObjectMethod(java_method_.obj(), GetMethodIDFromClassName( env, |