jni_internal_test.cc revision 00f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abac
12faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes/* 22faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * Copyright (C) 2011 The Android Open Source Project 32faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * 42faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * Licensed under the Apache License, Version 2.0 (the "License"); 52faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * you may not use this file except in compliance with the License. 62faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * You may obtain a copy of the License at 72faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * 82faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * http://www.apache.org/licenses/LICENSE-2.0 92faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * 102faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * Unless required by applicable law or agreed to in writing, software 112faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * distributed under the License is distributed on an "AS IS" BASIS, 122faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 132faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * See the License for the specific language governing permissions and 142faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * limitations under the License. 152faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes */ 160c9cd5692fbbc5d92fcdc1ef41ef881a492b00ceElliott Hughes 179b9ba28b1277b4ddb967c5a968c6d550febce6afCarl Shapiro#include "jni_internal.h" 189b9ba28b1277b4ddb967c5a968c6d550febce6afCarl Shapiro 190cfe1fb7060576d047f7f894fc0d8b87de84fcabIan Rogers#include <cmath> 200cfe1fb7060576d047f7f894fc0d8b87de84fcabIan Rogers 219b9ba28b1277b4ddb967c5a968c6d550febce6afCarl Shapiro#include "common_test.h" 22726079d3e2e50854cd6ca4c393f4529a796dba58Elliott Hughes#include "ScopedLocalRef.h" 230c9cd5692fbbc5d92fcdc1ef41ef881a492b00ceElliott Hughes 240c9cd5692fbbc5d92fcdc1ef41ef881a492b00ceElliott Hughesnamespace art { 250c9cd5692fbbc5d92fcdc1ef41ef881a492b00ceElliott Hughes 26f734cf55d510976f4862b15e35fc86eae2a3daf8Brian Carlstromclass JniInternalTest : public CommonTest { 27c7ac37f0b8b64cfb53d8b9cc8dddbb34be3dd5eeElliott Hughes protected: 28c7ac37f0b8b64cfb53d8b9cc8dddbb34be3dd5eeElliott Hughes virtual void SetUp() { 29f734cf55d510976f4862b15e35fc86eae2a3daf8Brian Carlstrom CommonTest::SetUp(); 305174fe6e4e931c423e910366ff22ce0838567940Elliott Hughes 31a2501990dd0f68baf38ce19251949d7bb3ecfe5aElliott Hughes vm_ = Runtime::Current()->GetJavaVM(); 32a2501990dd0f68baf38ce19251949d7bb3ecfe5aElliott Hughes 335174fe6e4e931c423e910366ff22ce0838567940Elliott Hughes // Turn on -verbose:jni for the JNI tests. 344dd9b4d95eec9db5338fb9bf132f9bb8facf6cf4Elliott Hughes gLogVerbosity.jni = true; 355174fe6e4e931c423e910366ff22ce0838567940Elliott Hughes 364d5714378c3433ba7e351cbf6a6713fb49c31784Brian Carlstrom vm_->AttachCurrentThread(&env_, NULL); 37b465ab0e103d7760df903c1fddf4fa6b89d5d1f5Elliott Hughes 38726079d3e2e50854cd6ca4c393f4529a796dba58Elliott Hughes ScopedLocalRef<jclass> aioobe(env_, env_->FindClass("java/lang/ArrayIndexOutOfBoundsException")); 39726079d3e2e50854cd6ca4c393f4529a796dba58Elliott Hughes CHECK(aioobe.get() != NULL); 40726079d3e2e50854cd6ca4c393f4529a796dba58Elliott Hughes aioobe_ = reinterpret_cast<jclass>(env_->NewGlobalRef(aioobe.get())); 41b465ab0e103d7760df903c1fddf4fa6b89d5d1f5Elliott Hughes 42b264f081424642b06b0bbe7102781895d41faa9dElliott Hughes ScopedLocalRef<jclass> ase(env_, env_->FindClass("java/lang/ArrayStoreException")); 43b264f081424642b06b0bbe7102781895d41faa9dElliott Hughes CHECK(ase.get() != NULL); 44b264f081424642b06b0bbe7102781895d41faa9dElliott Hughes ase_ = reinterpret_cast<jclass>(env_->NewGlobalRef(ase.get())); 45b264f081424642b06b0bbe7102781895d41faa9dElliott Hughes 46726079d3e2e50854cd6ca4c393f4529a796dba58Elliott Hughes ScopedLocalRef<jclass> sioobe(env_, env_->FindClass("java/lang/StringIndexOutOfBoundsException")); 47726079d3e2e50854cd6ca4c393f4529a796dba58Elliott Hughes CHECK(sioobe.get() != NULL); 48726079d3e2e50854cd6ca4c393f4529a796dba58Elliott Hughes sioobe_ = reinterpret_cast<jclass>(env_->NewGlobalRef(sioobe.get())); 49726079d3e2e50854cd6ca4c393f4529a796dba58Elliott Hughes } 50726079d3e2e50854cd6ca4c393f4529a796dba58Elliott Hughes 514d5714378c3433ba7e351cbf6a6713fb49c31784Brian Carlstrom void CleanUpJniEnv() { 524d5714378c3433ba7e351cbf6a6713fb49c31784Brian Carlstrom if (aioobe_ != NULL) { 534d5714378c3433ba7e351cbf6a6713fb49c31784Brian Carlstrom env_->DeleteGlobalRef(aioobe_); 544d5714378c3433ba7e351cbf6a6713fb49c31784Brian Carlstrom aioobe_ = NULL; 554d5714378c3433ba7e351cbf6a6713fb49c31784Brian Carlstrom } 564d5714378c3433ba7e351cbf6a6713fb49c31784Brian Carlstrom if (ase_ != NULL) { 574d5714378c3433ba7e351cbf6a6713fb49c31784Brian Carlstrom env_->DeleteGlobalRef(ase_); 584d5714378c3433ba7e351cbf6a6713fb49c31784Brian Carlstrom ase_ = NULL; 594d5714378c3433ba7e351cbf6a6713fb49c31784Brian Carlstrom } 604d5714378c3433ba7e351cbf6a6713fb49c31784Brian Carlstrom if (sioobe_ != NULL) { 614d5714378c3433ba7e351cbf6a6713fb49c31784Brian Carlstrom env_->DeleteGlobalRef(sioobe_); 624d5714378c3433ba7e351cbf6a6713fb49c31784Brian Carlstrom sioobe_ = NULL; 634d5714378c3433ba7e351cbf6a6713fb49c31784Brian Carlstrom } 644d5714378c3433ba7e351cbf6a6713fb49c31784Brian Carlstrom } 654d5714378c3433ba7e351cbf6a6713fb49c31784Brian Carlstrom 66726079d3e2e50854cd6ca4c393f4529a796dba58Elliott Hughes virtual void TearDown() { 674d5714378c3433ba7e351cbf6a6713fb49c31784Brian Carlstrom CleanUpJniEnv(); 68726079d3e2e50854cd6ca4c393f4529a796dba58Elliott Hughes CommonTest::TearDown(); 69c7ac37f0b8b64cfb53d8b9cc8dddbb34be3dd5eeElliott Hughes } 70b465ab0e103d7760df903c1fddf4fa6b89d5d1f5Elliott Hughes 7100f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers Method::InvokeStub* DoCompile(Method*& method, Object*& receiver, bool is_static, 7200f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers const char* method_name, const char* method_signature) 7300f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers SHARED_LOCKS_REQUIRED(GlobalSynchronization::mutator_lock_) { 7477405796564c6c1353807cda18b28678a719bd68Elliott Hughes const char* class_name = is_static ? "StaticLeafMethods" : "NonStaticLeafMethods"; 7500f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers jobject jclass_loader(LoadDex(class_name)); 7600f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers SirtRef<ClassLoader> class_loader(ScopedObjectAccessUnchecked(Thread::Current()).Decode<ClassLoader*>(jclass_loader)); 7777405796564c6c1353807cda18b28678a719bd68Elliott Hughes if (is_static) { 7877405796564c6c1353807cda18b28678a719bd68Elliott Hughes CompileDirectMethod(class_loader.get(), class_name, method_name, method_signature); 7977405796564c6c1353807cda18b28678a719bd68Elliott Hughes } else { 8077405796564c6c1353807cda18b28678a719bd68Elliott Hughes CompileVirtualMethod(NULL, "java.lang.Class", "isFinalizable", "()Z"); 8177405796564c6c1353807cda18b28678a719bd68Elliott Hughes CompileDirectMethod(NULL, "java.lang.Object", "<init>", "()V"); 8277405796564c6c1353807cda18b28678a719bd68Elliott Hughes CompileVirtualMethod(class_loader.get(), class_name, method_name, method_signature); 8377405796564c6c1353807cda18b28678a719bd68Elliott Hughes } 8477405796564c6c1353807cda18b28678a719bd68Elliott Hughes 8577405796564c6c1353807cda18b28678a719bd68Elliott Hughes Class* c = class_linker_->FindClass(DotToDescriptor(class_name).c_str(), class_loader.get()); 8677405796564c6c1353807cda18b28678a719bd68Elliott Hughes CHECK(c != NULL); 8777405796564c6c1353807cda18b28678a719bd68Elliott Hughes 8800f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers method = is_static ? c->FindDirectMethod(method_name, method_signature) 8900f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers : c->FindVirtualMethod(method_name, method_signature); 9077405796564c6c1353807cda18b28678a719bd68Elliott Hughes CHECK(method != NULL); 9177405796564c6c1353807cda18b28678a719bd68Elliott Hughes 9277405796564c6c1353807cda18b28678a719bd68Elliott Hughes receiver = (is_static ? NULL : c->AllocObject()); 9377405796564c6c1353807cda18b28678a719bd68Elliott Hughes 9477405796564c6c1353807cda18b28678a719bd68Elliott Hughes Method::InvokeStub* stub = method->GetInvokeStub(); 9577405796564c6c1353807cda18b28678a719bd68Elliott Hughes CHECK(stub != NULL); 9677405796564c6c1353807cda18b28678a719bd68Elliott Hughes 9777405796564c6c1353807cda18b28678a719bd68Elliott Hughes return stub; 9877405796564c6c1353807cda18b28678a719bd68Elliott Hughes } 9977405796564c6c1353807cda18b28678a719bd68Elliott Hughes 10000f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers void InvokeNopMethod(bool is_static) SHARED_LOCKS_REQUIRED(GlobalSynchronization::mutator_lock_) { 10177405796564c6c1353807cda18b28678a719bd68Elliott Hughes Method* method; 10277405796564c6c1353807cda18b28678a719bd68Elliott Hughes Object* receiver; 10377405796564c6c1353807cda18b28678a719bd68Elliott Hughes Method::InvokeStub* stub = DoCompile(method, receiver, is_static, "nop", "()V"); 10477405796564c6c1353807cda18b28678a719bd68Elliott Hughes (*stub)(method, receiver, Thread::Current(), NULL, NULL); 10577405796564c6c1353807cda18b28678a719bd68Elliott Hughes } 10677405796564c6c1353807cda18b28678a719bd68Elliott Hughes 10700f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers void InvokeIdentityByteMethod(bool is_static) 10800f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers SHARED_LOCKS_REQUIRED(GlobalSynchronization::mutator_lock_) { 10977405796564c6c1353807cda18b28678a719bd68Elliott Hughes Method* method; 11077405796564c6c1353807cda18b28678a719bd68Elliott Hughes Object* receiver; 11177405796564c6c1353807cda18b28678a719bd68Elliott Hughes Method::InvokeStub* stub = DoCompile(method, receiver, is_static, "identity", "(B)B"); 11277405796564c6c1353807cda18b28678a719bd68Elliott Hughes 11377405796564c6c1353807cda18b28678a719bd68Elliott Hughes JValue args[1]; 11477405796564c6c1353807cda18b28678a719bd68Elliott Hughes JValue result; 11577405796564c6c1353807cda18b28678a719bd68Elliott Hughes 116f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes args[0].SetB(0); 117f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes result.SetB(-1); 11877405796564c6c1353807cda18b28678a719bd68Elliott Hughes (*stub)(method, receiver, Thread::Current(), args, &result); 119f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes EXPECT_EQ(0, result.GetB()); 12077405796564c6c1353807cda18b28678a719bd68Elliott Hughes 121f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes args[0].SetB(-1); 122f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes result.SetB(0); 12377405796564c6c1353807cda18b28678a719bd68Elliott Hughes (*stub)(method, receiver, Thread::Current(), args, &result); 124f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes EXPECT_EQ(-1, result.GetB()); 12577405796564c6c1353807cda18b28678a719bd68Elliott Hughes 126f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes args[0].SetB(SCHAR_MAX); 127f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes result.SetB(0); 12877405796564c6c1353807cda18b28678a719bd68Elliott Hughes (*stub)(method, receiver, Thread::Current(), args, &result); 129f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes EXPECT_EQ(SCHAR_MAX, result.GetB()); 13077405796564c6c1353807cda18b28678a719bd68Elliott Hughes 131f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes args[0].SetB(SCHAR_MIN); 132f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes result.SetB(0); 13377405796564c6c1353807cda18b28678a719bd68Elliott Hughes (*stub)(method, receiver, Thread::Current(), args, &result); 134f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes EXPECT_EQ(SCHAR_MIN, result.GetB()); 13577405796564c6c1353807cda18b28678a719bd68Elliott Hughes } 13677405796564c6c1353807cda18b28678a719bd68Elliott Hughes 13700f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers void InvokeIdentityIntMethod(bool is_static) 13800f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers SHARED_LOCKS_REQUIRED(GlobalSynchronization::mutator_lock_) { 13977405796564c6c1353807cda18b28678a719bd68Elliott Hughes Method* method; 14077405796564c6c1353807cda18b28678a719bd68Elliott Hughes Object* receiver; 14177405796564c6c1353807cda18b28678a719bd68Elliott Hughes Method::InvokeStub* stub = DoCompile(method, receiver, is_static, "identity", "(I)I"); 14277405796564c6c1353807cda18b28678a719bd68Elliott Hughes 14377405796564c6c1353807cda18b28678a719bd68Elliott Hughes JValue args[1]; 14477405796564c6c1353807cda18b28678a719bd68Elliott Hughes JValue result; 14577405796564c6c1353807cda18b28678a719bd68Elliott Hughes 146f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes args[0].SetI(0); 147f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes result.SetI(-1); 14877405796564c6c1353807cda18b28678a719bd68Elliott Hughes (*stub)(method, receiver, Thread::Current(), args, &result); 149f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes EXPECT_EQ(0, result.GetI()); 15077405796564c6c1353807cda18b28678a719bd68Elliott Hughes 151f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes args[0].SetI(-1); 152f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes result.SetI(0); 15377405796564c6c1353807cda18b28678a719bd68Elliott Hughes (*stub)(method, receiver, Thread::Current(), args, &result); 154f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes EXPECT_EQ(-1, result.GetI()); 15577405796564c6c1353807cda18b28678a719bd68Elliott Hughes 156f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes args[0].SetI(INT_MAX); 157f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes result.SetI(0); 15877405796564c6c1353807cda18b28678a719bd68Elliott Hughes (*stub)(method, receiver, Thread::Current(), args, &result); 159f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes EXPECT_EQ(INT_MAX, result.GetI()); 16077405796564c6c1353807cda18b28678a719bd68Elliott Hughes 161f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes args[0].SetI(INT_MIN); 162f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes result.SetI(0); 16377405796564c6c1353807cda18b28678a719bd68Elliott Hughes (*stub)(method, receiver, Thread::Current(), args, &result); 164f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes EXPECT_EQ(INT_MIN, result.GetI()); 16577405796564c6c1353807cda18b28678a719bd68Elliott Hughes } 16677405796564c6c1353807cda18b28678a719bd68Elliott Hughes 16700f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers void InvokeIdentityDoubleMethod(bool is_static) 16800f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers SHARED_LOCKS_REQUIRED(GlobalSynchronization::mutator_lock_) { 16977405796564c6c1353807cda18b28678a719bd68Elliott Hughes Method* method; 17077405796564c6c1353807cda18b28678a719bd68Elliott Hughes Object* receiver; 17177405796564c6c1353807cda18b28678a719bd68Elliott Hughes Method::InvokeStub* stub = DoCompile(method, receiver, is_static, "identity", "(D)D"); 17277405796564c6c1353807cda18b28678a719bd68Elliott Hughes 17377405796564c6c1353807cda18b28678a719bd68Elliott Hughes JValue args[1]; 17477405796564c6c1353807cda18b28678a719bd68Elliott Hughes JValue result; 17577405796564c6c1353807cda18b28678a719bd68Elliott Hughes 176f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes args[0].SetD(0.0); 177f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes result.SetD(-1.0); 17877405796564c6c1353807cda18b28678a719bd68Elliott Hughes (*stub)(method, receiver, Thread::Current(), args, &result); 179f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes EXPECT_EQ(0.0, result.GetD()); 18077405796564c6c1353807cda18b28678a719bd68Elliott Hughes 181f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes args[0].SetD(-1.0); 182f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes result.SetD(0.0); 18377405796564c6c1353807cda18b28678a719bd68Elliott Hughes (*stub)(method, receiver, Thread::Current(), args, &result); 184f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes EXPECT_EQ(-1.0, result.GetD()); 18577405796564c6c1353807cda18b28678a719bd68Elliott Hughes 186f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes args[0].SetD(DBL_MAX); 187f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes result.SetD(0.0); 18877405796564c6c1353807cda18b28678a719bd68Elliott Hughes (*stub)(method, receiver, Thread::Current(), args, &result); 189f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes EXPECT_EQ(DBL_MAX, result.GetD()); 19077405796564c6c1353807cda18b28678a719bd68Elliott Hughes 191f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes args[0].SetD(DBL_MIN); 192f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes result.SetD(0.0); 19377405796564c6c1353807cda18b28678a719bd68Elliott Hughes (*stub)(method, receiver, Thread::Current(), args, &result); 194f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes EXPECT_EQ(DBL_MIN, result.GetD()); 19577405796564c6c1353807cda18b28678a719bd68Elliott Hughes } 19677405796564c6c1353807cda18b28678a719bd68Elliott Hughes 19700f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers void InvokeSumIntIntMethod(bool is_static) 19800f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers SHARED_LOCKS_REQUIRED(GlobalSynchronization::mutator_lock_) { 19977405796564c6c1353807cda18b28678a719bd68Elliott Hughes Method* method; 20077405796564c6c1353807cda18b28678a719bd68Elliott Hughes Object* receiver; 20177405796564c6c1353807cda18b28678a719bd68Elliott Hughes Method::InvokeStub* stub = DoCompile(method, receiver, is_static, "sum", "(II)I"); 20277405796564c6c1353807cda18b28678a719bd68Elliott Hughes 20377405796564c6c1353807cda18b28678a719bd68Elliott Hughes JValue result; 204f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes result.SetI(-1); 20577405796564c6c1353807cda18b28678a719bd68Elliott Hughes JValue args[2]; 206f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes args[0].SetI(0); 207f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes args[1].SetI(0); 20877405796564c6c1353807cda18b28678a719bd68Elliott Hughes (*stub)(method, NULL, Thread::Current(), args, &result); 209f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes EXPECT_EQ(0, result.GetI()); 21077405796564c6c1353807cda18b28678a719bd68Elliott Hughes 211f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes result.SetI(0); 212f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes args[0].SetI(1); 213f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes args[1].SetI(2); 21477405796564c6c1353807cda18b28678a719bd68Elliott Hughes (*stub)(method, NULL, Thread::Current(), args, &result); 215f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes EXPECT_EQ(3, result.GetI()); 21677405796564c6c1353807cda18b28678a719bd68Elliott Hughes 217f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes result.SetI(0); 218f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes args[0].SetI(-2); 219f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes args[1].SetI(5); 22077405796564c6c1353807cda18b28678a719bd68Elliott Hughes (*stub)(method, NULL, Thread::Current(), args, &result); 221f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes EXPECT_EQ(3, result.GetI()); 22277405796564c6c1353807cda18b28678a719bd68Elliott Hughes 223f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes result.SetI(1234); 224f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes args[0].SetI(INT_MAX); 225f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes args[1].SetI(INT_MIN); 22677405796564c6c1353807cda18b28678a719bd68Elliott Hughes (*stub)(method, NULL, Thread::Current(), args, &result); 227f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes EXPECT_EQ(-1, result.GetI()); 22877405796564c6c1353807cda18b28678a719bd68Elliott Hughes 229f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes result.SetI(INT_MIN); 230f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes args[0].SetI(INT_MAX); 231f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes args[1].SetI(INT_MAX); 23277405796564c6c1353807cda18b28678a719bd68Elliott Hughes (*stub)(method, NULL, Thread::Current(), args, &result); 233f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes EXPECT_EQ(-2, result.GetI()); 23477405796564c6c1353807cda18b28678a719bd68Elliott Hughes } 23577405796564c6c1353807cda18b28678a719bd68Elliott Hughes 23600f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers void InvokeSumIntIntIntMethod(bool is_static) 23700f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers SHARED_LOCKS_REQUIRED(GlobalSynchronization::mutator_lock_) { 23877405796564c6c1353807cda18b28678a719bd68Elliott Hughes Method* method; 23977405796564c6c1353807cda18b28678a719bd68Elliott Hughes Object* receiver; 24077405796564c6c1353807cda18b28678a719bd68Elliott Hughes Method::InvokeStub* stub = DoCompile(method, receiver, is_static, "sum", "(III)I"); 24177405796564c6c1353807cda18b28678a719bd68Elliott Hughes 24277405796564c6c1353807cda18b28678a719bd68Elliott Hughes JValue result; 243f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes result.SetI(-1); 24477405796564c6c1353807cda18b28678a719bd68Elliott Hughes JValue args[3]; 245f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes args[0].SetI(0); 246f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes args[1].SetI(0); 247f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes args[2].SetI(0); 24877405796564c6c1353807cda18b28678a719bd68Elliott Hughes (*stub)(method, NULL, Thread::Current(), args, &result); 249f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes EXPECT_EQ(0, result.GetI()); 25077405796564c6c1353807cda18b28678a719bd68Elliott Hughes 251f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes result.SetI(0); 252f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes args[0].SetI(1); 253f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes args[1].SetI(2); 254f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes args[2].SetI(3); 25577405796564c6c1353807cda18b28678a719bd68Elliott Hughes (*stub)(method, NULL, Thread::Current(), args, &result); 256f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes EXPECT_EQ(6, result.GetI()); 25777405796564c6c1353807cda18b28678a719bd68Elliott Hughes 258f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes result.SetI(0); 259f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes args[0].SetI(-1); 260f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes args[1].SetI(2); 261f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes args[2].SetI(-3); 26277405796564c6c1353807cda18b28678a719bd68Elliott Hughes (*stub)(method, NULL, Thread::Current(), args, &result); 263f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes EXPECT_EQ(-2, result.GetI()); 26477405796564c6c1353807cda18b28678a719bd68Elliott Hughes 265f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes result.SetI(1234); 266f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes args[0].SetI(INT_MAX); 267f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes args[1].SetI(INT_MIN); 268f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes args[2].SetI(INT_MAX); 26977405796564c6c1353807cda18b28678a719bd68Elliott Hughes (*stub)(method, NULL, Thread::Current(), args, &result); 270f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes EXPECT_EQ(2147483646, result.GetI()); 27177405796564c6c1353807cda18b28678a719bd68Elliott Hughes 272f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes result.SetI(INT_MIN); 273f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes args[0].SetI(INT_MAX); 274f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes args[1].SetI(INT_MAX); 275f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes args[2].SetI(INT_MAX); 27677405796564c6c1353807cda18b28678a719bd68Elliott Hughes (*stub)(method, NULL, Thread::Current(), args, &result); 277f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes EXPECT_EQ(2147483645, result.GetI()); 27877405796564c6c1353807cda18b28678a719bd68Elliott Hughes } 27977405796564c6c1353807cda18b28678a719bd68Elliott Hughes 28000f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers void InvokeSumIntIntIntIntMethod(bool is_static) 28100f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers SHARED_LOCKS_REQUIRED(GlobalSynchronization::mutator_lock_) { 28277405796564c6c1353807cda18b28678a719bd68Elliott Hughes Method* method; 28377405796564c6c1353807cda18b28678a719bd68Elliott Hughes Object* receiver; 28477405796564c6c1353807cda18b28678a719bd68Elliott Hughes Method::InvokeStub* stub = DoCompile(method, receiver, is_static, "sum", "(IIII)I"); 28577405796564c6c1353807cda18b28678a719bd68Elliott Hughes 28677405796564c6c1353807cda18b28678a719bd68Elliott Hughes JValue result; 287f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes result.SetI(-1); 28877405796564c6c1353807cda18b28678a719bd68Elliott Hughes JValue args[4]; 289f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes args[0].SetI(0); 290f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes args[1].SetI(0); 291f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes args[2].SetI(0); 292f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes args[3].SetI(0); 29377405796564c6c1353807cda18b28678a719bd68Elliott Hughes (*stub)(method, NULL, Thread::Current(), args, &result); 294f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes EXPECT_EQ(0, result.GetI()); 29577405796564c6c1353807cda18b28678a719bd68Elliott Hughes 296f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes result.SetI(0); 297f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes args[0].SetI(1); 298f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes args[1].SetI(2); 299f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes args[2].SetI(3); 300f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes args[3].SetI(4); 30177405796564c6c1353807cda18b28678a719bd68Elliott Hughes (*stub)(method, NULL, Thread::Current(), args, &result); 302f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes EXPECT_EQ(10, result.GetI()); 30377405796564c6c1353807cda18b28678a719bd68Elliott Hughes 304f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes result.SetI(0); 305f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes args[0].SetI(-1); 306f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes args[1].SetI(2); 307f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes args[2].SetI(-3); 308f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes args[3].SetI(4); 30977405796564c6c1353807cda18b28678a719bd68Elliott Hughes (*stub)(method, NULL, Thread::Current(), args, &result); 310f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes EXPECT_EQ(2, result.GetI()); 31177405796564c6c1353807cda18b28678a719bd68Elliott Hughes 312f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes result.SetI(1234); 313f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes args[0].SetI(INT_MAX); 314f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes args[1].SetI(INT_MIN); 315f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes args[2].SetI(INT_MAX); 316f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes args[3].SetI(INT_MIN); 31777405796564c6c1353807cda18b28678a719bd68Elliott Hughes (*stub)(method, NULL, Thread::Current(), args, &result); 318f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes EXPECT_EQ(-2, result.GetI()); 31977405796564c6c1353807cda18b28678a719bd68Elliott Hughes 320f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes result.SetI(INT_MIN); 321f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes args[0].SetI(INT_MAX); 322f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes args[1].SetI(INT_MAX); 323f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes args[2].SetI(INT_MAX); 324f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes args[3].SetI(INT_MAX); 32577405796564c6c1353807cda18b28678a719bd68Elliott Hughes (*stub)(method, NULL, Thread::Current(), args, &result); 326f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes EXPECT_EQ(-4, result.GetI()); 32777405796564c6c1353807cda18b28678a719bd68Elliott Hughes } 32877405796564c6c1353807cda18b28678a719bd68Elliott Hughes 32900f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers void InvokeSumIntIntIntIntIntMethod(bool is_static) 33000f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers SHARED_LOCKS_REQUIRED(GlobalSynchronization::mutator_lock_) { 33177405796564c6c1353807cda18b28678a719bd68Elliott Hughes Method* method; 33277405796564c6c1353807cda18b28678a719bd68Elliott Hughes Object* receiver; 33377405796564c6c1353807cda18b28678a719bd68Elliott Hughes Method::InvokeStub* stub = DoCompile(method, receiver, is_static, "sum", "(IIIII)I"); 33477405796564c6c1353807cda18b28678a719bd68Elliott Hughes 33577405796564c6c1353807cda18b28678a719bd68Elliott Hughes JValue result; 336f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes result.SetI(-1.0); 33777405796564c6c1353807cda18b28678a719bd68Elliott Hughes JValue args[5]; 338f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes args[0].SetI(0); 339f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes args[1].SetI(0); 340f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes args[2].SetI(0); 341f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes args[3].SetI(0); 342f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes args[4].SetI(0); 34377405796564c6c1353807cda18b28678a719bd68Elliott Hughes (*stub)(method, NULL, Thread::Current(), args, &result); 344f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes EXPECT_EQ(0, result.GetI()); 345f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes 346f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes result.SetI(0); 347f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes args[0].SetI(1); 348f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes args[1].SetI(2); 349f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes args[2].SetI(3); 350f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes args[3].SetI(4); 351f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes args[4].SetI(5); 35277405796564c6c1353807cda18b28678a719bd68Elliott Hughes (*stub)(method, NULL, Thread::Current(), args, &result); 353f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes EXPECT_EQ(15, result.GetI()); 354f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes 355f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes result.SetI(0); 356f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes args[0].SetI(-1); 357f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes args[1].SetI(2); 358f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes args[2].SetI(-3); 359f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes args[3].SetI(4); 360f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes args[4].SetI(-5); 36177405796564c6c1353807cda18b28678a719bd68Elliott Hughes (*stub)(method, NULL, Thread::Current(), args, &result); 362f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes EXPECT_EQ(-3, result.GetI()); 363f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes 364f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes result.SetI(1234); 365f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes args[0].SetI(INT_MAX); 366f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes args[1].SetI(INT_MIN); 367f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes args[2].SetI(INT_MAX); 368f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes args[3].SetI(INT_MIN); 369f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes args[4].SetI(INT_MAX); 37077405796564c6c1353807cda18b28678a719bd68Elliott Hughes (*stub)(method, NULL, Thread::Current(), args, &result); 371f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes EXPECT_EQ(2147483645, result.GetI()); 372f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes 373f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes result.SetI(INT_MIN); 374f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes args[0].SetI(INT_MAX); 375f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes args[1].SetI(INT_MAX); 376f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes args[2].SetI(INT_MAX); 377f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes args[3].SetI(INT_MAX); 378f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes args[4].SetI(INT_MAX); 37977405796564c6c1353807cda18b28678a719bd68Elliott Hughes (*stub)(method, NULL, Thread::Current(), args, &result); 380f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes EXPECT_EQ(2147483643, result.GetI()); 38177405796564c6c1353807cda18b28678a719bd68Elliott Hughes } 38277405796564c6c1353807cda18b28678a719bd68Elliott Hughes 38300f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers void InvokeSumDoubleDoubleMethod(bool is_static) 38400f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers SHARED_LOCKS_REQUIRED(GlobalSynchronization::mutator_lock_) { 38577405796564c6c1353807cda18b28678a719bd68Elliott Hughes Method* method; 38677405796564c6c1353807cda18b28678a719bd68Elliott Hughes Object* receiver; 38777405796564c6c1353807cda18b28678a719bd68Elliott Hughes Method::InvokeStub* stub = DoCompile(method, receiver, is_static, "sum", "(DD)D"); 38877405796564c6c1353807cda18b28678a719bd68Elliott Hughes 38977405796564c6c1353807cda18b28678a719bd68Elliott Hughes JValue args[2]; 39077405796564c6c1353807cda18b28678a719bd68Elliott Hughes JValue result; 39177405796564c6c1353807cda18b28678a719bd68Elliott Hughes 392f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes args[0].SetD(0.0); 393f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes args[1].SetD(0.0); 394f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes result.SetD(-1.0); 39577405796564c6c1353807cda18b28678a719bd68Elliott Hughes (*stub)(method, NULL, Thread::Current(), args, &result); 396f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes EXPECT_EQ(0.0, result.GetD()); 39777405796564c6c1353807cda18b28678a719bd68Elliott Hughes 398f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes args[0].SetD(1.0); 399f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes args[1].SetD(2.0); 400f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes result.SetD(0.0); 40177405796564c6c1353807cda18b28678a719bd68Elliott Hughes (*stub)(method, NULL, Thread::Current(), args, &result); 402f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes EXPECT_EQ(3.0, result.GetD()); 40377405796564c6c1353807cda18b28678a719bd68Elliott Hughes 404f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes args[0].SetD(1.0); 405f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes args[1].SetD(-2.0); 406f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes result.SetD(0.0); 40777405796564c6c1353807cda18b28678a719bd68Elliott Hughes (*stub)(method, NULL, Thread::Current(), args, &result); 408f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes EXPECT_EQ(-1.0, result.GetD()); 40977405796564c6c1353807cda18b28678a719bd68Elliott Hughes 410f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes args[0].SetD(DBL_MAX); 411f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes args[1].SetD(DBL_MIN); 412f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes result.SetD(0.0); 41377405796564c6c1353807cda18b28678a719bd68Elliott Hughes (*stub)(method, NULL, Thread::Current(), args, &result); 414f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes EXPECT_EQ(1.7976931348623157e308, result.GetD()); 41577405796564c6c1353807cda18b28678a719bd68Elliott Hughes 416f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes args[0].SetD(DBL_MAX); 417f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes args[1].SetD(DBL_MAX); 418f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes result.SetD(0.0); 41977405796564c6c1353807cda18b28678a719bd68Elliott Hughes (*stub)(method, NULL, Thread::Current(), args, &result); 420f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes EXPECT_EQ(INFINITY, result.GetD()); 42177405796564c6c1353807cda18b28678a719bd68Elliott Hughes } 42277405796564c6c1353807cda18b28678a719bd68Elliott Hughes 42300f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers void InvokeSumDoubleDoubleDoubleMethod(bool is_static) 42400f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers SHARED_LOCKS_REQUIRED(GlobalSynchronization::mutator_lock_) { 42577405796564c6c1353807cda18b28678a719bd68Elliott Hughes Method* method; 42677405796564c6c1353807cda18b28678a719bd68Elliott Hughes Object* receiver; 42777405796564c6c1353807cda18b28678a719bd68Elliott Hughes Method::InvokeStub* stub = DoCompile(method, receiver, is_static, "sum", "(DDD)D"); 42877405796564c6c1353807cda18b28678a719bd68Elliott Hughes 42977405796564c6c1353807cda18b28678a719bd68Elliott Hughes JValue args[3]; 43077405796564c6c1353807cda18b28678a719bd68Elliott Hughes JValue result; 43177405796564c6c1353807cda18b28678a719bd68Elliott Hughes 432f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes args[0].SetD(0.0); 433f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes args[1].SetD(0.0); 434f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes args[2].SetD(0.0); 435f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes result.SetD(-1.0); 43677405796564c6c1353807cda18b28678a719bd68Elliott Hughes (*stub)(method, NULL, Thread::Current(), args, &result); 437f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes EXPECT_EQ(0.0, result.GetD()); 43877405796564c6c1353807cda18b28678a719bd68Elliott Hughes 439f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes args[0].SetD(1.0); 440f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes args[1].SetD(2.0); 441f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes args[2].SetD(3.0); 442f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes result.SetD(0.0); 44377405796564c6c1353807cda18b28678a719bd68Elliott Hughes (*stub)(method, NULL, Thread::Current(), args, &result); 444f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes EXPECT_EQ(6.0, result.GetD()); 44577405796564c6c1353807cda18b28678a719bd68Elliott Hughes 446f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes args[0].SetD(1.0); 447f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes args[1].SetD(-2.0); 448f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes args[2].SetD(3.0); 449f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes result.SetD(0.0); 45077405796564c6c1353807cda18b28678a719bd68Elliott Hughes (*stub)(method, NULL, Thread::Current(), args, &result); 451f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes EXPECT_EQ(2.0, result.GetD()); 45277405796564c6c1353807cda18b28678a719bd68Elliott Hughes } 45377405796564c6c1353807cda18b28678a719bd68Elliott Hughes 45400f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers void InvokeSumDoubleDoubleDoubleDoubleMethod(bool is_static) 45500f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers SHARED_LOCKS_REQUIRED(GlobalSynchronization::mutator_lock_) { 45677405796564c6c1353807cda18b28678a719bd68Elliott Hughes Method* method; 45777405796564c6c1353807cda18b28678a719bd68Elliott Hughes Object* receiver; 45877405796564c6c1353807cda18b28678a719bd68Elliott Hughes Method::InvokeStub* stub = DoCompile(method, receiver, is_static, "sum", "(DDDD)D"); 45977405796564c6c1353807cda18b28678a719bd68Elliott Hughes 46077405796564c6c1353807cda18b28678a719bd68Elliott Hughes JValue args[4]; 46177405796564c6c1353807cda18b28678a719bd68Elliott Hughes JValue result; 46277405796564c6c1353807cda18b28678a719bd68Elliott Hughes 463f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes args[0].SetD(0.0); 464f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes args[1].SetD(0.0); 465f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes args[2].SetD(0.0); 466f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes args[3].SetD(0.0); 467f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes result.SetD(-1.0); 46877405796564c6c1353807cda18b28678a719bd68Elliott Hughes (*stub)(method, NULL, Thread::Current(), args, &result); 469f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes EXPECT_EQ(0.0, result.GetD()); 47077405796564c6c1353807cda18b28678a719bd68Elliott Hughes 471f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes args[0].SetD(1.0); 472f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes args[1].SetD(2.0); 473f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes args[2].SetD(3.0); 474f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes args[3].SetD(4.0); 475f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes result.SetD(0.0); 47677405796564c6c1353807cda18b28678a719bd68Elliott Hughes (*stub)(method, NULL, Thread::Current(), args, &result); 477f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes EXPECT_EQ(10.0, result.GetD()); 47877405796564c6c1353807cda18b28678a719bd68Elliott Hughes 479f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes args[0].SetD(1.0); 480f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes args[1].SetD(-2.0); 481f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes args[2].SetD(3.0); 482f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes args[3].SetD(-4.0); 483f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes result.SetD(0.0); 48477405796564c6c1353807cda18b28678a719bd68Elliott Hughes (*stub)(method, NULL, Thread::Current(), args, &result); 485f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes EXPECT_EQ(-2.0, result.GetD()); 48677405796564c6c1353807cda18b28678a719bd68Elliott Hughes } 48777405796564c6c1353807cda18b28678a719bd68Elliott Hughes 48800f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers void InvokeSumDoubleDoubleDoubleDoubleDoubleMethod(bool is_static) 48900f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers SHARED_LOCKS_REQUIRED(GlobalSynchronization::mutator_lock_) { 49077405796564c6c1353807cda18b28678a719bd68Elliott Hughes Method* method; 49177405796564c6c1353807cda18b28678a719bd68Elliott Hughes Object* receiver; 49277405796564c6c1353807cda18b28678a719bd68Elliott Hughes Method::InvokeStub* stub = DoCompile(method, receiver, is_static, "sum", "(DDDDD)D"); 49377405796564c6c1353807cda18b28678a719bd68Elliott Hughes 49477405796564c6c1353807cda18b28678a719bd68Elliott Hughes JValue args[5]; 49577405796564c6c1353807cda18b28678a719bd68Elliott Hughes JValue result; 49677405796564c6c1353807cda18b28678a719bd68Elliott Hughes 497f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes args[0].SetD(0.0); 498f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes args[1].SetD(0.0); 499f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes args[2].SetD(0.0); 500f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes args[3].SetD(0.0); 501f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes args[4].SetD(0.0); 502f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes result.SetD(-1.0); 50377405796564c6c1353807cda18b28678a719bd68Elliott Hughes (*stub)(method, NULL, Thread::Current(), args, &result); 504f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes EXPECT_EQ(0.0, result.GetD()); 505f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes 506f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes args[0].SetD(1.0); 507f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes args[1].SetD(2.0); 508f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes args[2].SetD(3.0); 509f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes args[3].SetD(4.0); 510f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes args[4].SetD(5.0); 511f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes result.SetD(0.0); 51277405796564c6c1353807cda18b28678a719bd68Elliott Hughes (*stub)(method, NULL, Thread::Current(), args, &result); 513f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes EXPECT_EQ(15.0, result.GetD()); 514f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes 515f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes args[0].SetD(1.0); 516f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes args[1].SetD(-2.0); 517f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes args[2].SetD(3.0); 518f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes args[3].SetD(-4.0); 519f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes args[4].SetD(5.0); 520f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes result.SetD(0.0); 52177405796564c6c1353807cda18b28678a719bd68Elliott Hughes (*stub)(method, NULL, Thread::Current(), args, &result); 522f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes EXPECT_EQ(3.0, result.GetD()); 52377405796564c6c1353807cda18b28678a719bd68Elliott Hughes } 52477405796564c6c1353807cda18b28678a719bd68Elliott Hughes 525a2501990dd0f68baf38ce19251949d7bb3ecfe5aElliott Hughes JavaVMExt* vm_; 5264d5714378c3433ba7e351cbf6a6713fb49c31784Brian Carlstrom JNIEnv* env_; 527814e40397fe6c8a2c645bae99f356dbddd6dbe18Elliott Hughes jclass aioobe_; 528b264f081424642b06b0bbe7102781895d41faa9dElliott Hughes jclass ase_; 529b465ab0e103d7760df903c1fddf4fa6b89d5d1f5Elliott Hughes jclass sioobe_; 5300c9cd5692fbbc5d92fcdc1ef41ef881a492b00ceElliott Hughes}; 5310c9cd5692fbbc5d92fcdc1ef41ef881a492b00ceElliott Hughes 532885c3bd4d7adcc7f60f656b4f7247e7065feadf3Elliott HughesTEST_F(JniInternalTest, AllocObject) { 533885c3bd4d7adcc7f60f656b4f7247e7065feadf3Elliott Hughes jclass c = env_->FindClass("java/lang/String"); 534885c3bd4d7adcc7f60f656b4f7247e7065feadf3Elliott Hughes ASSERT_TRUE(c != NULL); 535885c3bd4d7adcc7f60f656b4f7247e7065feadf3Elliott Hughes jobject o = env_->AllocObject(c); 536885c3bd4d7adcc7f60f656b4f7247e7065feadf3Elliott Hughes ASSERT_TRUE(o != NULL); 537885c3bd4d7adcc7f60f656b4f7247e7065feadf3Elliott Hughes 538885c3bd4d7adcc7f60f656b4f7247e7065feadf3Elliott Hughes // We have an instance of the class we asked for... 539885c3bd4d7adcc7f60f656b4f7247e7065feadf3Elliott Hughes ASSERT_TRUE(env_->IsInstanceOf(o, c)); 540885c3bd4d7adcc7f60f656b4f7247e7065feadf3Elliott Hughes // ...whose fields haven't been initialized because 541885c3bd4d7adcc7f60f656b4f7247e7065feadf3Elliott Hughes // we didn't call a constructor. 542885c3bd4d7adcc7f60f656b4f7247e7065feadf3Elliott Hughes ASSERT_EQ(0, env_->GetIntField(o, env_->GetFieldID(c, "count", "I"))); 543885c3bd4d7adcc7f60f656b4f7247e7065feadf3Elliott Hughes ASSERT_EQ(0, env_->GetIntField(o, env_->GetFieldID(c, "offset", "I"))); 544885c3bd4d7adcc7f60f656b4f7247e7065feadf3Elliott Hughes ASSERT_TRUE(env_->GetObjectField(o, env_->GetFieldID(c, "value", "[C")) == NULL); 545885c3bd4d7adcc7f60f656b4f7247e7065feadf3Elliott Hughes} 546885c3bd4d7adcc7f60f656b4f7247e7065feadf3Elliott Hughes 547c7ac37f0b8b64cfb53d8b9cc8dddbb34be3dd5eeElliott HughesTEST_F(JniInternalTest, GetVersion) { 548c7ac37f0b8b64cfb53d8b9cc8dddbb34be3dd5eeElliott Hughes ASSERT_EQ(JNI_VERSION_1_6, env_->GetVersion()); 549c7ac37f0b8b64cfb53d8b9cc8dddbb34be3dd5eeElliott Hughes} 550c7ac37f0b8b64cfb53d8b9cc8dddbb34be3dd5eeElliott Hughes 5510c9cd5692fbbc5d92fcdc1ef41ef881a492b00ceElliott Hughes#define EXPECT_CLASS_FOUND(NAME) \ 552bd9359912e5398799f60649b86ae80644ec72627Elliott Hughes EXPECT_TRUE(env_->FindClass(NAME) != NULL); \ 553bd9359912e5398799f60649b86ae80644ec72627Elliott Hughes EXPECT_FALSE(env_->ExceptionCheck()) 5540c9cd5692fbbc5d92fcdc1ef41ef881a492b00ceElliott Hughes 5550c9cd5692fbbc5d92fcdc1ef41ef881a492b00ceElliott Hughes#define EXPECT_CLASS_NOT_FOUND(NAME) \ 556bd9359912e5398799f60649b86ae80644ec72627Elliott Hughes EXPECT_TRUE(env_->FindClass(NAME) == NULL); \ 557bd9359912e5398799f60649b86ae80644ec72627Elliott Hughes EXPECT_TRUE(env_->ExceptionCheck()); \ 558bd9359912e5398799f60649b86ae80644ec72627Elliott Hughes env_->ExceptionClear() 5590c9cd5692fbbc5d92fcdc1ef41ef881a492b00ceElliott Hughes 5600c9cd5692fbbc5d92fcdc1ef41ef881a492b00ceElliott HughesTEST_F(JniInternalTest, FindClass) { 5610c9cd5692fbbc5d92fcdc1ef41ef881a492b00ceElliott Hughes // Reference types... 5620c9cd5692fbbc5d92fcdc1ef41ef881a492b00ceElliott Hughes EXPECT_CLASS_FOUND("java/lang/String"); 5630c9cd5692fbbc5d92fcdc1ef41ef881a492b00ceElliott Hughes // ...for arrays too, where you must include "L;". 5640c9cd5692fbbc5d92fcdc1ef41ef881a492b00ceElliott Hughes EXPECT_CLASS_FOUND("[Ljava/lang/String;"); 5653f6635a2c84d645002f651c312d53f8348646c1fElliott Hughes // Primitive arrays are okay too, if the primitive type is valid. 5663f6635a2c84d645002f651c312d53f8348646c1fElliott Hughes EXPECT_CLASS_FOUND("[C"); 567a2501990dd0f68baf38ce19251949d7bb3ecfe5aElliott Hughes 568b264f081424642b06b0bbe7102781895d41faa9dElliott Hughes { 569b264f081424642b06b0bbe7102781895d41faa9dElliott Hughes // We support . as well as / for compatibility, if -Xcheck:jni is off. 5703f6635a2c84d645002f651c312d53f8348646c1fElliott Hughes CheckJniAbortCatcher check_jni_abort_catcher; 571b264f081424642b06b0bbe7102781895d41faa9dElliott Hughes EXPECT_CLASS_FOUND("java.lang.String"); 57256ef042065ce282f8f01a0f31f5cce868a60ede8Elliott Hughes check_jni_abort_catcher.Check("illegal class name 'java.lang.String'"); 573b264f081424642b06b0bbe7102781895d41faa9dElliott Hughes EXPECT_CLASS_NOT_FOUND("Ljava.lang.String;"); 57456ef042065ce282f8f01a0f31f5cce868a60ede8Elliott Hughes check_jni_abort_catcher.Check("illegal class name 'Ljava.lang.String;'"); 575b264f081424642b06b0bbe7102781895d41faa9dElliott Hughes EXPECT_CLASS_FOUND("[Ljava.lang.String;"); 57656ef042065ce282f8f01a0f31f5cce868a60ede8Elliott Hughes check_jni_abort_catcher.Check("illegal class name '[Ljava.lang.String;'"); 577b264f081424642b06b0bbe7102781895d41faa9dElliott Hughes EXPECT_CLASS_NOT_FOUND("[java.lang.String"); 57856ef042065ce282f8f01a0f31f5cce868a60ede8Elliott Hughes check_jni_abort_catcher.Check("illegal class name '[java.lang.String'"); 579b264f081424642b06b0bbe7102781895d41faa9dElliott Hughes 580b264f081424642b06b0bbe7102781895d41faa9dElliott Hughes // You can't include the "L;" in a JNI class descriptor. 581b264f081424642b06b0bbe7102781895d41faa9dElliott Hughes EXPECT_CLASS_NOT_FOUND("Ljava/lang/String;"); 58256ef042065ce282f8f01a0f31f5cce868a60ede8Elliott Hughes check_jni_abort_catcher.Check("illegal class name 'Ljava/lang/String;'"); 5833f6635a2c84d645002f651c312d53f8348646c1fElliott Hughes 584b264f081424642b06b0bbe7102781895d41faa9dElliott Hughes // But you must include it for an array of any reference type. 585b264f081424642b06b0bbe7102781895d41faa9dElliott Hughes EXPECT_CLASS_NOT_FOUND("[java/lang/String"); 58656ef042065ce282f8f01a0f31f5cce868a60ede8Elliott Hughes check_jni_abort_catcher.Check("illegal class name '[java/lang/String'"); 587a2501990dd0f68baf38ce19251949d7bb3ecfe5aElliott Hughes 588b264f081424642b06b0bbe7102781895d41faa9dElliott Hughes EXPECT_CLASS_NOT_FOUND("[K"); 58956ef042065ce282f8f01a0f31f5cce868a60ede8Elliott Hughes check_jni_abort_catcher.Check("illegal class name '[K'"); 590b264f081424642b06b0bbe7102781895d41faa9dElliott Hughes } 5913f6635a2c84d645002f651c312d53f8348646c1fElliott Hughes 5920c9cd5692fbbc5d92fcdc1ef41ef881a492b00ceElliott Hughes // But primitive types aren't allowed... 5930c9cd5692fbbc5d92fcdc1ef41ef881a492b00ceElliott Hughes EXPECT_CLASS_NOT_FOUND("C"); 5940c9cd5692fbbc5d92fcdc1ef41ef881a492b00ceElliott Hughes EXPECT_CLASS_NOT_FOUND("K"); 5950c9cd5692fbbc5d92fcdc1ef41ef881a492b00ceElliott Hughes} 5960c9cd5692fbbc5d92fcdc1ef41ef881a492b00ceElliott Hughes 597cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes#define EXPECT_EXCEPTION(exception_class) \ 598cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes do { \ 599cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes EXPECT_TRUE(env_->ExceptionCheck()); \ 600cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes jthrowable exception = env_->ExceptionOccurred(); \ 601cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes EXPECT_NE(static_cast<jthrowable>(NULL), exception); \ 602cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes env_->ExceptionClear(); \ 603a2501990dd0f68baf38ce19251949d7bb3ecfe5aElliott Hughes EXPECT_TRUE(env_->IsInstanceOf(exception, exception_class)); \ 604cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes } while (false) 605cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes 606cdf53120cd5a73cbedc1654e22542848468c0d2fElliott HughesTEST_F(JniInternalTest, GetFieldID) { 607cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes jclass jlnsfe = env_->FindClass("java/lang/NoSuchFieldError"); 608cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes ASSERT_TRUE(jlnsfe != NULL); 609cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes jclass c = env_->FindClass("java/lang/String"); 610cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes ASSERT_TRUE(c != NULL); 611cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes 612cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes // Wrong type. 613cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes jfieldID fid = env_->GetFieldID(c, "count", "J"); 614cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes EXPECT_EQ(static_cast<jfieldID>(NULL), fid); 615cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes EXPECT_EXCEPTION(jlnsfe); 616cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes 617b17d08b6ef0d36038e408dd79960293bb62ec1d9Ian Rogers // Wrong type where type doesn't exist. 618b17d08b6ef0d36038e408dd79960293bb62ec1d9Ian Rogers fid = env_->GetFieldID(c, "count", "Lrod/jane/freddy;"); 619b17d08b6ef0d36038e408dd79960293bb62ec1d9Ian Rogers EXPECT_EQ(static_cast<jfieldID>(NULL), fid); 620b17d08b6ef0d36038e408dd79960293bb62ec1d9Ian Rogers EXPECT_EXCEPTION(jlnsfe); 621b17d08b6ef0d36038e408dd79960293bb62ec1d9Ian Rogers 622cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes // Wrong name. 623cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes fid = env_->GetFieldID(c, "Count", "I"); 624cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes EXPECT_EQ(static_cast<jfieldID>(NULL), fid); 625cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes EXPECT_EXCEPTION(jlnsfe); 626cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes 627cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes // Good declared field lookup. 628cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes fid = env_->GetFieldID(c, "count", "I"); 629cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes EXPECT_NE(static_cast<jfieldID>(NULL), fid); 630cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes EXPECT_TRUE(fid != NULL); 631cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes EXPECT_FALSE(env_->ExceptionCheck()); 632cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes 633cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes // Good superclass field lookup. 634cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes c = env_->FindClass("java/lang/StringBuilder"); 635cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes fid = env_->GetFieldID(c, "count", "I"); 636cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes EXPECT_NE(static_cast<jfieldID>(NULL), fid); 637cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes EXPECT_TRUE(fid != NULL); 638cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes EXPECT_FALSE(env_->ExceptionCheck()); 639cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes 640cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes // Not instance. 641cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes fid = env_->GetFieldID(c, "CASE_INSENSITIVE_ORDER", "Ljava/util/Comparator;"); 642cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes EXPECT_EQ(static_cast<jfieldID>(NULL), fid); 643cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes EXPECT_EXCEPTION(jlnsfe); 644cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes} 645cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes 646cdf53120cd5a73cbedc1654e22542848468c0d2fElliott HughesTEST_F(JniInternalTest, GetStaticFieldID) { 647cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes jclass jlnsfe = env_->FindClass("java/lang/NoSuchFieldError"); 648cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes ASSERT_TRUE(jlnsfe != NULL); 649cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes jclass c = env_->FindClass("java/lang/String"); 650cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes ASSERT_TRUE(c != NULL); 651cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes 652cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes // Wrong type. 653cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes jfieldID fid = env_->GetStaticFieldID(c, "CASE_INSENSITIVE_ORDER", "J"); 654cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes EXPECT_EQ(static_cast<jfieldID>(NULL), fid); 655cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes EXPECT_EXCEPTION(jlnsfe); 656cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes 657b17d08b6ef0d36038e408dd79960293bb62ec1d9Ian Rogers // Wrong type where type doesn't exist. 658b17d08b6ef0d36038e408dd79960293bb62ec1d9Ian Rogers fid = env_->GetStaticFieldID(c, "CASE_INSENSITIVE_ORDER", "Lrod/jane/freddy;"); 659b17d08b6ef0d36038e408dd79960293bb62ec1d9Ian Rogers EXPECT_EQ(static_cast<jfieldID>(NULL), fid); 660b17d08b6ef0d36038e408dd79960293bb62ec1d9Ian Rogers EXPECT_EXCEPTION(jlnsfe); 661b17d08b6ef0d36038e408dd79960293bb62ec1d9Ian Rogers 662cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes // Wrong name. 663cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes fid = env_->GetStaticFieldID(c, "cASE_INSENSITIVE_ORDER", "Ljava/util/Comparator;"); 664cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes EXPECT_EQ(static_cast<jfieldID>(NULL), fid); 665cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes EXPECT_EXCEPTION(jlnsfe); 666cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes 667cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes // Good declared field lookup. 668cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes fid = env_->GetStaticFieldID(c, "CASE_INSENSITIVE_ORDER", "Ljava/util/Comparator;"); 669cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes EXPECT_NE(static_cast<jfieldID>(NULL), fid); 670cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes EXPECT_TRUE(fid != NULL); 671cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes EXPECT_FALSE(env_->ExceptionCheck()); 672cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes 673cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes // Not static. 674cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes fid = env_->GetStaticFieldID(c, "count", "I"); 675cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes EXPECT_EQ(static_cast<jfieldID>(NULL), fid); 676cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes EXPECT_EXCEPTION(jlnsfe); 677cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes} 678cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes 6794dd71f1538a8d788c56c77378a59ce32afa519d7Ian RogersTEST_F(JniInternalTest, GetMethodID) { 6804dd71f1538a8d788c56c77378a59ce32afa519d7Ian Rogers jclass jlobject = env_->FindClass("java/lang/Object"); 6814dd71f1538a8d788c56c77378a59ce32afa519d7Ian Rogers jclass jlstring = env_->FindClass("java/lang/String"); 6824dd71f1538a8d788c56c77378a59ce32afa519d7Ian Rogers jclass jlnsme = env_->FindClass("java/lang/NoSuchMethodError"); 6834dd71f1538a8d788c56c77378a59ce32afa519d7Ian Rogers 6844dd71f1538a8d788c56c77378a59ce32afa519d7Ian Rogers // Sanity check that no exceptions are pending 685cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes ASSERT_FALSE(env_->ExceptionCheck()); 6864dd71f1538a8d788c56c77378a59ce32afa519d7Ian Rogers 6874dd71f1538a8d788c56c77378a59ce32afa519d7Ian Rogers // Check that java.lang.Object.foo() doesn't exist and NoSuchMethodError is 6884dd71f1538a8d788c56c77378a59ce32afa519d7Ian Rogers // a pending exception 6894dd71f1538a8d788c56c77378a59ce32afa519d7Ian Rogers jmethodID method = env_->GetMethodID(jlobject, "foo", "()V"); 6904dd71f1538a8d788c56c77378a59ce32afa519d7Ian Rogers EXPECT_EQ(static_cast<jmethodID>(NULL), method); 691cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes EXPECT_EXCEPTION(jlnsme); 6924dd71f1538a8d788c56c77378a59ce32afa519d7Ian Rogers 6934dd71f1538a8d788c56c77378a59ce32afa519d7Ian Rogers // Check that java.lang.Object.equals() does exist 6944dd71f1538a8d788c56c77378a59ce32afa519d7Ian Rogers method = env_->GetMethodID(jlobject, "equals", "(Ljava/lang/Object;)Z"); 6954dd71f1538a8d788c56c77378a59ce32afa519d7Ian Rogers EXPECT_NE(static_cast<jmethodID>(NULL), method); 6964dd71f1538a8d788c56c77378a59ce32afa519d7Ian Rogers EXPECT_FALSE(env_->ExceptionCheck()); 6974dd71f1538a8d788c56c77378a59ce32afa519d7Ian Rogers 6984dd71f1538a8d788c56c77378a59ce32afa519d7Ian Rogers // Check that GetMethodID for java.lang.String.valueOf(int) fails as the 6994dd71f1538a8d788c56c77378a59ce32afa519d7Ian Rogers // method is static 7004dd71f1538a8d788c56c77378a59ce32afa519d7Ian Rogers method = env_->GetMethodID(jlstring, "valueOf", "(I)Ljava/lang/String;"); 7014dd71f1538a8d788c56c77378a59ce32afa519d7Ian Rogers EXPECT_EQ(static_cast<jmethodID>(NULL), method); 702cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes EXPECT_EXCEPTION(jlnsme); 7034dd71f1538a8d788c56c77378a59ce32afa519d7Ian Rogers} 7044dd71f1538a8d788c56c77378a59ce32afa519d7Ian Rogers 7054dd71f1538a8d788c56c77378a59ce32afa519d7Ian RogersTEST_F(JniInternalTest, GetStaticMethodID) { 7064dd71f1538a8d788c56c77378a59ce32afa519d7Ian Rogers jclass jlobject = env_->FindClass("java/lang/Object"); 7074dd71f1538a8d788c56c77378a59ce32afa519d7Ian Rogers jclass jlnsme = env_->FindClass("java/lang/NoSuchMethodError"); 7084dd71f1538a8d788c56c77378a59ce32afa519d7Ian Rogers 7094dd71f1538a8d788c56c77378a59ce32afa519d7Ian Rogers // Sanity check that no exceptions are pending 710cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes ASSERT_FALSE(env_->ExceptionCheck()); 7114dd71f1538a8d788c56c77378a59ce32afa519d7Ian Rogers 7124dd71f1538a8d788c56c77378a59ce32afa519d7Ian Rogers // Check that java.lang.Object.foo() doesn't exist and NoSuchMethodError is 7134dd71f1538a8d788c56c77378a59ce32afa519d7Ian Rogers // a pending exception 7144dd71f1538a8d788c56c77378a59ce32afa519d7Ian Rogers jmethodID method = env_->GetStaticMethodID(jlobject, "foo", "()V"); 7154dd71f1538a8d788c56c77378a59ce32afa519d7Ian Rogers EXPECT_EQ(static_cast<jmethodID>(NULL), method); 716cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes EXPECT_EXCEPTION(jlnsme); 7174dd71f1538a8d788c56c77378a59ce32afa519d7Ian Rogers 7184dd71f1538a8d788c56c77378a59ce32afa519d7Ian Rogers // Check that GetStaticMethodID for java.lang.Object.equals(Object) fails as 7194dd71f1538a8d788c56c77378a59ce32afa519d7Ian Rogers // the method is not static 7204dd71f1538a8d788c56c77378a59ce32afa519d7Ian Rogers method = env_->GetStaticMethodID(jlobject, "equals", "(Ljava/lang/Object;)Z"); 7214dd71f1538a8d788c56c77378a59ce32afa519d7Ian Rogers EXPECT_EQ(static_cast<jmethodID>(NULL), method); 722cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes EXPECT_EXCEPTION(jlnsme); 7234dd71f1538a8d788c56c77378a59ce32afa519d7Ian Rogers 7244dd71f1538a8d788c56c77378a59ce32afa519d7Ian Rogers // Check that java.lang.String.valueOf(int) does exist 7254dd71f1538a8d788c56c77378a59ce32afa519d7Ian Rogers jclass jlstring = env_->FindClass("java/lang/String"); 7264dd71f1538a8d788c56c77378a59ce32afa519d7Ian Rogers method = env_->GetStaticMethodID(jlstring, "valueOf", 7274dd71f1538a8d788c56c77378a59ce32afa519d7Ian Rogers "(I)Ljava/lang/String;"); 7284dd71f1538a8d788c56c77378a59ce32afa519d7Ian Rogers EXPECT_NE(static_cast<jmethodID>(NULL), method); 7294dd71f1538a8d788c56c77378a59ce32afa519d7Ian Rogers EXPECT_FALSE(env_->ExceptionCheck()); 7304dd71f1538a8d788c56c77378a59ce32afa519d7Ian Rogers} 7314dd71f1538a8d788c56c77378a59ce32afa519d7Ian Rogers 732cdf53120cd5a73cbedc1654e22542848468c0d2fElliott HughesTEST_F(JniInternalTest, FromReflectedField_ToReflectedField) { 733cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes jclass jlrField = env_->FindClass("java/lang/reflect/Field"); 734cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes jclass c = env_->FindClass("java/lang/String"); 735cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes ASSERT_TRUE(c != NULL); 736cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes jfieldID fid = env_->GetFieldID(c, "count", "I"); 737cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes ASSERT_TRUE(fid != NULL); 738cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes // Turn the fid into a java.lang.reflect.Field... 739cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes jobject field = env_->ToReflectedField(c, fid, JNI_FALSE); 740cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes ASSERT_TRUE(c != NULL); 741cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes ASSERT_TRUE(env_->IsInstanceOf(field, jlrField)); 742cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes // ...and back again. 743cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes jfieldID fid2 = env_->FromReflectedField(field); 744cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes ASSERT_TRUE(fid2 != NULL); 745cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes} 746cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes 747cdf53120cd5a73cbedc1654e22542848468c0d2fElliott HughesTEST_F(JniInternalTest, FromReflectedMethod_ToReflectedMethod) { 748cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes jclass jlrMethod = env_->FindClass("java/lang/reflect/Method"); 749cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes jclass c = env_->FindClass("java/lang/String"); 750cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes ASSERT_TRUE(c != NULL); 751cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes jmethodID mid = env_->GetMethodID(c, "length", "()I"); 752cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes ASSERT_TRUE(mid != NULL); 753cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes // Turn the mid into a java.lang.reflect.Method... 754cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes jobject method = env_->ToReflectedMethod(c, mid, JNI_FALSE); 755cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes ASSERT_TRUE(c != NULL); 756cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes ASSERT_TRUE(env_->IsInstanceOf(method, jlrMethod)); 757cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes // ...and back again. 758cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes jmethodID mid2 = env_->FromReflectedMethod(method); 759cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes ASSERT_TRUE(mid2 != NULL); 760cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes} 761cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes 7625174fe6e4e931c423e910366ff22ce0838567940Elliott Hughesvoid BogusMethod() { 7635174fe6e4e931c423e910366ff22ce0838567940Elliott Hughes // You can't pass NULL function pointers to RegisterNatives. 7645174fe6e4e931c423e910366ff22ce0838567940Elliott Hughes} 7655174fe6e4e931c423e910366ff22ce0838567940Elliott Hughes 7664dd71f1538a8d788c56c77378a59ce32afa519d7Ian RogersTEST_F(JniInternalTest, RegisterNatives) { 7674dd71f1538a8d788c56c77378a59ce32afa519d7Ian Rogers jclass jlobject = env_->FindClass("java/lang/Object"); 7684dd71f1538a8d788c56c77378a59ce32afa519d7Ian Rogers jclass jlnsme = env_->FindClass("java/lang/NoSuchMethodError"); 7694dd71f1538a8d788c56c77378a59ce32afa519d7Ian Rogers 7704dd71f1538a8d788c56c77378a59ce32afa519d7Ian Rogers // Sanity check that no exceptions are pending 771cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes ASSERT_FALSE(env_->ExceptionCheck()); 7724dd71f1538a8d788c56c77378a59ce32afa519d7Ian Rogers 7734dd71f1538a8d788c56c77378a59ce32afa519d7Ian Rogers // Check that registering to a non-existent java.lang.Object.foo() causes a 7744dd71f1538a8d788c56c77378a59ce32afa519d7Ian Rogers // NoSuchMethodError 7754dd71f1538a8d788c56c77378a59ce32afa519d7Ian Rogers { 776b25c3f6a86dc634ce44fb2849385b49465caa84dElliott Hughes JNINativeMethod methods[] = { { "foo", "()V", NULL } }; 7774dd71f1538a8d788c56c77378a59ce32afa519d7Ian Rogers env_->RegisterNatives(jlobject, methods, 1); 7784dd71f1538a8d788c56c77378a59ce32afa519d7Ian Rogers } 779cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes EXPECT_EXCEPTION(jlnsme); 7804dd71f1538a8d788c56c77378a59ce32afa519d7Ian Rogers 7814dd71f1538a8d788c56c77378a59ce32afa519d7Ian Rogers // Check that registering non-native methods causes a NoSuchMethodError 7824dd71f1538a8d788c56c77378a59ce32afa519d7Ian Rogers { 783b25c3f6a86dc634ce44fb2849385b49465caa84dElliott Hughes JNINativeMethod methods[] = { { "equals", "(Ljava/lang/Object;)Z", NULL } }; 7844dd71f1538a8d788c56c77378a59ce32afa519d7Ian Rogers env_->RegisterNatives(jlobject, methods, 1); 7854dd71f1538a8d788c56c77378a59ce32afa519d7Ian Rogers } 786cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes EXPECT_EXCEPTION(jlnsme); 7874dd71f1538a8d788c56c77378a59ce32afa519d7Ian Rogers 7884dd71f1538a8d788c56c77378a59ce32afa519d7Ian Rogers // Check that registering native methods is successful 7894dd71f1538a8d788c56c77378a59ce32afa519d7Ian Rogers { 790b25c3f6a86dc634ce44fb2849385b49465caa84dElliott Hughes JNINativeMethod methods[] = { { "notify", "()V", reinterpret_cast<void*>(BogusMethod) } }; 7914dd71f1538a8d788c56c77378a59ce32afa519d7Ian Rogers env_->RegisterNatives(jlobject, methods, 1); 7924dd71f1538a8d788c56c77378a59ce32afa519d7Ian Rogers } 7934dd71f1538a8d788c56c77378a59ce32afa519d7Ian Rogers EXPECT_FALSE(env_->ExceptionCheck()); 7945174fe6e4e931c423e910366ff22ce0838567940Elliott Hughes 7955174fe6e4e931c423e910366ff22ce0838567940Elliott Hughes env_->UnregisterNatives(jlobject); 7964dd71f1538a8d788c56c77378a59ce32afa519d7Ian Rogers} 7974dd71f1538a8d788c56c77378a59ce32afa519d7Ian Rogers 7987577075b147fd8fa37ca41e7a32d1124676776ceElliott Hughes#define EXPECT_PRIMITIVE_ARRAY(new_fn, get_region_fn, set_region_fn, get_elements_fn, release_elements_fn, scalar_type, expected_class_descriptor) \ 799814e40397fe6c8a2c645bae99f356dbddd6dbe18Elliott Hughes jsize size = 4; \ 800814e40397fe6c8a2c645bae99f356dbddd6dbe18Elliott Hughes /* Allocate an array and check it has the right type and length. */ \ 801814e40397fe6c8a2c645bae99f356dbddd6dbe18Elliott Hughes scalar_type ## Array a = env_->new_fn(size); \ 802814e40397fe6c8a2c645bae99f356dbddd6dbe18Elliott Hughes EXPECT_TRUE(a != NULL); \ 803814e40397fe6c8a2c645bae99f356dbddd6dbe18Elliott Hughes EXPECT_TRUE(env_->IsInstanceOf(a, env_->FindClass(expected_class_descriptor))); \ 804814e40397fe6c8a2c645bae99f356dbddd6dbe18Elliott Hughes EXPECT_EQ(size, env_->GetArrayLength(a)); \ 805814e40397fe6c8a2c645bae99f356dbddd6dbe18Elliott Hughes /* AIOOBE for negative start offset. */ \ 806814e40397fe6c8a2c645bae99f356dbddd6dbe18Elliott Hughes env_->get_region_fn(a, -1, 1, NULL); \ 807814e40397fe6c8a2c645bae99f356dbddd6dbe18Elliott Hughes EXPECT_EXCEPTION(aioobe_); \ 808814e40397fe6c8a2c645bae99f356dbddd6dbe18Elliott Hughes env_->set_region_fn(a, -1, 1, NULL); \ 809814e40397fe6c8a2c645bae99f356dbddd6dbe18Elliott Hughes EXPECT_EXCEPTION(aioobe_); \ 810814e40397fe6c8a2c645bae99f356dbddd6dbe18Elliott Hughes /* AIOOBE for negative length. */ \ 811814e40397fe6c8a2c645bae99f356dbddd6dbe18Elliott Hughes env_->get_region_fn(a, 0, -1, NULL); \ 812814e40397fe6c8a2c645bae99f356dbddd6dbe18Elliott Hughes EXPECT_EXCEPTION(aioobe_); \ 813814e40397fe6c8a2c645bae99f356dbddd6dbe18Elliott Hughes env_->set_region_fn(a, 0, -1, NULL); \ 814814e40397fe6c8a2c645bae99f356dbddd6dbe18Elliott Hughes EXPECT_EXCEPTION(aioobe_); \ 815814e40397fe6c8a2c645bae99f356dbddd6dbe18Elliott Hughes /* AIOOBE for buffer overrun. */ \ 816814e40397fe6c8a2c645bae99f356dbddd6dbe18Elliott Hughes env_->get_region_fn(a, size - 1, size, NULL); \ 817814e40397fe6c8a2c645bae99f356dbddd6dbe18Elliott Hughes EXPECT_EXCEPTION(aioobe_); \ 818814e40397fe6c8a2c645bae99f356dbddd6dbe18Elliott Hughes env_->set_region_fn(a, size - 1, size, NULL); \ 819814e40397fe6c8a2c645bae99f356dbddd6dbe18Elliott Hughes EXPECT_EXCEPTION(aioobe_); \ 820814e40397fe6c8a2c645bae99f356dbddd6dbe18Elliott Hughes /* Prepare a couple of buffers. */ \ 821ee0fa76b2e5d39ad36d1ff144b2d0270df81e606Elliott Hughes UniquePtr<scalar_type[]> src_buf(new scalar_type[size]); \ 822ee0fa76b2e5d39ad36d1ff144b2d0270df81e606Elliott Hughes UniquePtr<scalar_type[]> dst_buf(new scalar_type[size]); \ 823814e40397fe6c8a2c645bae99f356dbddd6dbe18Elliott Hughes for (jsize i = 0; i < size; ++i) { src_buf[i] = scalar_type(i); } \ 824814e40397fe6c8a2c645bae99f356dbddd6dbe18Elliott Hughes for (jsize i = 0; i < size; ++i) { dst_buf[i] = scalar_type(-1); } \ 825814e40397fe6c8a2c645bae99f356dbddd6dbe18Elliott Hughes /* Copy all of src_buf onto the heap. */ \ 826ee0fa76b2e5d39ad36d1ff144b2d0270df81e606Elliott Hughes env_->set_region_fn(a, 0, size, &src_buf[0]); \ 827814e40397fe6c8a2c645bae99f356dbddd6dbe18Elliott Hughes /* Copy back only part. */ \ 828814e40397fe6c8a2c645bae99f356dbddd6dbe18Elliott Hughes env_->get_region_fn(a, 1, size - 2, &dst_buf[1]); \ 829ee0fa76b2e5d39ad36d1ff144b2d0270df81e606Elliott Hughes EXPECT_NE(memcmp(&src_buf[0], &dst_buf[0], size * sizeof(scalar_type)), 0) << "short copy equal"; \ 830814e40397fe6c8a2c645bae99f356dbddd6dbe18Elliott Hughes /* Copy the missing pieces. */ \ 831ee0fa76b2e5d39ad36d1ff144b2d0270df81e606Elliott Hughes env_->get_region_fn(a, 0, 1, &dst_buf[0]); \ 832814e40397fe6c8a2c645bae99f356dbddd6dbe18Elliott Hughes env_->get_region_fn(a, size - 1, 1, &dst_buf[size - 1]); \ 833ee0fa76b2e5d39ad36d1ff144b2d0270df81e606Elliott Hughes EXPECT_EQ(memcmp(&src_buf[0], &dst_buf[0], size * sizeof(scalar_type)), 0) << "fixed copy not equal"; \ 834814e40397fe6c8a2c645bae99f356dbddd6dbe18Elliott Hughes /* Copy back the whole array. */ \ 835ee0fa76b2e5d39ad36d1ff144b2d0270df81e606Elliott Hughes env_->get_region_fn(a, 0, size, &dst_buf[0]); \ 836ee0fa76b2e5d39ad36d1ff144b2d0270df81e606Elliott Hughes EXPECT_EQ(memcmp(&src_buf[0], &dst_buf[0], size * sizeof(scalar_type)), 0) << "full copy not equal"; \ 8377577075b147fd8fa37ca41e7a32d1124676776ceElliott Hughes /* GetPrimitiveArrayCritical */ \ 8387577075b147fd8fa37ca41e7a32d1124676776ceElliott Hughes void* v = env_->GetPrimitiveArrayCritical(a, NULL); \ 839ee0fa76b2e5d39ad36d1ff144b2d0270df81e606Elliott Hughes EXPECT_EQ(memcmp(&src_buf[0], v, size * sizeof(scalar_type)), 0) << "GetPrimitiveArrayCritical not equal"; \ 8407577075b147fd8fa37ca41e7a32d1124676776ceElliott Hughes env_->ReleasePrimitiveArrayCritical(a, v, 0); \ 8417577075b147fd8fa37ca41e7a32d1124676776ceElliott Hughes /* GetXArrayElements */ \ 8427577075b147fd8fa37ca41e7a32d1124676776ceElliott Hughes scalar_type* xs = env_->get_elements_fn(a, NULL); \ 843ee0fa76b2e5d39ad36d1ff144b2d0270df81e606Elliott Hughes EXPECT_EQ(memcmp(&src_buf[0], xs, size * sizeof(scalar_type)), 0) << # get_elements_fn " not equal"; \ 8447577075b147fd8fa37ca41e7a32d1124676776ceElliott Hughes env_->release_elements_fn(a, xs, 0); \ 8457577075b147fd8fa37ca41e7a32d1124676776ceElliott Hughes EXPECT_EQ(reinterpret_cast<uintptr_t>(v), reinterpret_cast<uintptr_t>(xs)) 846814e40397fe6c8a2c645bae99f356dbddd6dbe18Elliott Hughes 847814e40397fe6c8a2c645bae99f356dbddd6dbe18Elliott HughesTEST_F(JniInternalTest, BooleanArrays) { 8487577075b147fd8fa37ca41e7a32d1124676776ceElliott Hughes EXPECT_PRIMITIVE_ARRAY(NewBooleanArray, GetBooleanArrayRegion, SetBooleanArrayRegion, GetBooleanArrayElements, ReleaseBooleanArrayElements, jboolean, "[Z"); 849814e40397fe6c8a2c645bae99f356dbddd6dbe18Elliott Hughes} 850814e40397fe6c8a2c645bae99f356dbddd6dbe18Elliott HughesTEST_F(JniInternalTest, ByteArrays) { 8517577075b147fd8fa37ca41e7a32d1124676776ceElliott Hughes EXPECT_PRIMITIVE_ARRAY(NewByteArray, GetByteArrayRegion, SetByteArrayRegion, GetByteArrayElements, ReleaseByteArrayElements, jbyte, "[B"); 852814e40397fe6c8a2c645bae99f356dbddd6dbe18Elliott Hughes} 853814e40397fe6c8a2c645bae99f356dbddd6dbe18Elliott HughesTEST_F(JniInternalTest, CharArrays) { 8547577075b147fd8fa37ca41e7a32d1124676776ceElliott Hughes EXPECT_PRIMITIVE_ARRAY(NewCharArray, GetCharArrayRegion, SetCharArrayRegion, GetCharArrayElements, ReleaseCharArrayElements, jchar, "[C"); 855814e40397fe6c8a2c645bae99f356dbddd6dbe18Elliott Hughes} 856814e40397fe6c8a2c645bae99f356dbddd6dbe18Elliott HughesTEST_F(JniInternalTest, DoubleArrays) { 8577577075b147fd8fa37ca41e7a32d1124676776ceElliott Hughes EXPECT_PRIMITIVE_ARRAY(NewDoubleArray, GetDoubleArrayRegion, SetDoubleArrayRegion, GetDoubleArrayElements, ReleaseDoubleArrayElements, jdouble, "[D"); 858814e40397fe6c8a2c645bae99f356dbddd6dbe18Elliott Hughes} 859814e40397fe6c8a2c645bae99f356dbddd6dbe18Elliott HughesTEST_F(JniInternalTest, FloatArrays) { 8607577075b147fd8fa37ca41e7a32d1124676776ceElliott Hughes EXPECT_PRIMITIVE_ARRAY(NewFloatArray, GetFloatArrayRegion, SetFloatArrayRegion, GetFloatArrayElements, ReleaseFloatArrayElements, jfloat, "[F"); 861814e40397fe6c8a2c645bae99f356dbddd6dbe18Elliott Hughes} 862814e40397fe6c8a2c645bae99f356dbddd6dbe18Elliott HughesTEST_F(JniInternalTest, IntArrays) { 8637577075b147fd8fa37ca41e7a32d1124676776ceElliott Hughes EXPECT_PRIMITIVE_ARRAY(NewIntArray, GetIntArrayRegion, SetIntArrayRegion, GetIntArrayElements, ReleaseIntArrayElements, jint, "[I"); 864814e40397fe6c8a2c645bae99f356dbddd6dbe18Elliott Hughes} 865814e40397fe6c8a2c645bae99f356dbddd6dbe18Elliott HughesTEST_F(JniInternalTest, LongArrays) { 8667577075b147fd8fa37ca41e7a32d1124676776ceElliott Hughes EXPECT_PRIMITIVE_ARRAY(NewLongArray, GetLongArrayRegion, SetLongArrayRegion, GetLongArrayElements, ReleaseLongArrayElements, jlong, "[J"); 867814e40397fe6c8a2c645bae99f356dbddd6dbe18Elliott Hughes} 868814e40397fe6c8a2c645bae99f356dbddd6dbe18Elliott HughesTEST_F(JniInternalTest, ShortArrays) { 8697577075b147fd8fa37ca41e7a32d1124676776ceElliott Hughes EXPECT_PRIMITIVE_ARRAY(NewShortArray, GetShortArrayRegion, SetShortArrayRegion, GetShortArrayElements, ReleaseShortArrayElements, jshort, "[S"); 870d8ddfd5eadde1d5f53ef1419f529c799233eaa62Elliott Hughes} 871d8ddfd5eadde1d5f53ef1419f529c799233eaa62Elliott Hughes 872f2682d5a6ce0f7de58da8fd4ec8aec200c43b92eElliott HughesTEST_F(JniInternalTest, NewObjectArray) { 873f2682d5a6ce0f7de58da8fd4ec8aec200c43b92eElliott Hughes // TODO: death tests for negative array sizes. 874f2682d5a6ce0f7de58da8fd4ec8aec200c43b92eElliott Hughes 875bd9359912e5398799f60649b86ae80644ec72627Elliott Hughes // TODO: check non-NULL initial elements. 876f2682d5a6ce0f7de58da8fd4ec8aec200c43b92eElliott Hughes 877bd9359912e5398799f60649b86ae80644ec72627Elliott Hughes jclass element_class = env_->FindClass("java/lang/String"); 878bd9359912e5398799f60649b86ae80644ec72627Elliott Hughes ASSERT_TRUE(element_class != NULL); 879bd9359912e5398799f60649b86ae80644ec72627Elliott Hughes jclass array_class = env_->FindClass("[Ljava/lang/String;"); 880bd9359912e5398799f60649b86ae80644ec72627Elliott Hughes ASSERT_TRUE(array_class != NULL); 881f2682d5a6ce0f7de58da8fd4ec8aec200c43b92eElliott Hughes 882bd9359912e5398799f60649b86ae80644ec72627Elliott Hughes jobjectArray a; 883f2682d5a6ce0f7de58da8fd4ec8aec200c43b92eElliott Hughes 884bd9359912e5398799f60649b86ae80644ec72627Elliott Hughes a = env_->NewObjectArray(0, element_class, NULL); 885bd9359912e5398799f60649b86ae80644ec72627Elliott Hughes EXPECT_TRUE(a != NULL); 886bd9359912e5398799f60649b86ae80644ec72627Elliott Hughes EXPECT_TRUE(env_->IsInstanceOf(a, array_class)); 887bd9359912e5398799f60649b86ae80644ec72627Elliott Hughes EXPECT_EQ(0, env_->GetArrayLength(a)); 888f2682d5a6ce0f7de58da8fd4ec8aec200c43b92eElliott Hughes 889bd9359912e5398799f60649b86ae80644ec72627Elliott Hughes a = env_->NewObjectArray(1, element_class, NULL); 890bd9359912e5398799f60649b86ae80644ec72627Elliott Hughes EXPECT_TRUE(a != NULL); 891bd9359912e5398799f60649b86ae80644ec72627Elliott Hughes EXPECT_TRUE(env_->IsInstanceOf(a, array_class)); 892bd9359912e5398799f60649b86ae80644ec72627Elliott Hughes EXPECT_EQ(1, env_->GetArrayLength(a)); 8937577075b147fd8fa37ca41e7a32d1124676776ceElliott Hughes EXPECT_TRUE(env_->IsSameObject(env_->GetObjectArrayElement(a, 0), NULL)); 8947577075b147fd8fa37ca41e7a32d1124676776ceElliott Hughes 8957577075b147fd8fa37ca41e7a32d1124676776ceElliott Hughes jstring s = env_->NewStringUTF("poop"); 8967577075b147fd8fa37ca41e7a32d1124676776ceElliott Hughes a = env_->NewObjectArray(2, element_class, s); 8977577075b147fd8fa37ca41e7a32d1124676776ceElliott Hughes EXPECT_TRUE(a != NULL); 8987577075b147fd8fa37ca41e7a32d1124676776ceElliott Hughes EXPECT_TRUE(env_->IsInstanceOf(a, array_class)); 8997577075b147fd8fa37ca41e7a32d1124676776ceElliott Hughes EXPECT_EQ(2, env_->GetArrayLength(a)); 9007577075b147fd8fa37ca41e7a32d1124676776ceElliott Hughes EXPECT_TRUE(env_->IsSameObject(env_->GetObjectArrayElement(a, 0), s)); 9017577075b147fd8fa37ca41e7a32d1124676776ceElliott Hughes EXPECT_TRUE(env_->IsSameObject(env_->GetObjectArrayElement(a, 1), s)); 902bd9359912e5398799f60649b86ae80644ec72627Elliott Hughes} 903f2682d5a6ce0f7de58da8fd4ec8aec200c43b92eElliott Hughes 904bd9359912e5398799f60649b86ae80644ec72627Elliott HughesTEST_F(JniInternalTest, GetArrayLength) { 905bd9359912e5398799f60649b86ae80644ec72627Elliott Hughes // Already tested in NewObjectArray/NewPrimitiveArray. 9068a26c5c4c74b09e2887593c733a22652a9f80d7cElliott Hughes} 9078a26c5c4c74b09e2887593c733a22652a9f80d7cElliott Hughes 90837f7a40f6789bb287f287a9af00777af9d6428eeElliott HughesTEST_F(JniInternalTest, GetObjectClass) { 90937f7a40f6789bb287f287a9af00777af9d6428eeElliott Hughes jclass string_class = env_->FindClass("java/lang/String"); 91037f7a40f6789bb287f287a9af00777af9d6428eeElliott Hughes ASSERT_TRUE(string_class != NULL); 91137f7a40f6789bb287f287a9af00777af9d6428eeElliott Hughes jclass class_class = env_->FindClass("java/lang/Class"); 91237f7a40f6789bb287f287a9af00777af9d6428eeElliott Hughes ASSERT_TRUE(class_class != NULL); 91337f7a40f6789bb287f287a9af00777af9d6428eeElliott Hughes 91437f7a40f6789bb287f287a9af00777af9d6428eeElliott Hughes jstring s = env_->NewStringUTF("poop"); 91537f7a40f6789bb287f287a9af00777af9d6428eeElliott Hughes jclass c = env_->GetObjectClass(s); 91637f7a40f6789bb287f287a9af00777af9d6428eeElliott Hughes ASSERT_TRUE(env_->IsSameObject(string_class, c)); 91737f7a40f6789bb287f287a9af00777af9d6428eeElliott Hughes 91837f7a40f6789bb287f287a9af00777af9d6428eeElliott Hughes jclass c2 = env_->GetObjectClass(c); 91937f7a40f6789bb287f287a9af00777af9d6428eeElliott Hughes ASSERT_TRUE(env_->IsSameObject(class_class, env_->GetObjectClass(c2))); 92037f7a40f6789bb287f287a9af00777af9d6428eeElliott Hughes} 92137f7a40f6789bb287f287a9af00777af9d6428eeElliott Hughes 922885c3bd4d7adcc7f60f656b4f7247e7065feadf3Elliott HughesTEST_F(JniInternalTest, GetSuperclass) { 923885c3bd4d7adcc7f60f656b4f7247e7065feadf3Elliott Hughes jclass object_class = env_->FindClass("java/lang/Object"); 924885c3bd4d7adcc7f60f656b4f7247e7065feadf3Elliott Hughes ASSERT_TRUE(object_class != NULL); 925885c3bd4d7adcc7f60f656b4f7247e7065feadf3Elliott Hughes jclass string_class = env_->FindClass("java/lang/String"); 926885c3bd4d7adcc7f60f656b4f7247e7065feadf3Elliott Hughes ASSERT_TRUE(string_class != NULL); 927dc18020e83aa1261d4f661f1f9330bda20dffd71Ian Rogers jclass runnable_interface = env_->FindClass("java/lang/Runnable"); 928dc18020e83aa1261d4f661f1f9330bda20dffd71Ian Rogers ASSERT_TRUE(runnable_interface != NULL); 929885c3bd4d7adcc7f60f656b4f7247e7065feadf3Elliott Hughes ASSERT_TRUE(env_->IsSameObject(object_class, env_->GetSuperclass(string_class))); 930885c3bd4d7adcc7f60f656b4f7247e7065feadf3Elliott Hughes ASSERT_TRUE(env_->GetSuperclass(object_class) == NULL); 931dc18020e83aa1261d4f661f1f9330bda20dffd71Ian Rogers ASSERT_TRUE(env_->IsSameObject(object_class, env_->GetSuperclass(runnable_interface))); 932885c3bd4d7adcc7f60f656b4f7247e7065feadf3Elliott Hughes} 933885c3bd4d7adcc7f60f656b4f7247e7065feadf3Elliott Hughes 93437f7a40f6789bb287f287a9af00777af9d6428eeElliott HughesTEST_F(JniInternalTest, IsAssignableFrom) { 93537f7a40f6789bb287f287a9af00777af9d6428eeElliott Hughes jclass object_class = env_->FindClass("java/lang/Object"); 93637f7a40f6789bb287f287a9af00777af9d6428eeElliott Hughes ASSERT_TRUE(object_class != NULL); 93737f7a40f6789bb287f287a9af00777af9d6428eeElliott Hughes jclass string_class = env_->FindClass("java/lang/String"); 93837f7a40f6789bb287f287a9af00777af9d6428eeElliott Hughes ASSERT_TRUE(string_class != NULL); 93937f7a40f6789bb287f287a9af00777af9d6428eeElliott Hughes 94037f7a40f6789bb287f287a9af00777af9d6428eeElliott Hughes ASSERT_TRUE(env_->IsAssignableFrom(object_class, string_class)); 94137f7a40f6789bb287f287a9af00777af9d6428eeElliott Hughes ASSERT_FALSE(env_->IsAssignableFrom(string_class, object_class)); 94237f7a40f6789bb287f287a9af00777af9d6428eeElliott Hughes} 94337f7a40f6789bb287f287a9af00777af9d6428eeElliott Hughes 944b465ab0e103d7760df903c1fddf4fa6b89d5d1f5Elliott HughesTEST_F(JniInternalTest, GetObjectRefType) { 945b465ab0e103d7760df903c1fddf4fa6b89d5d1f5Elliott Hughes jclass local = env_->FindClass("java/lang/Object"); 946b465ab0e103d7760df903c1fddf4fa6b89d5d1f5Elliott Hughes ASSERT_TRUE(local != NULL); 947b465ab0e103d7760df903c1fddf4fa6b89d5d1f5Elliott Hughes EXPECT_EQ(JNILocalRefType, env_->GetObjectRefType(local)); 948b465ab0e103d7760df903c1fddf4fa6b89d5d1f5Elliott Hughes 949b465ab0e103d7760df903c1fddf4fa6b89d5d1f5Elliott Hughes jobject global = env_->NewGlobalRef(local); 950b465ab0e103d7760df903c1fddf4fa6b89d5d1f5Elliott Hughes EXPECT_EQ(JNIGlobalRefType, env_->GetObjectRefType(global)); 951b465ab0e103d7760df903c1fddf4fa6b89d5d1f5Elliott Hughes 952b465ab0e103d7760df903c1fddf4fa6b89d5d1f5Elliott Hughes jweak weak_global = env_->NewWeakGlobalRef(local); 953b465ab0e103d7760df903c1fddf4fa6b89d5d1f5Elliott Hughes EXPECT_EQ(JNIWeakGlobalRefType, env_->GetObjectRefType(weak_global)); 954b465ab0e103d7760df903c1fddf4fa6b89d5d1f5Elliott Hughes 955b465ab0e103d7760df903c1fddf4fa6b89d5d1f5Elliott Hughes jobject invalid = reinterpret_cast<jobject>(this); 956b465ab0e103d7760df903c1fddf4fa6b89d5d1f5Elliott Hughes EXPECT_EQ(JNIInvalidRefType, env_->GetObjectRefType(invalid)); 957b465ab0e103d7760df903c1fddf4fa6b89d5d1f5Elliott Hughes 958b465ab0e103d7760df903c1fddf4fa6b89d5d1f5Elliott Hughes // TODO: invoke a native method and test that its arguments are considered local references. 959b465ab0e103d7760df903c1fddf4fa6b89d5d1f5Elliott Hughes} 960b465ab0e103d7760df903c1fddf4fa6b89d5d1f5Elliott Hughes 9618a26c5c4c74b09e2887593c733a22652a9f80d7cElliott HughesTEST_F(JniInternalTest, NewStringUTF) { 9628a26c5c4c74b09e2887593c733a22652a9f80d7cElliott Hughes EXPECT_TRUE(env_->NewStringUTF(NULL) == NULL); 963814e40397fe6c8a2c645bae99f356dbddd6dbe18Elliott Hughes jstring s; 964814e40397fe6c8a2c645bae99f356dbddd6dbe18Elliott Hughes 965814e40397fe6c8a2c645bae99f356dbddd6dbe18Elliott Hughes s = env_->NewStringUTF(""); 966814e40397fe6c8a2c645bae99f356dbddd6dbe18Elliott Hughes EXPECT_TRUE(s != NULL); 967814e40397fe6c8a2c645bae99f356dbddd6dbe18Elliott Hughes EXPECT_EQ(0, env_->GetStringLength(s)); 968814e40397fe6c8a2c645bae99f356dbddd6dbe18Elliott Hughes EXPECT_EQ(0, env_->GetStringUTFLength(s)); 969814e40397fe6c8a2c645bae99f356dbddd6dbe18Elliott Hughes s = env_->NewStringUTF("hello"); 970814e40397fe6c8a2c645bae99f356dbddd6dbe18Elliott Hughes EXPECT_TRUE(s != NULL); 971814e40397fe6c8a2c645bae99f356dbddd6dbe18Elliott Hughes EXPECT_EQ(5, env_->GetStringLength(s)); 972814e40397fe6c8a2c645bae99f356dbddd6dbe18Elliott Hughes EXPECT_EQ(5, env_->GetStringUTFLength(s)); 973814e40397fe6c8a2c645bae99f356dbddd6dbe18Elliott Hughes 974814e40397fe6c8a2c645bae99f356dbddd6dbe18Elliott Hughes // TODO: check some non-ASCII strings. 975814e40397fe6c8a2c645bae99f356dbddd6dbe18Elliott Hughes} 976814e40397fe6c8a2c645bae99f356dbddd6dbe18Elliott Hughes 977814e40397fe6c8a2c645bae99f356dbddd6dbe18Elliott HughesTEST_F(JniInternalTest, NewString) { 978814e40397fe6c8a2c645bae99f356dbddd6dbe18Elliott Hughes jchar chars[] = { 'h', 'i' }; 979814e40397fe6c8a2c645bae99f356dbddd6dbe18Elliott Hughes jstring s; 980814e40397fe6c8a2c645bae99f356dbddd6dbe18Elliott Hughes s = env_->NewString(chars, 0); 981814e40397fe6c8a2c645bae99f356dbddd6dbe18Elliott Hughes EXPECT_TRUE(s != NULL); 982814e40397fe6c8a2c645bae99f356dbddd6dbe18Elliott Hughes EXPECT_EQ(0, env_->GetStringLength(s)); 983814e40397fe6c8a2c645bae99f356dbddd6dbe18Elliott Hughes EXPECT_EQ(0, env_->GetStringUTFLength(s)); 984814e40397fe6c8a2c645bae99f356dbddd6dbe18Elliott Hughes s = env_->NewString(chars, 2); 985814e40397fe6c8a2c645bae99f356dbddd6dbe18Elliott Hughes EXPECT_TRUE(s != NULL); 986814e40397fe6c8a2c645bae99f356dbddd6dbe18Elliott Hughes EXPECT_EQ(2, env_->GetStringLength(s)); 987814e40397fe6c8a2c645bae99f356dbddd6dbe18Elliott Hughes EXPECT_EQ(2, env_->GetStringUTFLength(s)); 988814e40397fe6c8a2c645bae99f356dbddd6dbe18Elliott Hughes 9898a26c5c4c74b09e2887593c733a22652a9f80d7cElliott Hughes // TODO: check some non-ASCII strings. 990f2682d5a6ce0f7de58da8fd4ec8aec200c43b92eElliott Hughes} 991f2682d5a6ce0f7de58da8fd4ec8aec200c43b92eElliott Hughes 99225e79a5e9ecd4bf30e0ea90a7dd4313f7f44bc3cJesse WilsonTEST_F(JniInternalTest, NewStringNullCharsZeroLength) { 99325e79a5e9ecd4bf30e0ea90a7dd4313f7f44bc3cJesse Wilson jstring s = env_->NewString(NULL, 0); 99425e79a5e9ecd4bf30e0ea90a7dd4313f7f44bc3cJesse Wilson EXPECT_TRUE(s != NULL); 99525e79a5e9ecd4bf30e0ea90a7dd4313f7f44bc3cJesse Wilson EXPECT_EQ(0, env_->GetStringLength(s)); 99625e79a5e9ecd4bf30e0ea90a7dd4313f7f44bc3cJesse Wilson} 99725e79a5e9ecd4bf30e0ea90a7dd4313f7f44bc3cJesse Wilson 9983625812ec5673193bc67ee52b1377fe39b536c9aBrian Carlstrom// TODO: fix gtest death tests on host http://b/5690440 (and target) 9993625812ec5673193bc67ee52b1377fe39b536c9aBrian CarlstromTEST_F(JniInternalTest, DISABLED_NewStringNullCharsNonzeroLength) { 100025e79a5e9ecd4bf30e0ea90a7dd4313f7f44bc3cJesse Wilson ASSERT_DEATH(env_->NewString(NULL, 1), ""); 100125e79a5e9ecd4bf30e0ea90a7dd4313f7f44bc3cJesse Wilson} 100225e79a5e9ecd4bf30e0ea90a7dd4313f7f44bc3cJesse Wilson 1003b465ab0e103d7760df903c1fddf4fa6b89d5d1f5Elliott HughesTEST_F(JniInternalTest, GetStringLength_GetStringUTFLength) { 1004b465ab0e103d7760df903c1fddf4fa6b89d5d1f5Elliott Hughes // Already tested in the NewString/NewStringUTF tests. 1005b465ab0e103d7760df903c1fddf4fa6b89d5d1f5Elliott Hughes} 1006b465ab0e103d7760df903c1fddf4fa6b89d5d1f5Elliott Hughes 1007b465ab0e103d7760df903c1fddf4fa6b89d5d1f5Elliott HughesTEST_F(JniInternalTest, GetStringRegion_GetStringUTFRegion) { 1008b465ab0e103d7760df903c1fddf4fa6b89d5d1f5Elliott Hughes jstring s = env_->NewStringUTF("hello"); 1009b465ab0e103d7760df903c1fddf4fa6b89d5d1f5Elliott Hughes ASSERT_TRUE(s != NULL); 1010b465ab0e103d7760df903c1fddf4fa6b89d5d1f5Elliott Hughes 1011b465ab0e103d7760df903c1fddf4fa6b89d5d1f5Elliott Hughes env_->GetStringRegion(s, -1, 0, NULL); 1012b465ab0e103d7760df903c1fddf4fa6b89d5d1f5Elliott Hughes EXPECT_EXCEPTION(sioobe_); 1013b465ab0e103d7760df903c1fddf4fa6b89d5d1f5Elliott Hughes env_->GetStringRegion(s, 0, -1, NULL); 1014b465ab0e103d7760df903c1fddf4fa6b89d5d1f5Elliott Hughes EXPECT_EXCEPTION(sioobe_); 1015b465ab0e103d7760df903c1fddf4fa6b89d5d1f5Elliott Hughes env_->GetStringRegion(s, 0, 10, NULL); 1016b465ab0e103d7760df903c1fddf4fa6b89d5d1f5Elliott Hughes EXPECT_EXCEPTION(sioobe_); 1017b465ab0e103d7760df903c1fddf4fa6b89d5d1f5Elliott Hughes env_->GetStringRegion(s, 10, 1, NULL); 1018b465ab0e103d7760df903c1fddf4fa6b89d5d1f5Elliott Hughes EXPECT_EXCEPTION(sioobe_); 1019b465ab0e103d7760df903c1fddf4fa6b89d5d1f5Elliott Hughes 1020b465ab0e103d7760df903c1fddf4fa6b89d5d1f5Elliott Hughes jchar chars[4] = { 'x', 'x', 'x', 'x' }; 1021b465ab0e103d7760df903c1fddf4fa6b89d5d1f5Elliott Hughes env_->GetStringRegion(s, 1, 2, &chars[1]); 1022b465ab0e103d7760df903c1fddf4fa6b89d5d1f5Elliott Hughes EXPECT_EQ('x', chars[0]); 1023b465ab0e103d7760df903c1fddf4fa6b89d5d1f5Elliott Hughes EXPECT_EQ('e', chars[1]); 1024b465ab0e103d7760df903c1fddf4fa6b89d5d1f5Elliott Hughes EXPECT_EQ('l', chars[2]); 1025b465ab0e103d7760df903c1fddf4fa6b89d5d1f5Elliott Hughes EXPECT_EQ('x', chars[3]); 1026b465ab0e103d7760df903c1fddf4fa6b89d5d1f5Elliott Hughes 1027b465ab0e103d7760df903c1fddf4fa6b89d5d1f5Elliott Hughes env_->GetStringUTFRegion(s, -1, 0, NULL); 1028b465ab0e103d7760df903c1fddf4fa6b89d5d1f5Elliott Hughes EXPECT_EXCEPTION(sioobe_); 1029b465ab0e103d7760df903c1fddf4fa6b89d5d1f5Elliott Hughes env_->GetStringUTFRegion(s, 0, -1, NULL); 1030b465ab0e103d7760df903c1fddf4fa6b89d5d1f5Elliott Hughes EXPECT_EXCEPTION(sioobe_); 1031b465ab0e103d7760df903c1fddf4fa6b89d5d1f5Elliott Hughes env_->GetStringUTFRegion(s, 0, 10, NULL); 1032b465ab0e103d7760df903c1fddf4fa6b89d5d1f5Elliott Hughes EXPECT_EXCEPTION(sioobe_); 1033b465ab0e103d7760df903c1fddf4fa6b89d5d1f5Elliott Hughes env_->GetStringUTFRegion(s, 10, 1, NULL); 1034b465ab0e103d7760df903c1fddf4fa6b89d5d1f5Elliott Hughes EXPECT_EXCEPTION(sioobe_); 1035b465ab0e103d7760df903c1fddf4fa6b89d5d1f5Elliott Hughes 1036b465ab0e103d7760df903c1fddf4fa6b89d5d1f5Elliott Hughes char bytes[4] = { 'x', 'x', 'x', 'x' }; 1037b465ab0e103d7760df903c1fddf4fa6b89d5d1f5Elliott Hughes env_->GetStringUTFRegion(s, 1, 2, &bytes[1]); 1038b465ab0e103d7760df903c1fddf4fa6b89d5d1f5Elliott Hughes EXPECT_EQ('x', bytes[0]); 1039b465ab0e103d7760df903c1fddf4fa6b89d5d1f5Elliott Hughes EXPECT_EQ('e', bytes[1]); 1040b465ab0e103d7760df903c1fddf4fa6b89d5d1f5Elliott Hughes EXPECT_EQ('l', bytes[2]); 1041b465ab0e103d7760df903c1fddf4fa6b89d5d1f5Elliott Hughes EXPECT_EQ('x', bytes[3]); 1042b465ab0e103d7760df903c1fddf4fa6b89d5d1f5Elliott Hughes} 1043b465ab0e103d7760df903c1fddf4fa6b89d5d1f5Elliott Hughes 10447577075b147fd8fa37ca41e7a32d1124676776ceElliott HughesTEST_F(JniInternalTest, GetStringUTFChars_ReleaseStringUTFChars) { 10453f6635a2c84d645002f651c312d53f8348646c1fElliott Hughes // Passing in a NULL jstring is ignored normally, but caught by -Xcheck:jni. 1046b264f081424642b06b0bbe7102781895d41faa9dElliott Hughes { 1047b264f081424642b06b0bbe7102781895d41faa9dElliott Hughes CheckJniAbortCatcher check_jni_abort_catcher; 1048b264f081424642b06b0bbe7102781895d41faa9dElliott Hughes EXPECT_TRUE(env_->GetStringUTFChars(NULL, NULL) == NULL); 104956ef042065ce282f8f01a0f31f5cce868a60ede8Elliott Hughes check_jni_abort_catcher.Check("GetStringUTFChars received null jstring"); 1050b264f081424642b06b0bbe7102781895d41faa9dElliott Hughes } 10517577075b147fd8fa37ca41e7a32d1124676776ceElliott Hughes 10527577075b147fd8fa37ca41e7a32d1124676776ceElliott Hughes jstring s = env_->NewStringUTF("hello"); 10537577075b147fd8fa37ca41e7a32d1124676776ceElliott Hughes ASSERT_TRUE(s != NULL); 10547577075b147fd8fa37ca41e7a32d1124676776ceElliott Hughes 10557577075b147fd8fa37ca41e7a32d1124676776ceElliott Hughes const char* utf = env_->GetStringUTFChars(s, NULL); 10567577075b147fd8fa37ca41e7a32d1124676776ceElliott Hughes EXPECT_STREQ("hello", utf); 10577577075b147fd8fa37ca41e7a32d1124676776ceElliott Hughes env_->ReleaseStringUTFChars(s, utf); 10587577075b147fd8fa37ca41e7a32d1124676776ceElliott Hughes 10597577075b147fd8fa37ca41e7a32d1124676776ceElliott Hughes jboolean is_copy = JNI_FALSE; 10607577075b147fd8fa37ca41e7a32d1124676776ceElliott Hughes utf = env_->GetStringUTFChars(s, &is_copy); 10617577075b147fd8fa37ca41e7a32d1124676776ceElliott Hughes EXPECT_EQ(JNI_TRUE, is_copy); 10627577075b147fd8fa37ca41e7a32d1124676776ceElliott Hughes EXPECT_STREQ("hello", utf); 10637577075b147fd8fa37ca41e7a32d1124676776ceElliott Hughes env_->ReleaseStringUTFChars(s, utf); 10647577075b147fd8fa37ca41e7a32d1124676776ceElliott Hughes} 10657577075b147fd8fa37ca41e7a32d1124676776ceElliott Hughes 10667577075b147fd8fa37ca41e7a32d1124676776ceElliott HughesTEST_F(JniInternalTest, GetStringChars_ReleaseStringChars) { 10677577075b147fd8fa37ca41e7a32d1124676776ceElliott Hughes jstring s = env_->NewStringUTF("hello"); 10687577075b147fd8fa37ca41e7a32d1124676776ceElliott Hughes ASSERT_TRUE(s != NULL); 10697577075b147fd8fa37ca41e7a32d1124676776ceElliott Hughes 10707577075b147fd8fa37ca41e7a32d1124676776ceElliott Hughes jchar expected[] = { 'h', 'e', 'l', 'l', 'o' }; 10717577075b147fd8fa37ca41e7a32d1124676776ceElliott Hughes const jchar* chars = env_->GetStringChars(s, NULL); 10727577075b147fd8fa37ca41e7a32d1124676776ceElliott Hughes EXPECT_EQ(expected[0], chars[0]); 10737577075b147fd8fa37ca41e7a32d1124676776ceElliott Hughes EXPECT_EQ(expected[1], chars[1]); 10747577075b147fd8fa37ca41e7a32d1124676776ceElliott Hughes EXPECT_EQ(expected[2], chars[2]); 10757577075b147fd8fa37ca41e7a32d1124676776ceElliott Hughes EXPECT_EQ(expected[3], chars[3]); 10767577075b147fd8fa37ca41e7a32d1124676776ceElliott Hughes EXPECT_EQ(expected[4], chars[4]); 10777577075b147fd8fa37ca41e7a32d1124676776ceElliott Hughes env_->ReleaseStringChars(s, chars); 10787577075b147fd8fa37ca41e7a32d1124676776ceElliott Hughes 10797577075b147fd8fa37ca41e7a32d1124676776ceElliott Hughes jboolean is_copy = JNI_FALSE; 10807577075b147fd8fa37ca41e7a32d1124676776ceElliott Hughes chars = env_->GetStringChars(s, &is_copy); 10817577075b147fd8fa37ca41e7a32d1124676776ceElliott Hughes EXPECT_EQ(JNI_FALSE, is_copy); 10827577075b147fd8fa37ca41e7a32d1124676776ceElliott Hughes EXPECT_EQ(expected[0], chars[0]); 10837577075b147fd8fa37ca41e7a32d1124676776ceElliott Hughes EXPECT_EQ(expected[1], chars[1]); 10847577075b147fd8fa37ca41e7a32d1124676776ceElliott Hughes EXPECT_EQ(expected[2], chars[2]); 10857577075b147fd8fa37ca41e7a32d1124676776ceElliott Hughes EXPECT_EQ(expected[3], chars[3]); 10867577075b147fd8fa37ca41e7a32d1124676776ceElliott Hughes EXPECT_EQ(expected[4], chars[4]); 10877577075b147fd8fa37ca41e7a32d1124676776ceElliott Hughes env_->ReleaseStringChars(s, chars); 10887577075b147fd8fa37ca41e7a32d1124676776ceElliott Hughes} 10897577075b147fd8fa37ca41e7a32d1124676776ceElliott Hughes 10907577075b147fd8fa37ca41e7a32d1124676776ceElliott HughesTEST_F(JniInternalTest, GetStringCritical_ReleaseStringCritical) { 10917577075b147fd8fa37ca41e7a32d1124676776ceElliott Hughes jstring s = env_->NewStringUTF("hello"); 10927577075b147fd8fa37ca41e7a32d1124676776ceElliott Hughes ASSERT_TRUE(s != NULL); 10937577075b147fd8fa37ca41e7a32d1124676776ceElliott Hughes 10947577075b147fd8fa37ca41e7a32d1124676776ceElliott Hughes jchar expected[] = { 'h', 'e', 'l', 'l', 'o' }; 10957577075b147fd8fa37ca41e7a32d1124676776ceElliott Hughes const jchar* chars = env_->GetStringCritical(s, NULL); 10967577075b147fd8fa37ca41e7a32d1124676776ceElliott Hughes EXPECT_EQ(expected[0], chars[0]); 10977577075b147fd8fa37ca41e7a32d1124676776ceElliott Hughes EXPECT_EQ(expected[1], chars[1]); 10987577075b147fd8fa37ca41e7a32d1124676776ceElliott Hughes EXPECT_EQ(expected[2], chars[2]); 10997577075b147fd8fa37ca41e7a32d1124676776ceElliott Hughes EXPECT_EQ(expected[3], chars[3]); 11007577075b147fd8fa37ca41e7a32d1124676776ceElliott Hughes EXPECT_EQ(expected[4], chars[4]); 11017577075b147fd8fa37ca41e7a32d1124676776ceElliott Hughes env_->ReleaseStringCritical(s, chars); 11027577075b147fd8fa37ca41e7a32d1124676776ceElliott Hughes 11037577075b147fd8fa37ca41e7a32d1124676776ceElliott Hughes jboolean is_copy = JNI_FALSE; 11047577075b147fd8fa37ca41e7a32d1124676776ceElliott Hughes chars = env_->GetStringCritical(s, &is_copy); 11057577075b147fd8fa37ca41e7a32d1124676776ceElliott Hughes EXPECT_EQ(JNI_FALSE, is_copy); 11067577075b147fd8fa37ca41e7a32d1124676776ceElliott Hughes EXPECT_EQ(expected[0], chars[0]); 11077577075b147fd8fa37ca41e7a32d1124676776ceElliott Hughes EXPECT_EQ(expected[1], chars[1]); 11087577075b147fd8fa37ca41e7a32d1124676776ceElliott Hughes EXPECT_EQ(expected[2], chars[2]); 11097577075b147fd8fa37ca41e7a32d1124676776ceElliott Hughes EXPECT_EQ(expected[3], chars[3]); 11107577075b147fd8fa37ca41e7a32d1124676776ceElliott Hughes EXPECT_EQ(expected[4], chars[4]); 11117577075b147fd8fa37ca41e7a32d1124676776ceElliott Hughes env_->ReleaseStringCritical(s, chars); 11127577075b147fd8fa37ca41e7a32d1124676776ceElliott Hughes} 11137577075b147fd8fa37ca41e7a32d1124676776ceElliott Hughes 1114814e40397fe6c8a2c645bae99f356dbddd6dbe18Elliott HughesTEST_F(JniInternalTest, GetObjectArrayElement_SetObjectArrayElement) { 1115b264f081424642b06b0bbe7102781895d41faa9dElliott Hughes jclass java_lang_Class = env_->FindClass("java/lang/Class"); 1116b264f081424642b06b0bbe7102781895d41faa9dElliott Hughes ASSERT_TRUE(java_lang_Class != NULL); 1117289da82ae82438ab3aed1898c82fd87c16846e74Elliott Hughes 1118b264f081424642b06b0bbe7102781895d41faa9dElliott Hughes jobjectArray array = env_->NewObjectArray(1, java_lang_Class, NULL); 1119289da82ae82438ab3aed1898c82fd87c16846e74Elliott Hughes EXPECT_TRUE(array != NULL); 1120814e40397fe6c8a2c645bae99f356dbddd6dbe18Elliott Hughes EXPECT_TRUE(env_->GetObjectArrayElement(array, 0) == NULL); 1121b264f081424642b06b0bbe7102781895d41faa9dElliott Hughes env_->SetObjectArrayElement(array, 0, java_lang_Class); 1122b264f081424642b06b0bbe7102781895d41faa9dElliott Hughes EXPECT_TRUE(env_->IsSameObject(env_->GetObjectArrayElement(array, 0), java_lang_Class)); 1123a5b897eae4b6f9f9608faa9eada7ddf42bf1bfd2Elliott Hughes 1124a5b897eae4b6f9f9608faa9eada7ddf42bf1bfd2Elliott Hughes // ArrayIndexOutOfBounds for negative index. 1125b264f081424642b06b0bbe7102781895d41faa9dElliott Hughes env_->SetObjectArrayElement(array, -1, java_lang_Class); 1126814e40397fe6c8a2c645bae99f356dbddd6dbe18Elliott Hughes EXPECT_EXCEPTION(aioobe_); 1127a5b897eae4b6f9f9608faa9eada7ddf42bf1bfd2Elliott Hughes 1128a5b897eae4b6f9f9608faa9eada7ddf42bf1bfd2Elliott Hughes // ArrayIndexOutOfBounds for too-large index. 1129b264f081424642b06b0bbe7102781895d41faa9dElliott Hughes env_->SetObjectArrayElement(array, 1, java_lang_Class); 1130814e40397fe6c8a2c645bae99f356dbddd6dbe18Elliott Hughes EXPECT_EXCEPTION(aioobe_); 1131a5b897eae4b6f9f9608faa9eada7ddf42bf1bfd2Elliott Hughes 1132b264f081424642b06b0bbe7102781895d41faa9dElliott Hughes // ArrayStoreException thrown for bad types. 1133b264f081424642b06b0bbe7102781895d41faa9dElliott Hughes env_->SetObjectArrayElement(array, 0, env_->NewStringUTF("not a jclass!")); 1134b264f081424642b06b0bbe7102781895d41faa9dElliott Hughes EXPECT_EXCEPTION(ase_); 1135289da82ae82438ab3aed1898c82fd87c16846e74Elliott Hughes} 1136289da82ae82438ab3aed1898c82fd87c16846e74Elliott Hughes 1137885c3bd4d7adcc7f60f656b4f7247e7065feadf3Elliott Hughes#define EXPECT_STATIC_PRIMITIVE_FIELD(type, field_name, sig, value1, value2) \ 1138885c3bd4d7adcc7f60f656b4f7247e7065feadf3Elliott Hughes do { \ 1139885c3bd4d7adcc7f60f656b4f7247e7065feadf3Elliott Hughes jfieldID fid = env_->GetStaticFieldID(c, field_name, sig); \ 1140885c3bd4d7adcc7f60f656b4f7247e7065feadf3Elliott Hughes EXPECT_TRUE(fid != NULL); \ 1141885c3bd4d7adcc7f60f656b4f7247e7065feadf3Elliott Hughes env_->SetStatic ## type ## Field(c, fid, value1); \ 11422e3d1b262af0839380e1d60e86d8b281943ef944Brian Carlstrom EXPECT_TRUE(value1 == env_->GetStatic ## type ## Field(c, fid)); \ 1143885c3bd4d7adcc7f60f656b4f7247e7065feadf3Elliott Hughes env_->SetStatic ## type ## Field(c, fid, value2); \ 11442e3d1b262af0839380e1d60e86d8b281943ef944Brian Carlstrom EXPECT_TRUE(value2 == env_->GetStatic ## type ## Field(c, fid)); \ 1145885c3bd4d7adcc7f60f656b4f7247e7065feadf3Elliott Hughes } while (false) 1146885c3bd4d7adcc7f60f656b4f7247e7065feadf3Elliott Hughes 1147885c3bd4d7adcc7f60f656b4f7247e7065feadf3Elliott Hughes#define EXPECT_PRIMITIVE_FIELD(instance, type, field_name, sig, value1, value2) \ 1148885c3bd4d7adcc7f60f656b4f7247e7065feadf3Elliott Hughes do { \ 1149885c3bd4d7adcc7f60f656b4f7247e7065feadf3Elliott Hughes jfieldID fid = env_->GetFieldID(c, field_name, sig); \ 1150885c3bd4d7adcc7f60f656b4f7247e7065feadf3Elliott Hughes EXPECT_TRUE(fid != NULL); \ 1151885c3bd4d7adcc7f60f656b4f7247e7065feadf3Elliott Hughes env_->Set ## type ## Field(instance, fid, value1); \ 11522e3d1b262af0839380e1d60e86d8b281943ef944Brian Carlstrom EXPECT_TRUE(value1 == env_->Get ## type ## Field(instance, fid)); \ 1153885c3bd4d7adcc7f60f656b4f7247e7065feadf3Elliott Hughes env_->Set ## type ## Field(instance, fid, value2); \ 11542e3d1b262af0839380e1d60e86d8b281943ef944Brian Carlstrom EXPECT_TRUE(value2 == env_->Get ## type ## Field(instance, fid)); \ 1155885c3bd4d7adcc7f60f656b4f7247e7065feadf3Elliott Hughes } while (false) 1156885c3bd4d7adcc7f60f656b4f7247e7065feadf3Elliott Hughes 1157885c3bd4d7adcc7f60f656b4f7247e7065feadf3Elliott Hughes 11585b8b1edc803a85bb3172560826d6a23fb23c3452Shih-wei Liao#if !defined(ART_USE_LLVM_COMPILER) 1159885c3bd4d7adcc7f60f656b4f7247e7065feadf3Elliott HughesTEST_F(JniInternalTest, GetPrimitiveField_SetPrimitiveField) { 116000f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers Thread::Current()->TransitionFromSuspendedToRunnable(); 116100f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers LoadDex("AllFields"); 116225c3325bf95036bf325fc7cb21b4fd6d40282857Brian Carlstrom runtime_->Start(); 1163885c3bd4d7adcc7f60f656b4f7247e7065feadf3Elliott Hughes 1164885c3bd4d7adcc7f60f656b4f7247e7065feadf3Elliott Hughes jclass c = env_->FindClass("AllFields"); 1165885c3bd4d7adcc7f60f656b4f7247e7065feadf3Elliott Hughes ASSERT_TRUE(c != NULL); 1166885c3bd4d7adcc7f60f656b4f7247e7065feadf3Elliott Hughes jobject o = env_->AllocObject(c); 1167885c3bd4d7adcc7f60f656b4f7247e7065feadf3Elliott Hughes ASSERT_TRUE(o != NULL); 1168885c3bd4d7adcc7f60f656b4f7247e7065feadf3Elliott Hughes 1169885c3bd4d7adcc7f60f656b4f7247e7065feadf3Elliott Hughes EXPECT_STATIC_PRIMITIVE_FIELD(Boolean, "sZ", "Z", true, false); 1170885c3bd4d7adcc7f60f656b4f7247e7065feadf3Elliott Hughes EXPECT_STATIC_PRIMITIVE_FIELD(Byte, "sB", "B", 1, 2); 1171885c3bd4d7adcc7f60f656b4f7247e7065feadf3Elliott Hughes EXPECT_STATIC_PRIMITIVE_FIELD(Char, "sC", "C", 'a', 'b'); 1172885c3bd4d7adcc7f60f656b4f7247e7065feadf3Elliott Hughes EXPECT_STATIC_PRIMITIVE_FIELD(Double, "sD", "D", 1.0, 2.0); 1173885c3bd4d7adcc7f60f656b4f7247e7065feadf3Elliott Hughes EXPECT_STATIC_PRIMITIVE_FIELD(Float, "sF", "F", 1.0, 2.0); 1174885c3bd4d7adcc7f60f656b4f7247e7065feadf3Elliott Hughes EXPECT_STATIC_PRIMITIVE_FIELD(Int, "sI", "I", 1, 2); 1175885c3bd4d7adcc7f60f656b4f7247e7065feadf3Elliott Hughes EXPECT_STATIC_PRIMITIVE_FIELD(Long, "sJ", "J", 1, 2); 1176885c3bd4d7adcc7f60f656b4f7247e7065feadf3Elliott Hughes EXPECT_STATIC_PRIMITIVE_FIELD(Short, "sS", "S", 1, 2); 1177885c3bd4d7adcc7f60f656b4f7247e7065feadf3Elliott Hughes 1178885c3bd4d7adcc7f60f656b4f7247e7065feadf3Elliott Hughes EXPECT_PRIMITIVE_FIELD(o, Boolean, "iZ", "Z", true, false); 1179885c3bd4d7adcc7f60f656b4f7247e7065feadf3Elliott Hughes EXPECT_PRIMITIVE_FIELD(o, Byte, "iB", "B", 1, 2); 1180885c3bd4d7adcc7f60f656b4f7247e7065feadf3Elliott Hughes EXPECT_PRIMITIVE_FIELD(o, Char, "iC", "C", 'a', 'b'); 1181885c3bd4d7adcc7f60f656b4f7247e7065feadf3Elliott Hughes EXPECT_PRIMITIVE_FIELD(o, Double, "iD", "D", 1.0, 2.0); 1182885c3bd4d7adcc7f60f656b4f7247e7065feadf3Elliott Hughes EXPECT_PRIMITIVE_FIELD(o, Float, "iF", "F", 1.0, 2.0); 1183885c3bd4d7adcc7f60f656b4f7247e7065feadf3Elliott Hughes EXPECT_PRIMITIVE_FIELD(o, Int, "iI", "I", 1, 2); 1184885c3bd4d7adcc7f60f656b4f7247e7065feadf3Elliott Hughes EXPECT_PRIMITIVE_FIELD(o, Long, "iJ", "J", 1, 2); 1185885c3bd4d7adcc7f60f656b4f7247e7065feadf3Elliott Hughes EXPECT_PRIMITIVE_FIELD(o, Short, "iS", "S", 1, 2); 1186885c3bd4d7adcc7f60f656b4f7247e7065feadf3Elliott Hughes} 1187885c3bd4d7adcc7f60f656b4f7247e7065feadf3Elliott Hughes 1188885c3bd4d7adcc7f60f656b4f7247e7065feadf3Elliott HughesTEST_F(JniInternalTest, GetObjectField_SetObjectField) { 118900f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers Thread::Current()->TransitionFromSuspendedToRunnable(); 119000f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers LoadDex("AllFields"); 119125c3325bf95036bf325fc7cb21b4fd6d40282857Brian Carlstrom runtime_->Start(); 1192885c3bd4d7adcc7f60f656b4f7247e7065feadf3Elliott Hughes 1193885c3bd4d7adcc7f60f656b4f7247e7065feadf3Elliott Hughes jclass c = env_->FindClass("AllFields"); 1194885c3bd4d7adcc7f60f656b4f7247e7065feadf3Elliott Hughes ASSERT_TRUE(c != NULL); 1195885c3bd4d7adcc7f60f656b4f7247e7065feadf3Elliott Hughes jobject o = env_->AllocObject(c); 1196885c3bd4d7adcc7f60f656b4f7247e7065feadf3Elliott Hughes ASSERT_TRUE(o != NULL); 1197885c3bd4d7adcc7f60f656b4f7247e7065feadf3Elliott Hughes 1198885c3bd4d7adcc7f60f656b4f7247e7065feadf3Elliott Hughes jstring s1 = env_->NewStringUTF("hello"); 1199885c3bd4d7adcc7f60f656b4f7247e7065feadf3Elliott Hughes ASSERT_TRUE(s1 != NULL); 1200885c3bd4d7adcc7f60f656b4f7247e7065feadf3Elliott Hughes jstring s2 = env_->NewStringUTF("world"); 1201885c3bd4d7adcc7f60f656b4f7247e7065feadf3Elliott Hughes ASSERT_TRUE(s2 != NULL); 1202885c3bd4d7adcc7f60f656b4f7247e7065feadf3Elliott Hughes 1203885c3bd4d7adcc7f60f656b4f7247e7065feadf3Elliott Hughes jfieldID s_fid = env_->GetStaticFieldID(c, "sObject", "Ljava/lang/Object;"); 1204885c3bd4d7adcc7f60f656b4f7247e7065feadf3Elliott Hughes ASSERT_TRUE(s_fid != NULL); 1205885c3bd4d7adcc7f60f656b4f7247e7065feadf3Elliott Hughes jfieldID i_fid = env_->GetFieldID(c, "iObject", "Ljava/lang/Object;"); 1206885c3bd4d7adcc7f60f656b4f7247e7065feadf3Elliott Hughes ASSERT_TRUE(i_fid != NULL); 1207885c3bd4d7adcc7f60f656b4f7247e7065feadf3Elliott Hughes 1208885c3bd4d7adcc7f60f656b4f7247e7065feadf3Elliott Hughes env_->SetStaticObjectField(c, s_fid, s1); 1209885c3bd4d7adcc7f60f656b4f7247e7065feadf3Elliott Hughes ASSERT_TRUE(env_->IsSameObject(s1, env_->GetStaticObjectField(c, s_fid))); 1210885c3bd4d7adcc7f60f656b4f7247e7065feadf3Elliott Hughes env_->SetStaticObjectField(c, s_fid, s2); 1211885c3bd4d7adcc7f60f656b4f7247e7065feadf3Elliott Hughes ASSERT_TRUE(env_->IsSameObject(s2, env_->GetStaticObjectField(c, s_fid))); 1212885c3bd4d7adcc7f60f656b4f7247e7065feadf3Elliott Hughes 1213885c3bd4d7adcc7f60f656b4f7247e7065feadf3Elliott Hughes env_->SetObjectField(o, i_fid, s1); 1214885c3bd4d7adcc7f60f656b4f7247e7065feadf3Elliott Hughes ASSERT_TRUE(env_->IsSameObject(s1, env_->GetObjectField(o, i_fid))); 1215885c3bd4d7adcc7f60f656b4f7247e7065feadf3Elliott Hughes env_->SetObjectField(o, i_fid, s2); 1216885c3bd4d7adcc7f60f656b4f7247e7065feadf3Elliott Hughes ASSERT_TRUE(env_->IsSameObject(s2, env_->GetObjectField(o, i_fid))); 1217885c3bd4d7adcc7f60f656b4f7247e7065feadf3Elliott Hughes} 12185b8b1edc803a85bb3172560826d6a23fb23c3452Shih-wei Liao#endif 1219885c3bd4d7adcc7f60f656b4f7247e7065feadf3Elliott Hughes 122018c0753c1659629021b4becdaa3f6ea81aecce35Elliott HughesTEST_F(JniInternalTest, NewLocalRef_NULL) { 122118c0753c1659629021b4becdaa3f6ea81aecce35Elliott Hughes EXPECT_TRUE(env_->NewLocalRef(NULL) == NULL); 122218c0753c1659629021b4becdaa3f6ea81aecce35Elliott Hughes} 122318c0753c1659629021b4becdaa3f6ea81aecce35Elliott Hughes 122418c0753c1659629021b4becdaa3f6ea81aecce35Elliott HughesTEST_F(JniInternalTest, NewLocalRef) { 122518c0753c1659629021b4becdaa3f6ea81aecce35Elliott Hughes jstring s = env_->NewStringUTF(""); 122618c0753c1659629021b4becdaa3f6ea81aecce35Elliott Hughes ASSERT_TRUE(s != NULL); 122718c0753c1659629021b4becdaa3f6ea81aecce35Elliott Hughes jobject o = env_->NewLocalRef(s); 122818c0753c1659629021b4becdaa3f6ea81aecce35Elliott Hughes EXPECT_TRUE(o != NULL); 122918c0753c1659629021b4becdaa3f6ea81aecce35Elliott Hughes EXPECT_TRUE(o != s); 123018c0753c1659629021b4becdaa3f6ea81aecce35Elliott Hughes 12312ced6a534157d5d963693346904389c19775d2daElliott Hughes EXPECT_EQ(JNILocalRefType, env_->GetObjectRefType(o)); 123218c0753c1659629021b4becdaa3f6ea81aecce35Elliott Hughes} 123318c0753c1659629021b4becdaa3f6ea81aecce35Elliott Hughes 123418c0753c1659629021b4becdaa3f6ea81aecce35Elliott HughesTEST_F(JniInternalTest, DeleteLocalRef_NULL) { 123518c0753c1659629021b4becdaa3f6ea81aecce35Elliott Hughes env_->DeleteLocalRef(NULL); 123618c0753c1659629021b4becdaa3f6ea81aecce35Elliott Hughes} 123718c0753c1659629021b4becdaa3f6ea81aecce35Elliott Hughes 123818c0753c1659629021b4becdaa3f6ea81aecce35Elliott HughesTEST_F(JniInternalTest, DeleteLocalRef) { 123918c0753c1659629021b4becdaa3f6ea81aecce35Elliott Hughes jstring s = env_->NewStringUTF(""); 124018c0753c1659629021b4becdaa3f6ea81aecce35Elliott Hughes ASSERT_TRUE(s != NULL); 124118c0753c1659629021b4becdaa3f6ea81aecce35Elliott Hughes env_->DeleteLocalRef(s); 124218c0753c1659629021b4becdaa3f6ea81aecce35Elliott Hughes 12433f6635a2c84d645002f651c312d53f8348646c1fElliott Hughes // Currently, deleting an already-deleted reference is just a CheckJNI warning. 1244b264f081424642b06b0bbe7102781895d41faa9dElliott Hughes { 1245b264f081424642b06b0bbe7102781895d41faa9dElliott Hughes CheckJniAbortCatcher check_jni_abort_catcher; 1246b264f081424642b06b0bbe7102781895d41faa9dElliott Hughes env_->DeleteLocalRef(s); 124700f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers check_jni_abort_catcher.Check("native code passing in reference to invalid local reference: 0x1400001"); 1248b264f081424642b06b0bbe7102781895d41faa9dElliott Hughes } 124918c0753c1659629021b4becdaa3f6ea81aecce35Elliott Hughes 125018c0753c1659629021b4becdaa3f6ea81aecce35Elliott Hughes s = env_->NewStringUTF(""); 125118c0753c1659629021b4becdaa3f6ea81aecce35Elliott Hughes ASSERT_TRUE(s != NULL); 125218c0753c1659629021b4becdaa3f6ea81aecce35Elliott Hughes jobject o = env_->NewLocalRef(s); 125318c0753c1659629021b4becdaa3f6ea81aecce35Elliott Hughes ASSERT_TRUE(o != NULL); 125418c0753c1659629021b4becdaa3f6ea81aecce35Elliott Hughes 125518c0753c1659629021b4becdaa3f6ea81aecce35Elliott Hughes env_->DeleteLocalRef(s); 125618c0753c1659629021b4becdaa3f6ea81aecce35Elliott Hughes env_->DeleteLocalRef(o); 125718c0753c1659629021b4becdaa3f6ea81aecce35Elliott Hughes} 125818c0753c1659629021b4becdaa3f6ea81aecce35Elliott Hughes 12592ced6a534157d5d963693346904389c19775d2daElliott HughesTEST_F(JniInternalTest, PushLocalFrame_PopLocalFrame) { 12602ced6a534157d5d963693346904389c19775d2daElliott Hughes jobject original = env_->NewStringUTF(""); 12612ced6a534157d5d963693346904389c19775d2daElliott Hughes ASSERT_TRUE(original != NULL); 12622ced6a534157d5d963693346904389c19775d2daElliott Hughes 12632ced6a534157d5d963693346904389c19775d2daElliott Hughes jobject outer; 12642ced6a534157d5d963693346904389c19775d2daElliott Hughes jobject inner1, inner2; 126500f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers ScopedObjectAccess soa(env_); 12662ced6a534157d5d963693346904389c19775d2daElliott Hughes Object* inner2_direct_pointer; 12672ced6a534157d5d963693346904389c19775d2daElliott Hughes { 12682ced6a534157d5d963693346904389c19775d2daElliott Hughes env_->PushLocalFrame(4); 12692ced6a534157d5d963693346904389c19775d2daElliott Hughes outer = env_->NewLocalRef(original); 12702ced6a534157d5d963693346904389c19775d2daElliott Hughes 12712ced6a534157d5d963693346904389c19775d2daElliott Hughes { 12722ced6a534157d5d963693346904389c19775d2daElliott Hughes env_->PushLocalFrame(4); 12732ced6a534157d5d963693346904389c19775d2daElliott Hughes inner1 = env_->NewLocalRef(outer); 12742ced6a534157d5d963693346904389c19775d2daElliott Hughes inner2 = env_->NewStringUTF("survivor"); 127500f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers inner2_direct_pointer = soa.Decode<Object*>(inner2); 12762ced6a534157d5d963693346904389c19775d2daElliott Hughes env_->PopLocalFrame(inner2); 12772ced6a534157d5d963693346904389c19775d2daElliott Hughes } 12782ced6a534157d5d963693346904389c19775d2daElliott Hughes 12792ced6a534157d5d963693346904389c19775d2daElliott Hughes EXPECT_EQ(JNILocalRefType, env_->GetObjectRefType(original)); 12802ced6a534157d5d963693346904389c19775d2daElliott Hughes EXPECT_EQ(JNILocalRefType, env_->GetObjectRefType(outer)); 12812ced6a534157d5d963693346904389c19775d2daElliott Hughes EXPECT_EQ(JNIInvalidRefType, env_->GetObjectRefType(inner1)); 12822ced6a534157d5d963693346904389c19775d2daElliott Hughes 12832ced6a534157d5d963693346904389c19775d2daElliott Hughes // Our local reference for the survivor is invalid because the survivor 12842ced6a534157d5d963693346904389c19775d2daElliott Hughes // gets a new local reference... 12852ced6a534157d5d963693346904389c19775d2daElliott Hughes EXPECT_EQ(JNIInvalidRefType, env_->GetObjectRefType(inner2)); 12862ced6a534157d5d963693346904389c19775d2daElliott Hughes // ...but the survivor should be in the local reference table. 12874d5714378c3433ba7e351cbf6a6713fb49c31784Brian Carlstrom JNIEnvExt* env = reinterpret_cast<JNIEnvExt*>(env_); 12884d5714378c3433ba7e351cbf6a6713fb49c31784Brian Carlstrom EXPECT_TRUE(env->locals.ContainsDirectPointer(inner2_direct_pointer)); 12892ced6a534157d5d963693346904389c19775d2daElliott Hughes 12902ced6a534157d5d963693346904389c19775d2daElliott Hughes env_->PopLocalFrame(NULL); 12912ced6a534157d5d963693346904389c19775d2daElliott Hughes } 12922ced6a534157d5d963693346904389c19775d2daElliott Hughes EXPECT_EQ(JNILocalRefType, env_->GetObjectRefType(original)); 12932ced6a534157d5d963693346904389c19775d2daElliott Hughes EXPECT_EQ(JNIInvalidRefType, env_->GetObjectRefType(outer)); 12942ced6a534157d5d963693346904389c19775d2daElliott Hughes EXPECT_EQ(JNIInvalidRefType, env_->GetObjectRefType(inner1)); 12952ced6a534157d5d963693346904389c19775d2daElliott Hughes EXPECT_EQ(JNIInvalidRefType, env_->GetObjectRefType(inner2)); 12962ced6a534157d5d963693346904389c19775d2daElliott Hughes} 12972ced6a534157d5d963693346904389c19775d2daElliott Hughes 129818c0753c1659629021b4becdaa3f6ea81aecce35Elliott HughesTEST_F(JniInternalTest, NewGlobalRef_NULL) { 129918c0753c1659629021b4becdaa3f6ea81aecce35Elliott Hughes EXPECT_TRUE(env_->NewGlobalRef(NULL) == NULL); 130018c0753c1659629021b4becdaa3f6ea81aecce35Elliott Hughes} 130118c0753c1659629021b4becdaa3f6ea81aecce35Elliott Hughes 130218c0753c1659629021b4becdaa3f6ea81aecce35Elliott HughesTEST_F(JniInternalTest, NewGlobalRef) { 130318c0753c1659629021b4becdaa3f6ea81aecce35Elliott Hughes jstring s = env_->NewStringUTF(""); 130418c0753c1659629021b4becdaa3f6ea81aecce35Elliott Hughes ASSERT_TRUE(s != NULL); 130518c0753c1659629021b4becdaa3f6ea81aecce35Elliott Hughes jobject o = env_->NewGlobalRef(s); 130618c0753c1659629021b4becdaa3f6ea81aecce35Elliott Hughes EXPECT_TRUE(o != NULL); 130718c0753c1659629021b4becdaa3f6ea81aecce35Elliott Hughes EXPECT_TRUE(o != s); 130818c0753c1659629021b4becdaa3f6ea81aecce35Elliott Hughes 130918c0753c1659629021b4becdaa3f6ea81aecce35Elliott Hughes // TODO: check that o is a global reference. 131018c0753c1659629021b4becdaa3f6ea81aecce35Elliott Hughes} 131118c0753c1659629021b4becdaa3f6ea81aecce35Elliott Hughes 131218c0753c1659629021b4becdaa3f6ea81aecce35Elliott HughesTEST_F(JniInternalTest, DeleteGlobalRef_NULL) { 131318c0753c1659629021b4becdaa3f6ea81aecce35Elliott Hughes env_->DeleteGlobalRef(NULL); 131418c0753c1659629021b4becdaa3f6ea81aecce35Elliott Hughes} 131518c0753c1659629021b4becdaa3f6ea81aecce35Elliott Hughes 131618c0753c1659629021b4becdaa3f6ea81aecce35Elliott HughesTEST_F(JniInternalTest, DeleteGlobalRef) { 131718c0753c1659629021b4becdaa3f6ea81aecce35Elliott Hughes jstring s = env_->NewStringUTF(""); 131818c0753c1659629021b4becdaa3f6ea81aecce35Elliott Hughes ASSERT_TRUE(s != NULL); 131918c0753c1659629021b4becdaa3f6ea81aecce35Elliott Hughes 132018c0753c1659629021b4becdaa3f6ea81aecce35Elliott Hughes jobject o = env_->NewGlobalRef(s); 132118c0753c1659629021b4becdaa3f6ea81aecce35Elliott Hughes ASSERT_TRUE(o != NULL); 132218c0753c1659629021b4becdaa3f6ea81aecce35Elliott Hughes env_->DeleteGlobalRef(o); 132318c0753c1659629021b4becdaa3f6ea81aecce35Elliott Hughes 13243f6635a2c84d645002f651c312d53f8348646c1fElliott Hughes // Currently, deleting an already-deleted reference is just a CheckJNI warning. 1325b264f081424642b06b0bbe7102781895d41faa9dElliott Hughes { 1326b264f081424642b06b0bbe7102781895d41faa9dElliott Hughes CheckJniAbortCatcher check_jni_abort_catcher; 1327b264f081424642b06b0bbe7102781895d41faa9dElliott Hughes env_->DeleteGlobalRef(o); 132800f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers check_jni_abort_catcher.Check("native code passing in reference to invalid global reference: 0x100056"); 1329b264f081424642b06b0bbe7102781895d41faa9dElliott Hughes } 133018c0753c1659629021b4becdaa3f6ea81aecce35Elliott Hughes 133118c0753c1659629021b4becdaa3f6ea81aecce35Elliott Hughes jobject o1 = env_->NewGlobalRef(s); 133218c0753c1659629021b4becdaa3f6ea81aecce35Elliott Hughes ASSERT_TRUE(o1 != NULL); 133318c0753c1659629021b4becdaa3f6ea81aecce35Elliott Hughes jobject o2 = env_->NewGlobalRef(s); 133418c0753c1659629021b4becdaa3f6ea81aecce35Elliott Hughes ASSERT_TRUE(o2 != NULL); 133518c0753c1659629021b4becdaa3f6ea81aecce35Elliott Hughes 133618c0753c1659629021b4becdaa3f6ea81aecce35Elliott Hughes env_->DeleteGlobalRef(o1); 133718c0753c1659629021b4becdaa3f6ea81aecce35Elliott Hughes env_->DeleteGlobalRef(o2); 133818c0753c1659629021b4becdaa3f6ea81aecce35Elliott Hughes} 133918c0753c1659629021b4becdaa3f6ea81aecce35Elliott Hughes 134018c0753c1659629021b4becdaa3f6ea81aecce35Elliott HughesTEST_F(JniInternalTest, NewWeakGlobalRef_NULL) { 134118c0753c1659629021b4becdaa3f6ea81aecce35Elliott Hughes EXPECT_TRUE(env_->NewWeakGlobalRef(NULL) == NULL); 134218c0753c1659629021b4becdaa3f6ea81aecce35Elliott Hughes} 134318c0753c1659629021b4becdaa3f6ea81aecce35Elliott Hughes 134418c0753c1659629021b4becdaa3f6ea81aecce35Elliott HughesTEST_F(JniInternalTest, NewWeakGlobalRef) { 134518c0753c1659629021b4becdaa3f6ea81aecce35Elliott Hughes jstring s = env_->NewStringUTF(""); 134618c0753c1659629021b4becdaa3f6ea81aecce35Elliott Hughes ASSERT_TRUE(s != NULL); 134718c0753c1659629021b4becdaa3f6ea81aecce35Elliott Hughes jobject o = env_->NewWeakGlobalRef(s); 134818c0753c1659629021b4becdaa3f6ea81aecce35Elliott Hughes EXPECT_TRUE(o != NULL); 134918c0753c1659629021b4becdaa3f6ea81aecce35Elliott Hughes EXPECT_TRUE(o != s); 135018c0753c1659629021b4becdaa3f6ea81aecce35Elliott Hughes 135118c0753c1659629021b4becdaa3f6ea81aecce35Elliott Hughes // TODO: check that o is a weak global reference. 135218c0753c1659629021b4becdaa3f6ea81aecce35Elliott Hughes} 135318c0753c1659629021b4becdaa3f6ea81aecce35Elliott Hughes 135418c0753c1659629021b4becdaa3f6ea81aecce35Elliott HughesTEST_F(JniInternalTest, DeleteWeakGlobalRef_NULL) { 135518c0753c1659629021b4becdaa3f6ea81aecce35Elliott Hughes env_->DeleteWeakGlobalRef(NULL); 135618c0753c1659629021b4becdaa3f6ea81aecce35Elliott Hughes} 135718c0753c1659629021b4becdaa3f6ea81aecce35Elliott Hughes 135818c0753c1659629021b4becdaa3f6ea81aecce35Elliott HughesTEST_F(JniInternalTest, DeleteWeakGlobalRef) { 135918c0753c1659629021b4becdaa3f6ea81aecce35Elliott Hughes jstring s = env_->NewStringUTF(""); 136018c0753c1659629021b4becdaa3f6ea81aecce35Elliott Hughes ASSERT_TRUE(s != NULL); 136118c0753c1659629021b4becdaa3f6ea81aecce35Elliott Hughes 136218c0753c1659629021b4becdaa3f6ea81aecce35Elliott Hughes jobject o = env_->NewWeakGlobalRef(s); 136318c0753c1659629021b4becdaa3f6ea81aecce35Elliott Hughes ASSERT_TRUE(o != NULL); 136418c0753c1659629021b4becdaa3f6ea81aecce35Elliott Hughes env_->DeleteWeakGlobalRef(o); 136518c0753c1659629021b4becdaa3f6ea81aecce35Elliott Hughes 13663f6635a2c84d645002f651c312d53f8348646c1fElliott Hughes // Currently, deleting an already-deleted reference is just a CheckJNI warning. 1367b264f081424642b06b0bbe7102781895d41faa9dElliott Hughes { 1368b264f081424642b06b0bbe7102781895d41faa9dElliott Hughes CheckJniAbortCatcher check_jni_abort_catcher; 1369b264f081424642b06b0bbe7102781895d41faa9dElliott Hughes env_->DeleteWeakGlobalRef(o); 137056ef042065ce282f8f01a0f31f5cce868a60ede8Elliott Hughes check_jni_abort_catcher.Check("native code passing in reference to invalid weak global reference: 0x100003"); 1371b264f081424642b06b0bbe7102781895d41faa9dElliott Hughes } 137218c0753c1659629021b4becdaa3f6ea81aecce35Elliott Hughes 137318c0753c1659629021b4becdaa3f6ea81aecce35Elliott Hughes jobject o1 = env_->NewWeakGlobalRef(s); 137418c0753c1659629021b4becdaa3f6ea81aecce35Elliott Hughes ASSERT_TRUE(o1 != NULL); 137518c0753c1659629021b4becdaa3f6ea81aecce35Elliott Hughes jobject o2 = env_->NewWeakGlobalRef(s); 137618c0753c1659629021b4becdaa3f6ea81aecce35Elliott Hughes ASSERT_TRUE(o2 != NULL); 137718c0753c1659629021b4becdaa3f6ea81aecce35Elliott Hughes 137818c0753c1659629021b4becdaa3f6ea81aecce35Elliott Hughes env_->DeleteWeakGlobalRef(o1); 137918c0753c1659629021b4becdaa3f6ea81aecce35Elliott Hughes env_->DeleteWeakGlobalRef(o2); 138018c0753c1659629021b4becdaa3f6ea81aecce35Elliott Hughes} 138118c0753c1659629021b4becdaa3f6ea81aecce35Elliott Hughes 13829b9ba28b1277b4ddb967c5a968c6d550febce6afCarl ShapiroTEST_F(JniInternalTest, StaticMainMethod) { 138300f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers ScopedObjectAccess soa(Thread::Current()); 138400f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers jobject jclass_loader = LoadDex("Main"); 138500f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers SirtRef<ClassLoader> class_loader(soa.Decode<ClassLoader*>(jclass_loader)); 138640381fb9dc4b4cf274f1e58b2cdf4396202c6189Brian Carlstrom CompileDirectMethod(class_loader.get(), "Main", "main", "([Ljava/lang/String;)V"); 13879b9ba28b1277b4ddb967c5a968c6d550febce6afCarl Shapiro 138840381fb9dc4b4cf274f1e58b2cdf4396202c6189Brian Carlstrom Class* klass = class_linker_->FindClass("LMain;", class_loader.get()); 13899b9ba28b1277b4ddb967c5a968c6d550febce6afCarl Shapiro ASSERT_TRUE(klass != NULL); 13909b9ba28b1277b4ddb967c5a968c6d550febce6afCarl Shapiro 13919b9ba28b1277b4ddb967c5a968c6d550febce6afCarl Shapiro Method* method = klass->FindDirectMethod("main", "([Ljava/lang/String;)V"); 13929b9ba28b1277b4ddb967c5a968c6d550febce6afCarl Shapiro ASSERT_TRUE(method != NULL); 13939b9ba28b1277b4ddb967c5a968c6d550febce6afCarl Shapiro 13949baa4aefc370f48774b6104680193d9a7e4fb631Brian Carlstrom Method::InvokeStub* stub = method->GetInvokeStub(); 13959b9ba28b1277b4ddb967c5a968c6d550febce6afCarl Shapiro 139677405796564c6c1353807cda18b28678a719bd68Elliott Hughes JValue args[1]; 1397f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes args[0].SetL(NULL); 13989b9ba28b1277b4ddb967c5a968c6d550febce6afCarl Shapiro 139977405796564c6c1353807cda18b28678a719bd68Elliott Hughes (*stub)(method, NULL, Thread::Current(), args, NULL); 14009b9ba28b1277b4ddb967c5a968c6d550febce6afCarl Shapiro} 14019b9ba28b1277b4ddb967c5a968c6d550febce6afCarl Shapiro 14029b9ba28b1277b4ddb967c5a968c6d550febce6afCarl ShapiroTEST_F(JniInternalTest, StaticNopMethod) { 140300f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers ScopedObjectAccess soa(Thread::Current()); 140477405796564c6c1353807cda18b28678a719bd68Elliott Hughes InvokeNopMethod(true); 140577405796564c6c1353807cda18b28678a719bd68Elliott Hughes} 14069b9ba28b1277b4ddb967c5a968c6d550febce6afCarl Shapiro 140777405796564c6c1353807cda18b28678a719bd68Elliott HughesTEST_F(JniInternalTest, NonStaticNopMethod) { 140800f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers ScopedObjectAccess soa(Thread::Current()); 140977405796564c6c1353807cda18b28678a719bd68Elliott Hughes InvokeNopMethod(false); 14109b9ba28b1277b4ddb967c5a968c6d550febce6afCarl Shapiro} 14119b9ba28b1277b4ddb967c5a968c6d550febce6afCarl Shapiro 14129b9ba28b1277b4ddb967c5a968c6d550febce6afCarl ShapiroTEST_F(JniInternalTest, StaticIdentityByteMethod) { 141300f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers ScopedObjectAccess soa(Thread::Current()); 141477405796564c6c1353807cda18b28678a719bd68Elliott Hughes InvokeIdentityByteMethod(true); 141577405796564c6c1353807cda18b28678a719bd68Elliott Hughes} 14169b9ba28b1277b4ddb967c5a968c6d550febce6afCarl Shapiro 141777405796564c6c1353807cda18b28678a719bd68Elliott HughesTEST_F(JniInternalTest, NonStaticIdentityByteMethod) { 141800f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers ScopedObjectAccess soa(Thread::Current()); 141977405796564c6c1353807cda18b28678a719bd68Elliott Hughes InvokeIdentityByteMethod(false); 14209b9ba28b1277b4ddb967c5a968c6d550febce6afCarl Shapiro} 14219b9ba28b1277b4ddb967c5a968c6d550febce6afCarl Shapiro 14229b9ba28b1277b4ddb967c5a968c6d550febce6afCarl ShapiroTEST_F(JniInternalTest, StaticIdentityIntMethod) { 142300f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers ScopedObjectAccess soa(Thread::Current()); 142477405796564c6c1353807cda18b28678a719bd68Elliott Hughes InvokeIdentityIntMethod(true); 142577405796564c6c1353807cda18b28678a719bd68Elliott Hughes} 14269b9ba28b1277b4ddb967c5a968c6d550febce6afCarl Shapiro 142777405796564c6c1353807cda18b28678a719bd68Elliott HughesTEST_F(JniInternalTest, NonStaticIdentityIntMethod) { 142800f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers ScopedObjectAccess soa(Thread::Current()); 142977405796564c6c1353807cda18b28678a719bd68Elliott Hughes InvokeIdentityIntMethod(false); 14309b9ba28b1277b4ddb967c5a968c6d550febce6afCarl Shapiro} 14319b9ba28b1277b4ddb967c5a968c6d550febce6afCarl Shapiro 14329b9ba28b1277b4ddb967c5a968c6d550febce6afCarl ShapiroTEST_F(JniInternalTest, StaticIdentityDoubleMethod) { 143300f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers ScopedObjectAccess soa(Thread::Current()); 143477405796564c6c1353807cda18b28678a719bd68Elliott Hughes InvokeIdentityDoubleMethod(true); 143577405796564c6c1353807cda18b28678a719bd68Elliott Hughes} 14369b9ba28b1277b4ddb967c5a968c6d550febce6afCarl Shapiro 143777405796564c6c1353807cda18b28678a719bd68Elliott HughesTEST_F(JniInternalTest, NonStaticIdentityDoubleMethod) { 143800f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers ScopedObjectAccess soa(Thread::Current()); 143977405796564c6c1353807cda18b28678a719bd68Elliott Hughes InvokeIdentityDoubleMethod(false); 14405b8b1edc803a85bb3172560826d6a23fb23c3452Shih-wei Liao} 14415b8b1edc803a85bb3172560826d6a23fb23c3452Shih-wei Liao 14429b9ba28b1277b4ddb967c5a968c6d550febce6afCarl ShapiroTEST_F(JniInternalTest, StaticSumIntIntMethod) { 144300f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers ScopedObjectAccess soa(Thread::Current()); 144477405796564c6c1353807cda18b28678a719bd68Elliott Hughes InvokeSumIntIntMethod(true); 144577405796564c6c1353807cda18b28678a719bd68Elliott Hughes} 14469b9ba28b1277b4ddb967c5a968c6d550febce6afCarl Shapiro 144777405796564c6c1353807cda18b28678a719bd68Elliott HughesTEST_F(JniInternalTest, NonStaticSumIntIntMethod) { 144800f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers ScopedObjectAccess soa(Thread::Current()); 144977405796564c6c1353807cda18b28678a719bd68Elliott Hughes InvokeSumIntIntMethod(false); 14509b9ba28b1277b4ddb967c5a968c6d550febce6afCarl Shapiro} 14519b9ba28b1277b4ddb967c5a968c6d550febce6afCarl Shapiro 14529b9ba28b1277b4ddb967c5a968c6d550febce6afCarl ShapiroTEST_F(JniInternalTest, StaticSumIntIntIntMethod) { 145300f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers ScopedObjectAccess soa(Thread::Current()); 145477405796564c6c1353807cda18b28678a719bd68Elliott Hughes InvokeSumIntIntIntMethod(true); 145577405796564c6c1353807cda18b28678a719bd68Elliott Hughes} 14569b9ba28b1277b4ddb967c5a968c6d550febce6afCarl Shapiro 145777405796564c6c1353807cda18b28678a719bd68Elliott HughesTEST_F(JniInternalTest, NonStaticSumIntIntIntMethod) { 145800f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers ScopedObjectAccess soa(Thread::Current()); 145977405796564c6c1353807cda18b28678a719bd68Elliott Hughes InvokeSumIntIntIntMethod(false); 14609b9ba28b1277b4ddb967c5a968c6d550febce6afCarl Shapiro} 14619b9ba28b1277b4ddb967c5a968c6d550febce6afCarl Shapiro 14629b9ba28b1277b4ddb967c5a968c6d550febce6afCarl ShapiroTEST_F(JniInternalTest, StaticSumIntIntIntIntMethod) { 146300f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers ScopedObjectAccess soa(Thread::Current()); 146477405796564c6c1353807cda18b28678a719bd68Elliott Hughes InvokeSumIntIntIntIntMethod(true); 146577405796564c6c1353807cda18b28678a719bd68Elliott Hughes} 14669b9ba28b1277b4ddb967c5a968c6d550febce6afCarl Shapiro 146777405796564c6c1353807cda18b28678a719bd68Elliott HughesTEST_F(JniInternalTest, NonStaticSumIntIntIntIntMethod) { 146800f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers ScopedObjectAccess soa(Thread::Current()); 146977405796564c6c1353807cda18b28678a719bd68Elliott Hughes InvokeSumIntIntIntIntMethod(false); 14709b9ba28b1277b4ddb967c5a968c6d550febce6afCarl Shapiro} 14719b9ba28b1277b4ddb967c5a968c6d550febce6afCarl Shapiro 14729b9ba28b1277b4ddb967c5a968c6d550febce6afCarl ShapiroTEST_F(JniInternalTest, StaticSumIntIntIntIntIntMethod) { 147300f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers ScopedObjectAccess soa(Thread::Current()); 147477405796564c6c1353807cda18b28678a719bd68Elliott Hughes InvokeSumIntIntIntIntIntMethod(true); 147577405796564c6c1353807cda18b28678a719bd68Elliott Hughes} 14769b9ba28b1277b4ddb967c5a968c6d550febce6afCarl Shapiro 147777405796564c6c1353807cda18b28678a719bd68Elliott HughesTEST_F(JniInternalTest, NonStaticSumIntIntIntIntIntMethod) { 147800f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers ScopedObjectAccess soa(Thread::Current()); 147977405796564c6c1353807cda18b28678a719bd68Elliott Hughes InvokeSumIntIntIntIntIntMethod(false); 14809b9ba28b1277b4ddb967c5a968c6d550febce6afCarl Shapiro} 14819b9ba28b1277b4ddb967c5a968c6d550febce6afCarl Shapiro 14829b9ba28b1277b4ddb967c5a968c6d550febce6afCarl ShapiroTEST_F(JniInternalTest, StaticSumDoubleDoubleMethod) { 148300f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers ScopedObjectAccess soa(Thread::Current()); 148477405796564c6c1353807cda18b28678a719bd68Elliott Hughes InvokeSumDoubleDoubleMethod(true); 148577405796564c6c1353807cda18b28678a719bd68Elliott Hughes} 14869b9ba28b1277b4ddb967c5a968c6d550febce6afCarl Shapiro 148777405796564c6c1353807cda18b28678a719bd68Elliott HughesTEST_F(JniInternalTest, NonStaticSumDoubleDoubleMethod) { 148800f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers ScopedObjectAccess soa(Thread::Current()); 148977405796564c6c1353807cda18b28678a719bd68Elliott Hughes InvokeSumDoubleDoubleMethod(false); 14909b9ba28b1277b4ddb967c5a968c6d550febce6afCarl Shapiro} 14919b9ba28b1277b4ddb967c5a968c6d550febce6afCarl Shapiro 14929b9ba28b1277b4ddb967c5a968c6d550febce6afCarl ShapiroTEST_F(JniInternalTest, StaticSumDoubleDoubleDoubleMethod) { 149300f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers ScopedObjectAccess soa(Thread::Current()); 149477405796564c6c1353807cda18b28678a719bd68Elliott Hughes InvokeSumDoubleDoubleDoubleMethod(true); 149577405796564c6c1353807cda18b28678a719bd68Elliott Hughes} 14969b9ba28b1277b4ddb967c5a968c6d550febce6afCarl Shapiro 149777405796564c6c1353807cda18b28678a719bd68Elliott HughesTEST_F(JniInternalTest, NonStaticSumDoubleDoubleDoubleMethod) { 149800f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers ScopedObjectAccess soa(Thread::Current()); 149977405796564c6c1353807cda18b28678a719bd68Elliott Hughes InvokeSumDoubleDoubleDoubleMethod(false); 15009b9ba28b1277b4ddb967c5a968c6d550febce6afCarl Shapiro} 15019b9ba28b1277b4ddb967c5a968c6d550febce6afCarl Shapiro 15029b9ba28b1277b4ddb967c5a968c6d550febce6afCarl ShapiroTEST_F(JniInternalTest, StaticSumDoubleDoubleDoubleDoubleMethod) { 150300f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers ScopedObjectAccess soa(Thread::Current()); 150477405796564c6c1353807cda18b28678a719bd68Elliott Hughes InvokeSumDoubleDoubleDoubleDoubleMethod(true); 150577405796564c6c1353807cda18b28678a719bd68Elliott Hughes} 15069b9ba28b1277b4ddb967c5a968c6d550febce6afCarl Shapiro 150777405796564c6c1353807cda18b28678a719bd68Elliott HughesTEST_F(JniInternalTest, NonStaticSumDoubleDoubleDoubleDoubleMethod) { 150800f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers ScopedObjectAccess soa(Thread::Current()); 150977405796564c6c1353807cda18b28678a719bd68Elliott Hughes InvokeSumDoubleDoubleDoubleDoubleMethod(false); 15109b9ba28b1277b4ddb967c5a968c6d550febce6afCarl Shapiro} 15119b9ba28b1277b4ddb967c5a968c6d550febce6afCarl Shapiro 15129b9ba28b1277b4ddb967c5a968c6d550febce6afCarl ShapiroTEST_F(JniInternalTest, StaticSumDoubleDoubleDoubleDoubleDoubleMethod) { 151300f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers ScopedObjectAccess soa(Thread::Current()); 151477405796564c6c1353807cda18b28678a719bd68Elliott Hughes InvokeSumDoubleDoubleDoubleDoubleDoubleMethod(true); 151577405796564c6c1353807cda18b28678a719bd68Elliott Hughes} 15169b9ba28b1277b4ddb967c5a968c6d550febce6afCarl Shapiro 151777405796564c6c1353807cda18b28678a719bd68Elliott HughesTEST_F(JniInternalTest, NonStaticSumDoubleDoubleDoubleDoubleDoubleMethod) { 151800f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers ScopedObjectAccess soa(Thread::Current()); 151977405796564c6c1353807cda18b28678a719bd68Elliott Hughes InvokeSumDoubleDoubleDoubleDoubleDoubleMethod(false); 15209b9ba28b1277b4ddb967c5a968c6d550febce6afCarl Shapiro} 15219b9ba28b1277b4ddb967c5a968c6d550febce6afCarl Shapiro 152237f7a40f6789bb287f287a9af00777af9d6428eeElliott HughesTEST_F(JniInternalTest, Throw) { 152337f7a40f6789bb287f287a9af00777af9d6428eeElliott Hughes EXPECT_EQ(JNI_ERR, env_->Throw(NULL)); 152437f7a40f6789bb287f287a9af00777af9d6428eeElliott Hughes 152537f7a40f6789bb287f287a9af00777af9d6428eeElliott Hughes jclass exception_class = env_->FindClass("java/lang/RuntimeException"); 152637f7a40f6789bb287f287a9af00777af9d6428eeElliott Hughes ASSERT_TRUE(exception_class != NULL); 152737f7a40f6789bb287f287a9af00777af9d6428eeElliott Hughes jthrowable exception = reinterpret_cast<jthrowable>(env_->AllocObject(exception_class)); 152837f7a40f6789bb287f287a9af00777af9d6428eeElliott Hughes ASSERT_TRUE(exception != NULL); 152937f7a40f6789bb287f287a9af00777af9d6428eeElliott Hughes 153037f7a40f6789bb287f287a9af00777af9d6428eeElliott Hughes EXPECT_EQ(JNI_OK, env_->Throw(exception)); 153137f7a40f6789bb287f287a9af00777af9d6428eeElliott Hughes EXPECT_TRUE(env_->ExceptionCheck()); 1532a2501990dd0f68baf38ce19251949d7bb3ecfe5aElliott Hughes jthrowable thrown_exception = env_->ExceptionOccurred(); 153337f7a40f6789bb287f287a9af00777af9d6428eeElliott Hughes env_->ExceptionClear(); 1534a2501990dd0f68baf38ce19251949d7bb3ecfe5aElliott Hughes EXPECT_TRUE(env_->IsSameObject(exception, thrown_exception)); 153537f7a40f6789bb287f287a9af00777af9d6428eeElliott Hughes} 153637f7a40f6789bb287f287a9af00777af9d6428eeElliott Hughes 153737f7a40f6789bb287f287a9af00777af9d6428eeElliott HughesTEST_F(JniInternalTest, ThrowNew) { 153837f7a40f6789bb287f287a9af00777af9d6428eeElliott Hughes EXPECT_EQ(JNI_ERR, env_->Throw(NULL)); 153937f7a40f6789bb287f287a9af00777af9d6428eeElliott Hughes 154037f7a40f6789bb287f287a9af00777af9d6428eeElliott Hughes jclass exception_class = env_->FindClass("java/lang/RuntimeException"); 154137f7a40f6789bb287f287a9af00777af9d6428eeElliott Hughes ASSERT_TRUE(exception_class != NULL); 154237f7a40f6789bb287f287a9af00777af9d6428eeElliott Hughes 15435cb5ad27944efb08d4556b3c0d362302e37e832bElliott Hughes jthrowable thrown_exception; 15445cb5ad27944efb08d4556b3c0d362302e37e832bElliott Hughes 154537f7a40f6789bb287f287a9af00777af9d6428eeElliott Hughes EXPECT_EQ(JNI_OK, env_->ThrowNew(exception_class, "hello world")); 154637f7a40f6789bb287f287a9af00777af9d6428eeElliott Hughes EXPECT_TRUE(env_->ExceptionCheck()); 15475cb5ad27944efb08d4556b3c0d362302e37e832bElliott Hughes thrown_exception = env_->ExceptionOccurred(); 15485cb5ad27944efb08d4556b3c0d362302e37e832bElliott Hughes env_->ExceptionClear(); 15495cb5ad27944efb08d4556b3c0d362302e37e832bElliott Hughes EXPECT_TRUE(env_->IsInstanceOf(thrown_exception, exception_class)); 15505cb5ad27944efb08d4556b3c0d362302e37e832bElliott Hughes 15515cb5ad27944efb08d4556b3c0d362302e37e832bElliott Hughes EXPECT_EQ(JNI_OK, env_->ThrowNew(exception_class, NULL)); 15525cb5ad27944efb08d4556b3c0d362302e37e832bElliott Hughes EXPECT_TRUE(env_->ExceptionCheck()); 15535cb5ad27944efb08d4556b3c0d362302e37e832bElliott Hughes thrown_exception = env_->ExceptionOccurred(); 155437f7a40f6789bb287f287a9af00777af9d6428eeElliott Hughes env_->ExceptionClear(); 1555a2501990dd0f68baf38ce19251949d7bb3ecfe5aElliott Hughes EXPECT_TRUE(env_->IsInstanceOf(thrown_exception, exception_class)); 155637f7a40f6789bb287f287a9af00777af9d6428eeElliott Hughes} 155737f7a40f6789bb287f287a9af00777af9d6428eeElliott Hughes 1558b465ab0e103d7760df903c1fddf4fa6b89d5d1f5Elliott Hughes// TODO: this test is DISABLED until we can actually run java.nio.Buffer's <init>. 1559b465ab0e103d7760df903c1fddf4fa6b89d5d1f5Elliott HughesTEST_F(JniInternalTest, DISABLED_NewDirectBuffer_GetDirectBufferAddress_GetDirectBufferCapacity) { 1560b465ab0e103d7760df903c1fddf4fa6b89d5d1f5Elliott Hughes jclass buffer_class = env_->FindClass("java/nio/Buffer"); 1561b465ab0e103d7760df903c1fddf4fa6b89d5d1f5Elliott Hughes ASSERT_TRUE(buffer_class != NULL); 1562b465ab0e103d7760df903c1fddf4fa6b89d5d1f5Elliott Hughes 1563b465ab0e103d7760df903c1fddf4fa6b89d5d1f5Elliott Hughes char bytes[1024]; 1564b465ab0e103d7760df903c1fddf4fa6b89d5d1f5Elliott Hughes jobject buffer = env_->NewDirectByteBuffer(bytes, sizeof(bytes)); 1565b465ab0e103d7760df903c1fddf4fa6b89d5d1f5Elliott Hughes ASSERT_TRUE(buffer != NULL); 1566b465ab0e103d7760df903c1fddf4fa6b89d5d1f5Elliott Hughes ASSERT_TRUE(env_->IsInstanceOf(buffer, buffer_class)); 1567b465ab0e103d7760df903c1fddf4fa6b89d5d1f5Elliott Hughes ASSERT_TRUE(env_->GetDirectBufferAddress(buffer) == bytes); 1568b465ab0e103d7760df903c1fddf4fa6b89d5d1f5Elliott Hughes ASSERT_TRUE(env_->GetDirectBufferCapacity(buffer) == sizeof(bytes)); 1569b465ab0e103d7760df903c1fddf4fa6b89d5d1f5Elliott Hughes} 1570b465ab0e103d7760df903c1fddf4fa6b89d5d1f5Elliott Hughes 15716d0b13e931fb73d5e964d14b0a7ecd1f3f5db547Ian RogersTEST_F(JniInternalTest, MonitorEnterExit) { 15726d0b13e931fb73d5e964d14b0a7ecd1f3f5db547Ian Rogers // Create an object to torture 15736d0b13e931fb73d5e964d14b0a7ecd1f3f5db547Ian Rogers jclass object_class = env_->FindClass("java/lang/Object"); 15746d0b13e931fb73d5e964d14b0a7ecd1f3f5db547Ian Rogers ASSERT_TRUE(object_class != NULL); 15756d0b13e931fb73d5e964d14b0a7ecd1f3f5db547Ian Rogers jobject object = env_->AllocObject(object_class); 15766d0b13e931fb73d5e964d14b0a7ecd1f3f5db547Ian Rogers ASSERT_TRUE(object != NULL); 15776d0b13e931fb73d5e964d14b0a7ecd1f3f5db547Ian Rogers 15786d0b13e931fb73d5e964d14b0a7ecd1f3f5db547Ian Rogers // Expected class of exceptions 15796d0b13e931fb73d5e964d14b0a7ecd1f3f5db547Ian Rogers jclass imse_class = env_->FindClass("java/lang/IllegalMonitorStateException"); 15806d0b13e931fb73d5e964d14b0a7ecd1f3f5db547Ian Rogers ASSERT_TRUE(imse_class != NULL); 15816d0b13e931fb73d5e964d14b0a7ecd1f3f5db547Ian Rogers 15826d0b13e931fb73d5e964d14b0a7ecd1f3f5db547Ian Rogers jthrowable thrown_exception; 15836d0b13e931fb73d5e964d14b0a7ecd1f3f5db547Ian Rogers 15846d0b13e931fb73d5e964d14b0a7ecd1f3f5db547Ian Rogers // Unlock of unowned monitor 15856d0b13e931fb73d5e964d14b0a7ecd1f3f5db547Ian Rogers env_->MonitorExit(object); 15866d0b13e931fb73d5e964d14b0a7ecd1f3f5db547Ian Rogers EXPECT_TRUE(env_->ExceptionCheck()); 15876d0b13e931fb73d5e964d14b0a7ecd1f3f5db547Ian Rogers thrown_exception = env_->ExceptionOccurred(); 15886d0b13e931fb73d5e964d14b0a7ecd1f3f5db547Ian Rogers env_->ExceptionClear(); 15896d0b13e931fb73d5e964d14b0a7ecd1f3f5db547Ian Rogers EXPECT_TRUE(env_->IsInstanceOf(thrown_exception, imse_class)); 15906d0b13e931fb73d5e964d14b0a7ecd1f3f5db547Ian Rogers 15916d0b13e931fb73d5e964d14b0a7ecd1f3f5db547Ian Rogers // Lock of unowned monitor 15926d0b13e931fb73d5e964d14b0a7ecd1f3f5db547Ian Rogers env_->MonitorEnter(object); 15936d0b13e931fb73d5e964d14b0a7ecd1f3f5db547Ian Rogers EXPECT_FALSE(env_->ExceptionCheck()); 15946d0b13e931fb73d5e964d14b0a7ecd1f3f5db547Ian Rogers // Regular unlock 15956d0b13e931fb73d5e964d14b0a7ecd1f3f5db547Ian Rogers env_->MonitorExit(object); 15966d0b13e931fb73d5e964d14b0a7ecd1f3f5db547Ian Rogers EXPECT_FALSE(env_->ExceptionCheck()); 15976d0b13e931fb73d5e964d14b0a7ecd1f3f5db547Ian Rogers 15986d0b13e931fb73d5e964d14b0a7ecd1f3f5db547Ian Rogers // Recursively lock a lot 15996d0b13e931fb73d5e964d14b0a7ecd1f3f5db547Ian Rogers size_t max_recursive_lock = 1024; 16006d0b13e931fb73d5e964d14b0a7ecd1f3f5db547Ian Rogers for (size_t i = 0; i < max_recursive_lock; i++) { 16016d0b13e931fb73d5e964d14b0a7ecd1f3f5db547Ian Rogers env_->MonitorEnter(object); 16026d0b13e931fb73d5e964d14b0a7ecd1f3f5db547Ian Rogers EXPECT_FALSE(env_->ExceptionCheck()); 16036d0b13e931fb73d5e964d14b0a7ecd1f3f5db547Ian Rogers } 16046d0b13e931fb73d5e964d14b0a7ecd1f3f5db547Ian Rogers // Recursively unlock a lot 16056d0b13e931fb73d5e964d14b0a7ecd1f3f5db547Ian Rogers for (size_t i = 0; i < max_recursive_lock; i++) { 16066d0b13e931fb73d5e964d14b0a7ecd1f3f5db547Ian Rogers env_->MonitorExit(object); 16076d0b13e931fb73d5e964d14b0a7ecd1f3f5db547Ian Rogers EXPECT_FALSE(env_->ExceptionCheck()); 16086d0b13e931fb73d5e964d14b0a7ecd1f3f5db547Ian Rogers } 16096d0b13e931fb73d5e964d14b0a7ecd1f3f5db547Ian Rogers 16106d0b13e931fb73d5e964d14b0a7ecd1f3f5db547Ian Rogers // Unlock of unowned monitor 16116d0b13e931fb73d5e964d14b0a7ecd1f3f5db547Ian Rogers env_->MonitorExit(object); 16126d0b13e931fb73d5e964d14b0a7ecd1f3f5db547Ian Rogers EXPECT_TRUE(env_->ExceptionCheck()); 16136d0b13e931fb73d5e964d14b0a7ecd1f3f5db547Ian Rogers thrown_exception = env_->ExceptionOccurred(); 16146d0b13e931fb73d5e964d14b0a7ecd1f3f5db547Ian Rogers env_->ExceptionClear(); 16156d0b13e931fb73d5e964d14b0a7ecd1f3f5db547Ian Rogers EXPECT_TRUE(env_->IsInstanceOf(thrown_exception, imse_class)); 1616a92853eb60fbce1fa6d3bbd6a6013fb514fdf5cbElliott Hughes 1617a92853eb60fbce1fa6d3bbd6a6013fb514fdf5cbElliott Hughes // It's an error to call MonitorEnter or MonitorExit on NULL. 1618b264f081424642b06b0bbe7102781895d41faa9dElliott Hughes { 1619b264f081424642b06b0bbe7102781895d41faa9dElliott Hughes CheckJniAbortCatcher check_jni_abort_catcher; 1620b264f081424642b06b0bbe7102781895d41faa9dElliott Hughes env_->MonitorEnter(NULL); 1621b264f081424642b06b0bbe7102781895d41faa9dElliott Hughes check_jni_abort_catcher.Check("in call to MonitorEnter"); 1622b264f081424642b06b0bbe7102781895d41faa9dElliott Hughes 1623b264f081424642b06b0bbe7102781895d41faa9dElliott Hughes env_->MonitorExit(NULL); 1624b264f081424642b06b0bbe7102781895d41faa9dElliott Hughes check_jni_abort_catcher.Check("in call to MonitorExit"); 1625b264f081424642b06b0bbe7102781895d41faa9dElliott Hughes } 16266d0b13e931fb73d5e964d14b0a7ecd1f3f5db547Ian Rogers} 16276d0b13e931fb73d5e964d14b0a7ecd1f3f5db547Ian Rogers 16284d5714378c3433ba7e351cbf6a6713fb49c31784Brian CarlstromTEST_F(JniInternalTest, DetachCurrentThread) { 16294d5714378c3433ba7e351cbf6a6713fb49c31784Brian Carlstrom CleanUpJniEnv(); // cleanup now so TearDown won't have junk from wrong JNIEnv 16304d5714378c3433ba7e351cbf6a6713fb49c31784Brian Carlstrom jint ok = vm_->DetachCurrentThread(); 16314d5714378c3433ba7e351cbf6a6713fb49c31784Brian Carlstrom EXPECT_EQ(JNI_OK, ok); 16324d5714378c3433ba7e351cbf6a6713fb49c31784Brian Carlstrom 16334d5714378c3433ba7e351cbf6a6713fb49c31784Brian Carlstrom jint err = vm_->DetachCurrentThread(); 16344d5714378c3433ba7e351cbf6a6713fb49c31784Brian Carlstrom EXPECT_EQ(JNI_ERR, err); 16354d5714378c3433ba7e351cbf6a6713fb49c31784Brian Carlstrom vm_->AttachCurrentThread(&env_, NULL); // need attached thread for CommonTest::TearDown 16364d5714378c3433ba7e351cbf6a6713fb49c31784Brian Carlstrom} 16374d5714378c3433ba7e351cbf6a6713fb49c31784Brian Carlstrom 16380cfe1fb7060576d047f7f894fc0d8b87de84fcabIan Rogers} // namespace art 1639