blob: e98e5724d021f756ed9167001844e390d0ee217d [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"
Brian Carlstrom578bbdc2011-07-21 14:07:47 -070034#include "runtime.h"
Ian Rogers00f7d0e2012-07-19 15:28:27 -070035#include "ScopedLocalRef.h"
36#include "scoped_thread_state_change.h"
Brian Carlstrom578bbdc2011-07-21 14:07:47 -070037#include "thread.h"
Ian Rogersb033c752011-07-20 12:22:35 -070038
Elliott Hughesb264f082012-04-06 17:10:10 -070039extern "C" JNIEXPORT jint JNICALL Java_MyClassNatives_bar(JNIEnv*, jobject, jint count) {
Brian Carlstromb9cc1ca2012-01-27 00:57:42 -080040 return count + 1;
41}
42
Elliott Hughesb264f082012-04-06 17:10:10 -070043extern "C" JNIEXPORT jint JNICALL Java_MyClassNatives_sbar(JNIEnv*, jclass, jint count) {
Ian Rogers1cefdbd2012-02-29 09:34:50 -080044 return count + 1;
45}
46
Ian Rogersb033c752011-07-20 12:22:35 -070047namespace art {
48
Brian Carlstroma1ce1fe2014-02-24 23:23:58 -080049class JniCompilerTest : public CommonCompilerTest {
Ian Rogersb033c752011-07-20 12:22:35 -070050 protected:
Andreas Gampe6e498692014-08-18 16:43:12 -070051 void SetUp() OVERRIDE {
52 CommonCompilerTest::SetUp();
53 check_generic_jni_ = false;
54 }
55
56 void SetCheckGenericJni(bool generic) {
57 check_generic_jni_ = generic;
58 }
59
Ian Rogers00f7d0e2012-07-19 15:28:27 -070060 void CompileForTest(jobject class_loader, bool direct,
Andreas Gampe6e498692014-08-18 16:43:12 -070061 const char* method_name, const char* method_sig) {
Ian Rogers00f7d0e2012-07-19 15:28:27 -070062 ScopedObjectAccess soa(Thread::Current());
Mathieu Chartiereb8167a2014-05-07 15:43:14 -070063 StackHandleScope<1> hs(soa.Self());
64 Handle<mirror::ClassLoader> loader(
65 hs.NewHandle(soa.Decode<mirror::ClassLoader*>(class_loader)));
Brian Carlstrom25c33252011-09-18 15:58:35 -070066 // Compile the native method before starting the runtime
Ian Rogers98379392014-02-24 16:53:16 -080067 mirror::Class* c = class_linker_->FindClass(soa.Self(), "LMyClassNatives;", loader);
Mathieu Chartiere401d142015-04-22 13:56:20 -070068 const auto pointer_size = class_linker_->GetImagePointerSize();
69 ArtMethod* method = direct ? c->FindDirectMethod(method_name, method_sig, pointer_size) :
70 c->FindVirtualMethod(method_name, method_sig, pointer_size);
Andreas Gampecf4035a2014-05-28 22:43:01 -070071 ASSERT_TRUE(method != nullptr) << method_name << " " << method_sig;
Andreas Gampe6e498692014-08-18 16:43:12 -070072 if (check_generic_jni_) {
Ian Rogers6f3dbba2014-10-14 17:41:57 -070073 method->SetEntryPointFromQuickCompiledCode(class_linker_->GetRuntimeQuickGenericJniStub());
Nicolas Geoffray54accbc2014-08-13 03:40:45 +010074 } else {
Ian Rogers6f3dbba2014-10-14 17:41:57 -070075 const void* code = method->GetEntryPointFromQuickCompiledCode();
76 if (code == nullptr || class_linker_->IsQuickGenericJniStub(code)) {
Nicolas Geoffray54accbc2014-08-13 03:40:45 +010077 CompileMethod(method);
78 ASSERT_TRUE(method->GetEntryPointFromQuickCompiledCode() != nullptr)
79 << method_name << " " << method_sig;
Nicolas Geoffray54accbc2014-08-13 03:40:45 +010080 }
Brian Carlstrom25c33252011-09-18 15:58:35 -070081 }
Brian Carlstrom25c33252011-09-18 15:58:35 -070082 }
83
Ian Rogers00f7d0e2012-07-19 15:28:27 -070084 void SetUpForTest(bool direct, const char* method_name, const char* method_sig,
Andreas Gampe6e498692014-08-18 16:43:12 -070085 void* native_fnptr) {
Ian Rogers00f7d0e2012-07-19 15:28:27 -070086 // Initialize class loader and compile method when runtime not started.
Brian Carlstrom2ce745c2013-07-17 17:44:30 -070087 if (!runtime_->IsStarted()) {
Ian Rogers00f7d0e2012-07-19 15:28:27 -070088 {
89 ScopedObjectAccess soa(Thread::Current());
90 class_loader_ = LoadDex("MyClassNatives");
91 }
Andreas Gampe6e498692014-08-18 16:43:12 -070092 CompileForTest(class_loader_, direct, method_name, method_sig);
Ian Rogers00f7d0e2012-07-19 15:28:27 -070093 // Start runtime.
94 Thread::Current()->TransitionFromSuspendedToRunnable();
Brian Carlstrombd86bcc2013-03-10 20:26:16 -070095 bool started = runtime_->Start();
96 CHECK(started);
Brian Carlstrom25c33252011-09-18 15:58:35 -070097 }
Ian Rogers00f7d0e2012-07-19 15:28:27 -070098 // JNI operations after runtime start.
Brian Carlstrom25c33252011-09-18 15:58:35 -070099 env_ = Thread::Current()->GetJniEnv();
Elliott Hughesb264f082012-04-06 17:10:10 -0700100 jklass_ = env_->FindClass("MyClassNatives");
Andreas Gampecf4035a2014-05-28 22:43:01 -0700101 ASSERT_TRUE(jklass_ != nullptr) << method_name << " " << method_sig;
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700102
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700103 if (direct) {
104 jmethod_ = env_->GetStaticMethodID(jklass_, method_name, method_sig);
105 } else {
106 jmethod_ = env_->GetMethodID(jklass_, method_name, method_sig);
107 }
Andreas Gampecf4035a2014-05-28 22:43:01 -0700108 ASSERT_TRUE(jmethod_ != nullptr) << method_name << " " << method_sig;
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700109
Andreas Gampecf4035a2014-05-28 22:43:01 -0700110 if (native_fnptr != nullptr) {
Elliott Hughesb25c3f62012-03-26 16:35:06 -0700111 JNINativeMethod methods[] = { { method_name, method_sig, native_fnptr } };
Brian Carlstromfc7120c2012-08-27 13:43:25 -0700112 ASSERT_EQ(JNI_OK, env_->RegisterNatives(jklass_, methods, 1))
113 << method_name << " " << method_sig;
Ian Rogersbdb03912011-09-14 00:55:44 -0700114 } else {
115 env_->UnregisterNatives(jklass_);
Shih-wei Liao31384c52011-09-06 15:27:45 -0700116 }
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700117
118 jmethodID constructor = env_->GetMethodID(jklass_, "<init>", "()V");
119 jobj_ = env_->NewObject(jklass_, constructor);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700120 ASSERT_TRUE(jobj_ != nullptr) << method_name << " " << method_sig;
Ian Rogersb033c752011-07-20 12:22:35 -0700121 }
122
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700123 public:
124 static jclass jklass_;
125 static jobject jobj_;
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700126 static jobject class_loader_;
127
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700128 protected:
Andreas Gampe6e498692014-08-18 16:43:12 -0700129 // We have to list the methods here so we can share them between default and generic JNI.
130 void CompileAndRunNoArgMethodImpl();
131 void CompileAndRunIntMethodThroughStubImpl();
132 void CompileAndRunStaticIntMethodThroughStubImpl();
133 void CompileAndRunIntMethodImpl();
134 void CompileAndRunIntIntMethodImpl();
135 void CompileAndRunLongLongMethodImpl();
136 void CompileAndRunDoubleDoubleMethodImpl();
137 void CompileAndRun_fooJJ_synchronizedImpl();
138 void CompileAndRunIntObjectObjectMethodImpl();
139 void CompileAndRunStaticIntIntMethodImpl();
140 void CompileAndRunStaticDoubleDoubleMethodImpl();
141 void RunStaticLogDoubleMethodImpl();
142 void RunStaticLogFloatMethodImpl();
143 void RunStaticReturnTrueImpl();
144 void RunStaticReturnFalseImpl();
145 void RunGenericStaticReturnIntImpl();
146 void CompileAndRunStaticIntObjectObjectMethodImpl();
147 void CompileAndRunStaticSynchronizedIntObjectObjectMethodImpl();
148 void ExceptionHandlingImpl();
149 void NativeStackTraceElementImpl();
150 void ReturnGlobalRefImpl();
151 void LocalReferenceTableClearingTestImpl();
152 void JavaLangSystemArrayCopyImpl();
153 void CompareAndSwapIntImpl();
154 void GetTextImpl();
155 void GetSinkPropertiesNativeImpl();
156 void UpcallReturnTypeChecking_InstanceImpl();
157 void UpcallReturnTypeChecking_StaticImpl();
158 void UpcallArgumentTypeChecking_InstanceImpl();
159 void UpcallArgumentTypeChecking_StaticImpl();
160 void CompileAndRunFloatFloatMethodImpl();
161 void CheckParameterAlignImpl();
162 void MaxParamNumberImpl();
163 void WithoutImplementationImpl();
Andreas Gampe48ee3562015-04-10 19:57:29 -0700164 void WithoutImplementationRefReturnImpl();
Andreas Gampe6e498692014-08-18 16:43:12 -0700165 void StackArgsIntsFirstImpl();
166 void StackArgsFloatsFirstImpl();
167 void StackArgsMixedImpl();
168
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700169 JNIEnv* env_;
170 jmethodID jmethod_;
Andreas Gampe6e498692014-08-18 16:43:12 -0700171 bool check_generic_jni_;
Ian Rogersb033c752011-07-20 12:22:35 -0700172};
173
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700174jclass JniCompilerTest::jklass_;
175jobject JniCompilerTest::jobj_;
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700176jobject JniCompilerTest::class_loader_;
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700177
Andreas Gampe6e498692014-08-18 16:43:12 -0700178#define JNI_TEST(TestName) \
179 TEST_F(JniCompilerTest, TestName ## Default) { \
180 TestName ## Impl(); \
181 } \
182 \
183 TEST_F(JniCompilerTest, TestName ## Generic) { \
184 TEST_DISABLED_FOR_MIPS(); \
185 SetCheckGenericJni(true); \
186 TestName ## Impl(); \
187 }
Andreas Gampecf4035a2014-05-28 22:43:01 -0700188
Elliott Hughesb264f082012-04-06 17:10:10 -0700189int gJava_MyClassNatives_foo_calls = 0;
190void Java_MyClassNatives_foo(JNIEnv* env, jobject thisObj) {
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700191 // 1 = thisObj
Ian Rogers50b35e22012-10-04 10:09:15 -0700192 EXPECT_EQ(kNative, Thread::Current()->GetState());
193 Locks::mutator_lock_->AssertNotHeld(Thread::Current());
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700194 EXPECT_EQ(Thread::Current()->GetJniEnv(), env);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700195 EXPECT_TRUE(thisObj != nullptr);
Ian Rogersa8cd9f42011-08-19 16:43:41 -0700196 EXPECT_TRUE(env->IsInstanceOf(thisObj, JniCompilerTest::jklass_));
Elliott Hughesb264f082012-04-06 17:10:10 -0700197 gJava_MyClassNatives_foo_calls++;
Ian Rogersef7d42f2014-01-06 12:55:46 -0800198 ScopedObjectAccess soa(Thread::Current());
199 EXPECT_EQ(1U, Thread::Current()->NumStackReferences());
Ian Rogersb033c752011-07-20 12:22:35 -0700200}
201
Andreas Gampe6e498692014-08-18 16:43:12 -0700202void JniCompilerTest::CompileAndRunNoArgMethodImpl() {
Ian Rogersef7d42f2014-01-06 12:55:46 -0800203 SetUpForTest(false, "foo", "()V", reinterpret_cast<void*>(&Java_MyClassNatives_foo));
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700204
Elliott Hughesb264f082012-04-06 17:10:10 -0700205 EXPECT_EQ(0, gJava_MyClassNatives_foo_calls);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700206 env_->CallNonvirtualVoidMethod(jobj_, jklass_, jmethod_);
Elliott Hughesb264f082012-04-06 17:10:10 -0700207 EXPECT_EQ(1, gJava_MyClassNatives_foo_calls);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700208 env_->CallNonvirtualVoidMethod(jobj_, jklass_, jmethod_);
Elliott Hughesb264f082012-04-06 17:10:10 -0700209 EXPECT_EQ(2, gJava_MyClassNatives_foo_calls);
Andreas Gampe6e498692014-08-18 16:43:12 -0700210
211 gJava_MyClassNatives_foo_calls = 0;
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700212}
213
Andreas Gampe6e498692014-08-18 16:43:12 -0700214JNI_TEST(CompileAndRunNoArgMethod)
215
216void JniCompilerTest::CompileAndRunIntMethodThroughStubImpl() {
Andreas Gampecf4035a2014-05-28 22:43:01 -0700217 SetUpForTest(false, "bar", "(I)I", nullptr);
218 // calling through stub will link with &Java_MyClassNatives_bar
Shih-wei Liao31384c52011-09-06 15:27:45 -0700219
Shih-wei Liao31384c52011-09-06 15:27:45 -0700220 std::string reason;
Ian Rogers68d8b422014-07-17 11:09:10 -0700221 ASSERT_TRUE(Runtime::Current()->GetJavaVM()->LoadNativeLibrary(env_, "", class_loader_, &reason))
222 << reason;
Shih-wei Liao31384c52011-09-06 15:27:45 -0700223
224 jint result = env_->CallNonvirtualIntMethod(jobj_, jklass_, jmethod_, 24);
225 EXPECT_EQ(25, result);
226}
227
Andreas Gampe6e498692014-08-18 16:43:12 -0700228JNI_TEST(CompileAndRunIntMethodThroughStub)
229
230void JniCompilerTest::CompileAndRunStaticIntMethodThroughStubImpl() {
Andreas Gampecf4035a2014-05-28 22:43:01 -0700231 SetUpForTest(true, "sbar", "(I)I", nullptr);
232 // calling through stub will link with &Java_MyClassNatives_sbar
Ian Rogers1cefdbd2012-02-29 09:34:50 -0800233
234 std::string reason;
Ian Rogers68d8b422014-07-17 11:09:10 -0700235 ASSERT_TRUE(Runtime::Current()->GetJavaVM()->LoadNativeLibrary(env_, "", class_loader_, &reason))
236 << reason;
Ian Rogers1cefdbd2012-02-29 09:34:50 -0800237
238 jint result = env_->CallStaticIntMethod(jklass_, jmethod_, 42);
239 EXPECT_EQ(43, result);
240}
241
Andreas Gampe6e498692014-08-18 16:43:12 -0700242JNI_TEST(CompileAndRunStaticIntMethodThroughStub)
243
Elliott Hughesb264f082012-04-06 17:10:10 -0700244int gJava_MyClassNatives_fooI_calls = 0;
245jint Java_MyClassNatives_fooI(JNIEnv* env, jobject thisObj, jint x) {
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700246 // 1 = thisObj
Ian Rogers50b35e22012-10-04 10:09:15 -0700247 EXPECT_EQ(kNative, Thread::Current()->GetState());
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700248 EXPECT_EQ(Thread::Current()->GetJniEnv(), env);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700249 EXPECT_TRUE(thisObj != nullptr);
Ian Rogersa8cd9f42011-08-19 16:43:41 -0700250 EXPECT_TRUE(env->IsInstanceOf(thisObj, JniCompilerTest::jklass_));
Elliott Hughesb264f082012-04-06 17:10:10 -0700251 gJava_MyClassNatives_fooI_calls++;
Ian Rogersef7d42f2014-01-06 12:55:46 -0800252 ScopedObjectAccess soa(Thread::Current());
253 EXPECT_EQ(1U, Thread::Current()->NumStackReferences());
Ian Rogersb033c752011-07-20 12:22:35 -0700254 return x;
255}
256
Andreas Gampe6e498692014-08-18 16:43:12 -0700257void JniCompilerTest::CompileAndRunIntMethodImpl() {
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700258 SetUpForTest(false, "fooI", "(I)I",
Elliott Hughesb264f082012-04-06 17:10:10 -0700259 reinterpret_cast<void*>(&Java_MyClassNatives_fooI));
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700260
Elliott Hughesb264f082012-04-06 17:10:10 -0700261 EXPECT_EQ(0, gJava_MyClassNatives_fooI_calls);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700262 jint result = env_->CallNonvirtualIntMethod(jobj_, jklass_, jmethod_, 42);
263 EXPECT_EQ(42, result);
Elliott Hughesb264f082012-04-06 17:10:10 -0700264 EXPECT_EQ(1, gJava_MyClassNatives_fooI_calls);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700265 result = env_->CallNonvirtualIntMethod(jobj_, jklass_, jmethod_, 0xCAFED00D);
266 EXPECT_EQ(static_cast<jint>(0xCAFED00D), result);
Elliott Hughesb264f082012-04-06 17:10:10 -0700267 EXPECT_EQ(2, gJava_MyClassNatives_fooI_calls);
Andreas Gampe6e498692014-08-18 16:43:12 -0700268
269 gJava_MyClassNatives_fooI_calls = 0;
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700270}
271
Andreas Gampe6e498692014-08-18 16:43:12 -0700272JNI_TEST(CompileAndRunIntMethod)
273
Elliott Hughesb264f082012-04-06 17:10:10 -0700274int gJava_MyClassNatives_fooII_calls = 0;
275jint Java_MyClassNatives_fooII(JNIEnv* env, jobject thisObj, jint x, jint y) {
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700276 // 1 = thisObj
Ian Rogers50b35e22012-10-04 10:09:15 -0700277 EXPECT_EQ(kNative, Thread::Current()->GetState());
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700278 EXPECT_EQ(Thread::Current()->GetJniEnv(), env);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700279 EXPECT_TRUE(thisObj != nullptr);
Ian Rogersa8cd9f42011-08-19 16:43:41 -0700280 EXPECT_TRUE(env->IsInstanceOf(thisObj, JniCompilerTest::jklass_));
Elliott Hughesb264f082012-04-06 17:10:10 -0700281 gJava_MyClassNatives_fooII_calls++;
Ian Rogersef7d42f2014-01-06 12:55:46 -0800282 ScopedObjectAccess soa(Thread::Current());
283 EXPECT_EQ(1U, Thread::Current()->NumStackReferences());
Ian Rogersb033c752011-07-20 12:22:35 -0700284 return x - y; // non-commutative operator
285}
286
Andreas Gampe6e498692014-08-18 16:43:12 -0700287void JniCompilerTest::CompileAndRunIntIntMethodImpl() {
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700288 SetUpForTest(false, "fooII", "(II)I",
Elliott Hughesb264f082012-04-06 17:10:10 -0700289 reinterpret_cast<void*>(&Java_MyClassNatives_fooII));
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700290
Elliott Hughesb264f082012-04-06 17:10:10 -0700291 EXPECT_EQ(0, gJava_MyClassNatives_fooII_calls);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700292 jint result = env_->CallNonvirtualIntMethod(jobj_, jklass_, jmethod_, 99, 10);
293 EXPECT_EQ(99 - 10, result);
Elliott Hughesb264f082012-04-06 17:10:10 -0700294 EXPECT_EQ(1, gJava_MyClassNatives_fooII_calls);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700295 result = env_->CallNonvirtualIntMethod(jobj_, jklass_, jmethod_, 0xCAFEBABE,
296 0xCAFED00D);
297 EXPECT_EQ(static_cast<jint>(0xCAFEBABE - 0xCAFED00D), result);
Elliott Hughesb264f082012-04-06 17:10:10 -0700298 EXPECT_EQ(2, gJava_MyClassNatives_fooII_calls);
Andreas Gampe6e498692014-08-18 16:43:12 -0700299
300 gJava_MyClassNatives_fooII_calls = 0;
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700301}
302
Andreas Gampe6e498692014-08-18 16:43:12 -0700303JNI_TEST(CompileAndRunIntIntMethod)
304
Elliott Hughesb264f082012-04-06 17:10:10 -0700305int gJava_MyClassNatives_fooJJ_calls = 0;
306jlong Java_MyClassNatives_fooJJ(JNIEnv* env, jobject thisObj, jlong x, jlong y) {
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700307 // 1 = thisObj
Ian Rogers50b35e22012-10-04 10:09:15 -0700308 EXPECT_EQ(kNative, Thread::Current()->GetState());
Ian Rogers9b269d22011-09-04 14:06:05 -0700309 EXPECT_EQ(Thread::Current()->GetJniEnv(), env);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700310 EXPECT_TRUE(thisObj != nullptr);
Ian Rogers9b269d22011-09-04 14:06:05 -0700311 EXPECT_TRUE(env->IsInstanceOf(thisObj, JniCompilerTest::jklass_));
Elliott Hughesb264f082012-04-06 17:10:10 -0700312 gJava_MyClassNatives_fooJJ_calls++;
Ian Rogersef7d42f2014-01-06 12:55:46 -0800313 ScopedObjectAccess soa(Thread::Current());
314 EXPECT_EQ(1U, Thread::Current()->NumStackReferences());
Ian Rogers9b269d22011-09-04 14:06:05 -0700315 return x - y; // non-commutative operator
316}
317
Andreas Gampe6e498692014-08-18 16:43:12 -0700318void JniCompilerTest::CompileAndRunLongLongMethodImpl() {
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700319 SetUpForTest(false, "fooJJ", "(JJ)J",
Elliott Hughesb264f082012-04-06 17:10:10 -0700320 reinterpret_cast<void*>(&Java_MyClassNatives_fooJJ));
Ian Rogers9b269d22011-09-04 14:06:05 -0700321
Elliott Hughesb264f082012-04-06 17:10:10 -0700322 EXPECT_EQ(0, gJava_MyClassNatives_fooJJ_calls);
Ian Rogers0f678472014-03-10 16:18:37 -0700323 jlong a = INT64_C(0x1234567890ABCDEF);
324 jlong b = INT64_C(0xFEDCBA0987654321);
Ian Rogers9b269d22011-09-04 14:06:05 -0700325 jlong result = env_->CallNonvirtualLongMethod(jobj_, jklass_, jmethod_, a, b);
326 EXPECT_EQ(a - b, result);
Elliott Hughesb264f082012-04-06 17:10:10 -0700327 EXPECT_EQ(1, gJava_MyClassNatives_fooJJ_calls);
Ian Rogers9b269d22011-09-04 14:06:05 -0700328 result = env_->CallNonvirtualLongMethod(jobj_, jklass_, jmethod_, b, a);
329 EXPECT_EQ(b - a, result);
Elliott Hughesb264f082012-04-06 17:10:10 -0700330 EXPECT_EQ(2, gJava_MyClassNatives_fooJJ_calls);
Andreas Gampe6e498692014-08-18 16:43:12 -0700331
332 gJava_MyClassNatives_fooJJ_calls = 0;
Ian Rogers9b269d22011-09-04 14:06:05 -0700333}
334
Andreas Gampe6e498692014-08-18 16:43:12 -0700335JNI_TEST(CompileAndRunLongLongMethod)
336
Elliott Hughesb264f082012-04-06 17:10:10 -0700337int gJava_MyClassNatives_fooDD_calls = 0;
338jdouble Java_MyClassNatives_fooDD(JNIEnv* env, jobject thisObj, jdouble x, jdouble y) {
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700339 // 1 = thisObj
Ian Rogers50b35e22012-10-04 10:09:15 -0700340 EXPECT_EQ(kNative, Thread::Current()->GetState());
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700341 EXPECT_EQ(Thread::Current()->GetJniEnv(), env);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700342 EXPECT_TRUE(thisObj != nullptr);
Ian Rogersa8cd9f42011-08-19 16:43:41 -0700343 EXPECT_TRUE(env->IsInstanceOf(thisObj, JniCompilerTest::jklass_));
Elliott Hughesb264f082012-04-06 17:10:10 -0700344 gJava_MyClassNatives_fooDD_calls++;
Ian Rogersef7d42f2014-01-06 12:55:46 -0800345 ScopedObjectAccess soa(Thread::Current());
346 EXPECT_EQ(1U, Thread::Current()->NumStackReferences());
Ian Rogersb033c752011-07-20 12:22:35 -0700347 return x - y; // non-commutative operator
348}
349
Andreas Gampe6e498692014-08-18 16:43:12 -0700350void JniCompilerTest::CompileAndRunDoubleDoubleMethodImpl() {
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700351 SetUpForTest(false, "fooDD", "(DD)D",
Elliott Hughesb264f082012-04-06 17:10:10 -0700352 reinterpret_cast<void*>(&Java_MyClassNatives_fooDD));
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700353
Elliott Hughesb264f082012-04-06 17:10:10 -0700354 EXPECT_EQ(0, gJava_MyClassNatives_fooDD_calls);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700355 jdouble result = env_->CallNonvirtualDoubleMethod(jobj_, jklass_, jmethod_,
356 99.0, 10.0);
Ian Rogers647b1a82014-10-10 11:02:11 -0700357 EXPECT_DOUBLE_EQ(99.0 - 10.0, result);
Elliott Hughesb264f082012-04-06 17:10:10 -0700358 EXPECT_EQ(1, gJava_MyClassNatives_fooDD_calls);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700359 jdouble a = 3.14159265358979323846;
360 jdouble b = 0.69314718055994530942;
361 result = env_->CallNonvirtualDoubleMethod(jobj_, jklass_, jmethod_, a, b);
Ian Rogers647b1a82014-10-10 11:02:11 -0700362 EXPECT_DOUBLE_EQ(a - b, result);
Elliott Hughesb264f082012-04-06 17:10:10 -0700363 EXPECT_EQ(2, gJava_MyClassNatives_fooDD_calls);
Andreas Gampe6e498692014-08-18 16:43:12 -0700364
365 gJava_MyClassNatives_fooDD_calls = 0;
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700366}
367
Elliott Hughes3e778f72012-05-21 15:29:52 -0700368int gJava_MyClassNatives_fooJJ_synchronized_calls = 0;
369jlong Java_MyClassNatives_fooJJ_synchronized(JNIEnv* env, jobject thisObj, jlong x, jlong y) {
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700370 // 1 = thisObj
Ian Rogers50b35e22012-10-04 10:09:15 -0700371 EXPECT_EQ(kNative, Thread::Current()->GetState());
Elliott Hughes3e778f72012-05-21 15:29:52 -0700372 EXPECT_EQ(Thread::Current()->GetJniEnv(), env);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700373 EXPECT_TRUE(thisObj != nullptr);
Elliott Hughes3e778f72012-05-21 15:29:52 -0700374 EXPECT_TRUE(env->IsInstanceOf(thisObj, JniCompilerTest::jklass_));
375 gJava_MyClassNatives_fooJJ_synchronized_calls++;
Ian Rogersef7d42f2014-01-06 12:55:46 -0800376 ScopedObjectAccess soa(Thread::Current());
377 EXPECT_EQ(1U, Thread::Current()->NumStackReferences());
Elliott Hughes3e778f72012-05-21 15:29:52 -0700378 return x | y;
379}
380
Andreas Gampe6e498692014-08-18 16:43:12 -0700381void JniCompilerTest::CompileAndRun_fooJJ_synchronizedImpl() {
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700382 SetUpForTest(false, "fooJJ_synchronized", "(JJ)J",
Elliott Hughes3e778f72012-05-21 15:29:52 -0700383 reinterpret_cast<void*>(&Java_MyClassNatives_fooJJ_synchronized));
384
385 EXPECT_EQ(0, gJava_MyClassNatives_fooJJ_synchronized_calls);
386 jlong a = 0x1000000020000000ULL;
387 jlong b = 0x00ff000000aa0000ULL;
388 jlong result = env_->CallNonvirtualLongMethod(jobj_, jklass_, jmethod_, a, b);
389 EXPECT_EQ(a | b, result);
390 EXPECT_EQ(1, gJava_MyClassNatives_fooJJ_synchronized_calls);
Andreas Gampe6e498692014-08-18 16:43:12 -0700391
392 gJava_MyClassNatives_fooJJ_synchronized_calls = 0;
Elliott Hughes3e778f72012-05-21 15:29:52 -0700393}
394
Andreas Gampe6e498692014-08-18 16:43:12 -0700395JNI_TEST(CompileAndRun_fooJJ_synchronized)
396
Elliott Hughesb264f082012-04-06 17:10:10 -0700397int gJava_MyClassNatives_fooIOO_calls = 0;
398jobject Java_MyClassNatives_fooIOO(JNIEnv* env, jobject thisObj, jint x, jobject y,
Ian Rogersb033c752011-07-20 12:22:35 -0700399 jobject z) {
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700400 // 3 = this + y + z
Ian Rogers50b35e22012-10-04 10:09:15 -0700401 EXPECT_EQ(kNative, Thread::Current()->GetState());
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700402 EXPECT_EQ(Thread::Current()->GetJniEnv(), env);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700403 EXPECT_TRUE(thisObj != nullptr);
Ian Rogersa8cd9f42011-08-19 16:43:41 -0700404 EXPECT_TRUE(env->IsInstanceOf(thisObj, JniCompilerTest::jklass_));
Elliott Hughesb264f082012-04-06 17:10:10 -0700405 gJava_MyClassNatives_fooIOO_calls++;
Ian Rogersef7d42f2014-01-06 12:55:46 -0800406 ScopedObjectAccess soa(Thread::Current());
Andreas Gampebf6b92a2014-03-05 16:11:04 -0800407 size_t null_args = (y == nullptr ? 1 : 0) + (z == nullptr ? 1 : 0);
408 EXPECT_TRUE(3U == Thread::Current()->NumStackReferences() ||
409 (3U - null_args) == Thread::Current()->NumStackReferences());
Ian Rogersb033c752011-07-20 12:22:35 -0700410 switch (x) {
411 case 1:
412 return y;
413 case 2:
414 return z;
415 default:
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700416 return thisObj;
Ian Rogersb033c752011-07-20 12:22:35 -0700417 }
418}
419
Andreas Gampe6e498692014-08-18 16:43:12 -0700420void JniCompilerTest::CompileAndRunIntObjectObjectMethodImpl() {
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700421 SetUpForTest(false, "fooIOO",
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700422 "(ILjava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;",
Elliott Hughesb264f082012-04-06 17:10:10 -0700423 reinterpret_cast<void*>(&Java_MyClassNatives_fooIOO));
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700424
Elliott Hughesb264f082012-04-06 17:10:10 -0700425 EXPECT_EQ(0, gJava_MyClassNatives_fooIOO_calls);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700426 jobject result = env_->CallNonvirtualObjectMethod(jobj_, jklass_, jmethod_, 0, nullptr, nullptr);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700427 EXPECT_TRUE(env_->IsSameObject(jobj_, result));
Elliott Hughesb264f082012-04-06 17:10:10 -0700428 EXPECT_EQ(1, gJava_MyClassNatives_fooIOO_calls);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700429
Andreas Gampecf4035a2014-05-28 22:43:01 -0700430 result = env_->CallNonvirtualObjectMethod(jobj_, jklass_, jmethod_, 0, nullptr, jklass_);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700431 EXPECT_TRUE(env_->IsSameObject(jobj_, result));
Elliott Hughesb264f082012-04-06 17:10:10 -0700432 EXPECT_EQ(2, gJava_MyClassNatives_fooIOO_calls);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700433 result = env_->CallNonvirtualObjectMethod(jobj_, jklass_, jmethod_, 1, nullptr, jklass_);
434 EXPECT_TRUE(env_->IsSameObject(nullptr, result));
Elliott Hughesb264f082012-04-06 17:10:10 -0700435 EXPECT_EQ(3, gJava_MyClassNatives_fooIOO_calls);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700436 result = env_->CallNonvirtualObjectMethod(jobj_, jklass_, jmethod_, 2, nullptr, jklass_);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700437 EXPECT_TRUE(env_->IsSameObject(jklass_, result));
Elliott Hughesb264f082012-04-06 17:10:10 -0700438 EXPECT_EQ(4, gJava_MyClassNatives_fooIOO_calls);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700439
Andreas Gampecf4035a2014-05-28 22:43:01 -0700440 result = env_->CallNonvirtualObjectMethod(jobj_, jklass_, jmethod_, 0, jklass_, nullptr);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700441 EXPECT_TRUE(env_->IsSameObject(jobj_, result));
Elliott Hughesb264f082012-04-06 17:10:10 -0700442 EXPECT_EQ(5, gJava_MyClassNatives_fooIOO_calls);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700443 result = env_->CallNonvirtualObjectMethod(jobj_, jklass_, jmethod_, 1, jklass_, nullptr);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700444 EXPECT_TRUE(env_->IsSameObject(jklass_, result));
Elliott Hughesb264f082012-04-06 17:10:10 -0700445 EXPECT_EQ(6, gJava_MyClassNatives_fooIOO_calls);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700446 result = env_->CallNonvirtualObjectMethod(jobj_, jklass_, jmethod_, 2, jklass_, nullptr);
447 EXPECT_TRUE(env_->IsSameObject(nullptr, result));
Elliott Hughesb264f082012-04-06 17:10:10 -0700448 EXPECT_EQ(7, gJava_MyClassNatives_fooIOO_calls);
Andreas Gampe6e498692014-08-18 16:43:12 -0700449
450 gJava_MyClassNatives_fooIOO_calls = 0;
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700451}
452
Andreas Gampe6e498692014-08-18 16:43:12 -0700453JNI_TEST(CompileAndRunIntObjectObjectMethod)
454
Elliott Hughesb264f082012-04-06 17:10:10 -0700455int gJava_MyClassNatives_fooSII_calls = 0;
456jint Java_MyClassNatives_fooSII(JNIEnv* env, jclass klass, jint x, jint y) {
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700457 // 1 = klass
Ian Rogers50b35e22012-10-04 10:09:15 -0700458 EXPECT_EQ(kNative, Thread::Current()->GetState());
Shih-wei Liao82da44b2011-09-01 00:38:04 -0700459 EXPECT_EQ(Thread::Current()->GetJniEnv(), env);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700460 EXPECT_TRUE(klass != nullptr);
Shih-wei Liao82da44b2011-09-01 00:38:04 -0700461 EXPECT_TRUE(env->IsInstanceOf(JniCompilerTest::jobj_, klass));
Elliott Hughesb264f082012-04-06 17:10:10 -0700462 gJava_MyClassNatives_fooSII_calls++;
Ian Rogersef7d42f2014-01-06 12:55:46 -0800463 ScopedObjectAccess soa(Thread::Current());
464 EXPECT_EQ(1U, Thread::Current()->NumStackReferences());
Shih-wei Liao82da44b2011-09-01 00:38:04 -0700465 return x + y;
466}
467
Andreas Gampe6e498692014-08-18 16:43:12 -0700468void JniCompilerTest::CompileAndRunStaticIntIntMethodImpl() {
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700469 SetUpForTest(true, "fooSII", "(II)I",
Elliott Hughesb264f082012-04-06 17:10:10 -0700470 reinterpret_cast<void*>(&Java_MyClassNatives_fooSII));
Shih-wei Liao82da44b2011-09-01 00:38:04 -0700471
Elliott Hughesb264f082012-04-06 17:10:10 -0700472 EXPECT_EQ(0, gJava_MyClassNatives_fooSII_calls);
Shih-wei Liao82da44b2011-09-01 00:38:04 -0700473 jint result = env_->CallStaticIntMethod(jklass_, jmethod_, 20, 30);
474 EXPECT_EQ(50, result);
Elliott Hughesb264f082012-04-06 17:10:10 -0700475 EXPECT_EQ(1, gJava_MyClassNatives_fooSII_calls);
Andreas Gampe6e498692014-08-18 16:43:12 -0700476
477 gJava_MyClassNatives_fooSII_calls = 0;
Shih-wei Liao82da44b2011-09-01 00:38:04 -0700478}
479
Andreas Gampe6e498692014-08-18 16:43:12 -0700480JNI_TEST(CompileAndRunStaticIntIntMethod)
481
Elliott Hughesb264f082012-04-06 17:10:10 -0700482int gJava_MyClassNatives_fooSDD_calls = 0;
483jdouble Java_MyClassNatives_fooSDD(JNIEnv* env, jclass klass, jdouble x, jdouble y) {
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700484 // 1 = klass
Ian Rogers50b35e22012-10-04 10:09:15 -0700485 EXPECT_EQ(kNative, Thread::Current()->GetState());
Ian Rogers7a99c112011-09-07 12:48:27 -0700486 EXPECT_EQ(Thread::Current()->GetJniEnv(), env);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700487 EXPECT_TRUE(klass != nullptr);
Ian Rogers7a99c112011-09-07 12:48:27 -0700488 EXPECT_TRUE(env->IsInstanceOf(JniCompilerTest::jobj_, klass));
Elliott Hughesb264f082012-04-06 17:10:10 -0700489 gJava_MyClassNatives_fooSDD_calls++;
Ian Rogersef7d42f2014-01-06 12:55:46 -0800490 ScopedObjectAccess soa(Thread::Current());
491 EXPECT_EQ(1U, Thread::Current()->NumStackReferences());
Ian Rogers7a99c112011-09-07 12:48:27 -0700492 return x - y; // non-commutative operator
493}
494
Andreas Gampe6e498692014-08-18 16:43:12 -0700495void JniCompilerTest::CompileAndRunStaticDoubleDoubleMethodImpl() {
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700496 SetUpForTest(true, "fooSDD", "(DD)D",
Elliott Hughesb264f082012-04-06 17:10:10 -0700497 reinterpret_cast<void*>(&Java_MyClassNatives_fooSDD));
Ian Rogers7a99c112011-09-07 12:48:27 -0700498
Elliott Hughesb264f082012-04-06 17:10:10 -0700499 EXPECT_EQ(0, gJava_MyClassNatives_fooSDD_calls);
Ian Rogers7a99c112011-09-07 12:48:27 -0700500 jdouble result = env_->CallStaticDoubleMethod(jklass_, jmethod_, 99.0, 10.0);
Ian Rogers647b1a82014-10-10 11:02:11 -0700501 EXPECT_DOUBLE_EQ(99.0 - 10.0, result);
Elliott Hughesb264f082012-04-06 17:10:10 -0700502 EXPECT_EQ(1, gJava_MyClassNatives_fooSDD_calls);
Ian Rogers7a99c112011-09-07 12:48:27 -0700503 jdouble a = 3.14159265358979323846;
504 jdouble b = 0.69314718055994530942;
505 result = env_->CallStaticDoubleMethod(jklass_, jmethod_, a, b);
Ian Rogers647b1a82014-10-10 11:02:11 -0700506 EXPECT_DOUBLE_EQ(a - b, result);
507 EXPECT_DOUBLE_EQ(2, gJava_MyClassNatives_fooSDD_calls);
Andreas Gampe6e498692014-08-18 16:43:12 -0700508
509 gJava_MyClassNatives_fooSDD_calls = 0;
Ian Rogers7a99c112011-09-07 12:48:27 -0700510}
511
Andreas Gampe6e498692014-08-18 16:43:12 -0700512JNI_TEST(CompileAndRunStaticDoubleDoubleMethod)
513
Nicolas Geoffray54accbc2014-08-13 03:40:45 +0100514// The x86 generic JNI code had a bug where it assumed a floating
515// point return value would be in xmm0. We use log, to somehow ensure
516// the compiler will use the floating point stack.
517
Ian Rogers6a3c1fc2014-10-31 00:33:20 -0700518jdouble Java_MyClassNatives_logD(JNIEnv*, jclass, jdouble x) {
Nicolas Geoffray54accbc2014-08-13 03:40:45 +0100519 return log(x);
520}
521
Andreas Gampe6e498692014-08-18 16:43:12 -0700522void JniCompilerTest::RunStaticLogDoubleMethodImpl() {
Andreas Gampe6e498692014-08-18 16:43:12 -0700523 SetUpForTest(true, "logD", "(D)D", reinterpret_cast<void*>(&Java_MyClassNatives_logD));
Nicolas Geoffray54accbc2014-08-13 03:40:45 +0100524
525 jdouble result = env_->CallStaticDoubleMethod(jklass_, jmethod_, 2.0);
Ian Rogers647b1a82014-10-10 11:02:11 -0700526 EXPECT_DOUBLE_EQ(log(2.0), result);
Nicolas Geoffray54accbc2014-08-13 03:40:45 +0100527}
528
Andreas Gampe6e498692014-08-18 16:43:12 -0700529JNI_TEST(RunStaticLogDoubleMethod)
530
Ian Rogers6a3c1fc2014-10-31 00:33:20 -0700531jfloat Java_MyClassNatives_logF(JNIEnv*, jclass, jfloat x) {
Nicolas Geoffray54accbc2014-08-13 03:40:45 +0100532 return logf(x);
533}
534
Andreas Gampe6e498692014-08-18 16:43:12 -0700535void JniCompilerTest::RunStaticLogFloatMethodImpl() {
Andreas Gampe6e498692014-08-18 16:43:12 -0700536 SetUpForTest(true, "logF", "(F)F", reinterpret_cast<void*>(&Java_MyClassNatives_logF));
Nicolas Geoffray54accbc2014-08-13 03:40:45 +0100537
538 jfloat result = env_->CallStaticFloatMethod(jklass_, jmethod_, 2.0);
Ian Rogers647b1a82014-10-10 11:02:11 -0700539 EXPECT_FLOAT_EQ(logf(2.0), result);
Nicolas Geoffray54accbc2014-08-13 03:40:45 +0100540}
541
Andreas Gampe6e498692014-08-18 16:43:12 -0700542JNI_TEST(RunStaticLogFloatMethod)
543
Ian Rogers6a3c1fc2014-10-31 00:33:20 -0700544jboolean Java_MyClassNatives_returnTrue(JNIEnv*, jclass) {
Nicolas Geoffray54accbc2014-08-13 03:40:45 +0100545 return JNI_TRUE;
546}
547
Ian Rogers6a3c1fc2014-10-31 00:33:20 -0700548jboolean Java_MyClassNatives_returnFalse(JNIEnv*, jclass) {
Nicolas Geoffray54accbc2014-08-13 03:40:45 +0100549 return JNI_FALSE;
550}
551
Ian Rogers6a3c1fc2014-10-31 00:33:20 -0700552jint Java_MyClassNatives_returnInt(JNIEnv*, jclass) {
Nicolas Geoffray54accbc2014-08-13 03:40:45 +0100553 return 42;
554}
555
Andreas Gampe6e498692014-08-18 16:43:12 -0700556void JniCompilerTest::RunStaticReturnTrueImpl() {
Andreas Gampe6e498692014-08-18 16:43:12 -0700557 SetUpForTest(true, "returnTrue", "()Z", reinterpret_cast<void*>(&Java_MyClassNatives_returnTrue));
Nicolas Geoffray54accbc2014-08-13 03:40:45 +0100558
559 jboolean result = env_->CallStaticBooleanMethod(jklass_, jmethod_);
560 EXPECT_TRUE(result);
561}
562
Andreas Gampe6e498692014-08-18 16:43:12 -0700563JNI_TEST(RunStaticReturnTrue)
564
565void JniCompilerTest::RunStaticReturnFalseImpl() {
Nicolas Geoffray54accbc2014-08-13 03:40:45 +0100566 SetUpForTest(true, "returnFalse", "()Z",
Andreas Gampe6e498692014-08-18 16:43:12 -0700567 reinterpret_cast<void*>(&Java_MyClassNatives_returnFalse));
Nicolas Geoffray54accbc2014-08-13 03:40:45 +0100568
569 jboolean result = env_->CallStaticBooleanMethod(jklass_, jmethod_);
570 EXPECT_FALSE(result);
571}
572
Andreas Gampe6e498692014-08-18 16:43:12 -0700573JNI_TEST(RunStaticReturnFalse)
574
575void JniCompilerTest::RunGenericStaticReturnIntImpl() {
Andreas Gampe6e498692014-08-18 16:43:12 -0700576 SetUpForTest(true, "returnInt", "()I", reinterpret_cast<void*>(&Java_MyClassNatives_returnInt));
Nicolas Geoffray54accbc2014-08-13 03:40:45 +0100577
578 jint result = env_->CallStaticIntMethod(jklass_, jmethod_);
579 EXPECT_EQ(42, result);
580}
581
Andreas Gampe6e498692014-08-18 16:43:12 -0700582JNI_TEST(RunGenericStaticReturnInt)
583
Elliott Hughesb264f082012-04-06 17:10:10 -0700584int gJava_MyClassNatives_fooSIOO_calls = 0;
585jobject Java_MyClassNatives_fooSIOO(JNIEnv* env, jclass klass, jint x, jobject y,
Ian Rogersb033c752011-07-20 12:22:35 -0700586 jobject z) {
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700587 // 3 = klass + y + z
Ian Rogers50b35e22012-10-04 10:09:15 -0700588 EXPECT_EQ(kNative, Thread::Current()->GetState());
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700589 EXPECT_EQ(Thread::Current()->GetJniEnv(), env);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700590 EXPECT_TRUE(klass != nullptr);
Ian Rogersa8cd9f42011-08-19 16:43:41 -0700591 EXPECT_TRUE(env->IsInstanceOf(JniCompilerTest::jobj_, klass));
Elliott Hughesb264f082012-04-06 17:10:10 -0700592 gJava_MyClassNatives_fooSIOO_calls++;
Ian Rogersef7d42f2014-01-06 12:55:46 -0800593 ScopedObjectAccess soa(Thread::Current());
Andreas Gampebf6b92a2014-03-05 16:11:04 -0800594 size_t null_args = (y == nullptr ? 1 : 0) + (z == nullptr ? 1 : 0);
595 EXPECT_TRUE(3U == Thread::Current()->NumStackReferences() ||
596 (3U - null_args) == Thread::Current()->NumStackReferences());
Ian Rogersb033c752011-07-20 12:22:35 -0700597 switch (x) {
598 case 1:
599 return y;
600 case 2:
601 return z;
602 default:
603 return klass;
604 }
605}
606
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700607
Andreas Gampe6e498692014-08-18 16:43:12 -0700608void JniCompilerTest::CompileAndRunStaticIntObjectObjectMethodImpl() {
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700609 SetUpForTest(true, "fooSIOO",
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700610 "(ILjava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;",
Elliott Hughesb264f082012-04-06 17:10:10 -0700611 reinterpret_cast<void*>(&Java_MyClassNatives_fooSIOO));
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700612
Elliott Hughesb264f082012-04-06 17:10:10 -0700613 EXPECT_EQ(0, gJava_MyClassNatives_fooSIOO_calls);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700614 jobject result = env_->CallStaticObjectMethod(jklass_, jmethod_, 0, nullptr, nullptr);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700615 EXPECT_TRUE(env_->IsSameObject(jklass_, result));
Elliott Hughesb264f082012-04-06 17:10:10 -0700616 EXPECT_EQ(1, gJava_MyClassNatives_fooSIOO_calls);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700617
Andreas Gampecf4035a2014-05-28 22:43:01 -0700618 result = env_->CallStaticObjectMethod(jklass_, jmethod_, 0, nullptr, jobj_);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700619 EXPECT_TRUE(env_->IsSameObject(jklass_, result));
Elliott Hughesb264f082012-04-06 17:10:10 -0700620 EXPECT_EQ(2, gJava_MyClassNatives_fooSIOO_calls);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700621 result = env_->CallStaticObjectMethod(jklass_, jmethod_, 1, nullptr, jobj_);
622 EXPECT_TRUE(env_->IsSameObject(nullptr, result));
Elliott Hughesb264f082012-04-06 17:10:10 -0700623 EXPECT_EQ(3, gJava_MyClassNatives_fooSIOO_calls);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700624 result = env_->CallStaticObjectMethod(jklass_, jmethod_, 2, nullptr, jobj_);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700625 EXPECT_TRUE(env_->IsSameObject(jobj_, result));
Elliott Hughesb264f082012-04-06 17:10:10 -0700626 EXPECT_EQ(4, gJava_MyClassNatives_fooSIOO_calls);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700627
Andreas Gampecf4035a2014-05-28 22:43:01 -0700628 result = env_->CallStaticObjectMethod(jklass_, jmethod_, 0, jobj_, nullptr);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700629 EXPECT_TRUE(env_->IsSameObject(jklass_, result));
Elliott Hughesb264f082012-04-06 17:10:10 -0700630 EXPECT_EQ(5, gJava_MyClassNatives_fooSIOO_calls);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700631 result = env_->CallStaticObjectMethod(jklass_, jmethod_, 1, jobj_, nullptr);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700632 EXPECT_TRUE(env_->IsSameObject(jobj_, result));
Elliott Hughesb264f082012-04-06 17:10:10 -0700633 EXPECT_EQ(6, gJava_MyClassNatives_fooSIOO_calls);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700634 result = env_->CallStaticObjectMethod(jklass_, jmethod_, 2, jobj_, nullptr);
635 EXPECT_TRUE(env_->IsSameObject(nullptr, result));
Elliott Hughesb264f082012-04-06 17:10:10 -0700636 EXPECT_EQ(7, gJava_MyClassNatives_fooSIOO_calls);
Andreas Gampe6e498692014-08-18 16:43:12 -0700637
638 gJava_MyClassNatives_fooSIOO_calls = 0;
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700639}
640
Andreas Gampe6e498692014-08-18 16:43:12 -0700641JNI_TEST(CompileAndRunStaticIntObjectObjectMethod)
642
Elliott Hughesb264f082012-04-06 17:10:10 -0700643int gJava_MyClassNatives_fooSSIOO_calls = 0;
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700644jobject Java_MyClassNatives_fooSSIOO(JNIEnv* env, jclass klass, jint x, jobject y, jobject z) {
645 // 3 = klass + y + z
Ian Rogers50b35e22012-10-04 10:09:15 -0700646 EXPECT_EQ(kNative, Thread::Current()->GetState());
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700647 EXPECT_EQ(Thread::Current()->GetJniEnv(), env);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700648 EXPECT_TRUE(klass != nullptr);
Ian Rogersa8cd9f42011-08-19 16:43:41 -0700649 EXPECT_TRUE(env->IsInstanceOf(JniCompilerTest::jobj_, klass));
Elliott Hughesb264f082012-04-06 17:10:10 -0700650 gJava_MyClassNatives_fooSSIOO_calls++;
Ian Rogersef7d42f2014-01-06 12:55:46 -0800651 ScopedObjectAccess soa(Thread::Current());
Andreas Gampebf6b92a2014-03-05 16:11:04 -0800652 size_t null_args = (y == nullptr ? 1 : 0) + (z == nullptr ? 1 : 0);
653 EXPECT_TRUE(3U == Thread::Current()->NumStackReferences() ||
654 (3U - null_args) == Thread::Current()->NumStackReferences());
Ian Rogersdf20fe02011-07-20 20:34:16 -0700655 switch (x) {
656 case 1:
657 return y;
658 case 2:
659 return z;
660 default:
661 return klass;
662 }
663}
664
Andreas Gampe6e498692014-08-18 16:43:12 -0700665void JniCompilerTest::CompileAndRunStaticSynchronizedIntObjectObjectMethodImpl() {
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700666 SetUpForTest(true, "fooSSIOO",
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700667 "(ILjava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;",
Elliott Hughesb264f082012-04-06 17:10:10 -0700668 reinterpret_cast<void*>(&Java_MyClassNatives_fooSSIOO));
Carl Shapiro419ec7b2011-08-03 14:48:33 -0700669
Elliott Hughesb264f082012-04-06 17:10:10 -0700670 EXPECT_EQ(0, gJava_MyClassNatives_fooSSIOO_calls);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700671 jobject result = env_->CallStaticObjectMethod(jklass_, jmethod_, 0, nullptr, nullptr);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700672 EXPECT_TRUE(env_->IsSameObject(jklass_, result));
Elliott Hughesb264f082012-04-06 17:10:10 -0700673 EXPECT_EQ(1, gJava_MyClassNatives_fooSSIOO_calls);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700674
Andreas Gampecf4035a2014-05-28 22:43:01 -0700675 result = env_->CallStaticObjectMethod(jklass_, jmethod_, 0, nullptr, jobj_);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700676 EXPECT_TRUE(env_->IsSameObject(jklass_, result));
Elliott Hughesb264f082012-04-06 17:10:10 -0700677 EXPECT_EQ(2, gJava_MyClassNatives_fooSSIOO_calls);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700678 result = env_->CallStaticObjectMethod(jklass_, jmethod_, 1, nullptr, jobj_);
679 EXPECT_TRUE(env_->IsSameObject(nullptr, result));
Elliott Hughesb264f082012-04-06 17:10:10 -0700680 EXPECT_EQ(3, gJava_MyClassNatives_fooSSIOO_calls);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700681 result = env_->CallStaticObjectMethod(jklass_, jmethod_, 2, nullptr, jobj_);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700682 EXPECT_TRUE(env_->IsSameObject(jobj_, result));
Elliott Hughesb264f082012-04-06 17:10:10 -0700683 EXPECT_EQ(4, gJava_MyClassNatives_fooSSIOO_calls);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700684
Andreas Gampecf4035a2014-05-28 22:43:01 -0700685 result = env_->CallStaticObjectMethod(jklass_, jmethod_, 0, jobj_, nullptr);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700686 EXPECT_TRUE(env_->IsSameObject(jklass_, result));
Elliott Hughesb264f082012-04-06 17:10:10 -0700687 EXPECT_EQ(5, gJava_MyClassNatives_fooSSIOO_calls);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700688 result = env_->CallStaticObjectMethod(jklass_, jmethod_, 1, jobj_, nullptr);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700689 EXPECT_TRUE(env_->IsSameObject(jobj_, result));
Elliott Hughesb264f082012-04-06 17:10:10 -0700690 EXPECT_EQ(6, gJava_MyClassNatives_fooSSIOO_calls);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700691 result = env_->CallStaticObjectMethod(jklass_, jmethod_, 2, jobj_, nullptr);
692 EXPECT_TRUE(env_->IsSameObject(nullptr, result));
Elliott Hughesb264f082012-04-06 17:10:10 -0700693 EXPECT_EQ(7, gJava_MyClassNatives_fooSSIOO_calls);
Andreas Gampe6e498692014-08-18 16:43:12 -0700694
695 gJava_MyClassNatives_fooSSIOO_calls = 0;
Ian Rogersdf20fe02011-07-20 20:34:16 -0700696}
697
Andreas Gampe6e498692014-08-18 16:43:12 -0700698JNI_TEST(CompileAndRunStaticSynchronizedIntObjectObjectMethod)
699
Elliott Hughesb264f082012-04-06 17:10:10 -0700700void Java_MyClassNatives_throwException(JNIEnv* env, jobject) {
Elliott Hughesa2501992011-08-26 19:39:54 -0700701 jclass c = env->FindClass("java/lang/RuntimeException");
702 env->ThrowNew(c, "hello");
703}
Ian Rogers45a76cb2011-07-21 22:00:15 -0700704
Andreas Gampe6e498692014-08-18 16:43:12 -0700705void JniCompilerTest::ExceptionHandlingImpl() {
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700706 {
707 ASSERT_FALSE(runtime_->IsStarted());
708 ScopedObjectAccess soa(Thread::Current());
709 class_loader_ = LoadDex("MyClassNatives");
Brian Carlstrom40381fb2011-10-19 14:13:40 -0700710
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700711 // all compilation needs to happen before Runtime::Start
712 CompileForTest(class_loader_, false, "foo", "()V");
713 CompileForTest(class_loader_, false, "throwException", "()V");
714 CompileForTest(class_loader_, false, "foo", "()V");
715 }
716 // Start runtime to avoid re-initialization in SetupForTest.
717 Thread::Current()->TransitionFromSuspendedToRunnable();
Brian Carlstrombd86bcc2013-03-10 20:26:16 -0700718 bool started = runtime_->Start();
719 CHECK(started);
Brian Carlstrom25c33252011-09-18 15:58:35 -0700720
Elliott Hughesb264f082012-04-06 17:10:10 -0700721 gJava_MyClassNatives_foo_calls = 0;
Elliott Hughesa2501992011-08-26 19:39:54 -0700722
Ian Rogers67375ac2011-09-14 00:55:44 -0700723 // Check a single call of a JNI method is ok
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700724 SetUpForTest(false, "foo", "()V", reinterpret_cast<void*>(&Java_MyClassNatives_foo));
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700725 env_->CallNonvirtualVoidMethod(jobj_, jklass_, jmethod_);
Elliott Hughesb264f082012-04-06 17:10:10 -0700726 EXPECT_EQ(1, gJava_MyClassNatives_foo_calls);
Ian Rogers67375ac2011-09-14 00:55:44 -0700727 EXPECT_FALSE(Thread::Current()->IsExceptionPending());
Elliott Hughesa2501992011-08-26 19:39:54 -0700728
Ian Rogers67375ac2011-09-14 00:55:44 -0700729 // Get class for exception we expect to be thrown
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700730 ScopedLocalRef<jclass> jlre(env_, env_->FindClass("java/lang/RuntimeException"));
731 SetUpForTest(false, "throwException", "()V",
Elliott Hughesb264f082012-04-06 17:10:10 -0700732 reinterpret_cast<void*>(&Java_MyClassNatives_throwException));
733 // Call Java_MyClassNatives_throwException (JNI method that throws exception)
Elliott Hughesa2501992011-08-26 19:39:54 -0700734 env_->CallNonvirtualVoidMethod(jobj_, jklass_, jmethod_);
Elliott Hughesb264f082012-04-06 17:10:10 -0700735 EXPECT_EQ(1, gJava_MyClassNatives_foo_calls);
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700736 EXPECT_TRUE(env_->ExceptionCheck() == JNI_TRUE);
737 ScopedLocalRef<jthrowable> exception(env_, env_->ExceptionOccurred());
738 env_->ExceptionClear();
739 EXPECT_TRUE(env_->IsInstanceOf(exception.get(), jlre.get()));
Elliott Hughesa2501992011-08-26 19:39:54 -0700740
Ian Rogers67375ac2011-09-14 00:55:44 -0700741 // Check a single call of a JNI method is ok
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700742 SetUpForTest(false, "foo", "()V", reinterpret_cast<void*>(&Java_MyClassNatives_foo));
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700743 env_->CallNonvirtualVoidMethod(jobj_, jklass_, jmethod_);
Elliott Hughesb264f082012-04-06 17:10:10 -0700744 EXPECT_EQ(2, gJava_MyClassNatives_foo_calls);
Andreas Gampe6e498692014-08-18 16:43:12 -0700745
746 gJava_MyClassNatives_foo_calls = 0;
Ian Rogers45a76cb2011-07-21 22:00:15 -0700747}
748
Andreas Gampe6e498692014-08-18 16:43:12 -0700749JNI_TEST(ExceptionHandling)
750
Elliott Hughesb264f082012-04-06 17:10:10 -0700751jint Java_MyClassNatives_nativeUpCall(JNIEnv* env, jobject thisObj, jint i) {
Shih-wei Liaoff0f9be2011-08-29 15:43:53 -0700752 if (i <= 0) {
Andreas Gampecf4035a2014-05-28 22:43:01 -0700753 // We want to check raw Object* / Array* below
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700754 ScopedObjectAccess soa(env);
Ian Rogersaaa20802011-09-11 21:47:37 -0700755
756 // Build stack trace
Sebastien Hertzee1d79a2014-02-21 15:46:30 +0100757 jobject internal = Thread::Current()->CreateInternalStackTrace<false>(soa);
Ian Rogers53b8b092014-03-13 23:45:53 -0700758 jobjectArray ste_array = Thread::InternalStackTraceToStackTraceElementArray(soa, internal);
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800759 mirror::ObjectArray<mirror::StackTraceElement>* trace_array =
760 soa.Decode<mirror::ObjectArray<mirror::StackTraceElement>*>(ste_array);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700761 EXPECT_TRUE(trace_array != nullptr);
Shih-wei Liaoff0f9be2011-08-29 15:43:53 -0700762 EXPECT_EQ(11, trace_array->GetLength());
763
Ian Rogersaaa20802011-09-11 21:47:37 -0700764 // Check stack trace entries have expected values
Andreas Gampe277ccbd2014-11-03 21:36:10 -0800765 for (int32_t j = 0; j < trace_array->GetLength(); ++j) {
766 EXPECT_EQ(-2, trace_array->Get(j)->GetLineNumber());
767 mirror::StackTraceElement* ste = trace_array->Get(j);
Ian Rogersaaa20802011-09-11 21:47:37 -0700768 EXPECT_STREQ("MyClassNatives.java", ste->GetFileName()->ToModifiedUtf8().c_str());
Elliott Hughesb264f082012-04-06 17:10:10 -0700769 EXPECT_STREQ("MyClassNatives", ste->GetDeclaringClass()->ToModifiedUtf8().c_str());
Ian Rogersaaa20802011-09-11 21:47:37 -0700770 EXPECT_STREQ("fooI", ste->GetMethodName()->ToModifiedUtf8().c_str());
Shih-wei Liaoff0f9be2011-08-29 15:43:53 -0700771 }
Ian Rogersaaa20802011-09-11 21:47:37 -0700772
773 // end recursion
Shih-wei Liaoff0f9be2011-08-29 15:43:53 -0700774 return 0;
775 } else {
Elliott Hughesb264f082012-04-06 17:10:10 -0700776 jclass jklass = env->FindClass("MyClassNatives");
Andreas Gampecf4035a2014-05-28 22:43:01 -0700777 EXPECT_TRUE(jklass != nullptr);
Shih-wei Liaoff0f9be2011-08-29 15:43:53 -0700778 jmethodID jmethod = env->GetMethodID(jklass, "fooI", "(I)I");
Andreas Gampecf4035a2014-05-28 22:43:01 -0700779 EXPECT_TRUE(jmethod != nullptr);
Shih-wei Liaoff0f9be2011-08-29 15:43:53 -0700780
Ian Rogersaaa20802011-09-11 21:47:37 -0700781 // Recurse with i - 1
Shih-wei Liaoff0f9be2011-08-29 15:43:53 -0700782 jint result = env->CallNonvirtualIntMethod(thisObj, jklass, jmethod, i - 1);
Ian Rogersaaa20802011-09-11 21:47:37 -0700783
784 // Return sum of all depths
Shih-wei Liaoff0f9be2011-08-29 15:43:53 -0700785 return i + result;
786 }
787}
788
Andreas Gampe6e498692014-08-18 16:43:12 -0700789void JniCompilerTest::NativeStackTraceElementImpl() {
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700790 SetUpForTest(false, "fooI", "(I)I",
Elliott Hughesb264f082012-04-06 17:10:10 -0700791 reinterpret_cast<void*>(&Java_MyClassNatives_nativeUpCall));
Shih-wei Liaoff0f9be2011-08-29 15:43:53 -0700792 jint result = env_->CallNonvirtualIntMethod(jobj_, jklass_, jmethod_, 10);
Ian Rogersaaa20802011-09-11 21:47:37 -0700793 EXPECT_EQ(10+9+8+7+6+5+4+3+2+1, result);
Shih-wei Liaoff0f9be2011-08-29 15:43:53 -0700794}
795
Andreas Gampe6e498692014-08-18 16:43:12 -0700796JNI_TEST(NativeStackTraceElement)
797
Elliott Hughesb264f082012-04-06 17:10:10 -0700798jobject Java_MyClassNatives_fooO(JNIEnv* env, jobject, jobject x) {
Shih-wei Liao558788e2011-09-01 02:39:11 -0700799 return env->NewGlobalRef(x);
800}
801
Andreas Gampe6e498692014-08-18 16:43:12 -0700802void JniCompilerTest::ReturnGlobalRefImpl() {
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700803 SetUpForTest(false, "fooO", "(Ljava/lang/Object;)Ljava/lang/Object;",
Elliott Hughesb264f082012-04-06 17:10:10 -0700804 reinterpret_cast<void*>(&Java_MyClassNatives_fooO));
Shih-wei Liao558788e2011-09-01 02:39:11 -0700805 jobject result = env_->CallNonvirtualObjectMethod(jobj_, jklass_, jmethod_, jobj_);
806 EXPECT_EQ(JNILocalRefType, env_->GetObjectRefType(result));
807 EXPECT_TRUE(env_->IsSameObject(result, jobj_));
808}
809
Andreas Gampe6e498692014-08-18 16:43:12 -0700810JNI_TEST(ReturnGlobalRef)
811
Ian Rogersdc51b792011-09-22 20:41:37 -0700812jint local_ref_test(JNIEnv* env, jobject thisObj, jint x) {
813 // Add 10 local references
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700814 ScopedObjectAccess soa(env);
Ian Rogers5a7a74a2011-09-26 16:32:29 -0700815 for (int i = 0; i < 10; i++) {
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800816 soa.AddLocalReference<jobject>(soa.Decode<mirror::Object*>(thisObj));
Ian Rogersdc51b792011-09-22 20:41:37 -0700817 }
818 return x+1;
819}
820
Andreas Gampe6e498692014-08-18 16:43:12 -0700821void JniCompilerTest::LocalReferenceTableClearingTestImpl() {
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700822 SetUpForTest(false, "fooI", "(I)I", reinterpret_cast<void*>(&local_ref_test));
Ian Rogersdc51b792011-09-22 20:41:37 -0700823 // 1000 invocations of a method that adds 10 local references
Elliott Hughesb25c3f62012-03-26 16:35:06 -0700824 for (int i = 0; i < 1000; i++) {
Ian Rogersdc51b792011-09-22 20:41:37 -0700825 jint result = env_->CallIntMethod(jobj_, jmethod_, i);
826 EXPECT_TRUE(result == i + 1);
827 }
828}
829
Andreas Gampe6e498692014-08-18 16:43:12 -0700830JNI_TEST(LocalReferenceTableClearingTest)
831
Ian Rogersb9231c82011-09-05 22:13:19 -0700832void my_arraycopy(JNIEnv* env, jclass klass, jobject src, jint src_pos, jobject dst, jint dst_pos, jint length) {
833 EXPECT_TRUE(env->IsSameObject(JniCompilerTest::jklass_, klass));
834 EXPECT_TRUE(env->IsSameObject(JniCompilerTest::jklass_, dst));
Ian Rogers82f3e092011-09-05 22:54:45 -0700835 EXPECT_TRUE(env->IsSameObject(JniCompilerTest::jobj_, src));
Ian Rogersb9231c82011-09-05 22:13:19 -0700836 EXPECT_EQ(1234, src_pos);
837 EXPECT_EQ(5678, dst_pos);
838 EXPECT_EQ(9876, length);
839}
840
Andreas Gampe6e498692014-08-18 16:43:12 -0700841void JniCompilerTest::JavaLangSystemArrayCopyImpl() {
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700842 SetUpForTest(true, "arraycopy", "(Ljava/lang/Object;ILjava/lang/Object;II)V",
Ian Rogersb9231c82011-09-05 22:13:19 -0700843 reinterpret_cast<void*>(&my_arraycopy));
Ian Rogers82f3e092011-09-05 22:54:45 -0700844 env_->CallStaticVoidMethod(jklass_, jmethod_, jobj_, 1234, jklass_, 5678, 9876);
Ian Rogersb9231c82011-09-05 22:13:19 -0700845}
846
Andreas Gampe6e498692014-08-18 16:43:12 -0700847JNI_TEST(JavaLangSystemArrayCopy)
848
Ian Rogers67375ac2011-09-14 00:55:44 -0700849jboolean my_casi(JNIEnv* env, jobject unsafe, jobject obj, jlong offset, jint expected, jint newval) {
850 EXPECT_TRUE(env->IsSameObject(JniCompilerTest::jobj_, unsafe));
851 EXPECT_TRUE(env->IsSameObject(JniCompilerTest::jobj_, obj));
Ian Rogers0f678472014-03-10 16:18:37 -0700852 EXPECT_EQ(INT64_C(0x12345678ABCDEF88), offset);
Ian Rogers67375ac2011-09-14 00:55:44 -0700853 EXPECT_EQ(static_cast<jint>(0xCAFEF00D), expected);
854 EXPECT_EQ(static_cast<jint>(0xEBADF00D), newval);
855 return JNI_TRUE;
856}
857
Andreas Gampe6e498692014-08-18 16:43:12 -0700858void JniCompilerTest::CompareAndSwapIntImpl() {
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700859 SetUpForTest(false, "compareAndSwapInt", "(Ljava/lang/Object;JII)Z",
Ian Rogers67375ac2011-09-14 00:55:44 -0700860 reinterpret_cast<void*>(&my_casi));
Ian Rogers0f678472014-03-10 16:18:37 -0700861 jboolean result = env_->CallBooleanMethod(jobj_, jmethod_, jobj_, INT64_C(0x12345678ABCDEF88),
862 0xCAFEF00D, 0xEBADF00D);
Ian Rogers67375ac2011-09-14 00:55:44 -0700863 EXPECT_EQ(result, JNI_TRUE);
864}
865
Andreas Gampe6e498692014-08-18 16:43:12 -0700866JNI_TEST(CompareAndSwapInt)
867
Ian Rogersc7792842012-03-03 15:36:20 -0800868jint my_gettext(JNIEnv* env, jclass klass, jlong val1, jobject obj1, jlong val2, jobject obj2) {
869 EXPECT_TRUE(env->IsInstanceOf(JniCompilerTest::jobj_, klass));
870 EXPECT_TRUE(env->IsSameObject(JniCompilerTest::jobj_, obj1));
871 EXPECT_TRUE(env->IsSameObject(JniCompilerTest::jobj_, obj2));
872 EXPECT_EQ(0x12345678ABCDEF88ll, val1);
873 EXPECT_EQ(0x7FEDCBA987654321ll, val2);
874 return 42;
875}
876
Andreas Gampe6e498692014-08-18 16:43:12 -0700877void JniCompilerTest::GetTextImpl() {
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700878 SetUpForTest(true, "getText", "(JLjava/lang/Object;JLjava/lang/Object;)I",
Ian Rogersc7792842012-03-03 15:36:20 -0800879 reinterpret_cast<void*>(&my_gettext));
880 jint result = env_->CallStaticIntMethod(jklass_, jmethod_, 0x12345678ABCDEF88ll, jobj_,
Ian Rogers0f678472014-03-10 16:18:37 -0700881 INT64_C(0x7FEDCBA987654321), jobj_);
Ian Rogersc7792842012-03-03 15:36:20 -0800882 EXPECT_EQ(result, 42);
883}
884
Andreas Gampe6e498692014-08-18 16:43:12 -0700885JNI_TEST(GetText)
886
Vladimir Marko4e24b9d2014-07-24 17:01:58 +0100887int gJava_MyClassNatives_GetSinkProperties_calls = 0;
888jarray Java_MyClassNatives_GetSinkProperties(JNIEnv* env, jobject thisObj, jstring s) {
889 // 1 = thisObj
890 Thread* self = Thread::Current();
891 EXPECT_EQ(kNative, self->GetState());
892 Locks::mutator_lock_->AssertNotHeld(self);
893 EXPECT_EQ(self->GetJniEnv(), env);
894 EXPECT_TRUE(thisObj != nullptr);
895 EXPECT_TRUE(env->IsInstanceOf(thisObj, JniCompilerTest::jklass_));
896 EXPECT_EQ(s, nullptr);
897 gJava_MyClassNatives_GetSinkProperties_calls++;
898 ScopedObjectAccess soa(self);
899 EXPECT_EQ(2U, self->NumStackReferences());
900 EXPECT_TRUE(self->HoldsLock(soa.Decode<mirror::Object*>(thisObj)));
901 return nullptr;
902}
903
Andreas Gampe6e498692014-08-18 16:43:12 -0700904void JniCompilerTest::GetSinkPropertiesNativeImpl() {
Vladimir Marko4e24b9d2014-07-24 17:01:58 +0100905 SetUpForTest(false, "getSinkPropertiesNative", "(Ljava/lang/String;)[Ljava/lang/Object;",
906 reinterpret_cast<void*>(&Java_MyClassNatives_GetSinkProperties));
907
908 EXPECT_EQ(0, gJava_MyClassNatives_GetSinkProperties_calls);
909 jarray result = down_cast<jarray>(
910 env_->CallNonvirtualObjectMethod(jobj_, jklass_, jmethod_, nullptr));
911 EXPECT_EQ(nullptr, result);
912 EXPECT_EQ(1, gJava_MyClassNatives_GetSinkProperties_calls);
Andreas Gampe6e498692014-08-18 16:43:12 -0700913
914 gJava_MyClassNatives_GetSinkProperties_calls = 0;
Brian Carlstromfc7120c2012-08-27 13:43:25 -0700915}
916
Andreas Gampe6e498692014-08-18 16:43:12 -0700917JNI_TEST(GetSinkPropertiesNative)
918
Elliott Hughesb264f082012-04-06 17:10:10 -0700919// This should return jclass, but we're imitating a bug pattern.
920jobject Java_MyClassNatives_instanceMethodThatShouldReturnClass(JNIEnv* env, jobject) {
921 return env->NewStringUTF("not a class!");
922}
923
924// This should return jclass, but we're imitating a bug pattern.
925jobject Java_MyClassNatives_staticMethodThatShouldReturnClass(JNIEnv* env, jclass) {
926 return env->NewStringUTF("not a class!");
927}
928
Andreas Gampe6e498692014-08-18 16:43:12 -0700929void JniCompilerTest::UpcallReturnTypeChecking_InstanceImpl() {
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700930 SetUpForTest(false, "instanceMethodThatShouldReturnClass", "()Ljava/lang/Class;",
Elliott Hughesb264f082012-04-06 17:10:10 -0700931 reinterpret_cast<void*>(&Java_MyClassNatives_instanceMethodThatShouldReturnClass));
932
933 CheckJniAbortCatcher check_jni_abort_catcher;
Elliott Hughes3f6635a2012-06-19 13:37:49 -0700934 // This native method is bad, and tries to return a jstring as a jclass.
935 env_->CallObjectMethod(jobj_, jmethod_);
936 check_jni_abort_catcher.Check("attempt to return an instance of java.lang.String from java.lang.Class MyClassNatives.instanceMethodThatShouldReturnClass()");
937
938 // Here, we just call the method incorrectly; we should catch that too.
Ian Rogers68d8b422014-07-17 11:09:10 -0700939 env_->CallObjectMethod(jobj_, jmethod_);
Elliott Hughes3f6635a2012-06-19 13:37:49 -0700940 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 -0700941 env_->CallStaticObjectMethod(jklass_, jmethod_);
942 check_jni_abort_catcher.Check("calling non-static method java.lang.Class MyClassNatives.instanceMethodThatShouldReturnClass() with CallStaticObjectMethodV");
Elliott Hughesb264f082012-04-06 17:10:10 -0700943}
944
Andreas Gampe6e498692014-08-18 16:43:12 -0700945JNI_TEST(UpcallReturnTypeChecking_Instance)
946
947void JniCompilerTest::UpcallReturnTypeChecking_StaticImpl() {
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700948 SetUpForTest(true, "staticMethodThatShouldReturnClass", "()Ljava/lang/Class;",
Elliott Hughesb264f082012-04-06 17:10:10 -0700949 reinterpret_cast<void*>(&Java_MyClassNatives_staticMethodThatShouldReturnClass));
950
951 CheckJniAbortCatcher check_jni_abort_catcher;
Elliott Hughes3f6635a2012-06-19 13:37:49 -0700952 // This native method is bad, and tries to return a jstring as a jclass.
953 env_->CallStaticObjectMethod(jklass_, jmethod_);
954 check_jni_abort_catcher.Check("attempt to return an instance of java.lang.String from java.lang.Class MyClassNatives.staticMethodThatShouldReturnClass()");
955
956 // Here, we just call the method incorrectly; we should catch that too.
Ian Rogers68d8b422014-07-17 11:09:10 -0700957 env_->CallStaticObjectMethod(jklass_, jmethod_);
Elliott Hughes3f6635a2012-06-19 13:37:49 -0700958 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 -0700959 env_->CallObjectMethod(jobj_, jmethod_);
960 check_jni_abort_catcher.Check("calling static method java.lang.Class MyClassNatives.staticMethodThatShouldReturnClass() with CallObjectMethodV");
Elliott Hughesb264f082012-04-06 17:10:10 -0700961}
962
Andreas Gampe6e498692014-08-18 16:43:12 -0700963JNI_TEST(UpcallReturnTypeChecking_Static)
964
Elliott Hughesb264f082012-04-06 17:10:10 -0700965// This should take jclass, but we're imitating a bug pattern.
966void Java_MyClassNatives_instanceMethodThatShouldTakeClass(JNIEnv*, jobject, jclass) {
967}
968
969// This should take jclass, but we're imitating a bug pattern.
970void Java_MyClassNatives_staticMethodThatShouldTakeClass(JNIEnv*, jclass, jclass) {
971}
972
Andreas Gampe6e498692014-08-18 16:43:12 -0700973void JniCompilerTest::UpcallArgumentTypeChecking_InstanceImpl() {
Andreas Gampe369810a2015-01-14 19:53:31 -0800974 // This will lead to error messages in the log.
975 ScopedLogSeverity sls(LogSeverity::FATAL);
976
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700977 SetUpForTest(false, "instanceMethodThatShouldTakeClass", "(ILjava/lang/Class;)V",
Elliott Hughesb264f082012-04-06 17:10:10 -0700978 reinterpret_cast<void*>(&Java_MyClassNatives_instanceMethodThatShouldTakeClass));
979
980 CheckJniAbortCatcher check_jni_abort_catcher;
981 // We deliberately pass a bad second argument here.
982 env_->CallVoidMethod(jobj_, jmethod_, 123, env_->NewStringUTF("not a class!"));
Elliott Hughes3f6635a2012-06-19 13:37:49 -0700983 check_jni_abort_catcher.Check("bad arguments passed to void MyClassNatives.instanceMethodThatShouldTakeClass(int, java.lang.Class)");
Elliott Hughesb264f082012-04-06 17:10:10 -0700984}
985
Andreas Gampe6e498692014-08-18 16:43:12 -0700986JNI_TEST(UpcallArgumentTypeChecking_Instance)
987
988void JniCompilerTest::UpcallArgumentTypeChecking_StaticImpl() {
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(true, "staticMethodThatShouldTakeClass", "(ILjava/lang/Class;)V",
Elliott Hughesb264f082012-04-06 17:10:10 -0700993 reinterpret_cast<void*>(&Java_MyClassNatives_staticMethodThatShouldTakeClass));
994
995 CheckJniAbortCatcher check_jni_abort_catcher;
996 // We deliberately pass a bad second argument here.
997 env_->CallStaticVoidMethod(jklass_, 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.staticMethodThatShouldTakeClass(int, java.lang.Class)");
Elliott Hughesb264f082012-04-06 17:10:10 -0700999}
1000
Andreas Gampe6e498692014-08-18 16:43:12 -07001001JNI_TEST(UpcallArgumentTypeChecking_Static)
1002
Andreas Gampe7a0e5042014-03-07 13:03:19 -08001003jfloat Java_MyClassNatives_checkFloats(JNIEnv* env, jobject thisObj, jfloat f1, jfloat f2) {
1004 EXPECT_EQ(kNative, Thread::Current()->GetState());
1005 EXPECT_EQ(Thread::Current()->GetJniEnv(), env);
Andreas Gampecf4035a2014-05-28 22:43:01 -07001006 EXPECT_TRUE(thisObj != nullptr);
Andreas Gampe7a0e5042014-03-07 13:03:19 -08001007 EXPECT_TRUE(env->IsInstanceOf(thisObj, JniCompilerTest::jklass_));
1008 ScopedObjectAccess soa(Thread::Current());
1009 EXPECT_EQ(1U, Thread::Current()->NumStackReferences());
1010 return f1 - f2; // non-commutative operator
1011}
1012
Andreas Gampe6e498692014-08-18 16:43:12 -07001013void JniCompilerTest::CompileAndRunFloatFloatMethodImpl() {
Andreas Gampe7a0e5042014-03-07 13:03:19 -08001014 SetUpForTest(false, "checkFloats", "(FF)F",
1015 reinterpret_cast<void*>(&Java_MyClassNatives_checkFloats));
1016
1017 jfloat result = env_->CallNonvirtualFloatMethod(jobj_, jklass_, jmethod_,
1018 99.0F, 10.0F);
Ian Rogers647b1a82014-10-10 11:02:11 -07001019 EXPECT_FLOAT_EQ(99.0F - 10.0F, result);
Andreas Gampe7a0e5042014-03-07 13:03:19 -08001020 jfloat a = 3.14159F;
1021 jfloat b = 0.69314F;
1022 result = env_->CallNonvirtualFloatMethod(jobj_, jklass_, jmethod_, a, b);
Ian Rogers647b1a82014-10-10 11:02:11 -07001023 EXPECT_FLOAT_EQ(a - b, result);
Andreas Gampe7a0e5042014-03-07 13:03:19 -08001024}
1025
Andreas Gampe6e498692014-08-18 16:43:12 -07001026JNI_TEST(CompileAndRunFloatFloatMethod)
1027
Ian Rogers6a3c1fc2014-10-31 00:33:20 -07001028void Java_MyClassNatives_checkParameterAlign(JNIEnv* env ATTRIBUTE_UNUSED,
1029 jobject thisObj ATTRIBUTE_UNUSED,
1030 jint i1 ATTRIBUTE_UNUSED,
1031 jlong l1 ATTRIBUTE_UNUSED) {
Andreas Gampecf4035a2014-05-28 22:43:01 -07001032// EXPECT_EQ(kNative, Thread::Current()->GetState());
1033// EXPECT_EQ(Thread::Current()->GetJniEnv(), env);
1034// EXPECT_TRUE(thisObj != nullptr);
1035// EXPECT_TRUE(env->IsInstanceOf(thisObj, JniCompilerTest::jklass_));
1036// ScopedObjectAccess soa(Thread::Current());
1037// EXPECT_EQ(1U, Thread::Current()->NumStackReferences());
Andreas Gampe7a0e5042014-03-07 13:03:19 -08001038 EXPECT_EQ(i1, 1234);
Ian Rogers0f678472014-03-10 16:18:37 -07001039 EXPECT_EQ(l1, INT64_C(0x12345678ABCDEF0));
Andreas Gampe7a0e5042014-03-07 13:03:19 -08001040}
1041
Andreas Gampe6e498692014-08-18 16:43:12 -07001042void JniCompilerTest::CheckParameterAlignImpl() {
Andreas Gampe7a0e5042014-03-07 13:03:19 -08001043 SetUpForTest(false, "checkParameterAlign", "(IJ)V",
1044 reinterpret_cast<void*>(&Java_MyClassNatives_checkParameterAlign));
1045
Ian Rogers0f678472014-03-10 16:18:37 -07001046 env_->CallNonvirtualVoidMethod(jobj_, jklass_, jmethod_, 1234, INT64_C(0x12345678ABCDEF0));
Andreas Gampe7a0e5042014-03-07 13:03:19 -08001047}
1048
Andreas Gampe6e498692014-08-18 16:43:12 -07001049JNI_TEST(CheckParameterAlign)
1050
Andreas Gampe7a0e5042014-03-07 13:03:19 -08001051void Java_MyClassNatives_maxParamNumber(JNIEnv* env, jobject thisObj,
1052 jobject o0, jobject o1, jobject o2, jobject o3, jobject o4, jobject o5, jobject o6, jobject o7,
1053 jobject o8, jobject o9, jobject o10, jobject o11, jobject o12, jobject o13, jobject o14, jobject o15,
1054 jobject o16, jobject o17, jobject o18, jobject o19, jobject o20, jobject o21, jobject o22, jobject o23,
1055 jobject o24, jobject o25, jobject o26, jobject o27, jobject o28, jobject o29, jobject o30, jobject o31,
1056 jobject o32, jobject o33, jobject o34, jobject o35, jobject o36, jobject o37, jobject o38, jobject o39,
1057 jobject o40, jobject o41, jobject o42, jobject o43, jobject o44, jobject o45, jobject o46, jobject o47,
1058 jobject o48, jobject o49, jobject o50, jobject o51, jobject o52, jobject o53, jobject o54, jobject o55,
1059 jobject o56, jobject o57, jobject o58, jobject o59, jobject o60, jobject o61, jobject o62, jobject o63,
1060 jobject o64, jobject o65, jobject o66, jobject o67, jobject o68, jobject o69, jobject o70, jobject o71,
1061 jobject o72, jobject o73, jobject o74, jobject o75, jobject o76, jobject o77, jobject o78, jobject o79,
1062 jobject o80, jobject o81, jobject o82, jobject o83, jobject o84, jobject o85, jobject o86, jobject o87,
1063 jobject o88, jobject o89, jobject o90, jobject o91, jobject o92, jobject o93, jobject o94, jobject o95,
1064 jobject o96, jobject o97, jobject o98, jobject o99, jobject o100, jobject o101, jobject o102, jobject o103,
1065 jobject o104, jobject o105, jobject o106, jobject o107, jobject o108, jobject o109, jobject o110, jobject o111,
1066 jobject o112, jobject o113, jobject o114, jobject o115, jobject o116, jobject o117, jobject o118, jobject o119,
1067 jobject o120, jobject o121, jobject o122, jobject o123, jobject o124, jobject o125, jobject o126, jobject o127,
1068 jobject o128, jobject o129, jobject o130, jobject o131, jobject o132, jobject o133, jobject o134, jobject o135,
1069 jobject o136, jobject o137, jobject o138, jobject o139, jobject o140, jobject o141, jobject o142, jobject o143,
1070 jobject o144, jobject o145, jobject o146, jobject o147, jobject o148, jobject o149, jobject o150, jobject o151,
1071 jobject o152, jobject o153, jobject o154, jobject o155, jobject o156, jobject o157, jobject o158, jobject o159,
1072 jobject o160, jobject o161, jobject o162, jobject o163, jobject o164, jobject o165, jobject o166, jobject o167,
1073 jobject o168, jobject o169, jobject o170, jobject o171, jobject o172, jobject o173, jobject o174, jobject o175,
1074 jobject o176, jobject o177, jobject o178, jobject o179, jobject o180, jobject o181, jobject o182, jobject o183,
1075 jobject o184, jobject o185, jobject o186, jobject o187, jobject o188, jobject o189, jobject o190, jobject o191,
1076 jobject o192, jobject o193, jobject o194, jobject o195, jobject o196, jobject o197, jobject o198, jobject o199,
1077 jobject o200, jobject o201, jobject o202, jobject o203, jobject o204, jobject o205, jobject o206, jobject o207,
1078 jobject o208, jobject o209, jobject o210, jobject o211, jobject o212, jobject o213, jobject o214, jobject o215,
1079 jobject o216, jobject o217, jobject o218, jobject o219, jobject o220, jobject o221, jobject o222, jobject o223,
1080 jobject o224, jobject o225, jobject o226, jobject o227, jobject o228, jobject o229, jobject o230, jobject o231,
1081 jobject o232, jobject o233, jobject o234, jobject o235, jobject o236, jobject o237, jobject o238, jobject o239,
1082 jobject o240, jobject o241, jobject o242, jobject o243, jobject o244, jobject o245, jobject o246, jobject o247,
1083 jobject o248, jobject o249, jobject o250, jobject o251, jobject o252, jobject o253) {
1084 EXPECT_EQ(kNative, Thread::Current()->GetState());
1085 EXPECT_EQ(Thread::Current()->GetJniEnv(), env);
Andreas Gampecf4035a2014-05-28 22:43:01 -07001086 EXPECT_TRUE(thisObj != nullptr);
Andreas Gampe7a0e5042014-03-07 13:03:19 -08001087 EXPECT_TRUE(env->IsInstanceOf(thisObj, JniCompilerTest::jklass_));
1088 ScopedObjectAccess soa(Thread::Current());
1089 EXPECT_GE(255U, Thread::Current()->NumStackReferences());
1090
1091 // two tests possible
1092 if (o0 == nullptr) {
1093 // 1) everything is null
1094 EXPECT_TRUE(o0 == nullptr && o1 == nullptr && o2 == nullptr && o3 == nullptr && o4 == nullptr
1095 && o5 == nullptr && o6 == nullptr && o7 == nullptr && o8 == nullptr && o9 == nullptr
1096 && o10 == nullptr && o11 == nullptr && o12 == nullptr && o13 == nullptr && o14 == nullptr
1097 && o15 == nullptr && o16 == nullptr && o17 == nullptr && o18 == nullptr && o19 == nullptr
1098 && o20 == nullptr && o21 == nullptr && o22 == nullptr && o23 == nullptr && o24 == nullptr
1099 && o25 == nullptr && o26 == nullptr && o27 == nullptr && o28 == nullptr && o29 == nullptr
1100 && o30 == nullptr && o31 == nullptr && o32 == nullptr && o33 == nullptr && o34 == nullptr
1101 && o35 == nullptr && o36 == nullptr && o37 == nullptr && o38 == nullptr && o39 == nullptr
1102 && o40 == nullptr && o41 == nullptr && o42 == nullptr && o43 == nullptr && o44 == nullptr
1103 && o45 == nullptr && o46 == nullptr && o47 == nullptr && o48 == nullptr && o49 == nullptr
1104 && o50 == nullptr && o51 == nullptr && o52 == nullptr && o53 == nullptr && o54 == nullptr
1105 && o55 == nullptr && o56 == nullptr && o57 == nullptr && o58 == nullptr && o59 == nullptr
1106 && o60 == nullptr && o61 == nullptr && o62 == nullptr && o63 == nullptr && o64 == nullptr
1107 && o65 == nullptr && o66 == nullptr && o67 == nullptr && o68 == nullptr && o69 == nullptr
1108 && o70 == nullptr && o71 == nullptr && o72 == nullptr && o73 == nullptr && o74 == nullptr
1109 && o75 == nullptr && o76 == nullptr && o77 == nullptr && o78 == nullptr && o79 == nullptr
1110 && o80 == nullptr && o81 == nullptr && o82 == nullptr && o83 == nullptr && o84 == nullptr
1111 && o85 == nullptr && o86 == nullptr && o87 == nullptr && o88 == nullptr && o89 == nullptr
1112 && o90 == nullptr && o91 == nullptr && o92 == nullptr && o93 == nullptr && o94 == nullptr
1113 && o95 == nullptr && o96 == nullptr && o97 == nullptr && o98 == nullptr && o99 == nullptr
1114 && o100 == nullptr && o101 == nullptr && o102 == nullptr && o103 == nullptr && o104 == nullptr
1115 && o105 == nullptr && o106 == nullptr && o107 == nullptr && o108 == nullptr && o109 == nullptr
1116 && o110 == nullptr && o111 == nullptr && o112 == nullptr && o113 == nullptr && o114 == nullptr
1117 && o115 == nullptr && o116 == nullptr && o117 == nullptr && o118 == nullptr && o119 == nullptr
1118 && o120 == nullptr && o121 == nullptr && o122 == nullptr && o123 == nullptr && o124 == nullptr
1119 && o125 == nullptr && o126 == nullptr && o127 == nullptr && o128 == nullptr && o129 == nullptr
1120 && o130 == nullptr && o131 == nullptr && o132 == nullptr && o133 == nullptr && o134 == nullptr
1121 && o135 == nullptr && o136 == nullptr && o137 == nullptr && o138 == nullptr && o139 == nullptr
1122 && o140 == nullptr && o141 == nullptr && o142 == nullptr && o143 == nullptr && o144 == nullptr
1123 && o145 == nullptr && o146 == nullptr && o147 == nullptr && o148 == nullptr && o149 == nullptr
1124 && o150 == nullptr && o151 == nullptr && o152 == nullptr && o153 == nullptr && o154 == nullptr
1125 && o155 == nullptr && o156 == nullptr && o157 == nullptr && o158 == nullptr && o159 == nullptr
1126 && o160 == nullptr && o161 == nullptr && o162 == nullptr && o163 == nullptr && o164 == nullptr
1127 && o165 == nullptr && o166 == nullptr && o167 == nullptr && o168 == nullptr && o169 == nullptr
1128 && o170 == nullptr && o171 == nullptr && o172 == nullptr && o173 == nullptr && o174 == nullptr
1129 && o175 == nullptr && o176 == nullptr && o177 == nullptr && o178 == nullptr && o179 == nullptr
1130 && o180 == nullptr && o181 == nullptr && o182 == nullptr && o183 == nullptr && o184 == nullptr
1131 && o185 == nullptr && o186 == nullptr && o187 == nullptr && o188 == nullptr && o189 == nullptr
1132 && o190 == nullptr && o191 == nullptr && o192 == nullptr && o193 == nullptr && o194 == nullptr
1133 && o195 == nullptr && o196 == nullptr && o197 == nullptr && o198 == nullptr && o199 == nullptr
1134 && o200 == nullptr && o201 == nullptr && o202 == nullptr && o203 == nullptr && o204 == nullptr
1135 && o205 == nullptr && o206 == nullptr && o207 == nullptr && o208 == nullptr && o209 == nullptr
1136 && o210 == nullptr && o211 == nullptr && o212 == nullptr && o213 == nullptr && o214 == nullptr
1137 && o215 == nullptr && o216 == nullptr && o217 == nullptr && o218 == nullptr && o219 == nullptr
1138 && o220 == nullptr && o221 == nullptr && o222 == nullptr && o223 == nullptr && o224 == nullptr
1139 && o225 == nullptr && o226 == nullptr && o227 == nullptr && o228 == nullptr && o229 == nullptr
1140 && o230 == nullptr && o231 == nullptr && o232 == nullptr && o233 == nullptr && o234 == nullptr
1141 && o235 == nullptr && o236 == nullptr && o237 == nullptr && o238 == nullptr && o239 == nullptr
1142 && o240 == nullptr && o241 == nullptr && o242 == nullptr && o243 == nullptr && o244 == nullptr
1143 && o245 == nullptr && o246 == nullptr && o247 == nullptr && o248 == nullptr && o249 == nullptr
1144 && o250 == nullptr && o251 == nullptr && o252 == nullptr && o253 == nullptr);
1145 } else {
1146 EXPECT_EQ(0, env->GetArrayLength(reinterpret_cast<jarray>(o0)));
1147 EXPECT_EQ(1, env->GetArrayLength(reinterpret_cast<jarray>(o1)));
1148 EXPECT_EQ(2, env->GetArrayLength(reinterpret_cast<jarray>(o2)));
1149 EXPECT_EQ(3, env->GetArrayLength(reinterpret_cast<jarray>(o3)));
1150 EXPECT_EQ(4, env->GetArrayLength(reinterpret_cast<jarray>(o4)));
1151 EXPECT_EQ(5, env->GetArrayLength(reinterpret_cast<jarray>(o5)));
1152 EXPECT_EQ(6, env->GetArrayLength(reinterpret_cast<jarray>(o6)));
1153 EXPECT_EQ(7, env->GetArrayLength(reinterpret_cast<jarray>(o7)));
1154 EXPECT_EQ(8, env->GetArrayLength(reinterpret_cast<jarray>(o8)));
1155 EXPECT_EQ(9, env->GetArrayLength(reinterpret_cast<jarray>(o9)));
1156 EXPECT_EQ(10, env->GetArrayLength(reinterpret_cast<jarray>(o10)));
1157 EXPECT_EQ(11, env->GetArrayLength(reinterpret_cast<jarray>(o11)));
1158 EXPECT_EQ(12, env->GetArrayLength(reinterpret_cast<jarray>(o12)));
1159 EXPECT_EQ(13, env->GetArrayLength(reinterpret_cast<jarray>(o13)));
1160 EXPECT_EQ(14, env->GetArrayLength(reinterpret_cast<jarray>(o14)));
1161 EXPECT_EQ(15, env->GetArrayLength(reinterpret_cast<jarray>(o15)));
1162 EXPECT_EQ(16, env->GetArrayLength(reinterpret_cast<jarray>(o16)));
1163 EXPECT_EQ(17, env->GetArrayLength(reinterpret_cast<jarray>(o17)));
1164 EXPECT_EQ(18, env->GetArrayLength(reinterpret_cast<jarray>(o18)));
1165 EXPECT_EQ(19, env->GetArrayLength(reinterpret_cast<jarray>(o19)));
1166 EXPECT_EQ(20, env->GetArrayLength(reinterpret_cast<jarray>(o20)));
1167 EXPECT_EQ(21, env->GetArrayLength(reinterpret_cast<jarray>(o21)));
1168 EXPECT_EQ(22, env->GetArrayLength(reinterpret_cast<jarray>(o22)));
1169 EXPECT_EQ(23, env->GetArrayLength(reinterpret_cast<jarray>(o23)));
1170 EXPECT_EQ(24, env->GetArrayLength(reinterpret_cast<jarray>(o24)));
1171 EXPECT_EQ(25, env->GetArrayLength(reinterpret_cast<jarray>(o25)));
1172 EXPECT_EQ(26, env->GetArrayLength(reinterpret_cast<jarray>(o26)));
1173 EXPECT_EQ(27, env->GetArrayLength(reinterpret_cast<jarray>(o27)));
1174 EXPECT_EQ(28, env->GetArrayLength(reinterpret_cast<jarray>(o28)));
1175 EXPECT_EQ(29, env->GetArrayLength(reinterpret_cast<jarray>(o29)));
1176 EXPECT_EQ(30, env->GetArrayLength(reinterpret_cast<jarray>(o30)));
1177 EXPECT_EQ(31, env->GetArrayLength(reinterpret_cast<jarray>(o31)));
1178 EXPECT_EQ(32, env->GetArrayLength(reinterpret_cast<jarray>(o32)));
1179 EXPECT_EQ(33, env->GetArrayLength(reinterpret_cast<jarray>(o33)));
1180 EXPECT_EQ(34, env->GetArrayLength(reinterpret_cast<jarray>(o34)));
1181 EXPECT_EQ(35, env->GetArrayLength(reinterpret_cast<jarray>(o35)));
1182 EXPECT_EQ(36, env->GetArrayLength(reinterpret_cast<jarray>(o36)));
1183 EXPECT_EQ(37, env->GetArrayLength(reinterpret_cast<jarray>(o37)));
1184 EXPECT_EQ(38, env->GetArrayLength(reinterpret_cast<jarray>(o38)));
1185 EXPECT_EQ(39, env->GetArrayLength(reinterpret_cast<jarray>(o39)));
1186 EXPECT_EQ(40, env->GetArrayLength(reinterpret_cast<jarray>(o40)));
1187 EXPECT_EQ(41, env->GetArrayLength(reinterpret_cast<jarray>(o41)));
1188 EXPECT_EQ(42, env->GetArrayLength(reinterpret_cast<jarray>(o42)));
1189 EXPECT_EQ(43, env->GetArrayLength(reinterpret_cast<jarray>(o43)));
1190 EXPECT_EQ(44, env->GetArrayLength(reinterpret_cast<jarray>(o44)));
1191 EXPECT_EQ(45, env->GetArrayLength(reinterpret_cast<jarray>(o45)));
1192 EXPECT_EQ(46, env->GetArrayLength(reinterpret_cast<jarray>(o46)));
1193 EXPECT_EQ(47, env->GetArrayLength(reinterpret_cast<jarray>(o47)));
1194 EXPECT_EQ(48, env->GetArrayLength(reinterpret_cast<jarray>(o48)));
1195 EXPECT_EQ(49, env->GetArrayLength(reinterpret_cast<jarray>(o49)));
1196 EXPECT_EQ(50, env->GetArrayLength(reinterpret_cast<jarray>(o50)));
1197 EXPECT_EQ(51, env->GetArrayLength(reinterpret_cast<jarray>(o51)));
1198 EXPECT_EQ(52, env->GetArrayLength(reinterpret_cast<jarray>(o52)));
1199 EXPECT_EQ(53, env->GetArrayLength(reinterpret_cast<jarray>(o53)));
1200 EXPECT_EQ(54, env->GetArrayLength(reinterpret_cast<jarray>(o54)));
1201 EXPECT_EQ(55, env->GetArrayLength(reinterpret_cast<jarray>(o55)));
1202 EXPECT_EQ(56, env->GetArrayLength(reinterpret_cast<jarray>(o56)));
1203 EXPECT_EQ(57, env->GetArrayLength(reinterpret_cast<jarray>(o57)));
1204 EXPECT_EQ(58, env->GetArrayLength(reinterpret_cast<jarray>(o58)));
1205 EXPECT_EQ(59, env->GetArrayLength(reinterpret_cast<jarray>(o59)));
1206 EXPECT_EQ(60, env->GetArrayLength(reinterpret_cast<jarray>(o60)));
1207 EXPECT_EQ(61, env->GetArrayLength(reinterpret_cast<jarray>(o61)));
1208 EXPECT_EQ(62, env->GetArrayLength(reinterpret_cast<jarray>(o62)));
1209 EXPECT_EQ(63, env->GetArrayLength(reinterpret_cast<jarray>(o63)));
1210 EXPECT_EQ(64, env->GetArrayLength(reinterpret_cast<jarray>(o64)));
1211 EXPECT_EQ(65, env->GetArrayLength(reinterpret_cast<jarray>(o65)));
1212 EXPECT_EQ(66, env->GetArrayLength(reinterpret_cast<jarray>(o66)));
1213 EXPECT_EQ(67, env->GetArrayLength(reinterpret_cast<jarray>(o67)));
1214 EXPECT_EQ(68, env->GetArrayLength(reinterpret_cast<jarray>(o68)));
1215 EXPECT_EQ(69, env->GetArrayLength(reinterpret_cast<jarray>(o69)));
1216 EXPECT_EQ(70, env->GetArrayLength(reinterpret_cast<jarray>(o70)));
1217 EXPECT_EQ(71, env->GetArrayLength(reinterpret_cast<jarray>(o71)));
1218 EXPECT_EQ(72, env->GetArrayLength(reinterpret_cast<jarray>(o72)));
1219 EXPECT_EQ(73, env->GetArrayLength(reinterpret_cast<jarray>(o73)));
1220 EXPECT_EQ(74, env->GetArrayLength(reinterpret_cast<jarray>(o74)));
1221 EXPECT_EQ(75, env->GetArrayLength(reinterpret_cast<jarray>(o75)));
1222 EXPECT_EQ(76, env->GetArrayLength(reinterpret_cast<jarray>(o76)));
1223 EXPECT_EQ(77, env->GetArrayLength(reinterpret_cast<jarray>(o77)));
1224 EXPECT_EQ(78, env->GetArrayLength(reinterpret_cast<jarray>(o78)));
1225 EXPECT_EQ(79, env->GetArrayLength(reinterpret_cast<jarray>(o79)));
1226 EXPECT_EQ(80, env->GetArrayLength(reinterpret_cast<jarray>(o80)));
1227 EXPECT_EQ(81, env->GetArrayLength(reinterpret_cast<jarray>(o81)));
1228 EXPECT_EQ(82, env->GetArrayLength(reinterpret_cast<jarray>(o82)));
1229 EXPECT_EQ(83, env->GetArrayLength(reinterpret_cast<jarray>(o83)));
1230 EXPECT_EQ(84, env->GetArrayLength(reinterpret_cast<jarray>(o84)));
1231 EXPECT_EQ(85, env->GetArrayLength(reinterpret_cast<jarray>(o85)));
1232 EXPECT_EQ(86, env->GetArrayLength(reinterpret_cast<jarray>(o86)));
1233 EXPECT_EQ(87, env->GetArrayLength(reinterpret_cast<jarray>(o87)));
1234 EXPECT_EQ(88, env->GetArrayLength(reinterpret_cast<jarray>(o88)));
1235 EXPECT_EQ(89, env->GetArrayLength(reinterpret_cast<jarray>(o89)));
1236 EXPECT_EQ(90, env->GetArrayLength(reinterpret_cast<jarray>(o90)));
1237 EXPECT_EQ(91, env->GetArrayLength(reinterpret_cast<jarray>(o91)));
1238 EXPECT_EQ(92, env->GetArrayLength(reinterpret_cast<jarray>(o92)));
1239 EXPECT_EQ(93, env->GetArrayLength(reinterpret_cast<jarray>(o93)));
1240 EXPECT_EQ(94, env->GetArrayLength(reinterpret_cast<jarray>(o94)));
1241 EXPECT_EQ(95, env->GetArrayLength(reinterpret_cast<jarray>(o95)));
1242 EXPECT_EQ(96, env->GetArrayLength(reinterpret_cast<jarray>(o96)));
1243 EXPECT_EQ(97, env->GetArrayLength(reinterpret_cast<jarray>(o97)));
1244 EXPECT_EQ(98, env->GetArrayLength(reinterpret_cast<jarray>(o98)));
1245 EXPECT_EQ(99, env->GetArrayLength(reinterpret_cast<jarray>(o99)));
1246 EXPECT_EQ(100, env->GetArrayLength(reinterpret_cast<jarray>(o100)));
1247 EXPECT_EQ(101, env->GetArrayLength(reinterpret_cast<jarray>(o101)));
1248 EXPECT_EQ(102, env->GetArrayLength(reinterpret_cast<jarray>(o102)));
1249 EXPECT_EQ(103, env->GetArrayLength(reinterpret_cast<jarray>(o103)));
1250 EXPECT_EQ(104, env->GetArrayLength(reinterpret_cast<jarray>(o104)));
1251 EXPECT_EQ(105, env->GetArrayLength(reinterpret_cast<jarray>(o105)));
1252 EXPECT_EQ(106, env->GetArrayLength(reinterpret_cast<jarray>(o106)));
1253 EXPECT_EQ(107, env->GetArrayLength(reinterpret_cast<jarray>(o107)));
1254 EXPECT_EQ(108, env->GetArrayLength(reinterpret_cast<jarray>(o108)));
1255 EXPECT_EQ(109, env->GetArrayLength(reinterpret_cast<jarray>(o109)));
1256 EXPECT_EQ(110, env->GetArrayLength(reinterpret_cast<jarray>(o110)));
1257 EXPECT_EQ(111, env->GetArrayLength(reinterpret_cast<jarray>(o111)));
1258 EXPECT_EQ(112, env->GetArrayLength(reinterpret_cast<jarray>(o112)));
1259 EXPECT_EQ(113, env->GetArrayLength(reinterpret_cast<jarray>(o113)));
1260 EXPECT_EQ(114, env->GetArrayLength(reinterpret_cast<jarray>(o114)));
1261 EXPECT_EQ(115, env->GetArrayLength(reinterpret_cast<jarray>(o115)));
1262 EXPECT_EQ(116, env->GetArrayLength(reinterpret_cast<jarray>(o116)));
1263 EXPECT_EQ(117, env->GetArrayLength(reinterpret_cast<jarray>(o117)));
1264 EXPECT_EQ(118, env->GetArrayLength(reinterpret_cast<jarray>(o118)));
1265 EXPECT_EQ(119, env->GetArrayLength(reinterpret_cast<jarray>(o119)));
1266 EXPECT_EQ(120, env->GetArrayLength(reinterpret_cast<jarray>(o120)));
1267 EXPECT_EQ(121, env->GetArrayLength(reinterpret_cast<jarray>(o121)));
1268 EXPECT_EQ(122, env->GetArrayLength(reinterpret_cast<jarray>(o122)));
1269 EXPECT_EQ(123, env->GetArrayLength(reinterpret_cast<jarray>(o123)));
1270 EXPECT_EQ(124, env->GetArrayLength(reinterpret_cast<jarray>(o124)));
1271 EXPECT_EQ(125, env->GetArrayLength(reinterpret_cast<jarray>(o125)));
1272 EXPECT_EQ(126, env->GetArrayLength(reinterpret_cast<jarray>(o126)));
1273 EXPECT_EQ(127, env->GetArrayLength(reinterpret_cast<jarray>(o127)));
1274 EXPECT_EQ(128, env->GetArrayLength(reinterpret_cast<jarray>(o128)));
1275 EXPECT_EQ(129, env->GetArrayLength(reinterpret_cast<jarray>(o129)));
1276 EXPECT_EQ(130, env->GetArrayLength(reinterpret_cast<jarray>(o130)));
1277 EXPECT_EQ(131, env->GetArrayLength(reinterpret_cast<jarray>(o131)));
1278 EXPECT_EQ(132, env->GetArrayLength(reinterpret_cast<jarray>(o132)));
1279 EXPECT_EQ(133, env->GetArrayLength(reinterpret_cast<jarray>(o133)));
1280 EXPECT_EQ(134, env->GetArrayLength(reinterpret_cast<jarray>(o134)));
1281 EXPECT_EQ(135, env->GetArrayLength(reinterpret_cast<jarray>(o135)));
1282 EXPECT_EQ(136, env->GetArrayLength(reinterpret_cast<jarray>(o136)));
1283 EXPECT_EQ(137, env->GetArrayLength(reinterpret_cast<jarray>(o137)));
1284 EXPECT_EQ(138, env->GetArrayLength(reinterpret_cast<jarray>(o138)));
1285 EXPECT_EQ(139, env->GetArrayLength(reinterpret_cast<jarray>(o139)));
1286 EXPECT_EQ(140, env->GetArrayLength(reinterpret_cast<jarray>(o140)));
1287 EXPECT_EQ(141, env->GetArrayLength(reinterpret_cast<jarray>(o141)));
1288 EXPECT_EQ(142, env->GetArrayLength(reinterpret_cast<jarray>(o142)));
1289 EXPECT_EQ(143, env->GetArrayLength(reinterpret_cast<jarray>(o143)));
1290 EXPECT_EQ(144, env->GetArrayLength(reinterpret_cast<jarray>(o144)));
1291 EXPECT_EQ(145, env->GetArrayLength(reinterpret_cast<jarray>(o145)));
1292 EXPECT_EQ(146, env->GetArrayLength(reinterpret_cast<jarray>(o146)));
1293 EXPECT_EQ(147, env->GetArrayLength(reinterpret_cast<jarray>(o147)));
1294 EXPECT_EQ(148, env->GetArrayLength(reinterpret_cast<jarray>(o148)));
1295 EXPECT_EQ(149, env->GetArrayLength(reinterpret_cast<jarray>(o149)));
1296 EXPECT_EQ(150, env->GetArrayLength(reinterpret_cast<jarray>(o150)));
1297 EXPECT_EQ(151, env->GetArrayLength(reinterpret_cast<jarray>(o151)));
1298 EXPECT_EQ(152, env->GetArrayLength(reinterpret_cast<jarray>(o152)));
1299 EXPECT_EQ(153, env->GetArrayLength(reinterpret_cast<jarray>(o153)));
1300 EXPECT_EQ(154, env->GetArrayLength(reinterpret_cast<jarray>(o154)));
1301 EXPECT_EQ(155, env->GetArrayLength(reinterpret_cast<jarray>(o155)));
1302 EXPECT_EQ(156, env->GetArrayLength(reinterpret_cast<jarray>(o156)));
1303 EXPECT_EQ(157, env->GetArrayLength(reinterpret_cast<jarray>(o157)));
1304 EXPECT_EQ(158, env->GetArrayLength(reinterpret_cast<jarray>(o158)));
1305 EXPECT_EQ(159, env->GetArrayLength(reinterpret_cast<jarray>(o159)));
1306 EXPECT_EQ(160, env->GetArrayLength(reinterpret_cast<jarray>(o160)));
1307 EXPECT_EQ(161, env->GetArrayLength(reinterpret_cast<jarray>(o161)));
1308 EXPECT_EQ(162, env->GetArrayLength(reinterpret_cast<jarray>(o162)));
1309 EXPECT_EQ(163, env->GetArrayLength(reinterpret_cast<jarray>(o163)));
1310 EXPECT_EQ(164, env->GetArrayLength(reinterpret_cast<jarray>(o164)));
1311 EXPECT_EQ(165, env->GetArrayLength(reinterpret_cast<jarray>(o165)));
1312 EXPECT_EQ(166, env->GetArrayLength(reinterpret_cast<jarray>(o166)));
1313 EXPECT_EQ(167, env->GetArrayLength(reinterpret_cast<jarray>(o167)));
1314 EXPECT_EQ(168, env->GetArrayLength(reinterpret_cast<jarray>(o168)));
1315 EXPECT_EQ(169, env->GetArrayLength(reinterpret_cast<jarray>(o169)));
1316 EXPECT_EQ(170, env->GetArrayLength(reinterpret_cast<jarray>(o170)));
1317 EXPECT_EQ(171, env->GetArrayLength(reinterpret_cast<jarray>(o171)));
1318 EXPECT_EQ(172, env->GetArrayLength(reinterpret_cast<jarray>(o172)));
1319 EXPECT_EQ(173, env->GetArrayLength(reinterpret_cast<jarray>(o173)));
1320 EXPECT_EQ(174, env->GetArrayLength(reinterpret_cast<jarray>(o174)));
1321 EXPECT_EQ(175, env->GetArrayLength(reinterpret_cast<jarray>(o175)));
1322 EXPECT_EQ(176, env->GetArrayLength(reinterpret_cast<jarray>(o176)));
1323 EXPECT_EQ(177, env->GetArrayLength(reinterpret_cast<jarray>(o177)));
1324 EXPECT_EQ(178, env->GetArrayLength(reinterpret_cast<jarray>(o178)));
1325 EXPECT_EQ(179, env->GetArrayLength(reinterpret_cast<jarray>(o179)));
1326 EXPECT_EQ(180, env->GetArrayLength(reinterpret_cast<jarray>(o180)));
1327 EXPECT_EQ(181, env->GetArrayLength(reinterpret_cast<jarray>(o181)));
1328 EXPECT_EQ(182, env->GetArrayLength(reinterpret_cast<jarray>(o182)));
1329 EXPECT_EQ(183, env->GetArrayLength(reinterpret_cast<jarray>(o183)));
1330 EXPECT_EQ(184, env->GetArrayLength(reinterpret_cast<jarray>(o184)));
1331 EXPECT_EQ(185, env->GetArrayLength(reinterpret_cast<jarray>(o185)));
1332 EXPECT_EQ(186, env->GetArrayLength(reinterpret_cast<jarray>(o186)));
1333 EXPECT_EQ(187, env->GetArrayLength(reinterpret_cast<jarray>(o187)));
1334 EXPECT_EQ(188, env->GetArrayLength(reinterpret_cast<jarray>(o188)));
1335 EXPECT_EQ(189, env->GetArrayLength(reinterpret_cast<jarray>(o189)));
1336 EXPECT_EQ(190, env->GetArrayLength(reinterpret_cast<jarray>(o190)));
1337 EXPECT_EQ(191, env->GetArrayLength(reinterpret_cast<jarray>(o191)));
1338 EXPECT_EQ(192, env->GetArrayLength(reinterpret_cast<jarray>(o192)));
1339 EXPECT_EQ(193, env->GetArrayLength(reinterpret_cast<jarray>(o193)));
1340 EXPECT_EQ(194, env->GetArrayLength(reinterpret_cast<jarray>(o194)));
1341 EXPECT_EQ(195, env->GetArrayLength(reinterpret_cast<jarray>(o195)));
1342 EXPECT_EQ(196, env->GetArrayLength(reinterpret_cast<jarray>(o196)));
1343 EXPECT_EQ(197, env->GetArrayLength(reinterpret_cast<jarray>(o197)));
1344 EXPECT_EQ(198, env->GetArrayLength(reinterpret_cast<jarray>(o198)));
1345 EXPECT_EQ(199, env->GetArrayLength(reinterpret_cast<jarray>(o199)));
1346 EXPECT_EQ(200, env->GetArrayLength(reinterpret_cast<jarray>(o200)));
1347 EXPECT_EQ(201, env->GetArrayLength(reinterpret_cast<jarray>(o201)));
1348 EXPECT_EQ(202, env->GetArrayLength(reinterpret_cast<jarray>(o202)));
1349 EXPECT_EQ(203, env->GetArrayLength(reinterpret_cast<jarray>(o203)));
1350 EXPECT_EQ(204, env->GetArrayLength(reinterpret_cast<jarray>(o204)));
1351 EXPECT_EQ(205, env->GetArrayLength(reinterpret_cast<jarray>(o205)));
1352 EXPECT_EQ(206, env->GetArrayLength(reinterpret_cast<jarray>(o206)));
1353 EXPECT_EQ(207, env->GetArrayLength(reinterpret_cast<jarray>(o207)));
1354 EXPECT_EQ(208, env->GetArrayLength(reinterpret_cast<jarray>(o208)));
1355 EXPECT_EQ(209, env->GetArrayLength(reinterpret_cast<jarray>(o209)));
1356 EXPECT_EQ(210, env->GetArrayLength(reinterpret_cast<jarray>(o210)));
1357 EXPECT_EQ(211, env->GetArrayLength(reinterpret_cast<jarray>(o211)));
1358 EXPECT_EQ(212, env->GetArrayLength(reinterpret_cast<jarray>(o212)));
1359 EXPECT_EQ(213, env->GetArrayLength(reinterpret_cast<jarray>(o213)));
1360 EXPECT_EQ(214, env->GetArrayLength(reinterpret_cast<jarray>(o214)));
1361 EXPECT_EQ(215, env->GetArrayLength(reinterpret_cast<jarray>(o215)));
1362 EXPECT_EQ(216, env->GetArrayLength(reinterpret_cast<jarray>(o216)));
1363 EXPECT_EQ(217, env->GetArrayLength(reinterpret_cast<jarray>(o217)));
1364 EXPECT_EQ(218, env->GetArrayLength(reinterpret_cast<jarray>(o218)));
1365 EXPECT_EQ(219, env->GetArrayLength(reinterpret_cast<jarray>(o219)));
1366 EXPECT_EQ(220, env->GetArrayLength(reinterpret_cast<jarray>(o220)));
1367 EXPECT_EQ(221, env->GetArrayLength(reinterpret_cast<jarray>(o221)));
1368 EXPECT_EQ(222, env->GetArrayLength(reinterpret_cast<jarray>(o222)));
1369 EXPECT_EQ(223, env->GetArrayLength(reinterpret_cast<jarray>(o223)));
1370 EXPECT_EQ(224, env->GetArrayLength(reinterpret_cast<jarray>(o224)));
1371 EXPECT_EQ(225, env->GetArrayLength(reinterpret_cast<jarray>(o225)));
1372 EXPECT_EQ(226, env->GetArrayLength(reinterpret_cast<jarray>(o226)));
1373 EXPECT_EQ(227, env->GetArrayLength(reinterpret_cast<jarray>(o227)));
1374 EXPECT_EQ(228, env->GetArrayLength(reinterpret_cast<jarray>(o228)));
1375 EXPECT_EQ(229, env->GetArrayLength(reinterpret_cast<jarray>(o229)));
1376 EXPECT_EQ(230, env->GetArrayLength(reinterpret_cast<jarray>(o230)));
1377 EXPECT_EQ(231, env->GetArrayLength(reinterpret_cast<jarray>(o231)));
1378 EXPECT_EQ(232, env->GetArrayLength(reinterpret_cast<jarray>(o232)));
1379 EXPECT_EQ(233, env->GetArrayLength(reinterpret_cast<jarray>(o233)));
1380 EXPECT_EQ(234, env->GetArrayLength(reinterpret_cast<jarray>(o234)));
1381 EXPECT_EQ(235, env->GetArrayLength(reinterpret_cast<jarray>(o235)));
1382 EXPECT_EQ(236, env->GetArrayLength(reinterpret_cast<jarray>(o236)));
1383 EXPECT_EQ(237, env->GetArrayLength(reinterpret_cast<jarray>(o237)));
1384 EXPECT_EQ(238, env->GetArrayLength(reinterpret_cast<jarray>(o238)));
1385 EXPECT_EQ(239, env->GetArrayLength(reinterpret_cast<jarray>(o239)));
1386 EXPECT_EQ(240, env->GetArrayLength(reinterpret_cast<jarray>(o240)));
1387 EXPECT_EQ(241, env->GetArrayLength(reinterpret_cast<jarray>(o241)));
1388 EXPECT_EQ(242, env->GetArrayLength(reinterpret_cast<jarray>(o242)));
1389 EXPECT_EQ(243, env->GetArrayLength(reinterpret_cast<jarray>(o243)));
1390 EXPECT_EQ(244, env->GetArrayLength(reinterpret_cast<jarray>(o244)));
1391 EXPECT_EQ(245, env->GetArrayLength(reinterpret_cast<jarray>(o245)));
1392 EXPECT_EQ(246, env->GetArrayLength(reinterpret_cast<jarray>(o246)));
1393 EXPECT_EQ(247, env->GetArrayLength(reinterpret_cast<jarray>(o247)));
1394 EXPECT_EQ(248, env->GetArrayLength(reinterpret_cast<jarray>(o248)));
1395 EXPECT_EQ(249, env->GetArrayLength(reinterpret_cast<jarray>(o249)));
1396 EXPECT_EQ(250, env->GetArrayLength(reinterpret_cast<jarray>(o250)));
1397 EXPECT_EQ(251, env->GetArrayLength(reinterpret_cast<jarray>(o251)));
1398 EXPECT_EQ(252, env->GetArrayLength(reinterpret_cast<jarray>(o252)));
1399 EXPECT_EQ(253, env->GetArrayLength(reinterpret_cast<jarray>(o253)));
1400 }
1401}
1402
1403const char* longSig =
1404 "(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1405 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1406 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1407 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1408 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1409 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1410 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1411 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1412 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1413 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1414 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1415 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1416 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1417 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1418 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
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;)V";
1455
Andreas Gampe6e498692014-08-18 16:43:12 -07001456void JniCompilerTest::MaxParamNumberImpl() {
Andreas Gampe7a0e5042014-03-07 13:03:19 -08001457 SetUpForTest(false, "maxParamNumber", longSig,
1458 reinterpret_cast<void*>(&Java_MyClassNatives_maxParamNumber));
1459
1460 jvalue args[254];
1461
1462 // First test: test with all arguments null.
1463 for (int i = 0; i < 254; ++i) {
1464 args[i].l = nullptr;
1465 }
1466
1467 env_->CallNonvirtualVoidMethodA(jobj_, jklass_, jmethod_, args);
1468
1469 // Second test: test with int[] objects with increasing lengths
1470 for (int i = 0; i < 254; ++i) {
1471 jintArray tmp = env_->NewIntArray(i);
1472 args[i].l = tmp;
1473 EXPECT_NE(args[i].l, nullptr);
1474 }
1475
1476 env_->CallNonvirtualVoidMethodA(jobj_, jklass_, jmethod_, args);
1477}
1478
Andreas Gampe6e498692014-08-18 16:43:12 -07001479JNI_TEST(MaxParamNumber)
1480
1481void JniCompilerTest::WithoutImplementationImpl() {
Andreas Gampe369810a2015-01-14 19:53:31 -08001482 // This will lead to error messages in the log.
1483 ScopedLogSeverity sls(LogSeverity::FATAL);
1484
Andreas Gampead615172014-04-04 16:20:13 -07001485 SetUpForTest(false, "withoutImplementation", "()V", nullptr);
1486
1487 env_->CallVoidMethod(jobj_, jmethod_);
1488
1489 EXPECT_TRUE(Thread::Current()->IsExceptionPending());
1490 EXPECT_TRUE(env_->ExceptionCheck() == JNI_TRUE);
1491}
1492
Andreas Gampe6e498692014-08-18 16:43:12 -07001493JNI_TEST(WithoutImplementation)
1494
Andreas Gampe48ee3562015-04-10 19:57:29 -07001495void JniCompilerTest::WithoutImplementationRefReturnImpl() {
1496 // This will lead to error messages in the log.
1497 ScopedLogSeverity sls(LogSeverity::FATAL);
1498
1499 SetUpForTest(false, "withoutImplementationRefReturn", "()Ljava/lang/Object;", nullptr);
1500
1501 env_->CallObjectMethod(jobj_, jmethod_);
1502
1503 EXPECT_TRUE(Thread::Current()->IsExceptionPending());
1504 EXPECT_TRUE(env_->ExceptionCheck() == JNI_TRUE);
1505}
1506
1507JNI_TEST(WithoutImplementationRefReturn)
1508
Ian Rogers6a3c1fc2014-10-31 00:33:20 -07001509void Java_MyClassNatives_stackArgsIntsFirst(JNIEnv*, jclass, jint i1, jint i2, jint i3,
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001510 jint i4, jint i5, jint i6, jint i7, jint i8, jint i9,
1511 jint i10, jfloat f1, jfloat f2, jfloat f3, jfloat f4,
1512 jfloat f5, jfloat f6, jfloat f7, jfloat f8, jfloat f9,
1513 jfloat f10) {
1514 EXPECT_EQ(i1, 1);
1515 EXPECT_EQ(i2, 2);
1516 EXPECT_EQ(i3, 3);
1517 EXPECT_EQ(i4, 4);
1518 EXPECT_EQ(i5, 5);
1519 EXPECT_EQ(i6, 6);
1520 EXPECT_EQ(i7, 7);
1521 EXPECT_EQ(i8, 8);
1522 EXPECT_EQ(i9, 9);
1523 EXPECT_EQ(i10, 10);
1524
Roland Levillainda4d79b2015-03-24 14:36:11 +00001525 jint i11 = bit_cast<jint, jfloat>(f1);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001526 EXPECT_EQ(i11, 11);
Roland Levillainda4d79b2015-03-24 14:36:11 +00001527 jint i12 = bit_cast<jint, jfloat>(f2);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001528 EXPECT_EQ(i12, 12);
Roland Levillainda4d79b2015-03-24 14:36:11 +00001529 jint i13 = bit_cast<jint, jfloat>(f3);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001530 EXPECT_EQ(i13, 13);
Roland Levillainda4d79b2015-03-24 14:36:11 +00001531 jint i14 = bit_cast<jint, jfloat>(f4);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001532 EXPECT_EQ(i14, 14);
Roland Levillainda4d79b2015-03-24 14:36:11 +00001533 jint i15 = bit_cast<jint, jfloat>(f5);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001534 EXPECT_EQ(i15, 15);
Roland Levillainda4d79b2015-03-24 14:36:11 +00001535 jint i16 = bit_cast<jint, jfloat>(f6);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001536 EXPECT_EQ(i16, 16);
Roland Levillainda4d79b2015-03-24 14:36:11 +00001537 jint i17 = bit_cast<jint, jfloat>(f7);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001538 EXPECT_EQ(i17, 17);
Roland Levillainda4d79b2015-03-24 14:36:11 +00001539 jint i18 = bit_cast<jint, jfloat>(f8);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001540 EXPECT_EQ(i18, 18);
Roland Levillainda4d79b2015-03-24 14:36:11 +00001541 jint i19 = bit_cast<jint, jfloat>(f9);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001542 EXPECT_EQ(i19, 19);
Roland Levillainda4d79b2015-03-24 14:36:11 +00001543 jint i20 = bit_cast<jint, jfloat>(f10);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001544 EXPECT_EQ(i20, 20);
1545}
1546
Andreas Gampe6e498692014-08-18 16:43:12 -07001547void JniCompilerTest::StackArgsIntsFirstImpl() {
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001548 SetUpForTest(true, "stackArgsIntsFirst", "(IIIIIIIIIIFFFFFFFFFF)V",
1549 reinterpret_cast<void*>(&Java_MyClassNatives_stackArgsIntsFirst));
1550
1551 jint i1 = 1;
1552 jint i2 = 2;
1553 jint i3 = 3;
1554 jint i4 = 4;
1555 jint i5 = 5;
1556 jint i6 = 6;
1557 jint i7 = 7;
1558 jint i8 = 8;
1559 jint i9 = 9;
1560 jint i10 = 10;
1561
Roland Levillainda4d79b2015-03-24 14:36:11 +00001562 jfloat f1 = bit_cast<jfloat, jint>(11);
1563 jfloat f2 = bit_cast<jfloat, jint>(12);
1564 jfloat f3 = bit_cast<jfloat, jint>(13);
1565 jfloat f4 = bit_cast<jfloat, jint>(14);
1566 jfloat f5 = bit_cast<jfloat, jint>(15);
1567 jfloat f6 = bit_cast<jfloat, jint>(16);
1568 jfloat f7 = bit_cast<jfloat, jint>(17);
1569 jfloat f8 = bit_cast<jfloat, jint>(18);
1570 jfloat f9 = bit_cast<jfloat, jint>(19);
1571 jfloat f10 = bit_cast<jfloat, jint>(20);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001572
1573 env_->CallStaticVoidMethod(jklass_, jmethod_, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, f1, f2,
1574 f3, f4, f5, f6, f7, f8, f9, f10);
1575}
1576
Andreas Gampe6e498692014-08-18 16:43:12 -07001577JNI_TEST(StackArgsIntsFirst)
1578
Ian Rogers6a3c1fc2014-10-31 00:33:20 -07001579void Java_MyClassNatives_stackArgsFloatsFirst(JNIEnv*, jclass, jfloat f1, jfloat f2,
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001580 jfloat f3, jfloat f4, jfloat f5, jfloat f6, jfloat f7,
1581 jfloat f8, jfloat f9, jfloat f10, jint i1, jint i2,
1582 jint i3, jint i4, jint i5, jint i6, jint i7, jint i8,
1583 jint i9, jint i10) {
1584 EXPECT_EQ(i1, 1);
1585 EXPECT_EQ(i2, 2);
1586 EXPECT_EQ(i3, 3);
1587 EXPECT_EQ(i4, 4);
1588 EXPECT_EQ(i5, 5);
1589 EXPECT_EQ(i6, 6);
1590 EXPECT_EQ(i7, 7);
1591 EXPECT_EQ(i8, 8);
1592 EXPECT_EQ(i9, 9);
1593 EXPECT_EQ(i10, 10);
1594
Roland Levillainda4d79b2015-03-24 14:36:11 +00001595 jint i11 = bit_cast<jint, jfloat>(f1);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001596 EXPECT_EQ(i11, 11);
Roland Levillainda4d79b2015-03-24 14:36:11 +00001597 jint i12 = bit_cast<jint, jfloat>(f2);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001598 EXPECT_EQ(i12, 12);
Roland Levillainda4d79b2015-03-24 14:36:11 +00001599 jint i13 = bit_cast<jint, jfloat>(f3);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001600 EXPECT_EQ(i13, 13);
Roland Levillainda4d79b2015-03-24 14:36:11 +00001601 jint i14 = bit_cast<jint, jfloat>(f4);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001602 EXPECT_EQ(i14, 14);
Roland Levillainda4d79b2015-03-24 14:36:11 +00001603 jint i15 = bit_cast<jint, jfloat>(f5);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001604 EXPECT_EQ(i15, 15);
Roland Levillainda4d79b2015-03-24 14:36:11 +00001605 jint i16 = bit_cast<jint, jfloat>(f6);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001606 EXPECT_EQ(i16, 16);
Roland Levillainda4d79b2015-03-24 14:36:11 +00001607 jint i17 = bit_cast<jint, jfloat>(f7);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001608 EXPECT_EQ(i17, 17);
Roland Levillainda4d79b2015-03-24 14:36:11 +00001609 jint i18 = bit_cast<jint, jfloat>(f8);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001610 EXPECT_EQ(i18, 18);
Roland Levillainda4d79b2015-03-24 14:36:11 +00001611 jint i19 = bit_cast<jint, jfloat>(f9);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001612 EXPECT_EQ(i19, 19);
Roland Levillainda4d79b2015-03-24 14:36:11 +00001613 jint i20 = bit_cast<jint, jfloat>(f10);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001614 EXPECT_EQ(i20, 20);
1615}
1616
Andreas Gampe6e498692014-08-18 16:43:12 -07001617void JniCompilerTest::StackArgsFloatsFirstImpl() {
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001618 SetUpForTest(true, "stackArgsFloatsFirst", "(FFFFFFFFFFIIIIIIIIII)V",
1619 reinterpret_cast<void*>(&Java_MyClassNatives_stackArgsFloatsFirst));
1620
1621 jint i1 = 1;
1622 jint i2 = 2;
1623 jint i3 = 3;
1624 jint i4 = 4;
1625 jint i5 = 5;
1626 jint i6 = 6;
1627 jint i7 = 7;
1628 jint i8 = 8;
1629 jint i9 = 9;
1630 jint i10 = 10;
1631
Roland Levillainda4d79b2015-03-24 14:36:11 +00001632 jfloat f1 = bit_cast<jfloat, jint>(11);
1633 jfloat f2 = bit_cast<jfloat, jint>(12);
1634 jfloat f3 = bit_cast<jfloat, jint>(13);
1635 jfloat f4 = bit_cast<jfloat, jint>(14);
1636 jfloat f5 = bit_cast<jfloat, jint>(15);
1637 jfloat f6 = bit_cast<jfloat, jint>(16);
1638 jfloat f7 = bit_cast<jfloat, jint>(17);
1639 jfloat f8 = bit_cast<jfloat, jint>(18);
1640 jfloat f9 = bit_cast<jfloat, jint>(19);
1641 jfloat f10 = bit_cast<jfloat, jint>(20);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001642
1643 env_->CallStaticVoidMethod(jklass_, jmethod_, f1, f2, f3, f4, f5, f6, f7, f8, f9, f10, i1, i2, i3,
1644 i4, i5, i6, i7, i8, i9, i10);
1645}
1646
Andreas Gampe6e498692014-08-18 16:43:12 -07001647JNI_TEST(StackArgsFloatsFirst)
1648
Ian Rogers6a3c1fc2014-10-31 00:33:20 -07001649void Java_MyClassNatives_stackArgsMixed(JNIEnv*, jclass, jint i1, jfloat f1, jint i2,
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001650 jfloat f2, jint i3, jfloat f3, jint i4, jfloat f4, jint i5,
1651 jfloat f5, jint i6, jfloat f6, jint i7, jfloat f7, jint i8,
1652 jfloat f8, jint i9, jfloat f9, jint i10, jfloat f10) {
1653 EXPECT_EQ(i1, 1);
1654 EXPECT_EQ(i2, 2);
1655 EXPECT_EQ(i3, 3);
1656 EXPECT_EQ(i4, 4);
1657 EXPECT_EQ(i5, 5);
1658 EXPECT_EQ(i6, 6);
1659 EXPECT_EQ(i7, 7);
1660 EXPECT_EQ(i8, 8);
1661 EXPECT_EQ(i9, 9);
1662 EXPECT_EQ(i10, 10);
1663
Roland Levillainda4d79b2015-03-24 14:36:11 +00001664 jint i11 = bit_cast<jint, jfloat>(f1);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001665 EXPECT_EQ(i11, 11);
Roland Levillainda4d79b2015-03-24 14:36:11 +00001666 jint i12 = bit_cast<jint, jfloat>(f2);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001667 EXPECT_EQ(i12, 12);
Roland Levillainda4d79b2015-03-24 14:36:11 +00001668 jint i13 = bit_cast<jint, jfloat>(f3);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001669 EXPECT_EQ(i13, 13);
Roland Levillainda4d79b2015-03-24 14:36:11 +00001670 jint i14 = bit_cast<jint, jfloat>(f4);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001671 EXPECT_EQ(i14, 14);
Roland Levillainda4d79b2015-03-24 14:36:11 +00001672 jint i15 = bit_cast<jint, jfloat>(f5);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001673 EXPECT_EQ(i15, 15);
Roland Levillainda4d79b2015-03-24 14:36:11 +00001674 jint i16 = bit_cast<jint, jfloat>(f6);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001675 EXPECT_EQ(i16, 16);
Roland Levillainda4d79b2015-03-24 14:36:11 +00001676 jint i17 = bit_cast<jint, jfloat>(f7);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001677 EXPECT_EQ(i17, 17);
Roland Levillainda4d79b2015-03-24 14:36:11 +00001678 jint i18 = bit_cast<jint, jfloat>(f8);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001679 EXPECT_EQ(i18, 18);
Roland Levillainda4d79b2015-03-24 14:36:11 +00001680 jint i19 = bit_cast<jint, jfloat>(f9);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001681 EXPECT_EQ(i19, 19);
Roland Levillainda4d79b2015-03-24 14:36:11 +00001682 jint i20 = bit_cast<jint, jfloat>(f10);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001683 EXPECT_EQ(i20, 20);
1684}
1685
Andreas Gampe6e498692014-08-18 16:43:12 -07001686void JniCompilerTest::StackArgsMixedImpl() {
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001687 SetUpForTest(true, "stackArgsMixed", "(IFIFIFIFIFIFIFIFIFIF)V",
1688 reinterpret_cast<void*>(&Java_MyClassNatives_stackArgsMixed));
1689
1690 jint i1 = 1;
1691 jint i2 = 2;
1692 jint i3 = 3;
1693 jint i4 = 4;
1694 jint i5 = 5;
1695 jint i6 = 6;
1696 jint i7 = 7;
1697 jint i8 = 8;
1698 jint i9 = 9;
1699 jint i10 = 10;
1700
Roland Levillainda4d79b2015-03-24 14:36:11 +00001701 jfloat f1 = bit_cast<jfloat, jint>(11);
1702 jfloat f2 = bit_cast<jfloat, jint>(12);
1703 jfloat f3 = bit_cast<jfloat, jint>(13);
1704 jfloat f4 = bit_cast<jfloat, jint>(14);
1705 jfloat f5 = bit_cast<jfloat, jint>(15);
1706 jfloat f6 = bit_cast<jfloat, jint>(16);
1707 jfloat f7 = bit_cast<jfloat, jint>(17);
1708 jfloat f8 = bit_cast<jfloat, jint>(18);
1709 jfloat f9 = bit_cast<jfloat, jint>(19);
1710 jfloat f10 = bit_cast<jfloat, jint>(20);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001711
1712 env_->CallStaticVoidMethod(jklass_, jmethod_, i1, f1, i2, f2, i3, f3, i4, f4, i5, f5, i6, f6, i7,
1713 f7, i8, f8, i9, f9, i10, f10);
1714}
1715
Andreas Gampe6e498692014-08-18 16:43:12 -07001716JNI_TEST(StackArgsMixed)
1717
Ian Rogersb033c752011-07-20 12:22:35 -07001718} // namespace art