blob: b83985a771fe71fc9b383b14a78248fd97c7f3b3 [file] [log] [blame]
Elliott Hughes2faa5f12012-01-30 14:42:07 -08001/*
2 * Copyright (C) 2011 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
Ian Rogersb033c752011-07-20 12:22:35 -070016
Ian Rogers700a4022014-05-19 16:49:03 -070017#include <memory>
18
Nicolas Geoffray54accbc2014-08-13 03:40:45 +010019#include <math.h>
20
Mathieu Chartiere401d142015-04-22 13:56:20 -070021#include "art_method-inl.h"
Brian Carlstrom578bbdc2011-07-21 14:07:47 -070022#include "class_linker.h"
Brian Carlstroma1ce1fe2014-02-24 23:23:58 -080023#include "common_compiler_test.h"
Brian Carlstrom578bbdc2011-07-21 14:07:47 -070024#include "dex_file.h"
Elliott Hughes90a33692011-08-30 13:27:07 -070025#include "gtest/gtest.h"
Ian Rogerscdd1d2d2011-08-18 09:58:17 -070026#include "indirect_reference_table.h"
Ian Rogerscdd1d2d2011-08-18 09:58:17 -070027#include "jni_internal.h"
Brian Carlstromdb4d5402011-08-09 12:18:28 -070028#include "mem_map.h"
Ian Rogers4f6ad8a2013-03-18 15:27:28 -070029#include "mirror/class-inl.h"
Ian Rogers2dd0e2c2013-01-24 12:42:14 -080030#include "mirror/class_loader.h"
Ian Rogers2dd0e2c2013-01-24 12:42:14 -080031#include "mirror/object_array-inl.h"
Ian Rogers04d7aa92013-03-16 14:29:17 -070032#include "mirror/object-inl.h"
Ian Rogers2dd0e2c2013-01-24 12:42:14 -080033#include "mirror/stack_trace_element.h"
Dimitry Ivanov5edb0632016-04-29 11:14:25 -070034#include "nativeloader/native_loader.h"
Brian Carlstrom578bbdc2011-07-21 14:07:47 -070035#include "runtime.h"
Ian Rogers00f7d0e2012-07-19 15:28:27 -070036#include "ScopedLocalRef.h"
37#include "scoped_thread_state_change.h"
Brian Carlstrom578bbdc2011-07-21 14:07:47 -070038#include "thread.h"
Ian Rogersb033c752011-07-20 12:22:35 -070039
Elliott Hughesb264f082012-04-06 17:10:10 -070040extern "C" JNIEXPORT jint JNICALL Java_MyClassNatives_bar(JNIEnv*, jobject, jint count) {
Brian Carlstromb9cc1ca2012-01-27 00:57:42 -080041 return count + 1;
42}
43
Elliott Hughesb264f082012-04-06 17:10:10 -070044extern "C" JNIEXPORT jint JNICALL Java_MyClassNatives_sbar(JNIEnv*, jclass, jint count) {
Ian Rogers1cefdbd2012-02-29 09:34:50 -080045 return count + 1;
46}
47
Ian Rogersb033c752011-07-20 12:22:35 -070048namespace art {
49
Brian Carlstroma1ce1fe2014-02-24 23:23:58 -080050class JniCompilerTest : public CommonCompilerTest {
Ian Rogersb033c752011-07-20 12:22:35 -070051 protected:
Andreas Gampe6e498692014-08-18 16:43:12 -070052 void SetUp() OVERRIDE {
53 CommonCompilerTest::SetUp();
54 check_generic_jni_ = false;
55 }
56
Dimitry Ivanov5edb0632016-04-29 11:14:25 -070057 void TearDown() OVERRIDE {
58 android::ResetNativeLoader();
59 CommonCompilerTest::TearDown();
60 }
61
Andreas Gampe6e498692014-08-18 16:43:12 -070062 void SetCheckGenericJni(bool generic) {
63 check_generic_jni_ = generic;
64 }
65
Ian Rogers00f7d0e2012-07-19 15:28:27 -070066 void CompileForTest(jobject class_loader, bool direct,
Andreas Gampe6e498692014-08-18 16:43:12 -070067 const char* method_name, const char* method_sig) {
Ian Rogers00f7d0e2012-07-19 15:28:27 -070068 ScopedObjectAccess soa(Thread::Current());
Mathieu Chartiereb8167a2014-05-07 15:43:14 -070069 StackHandleScope<1> hs(soa.Self());
70 Handle<mirror::ClassLoader> loader(
71 hs.NewHandle(soa.Decode<mirror::ClassLoader*>(class_loader)));
Brian Carlstrom25c33252011-09-18 15:58:35 -070072 // Compile the native method before starting the runtime
Ian Rogers98379392014-02-24 16:53:16 -080073 mirror::Class* c = class_linker_->FindClass(soa.Self(), "LMyClassNatives;", loader);
Mathieu Chartiere401d142015-04-22 13:56:20 -070074 const auto pointer_size = class_linker_->GetImagePointerSize();
75 ArtMethod* method = direct ? c->FindDirectMethod(method_name, method_sig, pointer_size) :
76 c->FindVirtualMethod(method_name, method_sig, pointer_size);
Andreas Gampecf4035a2014-05-28 22:43:01 -070077 ASSERT_TRUE(method != nullptr) << method_name << " " << method_sig;
Andreas Gampe6e498692014-08-18 16:43:12 -070078 if (check_generic_jni_) {
Ian Rogers6f3dbba2014-10-14 17:41:57 -070079 method->SetEntryPointFromQuickCompiledCode(class_linker_->GetRuntimeQuickGenericJniStub());
Nicolas Geoffray54accbc2014-08-13 03:40:45 +010080 } else {
Ian Rogers6f3dbba2014-10-14 17:41:57 -070081 const void* code = method->GetEntryPointFromQuickCompiledCode();
82 if (code == nullptr || class_linker_->IsQuickGenericJniStub(code)) {
Nicolas Geoffray54accbc2014-08-13 03:40:45 +010083 CompileMethod(method);
84 ASSERT_TRUE(method->GetEntryPointFromQuickCompiledCode() != nullptr)
85 << method_name << " " << method_sig;
Nicolas Geoffray54accbc2014-08-13 03:40:45 +010086 }
Brian Carlstrom25c33252011-09-18 15:58:35 -070087 }
Brian Carlstrom25c33252011-09-18 15:58:35 -070088 }
89
Ian Rogers00f7d0e2012-07-19 15:28:27 -070090 void SetUpForTest(bool direct, const char* method_name, const char* method_sig,
Andreas Gampe6e498692014-08-18 16:43:12 -070091 void* native_fnptr) {
Ian Rogers00f7d0e2012-07-19 15:28:27 -070092 // Initialize class loader and compile method when runtime not started.
Brian Carlstrom2ce745c2013-07-17 17:44:30 -070093 if (!runtime_->IsStarted()) {
Ian Rogers00f7d0e2012-07-19 15:28:27 -070094 {
95 ScopedObjectAccess soa(Thread::Current());
96 class_loader_ = LoadDex("MyClassNatives");
97 }
Andreas Gampe6e498692014-08-18 16:43:12 -070098 CompileForTest(class_loader_, direct, method_name, method_sig);
Ian Rogers00f7d0e2012-07-19 15:28:27 -070099 // Start runtime.
100 Thread::Current()->TransitionFromSuspendedToRunnable();
Dimitry Ivanov5edb0632016-04-29 11:14:25 -0700101 android::InitializeNativeLoader();
Dimitry Ivanovc544f342016-05-09 16:26:13 -0700102 bool started = runtime_->Start();
Brian Carlstrombd86bcc2013-03-10 20:26:16 -0700103 CHECK(started);
Brian Carlstrom25c33252011-09-18 15:58:35 -0700104 }
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700105 // JNI operations after runtime start.
Brian Carlstrom25c33252011-09-18 15:58:35 -0700106 env_ = Thread::Current()->GetJniEnv();
Dimitry Ivanov5edb0632016-04-29 11:14:25 -0700107 library_search_path_ = env_->NewStringUTF("");
Elliott Hughesb264f082012-04-06 17:10:10 -0700108 jklass_ = env_->FindClass("MyClassNatives");
Andreas Gampecf4035a2014-05-28 22:43:01 -0700109 ASSERT_TRUE(jklass_ != nullptr) << method_name << " " << method_sig;
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700110
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700111 if (direct) {
112 jmethod_ = env_->GetStaticMethodID(jklass_, method_name, method_sig);
113 } else {
114 jmethod_ = env_->GetMethodID(jklass_, method_name, method_sig);
115 }
Andreas Gampecf4035a2014-05-28 22:43:01 -0700116 ASSERT_TRUE(jmethod_ != nullptr) << method_name << " " << method_sig;
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700117
Andreas Gampecf4035a2014-05-28 22:43:01 -0700118 if (native_fnptr != nullptr) {
Elliott Hughesb25c3f62012-03-26 16:35:06 -0700119 JNINativeMethod methods[] = { { method_name, method_sig, native_fnptr } };
Brian Carlstromfc7120c2012-08-27 13:43:25 -0700120 ASSERT_EQ(JNI_OK, env_->RegisterNatives(jklass_, methods, 1))
121 << method_name << " " << method_sig;
Ian Rogersbdb03912011-09-14 00:55:44 -0700122 } else {
123 env_->UnregisterNatives(jklass_);
Shih-wei Liao31384c52011-09-06 15:27:45 -0700124 }
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700125
126 jmethodID constructor = env_->GetMethodID(jklass_, "<init>", "()V");
127 jobj_ = env_->NewObject(jklass_, constructor);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700128 ASSERT_TRUE(jobj_ != nullptr) << method_name << " " << method_sig;
Ian Rogersb033c752011-07-20 12:22:35 -0700129 }
130
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700131 public:
132 static jclass jklass_;
133 static jobject jobj_;
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700134 static jobject class_loader_;
135
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700136 protected:
Andreas Gampe6e498692014-08-18 16:43:12 -0700137 // We have to list the methods here so we can share them between default and generic JNI.
138 void CompileAndRunNoArgMethodImpl();
139 void CompileAndRunIntMethodThroughStubImpl();
140 void CompileAndRunStaticIntMethodThroughStubImpl();
141 void CompileAndRunIntMethodImpl();
142 void CompileAndRunIntIntMethodImpl();
143 void CompileAndRunLongLongMethodImpl();
144 void CompileAndRunDoubleDoubleMethodImpl();
145 void CompileAndRun_fooJJ_synchronizedImpl();
146 void CompileAndRunIntObjectObjectMethodImpl();
147 void CompileAndRunStaticIntIntMethodImpl();
148 void CompileAndRunStaticDoubleDoubleMethodImpl();
149 void RunStaticLogDoubleMethodImpl();
150 void RunStaticLogFloatMethodImpl();
151 void RunStaticReturnTrueImpl();
152 void RunStaticReturnFalseImpl();
153 void RunGenericStaticReturnIntImpl();
154 void CompileAndRunStaticIntObjectObjectMethodImpl();
155 void CompileAndRunStaticSynchronizedIntObjectObjectMethodImpl();
156 void ExceptionHandlingImpl();
157 void NativeStackTraceElementImpl();
158 void ReturnGlobalRefImpl();
159 void LocalReferenceTableClearingTestImpl();
160 void JavaLangSystemArrayCopyImpl();
161 void CompareAndSwapIntImpl();
162 void GetTextImpl();
163 void GetSinkPropertiesNativeImpl();
164 void UpcallReturnTypeChecking_InstanceImpl();
165 void UpcallReturnTypeChecking_StaticImpl();
166 void UpcallArgumentTypeChecking_InstanceImpl();
167 void UpcallArgumentTypeChecking_StaticImpl();
168 void CompileAndRunFloatFloatMethodImpl();
169 void CheckParameterAlignImpl();
170 void MaxParamNumberImpl();
171 void WithoutImplementationImpl();
Andreas Gampe48ee3562015-04-10 19:57:29 -0700172 void WithoutImplementationRefReturnImpl();
Andreas Gampe6e498692014-08-18 16:43:12 -0700173 void StackArgsIntsFirstImpl();
174 void StackArgsFloatsFirstImpl();
175 void StackArgsMixedImpl();
Lazar Trsicf652d602015-06-24 16:30:21 +0200176 void StackArgsSignExtendedMips64Impl();
Andreas Gampe6e498692014-08-18 16:43:12 -0700177
Igor Murashkin9d4b6da2016-07-29 09:51:58 -0700178 void NormalNativeImpl();
179 void FastNativeImpl();
180
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700181 JNIEnv* env_;
Dimitry Ivanov5edb0632016-04-29 11:14:25 -0700182 jstring library_search_path_;
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700183 jmethodID jmethod_;
Andreas Gampe6e498692014-08-18 16:43:12 -0700184 bool check_generic_jni_;
Ian Rogersb033c752011-07-20 12:22:35 -0700185};
186
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700187jclass JniCompilerTest::jklass_;
188jobject JniCompilerTest::jobj_;
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700189jobject JniCompilerTest::class_loader_;
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700190
Andreas Gampe6e498692014-08-18 16:43:12 -0700191#define JNI_TEST(TestName) \
192 TEST_F(JniCompilerTest, TestName ## Default) { \
193 TestName ## Impl(); \
194 } \
195 \
196 TEST_F(JniCompilerTest, TestName ## Generic) { \
197 TEST_DISABLED_FOR_MIPS(); \
198 SetCheckGenericJni(true); \
199 TestName ## Impl(); \
200 }
Andreas Gampecf4035a2014-05-28 22:43:01 -0700201
Elliott Hughesb264f082012-04-06 17:10:10 -0700202int gJava_MyClassNatives_foo_calls = 0;
203void Java_MyClassNatives_foo(JNIEnv* env, jobject thisObj) {
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700204 // 1 = thisObj
Ian Rogers50b35e22012-10-04 10:09:15 -0700205 EXPECT_EQ(kNative, Thread::Current()->GetState());
206 Locks::mutator_lock_->AssertNotHeld(Thread::Current());
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700207 EXPECT_EQ(Thread::Current()->GetJniEnv(), env);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700208 EXPECT_TRUE(thisObj != nullptr);
Ian Rogersa8cd9f42011-08-19 16:43:41 -0700209 EXPECT_TRUE(env->IsInstanceOf(thisObj, JniCompilerTest::jklass_));
Elliott Hughesb264f082012-04-06 17:10:10 -0700210 gJava_MyClassNatives_foo_calls++;
Ian Rogersef7d42f2014-01-06 12:55:46 -0800211 ScopedObjectAccess soa(Thread::Current());
212 EXPECT_EQ(1U, Thread::Current()->NumStackReferences());
Ian Rogersb033c752011-07-20 12:22:35 -0700213}
214
Andreas Gampe6e498692014-08-18 16:43:12 -0700215void JniCompilerTest::CompileAndRunNoArgMethodImpl() {
Ian Rogersef7d42f2014-01-06 12:55:46 -0800216 SetUpForTest(false, "foo", "()V", reinterpret_cast<void*>(&Java_MyClassNatives_foo));
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700217
Elliott Hughesb264f082012-04-06 17:10:10 -0700218 EXPECT_EQ(0, gJava_MyClassNatives_foo_calls);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700219 env_->CallNonvirtualVoidMethod(jobj_, jklass_, jmethod_);
Elliott Hughesb264f082012-04-06 17:10:10 -0700220 EXPECT_EQ(1, gJava_MyClassNatives_foo_calls);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700221 env_->CallNonvirtualVoidMethod(jobj_, jklass_, jmethod_);
Elliott Hughesb264f082012-04-06 17:10:10 -0700222 EXPECT_EQ(2, gJava_MyClassNatives_foo_calls);
Andreas Gampe6e498692014-08-18 16:43:12 -0700223
224 gJava_MyClassNatives_foo_calls = 0;
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700225}
226
Andreas Gampe6e498692014-08-18 16:43:12 -0700227JNI_TEST(CompileAndRunNoArgMethod)
228
229void JniCompilerTest::CompileAndRunIntMethodThroughStubImpl() {
Andreas Gampecf4035a2014-05-28 22:43:01 -0700230 SetUpForTest(false, "bar", "(I)I", nullptr);
231 // calling through stub will link with &Java_MyClassNatives_bar
Shih-wei Liao31384c52011-09-06 15:27:45 -0700232
Shih-wei Liao31384c52011-09-06 15:27:45 -0700233 std::string reason;
Dmitriy Ivanovf5a30992015-11-11 14:18:55 -0800234 ASSERT_TRUE(Runtime::Current()->GetJavaVM()->
Dimitry Ivanov5edb0632016-04-29 11:14:25 -0700235 LoadNativeLibrary(env_, "", class_loader_, library_search_path_, &reason))
Ian Rogers68d8b422014-07-17 11:09:10 -0700236 << reason;
Shih-wei Liao31384c52011-09-06 15:27:45 -0700237
238 jint result = env_->CallNonvirtualIntMethod(jobj_, jklass_, jmethod_, 24);
239 EXPECT_EQ(25, result);
240}
241
Dimitry Ivanov457bc242016-05-02 13:39:39 -0700242JNI_TEST(CompileAndRunIntMethodThroughStub)
Andreas Gampe6e498692014-08-18 16:43:12 -0700243
244void JniCompilerTest::CompileAndRunStaticIntMethodThroughStubImpl() {
Andreas Gampecf4035a2014-05-28 22:43:01 -0700245 SetUpForTest(true, "sbar", "(I)I", nullptr);
246 // calling through stub will link with &Java_MyClassNatives_sbar
Ian Rogers1cefdbd2012-02-29 09:34:50 -0800247
248 std::string reason;
Dmitriy Ivanovf5a30992015-11-11 14:18:55 -0800249 ASSERT_TRUE(Runtime::Current()->GetJavaVM()->
Dimitry Ivanov5edb0632016-04-29 11:14:25 -0700250 LoadNativeLibrary(env_, "", class_loader_, library_search_path_, &reason))
Ian Rogers68d8b422014-07-17 11:09:10 -0700251 << reason;
Ian Rogers1cefdbd2012-02-29 09:34:50 -0800252
253 jint result = env_->CallStaticIntMethod(jklass_, jmethod_, 42);
254 EXPECT_EQ(43, result);
255}
256
Dimitry Ivanov457bc242016-05-02 13:39:39 -0700257JNI_TEST(CompileAndRunStaticIntMethodThroughStub)
Andreas Gampe6e498692014-08-18 16:43:12 -0700258
Elliott Hughesb264f082012-04-06 17:10:10 -0700259int gJava_MyClassNatives_fooI_calls = 0;
260jint Java_MyClassNatives_fooI(JNIEnv* env, jobject thisObj, jint x) {
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700261 // 1 = thisObj
Ian Rogers50b35e22012-10-04 10:09:15 -0700262 EXPECT_EQ(kNative, Thread::Current()->GetState());
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700263 EXPECT_EQ(Thread::Current()->GetJniEnv(), env);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700264 EXPECT_TRUE(thisObj != nullptr);
Ian Rogersa8cd9f42011-08-19 16:43:41 -0700265 EXPECT_TRUE(env->IsInstanceOf(thisObj, JniCompilerTest::jklass_));
Elliott Hughesb264f082012-04-06 17:10:10 -0700266 gJava_MyClassNatives_fooI_calls++;
Ian Rogersef7d42f2014-01-06 12:55:46 -0800267 ScopedObjectAccess soa(Thread::Current());
268 EXPECT_EQ(1U, Thread::Current()->NumStackReferences());
Ian Rogersb033c752011-07-20 12:22:35 -0700269 return x;
270}
271
Andreas Gampe6e498692014-08-18 16:43:12 -0700272void JniCompilerTest::CompileAndRunIntMethodImpl() {
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700273 SetUpForTest(false, "fooI", "(I)I",
Elliott Hughesb264f082012-04-06 17:10:10 -0700274 reinterpret_cast<void*>(&Java_MyClassNatives_fooI));
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700275
Elliott Hughesb264f082012-04-06 17:10:10 -0700276 EXPECT_EQ(0, gJava_MyClassNatives_fooI_calls);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700277 jint result = env_->CallNonvirtualIntMethod(jobj_, jklass_, jmethod_, 42);
278 EXPECT_EQ(42, result);
Elliott Hughesb264f082012-04-06 17:10:10 -0700279 EXPECT_EQ(1, gJava_MyClassNatives_fooI_calls);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700280 result = env_->CallNonvirtualIntMethod(jobj_, jklass_, jmethod_, 0xCAFED00D);
281 EXPECT_EQ(static_cast<jint>(0xCAFED00D), result);
Elliott Hughesb264f082012-04-06 17:10:10 -0700282 EXPECT_EQ(2, gJava_MyClassNatives_fooI_calls);
Andreas Gampe6e498692014-08-18 16:43:12 -0700283
284 gJava_MyClassNatives_fooI_calls = 0;
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700285}
286
Andreas Gampe6e498692014-08-18 16:43:12 -0700287JNI_TEST(CompileAndRunIntMethod)
288
Elliott Hughesb264f082012-04-06 17:10:10 -0700289int gJava_MyClassNatives_fooII_calls = 0;
290jint Java_MyClassNatives_fooII(JNIEnv* env, jobject thisObj, jint x, jint y) {
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700291 // 1 = thisObj
Ian Rogers50b35e22012-10-04 10:09:15 -0700292 EXPECT_EQ(kNative, Thread::Current()->GetState());
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700293 EXPECT_EQ(Thread::Current()->GetJniEnv(), env);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700294 EXPECT_TRUE(thisObj != nullptr);
Ian Rogersa8cd9f42011-08-19 16:43:41 -0700295 EXPECT_TRUE(env->IsInstanceOf(thisObj, JniCompilerTest::jklass_));
Elliott Hughesb264f082012-04-06 17:10:10 -0700296 gJava_MyClassNatives_fooII_calls++;
Ian Rogersef7d42f2014-01-06 12:55:46 -0800297 ScopedObjectAccess soa(Thread::Current());
298 EXPECT_EQ(1U, Thread::Current()->NumStackReferences());
Ian Rogersb033c752011-07-20 12:22:35 -0700299 return x - y; // non-commutative operator
300}
301
Andreas Gampe6e498692014-08-18 16:43:12 -0700302void JniCompilerTest::CompileAndRunIntIntMethodImpl() {
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700303 SetUpForTest(false, "fooII", "(II)I",
Elliott Hughesb264f082012-04-06 17:10:10 -0700304 reinterpret_cast<void*>(&Java_MyClassNatives_fooII));
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700305
Elliott Hughesb264f082012-04-06 17:10:10 -0700306 EXPECT_EQ(0, gJava_MyClassNatives_fooII_calls);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700307 jint result = env_->CallNonvirtualIntMethod(jobj_, jklass_, jmethod_, 99, 10);
308 EXPECT_EQ(99 - 10, result);
Elliott Hughesb264f082012-04-06 17:10:10 -0700309 EXPECT_EQ(1, gJava_MyClassNatives_fooII_calls);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700310 result = env_->CallNonvirtualIntMethod(jobj_, jklass_, jmethod_, 0xCAFEBABE,
311 0xCAFED00D);
312 EXPECT_EQ(static_cast<jint>(0xCAFEBABE - 0xCAFED00D), result);
Elliott Hughesb264f082012-04-06 17:10:10 -0700313 EXPECT_EQ(2, gJava_MyClassNatives_fooII_calls);
Andreas Gampe6e498692014-08-18 16:43:12 -0700314
315 gJava_MyClassNatives_fooII_calls = 0;
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700316}
317
Andreas Gampe6e498692014-08-18 16:43:12 -0700318JNI_TEST(CompileAndRunIntIntMethod)
319
Elliott Hughesb264f082012-04-06 17:10:10 -0700320int gJava_MyClassNatives_fooJJ_calls = 0;
321jlong Java_MyClassNatives_fooJJ(JNIEnv* env, jobject thisObj, jlong x, jlong y) {
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700322 // 1 = thisObj
Ian Rogers50b35e22012-10-04 10:09:15 -0700323 EXPECT_EQ(kNative, Thread::Current()->GetState());
Ian Rogers9b269d22011-09-04 14:06:05 -0700324 EXPECT_EQ(Thread::Current()->GetJniEnv(), env);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700325 EXPECT_TRUE(thisObj != nullptr);
Ian Rogers9b269d22011-09-04 14:06:05 -0700326 EXPECT_TRUE(env->IsInstanceOf(thisObj, JniCompilerTest::jklass_));
Elliott Hughesb264f082012-04-06 17:10:10 -0700327 gJava_MyClassNatives_fooJJ_calls++;
Ian Rogersef7d42f2014-01-06 12:55:46 -0800328 ScopedObjectAccess soa(Thread::Current());
329 EXPECT_EQ(1U, Thread::Current()->NumStackReferences());
Ian Rogers9b269d22011-09-04 14:06:05 -0700330 return x - y; // non-commutative operator
331}
332
Andreas Gampe6e498692014-08-18 16:43:12 -0700333void JniCompilerTest::CompileAndRunLongLongMethodImpl() {
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700334 SetUpForTest(false, "fooJJ", "(JJ)J",
Elliott Hughesb264f082012-04-06 17:10:10 -0700335 reinterpret_cast<void*>(&Java_MyClassNatives_fooJJ));
Ian Rogers9b269d22011-09-04 14:06:05 -0700336
Elliott Hughesb264f082012-04-06 17:10:10 -0700337 EXPECT_EQ(0, gJava_MyClassNatives_fooJJ_calls);
Ian Rogers0f678472014-03-10 16:18:37 -0700338 jlong a = INT64_C(0x1234567890ABCDEF);
339 jlong b = INT64_C(0xFEDCBA0987654321);
Ian Rogers9b269d22011-09-04 14:06:05 -0700340 jlong result = env_->CallNonvirtualLongMethod(jobj_, jklass_, jmethod_, a, b);
341 EXPECT_EQ(a - b, result);
Elliott Hughesb264f082012-04-06 17:10:10 -0700342 EXPECT_EQ(1, gJava_MyClassNatives_fooJJ_calls);
Ian Rogers9b269d22011-09-04 14:06:05 -0700343 result = env_->CallNonvirtualLongMethod(jobj_, jklass_, jmethod_, b, a);
344 EXPECT_EQ(b - a, result);
Elliott Hughesb264f082012-04-06 17:10:10 -0700345 EXPECT_EQ(2, gJava_MyClassNatives_fooJJ_calls);
Andreas Gampe6e498692014-08-18 16:43:12 -0700346
347 gJava_MyClassNatives_fooJJ_calls = 0;
Ian Rogers9b269d22011-09-04 14:06:05 -0700348}
349
Andreas Gampe6e498692014-08-18 16:43:12 -0700350JNI_TEST(CompileAndRunLongLongMethod)
351
Elliott Hughesb264f082012-04-06 17:10:10 -0700352int gJava_MyClassNatives_fooDD_calls = 0;
353jdouble Java_MyClassNatives_fooDD(JNIEnv* env, jobject thisObj, jdouble x, jdouble y) {
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700354 // 1 = thisObj
Ian Rogers50b35e22012-10-04 10:09:15 -0700355 EXPECT_EQ(kNative, Thread::Current()->GetState());
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700356 EXPECT_EQ(Thread::Current()->GetJniEnv(), env);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700357 EXPECT_TRUE(thisObj != nullptr);
Ian Rogersa8cd9f42011-08-19 16:43:41 -0700358 EXPECT_TRUE(env->IsInstanceOf(thisObj, JniCompilerTest::jklass_));
Elliott Hughesb264f082012-04-06 17:10:10 -0700359 gJava_MyClassNatives_fooDD_calls++;
Ian Rogersef7d42f2014-01-06 12:55:46 -0800360 ScopedObjectAccess soa(Thread::Current());
361 EXPECT_EQ(1U, Thread::Current()->NumStackReferences());
Ian Rogersb033c752011-07-20 12:22:35 -0700362 return x - y; // non-commutative operator
363}
364
Andreas Gampe6e498692014-08-18 16:43:12 -0700365void JniCompilerTest::CompileAndRunDoubleDoubleMethodImpl() {
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700366 SetUpForTest(false, "fooDD", "(DD)D",
Elliott Hughesb264f082012-04-06 17:10:10 -0700367 reinterpret_cast<void*>(&Java_MyClassNatives_fooDD));
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700368
Elliott Hughesb264f082012-04-06 17:10:10 -0700369 EXPECT_EQ(0, gJava_MyClassNatives_fooDD_calls);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700370 jdouble result = env_->CallNonvirtualDoubleMethod(jobj_, jklass_, jmethod_,
371 99.0, 10.0);
Ian Rogers647b1a82014-10-10 11:02:11 -0700372 EXPECT_DOUBLE_EQ(99.0 - 10.0, result);
Elliott Hughesb264f082012-04-06 17:10:10 -0700373 EXPECT_EQ(1, gJava_MyClassNatives_fooDD_calls);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700374 jdouble a = 3.14159265358979323846;
375 jdouble b = 0.69314718055994530942;
376 result = env_->CallNonvirtualDoubleMethod(jobj_, jklass_, jmethod_, a, b);
Ian Rogers647b1a82014-10-10 11:02:11 -0700377 EXPECT_DOUBLE_EQ(a - b, result);
Elliott Hughesb264f082012-04-06 17:10:10 -0700378 EXPECT_EQ(2, gJava_MyClassNatives_fooDD_calls);
Andreas Gampe6e498692014-08-18 16:43:12 -0700379
380 gJava_MyClassNatives_fooDD_calls = 0;
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700381}
382
Elliott Hughes3e778f72012-05-21 15:29:52 -0700383int gJava_MyClassNatives_fooJJ_synchronized_calls = 0;
384jlong Java_MyClassNatives_fooJJ_synchronized(JNIEnv* env, jobject thisObj, jlong x, jlong y) {
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700385 // 1 = thisObj
Ian Rogers50b35e22012-10-04 10:09:15 -0700386 EXPECT_EQ(kNative, Thread::Current()->GetState());
Elliott Hughes3e778f72012-05-21 15:29:52 -0700387 EXPECT_EQ(Thread::Current()->GetJniEnv(), env);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700388 EXPECT_TRUE(thisObj != nullptr);
Elliott Hughes3e778f72012-05-21 15:29:52 -0700389 EXPECT_TRUE(env->IsInstanceOf(thisObj, JniCompilerTest::jklass_));
390 gJava_MyClassNatives_fooJJ_synchronized_calls++;
Ian Rogersef7d42f2014-01-06 12:55:46 -0800391 ScopedObjectAccess soa(Thread::Current());
392 EXPECT_EQ(1U, Thread::Current()->NumStackReferences());
Elliott Hughes3e778f72012-05-21 15:29:52 -0700393 return x | y;
394}
395
Andreas Gampe6e498692014-08-18 16:43:12 -0700396void JniCompilerTest::CompileAndRun_fooJJ_synchronizedImpl() {
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700397 SetUpForTest(false, "fooJJ_synchronized", "(JJ)J",
Elliott Hughes3e778f72012-05-21 15:29:52 -0700398 reinterpret_cast<void*>(&Java_MyClassNatives_fooJJ_synchronized));
399
400 EXPECT_EQ(0, gJava_MyClassNatives_fooJJ_synchronized_calls);
401 jlong a = 0x1000000020000000ULL;
402 jlong b = 0x00ff000000aa0000ULL;
403 jlong result = env_->CallNonvirtualLongMethod(jobj_, jklass_, jmethod_, a, b);
404 EXPECT_EQ(a | b, result);
405 EXPECT_EQ(1, gJava_MyClassNatives_fooJJ_synchronized_calls);
Andreas Gampe6e498692014-08-18 16:43:12 -0700406
407 gJava_MyClassNatives_fooJJ_synchronized_calls = 0;
Elliott Hughes3e778f72012-05-21 15:29:52 -0700408}
409
Andreas Gampe6e498692014-08-18 16:43:12 -0700410JNI_TEST(CompileAndRun_fooJJ_synchronized)
411
Elliott Hughesb264f082012-04-06 17:10:10 -0700412int gJava_MyClassNatives_fooIOO_calls = 0;
413jobject Java_MyClassNatives_fooIOO(JNIEnv* env, jobject thisObj, jint x, jobject y,
Ian Rogersb033c752011-07-20 12:22:35 -0700414 jobject z) {
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700415 // 3 = this + y + z
Ian Rogers50b35e22012-10-04 10:09:15 -0700416 EXPECT_EQ(kNative, Thread::Current()->GetState());
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700417 EXPECT_EQ(Thread::Current()->GetJniEnv(), env);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700418 EXPECT_TRUE(thisObj != nullptr);
Ian Rogersa8cd9f42011-08-19 16:43:41 -0700419 EXPECT_TRUE(env->IsInstanceOf(thisObj, JniCompilerTest::jklass_));
Elliott Hughesb264f082012-04-06 17:10:10 -0700420 gJava_MyClassNatives_fooIOO_calls++;
Ian Rogersef7d42f2014-01-06 12:55:46 -0800421 ScopedObjectAccess soa(Thread::Current());
Andreas Gampebf6b92a2014-03-05 16:11:04 -0800422 size_t null_args = (y == nullptr ? 1 : 0) + (z == nullptr ? 1 : 0);
423 EXPECT_TRUE(3U == Thread::Current()->NumStackReferences() ||
424 (3U - null_args) == Thread::Current()->NumStackReferences());
Ian Rogersb033c752011-07-20 12:22:35 -0700425 switch (x) {
426 case 1:
427 return y;
428 case 2:
429 return z;
430 default:
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700431 return thisObj;
Ian Rogersb033c752011-07-20 12:22:35 -0700432 }
433}
434
Andreas Gampe6e498692014-08-18 16:43:12 -0700435void JniCompilerTest::CompileAndRunIntObjectObjectMethodImpl() {
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700436 SetUpForTest(false, "fooIOO",
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700437 "(ILjava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;",
Elliott Hughesb264f082012-04-06 17:10:10 -0700438 reinterpret_cast<void*>(&Java_MyClassNatives_fooIOO));
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700439
Elliott Hughesb264f082012-04-06 17:10:10 -0700440 EXPECT_EQ(0, gJava_MyClassNatives_fooIOO_calls);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700441 jobject result = env_->CallNonvirtualObjectMethod(jobj_, jklass_, jmethod_, 0, nullptr, nullptr);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700442 EXPECT_TRUE(env_->IsSameObject(jobj_, result));
Elliott Hughesb264f082012-04-06 17:10:10 -0700443 EXPECT_EQ(1, gJava_MyClassNatives_fooIOO_calls);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700444
Andreas Gampecf4035a2014-05-28 22:43:01 -0700445 result = env_->CallNonvirtualObjectMethod(jobj_, jklass_, jmethod_, 0, nullptr, jklass_);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700446 EXPECT_TRUE(env_->IsSameObject(jobj_, result));
Elliott Hughesb264f082012-04-06 17:10:10 -0700447 EXPECT_EQ(2, gJava_MyClassNatives_fooIOO_calls);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700448 result = env_->CallNonvirtualObjectMethod(jobj_, jklass_, jmethod_, 1, nullptr, jklass_);
449 EXPECT_TRUE(env_->IsSameObject(nullptr, result));
Elliott Hughesb264f082012-04-06 17:10:10 -0700450 EXPECT_EQ(3, gJava_MyClassNatives_fooIOO_calls);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700451 result = env_->CallNonvirtualObjectMethod(jobj_, jklass_, jmethod_, 2, nullptr, jklass_);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700452 EXPECT_TRUE(env_->IsSameObject(jklass_, result));
Elliott Hughesb264f082012-04-06 17:10:10 -0700453 EXPECT_EQ(4, gJava_MyClassNatives_fooIOO_calls);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700454
Andreas Gampecf4035a2014-05-28 22:43:01 -0700455 result = env_->CallNonvirtualObjectMethod(jobj_, jklass_, jmethod_, 0, jklass_, nullptr);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700456 EXPECT_TRUE(env_->IsSameObject(jobj_, result));
Elliott Hughesb264f082012-04-06 17:10:10 -0700457 EXPECT_EQ(5, gJava_MyClassNatives_fooIOO_calls);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700458 result = env_->CallNonvirtualObjectMethod(jobj_, jklass_, jmethod_, 1, jklass_, nullptr);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700459 EXPECT_TRUE(env_->IsSameObject(jklass_, result));
Elliott Hughesb264f082012-04-06 17:10:10 -0700460 EXPECT_EQ(6, gJava_MyClassNatives_fooIOO_calls);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700461 result = env_->CallNonvirtualObjectMethod(jobj_, jklass_, jmethod_, 2, jklass_, nullptr);
462 EXPECT_TRUE(env_->IsSameObject(nullptr, result));
Elliott Hughesb264f082012-04-06 17:10:10 -0700463 EXPECT_EQ(7, gJava_MyClassNatives_fooIOO_calls);
Andreas Gampe6e498692014-08-18 16:43:12 -0700464
465 gJava_MyClassNatives_fooIOO_calls = 0;
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700466}
467
Andreas Gampe6e498692014-08-18 16:43:12 -0700468JNI_TEST(CompileAndRunIntObjectObjectMethod)
469
Elliott Hughesb264f082012-04-06 17:10:10 -0700470int gJava_MyClassNatives_fooSII_calls = 0;
471jint Java_MyClassNatives_fooSII(JNIEnv* env, jclass klass, jint x, jint y) {
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700472 // 1 = klass
Ian Rogers50b35e22012-10-04 10:09:15 -0700473 EXPECT_EQ(kNative, Thread::Current()->GetState());
Shih-wei Liao82da44b2011-09-01 00:38:04 -0700474 EXPECT_EQ(Thread::Current()->GetJniEnv(), env);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700475 EXPECT_TRUE(klass != nullptr);
Shih-wei Liao82da44b2011-09-01 00:38:04 -0700476 EXPECT_TRUE(env->IsInstanceOf(JniCompilerTest::jobj_, klass));
Elliott Hughesb264f082012-04-06 17:10:10 -0700477 gJava_MyClassNatives_fooSII_calls++;
Ian Rogersef7d42f2014-01-06 12:55:46 -0800478 ScopedObjectAccess soa(Thread::Current());
479 EXPECT_EQ(1U, Thread::Current()->NumStackReferences());
Shih-wei Liao82da44b2011-09-01 00:38:04 -0700480 return x + y;
481}
482
Andreas Gampe6e498692014-08-18 16:43:12 -0700483void JniCompilerTest::CompileAndRunStaticIntIntMethodImpl() {
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700484 SetUpForTest(true, "fooSII", "(II)I",
Elliott Hughesb264f082012-04-06 17:10:10 -0700485 reinterpret_cast<void*>(&Java_MyClassNatives_fooSII));
Shih-wei Liao82da44b2011-09-01 00:38:04 -0700486
Elliott Hughesb264f082012-04-06 17:10:10 -0700487 EXPECT_EQ(0, gJava_MyClassNatives_fooSII_calls);
Shih-wei Liao82da44b2011-09-01 00:38:04 -0700488 jint result = env_->CallStaticIntMethod(jklass_, jmethod_, 20, 30);
489 EXPECT_EQ(50, result);
Elliott Hughesb264f082012-04-06 17:10:10 -0700490 EXPECT_EQ(1, gJava_MyClassNatives_fooSII_calls);
Andreas Gampe6e498692014-08-18 16:43:12 -0700491
492 gJava_MyClassNatives_fooSII_calls = 0;
Shih-wei Liao82da44b2011-09-01 00:38:04 -0700493}
494
Andreas Gampe6e498692014-08-18 16:43:12 -0700495JNI_TEST(CompileAndRunStaticIntIntMethod)
496
Elliott Hughesb264f082012-04-06 17:10:10 -0700497int gJava_MyClassNatives_fooSDD_calls = 0;
498jdouble Java_MyClassNatives_fooSDD(JNIEnv* env, jclass klass, jdouble x, jdouble y) {
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700499 // 1 = klass
Ian Rogers50b35e22012-10-04 10:09:15 -0700500 EXPECT_EQ(kNative, Thread::Current()->GetState());
Ian Rogers7a99c112011-09-07 12:48:27 -0700501 EXPECT_EQ(Thread::Current()->GetJniEnv(), env);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700502 EXPECT_TRUE(klass != nullptr);
Ian Rogers7a99c112011-09-07 12:48:27 -0700503 EXPECT_TRUE(env->IsInstanceOf(JniCompilerTest::jobj_, klass));
Elliott Hughesb264f082012-04-06 17:10:10 -0700504 gJava_MyClassNatives_fooSDD_calls++;
Ian Rogersef7d42f2014-01-06 12:55:46 -0800505 ScopedObjectAccess soa(Thread::Current());
506 EXPECT_EQ(1U, Thread::Current()->NumStackReferences());
Ian Rogers7a99c112011-09-07 12:48:27 -0700507 return x - y; // non-commutative operator
508}
509
Andreas Gampe6e498692014-08-18 16:43:12 -0700510void JniCompilerTest::CompileAndRunStaticDoubleDoubleMethodImpl() {
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700511 SetUpForTest(true, "fooSDD", "(DD)D",
Elliott Hughesb264f082012-04-06 17:10:10 -0700512 reinterpret_cast<void*>(&Java_MyClassNatives_fooSDD));
Ian Rogers7a99c112011-09-07 12:48:27 -0700513
Elliott Hughesb264f082012-04-06 17:10:10 -0700514 EXPECT_EQ(0, gJava_MyClassNatives_fooSDD_calls);
Ian Rogers7a99c112011-09-07 12:48:27 -0700515 jdouble result = env_->CallStaticDoubleMethod(jklass_, jmethod_, 99.0, 10.0);
Ian Rogers647b1a82014-10-10 11:02:11 -0700516 EXPECT_DOUBLE_EQ(99.0 - 10.0, result);
Elliott Hughesb264f082012-04-06 17:10:10 -0700517 EXPECT_EQ(1, gJava_MyClassNatives_fooSDD_calls);
Ian Rogers7a99c112011-09-07 12:48:27 -0700518 jdouble a = 3.14159265358979323846;
519 jdouble b = 0.69314718055994530942;
520 result = env_->CallStaticDoubleMethod(jklass_, jmethod_, a, b);
Ian Rogers647b1a82014-10-10 11:02:11 -0700521 EXPECT_DOUBLE_EQ(a - b, result);
522 EXPECT_DOUBLE_EQ(2, gJava_MyClassNatives_fooSDD_calls);
Andreas Gampe6e498692014-08-18 16:43:12 -0700523
524 gJava_MyClassNatives_fooSDD_calls = 0;
Ian Rogers7a99c112011-09-07 12:48:27 -0700525}
526
Andreas Gampe6e498692014-08-18 16:43:12 -0700527JNI_TEST(CompileAndRunStaticDoubleDoubleMethod)
528
Nicolas Geoffray54accbc2014-08-13 03:40:45 +0100529// The x86 generic JNI code had a bug where it assumed a floating
530// point return value would be in xmm0. We use log, to somehow ensure
531// the compiler will use the floating point stack.
532
Ian Rogers6a3c1fc2014-10-31 00:33:20 -0700533jdouble Java_MyClassNatives_logD(JNIEnv*, jclass, jdouble x) {
Nicolas Geoffray54accbc2014-08-13 03:40:45 +0100534 return log(x);
535}
536
Andreas Gampe6e498692014-08-18 16:43:12 -0700537void JniCompilerTest::RunStaticLogDoubleMethodImpl() {
Andreas Gampe6e498692014-08-18 16:43:12 -0700538 SetUpForTest(true, "logD", "(D)D", reinterpret_cast<void*>(&Java_MyClassNatives_logD));
Nicolas Geoffray54accbc2014-08-13 03:40:45 +0100539
540 jdouble result = env_->CallStaticDoubleMethod(jklass_, jmethod_, 2.0);
Ian Rogers647b1a82014-10-10 11:02:11 -0700541 EXPECT_DOUBLE_EQ(log(2.0), result);
Nicolas Geoffray54accbc2014-08-13 03:40:45 +0100542}
543
Andreas Gampe6e498692014-08-18 16:43:12 -0700544JNI_TEST(RunStaticLogDoubleMethod)
545
Ian Rogers6a3c1fc2014-10-31 00:33:20 -0700546jfloat Java_MyClassNatives_logF(JNIEnv*, jclass, jfloat x) {
Nicolas Geoffray54accbc2014-08-13 03:40:45 +0100547 return logf(x);
548}
549
Andreas Gampe6e498692014-08-18 16:43:12 -0700550void JniCompilerTest::RunStaticLogFloatMethodImpl() {
Andreas Gampe6e498692014-08-18 16:43:12 -0700551 SetUpForTest(true, "logF", "(F)F", reinterpret_cast<void*>(&Java_MyClassNatives_logF));
Nicolas Geoffray54accbc2014-08-13 03:40:45 +0100552
553 jfloat result = env_->CallStaticFloatMethod(jklass_, jmethod_, 2.0);
Ian Rogers647b1a82014-10-10 11:02:11 -0700554 EXPECT_FLOAT_EQ(logf(2.0), result);
Nicolas Geoffray54accbc2014-08-13 03:40:45 +0100555}
556
Andreas Gampe6e498692014-08-18 16:43:12 -0700557JNI_TEST(RunStaticLogFloatMethod)
558
Ian Rogers6a3c1fc2014-10-31 00:33:20 -0700559jboolean Java_MyClassNatives_returnTrue(JNIEnv*, jclass) {
Nicolas Geoffray54accbc2014-08-13 03:40:45 +0100560 return JNI_TRUE;
561}
562
Ian Rogers6a3c1fc2014-10-31 00:33:20 -0700563jboolean Java_MyClassNatives_returnFalse(JNIEnv*, jclass) {
Nicolas Geoffray54accbc2014-08-13 03:40:45 +0100564 return JNI_FALSE;
565}
566
Ian Rogers6a3c1fc2014-10-31 00:33:20 -0700567jint Java_MyClassNatives_returnInt(JNIEnv*, jclass) {
Nicolas Geoffray54accbc2014-08-13 03:40:45 +0100568 return 42;
569}
570
Andreas Gampe6e498692014-08-18 16:43:12 -0700571void JniCompilerTest::RunStaticReturnTrueImpl() {
Andreas Gampe6e498692014-08-18 16:43:12 -0700572 SetUpForTest(true, "returnTrue", "()Z", reinterpret_cast<void*>(&Java_MyClassNatives_returnTrue));
Nicolas Geoffray54accbc2014-08-13 03:40:45 +0100573
574 jboolean result = env_->CallStaticBooleanMethod(jklass_, jmethod_);
575 EXPECT_TRUE(result);
576}
577
Andreas Gampe6e498692014-08-18 16:43:12 -0700578JNI_TEST(RunStaticReturnTrue)
579
580void JniCompilerTest::RunStaticReturnFalseImpl() {
Nicolas Geoffray54accbc2014-08-13 03:40:45 +0100581 SetUpForTest(true, "returnFalse", "()Z",
Andreas Gampe6e498692014-08-18 16:43:12 -0700582 reinterpret_cast<void*>(&Java_MyClassNatives_returnFalse));
Nicolas Geoffray54accbc2014-08-13 03:40:45 +0100583
584 jboolean result = env_->CallStaticBooleanMethod(jklass_, jmethod_);
585 EXPECT_FALSE(result);
586}
587
Andreas Gampe6e498692014-08-18 16:43:12 -0700588JNI_TEST(RunStaticReturnFalse)
589
590void JniCompilerTest::RunGenericStaticReturnIntImpl() {
Andreas Gampe6e498692014-08-18 16:43:12 -0700591 SetUpForTest(true, "returnInt", "()I", reinterpret_cast<void*>(&Java_MyClassNatives_returnInt));
Nicolas Geoffray54accbc2014-08-13 03:40:45 +0100592
593 jint result = env_->CallStaticIntMethod(jklass_, jmethod_);
594 EXPECT_EQ(42, result);
595}
596
Andreas Gampe6e498692014-08-18 16:43:12 -0700597JNI_TEST(RunGenericStaticReturnInt)
598
Elliott Hughesb264f082012-04-06 17:10:10 -0700599int gJava_MyClassNatives_fooSIOO_calls = 0;
600jobject Java_MyClassNatives_fooSIOO(JNIEnv* env, jclass klass, jint x, jobject y,
Ian Rogersb033c752011-07-20 12:22:35 -0700601 jobject z) {
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700602 // 3 = klass + y + z
Ian Rogers50b35e22012-10-04 10:09:15 -0700603 EXPECT_EQ(kNative, Thread::Current()->GetState());
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700604 EXPECT_EQ(Thread::Current()->GetJniEnv(), env);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700605 EXPECT_TRUE(klass != nullptr);
Ian Rogersa8cd9f42011-08-19 16:43:41 -0700606 EXPECT_TRUE(env->IsInstanceOf(JniCompilerTest::jobj_, klass));
Elliott Hughesb264f082012-04-06 17:10:10 -0700607 gJava_MyClassNatives_fooSIOO_calls++;
Ian Rogersef7d42f2014-01-06 12:55:46 -0800608 ScopedObjectAccess soa(Thread::Current());
Andreas Gampebf6b92a2014-03-05 16:11:04 -0800609 size_t null_args = (y == nullptr ? 1 : 0) + (z == nullptr ? 1 : 0);
610 EXPECT_TRUE(3U == Thread::Current()->NumStackReferences() ||
611 (3U - null_args) == Thread::Current()->NumStackReferences());
Ian Rogersb033c752011-07-20 12:22:35 -0700612 switch (x) {
613 case 1:
614 return y;
615 case 2:
616 return z;
617 default:
618 return klass;
619 }
620}
621
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700622
Andreas Gampe6e498692014-08-18 16:43:12 -0700623void JniCompilerTest::CompileAndRunStaticIntObjectObjectMethodImpl() {
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700624 SetUpForTest(true, "fooSIOO",
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700625 "(ILjava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;",
Elliott Hughesb264f082012-04-06 17:10:10 -0700626 reinterpret_cast<void*>(&Java_MyClassNatives_fooSIOO));
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700627
Elliott Hughesb264f082012-04-06 17:10:10 -0700628 EXPECT_EQ(0, gJava_MyClassNatives_fooSIOO_calls);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700629 jobject result = env_->CallStaticObjectMethod(jklass_, jmethod_, 0, nullptr, nullptr);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700630 EXPECT_TRUE(env_->IsSameObject(jklass_, result));
Elliott Hughesb264f082012-04-06 17:10:10 -0700631 EXPECT_EQ(1, gJava_MyClassNatives_fooSIOO_calls);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700632
Andreas Gampecf4035a2014-05-28 22:43:01 -0700633 result = env_->CallStaticObjectMethod(jklass_, jmethod_, 0, nullptr, jobj_);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700634 EXPECT_TRUE(env_->IsSameObject(jklass_, result));
Elliott Hughesb264f082012-04-06 17:10:10 -0700635 EXPECT_EQ(2, gJava_MyClassNatives_fooSIOO_calls);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700636 result = env_->CallStaticObjectMethod(jklass_, jmethod_, 1, nullptr, jobj_);
637 EXPECT_TRUE(env_->IsSameObject(nullptr, result));
Elliott Hughesb264f082012-04-06 17:10:10 -0700638 EXPECT_EQ(3, gJava_MyClassNatives_fooSIOO_calls);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700639 result = env_->CallStaticObjectMethod(jklass_, jmethod_, 2, nullptr, jobj_);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700640 EXPECT_TRUE(env_->IsSameObject(jobj_, result));
Elliott Hughesb264f082012-04-06 17:10:10 -0700641 EXPECT_EQ(4, gJava_MyClassNatives_fooSIOO_calls);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700642
Andreas Gampecf4035a2014-05-28 22:43:01 -0700643 result = env_->CallStaticObjectMethod(jklass_, jmethod_, 0, jobj_, nullptr);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700644 EXPECT_TRUE(env_->IsSameObject(jklass_, result));
Elliott Hughesb264f082012-04-06 17:10:10 -0700645 EXPECT_EQ(5, gJava_MyClassNatives_fooSIOO_calls);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700646 result = env_->CallStaticObjectMethod(jklass_, jmethod_, 1, jobj_, nullptr);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700647 EXPECT_TRUE(env_->IsSameObject(jobj_, result));
Elliott Hughesb264f082012-04-06 17:10:10 -0700648 EXPECT_EQ(6, gJava_MyClassNatives_fooSIOO_calls);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700649 result = env_->CallStaticObjectMethod(jklass_, jmethod_, 2, jobj_, nullptr);
650 EXPECT_TRUE(env_->IsSameObject(nullptr, result));
Elliott Hughesb264f082012-04-06 17:10:10 -0700651 EXPECT_EQ(7, gJava_MyClassNatives_fooSIOO_calls);
Andreas Gampe6e498692014-08-18 16:43:12 -0700652
653 gJava_MyClassNatives_fooSIOO_calls = 0;
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700654}
655
Andreas Gampe6e498692014-08-18 16:43:12 -0700656JNI_TEST(CompileAndRunStaticIntObjectObjectMethod)
657
Elliott Hughesb264f082012-04-06 17:10:10 -0700658int gJava_MyClassNatives_fooSSIOO_calls = 0;
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700659jobject Java_MyClassNatives_fooSSIOO(JNIEnv* env, jclass klass, jint x, jobject y, jobject z) {
660 // 3 = klass + y + z
Ian Rogers50b35e22012-10-04 10:09:15 -0700661 EXPECT_EQ(kNative, Thread::Current()->GetState());
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700662 EXPECT_EQ(Thread::Current()->GetJniEnv(), env);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700663 EXPECT_TRUE(klass != nullptr);
Ian Rogersa8cd9f42011-08-19 16:43:41 -0700664 EXPECT_TRUE(env->IsInstanceOf(JniCompilerTest::jobj_, klass));
Elliott Hughesb264f082012-04-06 17:10:10 -0700665 gJava_MyClassNatives_fooSSIOO_calls++;
Ian Rogersef7d42f2014-01-06 12:55:46 -0800666 ScopedObjectAccess soa(Thread::Current());
Andreas Gampebf6b92a2014-03-05 16:11:04 -0800667 size_t null_args = (y == nullptr ? 1 : 0) + (z == nullptr ? 1 : 0);
668 EXPECT_TRUE(3U == Thread::Current()->NumStackReferences() ||
669 (3U - null_args) == Thread::Current()->NumStackReferences());
Ian Rogersdf20fe02011-07-20 20:34:16 -0700670 switch (x) {
671 case 1:
672 return y;
673 case 2:
674 return z;
675 default:
676 return klass;
677 }
678}
679
Andreas Gampe6e498692014-08-18 16:43:12 -0700680void JniCompilerTest::CompileAndRunStaticSynchronizedIntObjectObjectMethodImpl() {
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700681 SetUpForTest(true, "fooSSIOO",
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700682 "(ILjava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;",
Elliott Hughesb264f082012-04-06 17:10:10 -0700683 reinterpret_cast<void*>(&Java_MyClassNatives_fooSSIOO));
Carl Shapiro419ec7b2011-08-03 14:48:33 -0700684
Elliott Hughesb264f082012-04-06 17:10:10 -0700685 EXPECT_EQ(0, gJava_MyClassNatives_fooSSIOO_calls);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700686 jobject result = env_->CallStaticObjectMethod(jklass_, jmethod_, 0, nullptr, nullptr);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700687 EXPECT_TRUE(env_->IsSameObject(jklass_, result));
Elliott Hughesb264f082012-04-06 17:10:10 -0700688 EXPECT_EQ(1, gJava_MyClassNatives_fooSSIOO_calls);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700689
Andreas Gampecf4035a2014-05-28 22:43:01 -0700690 result = env_->CallStaticObjectMethod(jklass_, jmethod_, 0, nullptr, jobj_);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700691 EXPECT_TRUE(env_->IsSameObject(jklass_, result));
Elliott Hughesb264f082012-04-06 17:10:10 -0700692 EXPECT_EQ(2, gJava_MyClassNatives_fooSSIOO_calls);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700693 result = env_->CallStaticObjectMethod(jklass_, jmethod_, 1, nullptr, jobj_);
694 EXPECT_TRUE(env_->IsSameObject(nullptr, result));
Elliott Hughesb264f082012-04-06 17:10:10 -0700695 EXPECT_EQ(3, gJava_MyClassNatives_fooSSIOO_calls);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700696 result = env_->CallStaticObjectMethod(jklass_, jmethod_, 2, nullptr, jobj_);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700697 EXPECT_TRUE(env_->IsSameObject(jobj_, result));
Elliott Hughesb264f082012-04-06 17:10:10 -0700698 EXPECT_EQ(4, gJava_MyClassNatives_fooSSIOO_calls);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700699
Andreas Gampecf4035a2014-05-28 22:43:01 -0700700 result = env_->CallStaticObjectMethod(jklass_, jmethod_, 0, jobj_, nullptr);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700701 EXPECT_TRUE(env_->IsSameObject(jklass_, result));
Elliott Hughesb264f082012-04-06 17:10:10 -0700702 EXPECT_EQ(5, gJava_MyClassNatives_fooSSIOO_calls);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700703 result = env_->CallStaticObjectMethod(jklass_, jmethod_, 1, jobj_, nullptr);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700704 EXPECT_TRUE(env_->IsSameObject(jobj_, result));
Elliott Hughesb264f082012-04-06 17:10:10 -0700705 EXPECT_EQ(6, gJava_MyClassNatives_fooSSIOO_calls);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700706 result = env_->CallStaticObjectMethod(jklass_, jmethod_, 2, jobj_, nullptr);
707 EXPECT_TRUE(env_->IsSameObject(nullptr, result));
Elliott Hughesb264f082012-04-06 17:10:10 -0700708 EXPECT_EQ(7, gJava_MyClassNatives_fooSSIOO_calls);
Andreas Gampe6e498692014-08-18 16:43:12 -0700709
710 gJava_MyClassNatives_fooSSIOO_calls = 0;
Ian Rogersdf20fe02011-07-20 20:34:16 -0700711}
712
Andreas Gampe6e498692014-08-18 16:43:12 -0700713JNI_TEST(CompileAndRunStaticSynchronizedIntObjectObjectMethod)
714
Elliott Hughesb264f082012-04-06 17:10:10 -0700715void Java_MyClassNatives_throwException(JNIEnv* env, jobject) {
Elliott Hughesa2501992011-08-26 19:39:54 -0700716 jclass c = env->FindClass("java/lang/RuntimeException");
717 env->ThrowNew(c, "hello");
718}
Ian Rogers45a76cb2011-07-21 22:00:15 -0700719
Andreas Gampe6e498692014-08-18 16:43:12 -0700720void JniCompilerTest::ExceptionHandlingImpl() {
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700721 {
722 ASSERT_FALSE(runtime_->IsStarted());
723 ScopedObjectAccess soa(Thread::Current());
724 class_loader_ = LoadDex("MyClassNatives");
Brian Carlstrom40381fb2011-10-19 14:13:40 -0700725
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700726 // all compilation needs to happen before Runtime::Start
727 CompileForTest(class_loader_, false, "foo", "()V");
728 CompileForTest(class_loader_, false, "throwException", "()V");
729 CompileForTest(class_loader_, false, "foo", "()V");
730 }
731 // Start runtime to avoid re-initialization in SetupForTest.
732 Thread::Current()->TransitionFromSuspendedToRunnable();
Brian Carlstrombd86bcc2013-03-10 20:26:16 -0700733 bool started = runtime_->Start();
734 CHECK(started);
Brian Carlstrom25c33252011-09-18 15:58:35 -0700735
Elliott Hughesb264f082012-04-06 17:10:10 -0700736 gJava_MyClassNatives_foo_calls = 0;
Elliott Hughesa2501992011-08-26 19:39:54 -0700737
Ian Rogers67375ac2011-09-14 00:55:44 -0700738 // Check a single call of a JNI method is ok
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700739 SetUpForTest(false, "foo", "()V", reinterpret_cast<void*>(&Java_MyClassNatives_foo));
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700740 env_->CallNonvirtualVoidMethod(jobj_, jklass_, jmethod_);
Elliott Hughesb264f082012-04-06 17:10:10 -0700741 EXPECT_EQ(1, gJava_MyClassNatives_foo_calls);
Ian Rogers67375ac2011-09-14 00:55:44 -0700742 EXPECT_FALSE(Thread::Current()->IsExceptionPending());
Elliott Hughesa2501992011-08-26 19:39:54 -0700743
Ian Rogers67375ac2011-09-14 00:55:44 -0700744 // Get class for exception we expect to be thrown
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700745 ScopedLocalRef<jclass> jlre(env_, env_->FindClass("java/lang/RuntimeException"));
746 SetUpForTest(false, "throwException", "()V",
Elliott Hughesb264f082012-04-06 17:10:10 -0700747 reinterpret_cast<void*>(&Java_MyClassNatives_throwException));
748 // Call Java_MyClassNatives_throwException (JNI method that throws exception)
Elliott Hughesa2501992011-08-26 19:39:54 -0700749 env_->CallNonvirtualVoidMethod(jobj_, jklass_, jmethod_);
Elliott Hughesb264f082012-04-06 17:10:10 -0700750 EXPECT_EQ(1, gJava_MyClassNatives_foo_calls);
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700751 EXPECT_TRUE(env_->ExceptionCheck() == JNI_TRUE);
752 ScopedLocalRef<jthrowable> exception(env_, env_->ExceptionOccurred());
753 env_->ExceptionClear();
754 EXPECT_TRUE(env_->IsInstanceOf(exception.get(), jlre.get()));
Elliott Hughesa2501992011-08-26 19:39:54 -0700755
Ian Rogers67375ac2011-09-14 00:55:44 -0700756 // Check a single call of a JNI method is ok
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700757 SetUpForTest(false, "foo", "()V", reinterpret_cast<void*>(&Java_MyClassNatives_foo));
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700758 env_->CallNonvirtualVoidMethod(jobj_, jklass_, jmethod_);
Elliott Hughesb264f082012-04-06 17:10:10 -0700759 EXPECT_EQ(2, gJava_MyClassNatives_foo_calls);
Andreas Gampe6e498692014-08-18 16:43:12 -0700760
761 gJava_MyClassNatives_foo_calls = 0;
Ian Rogers45a76cb2011-07-21 22:00:15 -0700762}
763
Andreas Gampe6e498692014-08-18 16:43:12 -0700764JNI_TEST(ExceptionHandling)
765
Elliott Hughesb264f082012-04-06 17:10:10 -0700766jint Java_MyClassNatives_nativeUpCall(JNIEnv* env, jobject thisObj, jint i) {
Shih-wei Liaoff0f9be2011-08-29 15:43:53 -0700767 if (i <= 0) {
Andreas Gampecf4035a2014-05-28 22:43:01 -0700768 // We want to check raw Object* / Array* below
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700769 ScopedObjectAccess soa(env);
Ian Rogersaaa20802011-09-11 21:47:37 -0700770
771 // Build stack trace
Sebastien Hertzee1d79a2014-02-21 15:46:30 +0100772 jobject internal = Thread::Current()->CreateInternalStackTrace<false>(soa);
Ian Rogers53b8b092014-03-13 23:45:53 -0700773 jobjectArray ste_array = Thread::InternalStackTraceToStackTraceElementArray(soa, internal);
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800774 mirror::ObjectArray<mirror::StackTraceElement>* trace_array =
775 soa.Decode<mirror::ObjectArray<mirror::StackTraceElement>*>(ste_array);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700776 EXPECT_TRUE(trace_array != nullptr);
Shih-wei Liaoff0f9be2011-08-29 15:43:53 -0700777 EXPECT_EQ(11, trace_array->GetLength());
778
Ian Rogersaaa20802011-09-11 21:47:37 -0700779 // Check stack trace entries have expected values
Andreas Gampe277ccbd2014-11-03 21:36:10 -0800780 for (int32_t j = 0; j < trace_array->GetLength(); ++j) {
781 EXPECT_EQ(-2, trace_array->Get(j)->GetLineNumber());
782 mirror::StackTraceElement* ste = trace_array->Get(j);
Ian Rogersaaa20802011-09-11 21:47:37 -0700783 EXPECT_STREQ("MyClassNatives.java", ste->GetFileName()->ToModifiedUtf8().c_str());
Elliott Hughesb264f082012-04-06 17:10:10 -0700784 EXPECT_STREQ("MyClassNatives", ste->GetDeclaringClass()->ToModifiedUtf8().c_str());
Ian Rogersaaa20802011-09-11 21:47:37 -0700785 EXPECT_STREQ("fooI", ste->GetMethodName()->ToModifiedUtf8().c_str());
Shih-wei Liaoff0f9be2011-08-29 15:43:53 -0700786 }
Ian Rogersaaa20802011-09-11 21:47:37 -0700787
788 // end recursion
Shih-wei Liaoff0f9be2011-08-29 15:43:53 -0700789 return 0;
790 } else {
Elliott Hughesb264f082012-04-06 17:10:10 -0700791 jclass jklass = env->FindClass("MyClassNatives");
Andreas Gampecf4035a2014-05-28 22:43:01 -0700792 EXPECT_TRUE(jklass != nullptr);
Shih-wei Liaoff0f9be2011-08-29 15:43:53 -0700793 jmethodID jmethod = env->GetMethodID(jklass, "fooI", "(I)I");
Andreas Gampecf4035a2014-05-28 22:43:01 -0700794 EXPECT_TRUE(jmethod != nullptr);
Shih-wei Liaoff0f9be2011-08-29 15:43:53 -0700795
Ian Rogersaaa20802011-09-11 21:47:37 -0700796 // Recurse with i - 1
Shih-wei Liaoff0f9be2011-08-29 15:43:53 -0700797 jint result = env->CallNonvirtualIntMethod(thisObj, jklass, jmethod, i - 1);
Ian Rogersaaa20802011-09-11 21:47:37 -0700798
799 // Return sum of all depths
Shih-wei Liaoff0f9be2011-08-29 15:43:53 -0700800 return i + result;
801 }
802}
803
Andreas Gampe6e498692014-08-18 16:43:12 -0700804void JniCompilerTest::NativeStackTraceElementImpl() {
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700805 SetUpForTest(false, "fooI", "(I)I",
Elliott Hughesb264f082012-04-06 17:10:10 -0700806 reinterpret_cast<void*>(&Java_MyClassNatives_nativeUpCall));
Shih-wei Liaoff0f9be2011-08-29 15:43:53 -0700807 jint result = env_->CallNonvirtualIntMethod(jobj_, jklass_, jmethod_, 10);
Ian Rogersaaa20802011-09-11 21:47:37 -0700808 EXPECT_EQ(10+9+8+7+6+5+4+3+2+1, result);
Shih-wei Liaoff0f9be2011-08-29 15:43:53 -0700809}
810
Andreas Gampe6e498692014-08-18 16:43:12 -0700811JNI_TEST(NativeStackTraceElement)
812
Elliott Hughesb264f082012-04-06 17:10:10 -0700813jobject Java_MyClassNatives_fooO(JNIEnv* env, jobject, jobject x) {
Shih-wei Liao558788e2011-09-01 02:39:11 -0700814 return env->NewGlobalRef(x);
815}
816
Andreas Gampe6e498692014-08-18 16:43:12 -0700817void JniCompilerTest::ReturnGlobalRefImpl() {
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700818 SetUpForTest(false, "fooO", "(Ljava/lang/Object;)Ljava/lang/Object;",
Elliott Hughesb264f082012-04-06 17:10:10 -0700819 reinterpret_cast<void*>(&Java_MyClassNatives_fooO));
Shih-wei Liao558788e2011-09-01 02:39:11 -0700820 jobject result = env_->CallNonvirtualObjectMethod(jobj_, jklass_, jmethod_, jobj_);
821 EXPECT_EQ(JNILocalRefType, env_->GetObjectRefType(result));
822 EXPECT_TRUE(env_->IsSameObject(result, jobj_));
823}
824
Andreas Gampe6e498692014-08-18 16:43:12 -0700825JNI_TEST(ReturnGlobalRef)
826
Ian Rogersdc51b792011-09-22 20:41:37 -0700827jint local_ref_test(JNIEnv* env, jobject thisObj, jint x) {
828 // Add 10 local references
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700829 ScopedObjectAccess soa(env);
Ian Rogers5a7a74a2011-09-26 16:32:29 -0700830 for (int i = 0; i < 10; i++) {
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800831 soa.AddLocalReference<jobject>(soa.Decode<mirror::Object*>(thisObj));
Ian Rogersdc51b792011-09-22 20:41:37 -0700832 }
833 return x+1;
834}
835
Andreas Gampe6e498692014-08-18 16:43:12 -0700836void JniCompilerTest::LocalReferenceTableClearingTestImpl() {
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700837 SetUpForTest(false, "fooI", "(I)I", reinterpret_cast<void*>(&local_ref_test));
Ian Rogersdc51b792011-09-22 20:41:37 -0700838 // 1000 invocations of a method that adds 10 local references
Elliott Hughesb25c3f62012-03-26 16:35:06 -0700839 for (int i = 0; i < 1000; i++) {
Ian Rogersdc51b792011-09-22 20:41:37 -0700840 jint result = env_->CallIntMethod(jobj_, jmethod_, i);
841 EXPECT_TRUE(result == i + 1);
842 }
843}
844
Andreas Gampe6e498692014-08-18 16:43:12 -0700845JNI_TEST(LocalReferenceTableClearingTest)
846
Ian Rogersb9231c82011-09-05 22:13:19 -0700847void my_arraycopy(JNIEnv* env, jclass klass, jobject src, jint src_pos, jobject dst, jint dst_pos, jint length) {
848 EXPECT_TRUE(env->IsSameObject(JniCompilerTest::jklass_, klass));
849 EXPECT_TRUE(env->IsSameObject(JniCompilerTest::jklass_, dst));
Ian Rogers82f3e092011-09-05 22:54:45 -0700850 EXPECT_TRUE(env->IsSameObject(JniCompilerTest::jobj_, src));
Ian Rogersb9231c82011-09-05 22:13:19 -0700851 EXPECT_EQ(1234, src_pos);
852 EXPECT_EQ(5678, dst_pos);
853 EXPECT_EQ(9876, length);
854}
855
Andreas Gampe6e498692014-08-18 16:43:12 -0700856void JniCompilerTest::JavaLangSystemArrayCopyImpl() {
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700857 SetUpForTest(true, "arraycopy", "(Ljava/lang/Object;ILjava/lang/Object;II)V",
Ian Rogersb9231c82011-09-05 22:13:19 -0700858 reinterpret_cast<void*>(&my_arraycopy));
Ian Rogers82f3e092011-09-05 22:54:45 -0700859 env_->CallStaticVoidMethod(jklass_, jmethod_, jobj_, 1234, jklass_, 5678, 9876);
Ian Rogersb9231c82011-09-05 22:13:19 -0700860}
861
Andreas Gampe6e498692014-08-18 16:43:12 -0700862JNI_TEST(JavaLangSystemArrayCopy)
863
Ian Rogers67375ac2011-09-14 00:55:44 -0700864jboolean my_casi(JNIEnv* env, jobject unsafe, jobject obj, jlong offset, jint expected, jint newval) {
865 EXPECT_TRUE(env->IsSameObject(JniCompilerTest::jobj_, unsafe));
866 EXPECT_TRUE(env->IsSameObject(JniCompilerTest::jobj_, obj));
Ian Rogers0f678472014-03-10 16:18:37 -0700867 EXPECT_EQ(INT64_C(0x12345678ABCDEF88), offset);
Ian Rogers67375ac2011-09-14 00:55:44 -0700868 EXPECT_EQ(static_cast<jint>(0xCAFEF00D), expected);
869 EXPECT_EQ(static_cast<jint>(0xEBADF00D), newval);
870 return JNI_TRUE;
871}
872
Andreas Gampe6e498692014-08-18 16:43:12 -0700873void JniCompilerTest::CompareAndSwapIntImpl() {
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700874 SetUpForTest(false, "compareAndSwapInt", "(Ljava/lang/Object;JII)Z",
Ian Rogers67375ac2011-09-14 00:55:44 -0700875 reinterpret_cast<void*>(&my_casi));
Ian Rogers0f678472014-03-10 16:18:37 -0700876 jboolean result = env_->CallBooleanMethod(jobj_, jmethod_, jobj_, INT64_C(0x12345678ABCDEF88),
877 0xCAFEF00D, 0xEBADF00D);
Ian Rogers67375ac2011-09-14 00:55:44 -0700878 EXPECT_EQ(result, JNI_TRUE);
879}
880
Andreas Gampe6e498692014-08-18 16:43:12 -0700881JNI_TEST(CompareAndSwapInt)
882
Ian Rogersc7792842012-03-03 15:36:20 -0800883jint my_gettext(JNIEnv* env, jclass klass, jlong val1, jobject obj1, jlong val2, jobject obj2) {
884 EXPECT_TRUE(env->IsInstanceOf(JniCompilerTest::jobj_, klass));
885 EXPECT_TRUE(env->IsSameObject(JniCompilerTest::jobj_, obj1));
886 EXPECT_TRUE(env->IsSameObject(JniCompilerTest::jobj_, obj2));
887 EXPECT_EQ(0x12345678ABCDEF88ll, val1);
888 EXPECT_EQ(0x7FEDCBA987654321ll, val2);
889 return 42;
890}
891
Andreas Gampe6e498692014-08-18 16:43:12 -0700892void JniCompilerTest::GetTextImpl() {
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700893 SetUpForTest(true, "getText", "(JLjava/lang/Object;JLjava/lang/Object;)I",
Ian Rogersc7792842012-03-03 15:36:20 -0800894 reinterpret_cast<void*>(&my_gettext));
895 jint result = env_->CallStaticIntMethod(jklass_, jmethod_, 0x12345678ABCDEF88ll, jobj_,
Ian Rogers0f678472014-03-10 16:18:37 -0700896 INT64_C(0x7FEDCBA987654321), jobj_);
Ian Rogersc7792842012-03-03 15:36:20 -0800897 EXPECT_EQ(result, 42);
898}
899
Andreas Gampe6e498692014-08-18 16:43:12 -0700900JNI_TEST(GetText)
901
Vladimir Marko4e24b9d2014-07-24 17:01:58 +0100902int gJava_MyClassNatives_GetSinkProperties_calls = 0;
903jarray Java_MyClassNatives_GetSinkProperties(JNIEnv* env, jobject thisObj, jstring s) {
904 // 1 = thisObj
905 Thread* self = Thread::Current();
906 EXPECT_EQ(kNative, self->GetState());
907 Locks::mutator_lock_->AssertNotHeld(self);
908 EXPECT_EQ(self->GetJniEnv(), env);
909 EXPECT_TRUE(thisObj != nullptr);
910 EXPECT_TRUE(env->IsInstanceOf(thisObj, JniCompilerTest::jklass_));
911 EXPECT_EQ(s, nullptr);
912 gJava_MyClassNatives_GetSinkProperties_calls++;
913 ScopedObjectAccess soa(self);
914 EXPECT_EQ(2U, self->NumStackReferences());
915 EXPECT_TRUE(self->HoldsLock(soa.Decode<mirror::Object*>(thisObj)));
916 return nullptr;
917}
918
Andreas Gampe6e498692014-08-18 16:43:12 -0700919void JniCompilerTest::GetSinkPropertiesNativeImpl() {
Vladimir Marko4e24b9d2014-07-24 17:01:58 +0100920 SetUpForTest(false, "getSinkPropertiesNative", "(Ljava/lang/String;)[Ljava/lang/Object;",
921 reinterpret_cast<void*>(&Java_MyClassNatives_GetSinkProperties));
922
923 EXPECT_EQ(0, gJava_MyClassNatives_GetSinkProperties_calls);
924 jarray result = down_cast<jarray>(
925 env_->CallNonvirtualObjectMethod(jobj_, jklass_, jmethod_, nullptr));
926 EXPECT_EQ(nullptr, result);
927 EXPECT_EQ(1, gJava_MyClassNatives_GetSinkProperties_calls);
Andreas Gampe6e498692014-08-18 16:43:12 -0700928
929 gJava_MyClassNatives_GetSinkProperties_calls = 0;
Brian Carlstromfc7120c2012-08-27 13:43:25 -0700930}
931
Andreas Gampe6e498692014-08-18 16:43:12 -0700932JNI_TEST(GetSinkPropertiesNative)
933
Elliott Hughesb264f082012-04-06 17:10:10 -0700934// This should return jclass, but we're imitating a bug pattern.
935jobject Java_MyClassNatives_instanceMethodThatShouldReturnClass(JNIEnv* env, jobject) {
936 return env->NewStringUTF("not a class!");
937}
938
939// This should return jclass, but we're imitating a bug pattern.
940jobject Java_MyClassNatives_staticMethodThatShouldReturnClass(JNIEnv* env, jclass) {
941 return env->NewStringUTF("not a class!");
942}
943
Andreas Gampe6e498692014-08-18 16:43:12 -0700944void JniCompilerTest::UpcallReturnTypeChecking_InstanceImpl() {
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700945 SetUpForTest(false, "instanceMethodThatShouldReturnClass", "()Ljava/lang/Class;",
Elliott Hughesb264f082012-04-06 17:10:10 -0700946 reinterpret_cast<void*>(&Java_MyClassNatives_instanceMethodThatShouldReturnClass));
947
948 CheckJniAbortCatcher check_jni_abort_catcher;
Elliott Hughes3f6635a2012-06-19 13:37:49 -0700949 // This native method is bad, and tries to return a jstring as a jclass.
950 env_->CallObjectMethod(jobj_, jmethod_);
951 check_jni_abort_catcher.Check("attempt to return an instance of java.lang.String from java.lang.Class MyClassNatives.instanceMethodThatShouldReturnClass()");
952
953 // Here, we just call the method incorrectly; we should catch that too.
Ian Rogers68d8b422014-07-17 11:09:10 -0700954 env_->CallObjectMethod(jobj_, jmethod_);
Elliott Hughes3f6635a2012-06-19 13:37:49 -0700955 check_jni_abort_catcher.Check("attempt to return an instance of java.lang.String from java.lang.Class MyClassNatives.instanceMethodThatShouldReturnClass()");
Ian Rogers68d8b422014-07-17 11:09:10 -0700956 env_->CallStaticObjectMethod(jklass_, jmethod_);
957 check_jni_abort_catcher.Check("calling non-static method java.lang.Class MyClassNatives.instanceMethodThatShouldReturnClass() with CallStaticObjectMethodV");
Elliott Hughesb264f082012-04-06 17:10:10 -0700958}
959
Andreas Gampe6e498692014-08-18 16:43:12 -0700960JNI_TEST(UpcallReturnTypeChecking_Instance)
961
962void JniCompilerTest::UpcallReturnTypeChecking_StaticImpl() {
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700963 SetUpForTest(true, "staticMethodThatShouldReturnClass", "()Ljava/lang/Class;",
Elliott Hughesb264f082012-04-06 17:10:10 -0700964 reinterpret_cast<void*>(&Java_MyClassNatives_staticMethodThatShouldReturnClass));
965
966 CheckJniAbortCatcher check_jni_abort_catcher;
Elliott Hughes3f6635a2012-06-19 13:37:49 -0700967 // This native method is bad, and tries to return a jstring as a jclass.
968 env_->CallStaticObjectMethod(jklass_, jmethod_);
969 check_jni_abort_catcher.Check("attempt to return an instance of java.lang.String from java.lang.Class MyClassNatives.staticMethodThatShouldReturnClass()");
970
971 // Here, we just call the method incorrectly; we should catch that too.
Ian Rogers68d8b422014-07-17 11:09:10 -0700972 env_->CallStaticObjectMethod(jklass_, jmethod_);
Elliott Hughes3f6635a2012-06-19 13:37:49 -0700973 check_jni_abort_catcher.Check("attempt to return an instance of java.lang.String from java.lang.Class MyClassNatives.staticMethodThatShouldReturnClass()");
Ian Rogers68d8b422014-07-17 11:09:10 -0700974 env_->CallObjectMethod(jobj_, jmethod_);
975 check_jni_abort_catcher.Check("calling static method java.lang.Class MyClassNatives.staticMethodThatShouldReturnClass() with CallObjectMethodV");
Elliott Hughesb264f082012-04-06 17:10:10 -0700976}
977
Andreas Gampe6e498692014-08-18 16:43:12 -0700978JNI_TEST(UpcallReturnTypeChecking_Static)
979
Elliott Hughesb264f082012-04-06 17:10:10 -0700980// This should take jclass, but we're imitating a bug pattern.
981void Java_MyClassNatives_instanceMethodThatShouldTakeClass(JNIEnv*, jobject, jclass) {
982}
983
984// This should take jclass, but we're imitating a bug pattern.
985void Java_MyClassNatives_staticMethodThatShouldTakeClass(JNIEnv*, jclass, jclass) {
986}
987
Andreas Gampe6e498692014-08-18 16:43:12 -0700988void JniCompilerTest::UpcallArgumentTypeChecking_InstanceImpl() {
Andreas Gampe369810a2015-01-14 19:53:31 -0800989 // This will lead to error messages in the log.
990 ScopedLogSeverity sls(LogSeverity::FATAL);
991
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700992 SetUpForTest(false, "instanceMethodThatShouldTakeClass", "(ILjava/lang/Class;)V",
Elliott Hughesb264f082012-04-06 17:10:10 -0700993 reinterpret_cast<void*>(&Java_MyClassNatives_instanceMethodThatShouldTakeClass));
994
995 CheckJniAbortCatcher check_jni_abort_catcher;
996 // We deliberately pass a bad second argument here.
997 env_->CallVoidMethod(jobj_, jmethod_, 123, env_->NewStringUTF("not a class!"));
Elliott Hughes3f6635a2012-06-19 13:37:49 -0700998 check_jni_abort_catcher.Check("bad arguments passed to void MyClassNatives.instanceMethodThatShouldTakeClass(int, java.lang.Class)");
Elliott Hughesb264f082012-04-06 17:10:10 -0700999}
1000
Andreas Gampe6e498692014-08-18 16:43:12 -07001001JNI_TEST(UpcallArgumentTypeChecking_Instance)
1002
1003void JniCompilerTest::UpcallArgumentTypeChecking_StaticImpl() {
Andreas Gampe369810a2015-01-14 19:53:31 -08001004 // This will lead to error messages in the log.
1005 ScopedLogSeverity sls(LogSeverity::FATAL);
1006
Ian Rogers00f7d0e2012-07-19 15:28:27 -07001007 SetUpForTest(true, "staticMethodThatShouldTakeClass", "(ILjava/lang/Class;)V",
Elliott Hughesb264f082012-04-06 17:10:10 -07001008 reinterpret_cast<void*>(&Java_MyClassNatives_staticMethodThatShouldTakeClass));
1009
1010 CheckJniAbortCatcher check_jni_abort_catcher;
1011 // We deliberately pass a bad second argument here.
1012 env_->CallStaticVoidMethod(jklass_, jmethod_, 123, env_->NewStringUTF("not a class!"));
Elliott Hughes3f6635a2012-06-19 13:37:49 -07001013 check_jni_abort_catcher.Check("bad arguments passed to void MyClassNatives.staticMethodThatShouldTakeClass(int, java.lang.Class)");
Elliott Hughesb264f082012-04-06 17:10:10 -07001014}
1015
Andreas Gampe6e498692014-08-18 16:43:12 -07001016JNI_TEST(UpcallArgumentTypeChecking_Static)
1017
Andreas Gampe7a0e5042014-03-07 13:03:19 -08001018jfloat Java_MyClassNatives_checkFloats(JNIEnv* env, jobject thisObj, jfloat f1, jfloat f2) {
1019 EXPECT_EQ(kNative, Thread::Current()->GetState());
1020 EXPECT_EQ(Thread::Current()->GetJniEnv(), env);
Andreas Gampecf4035a2014-05-28 22:43:01 -07001021 EXPECT_TRUE(thisObj != nullptr);
Andreas Gampe7a0e5042014-03-07 13:03:19 -08001022 EXPECT_TRUE(env->IsInstanceOf(thisObj, JniCompilerTest::jklass_));
1023 ScopedObjectAccess soa(Thread::Current());
1024 EXPECT_EQ(1U, Thread::Current()->NumStackReferences());
1025 return f1 - f2; // non-commutative operator
1026}
1027
Andreas Gampe6e498692014-08-18 16:43:12 -07001028void JniCompilerTest::CompileAndRunFloatFloatMethodImpl() {
Andreas Gampe7a0e5042014-03-07 13:03:19 -08001029 SetUpForTest(false, "checkFloats", "(FF)F",
1030 reinterpret_cast<void*>(&Java_MyClassNatives_checkFloats));
1031
1032 jfloat result = env_->CallNonvirtualFloatMethod(jobj_, jklass_, jmethod_,
1033 99.0F, 10.0F);
Ian Rogers647b1a82014-10-10 11:02:11 -07001034 EXPECT_FLOAT_EQ(99.0F - 10.0F, result);
Andreas Gampe7a0e5042014-03-07 13:03:19 -08001035 jfloat a = 3.14159F;
1036 jfloat b = 0.69314F;
1037 result = env_->CallNonvirtualFloatMethod(jobj_, jklass_, jmethod_, a, b);
Ian Rogers647b1a82014-10-10 11:02:11 -07001038 EXPECT_FLOAT_EQ(a - b, result);
Andreas Gampe7a0e5042014-03-07 13:03:19 -08001039}
1040
Andreas Gampe6e498692014-08-18 16:43:12 -07001041JNI_TEST(CompileAndRunFloatFloatMethod)
1042
Ian Rogers6a3c1fc2014-10-31 00:33:20 -07001043void Java_MyClassNatives_checkParameterAlign(JNIEnv* env ATTRIBUTE_UNUSED,
1044 jobject thisObj ATTRIBUTE_UNUSED,
1045 jint i1 ATTRIBUTE_UNUSED,
1046 jlong l1 ATTRIBUTE_UNUSED) {
Andreas Gampecf4035a2014-05-28 22:43:01 -07001047// EXPECT_EQ(kNative, Thread::Current()->GetState());
1048// EXPECT_EQ(Thread::Current()->GetJniEnv(), env);
1049// EXPECT_TRUE(thisObj != nullptr);
1050// EXPECT_TRUE(env->IsInstanceOf(thisObj, JniCompilerTest::jklass_));
1051// ScopedObjectAccess soa(Thread::Current());
1052// EXPECT_EQ(1U, Thread::Current()->NumStackReferences());
Andreas Gampe7a0e5042014-03-07 13:03:19 -08001053 EXPECT_EQ(i1, 1234);
Ian Rogers0f678472014-03-10 16:18:37 -07001054 EXPECT_EQ(l1, INT64_C(0x12345678ABCDEF0));
Andreas Gampe7a0e5042014-03-07 13:03:19 -08001055}
1056
Andreas Gampe6e498692014-08-18 16:43:12 -07001057void JniCompilerTest::CheckParameterAlignImpl() {
Andreas Gampe7a0e5042014-03-07 13:03:19 -08001058 SetUpForTest(false, "checkParameterAlign", "(IJ)V",
1059 reinterpret_cast<void*>(&Java_MyClassNatives_checkParameterAlign));
1060
Ian Rogers0f678472014-03-10 16:18:37 -07001061 env_->CallNonvirtualVoidMethod(jobj_, jklass_, jmethod_, 1234, INT64_C(0x12345678ABCDEF0));
Andreas Gampe7a0e5042014-03-07 13:03:19 -08001062}
1063
Andreas Gampe6e498692014-08-18 16:43:12 -07001064JNI_TEST(CheckParameterAlign)
1065
Andreas Gampe7a0e5042014-03-07 13:03:19 -08001066void Java_MyClassNatives_maxParamNumber(JNIEnv* env, jobject thisObj,
1067 jobject o0, jobject o1, jobject o2, jobject o3, jobject o4, jobject o5, jobject o6, jobject o7,
1068 jobject o8, jobject o9, jobject o10, jobject o11, jobject o12, jobject o13, jobject o14, jobject o15,
1069 jobject o16, jobject o17, jobject o18, jobject o19, jobject o20, jobject o21, jobject o22, jobject o23,
1070 jobject o24, jobject o25, jobject o26, jobject o27, jobject o28, jobject o29, jobject o30, jobject o31,
1071 jobject o32, jobject o33, jobject o34, jobject o35, jobject o36, jobject o37, jobject o38, jobject o39,
1072 jobject o40, jobject o41, jobject o42, jobject o43, jobject o44, jobject o45, jobject o46, jobject o47,
1073 jobject o48, jobject o49, jobject o50, jobject o51, jobject o52, jobject o53, jobject o54, jobject o55,
1074 jobject o56, jobject o57, jobject o58, jobject o59, jobject o60, jobject o61, jobject o62, jobject o63,
1075 jobject o64, jobject o65, jobject o66, jobject o67, jobject o68, jobject o69, jobject o70, jobject o71,
1076 jobject o72, jobject o73, jobject o74, jobject o75, jobject o76, jobject o77, jobject o78, jobject o79,
1077 jobject o80, jobject o81, jobject o82, jobject o83, jobject o84, jobject o85, jobject o86, jobject o87,
1078 jobject o88, jobject o89, jobject o90, jobject o91, jobject o92, jobject o93, jobject o94, jobject o95,
1079 jobject o96, jobject o97, jobject o98, jobject o99, jobject o100, jobject o101, jobject o102, jobject o103,
1080 jobject o104, jobject o105, jobject o106, jobject o107, jobject o108, jobject o109, jobject o110, jobject o111,
1081 jobject o112, jobject o113, jobject o114, jobject o115, jobject o116, jobject o117, jobject o118, jobject o119,
1082 jobject o120, jobject o121, jobject o122, jobject o123, jobject o124, jobject o125, jobject o126, jobject o127,
1083 jobject o128, jobject o129, jobject o130, jobject o131, jobject o132, jobject o133, jobject o134, jobject o135,
1084 jobject o136, jobject o137, jobject o138, jobject o139, jobject o140, jobject o141, jobject o142, jobject o143,
1085 jobject o144, jobject o145, jobject o146, jobject o147, jobject o148, jobject o149, jobject o150, jobject o151,
1086 jobject o152, jobject o153, jobject o154, jobject o155, jobject o156, jobject o157, jobject o158, jobject o159,
1087 jobject o160, jobject o161, jobject o162, jobject o163, jobject o164, jobject o165, jobject o166, jobject o167,
1088 jobject o168, jobject o169, jobject o170, jobject o171, jobject o172, jobject o173, jobject o174, jobject o175,
1089 jobject o176, jobject o177, jobject o178, jobject o179, jobject o180, jobject o181, jobject o182, jobject o183,
1090 jobject o184, jobject o185, jobject o186, jobject o187, jobject o188, jobject o189, jobject o190, jobject o191,
1091 jobject o192, jobject o193, jobject o194, jobject o195, jobject o196, jobject o197, jobject o198, jobject o199,
1092 jobject o200, jobject o201, jobject o202, jobject o203, jobject o204, jobject o205, jobject o206, jobject o207,
1093 jobject o208, jobject o209, jobject o210, jobject o211, jobject o212, jobject o213, jobject o214, jobject o215,
1094 jobject o216, jobject o217, jobject o218, jobject o219, jobject o220, jobject o221, jobject o222, jobject o223,
1095 jobject o224, jobject o225, jobject o226, jobject o227, jobject o228, jobject o229, jobject o230, jobject o231,
1096 jobject o232, jobject o233, jobject o234, jobject o235, jobject o236, jobject o237, jobject o238, jobject o239,
1097 jobject o240, jobject o241, jobject o242, jobject o243, jobject o244, jobject o245, jobject o246, jobject o247,
1098 jobject o248, jobject o249, jobject o250, jobject o251, jobject o252, jobject o253) {
1099 EXPECT_EQ(kNative, Thread::Current()->GetState());
1100 EXPECT_EQ(Thread::Current()->GetJniEnv(), env);
Andreas Gampecf4035a2014-05-28 22:43:01 -07001101 EXPECT_TRUE(thisObj != nullptr);
Andreas Gampe7a0e5042014-03-07 13:03:19 -08001102 EXPECT_TRUE(env->IsInstanceOf(thisObj, JniCompilerTest::jklass_));
1103 ScopedObjectAccess soa(Thread::Current());
1104 EXPECT_GE(255U, Thread::Current()->NumStackReferences());
1105
1106 // two tests possible
1107 if (o0 == nullptr) {
1108 // 1) everything is null
1109 EXPECT_TRUE(o0 == nullptr && o1 == nullptr && o2 == nullptr && o3 == nullptr && o4 == nullptr
1110 && o5 == nullptr && o6 == nullptr && o7 == nullptr && o8 == nullptr && o9 == nullptr
1111 && o10 == nullptr && o11 == nullptr && o12 == nullptr && o13 == nullptr && o14 == nullptr
1112 && o15 == nullptr && o16 == nullptr && o17 == nullptr && o18 == nullptr && o19 == nullptr
1113 && o20 == nullptr && o21 == nullptr && o22 == nullptr && o23 == nullptr && o24 == nullptr
1114 && o25 == nullptr && o26 == nullptr && o27 == nullptr && o28 == nullptr && o29 == nullptr
1115 && o30 == nullptr && o31 == nullptr && o32 == nullptr && o33 == nullptr && o34 == nullptr
1116 && o35 == nullptr && o36 == nullptr && o37 == nullptr && o38 == nullptr && o39 == nullptr
1117 && o40 == nullptr && o41 == nullptr && o42 == nullptr && o43 == nullptr && o44 == nullptr
1118 && o45 == nullptr && o46 == nullptr && o47 == nullptr && o48 == nullptr && o49 == nullptr
1119 && o50 == nullptr && o51 == nullptr && o52 == nullptr && o53 == nullptr && o54 == nullptr
1120 && o55 == nullptr && o56 == nullptr && o57 == nullptr && o58 == nullptr && o59 == nullptr
1121 && o60 == nullptr && o61 == nullptr && o62 == nullptr && o63 == nullptr && o64 == nullptr
1122 && o65 == nullptr && o66 == nullptr && o67 == nullptr && o68 == nullptr && o69 == nullptr
1123 && o70 == nullptr && o71 == nullptr && o72 == nullptr && o73 == nullptr && o74 == nullptr
1124 && o75 == nullptr && o76 == nullptr && o77 == nullptr && o78 == nullptr && o79 == nullptr
1125 && o80 == nullptr && o81 == nullptr && o82 == nullptr && o83 == nullptr && o84 == nullptr
1126 && o85 == nullptr && o86 == nullptr && o87 == nullptr && o88 == nullptr && o89 == nullptr
1127 && o90 == nullptr && o91 == nullptr && o92 == nullptr && o93 == nullptr && o94 == nullptr
1128 && o95 == nullptr && o96 == nullptr && o97 == nullptr && o98 == nullptr && o99 == nullptr
1129 && o100 == nullptr && o101 == nullptr && o102 == nullptr && o103 == nullptr && o104 == nullptr
1130 && o105 == nullptr && o106 == nullptr && o107 == nullptr && o108 == nullptr && o109 == nullptr
1131 && o110 == nullptr && o111 == nullptr && o112 == nullptr && o113 == nullptr && o114 == nullptr
1132 && o115 == nullptr && o116 == nullptr && o117 == nullptr && o118 == nullptr && o119 == nullptr
1133 && o120 == nullptr && o121 == nullptr && o122 == nullptr && o123 == nullptr && o124 == nullptr
1134 && o125 == nullptr && o126 == nullptr && o127 == nullptr && o128 == nullptr && o129 == nullptr
1135 && o130 == nullptr && o131 == nullptr && o132 == nullptr && o133 == nullptr && o134 == nullptr
1136 && o135 == nullptr && o136 == nullptr && o137 == nullptr && o138 == nullptr && o139 == nullptr
1137 && o140 == nullptr && o141 == nullptr && o142 == nullptr && o143 == nullptr && o144 == nullptr
1138 && o145 == nullptr && o146 == nullptr && o147 == nullptr && o148 == nullptr && o149 == nullptr
1139 && o150 == nullptr && o151 == nullptr && o152 == nullptr && o153 == nullptr && o154 == nullptr
1140 && o155 == nullptr && o156 == nullptr && o157 == nullptr && o158 == nullptr && o159 == nullptr
1141 && o160 == nullptr && o161 == nullptr && o162 == nullptr && o163 == nullptr && o164 == nullptr
1142 && o165 == nullptr && o166 == nullptr && o167 == nullptr && o168 == nullptr && o169 == nullptr
1143 && o170 == nullptr && o171 == nullptr && o172 == nullptr && o173 == nullptr && o174 == nullptr
1144 && o175 == nullptr && o176 == nullptr && o177 == nullptr && o178 == nullptr && o179 == nullptr
1145 && o180 == nullptr && o181 == nullptr && o182 == nullptr && o183 == nullptr && o184 == nullptr
1146 && o185 == nullptr && o186 == nullptr && o187 == nullptr && o188 == nullptr && o189 == nullptr
1147 && o190 == nullptr && o191 == nullptr && o192 == nullptr && o193 == nullptr && o194 == nullptr
1148 && o195 == nullptr && o196 == nullptr && o197 == nullptr && o198 == nullptr && o199 == nullptr
1149 && o200 == nullptr && o201 == nullptr && o202 == nullptr && o203 == nullptr && o204 == nullptr
1150 && o205 == nullptr && o206 == nullptr && o207 == nullptr && o208 == nullptr && o209 == nullptr
1151 && o210 == nullptr && o211 == nullptr && o212 == nullptr && o213 == nullptr && o214 == nullptr
1152 && o215 == nullptr && o216 == nullptr && o217 == nullptr && o218 == nullptr && o219 == nullptr
1153 && o220 == nullptr && o221 == nullptr && o222 == nullptr && o223 == nullptr && o224 == nullptr
1154 && o225 == nullptr && o226 == nullptr && o227 == nullptr && o228 == nullptr && o229 == nullptr
1155 && o230 == nullptr && o231 == nullptr && o232 == nullptr && o233 == nullptr && o234 == nullptr
1156 && o235 == nullptr && o236 == nullptr && o237 == nullptr && o238 == nullptr && o239 == nullptr
1157 && o240 == nullptr && o241 == nullptr && o242 == nullptr && o243 == nullptr && o244 == nullptr
1158 && o245 == nullptr && o246 == nullptr && o247 == nullptr && o248 == nullptr && o249 == nullptr
1159 && o250 == nullptr && o251 == nullptr && o252 == nullptr && o253 == nullptr);
1160 } else {
1161 EXPECT_EQ(0, env->GetArrayLength(reinterpret_cast<jarray>(o0)));
1162 EXPECT_EQ(1, env->GetArrayLength(reinterpret_cast<jarray>(o1)));
1163 EXPECT_EQ(2, env->GetArrayLength(reinterpret_cast<jarray>(o2)));
1164 EXPECT_EQ(3, env->GetArrayLength(reinterpret_cast<jarray>(o3)));
1165 EXPECT_EQ(4, env->GetArrayLength(reinterpret_cast<jarray>(o4)));
1166 EXPECT_EQ(5, env->GetArrayLength(reinterpret_cast<jarray>(o5)));
1167 EXPECT_EQ(6, env->GetArrayLength(reinterpret_cast<jarray>(o6)));
1168 EXPECT_EQ(7, env->GetArrayLength(reinterpret_cast<jarray>(o7)));
1169 EXPECT_EQ(8, env->GetArrayLength(reinterpret_cast<jarray>(o8)));
1170 EXPECT_EQ(9, env->GetArrayLength(reinterpret_cast<jarray>(o9)));
1171 EXPECT_EQ(10, env->GetArrayLength(reinterpret_cast<jarray>(o10)));
1172 EXPECT_EQ(11, env->GetArrayLength(reinterpret_cast<jarray>(o11)));
1173 EXPECT_EQ(12, env->GetArrayLength(reinterpret_cast<jarray>(o12)));
1174 EXPECT_EQ(13, env->GetArrayLength(reinterpret_cast<jarray>(o13)));
1175 EXPECT_EQ(14, env->GetArrayLength(reinterpret_cast<jarray>(o14)));
1176 EXPECT_EQ(15, env->GetArrayLength(reinterpret_cast<jarray>(o15)));
1177 EXPECT_EQ(16, env->GetArrayLength(reinterpret_cast<jarray>(o16)));
1178 EXPECT_EQ(17, env->GetArrayLength(reinterpret_cast<jarray>(o17)));
1179 EXPECT_EQ(18, env->GetArrayLength(reinterpret_cast<jarray>(o18)));
1180 EXPECT_EQ(19, env->GetArrayLength(reinterpret_cast<jarray>(o19)));
1181 EXPECT_EQ(20, env->GetArrayLength(reinterpret_cast<jarray>(o20)));
1182 EXPECT_EQ(21, env->GetArrayLength(reinterpret_cast<jarray>(o21)));
1183 EXPECT_EQ(22, env->GetArrayLength(reinterpret_cast<jarray>(o22)));
1184 EXPECT_EQ(23, env->GetArrayLength(reinterpret_cast<jarray>(o23)));
1185 EXPECT_EQ(24, env->GetArrayLength(reinterpret_cast<jarray>(o24)));
1186 EXPECT_EQ(25, env->GetArrayLength(reinterpret_cast<jarray>(o25)));
1187 EXPECT_EQ(26, env->GetArrayLength(reinterpret_cast<jarray>(o26)));
1188 EXPECT_EQ(27, env->GetArrayLength(reinterpret_cast<jarray>(o27)));
1189 EXPECT_EQ(28, env->GetArrayLength(reinterpret_cast<jarray>(o28)));
1190 EXPECT_EQ(29, env->GetArrayLength(reinterpret_cast<jarray>(o29)));
1191 EXPECT_EQ(30, env->GetArrayLength(reinterpret_cast<jarray>(o30)));
1192 EXPECT_EQ(31, env->GetArrayLength(reinterpret_cast<jarray>(o31)));
1193 EXPECT_EQ(32, env->GetArrayLength(reinterpret_cast<jarray>(o32)));
1194 EXPECT_EQ(33, env->GetArrayLength(reinterpret_cast<jarray>(o33)));
1195 EXPECT_EQ(34, env->GetArrayLength(reinterpret_cast<jarray>(o34)));
1196 EXPECT_EQ(35, env->GetArrayLength(reinterpret_cast<jarray>(o35)));
1197 EXPECT_EQ(36, env->GetArrayLength(reinterpret_cast<jarray>(o36)));
1198 EXPECT_EQ(37, env->GetArrayLength(reinterpret_cast<jarray>(o37)));
1199 EXPECT_EQ(38, env->GetArrayLength(reinterpret_cast<jarray>(o38)));
1200 EXPECT_EQ(39, env->GetArrayLength(reinterpret_cast<jarray>(o39)));
1201 EXPECT_EQ(40, env->GetArrayLength(reinterpret_cast<jarray>(o40)));
1202 EXPECT_EQ(41, env->GetArrayLength(reinterpret_cast<jarray>(o41)));
1203 EXPECT_EQ(42, env->GetArrayLength(reinterpret_cast<jarray>(o42)));
1204 EXPECT_EQ(43, env->GetArrayLength(reinterpret_cast<jarray>(o43)));
1205 EXPECT_EQ(44, env->GetArrayLength(reinterpret_cast<jarray>(o44)));
1206 EXPECT_EQ(45, env->GetArrayLength(reinterpret_cast<jarray>(o45)));
1207 EXPECT_EQ(46, env->GetArrayLength(reinterpret_cast<jarray>(o46)));
1208 EXPECT_EQ(47, env->GetArrayLength(reinterpret_cast<jarray>(o47)));
1209 EXPECT_EQ(48, env->GetArrayLength(reinterpret_cast<jarray>(o48)));
1210 EXPECT_EQ(49, env->GetArrayLength(reinterpret_cast<jarray>(o49)));
1211 EXPECT_EQ(50, env->GetArrayLength(reinterpret_cast<jarray>(o50)));
1212 EXPECT_EQ(51, env->GetArrayLength(reinterpret_cast<jarray>(o51)));
1213 EXPECT_EQ(52, env->GetArrayLength(reinterpret_cast<jarray>(o52)));
1214 EXPECT_EQ(53, env->GetArrayLength(reinterpret_cast<jarray>(o53)));
1215 EXPECT_EQ(54, env->GetArrayLength(reinterpret_cast<jarray>(o54)));
1216 EXPECT_EQ(55, env->GetArrayLength(reinterpret_cast<jarray>(o55)));
1217 EXPECT_EQ(56, env->GetArrayLength(reinterpret_cast<jarray>(o56)));
1218 EXPECT_EQ(57, env->GetArrayLength(reinterpret_cast<jarray>(o57)));
1219 EXPECT_EQ(58, env->GetArrayLength(reinterpret_cast<jarray>(o58)));
1220 EXPECT_EQ(59, env->GetArrayLength(reinterpret_cast<jarray>(o59)));
1221 EXPECT_EQ(60, env->GetArrayLength(reinterpret_cast<jarray>(o60)));
1222 EXPECT_EQ(61, env->GetArrayLength(reinterpret_cast<jarray>(o61)));
1223 EXPECT_EQ(62, env->GetArrayLength(reinterpret_cast<jarray>(o62)));
1224 EXPECT_EQ(63, env->GetArrayLength(reinterpret_cast<jarray>(o63)));
1225 EXPECT_EQ(64, env->GetArrayLength(reinterpret_cast<jarray>(o64)));
1226 EXPECT_EQ(65, env->GetArrayLength(reinterpret_cast<jarray>(o65)));
1227 EXPECT_EQ(66, env->GetArrayLength(reinterpret_cast<jarray>(o66)));
1228 EXPECT_EQ(67, env->GetArrayLength(reinterpret_cast<jarray>(o67)));
1229 EXPECT_EQ(68, env->GetArrayLength(reinterpret_cast<jarray>(o68)));
1230 EXPECT_EQ(69, env->GetArrayLength(reinterpret_cast<jarray>(o69)));
1231 EXPECT_EQ(70, env->GetArrayLength(reinterpret_cast<jarray>(o70)));
1232 EXPECT_EQ(71, env->GetArrayLength(reinterpret_cast<jarray>(o71)));
1233 EXPECT_EQ(72, env->GetArrayLength(reinterpret_cast<jarray>(o72)));
1234 EXPECT_EQ(73, env->GetArrayLength(reinterpret_cast<jarray>(o73)));
1235 EXPECT_EQ(74, env->GetArrayLength(reinterpret_cast<jarray>(o74)));
1236 EXPECT_EQ(75, env->GetArrayLength(reinterpret_cast<jarray>(o75)));
1237 EXPECT_EQ(76, env->GetArrayLength(reinterpret_cast<jarray>(o76)));
1238 EXPECT_EQ(77, env->GetArrayLength(reinterpret_cast<jarray>(o77)));
1239 EXPECT_EQ(78, env->GetArrayLength(reinterpret_cast<jarray>(o78)));
1240 EXPECT_EQ(79, env->GetArrayLength(reinterpret_cast<jarray>(o79)));
1241 EXPECT_EQ(80, env->GetArrayLength(reinterpret_cast<jarray>(o80)));
1242 EXPECT_EQ(81, env->GetArrayLength(reinterpret_cast<jarray>(o81)));
1243 EXPECT_EQ(82, env->GetArrayLength(reinterpret_cast<jarray>(o82)));
1244 EXPECT_EQ(83, env->GetArrayLength(reinterpret_cast<jarray>(o83)));
1245 EXPECT_EQ(84, env->GetArrayLength(reinterpret_cast<jarray>(o84)));
1246 EXPECT_EQ(85, env->GetArrayLength(reinterpret_cast<jarray>(o85)));
1247 EXPECT_EQ(86, env->GetArrayLength(reinterpret_cast<jarray>(o86)));
1248 EXPECT_EQ(87, env->GetArrayLength(reinterpret_cast<jarray>(o87)));
1249 EXPECT_EQ(88, env->GetArrayLength(reinterpret_cast<jarray>(o88)));
1250 EXPECT_EQ(89, env->GetArrayLength(reinterpret_cast<jarray>(o89)));
1251 EXPECT_EQ(90, env->GetArrayLength(reinterpret_cast<jarray>(o90)));
1252 EXPECT_EQ(91, env->GetArrayLength(reinterpret_cast<jarray>(o91)));
1253 EXPECT_EQ(92, env->GetArrayLength(reinterpret_cast<jarray>(o92)));
1254 EXPECT_EQ(93, env->GetArrayLength(reinterpret_cast<jarray>(o93)));
1255 EXPECT_EQ(94, env->GetArrayLength(reinterpret_cast<jarray>(o94)));
1256 EXPECT_EQ(95, env->GetArrayLength(reinterpret_cast<jarray>(o95)));
1257 EXPECT_EQ(96, env->GetArrayLength(reinterpret_cast<jarray>(o96)));
1258 EXPECT_EQ(97, env->GetArrayLength(reinterpret_cast<jarray>(o97)));
1259 EXPECT_EQ(98, env->GetArrayLength(reinterpret_cast<jarray>(o98)));
1260 EXPECT_EQ(99, env->GetArrayLength(reinterpret_cast<jarray>(o99)));
1261 EXPECT_EQ(100, env->GetArrayLength(reinterpret_cast<jarray>(o100)));
1262 EXPECT_EQ(101, env->GetArrayLength(reinterpret_cast<jarray>(o101)));
1263 EXPECT_EQ(102, env->GetArrayLength(reinterpret_cast<jarray>(o102)));
1264 EXPECT_EQ(103, env->GetArrayLength(reinterpret_cast<jarray>(o103)));
1265 EXPECT_EQ(104, env->GetArrayLength(reinterpret_cast<jarray>(o104)));
1266 EXPECT_EQ(105, env->GetArrayLength(reinterpret_cast<jarray>(o105)));
1267 EXPECT_EQ(106, env->GetArrayLength(reinterpret_cast<jarray>(o106)));
1268 EXPECT_EQ(107, env->GetArrayLength(reinterpret_cast<jarray>(o107)));
1269 EXPECT_EQ(108, env->GetArrayLength(reinterpret_cast<jarray>(o108)));
1270 EXPECT_EQ(109, env->GetArrayLength(reinterpret_cast<jarray>(o109)));
1271 EXPECT_EQ(110, env->GetArrayLength(reinterpret_cast<jarray>(o110)));
1272 EXPECT_EQ(111, env->GetArrayLength(reinterpret_cast<jarray>(o111)));
1273 EXPECT_EQ(112, env->GetArrayLength(reinterpret_cast<jarray>(o112)));
1274 EXPECT_EQ(113, env->GetArrayLength(reinterpret_cast<jarray>(o113)));
1275 EXPECT_EQ(114, env->GetArrayLength(reinterpret_cast<jarray>(o114)));
1276 EXPECT_EQ(115, env->GetArrayLength(reinterpret_cast<jarray>(o115)));
1277 EXPECT_EQ(116, env->GetArrayLength(reinterpret_cast<jarray>(o116)));
1278 EXPECT_EQ(117, env->GetArrayLength(reinterpret_cast<jarray>(o117)));
1279 EXPECT_EQ(118, env->GetArrayLength(reinterpret_cast<jarray>(o118)));
1280 EXPECT_EQ(119, env->GetArrayLength(reinterpret_cast<jarray>(o119)));
1281 EXPECT_EQ(120, env->GetArrayLength(reinterpret_cast<jarray>(o120)));
1282 EXPECT_EQ(121, env->GetArrayLength(reinterpret_cast<jarray>(o121)));
1283 EXPECT_EQ(122, env->GetArrayLength(reinterpret_cast<jarray>(o122)));
1284 EXPECT_EQ(123, env->GetArrayLength(reinterpret_cast<jarray>(o123)));
1285 EXPECT_EQ(124, env->GetArrayLength(reinterpret_cast<jarray>(o124)));
1286 EXPECT_EQ(125, env->GetArrayLength(reinterpret_cast<jarray>(o125)));
1287 EXPECT_EQ(126, env->GetArrayLength(reinterpret_cast<jarray>(o126)));
1288 EXPECT_EQ(127, env->GetArrayLength(reinterpret_cast<jarray>(o127)));
1289 EXPECT_EQ(128, env->GetArrayLength(reinterpret_cast<jarray>(o128)));
1290 EXPECT_EQ(129, env->GetArrayLength(reinterpret_cast<jarray>(o129)));
1291 EXPECT_EQ(130, env->GetArrayLength(reinterpret_cast<jarray>(o130)));
1292 EXPECT_EQ(131, env->GetArrayLength(reinterpret_cast<jarray>(o131)));
1293 EXPECT_EQ(132, env->GetArrayLength(reinterpret_cast<jarray>(o132)));
1294 EXPECT_EQ(133, env->GetArrayLength(reinterpret_cast<jarray>(o133)));
1295 EXPECT_EQ(134, env->GetArrayLength(reinterpret_cast<jarray>(o134)));
1296 EXPECT_EQ(135, env->GetArrayLength(reinterpret_cast<jarray>(o135)));
1297 EXPECT_EQ(136, env->GetArrayLength(reinterpret_cast<jarray>(o136)));
1298 EXPECT_EQ(137, env->GetArrayLength(reinterpret_cast<jarray>(o137)));
1299 EXPECT_EQ(138, env->GetArrayLength(reinterpret_cast<jarray>(o138)));
1300 EXPECT_EQ(139, env->GetArrayLength(reinterpret_cast<jarray>(o139)));
1301 EXPECT_EQ(140, env->GetArrayLength(reinterpret_cast<jarray>(o140)));
1302 EXPECT_EQ(141, env->GetArrayLength(reinterpret_cast<jarray>(o141)));
1303 EXPECT_EQ(142, env->GetArrayLength(reinterpret_cast<jarray>(o142)));
1304 EXPECT_EQ(143, env->GetArrayLength(reinterpret_cast<jarray>(o143)));
1305 EXPECT_EQ(144, env->GetArrayLength(reinterpret_cast<jarray>(o144)));
1306 EXPECT_EQ(145, env->GetArrayLength(reinterpret_cast<jarray>(o145)));
1307 EXPECT_EQ(146, env->GetArrayLength(reinterpret_cast<jarray>(o146)));
1308 EXPECT_EQ(147, env->GetArrayLength(reinterpret_cast<jarray>(o147)));
1309 EXPECT_EQ(148, env->GetArrayLength(reinterpret_cast<jarray>(o148)));
1310 EXPECT_EQ(149, env->GetArrayLength(reinterpret_cast<jarray>(o149)));
1311 EXPECT_EQ(150, env->GetArrayLength(reinterpret_cast<jarray>(o150)));
1312 EXPECT_EQ(151, env->GetArrayLength(reinterpret_cast<jarray>(o151)));
1313 EXPECT_EQ(152, env->GetArrayLength(reinterpret_cast<jarray>(o152)));
1314 EXPECT_EQ(153, env->GetArrayLength(reinterpret_cast<jarray>(o153)));
1315 EXPECT_EQ(154, env->GetArrayLength(reinterpret_cast<jarray>(o154)));
1316 EXPECT_EQ(155, env->GetArrayLength(reinterpret_cast<jarray>(o155)));
1317 EXPECT_EQ(156, env->GetArrayLength(reinterpret_cast<jarray>(o156)));
1318 EXPECT_EQ(157, env->GetArrayLength(reinterpret_cast<jarray>(o157)));
1319 EXPECT_EQ(158, env->GetArrayLength(reinterpret_cast<jarray>(o158)));
1320 EXPECT_EQ(159, env->GetArrayLength(reinterpret_cast<jarray>(o159)));
1321 EXPECT_EQ(160, env->GetArrayLength(reinterpret_cast<jarray>(o160)));
1322 EXPECT_EQ(161, env->GetArrayLength(reinterpret_cast<jarray>(o161)));
1323 EXPECT_EQ(162, env->GetArrayLength(reinterpret_cast<jarray>(o162)));
1324 EXPECT_EQ(163, env->GetArrayLength(reinterpret_cast<jarray>(o163)));
1325 EXPECT_EQ(164, env->GetArrayLength(reinterpret_cast<jarray>(o164)));
1326 EXPECT_EQ(165, env->GetArrayLength(reinterpret_cast<jarray>(o165)));
1327 EXPECT_EQ(166, env->GetArrayLength(reinterpret_cast<jarray>(o166)));
1328 EXPECT_EQ(167, env->GetArrayLength(reinterpret_cast<jarray>(o167)));
1329 EXPECT_EQ(168, env->GetArrayLength(reinterpret_cast<jarray>(o168)));
1330 EXPECT_EQ(169, env->GetArrayLength(reinterpret_cast<jarray>(o169)));
1331 EXPECT_EQ(170, env->GetArrayLength(reinterpret_cast<jarray>(o170)));
1332 EXPECT_EQ(171, env->GetArrayLength(reinterpret_cast<jarray>(o171)));
1333 EXPECT_EQ(172, env->GetArrayLength(reinterpret_cast<jarray>(o172)));
1334 EXPECT_EQ(173, env->GetArrayLength(reinterpret_cast<jarray>(o173)));
1335 EXPECT_EQ(174, env->GetArrayLength(reinterpret_cast<jarray>(o174)));
1336 EXPECT_EQ(175, env->GetArrayLength(reinterpret_cast<jarray>(o175)));
1337 EXPECT_EQ(176, env->GetArrayLength(reinterpret_cast<jarray>(o176)));
1338 EXPECT_EQ(177, env->GetArrayLength(reinterpret_cast<jarray>(o177)));
1339 EXPECT_EQ(178, env->GetArrayLength(reinterpret_cast<jarray>(o178)));
1340 EXPECT_EQ(179, env->GetArrayLength(reinterpret_cast<jarray>(o179)));
1341 EXPECT_EQ(180, env->GetArrayLength(reinterpret_cast<jarray>(o180)));
1342 EXPECT_EQ(181, env->GetArrayLength(reinterpret_cast<jarray>(o181)));
1343 EXPECT_EQ(182, env->GetArrayLength(reinterpret_cast<jarray>(o182)));
1344 EXPECT_EQ(183, env->GetArrayLength(reinterpret_cast<jarray>(o183)));
1345 EXPECT_EQ(184, env->GetArrayLength(reinterpret_cast<jarray>(o184)));
1346 EXPECT_EQ(185, env->GetArrayLength(reinterpret_cast<jarray>(o185)));
1347 EXPECT_EQ(186, env->GetArrayLength(reinterpret_cast<jarray>(o186)));
1348 EXPECT_EQ(187, env->GetArrayLength(reinterpret_cast<jarray>(o187)));
1349 EXPECT_EQ(188, env->GetArrayLength(reinterpret_cast<jarray>(o188)));
1350 EXPECT_EQ(189, env->GetArrayLength(reinterpret_cast<jarray>(o189)));
1351 EXPECT_EQ(190, env->GetArrayLength(reinterpret_cast<jarray>(o190)));
1352 EXPECT_EQ(191, env->GetArrayLength(reinterpret_cast<jarray>(o191)));
1353 EXPECT_EQ(192, env->GetArrayLength(reinterpret_cast<jarray>(o192)));
1354 EXPECT_EQ(193, env->GetArrayLength(reinterpret_cast<jarray>(o193)));
1355 EXPECT_EQ(194, env->GetArrayLength(reinterpret_cast<jarray>(o194)));
1356 EXPECT_EQ(195, env->GetArrayLength(reinterpret_cast<jarray>(o195)));
1357 EXPECT_EQ(196, env->GetArrayLength(reinterpret_cast<jarray>(o196)));
1358 EXPECT_EQ(197, env->GetArrayLength(reinterpret_cast<jarray>(o197)));
1359 EXPECT_EQ(198, env->GetArrayLength(reinterpret_cast<jarray>(o198)));
1360 EXPECT_EQ(199, env->GetArrayLength(reinterpret_cast<jarray>(o199)));
1361 EXPECT_EQ(200, env->GetArrayLength(reinterpret_cast<jarray>(o200)));
1362 EXPECT_EQ(201, env->GetArrayLength(reinterpret_cast<jarray>(o201)));
1363 EXPECT_EQ(202, env->GetArrayLength(reinterpret_cast<jarray>(o202)));
1364 EXPECT_EQ(203, env->GetArrayLength(reinterpret_cast<jarray>(o203)));
1365 EXPECT_EQ(204, env->GetArrayLength(reinterpret_cast<jarray>(o204)));
1366 EXPECT_EQ(205, env->GetArrayLength(reinterpret_cast<jarray>(o205)));
1367 EXPECT_EQ(206, env->GetArrayLength(reinterpret_cast<jarray>(o206)));
1368 EXPECT_EQ(207, env->GetArrayLength(reinterpret_cast<jarray>(o207)));
1369 EXPECT_EQ(208, env->GetArrayLength(reinterpret_cast<jarray>(o208)));
1370 EXPECT_EQ(209, env->GetArrayLength(reinterpret_cast<jarray>(o209)));
1371 EXPECT_EQ(210, env->GetArrayLength(reinterpret_cast<jarray>(o210)));
1372 EXPECT_EQ(211, env->GetArrayLength(reinterpret_cast<jarray>(o211)));
1373 EXPECT_EQ(212, env->GetArrayLength(reinterpret_cast<jarray>(o212)));
1374 EXPECT_EQ(213, env->GetArrayLength(reinterpret_cast<jarray>(o213)));
1375 EXPECT_EQ(214, env->GetArrayLength(reinterpret_cast<jarray>(o214)));
1376 EXPECT_EQ(215, env->GetArrayLength(reinterpret_cast<jarray>(o215)));
1377 EXPECT_EQ(216, env->GetArrayLength(reinterpret_cast<jarray>(o216)));
1378 EXPECT_EQ(217, env->GetArrayLength(reinterpret_cast<jarray>(o217)));
1379 EXPECT_EQ(218, env->GetArrayLength(reinterpret_cast<jarray>(o218)));
1380 EXPECT_EQ(219, env->GetArrayLength(reinterpret_cast<jarray>(o219)));
1381 EXPECT_EQ(220, env->GetArrayLength(reinterpret_cast<jarray>(o220)));
1382 EXPECT_EQ(221, env->GetArrayLength(reinterpret_cast<jarray>(o221)));
1383 EXPECT_EQ(222, env->GetArrayLength(reinterpret_cast<jarray>(o222)));
1384 EXPECT_EQ(223, env->GetArrayLength(reinterpret_cast<jarray>(o223)));
1385 EXPECT_EQ(224, env->GetArrayLength(reinterpret_cast<jarray>(o224)));
1386 EXPECT_EQ(225, env->GetArrayLength(reinterpret_cast<jarray>(o225)));
1387 EXPECT_EQ(226, env->GetArrayLength(reinterpret_cast<jarray>(o226)));
1388 EXPECT_EQ(227, env->GetArrayLength(reinterpret_cast<jarray>(o227)));
1389 EXPECT_EQ(228, env->GetArrayLength(reinterpret_cast<jarray>(o228)));
1390 EXPECT_EQ(229, env->GetArrayLength(reinterpret_cast<jarray>(o229)));
1391 EXPECT_EQ(230, env->GetArrayLength(reinterpret_cast<jarray>(o230)));
1392 EXPECT_EQ(231, env->GetArrayLength(reinterpret_cast<jarray>(o231)));
1393 EXPECT_EQ(232, env->GetArrayLength(reinterpret_cast<jarray>(o232)));
1394 EXPECT_EQ(233, env->GetArrayLength(reinterpret_cast<jarray>(o233)));
1395 EXPECT_EQ(234, env->GetArrayLength(reinterpret_cast<jarray>(o234)));
1396 EXPECT_EQ(235, env->GetArrayLength(reinterpret_cast<jarray>(o235)));
1397 EXPECT_EQ(236, env->GetArrayLength(reinterpret_cast<jarray>(o236)));
1398 EXPECT_EQ(237, env->GetArrayLength(reinterpret_cast<jarray>(o237)));
1399 EXPECT_EQ(238, env->GetArrayLength(reinterpret_cast<jarray>(o238)));
1400 EXPECT_EQ(239, env->GetArrayLength(reinterpret_cast<jarray>(o239)));
1401 EXPECT_EQ(240, env->GetArrayLength(reinterpret_cast<jarray>(o240)));
1402 EXPECT_EQ(241, env->GetArrayLength(reinterpret_cast<jarray>(o241)));
1403 EXPECT_EQ(242, env->GetArrayLength(reinterpret_cast<jarray>(o242)));
1404 EXPECT_EQ(243, env->GetArrayLength(reinterpret_cast<jarray>(o243)));
1405 EXPECT_EQ(244, env->GetArrayLength(reinterpret_cast<jarray>(o244)));
1406 EXPECT_EQ(245, env->GetArrayLength(reinterpret_cast<jarray>(o245)));
1407 EXPECT_EQ(246, env->GetArrayLength(reinterpret_cast<jarray>(o246)));
1408 EXPECT_EQ(247, env->GetArrayLength(reinterpret_cast<jarray>(o247)));
1409 EXPECT_EQ(248, env->GetArrayLength(reinterpret_cast<jarray>(o248)));
1410 EXPECT_EQ(249, env->GetArrayLength(reinterpret_cast<jarray>(o249)));
1411 EXPECT_EQ(250, env->GetArrayLength(reinterpret_cast<jarray>(o250)));
1412 EXPECT_EQ(251, env->GetArrayLength(reinterpret_cast<jarray>(o251)));
1413 EXPECT_EQ(252, env->GetArrayLength(reinterpret_cast<jarray>(o252)));
1414 EXPECT_EQ(253, env->GetArrayLength(reinterpret_cast<jarray>(o253)));
1415 }
1416}
1417
1418const char* longSig =
1419 "(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1420 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1421 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1422 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1423 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1424 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1425 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1426 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1427 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1428 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1429 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1430 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1431 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1432 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1433 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1434 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1435 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1436 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1437 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1438 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1439 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1440 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1441 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1442 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1443 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1444 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1445 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1446 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1447 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1448 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1449 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1450 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1451 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1452 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1453 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1454 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1455 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1456 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1457 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1458 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1459 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1460 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1461 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1462 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1463 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1464 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1465 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1466 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1467 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1468 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1469 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)V";
1470
Andreas Gampe6e498692014-08-18 16:43:12 -07001471void JniCompilerTest::MaxParamNumberImpl() {
Andreas Gampe7a0e5042014-03-07 13:03:19 -08001472 SetUpForTest(false, "maxParamNumber", longSig,
1473 reinterpret_cast<void*>(&Java_MyClassNatives_maxParamNumber));
1474
1475 jvalue args[254];
1476
1477 // First test: test with all arguments null.
1478 for (int i = 0; i < 254; ++i) {
1479 args[i].l = nullptr;
1480 }
1481
1482 env_->CallNonvirtualVoidMethodA(jobj_, jklass_, jmethod_, args);
1483
1484 // Second test: test with int[] objects with increasing lengths
1485 for (int i = 0; i < 254; ++i) {
1486 jintArray tmp = env_->NewIntArray(i);
1487 args[i].l = tmp;
1488 EXPECT_NE(args[i].l, nullptr);
1489 }
1490
1491 env_->CallNonvirtualVoidMethodA(jobj_, jklass_, jmethod_, args);
1492}
1493
Andreas Gampe6e498692014-08-18 16:43:12 -07001494JNI_TEST(MaxParamNumber)
1495
1496void JniCompilerTest::WithoutImplementationImpl() {
Andreas Gampe369810a2015-01-14 19:53:31 -08001497 // This will lead to error messages in the log.
1498 ScopedLogSeverity sls(LogSeverity::FATAL);
1499
Andreas Gampead615172014-04-04 16:20:13 -07001500 SetUpForTest(false, "withoutImplementation", "()V", nullptr);
1501
1502 env_->CallVoidMethod(jobj_, jmethod_);
1503
1504 EXPECT_TRUE(Thread::Current()->IsExceptionPending());
1505 EXPECT_TRUE(env_->ExceptionCheck() == JNI_TRUE);
1506}
1507
Andreas Gampe6e498692014-08-18 16:43:12 -07001508JNI_TEST(WithoutImplementation)
1509
Andreas Gampe48ee3562015-04-10 19:57:29 -07001510void JniCompilerTest::WithoutImplementationRefReturnImpl() {
1511 // This will lead to error messages in the log.
1512 ScopedLogSeverity sls(LogSeverity::FATAL);
1513
1514 SetUpForTest(false, "withoutImplementationRefReturn", "()Ljava/lang/Object;", nullptr);
1515
1516 env_->CallObjectMethod(jobj_, jmethod_);
1517
1518 EXPECT_TRUE(Thread::Current()->IsExceptionPending());
1519 EXPECT_TRUE(env_->ExceptionCheck() == JNI_TRUE);
1520}
1521
1522JNI_TEST(WithoutImplementationRefReturn)
1523
Ian Rogers6a3c1fc2014-10-31 00:33:20 -07001524void Java_MyClassNatives_stackArgsIntsFirst(JNIEnv*, jclass, jint i1, jint i2, jint i3,
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001525 jint i4, jint i5, jint i6, jint i7, jint i8, jint i9,
1526 jint i10, jfloat f1, jfloat f2, jfloat f3, jfloat f4,
1527 jfloat f5, jfloat f6, jfloat f7, jfloat f8, jfloat f9,
1528 jfloat f10) {
1529 EXPECT_EQ(i1, 1);
1530 EXPECT_EQ(i2, 2);
1531 EXPECT_EQ(i3, 3);
1532 EXPECT_EQ(i4, 4);
1533 EXPECT_EQ(i5, 5);
1534 EXPECT_EQ(i6, 6);
1535 EXPECT_EQ(i7, 7);
1536 EXPECT_EQ(i8, 8);
1537 EXPECT_EQ(i9, 9);
1538 EXPECT_EQ(i10, 10);
1539
Roland Levillainda4d79b2015-03-24 14:36:11 +00001540 jint i11 = bit_cast<jint, jfloat>(f1);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001541 EXPECT_EQ(i11, 11);
Roland Levillainda4d79b2015-03-24 14:36:11 +00001542 jint i12 = bit_cast<jint, jfloat>(f2);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001543 EXPECT_EQ(i12, 12);
Roland Levillainda4d79b2015-03-24 14:36:11 +00001544 jint i13 = bit_cast<jint, jfloat>(f3);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001545 EXPECT_EQ(i13, 13);
Roland Levillainda4d79b2015-03-24 14:36:11 +00001546 jint i14 = bit_cast<jint, jfloat>(f4);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001547 EXPECT_EQ(i14, 14);
Roland Levillainda4d79b2015-03-24 14:36:11 +00001548 jint i15 = bit_cast<jint, jfloat>(f5);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001549 EXPECT_EQ(i15, 15);
Roland Levillainda4d79b2015-03-24 14:36:11 +00001550 jint i16 = bit_cast<jint, jfloat>(f6);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001551 EXPECT_EQ(i16, 16);
Roland Levillainda4d79b2015-03-24 14:36:11 +00001552 jint i17 = bit_cast<jint, jfloat>(f7);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001553 EXPECT_EQ(i17, 17);
Roland Levillainda4d79b2015-03-24 14:36:11 +00001554 jint i18 = bit_cast<jint, jfloat>(f8);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001555 EXPECT_EQ(i18, 18);
Roland Levillainda4d79b2015-03-24 14:36:11 +00001556 jint i19 = bit_cast<jint, jfloat>(f9);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001557 EXPECT_EQ(i19, 19);
Roland Levillainda4d79b2015-03-24 14:36:11 +00001558 jint i20 = bit_cast<jint, jfloat>(f10);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001559 EXPECT_EQ(i20, 20);
1560}
1561
Andreas Gampe6e498692014-08-18 16:43:12 -07001562void JniCompilerTest::StackArgsIntsFirstImpl() {
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001563 SetUpForTest(true, "stackArgsIntsFirst", "(IIIIIIIIIIFFFFFFFFFF)V",
1564 reinterpret_cast<void*>(&Java_MyClassNatives_stackArgsIntsFirst));
1565
1566 jint i1 = 1;
1567 jint i2 = 2;
1568 jint i3 = 3;
1569 jint i4 = 4;
1570 jint i5 = 5;
1571 jint i6 = 6;
1572 jint i7 = 7;
1573 jint i8 = 8;
1574 jint i9 = 9;
1575 jint i10 = 10;
1576
Roland Levillainda4d79b2015-03-24 14:36:11 +00001577 jfloat f1 = bit_cast<jfloat, jint>(11);
1578 jfloat f2 = bit_cast<jfloat, jint>(12);
1579 jfloat f3 = bit_cast<jfloat, jint>(13);
1580 jfloat f4 = bit_cast<jfloat, jint>(14);
1581 jfloat f5 = bit_cast<jfloat, jint>(15);
1582 jfloat f6 = bit_cast<jfloat, jint>(16);
1583 jfloat f7 = bit_cast<jfloat, jint>(17);
1584 jfloat f8 = bit_cast<jfloat, jint>(18);
1585 jfloat f9 = bit_cast<jfloat, jint>(19);
1586 jfloat f10 = bit_cast<jfloat, jint>(20);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001587
1588 env_->CallStaticVoidMethod(jklass_, jmethod_, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, f1, f2,
1589 f3, f4, f5, f6, f7, f8, f9, f10);
1590}
1591
Andreas Gampe6e498692014-08-18 16:43:12 -07001592JNI_TEST(StackArgsIntsFirst)
1593
Ian Rogers6a3c1fc2014-10-31 00:33:20 -07001594void Java_MyClassNatives_stackArgsFloatsFirst(JNIEnv*, jclass, jfloat f1, jfloat f2,
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001595 jfloat f3, jfloat f4, jfloat f5, jfloat f6, jfloat f7,
1596 jfloat f8, jfloat f9, jfloat f10, jint i1, jint i2,
1597 jint i3, jint i4, jint i5, jint i6, jint i7, jint i8,
1598 jint i9, jint i10) {
1599 EXPECT_EQ(i1, 1);
1600 EXPECT_EQ(i2, 2);
1601 EXPECT_EQ(i3, 3);
1602 EXPECT_EQ(i4, 4);
1603 EXPECT_EQ(i5, 5);
1604 EXPECT_EQ(i6, 6);
1605 EXPECT_EQ(i7, 7);
1606 EXPECT_EQ(i8, 8);
1607 EXPECT_EQ(i9, 9);
1608 EXPECT_EQ(i10, 10);
1609
Roland Levillainda4d79b2015-03-24 14:36:11 +00001610 jint i11 = bit_cast<jint, jfloat>(f1);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001611 EXPECT_EQ(i11, 11);
Roland Levillainda4d79b2015-03-24 14:36:11 +00001612 jint i12 = bit_cast<jint, jfloat>(f2);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001613 EXPECT_EQ(i12, 12);
Roland Levillainda4d79b2015-03-24 14:36:11 +00001614 jint i13 = bit_cast<jint, jfloat>(f3);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001615 EXPECT_EQ(i13, 13);
Roland Levillainda4d79b2015-03-24 14:36:11 +00001616 jint i14 = bit_cast<jint, jfloat>(f4);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001617 EXPECT_EQ(i14, 14);
Roland Levillainda4d79b2015-03-24 14:36:11 +00001618 jint i15 = bit_cast<jint, jfloat>(f5);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001619 EXPECT_EQ(i15, 15);
Roland Levillainda4d79b2015-03-24 14:36:11 +00001620 jint i16 = bit_cast<jint, jfloat>(f6);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001621 EXPECT_EQ(i16, 16);
Roland Levillainda4d79b2015-03-24 14:36:11 +00001622 jint i17 = bit_cast<jint, jfloat>(f7);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001623 EXPECT_EQ(i17, 17);
Roland Levillainda4d79b2015-03-24 14:36:11 +00001624 jint i18 = bit_cast<jint, jfloat>(f8);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001625 EXPECT_EQ(i18, 18);
Roland Levillainda4d79b2015-03-24 14:36:11 +00001626 jint i19 = bit_cast<jint, jfloat>(f9);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001627 EXPECT_EQ(i19, 19);
Roland Levillainda4d79b2015-03-24 14:36:11 +00001628 jint i20 = bit_cast<jint, jfloat>(f10);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001629 EXPECT_EQ(i20, 20);
1630}
1631
Andreas Gampe6e498692014-08-18 16:43:12 -07001632void JniCompilerTest::StackArgsFloatsFirstImpl() {
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001633 SetUpForTest(true, "stackArgsFloatsFirst", "(FFFFFFFFFFIIIIIIIIII)V",
1634 reinterpret_cast<void*>(&Java_MyClassNatives_stackArgsFloatsFirst));
1635
1636 jint i1 = 1;
1637 jint i2 = 2;
1638 jint i3 = 3;
1639 jint i4 = 4;
1640 jint i5 = 5;
1641 jint i6 = 6;
1642 jint i7 = 7;
1643 jint i8 = 8;
1644 jint i9 = 9;
1645 jint i10 = 10;
1646
Roland Levillainda4d79b2015-03-24 14:36:11 +00001647 jfloat f1 = bit_cast<jfloat, jint>(11);
1648 jfloat f2 = bit_cast<jfloat, jint>(12);
1649 jfloat f3 = bit_cast<jfloat, jint>(13);
1650 jfloat f4 = bit_cast<jfloat, jint>(14);
1651 jfloat f5 = bit_cast<jfloat, jint>(15);
1652 jfloat f6 = bit_cast<jfloat, jint>(16);
1653 jfloat f7 = bit_cast<jfloat, jint>(17);
1654 jfloat f8 = bit_cast<jfloat, jint>(18);
1655 jfloat f9 = bit_cast<jfloat, jint>(19);
1656 jfloat f10 = bit_cast<jfloat, jint>(20);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001657
1658 env_->CallStaticVoidMethod(jklass_, jmethod_, f1, f2, f3, f4, f5, f6, f7, f8, f9, f10, i1, i2, i3,
1659 i4, i5, i6, i7, i8, i9, i10);
1660}
1661
Andreas Gampe6e498692014-08-18 16:43:12 -07001662JNI_TEST(StackArgsFloatsFirst)
1663
Ian Rogers6a3c1fc2014-10-31 00:33:20 -07001664void Java_MyClassNatives_stackArgsMixed(JNIEnv*, jclass, jint i1, jfloat f1, jint i2,
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001665 jfloat f2, jint i3, jfloat f3, jint i4, jfloat f4, jint i5,
1666 jfloat f5, jint i6, jfloat f6, jint i7, jfloat f7, jint i8,
1667 jfloat f8, jint i9, jfloat f9, jint i10, jfloat f10) {
1668 EXPECT_EQ(i1, 1);
1669 EXPECT_EQ(i2, 2);
1670 EXPECT_EQ(i3, 3);
1671 EXPECT_EQ(i4, 4);
1672 EXPECT_EQ(i5, 5);
1673 EXPECT_EQ(i6, 6);
1674 EXPECT_EQ(i7, 7);
1675 EXPECT_EQ(i8, 8);
1676 EXPECT_EQ(i9, 9);
1677 EXPECT_EQ(i10, 10);
1678
Roland Levillainda4d79b2015-03-24 14:36:11 +00001679 jint i11 = bit_cast<jint, jfloat>(f1);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001680 EXPECT_EQ(i11, 11);
Roland Levillainda4d79b2015-03-24 14:36:11 +00001681 jint i12 = bit_cast<jint, jfloat>(f2);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001682 EXPECT_EQ(i12, 12);
Roland Levillainda4d79b2015-03-24 14:36:11 +00001683 jint i13 = bit_cast<jint, jfloat>(f3);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001684 EXPECT_EQ(i13, 13);
Roland Levillainda4d79b2015-03-24 14:36:11 +00001685 jint i14 = bit_cast<jint, jfloat>(f4);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001686 EXPECT_EQ(i14, 14);
Roland Levillainda4d79b2015-03-24 14:36:11 +00001687 jint i15 = bit_cast<jint, jfloat>(f5);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001688 EXPECT_EQ(i15, 15);
Roland Levillainda4d79b2015-03-24 14:36:11 +00001689 jint i16 = bit_cast<jint, jfloat>(f6);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001690 EXPECT_EQ(i16, 16);
Roland Levillainda4d79b2015-03-24 14:36:11 +00001691 jint i17 = bit_cast<jint, jfloat>(f7);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001692 EXPECT_EQ(i17, 17);
Roland Levillainda4d79b2015-03-24 14:36:11 +00001693 jint i18 = bit_cast<jint, jfloat>(f8);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001694 EXPECT_EQ(i18, 18);
Roland Levillainda4d79b2015-03-24 14:36:11 +00001695 jint i19 = bit_cast<jint, jfloat>(f9);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001696 EXPECT_EQ(i19, 19);
Roland Levillainda4d79b2015-03-24 14:36:11 +00001697 jint i20 = bit_cast<jint, jfloat>(f10);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001698 EXPECT_EQ(i20, 20);
1699}
1700
Andreas Gampe6e498692014-08-18 16:43:12 -07001701void JniCompilerTest::StackArgsMixedImpl() {
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001702 SetUpForTest(true, "stackArgsMixed", "(IFIFIFIFIFIFIFIFIFIF)V",
1703 reinterpret_cast<void*>(&Java_MyClassNatives_stackArgsMixed));
1704
1705 jint i1 = 1;
1706 jint i2 = 2;
1707 jint i3 = 3;
1708 jint i4 = 4;
1709 jint i5 = 5;
1710 jint i6 = 6;
1711 jint i7 = 7;
1712 jint i8 = 8;
1713 jint i9 = 9;
1714 jint i10 = 10;
1715
Roland Levillainda4d79b2015-03-24 14:36:11 +00001716 jfloat f1 = bit_cast<jfloat, jint>(11);
1717 jfloat f2 = bit_cast<jfloat, jint>(12);
1718 jfloat f3 = bit_cast<jfloat, jint>(13);
1719 jfloat f4 = bit_cast<jfloat, jint>(14);
1720 jfloat f5 = bit_cast<jfloat, jint>(15);
1721 jfloat f6 = bit_cast<jfloat, jint>(16);
1722 jfloat f7 = bit_cast<jfloat, jint>(17);
1723 jfloat f8 = bit_cast<jfloat, jint>(18);
1724 jfloat f9 = bit_cast<jfloat, jint>(19);
1725 jfloat f10 = bit_cast<jfloat, jint>(20);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001726
1727 env_->CallStaticVoidMethod(jklass_, jmethod_, i1, f1, i2, f2, i3, f3, i4, f4, i5, f5, i6, f6, i7,
1728 f7, i8, f8, i9, f9, i10, f10);
1729}
1730
Andreas Gampe6e498692014-08-18 16:43:12 -07001731JNI_TEST(StackArgsMixed)
1732
Lazar Trsicf652d602015-06-24 16:30:21 +02001733void Java_MyClassNatives_stackArgsSignExtendedMips64(JNIEnv*, jclass, jint i1, jint i2, jint i3,
1734 jint i4, jint i5, jint i6, jint i7, jint i8) {
1735 EXPECT_EQ(i1, 1);
1736 EXPECT_EQ(i2, 2);
1737 EXPECT_EQ(i3, 3);
1738 EXPECT_EQ(i4, 4);
1739 EXPECT_EQ(i5, 5);
1740 EXPECT_EQ(i6, 6);
1741 EXPECT_EQ(i7, 7);
1742 EXPECT_EQ(i8, -8);
1743
1744#if defined(__mips__) && defined(__LP64__) && (__BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__)
1745 // Mips64 ABI requires that arguments passed through stack be sign-extended 8B slots.
1746 // First 8 arguments are passed through registers, check i7 and i8.
1747 uint32_t stack1_high = *(&i7 + 1);
1748 uint32_t stack2_high = *(&i8 + 1);
1749
1750 EXPECT_EQ(stack1_high, static_cast<uint32_t>(0));
1751 EXPECT_EQ(stack2_high, static_cast<uint32_t>(0xffffffff));
1752#else
1753 LOG(INFO) << "Skipping stackArgsSignExtendedMips64 as there is nothing to be done on "
1754 << kRuntimeISA;
1755 // Force-print to std::cout so it's also outside the logcat.
1756 std::cout << "Skipping stackArgsSignExtendedMips64 as there is nothing to be done on "
1757 << kRuntimeISA << std::endl;
1758#endif
1759}
1760
1761void JniCompilerTest::StackArgsSignExtendedMips64Impl() {
1762 SetUpForTest(true, "stackArgsSignExtendedMips64", "(IIIIIIII)V",
1763 reinterpret_cast<void*>(&Java_MyClassNatives_stackArgsSignExtendedMips64));
1764 jint i1 = 1;
1765 jint i2 = 2;
1766 jint i3 = 3;
1767 jint i4 = 4;
1768 jint i5 = 5;
1769 jint i6 = 6;
1770 jint i7 = 7;
1771 jint i8 = -8;
1772
1773 env_->CallStaticVoidMethod(jklass_, jmethod_, i1, i2, i3, i4, i5, i6, i7, i8);
1774}
1775
1776JNI_TEST(StackArgsSignExtendedMips64)
1777
Igor Murashkin9d4b6da2016-07-29 09:51:58 -07001778void Java_MyClassNatives_normalNative(JNIEnv*, jclass) {
1779 // Intentionally left empty.
1780}
1781
1782// Methods not annotated with anything are not considered "fast native"
1783// -- Check that the annotation lookup does not find it.
1784void JniCompilerTest::NormalNativeImpl() {
1785 SetUpForTest(/* direct */ true,
1786 "normalNative",
1787 "()V",
1788 reinterpret_cast<void*>(&Java_MyClassNatives_normalNative));
1789
1790 ScopedObjectAccess soa(Thread::Current());
1791 ArtMethod* method = soa.DecodeMethod(jmethod_);
1792 ASSERT_TRUE(method != nullptr);
1793
1794 EXPECT_FALSE(method->IsAnnotatedWithFastNative());
1795}
1796JNI_TEST(NormalNative)
1797
1798// Methods annotated with @FastNative are considered "fast native"
1799// -- Check that the annotation lookup succeeds.
1800void Java_MyClassNatives_fastNative(JNIEnv*, jclass) {
1801 // Intentionally left empty.
1802}
1803
1804void JniCompilerTest::FastNativeImpl() {
1805 SetUpForTest(/* direct */ true,
1806 "fastNative",
1807 "()V",
1808 reinterpret_cast<void*>(&Java_MyClassNatives_fastNative));
1809
1810 ScopedObjectAccess soa(Thread::Current());
1811 ArtMethod* method = soa.DecodeMethod(jmethod_);
1812 ASSERT_TRUE(method != nullptr);
1813
1814 EXPECT_TRUE(method->IsAnnotatedWithFastNative());
1815}
1816JNI_TEST(FastNative)
1817
Ian Rogersb033c752011-07-20 12:22:35 -07001818} // namespace art