blob: f3bda2fa728ae4fb8786f143d7df8a3327675616 [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();
Lazar Trsicf652d602015-06-24 16:30:21 +0200168 void StackArgsSignExtendedMips64Impl();
Andreas Gampe6e498692014-08-18 16:43:12 -0700169
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700170 JNIEnv* env_;
171 jmethodID jmethod_;
Andreas Gampe6e498692014-08-18 16:43:12 -0700172 bool check_generic_jni_;
Ian Rogersb033c752011-07-20 12:22:35 -0700173};
174
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700175jclass JniCompilerTest::jklass_;
176jobject JniCompilerTest::jobj_;
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700177jobject JniCompilerTest::class_loader_;
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700178
Andreas Gampe6e498692014-08-18 16:43:12 -0700179#define JNI_TEST(TestName) \
180 TEST_F(JniCompilerTest, TestName ## Default) { \
181 TestName ## Impl(); \
182 } \
183 \
184 TEST_F(JniCompilerTest, TestName ## Generic) { \
185 TEST_DISABLED_FOR_MIPS(); \
186 SetCheckGenericJni(true); \
187 TestName ## Impl(); \
188 }
Andreas Gampecf4035a2014-05-28 22:43:01 -0700189
Elliott Hughesb264f082012-04-06 17:10:10 -0700190int gJava_MyClassNatives_foo_calls = 0;
191void Java_MyClassNatives_foo(JNIEnv* env, jobject thisObj) {
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700192 // 1 = thisObj
Ian Rogers50b35e22012-10-04 10:09:15 -0700193 EXPECT_EQ(kNative, Thread::Current()->GetState());
194 Locks::mutator_lock_->AssertNotHeld(Thread::Current());
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700195 EXPECT_EQ(Thread::Current()->GetJniEnv(), env);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700196 EXPECT_TRUE(thisObj != nullptr);
Ian Rogersa8cd9f42011-08-19 16:43:41 -0700197 EXPECT_TRUE(env->IsInstanceOf(thisObj, JniCompilerTest::jklass_));
Elliott Hughesb264f082012-04-06 17:10:10 -0700198 gJava_MyClassNatives_foo_calls++;
Ian Rogersef7d42f2014-01-06 12:55:46 -0800199 ScopedObjectAccess soa(Thread::Current());
200 EXPECT_EQ(1U, Thread::Current()->NumStackReferences());
Ian Rogersb033c752011-07-20 12:22:35 -0700201}
202
Andreas Gampe6e498692014-08-18 16:43:12 -0700203void JniCompilerTest::CompileAndRunNoArgMethodImpl() {
Ian Rogersef7d42f2014-01-06 12:55:46 -0800204 SetUpForTest(false, "foo", "()V", reinterpret_cast<void*>(&Java_MyClassNatives_foo));
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700205
Elliott Hughesb264f082012-04-06 17:10:10 -0700206 EXPECT_EQ(0, gJava_MyClassNatives_foo_calls);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700207 env_->CallNonvirtualVoidMethod(jobj_, jklass_, jmethod_);
Elliott Hughesb264f082012-04-06 17:10:10 -0700208 EXPECT_EQ(1, gJava_MyClassNatives_foo_calls);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700209 env_->CallNonvirtualVoidMethod(jobj_, jklass_, jmethod_);
Elliott Hughesb264f082012-04-06 17:10:10 -0700210 EXPECT_EQ(2, gJava_MyClassNatives_foo_calls);
Andreas Gampe6e498692014-08-18 16:43:12 -0700211
212 gJava_MyClassNatives_foo_calls = 0;
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700213}
214
Andreas Gampe6e498692014-08-18 16:43:12 -0700215JNI_TEST(CompileAndRunNoArgMethod)
216
217void JniCompilerTest::CompileAndRunIntMethodThroughStubImpl() {
Andreas Gampecf4035a2014-05-28 22:43:01 -0700218 SetUpForTest(false, "bar", "(I)I", nullptr);
219 // calling through stub will link with &Java_MyClassNatives_bar
Shih-wei Liao31384c52011-09-06 15:27:45 -0700220
Shih-wei Liao31384c52011-09-06 15:27:45 -0700221 std::string reason;
Ian Rogers68d8b422014-07-17 11:09:10 -0700222 ASSERT_TRUE(Runtime::Current()->GetJavaVM()->LoadNativeLibrary(env_, "", class_loader_, &reason))
223 << reason;
Shih-wei Liao31384c52011-09-06 15:27:45 -0700224
225 jint result = env_->CallNonvirtualIntMethod(jobj_, jklass_, jmethod_, 24);
226 EXPECT_EQ(25, result);
227}
228
Andreas Gampe6e498692014-08-18 16:43:12 -0700229JNI_TEST(CompileAndRunIntMethodThroughStub)
230
231void JniCompilerTest::CompileAndRunStaticIntMethodThroughStubImpl() {
Andreas Gampecf4035a2014-05-28 22:43:01 -0700232 SetUpForTest(true, "sbar", "(I)I", nullptr);
233 // calling through stub will link with &Java_MyClassNatives_sbar
Ian Rogers1cefdbd2012-02-29 09:34:50 -0800234
235 std::string reason;
Ian Rogers68d8b422014-07-17 11:09:10 -0700236 ASSERT_TRUE(Runtime::Current()->GetJavaVM()->LoadNativeLibrary(env_, "", class_loader_, &reason))
237 << reason;
Ian Rogers1cefdbd2012-02-29 09:34:50 -0800238
239 jint result = env_->CallStaticIntMethod(jklass_, jmethod_, 42);
240 EXPECT_EQ(43, result);
241}
242
Andreas Gampe6e498692014-08-18 16:43:12 -0700243JNI_TEST(CompileAndRunStaticIntMethodThroughStub)
244
Elliott Hughesb264f082012-04-06 17:10:10 -0700245int gJava_MyClassNatives_fooI_calls = 0;
246jint Java_MyClassNatives_fooI(JNIEnv* env, jobject thisObj, jint x) {
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700247 // 1 = thisObj
Ian Rogers50b35e22012-10-04 10:09:15 -0700248 EXPECT_EQ(kNative, Thread::Current()->GetState());
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700249 EXPECT_EQ(Thread::Current()->GetJniEnv(), env);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700250 EXPECT_TRUE(thisObj != nullptr);
Ian Rogersa8cd9f42011-08-19 16:43:41 -0700251 EXPECT_TRUE(env->IsInstanceOf(thisObj, JniCompilerTest::jklass_));
Elliott Hughesb264f082012-04-06 17:10:10 -0700252 gJava_MyClassNatives_fooI_calls++;
Ian Rogersef7d42f2014-01-06 12:55:46 -0800253 ScopedObjectAccess soa(Thread::Current());
254 EXPECT_EQ(1U, Thread::Current()->NumStackReferences());
Ian Rogersb033c752011-07-20 12:22:35 -0700255 return x;
256}
257
Andreas Gampe6e498692014-08-18 16:43:12 -0700258void JniCompilerTest::CompileAndRunIntMethodImpl() {
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700259 SetUpForTest(false, "fooI", "(I)I",
Elliott Hughesb264f082012-04-06 17:10:10 -0700260 reinterpret_cast<void*>(&Java_MyClassNatives_fooI));
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700261
Elliott Hughesb264f082012-04-06 17:10:10 -0700262 EXPECT_EQ(0, gJava_MyClassNatives_fooI_calls);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700263 jint result = env_->CallNonvirtualIntMethod(jobj_, jklass_, jmethod_, 42);
264 EXPECT_EQ(42, result);
Elliott Hughesb264f082012-04-06 17:10:10 -0700265 EXPECT_EQ(1, gJava_MyClassNatives_fooI_calls);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700266 result = env_->CallNonvirtualIntMethod(jobj_, jklass_, jmethod_, 0xCAFED00D);
267 EXPECT_EQ(static_cast<jint>(0xCAFED00D), result);
Elliott Hughesb264f082012-04-06 17:10:10 -0700268 EXPECT_EQ(2, gJava_MyClassNatives_fooI_calls);
Andreas Gampe6e498692014-08-18 16:43:12 -0700269
270 gJava_MyClassNatives_fooI_calls = 0;
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700271}
272
Andreas Gampe6e498692014-08-18 16:43:12 -0700273JNI_TEST(CompileAndRunIntMethod)
274
Elliott Hughesb264f082012-04-06 17:10:10 -0700275int gJava_MyClassNatives_fooII_calls = 0;
276jint Java_MyClassNatives_fooII(JNIEnv* env, jobject thisObj, jint x, jint y) {
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700277 // 1 = thisObj
Ian Rogers50b35e22012-10-04 10:09:15 -0700278 EXPECT_EQ(kNative, Thread::Current()->GetState());
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700279 EXPECT_EQ(Thread::Current()->GetJniEnv(), env);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700280 EXPECT_TRUE(thisObj != nullptr);
Ian Rogersa8cd9f42011-08-19 16:43:41 -0700281 EXPECT_TRUE(env->IsInstanceOf(thisObj, JniCompilerTest::jklass_));
Elliott Hughesb264f082012-04-06 17:10:10 -0700282 gJava_MyClassNatives_fooII_calls++;
Ian Rogersef7d42f2014-01-06 12:55:46 -0800283 ScopedObjectAccess soa(Thread::Current());
284 EXPECT_EQ(1U, Thread::Current()->NumStackReferences());
Ian Rogersb033c752011-07-20 12:22:35 -0700285 return x - y; // non-commutative operator
286}
287
Andreas Gampe6e498692014-08-18 16:43:12 -0700288void JniCompilerTest::CompileAndRunIntIntMethodImpl() {
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700289 SetUpForTest(false, "fooII", "(II)I",
Elliott Hughesb264f082012-04-06 17:10:10 -0700290 reinterpret_cast<void*>(&Java_MyClassNatives_fooII));
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700291
Elliott Hughesb264f082012-04-06 17:10:10 -0700292 EXPECT_EQ(0, gJava_MyClassNatives_fooII_calls);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700293 jint result = env_->CallNonvirtualIntMethod(jobj_, jklass_, jmethod_, 99, 10);
294 EXPECT_EQ(99 - 10, result);
Elliott Hughesb264f082012-04-06 17:10:10 -0700295 EXPECT_EQ(1, gJava_MyClassNatives_fooII_calls);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700296 result = env_->CallNonvirtualIntMethod(jobj_, jklass_, jmethod_, 0xCAFEBABE,
297 0xCAFED00D);
298 EXPECT_EQ(static_cast<jint>(0xCAFEBABE - 0xCAFED00D), result);
Elliott Hughesb264f082012-04-06 17:10:10 -0700299 EXPECT_EQ(2, gJava_MyClassNatives_fooII_calls);
Andreas Gampe6e498692014-08-18 16:43:12 -0700300
301 gJava_MyClassNatives_fooII_calls = 0;
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700302}
303
Andreas Gampe6e498692014-08-18 16:43:12 -0700304JNI_TEST(CompileAndRunIntIntMethod)
305
Elliott Hughesb264f082012-04-06 17:10:10 -0700306int gJava_MyClassNatives_fooJJ_calls = 0;
307jlong Java_MyClassNatives_fooJJ(JNIEnv* env, jobject thisObj, jlong x, jlong y) {
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700308 // 1 = thisObj
Ian Rogers50b35e22012-10-04 10:09:15 -0700309 EXPECT_EQ(kNative, Thread::Current()->GetState());
Ian Rogers9b269d22011-09-04 14:06:05 -0700310 EXPECT_EQ(Thread::Current()->GetJniEnv(), env);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700311 EXPECT_TRUE(thisObj != nullptr);
Ian Rogers9b269d22011-09-04 14:06:05 -0700312 EXPECT_TRUE(env->IsInstanceOf(thisObj, JniCompilerTest::jklass_));
Elliott Hughesb264f082012-04-06 17:10:10 -0700313 gJava_MyClassNatives_fooJJ_calls++;
Ian Rogersef7d42f2014-01-06 12:55:46 -0800314 ScopedObjectAccess soa(Thread::Current());
315 EXPECT_EQ(1U, Thread::Current()->NumStackReferences());
Ian Rogers9b269d22011-09-04 14:06:05 -0700316 return x - y; // non-commutative operator
317}
318
Andreas Gampe6e498692014-08-18 16:43:12 -0700319void JniCompilerTest::CompileAndRunLongLongMethodImpl() {
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700320 SetUpForTest(false, "fooJJ", "(JJ)J",
Elliott Hughesb264f082012-04-06 17:10:10 -0700321 reinterpret_cast<void*>(&Java_MyClassNatives_fooJJ));
Ian Rogers9b269d22011-09-04 14:06:05 -0700322
Elliott Hughesb264f082012-04-06 17:10:10 -0700323 EXPECT_EQ(0, gJava_MyClassNatives_fooJJ_calls);
Ian Rogers0f678472014-03-10 16:18:37 -0700324 jlong a = INT64_C(0x1234567890ABCDEF);
325 jlong b = INT64_C(0xFEDCBA0987654321);
Ian Rogers9b269d22011-09-04 14:06:05 -0700326 jlong result = env_->CallNonvirtualLongMethod(jobj_, jklass_, jmethod_, a, b);
327 EXPECT_EQ(a - b, result);
Elliott Hughesb264f082012-04-06 17:10:10 -0700328 EXPECT_EQ(1, gJava_MyClassNatives_fooJJ_calls);
Ian Rogers9b269d22011-09-04 14:06:05 -0700329 result = env_->CallNonvirtualLongMethod(jobj_, jklass_, jmethod_, b, a);
330 EXPECT_EQ(b - a, result);
Elliott Hughesb264f082012-04-06 17:10:10 -0700331 EXPECT_EQ(2, gJava_MyClassNatives_fooJJ_calls);
Andreas Gampe6e498692014-08-18 16:43:12 -0700332
333 gJava_MyClassNatives_fooJJ_calls = 0;
Ian Rogers9b269d22011-09-04 14:06:05 -0700334}
335
Andreas Gampe6e498692014-08-18 16:43:12 -0700336JNI_TEST(CompileAndRunLongLongMethod)
337
Elliott Hughesb264f082012-04-06 17:10:10 -0700338int gJava_MyClassNatives_fooDD_calls = 0;
339jdouble Java_MyClassNatives_fooDD(JNIEnv* env, jobject thisObj, jdouble x, jdouble y) {
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700340 // 1 = thisObj
Ian Rogers50b35e22012-10-04 10:09:15 -0700341 EXPECT_EQ(kNative, Thread::Current()->GetState());
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700342 EXPECT_EQ(Thread::Current()->GetJniEnv(), env);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700343 EXPECT_TRUE(thisObj != nullptr);
Ian Rogersa8cd9f42011-08-19 16:43:41 -0700344 EXPECT_TRUE(env->IsInstanceOf(thisObj, JniCompilerTest::jklass_));
Elliott Hughesb264f082012-04-06 17:10:10 -0700345 gJava_MyClassNatives_fooDD_calls++;
Ian Rogersef7d42f2014-01-06 12:55:46 -0800346 ScopedObjectAccess soa(Thread::Current());
347 EXPECT_EQ(1U, Thread::Current()->NumStackReferences());
Ian Rogersb033c752011-07-20 12:22:35 -0700348 return x - y; // non-commutative operator
349}
350
Andreas Gampe6e498692014-08-18 16:43:12 -0700351void JniCompilerTest::CompileAndRunDoubleDoubleMethodImpl() {
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700352 SetUpForTest(false, "fooDD", "(DD)D",
Elliott Hughesb264f082012-04-06 17:10:10 -0700353 reinterpret_cast<void*>(&Java_MyClassNatives_fooDD));
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700354
Elliott Hughesb264f082012-04-06 17:10:10 -0700355 EXPECT_EQ(0, gJava_MyClassNatives_fooDD_calls);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700356 jdouble result = env_->CallNonvirtualDoubleMethod(jobj_, jklass_, jmethod_,
357 99.0, 10.0);
Ian Rogers647b1a82014-10-10 11:02:11 -0700358 EXPECT_DOUBLE_EQ(99.0 - 10.0, result);
Elliott Hughesb264f082012-04-06 17:10:10 -0700359 EXPECT_EQ(1, gJava_MyClassNatives_fooDD_calls);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700360 jdouble a = 3.14159265358979323846;
361 jdouble b = 0.69314718055994530942;
362 result = env_->CallNonvirtualDoubleMethod(jobj_, jklass_, jmethod_, a, b);
Ian Rogers647b1a82014-10-10 11:02:11 -0700363 EXPECT_DOUBLE_EQ(a - b, result);
Elliott Hughesb264f082012-04-06 17:10:10 -0700364 EXPECT_EQ(2, gJava_MyClassNatives_fooDD_calls);
Andreas Gampe6e498692014-08-18 16:43:12 -0700365
366 gJava_MyClassNatives_fooDD_calls = 0;
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700367}
368
Elliott Hughes3e778f72012-05-21 15:29:52 -0700369int gJava_MyClassNatives_fooJJ_synchronized_calls = 0;
370jlong Java_MyClassNatives_fooJJ_synchronized(JNIEnv* env, jobject thisObj, jlong x, jlong y) {
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700371 // 1 = thisObj
Ian Rogers50b35e22012-10-04 10:09:15 -0700372 EXPECT_EQ(kNative, Thread::Current()->GetState());
Elliott Hughes3e778f72012-05-21 15:29:52 -0700373 EXPECT_EQ(Thread::Current()->GetJniEnv(), env);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700374 EXPECT_TRUE(thisObj != nullptr);
Elliott Hughes3e778f72012-05-21 15:29:52 -0700375 EXPECT_TRUE(env->IsInstanceOf(thisObj, JniCompilerTest::jklass_));
376 gJava_MyClassNatives_fooJJ_synchronized_calls++;
Ian Rogersef7d42f2014-01-06 12:55:46 -0800377 ScopedObjectAccess soa(Thread::Current());
378 EXPECT_EQ(1U, Thread::Current()->NumStackReferences());
Elliott Hughes3e778f72012-05-21 15:29:52 -0700379 return x | y;
380}
381
Andreas Gampe6e498692014-08-18 16:43:12 -0700382void JniCompilerTest::CompileAndRun_fooJJ_synchronizedImpl() {
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700383 SetUpForTest(false, "fooJJ_synchronized", "(JJ)J",
Elliott Hughes3e778f72012-05-21 15:29:52 -0700384 reinterpret_cast<void*>(&Java_MyClassNatives_fooJJ_synchronized));
385
386 EXPECT_EQ(0, gJava_MyClassNatives_fooJJ_synchronized_calls);
387 jlong a = 0x1000000020000000ULL;
388 jlong b = 0x00ff000000aa0000ULL;
389 jlong result = env_->CallNonvirtualLongMethod(jobj_, jklass_, jmethod_, a, b);
390 EXPECT_EQ(a | b, result);
391 EXPECT_EQ(1, gJava_MyClassNatives_fooJJ_synchronized_calls);
Andreas Gampe6e498692014-08-18 16:43:12 -0700392
393 gJava_MyClassNatives_fooJJ_synchronized_calls = 0;
Elliott Hughes3e778f72012-05-21 15:29:52 -0700394}
395
Andreas Gampe6e498692014-08-18 16:43:12 -0700396JNI_TEST(CompileAndRun_fooJJ_synchronized)
397
Elliott Hughesb264f082012-04-06 17:10:10 -0700398int gJava_MyClassNatives_fooIOO_calls = 0;
399jobject Java_MyClassNatives_fooIOO(JNIEnv* env, jobject thisObj, jint x, jobject y,
Ian Rogersb033c752011-07-20 12:22:35 -0700400 jobject z) {
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700401 // 3 = this + y + z
Ian Rogers50b35e22012-10-04 10:09:15 -0700402 EXPECT_EQ(kNative, Thread::Current()->GetState());
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700403 EXPECT_EQ(Thread::Current()->GetJniEnv(), env);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700404 EXPECT_TRUE(thisObj != nullptr);
Ian Rogersa8cd9f42011-08-19 16:43:41 -0700405 EXPECT_TRUE(env->IsInstanceOf(thisObj, JniCompilerTest::jklass_));
Elliott Hughesb264f082012-04-06 17:10:10 -0700406 gJava_MyClassNatives_fooIOO_calls++;
Ian Rogersef7d42f2014-01-06 12:55:46 -0800407 ScopedObjectAccess soa(Thread::Current());
Andreas Gampebf6b92a2014-03-05 16:11:04 -0800408 size_t null_args = (y == nullptr ? 1 : 0) + (z == nullptr ? 1 : 0);
409 EXPECT_TRUE(3U == Thread::Current()->NumStackReferences() ||
410 (3U - null_args) == Thread::Current()->NumStackReferences());
Ian Rogersb033c752011-07-20 12:22:35 -0700411 switch (x) {
412 case 1:
413 return y;
414 case 2:
415 return z;
416 default:
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700417 return thisObj;
Ian Rogersb033c752011-07-20 12:22:35 -0700418 }
419}
420
Andreas Gampe6e498692014-08-18 16:43:12 -0700421void JniCompilerTest::CompileAndRunIntObjectObjectMethodImpl() {
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700422 SetUpForTest(false, "fooIOO",
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700423 "(ILjava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;",
Elliott Hughesb264f082012-04-06 17:10:10 -0700424 reinterpret_cast<void*>(&Java_MyClassNatives_fooIOO));
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700425
Elliott Hughesb264f082012-04-06 17:10:10 -0700426 EXPECT_EQ(0, gJava_MyClassNatives_fooIOO_calls);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700427 jobject result = env_->CallNonvirtualObjectMethod(jobj_, jklass_, jmethod_, 0, nullptr, nullptr);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700428 EXPECT_TRUE(env_->IsSameObject(jobj_, result));
Elliott Hughesb264f082012-04-06 17:10:10 -0700429 EXPECT_EQ(1, gJava_MyClassNatives_fooIOO_calls);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700430
Andreas Gampecf4035a2014-05-28 22:43:01 -0700431 result = env_->CallNonvirtualObjectMethod(jobj_, jklass_, jmethod_, 0, nullptr, jklass_);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700432 EXPECT_TRUE(env_->IsSameObject(jobj_, result));
Elliott Hughesb264f082012-04-06 17:10:10 -0700433 EXPECT_EQ(2, gJava_MyClassNatives_fooIOO_calls);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700434 result = env_->CallNonvirtualObjectMethod(jobj_, jklass_, jmethod_, 1, nullptr, jklass_);
435 EXPECT_TRUE(env_->IsSameObject(nullptr, result));
Elliott Hughesb264f082012-04-06 17:10:10 -0700436 EXPECT_EQ(3, gJava_MyClassNatives_fooIOO_calls);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700437 result = env_->CallNonvirtualObjectMethod(jobj_, jklass_, jmethod_, 2, nullptr, jklass_);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700438 EXPECT_TRUE(env_->IsSameObject(jklass_, result));
Elliott Hughesb264f082012-04-06 17:10:10 -0700439 EXPECT_EQ(4, gJava_MyClassNatives_fooIOO_calls);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700440
Andreas Gampecf4035a2014-05-28 22:43:01 -0700441 result = env_->CallNonvirtualObjectMethod(jobj_, jklass_, jmethod_, 0, jklass_, nullptr);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700442 EXPECT_TRUE(env_->IsSameObject(jobj_, result));
Elliott Hughesb264f082012-04-06 17:10:10 -0700443 EXPECT_EQ(5, gJava_MyClassNatives_fooIOO_calls);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700444 result = env_->CallNonvirtualObjectMethod(jobj_, jklass_, jmethod_, 1, jklass_, nullptr);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700445 EXPECT_TRUE(env_->IsSameObject(jklass_, result));
Elliott Hughesb264f082012-04-06 17:10:10 -0700446 EXPECT_EQ(6, gJava_MyClassNatives_fooIOO_calls);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700447 result = env_->CallNonvirtualObjectMethod(jobj_, jklass_, jmethod_, 2, jklass_, nullptr);
448 EXPECT_TRUE(env_->IsSameObject(nullptr, result));
Elliott Hughesb264f082012-04-06 17:10:10 -0700449 EXPECT_EQ(7, gJava_MyClassNatives_fooIOO_calls);
Andreas Gampe6e498692014-08-18 16:43:12 -0700450
451 gJava_MyClassNatives_fooIOO_calls = 0;
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700452}
453
Andreas Gampe6e498692014-08-18 16:43:12 -0700454JNI_TEST(CompileAndRunIntObjectObjectMethod)
455
Elliott Hughesb264f082012-04-06 17:10:10 -0700456int gJava_MyClassNatives_fooSII_calls = 0;
457jint Java_MyClassNatives_fooSII(JNIEnv* env, jclass klass, jint x, jint y) {
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700458 // 1 = klass
Ian Rogers50b35e22012-10-04 10:09:15 -0700459 EXPECT_EQ(kNative, Thread::Current()->GetState());
Shih-wei Liao82da44b2011-09-01 00:38:04 -0700460 EXPECT_EQ(Thread::Current()->GetJniEnv(), env);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700461 EXPECT_TRUE(klass != nullptr);
Shih-wei Liao82da44b2011-09-01 00:38:04 -0700462 EXPECT_TRUE(env->IsInstanceOf(JniCompilerTest::jobj_, klass));
Elliott Hughesb264f082012-04-06 17:10:10 -0700463 gJava_MyClassNatives_fooSII_calls++;
Ian Rogersef7d42f2014-01-06 12:55:46 -0800464 ScopedObjectAccess soa(Thread::Current());
465 EXPECT_EQ(1U, Thread::Current()->NumStackReferences());
Shih-wei Liao82da44b2011-09-01 00:38:04 -0700466 return x + y;
467}
468
Andreas Gampe6e498692014-08-18 16:43:12 -0700469void JniCompilerTest::CompileAndRunStaticIntIntMethodImpl() {
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700470 SetUpForTest(true, "fooSII", "(II)I",
Elliott Hughesb264f082012-04-06 17:10:10 -0700471 reinterpret_cast<void*>(&Java_MyClassNatives_fooSII));
Shih-wei Liao82da44b2011-09-01 00:38:04 -0700472
Elliott Hughesb264f082012-04-06 17:10:10 -0700473 EXPECT_EQ(0, gJava_MyClassNatives_fooSII_calls);
Shih-wei Liao82da44b2011-09-01 00:38:04 -0700474 jint result = env_->CallStaticIntMethod(jklass_, jmethod_, 20, 30);
475 EXPECT_EQ(50, result);
Elliott Hughesb264f082012-04-06 17:10:10 -0700476 EXPECT_EQ(1, gJava_MyClassNatives_fooSII_calls);
Andreas Gampe6e498692014-08-18 16:43:12 -0700477
478 gJava_MyClassNatives_fooSII_calls = 0;
Shih-wei Liao82da44b2011-09-01 00:38:04 -0700479}
480
Andreas Gampe6e498692014-08-18 16:43:12 -0700481JNI_TEST(CompileAndRunStaticIntIntMethod)
482
Elliott Hughesb264f082012-04-06 17:10:10 -0700483int gJava_MyClassNatives_fooSDD_calls = 0;
484jdouble Java_MyClassNatives_fooSDD(JNIEnv* env, jclass klass, jdouble x, jdouble y) {
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700485 // 1 = klass
Ian Rogers50b35e22012-10-04 10:09:15 -0700486 EXPECT_EQ(kNative, Thread::Current()->GetState());
Ian Rogers7a99c112011-09-07 12:48:27 -0700487 EXPECT_EQ(Thread::Current()->GetJniEnv(), env);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700488 EXPECT_TRUE(klass != nullptr);
Ian Rogers7a99c112011-09-07 12:48:27 -0700489 EXPECT_TRUE(env->IsInstanceOf(JniCompilerTest::jobj_, klass));
Elliott Hughesb264f082012-04-06 17:10:10 -0700490 gJava_MyClassNatives_fooSDD_calls++;
Ian Rogersef7d42f2014-01-06 12:55:46 -0800491 ScopedObjectAccess soa(Thread::Current());
492 EXPECT_EQ(1U, Thread::Current()->NumStackReferences());
Ian Rogers7a99c112011-09-07 12:48:27 -0700493 return x - y; // non-commutative operator
494}
495
Andreas Gampe6e498692014-08-18 16:43:12 -0700496void JniCompilerTest::CompileAndRunStaticDoubleDoubleMethodImpl() {
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700497 SetUpForTest(true, "fooSDD", "(DD)D",
Elliott Hughesb264f082012-04-06 17:10:10 -0700498 reinterpret_cast<void*>(&Java_MyClassNatives_fooSDD));
Ian Rogers7a99c112011-09-07 12:48:27 -0700499
Elliott Hughesb264f082012-04-06 17:10:10 -0700500 EXPECT_EQ(0, gJava_MyClassNatives_fooSDD_calls);
Ian Rogers7a99c112011-09-07 12:48:27 -0700501 jdouble result = env_->CallStaticDoubleMethod(jklass_, jmethod_, 99.0, 10.0);
Ian Rogers647b1a82014-10-10 11:02:11 -0700502 EXPECT_DOUBLE_EQ(99.0 - 10.0, result);
Elliott Hughesb264f082012-04-06 17:10:10 -0700503 EXPECT_EQ(1, gJava_MyClassNatives_fooSDD_calls);
Ian Rogers7a99c112011-09-07 12:48:27 -0700504 jdouble a = 3.14159265358979323846;
505 jdouble b = 0.69314718055994530942;
506 result = env_->CallStaticDoubleMethod(jklass_, jmethod_, a, b);
Ian Rogers647b1a82014-10-10 11:02:11 -0700507 EXPECT_DOUBLE_EQ(a - b, result);
508 EXPECT_DOUBLE_EQ(2, gJava_MyClassNatives_fooSDD_calls);
Andreas Gampe6e498692014-08-18 16:43:12 -0700509
510 gJava_MyClassNatives_fooSDD_calls = 0;
Ian Rogers7a99c112011-09-07 12:48:27 -0700511}
512
Andreas Gampe6e498692014-08-18 16:43:12 -0700513JNI_TEST(CompileAndRunStaticDoubleDoubleMethod)
514
Nicolas Geoffray54accbc2014-08-13 03:40:45 +0100515// The x86 generic JNI code had a bug where it assumed a floating
516// point return value would be in xmm0. We use log, to somehow ensure
517// the compiler will use the floating point stack.
518
Ian Rogers6a3c1fc2014-10-31 00:33:20 -0700519jdouble Java_MyClassNatives_logD(JNIEnv*, jclass, jdouble x) {
Nicolas Geoffray54accbc2014-08-13 03:40:45 +0100520 return log(x);
521}
522
Andreas Gampe6e498692014-08-18 16:43:12 -0700523void JniCompilerTest::RunStaticLogDoubleMethodImpl() {
Andreas Gampe6e498692014-08-18 16:43:12 -0700524 SetUpForTest(true, "logD", "(D)D", reinterpret_cast<void*>(&Java_MyClassNatives_logD));
Nicolas Geoffray54accbc2014-08-13 03:40:45 +0100525
526 jdouble result = env_->CallStaticDoubleMethod(jklass_, jmethod_, 2.0);
Ian Rogers647b1a82014-10-10 11:02:11 -0700527 EXPECT_DOUBLE_EQ(log(2.0), result);
Nicolas Geoffray54accbc2014-08-13 03:40:45 +0100528}
529
Andreas Gampe6e498692014-08-18 16:43:12 -0700530JNI_TEST(RunStaticLogDoubleMethod)
531
Ian Rogers6a3c1fc2014-10-31 00:33:20 -0700532jfloat Java_MyClassNatives_logF(JNIEnv*, jclass, jfloat x) {
Nicolas Geoffray54accbc2014-08-13 03:40:45 +0100533 return logf(x);
534}
535
Andreas Gampe6e498692014-08-18 16:43:12 -0700536void JniCompilerTest::RunStaticLogFloatMethodImpl() {
Andreas Gampe6e498692014-08-18 16:43:12 -0700537 SetUpForTest(true, "logF", "(F)F", reinterpret_cast<void*>(&Java_MyClassNatives_logF));
Nicolas Geoffray54accbc2014-08-13 03:40:45 +0100538
539 jfloat result = env_->CallStaticFloatMethod(jklass_, jmethod_, 2.0);
Ian Rogers647b1a82014-10-10 11:02:11 -0700540 EXPECT_FLOAT_EQ(logf(2.0), result);
Nicolas Geoffray54accbc2014-08-13 03:40:45 +0100541}
542
Andreas Gampe6e498692014-08-18 16:43:12 -0700543JNI_TEST(RunStaticLogFloatMethod)
544
Ian Rogers6a3c1fc2014-10-31 00:33:20 -0700545jboolean Java_MyClassNatives_returnTrue(JNIEnv*, jclass) {
Nicolas Geoffray54accbc2014-08-13 03:40:45 +0100546 return JNI_TRUE;
547}
548
Ian Rogers6a3c1fc2014-10-31 00:33:20 -0700549jboolean Java_MyClassNatives_returnFalse(JNIEnv*, jclass) {
Nicolas Geoffray54accbc2014-08-13 03:40:45 +0100550 return JNI_FALSE;
551}
552
Ian Rogers6a3c1fc2014-10-31 00:33:20 -0700553jint Java_MyClassNatives_returnInt(JNIEnv*, jclass) {
Nicolas Geoffray54accbc2014-08-13 03:40:45 +0100554 return 42;
555}
556
Andreas Gampe6e498692014-08-18 16:43:12 -0700557void JniCompilerTest::RunStaticReturnTrueImpl() {
Andreas Gampe6e498692014-08-18 16:43:12 -0700558 SetUpForTest(true, "returnTrue", "()Z", reinterpret_cast<void*>(&Java_MyClassNatives_returnTrue));
Nicolas Geoffray54accbc2014-08-13 03:40:45 +0100559
560 jboolean result = env_->CallStaticBooleanMethod(jklass_, jmethod_);
561 EXPECT_TRUE(result);
562}
563
Andreas Gampe6e498692014-08-18 16:43:12 -0700564JNI_TEST(RunStaticReturnTrue)
565
566void JniCompilerTest::RunStaticReturnFalseImpl() {
Nicolas Geoffray54accbc2014-08-13 03:40:45 +0100567 SetUpForTest(true, "returnFalse", "()Z",
Andreas Gampe6e498692014-08-18 16:43:12 -0700568 reinterpret_cast<void*>(&Java_MyClassNatives_returnFalse));
Nicolas Geoffray54accbc2014-08-13 03:40:45 +0100569
570 jboolean result = env_->CallStaticBooleanMethod(jklass_, jmethod_);
571 EXPECT_FALSE(result);
572}
573
Andreas Gampe6e498692014-08-18 16:43:12 -0700574JNI_TEST(RunStaticReturnFalse)
575
576void JniCompilerTest::RunGenericStaticReturnIntImpl() {
Andreas Gampe6e498692014-08-18 16:43:12 -0700577 SetUpForTest(true, "returnInt", "()I", reinterpret_cast<void*>(&Java_MyClassNatives_returnInt));
Nicolas Geoffray54accbc2014-08-13 03:40:45 +0100578
579 jint result = env_->CallStaticIntMethod(jklass_, jmethod_);
580 EXPECT_EQ(42, result);
581}
582
Andreas Gampe6e498692014-08-18 16:43:12 -0700583JNI_TEST(RunGenericStaticReturnInt)
584
Elliott Hughesb264f082012-04-06 17:10:10 -0700585int gJava_MyClassNatives_fooSIOO_calls = 0;
586jobject Java_MyClassNatives_fooSIOO(JNIEnv* env, jclass klass, jint x, jobject y,
Ian Rogersb033c752011-07-20 12:22:35 -0700587 jobject z) {
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700588 // 3 = klass + y + z
Ian Rogers50b35e22012-10-04 10:09:15 -0700589 EXPECT_EQ(kNative, Thread::Current()->GetState());
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700590 EXPECT_EQ(Thread::Current()->GetJniEnv(), env);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700591 EXPECT_TRUE(klass != nullptr);
Ian Rogersa8cd9f42011-08-19 16:43:41 -0700592 EXPECT_TRUE(env->IsInstanceOf(JniCompilerTest::jobj_, klass));
Elliott Hughesb264f082012-04-06 17:10:10 -0700593 gJava_MyClassNatives_fooSIOO_calls++;
Ian Rogersef7d42f2014-01-06 12:55:46 -0800594 ScopedObjectAccess soa(Thread::Current());
Andreas Gampebf6b92a2014-03-05 16:11:04 -0800595 size_t null_args = (y == nullptr ? 1 : 0) + (z == nullptr ? 1 : 0);
596 EXPECT_TRUE(3U == Thread::Current()->NumStackReferences() ||
597 (3U - null_args) == Thread::Current()->NumStackReferences());
Ian Rogersb033c752011-07-20 12:22:35 -0700598 switch (x) {
599 case 1:
600 return y;
601 case 2:
602 return z;
603 default:
604 return klass;
605 }
606}
607
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700608
Andreas Gampe6e498692014-08-18 16:43:12 -0700609void JniCompilerTest::CompileAndRunStaticIntObjectObjectMethodImpl() {
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700610 SetUpForTest(true, "fooSIOO",
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700611 "(ILjava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;",
Elliott Hughesb264f082012-04-06 17:10:10 -0700612 reinterpret_cast<void*>(&Java_MyClassNatives_fooSIOO));
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700613
Elliott Hughesb264f082012-04-06 17:10:10 -0700614 EXPECT_EQ(0, gJava_MyClassNatives_fooSIOO_calls);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700615 jobject result = env_->CallStaticObjectMethod(jklass_, jmethod_, 0, nullptr, nullptr);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700616 EXPECT_TRUE(env_->IsSameObject(jklass_, result));
Elliott Hughesb264f082012-04-06 17:10:10 -0700617 EXPECT_EQ(1, gJava_MyClassNatives_fooSIOO_calls);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700618
Andreas Gampecf4035a2014-05-28 22:43:01 -0700619 result = env_->CallStaticObjectMethod(jklass_, jmethod_, 0, nullptr, jobj_);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700620 EXPECT_TRUE(env_->IsSameObject(jklass_, result));
Elliott Hughesb264f082012-04-06 17:10:10 -0700621 EXPECT_EQ(2, gJava_MyClassNatives_fooSIOO_calls);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700622 result = env_->CallStaticObjectMethod(jklass_, jmethod_, 1, nullptr, jobj_);
623 EXPECT_TRUE(env_->IsSameObject(nullptr, result));
Elliott Hughesb264f082012-04-06 17:10:10 -0700624 EXPECT_EQ(3, gJava_MyClassNatives_fooSIOO_calls);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700625 result = env_->CallStaticObjectMethod(jklass_, jmethod_, 2, nullptr, jobj_);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700626 EXPECT_TRUE(env_->IsSameObject(jobj_, result));
Elliott Hughesb264f082012-04-06 17:10:10 -0700627 EXPECT_EQ(4, gJava_MyClassNatives_fooSIOO_calls);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700628
Andreas Gampecf4035a2014-05-28 22:43:01 -0700629 result = env_->CallStaticObjectMethod(jklass_, jmethod_, 0, jobj_, nullptr);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700630 EXPECT_TRUE(env_->IsSameObject(jklass_, result));
Elliott Hughesb264f082012-04-06 17:10:10 -0700631 EXPECT_EQ(5, gJava_MyClassNatives_fooSIOO_calls);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700632 result = env_->CallStaticObjectMethod(jklass_, jmethod_, 1, jobj_, nullptr);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700633 EXPECT_TRUE(env_->IsSameObject(jobj_, result));
Elliott Hughesb264f082012-04-06 17:10:10 -0700634 EXPECT_EQ(6, gJava_MyClassNatives_fooSIOO_calls);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700635 result = env_->CallStaticObjectMethod(jklass_, jmethod_, 2, jobj_, nullptr);
636 EXPECT_TRUE(env_->IsSameObject(nullptr, result));
Elliott Hughesb264f082012-04-06 17:10:10 -0700637 EXPECT_EQ(7, gJava_MyClassNatives_fooSIOO_calls);
Andreas Gampe6e498692014-08-18 16:43:12 -0700638
639 gJava_MyClassNatives_fooSIOO_calls = 0;
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700640}
641
Andreas Gampe6e498692014-08-18 16:43:12 -0700642JNI_TEST(CompileAndRunStaticIntObjectObjectMethod)
643
Elliott Hughesb264f082012-04-06 17:10:10 -0700644int gJava_MyClassNatives_fooSSIOO_calls = 0;
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700645jobject Java_MyClassNatives_fooSSIOO(JNIEnv* env, jclass klass, jint x, jobject y, jobject z) {
646 // 3 = klass + y + z
Ian Rogers50b35e22012-10-04 10:09:15 -0700647 EXPECT_EQ(kNative, Thread::Current()->GetState());
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700648 EXPECT_EQ(Thread::Current()->GetJniEnv(), env);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700649 EXPECT_TRUE(klass != nullptr);
Ian Rogersa8cd9f42011-08-19 16:43:41 -0700650 EXPECT_TRUE(env->IsInstanceOf(JniCompilerTest::jobj_, klass));
Elliott Hughesb264f082012-04-06 17:10:10 -0700651 gJava_MyClassNatives_fooSSIOO_calls++;
Ian Rogersef7d42f2014-01-06 12:55:46 -0800652 ScopedObjectAccess soa(Thread::Current());
Andreas Gampebf6b92a2014-03-05 16:11:04 -0800653 size_t null_args = (y == nullptr ? 1 : 0) + (z == nullptr ? 1 : 0);
654 EXPECT_TRUE(3U == Thread::Current()->NumStackReferences() ||
655 (3U - null_args) == Thread::Current()->NumStackReferences());
Ian Rogersdf20fe02011-07-20 20:34:16 -0700656 switch (x) {
657 case 1:
658 return y;
659 case 2:
660 return z;
661 default:
662 return klass;
663 }
664}
665
Andreas Gampe6e498692014-08-18 16:43:12 -0700666void JniCompilerTest::CompileAndRunStaticSynchronizedIntObjectObjectMethodImpl() {
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700667 SetUpForTest(true, "fooSSIOO",
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700668 "(ILjava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;",
Elliott Hughesb264f082012-04-06 17:10:10 -0700669 reinterpret_cast<void*>(&Java_MyClassNatives_fooSSIOO));
Carl Shapiro419ec7b2011-08-03 14:48:33 -0700670
Elliott Hughesb264f082012-04-06 17:10:10 -0700671 EXPECT_EQ(0, gJava_MyClassNatives_fooSSIOO_calls);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700672 jobject result = env_->CallStaticObjectMethod(jklass_, jmethod_, 0, nullptr, nullptr);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700673 EXPECT_TRUE(env_->IsSameObject(jklass_, result));
Elliott Hughesb264f082012-04-06 17:10:10 -0700674 EXPECT_EQ(1, gJava_MyClassNatives_fooSSIOO_calls);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700675
Andreas Gampecf4035a2014-05-28 22:43:01 -0700676 result = env_->CallStaticObjectMethod(jklass_, jmethod_, 0, nullptr, jobj_);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700677 EXPECT_TRUE(env_->IsSameObject(jklass_, result));
Elliott Hughesb264f082012-04-06 17:10:10 -0700678 EXPECT_EQ(2, gJava_MyClassNatives_fooSSIOO_calls);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700679 result = env_->CallStaticObjectMethod(jklass_, jmethod_, 1, nullptr, jobj_);
680 EXPECT_TRUE(env_->IsSameObject(nullptr, result));
Elliott Hughesb264f082012-04-06 17:10:10 -0700681 EXPECT_EQ(3, gJava_MyClassNatives_fooSSIOO_calls);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700682 result = env_->CallStaticObjectMethod(jklass_, jmethod_, 2, nullptr, jobj_);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700683 EXPECT_TRUE(env_->IsSameObject(jobj_, result));
Elliott Hughesb264f082012-04-06 17:10:10 -0700684 EXPECT_EQ(4, gJava_MyClassNatives_fooSSIOO_calls);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700685
Andreas Gampecf4035a2014-05-28 22:43:01 -0700686 result = env_->CallStaticObjectMethod(jklass_, jmethod_, 0, jobj_, nullptr);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700687 EXPECT_TRUE(env_->IsSameObject(jklass_, result));
Elliott Hughesb264f082012-04-06 17:10:10 -0700688 EXPECT_EQ(5, gJava_MyClassNatives_fooSSIOO_calls);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700689 result = env_->CallStaticObjectMethod(jklass_, jmethod_, 1, jobj_, nullptr);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700690 EXPECT_TRUE(env_->IsSameObject(jobj_, result));
Elliott Hughesb264f082012-04-06 17:10:10 -0700691 EXPECT_EQ(6, gJava_MyClassNatives_fooSSIOO_calls);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700692 result = env_->CallStaticObjectMethod(jklass_, jmethod_, 2, jobj_, nullptr);
693 EXPECT_TRUE(env_->IsSameObject(nullptr, result));
Elliott Hughesb264f082012-04-06 17:10:10 -0700694 EXPECT_EQ(7, gJava_MyClassNatives_fooSSIOO_calls);
Andreas Gampe6e498692014-08-18 16:43:12 -0700695
696 gJava_MyClassNatives_fooSSIOO_calls = 0;
Ian Rogersdf20fe02011-07-20 20:34:16 -0700697}
698
Andreas Gampe6e498692014-08-18 16:43:12 -0700699JNI_TEST(CompileAndRunStaticSynchronizedIntObjectObjectMethod)
700
Elliott Hughesb264f082012-04-06 17:10:10 -0700701void Java_MyClassNatives_throwException(JNIEnv* env, jobject) {
Elliott Hughesa2501992011-08-26 19:39:54 -0700702 jclass c = env->FindClass("java/lang/RuntimeException");
703 env->ThrowNew(c, "hello");
704}
Ian Rogers45a76cb2011-07-21 22:00:15 -0700705
Andreas Gampe6e498692014-08-18 16:43:12 -0700706void JniCompilerTest::ExceptionHandlingImpl() {
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700707 {
708 ASSERT_FALSE(runtime_->IsStarted());
709 ScopedObjectAccess soa(Thread::Current());
710 class_loader_ = LoadDex("MyClassNatives");
Brian Carlstrom40381fb2011-10-19 14:13:40 -0700711
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700712 // all compilation needs to happen before Runtime::Start
713 CompileForTest(class_loader_, false, "foo", "()V");
714 CompileForTest(class_loader_, false, "throwException", "()V");
715 CompileForTest(class_loader_, false, "foo", "()V");
716 }
717 // Start runtime to avoid re-initialization in SetupForTest.
718 Thread::Current()->TransitionFromSuspendedToRunnable();
Brian Carlstrombd86bcc2013-03-10 20:26:16 -0700719 bool started = runtime_->Start();
720 CHECK(started);
Brian Carlstrom25c33252011-09-18 15:58:35 -0700721
Elliott Hughesb264f082012-04-06 17:10:10 -0700722 gJava_MyClassNatives_foo_calls = 0;
Elliott Hughesa2501992011-08-26 19:39:54 -0700723
Ian Rogers67375ac2011-09-14 00:55:44 -0700724 // Check a single call of a JNI method is ok
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700725 SetUpForTest(false, "foo", "()V", reinterpret_cast<void*>(&Java_MyClassNatives_foo));
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700726 env_->CallNonvirtualVoidMethod(jobj_, jklass_, jmethod_);
Elliott Hughesb264f082012-04-06 17:10:10 -0700727 EXPECT_EQ(1, gJava_MyClassNatives_foo_calls);
Ian Rogers67375ac2011-09-14 00:55:44 -0700728 EXPECT_FALSE(Thread::Current()->IsExceptionPending());
Elliott Hughesa2501992011-08-26 19:39:54 -0700729
Ian Rogers67375ac2011-09-14 00:55:44 -0700730 // Get class for exception we expect to be thrown
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700731 ScopedLocalRef<jclass> jlre(env_, env_->FindClass("java/lang/RuntimeException"));
732 SetUpForTest(false, "throwException", "()V",
Elliott Hughesb264f082012-04-06 17:10:10 -0700733 reinterpret_cast<void*>(&Java_MyClassNatives_throwException));
734 // Call Java_MyClassNatives_throwException (JNI method that throws exception)
Elliott Hughesa2501992011-08-26 19:39:54 -0700735 env_->CallNonvirtualVoidMethod(jobj_, jklass_, jmethod_);
Elliott Hughesb264f082012-04-06 17:10:10 -0700736 EXPECT_EQ(1, gJava_MyClassNatives_foo_calls);
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700737 EXPECT_TRUE(env_->ExceptionCheck() == JNI_TRUE);
738 ScopedLocalRef<jthrowable> exception(env_, env_->ExceptionOccurred());
739 env_->ExceptionClear();
740 EXPECT_TRUE(env_->IsInstanceOf(exception.get(), jlre.get()));
Elliott Hughesa2501992011-08-26 19:39:54 -0700741
Ian Rogers67375ac2011-09-14 00:55:44 -0700742 // Check a single call of a JNI method is ok
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700743 SetUpForTest(false, "foo", "()V", reinterpret_cast<void*>(&Java_MyClassNatives_foo));
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700744 env_->CallNonvirtualVoidMethod(jobj_, jklass_, jmethod_);
Elliott Hughesb264f082012-04-06 17:10:10 -0700745 EXPECT_EQ(2, gJava_MyClassNatives_foo_calls);
Andreas Gampe6e498692014-08-18 16:43:12 -0700746
747 gJava_MyClassNatives_foo_calls = 0;
Ian Rogers45a76cb2011-07-21 22:00:15 -0700748}
749
Andreas Gampe6e498692014-08-18 16:43:12 -0700750JNI_TEST(ExceptionHandling)
751
Elliott Hughesb264f082012-04-06 17:10:10 -0700752jint Java_MyClassNatives_nativeUpCall(JNIEnv* env, jobject thisObj, jint i) {
Shih-wei Liaoff0f9be2011-08-29 15:43:53 -0700753 if (i <= 0) {
Andreas Gampecf4035a2014-05-28 22:43:01 -0700754 // We want to check raw Object* / Array* below
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700755 ScopedObjectAccess soa(env);
Ian Rogersaaa20802011-09-11 21:47:37 -0700756
757 // Build stack trace
Sebastien Hertzee1d79a2014-02-21 15:46:30 +0100758 jobject internal = Thread::Current()->CreateInternalStackTrace<false>(soa);
Ian Rogers53b8b092014-03-13 23:45:53 -0700759 jobjectArray ste_array = Thread::InternalStackTraceToStackTraceElementArray(soa, internal);
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800760 mirror::ObjectArray<mirror::StackTraceElement>* trace_array =
761 soa.Decode<mirror::ObjectArray<mirror::StackTraceElement>*>(ste_array);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700762 EXPECT_TRUE(trace_array != nullptr);
Shih-wei Liaoff0f9be2011-08-29 15:43:53 -0700763 EXPECT_EQ(11, trace_array->GetLength());
764
Ian Rogersaaa20802011-09-11 21:47:37 -0700765 // Check stack trace entries have expected values
Andreas Gampe277ccbd2014-11-03 21:36:10 -0800766 for (int32_t j = 0; j < trace_array->GetLength(); ++j) {
767 EXPECT_EQ(-2, trace_array->Get(j)->GetLineNumber());
768 mirror::StackTraceElement* ste = trace_array->Get(j);
Ian Rogersaaa20802011-09-11 21:47:37 -0700769 EXPECT_STREQ("MyClassNatives.java", ste->GetFileName()->ToModifiedUtf8().c_str());
Elliott Hughesb264f082012-04-06 17:10:10 -0700770 EXPECT_STREQ("MyClassNatives", ste->GetDeclaringClass()->ToModifiedUtf8().c_str());
Ian Rogersaaa20802011-09-11 21:47:37 -0700771 EXPECT_STREQ("fooI", ste->GetMethodName()->ToModifiedUtf8().c_str());
Shih-wei Liaoff0f9be2011-08-29 15:43:53 -0700772 }
Ian Rogersaaa20802011-09-11 21:47:37 -0700773
774 // end recursion
Shih-wei Liaoff0f9be2011-08-29 15:43:53 -0700775 return 0;
776 } else {
Elliott Hughesb264f082012-04-06 17:10:10 -0700777 jclass jklass = env->FindClass("MyClassNatives");
Andreas Gampecf4035a2014-05-28 22:43:01 -0700778 EXPECT_TRUE(jklass != nullptr);
Shih-wei Liaoff0f9be2011-08-29 15:43:53 -0700779 jmethodID jmethod = env->GetMethodID(jklass, "fooI", "(I)I");
Andreas Gampecf4035a2014-05-28 22:43:01 -0700780 EXPECT_TRUE(jmethod != nullptr);
Shih-wei Liaoff0f9be2011-08-29 15:43:53 -0700781
Ian Rogersaaa20802011-09-11 21:47:37 -0700782 // Recurse with i - 1
Shih-wei Liaoff0f9be2011-08-29 15:43:53 -0700783 jint result = env->CallNonvirtualIntMethod(thisObj, jklass, jmethod, i - 1);
Ian Rogersaaa20802011-09-11 21:47:37 -0700784
785 // Return sum of all depths
Shih-wei Liaoff0f9be2011-08-29 15:43:53 -0700786 return i + result;
787 }
788}
789
Andreas Gampe6e498692014-08-18 16:43:12 -0700790void JniCompilerTest::NativeStackTraceElementImpl() {
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700791 SetUpForTest(false, "fooI", "(I)I",
Elliott Hughesb264f082012-04-06 17:10:10 -0700792 reinterpret_cast<void*>(&Java_MyClassNatives_nativeUpCall));
Shih-wei Liaoff0f9be2011-08-29 15:43:53 -0700793 jint result = env_->CallNonvirtualIntMethod(jobj_, jklass_, jmethod_, 10);
Ian Rogersaaa20802011-09-11 21:47:37 -0700794 EXPECT_EQ(10+9+8+7+6+5+4+3+2+1, result);
Shih-wei Liaoff0f9be2011-08-29 15:43:53 -0700795}
796
Andreas Gampe6e498692014-08-18 16:43:12 -0700797JNI_TEST(NativeStackTraceElement)
798
Elliott Hughesb264f082012-04-06 17:10:10 -0700799jobject Java_MyClassNatives_fooO(JNIEnv* env, jobject, jobject x) {
Shih-wei Liao558788e2011-09-01 02:39:11 -0700800 return env->NewGlobalRef(x);
801}
802
Andreas Gampe6e498692014-08-18 16:43:12 -0700803void JniCompilerTest::ReturnGlobalRefImpl() {
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700804 SetUpForTest(false, "fooO", "(Ljava/lang/Object;)Ljava/lang/Object;",
Elliott Hughesb264f082012-04-06 17:10:10 -0700805 reinterpret_cast<void*>(&Java_MyClassNatives_fooO));
Shih-wei Liao558788e2011-09-01 02:39:11 -0700806 jobject result = env_->CallNonvirtualObjectMethod(jobj_, jklass_, jmethod_, jobj_);
807 EXPECT_EQ(JNILocalRefType, env_->GetObjectRefType(result));
808 EXPECT_TRUE(env_->IsSameObject(result, jobj_));
809}
810
Andreas Gampe6e498692014-08-18 16:43:12 -0700811JNI_TEST(ReturnGlobalRef)
812
Ian Rogersdc51b792011-09-22 20:41:37 -0700813jint local_ref_test(JNIEnv* env, jobject thisObj, jint x) {
814 // Add 10 local references
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700815 ScopedObjectAccess soa(env);
Ian Rogers5a7a74a2011-09-26 16:32:29 -0700816 for (int i = 0; i < 10; i++) {
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800817 soa.AddLocalReference<jobject>(soa.Decode<mirror::Object*>(thisObj));
Ian Rogersdc51b792011-09-22 20:41:37 -0700818 }
819 return x+1;
820}
821
Andreas Gampe6e498692014-08-18 16:43:12 -0700822void JniCompilerTest::LocalReferenceTableClearingTestImpl() {
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700823 SetUpForTest(false, "fooI", "(I)I", reinterpret_cast<void*>(&local_ref_test));
Ian Rogersdc51b792011-09-22 20:41:37 -0700824 // 1000 invocations of a method that adds 10 local references
Elliott Hughesb25c3f62012-03-26 16:35:06 -0700825 for (int i = 0; i < 1000; i++) {
Ian Rogersdc51b792011-09-22 20:41:37 -0700826 jint result = env_->CallIntMethod(jobj_, jmethod_, i);
827 EXPECT_TRUE(result == i + 1);
828 }
829}
830
Andreas Gampe6e498692014-08-18 16:43:12 -0700831JNI_TEST(LocalReferenceTableClearingTest)
832
Ian Rogersb9231c82011-09-05 22:13:19 -0700833void my_arraycopy(JNIEnv* env, jclass klass, jobject src, jint src_pos, jobject dst, jint dst_pos, jint length) {
834 EXPECT_TRUE(env->IsSameObject(JniCompilerTest::jklass_, klass));
835 EXPECT_TRUE(env->IsSameObject(JniCompilerTest::jklass_, dst));
Ian Rogers82f3e092011-09-05 22:54:45 -0700836 EXPECT_TRUE(env->IsSameObject(JniCompilerTest::jobj_, src));
Ian Rogersb9231c82011-09-05 22:13:19 -0700837 EXPECT_EQ(1234, src_pos);
838 EXPECT_EQ(5678, dst_pos);
839 EXPECT_EQ(9876, length);
840}
841
Andreas Gampe6e498692014-08-18 16:43:12 -0700842void JniCompilerTest::JavaLangSystemArrayCopyImpl() {
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700843 SetUpForTest(true, "arraycopy", "(Ljava/lang/Object;ILjava/lang/Object;II)V",
Ian Rogersb9231c82011-09-05 22:13:19 -0700844 reinterpret_cast<void*>(&my_arraycopy));
Ian Rogers82f3e092011-09-05 22:54:45 -0700845 env_->CallStaticVoidMethod(jklass_, jmethod_, jobj_, 1234, jklass_, 5678, 9876);
Ian Rogersb9231c82011-09-05 22:13:19 -0700846}
847
Andreas Gampe6e498692014-08-18 16:43:12 -0700848JNI_TEST(JavaLangSystemArrayCopy)
849
Ian Rogers67375ac2011-09-14 00:55:44 -0700850jboolean my_casi(JNIEnv* env, jobject unsafe, jobject obj, jlong offset, jint expected, jint newval) {
851 EXPECT_TRUE(env->IsSameObject(JniCompilerTest::jobj_, unsafe));
852 EXPECT_TRUE(env->IsSameObject(JniCompilerTest::jobj_, obj));
Ian Rogers0f678472014-03-10 16:18:37 -0700853 EXPECT_EQ(INT64_C(0x12345678ABCDEF88), offset);
Ian Rogers67375ac2011-09-14 00:55:44 -0700854 EXPECT_EQ(static_cast<jint>(0xCAFEF00D), expected);
855 EXPECT_EQ(static_cast<jint>(0xEBADF00D), newval);
856 return JNI_TRUE;
857}
858
Andreas Gampe6e498692014-08-18 16:43:12 -0700859void JniCompilerTest::CompareAndSwapIntImpl() {
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700860 SetUpForTest(false, "compareAndSwapInt", "(Ljava/lang/Object;JII)Z",
Ian Rogers67375ac2011-09-14 00:55:44 -0700861 reinterpret_cast<void*>(&my_casi));
Ian Rogers0f678472014-03-10 16:18:37 -0700862 jboolean result = env_->CallBooleanMethod(jobj_, jmethod_, jobj_, INT64_C(0x12345678ABCDEF88),
863 0xCAFEF00D, 0xEBADF00D);
Ian Rogers67375ac2011-09-14 00:55:44 -0700864 EXPECT_EQ(result, JNI_TRUE);
865}
866
Andreas Gampe6e498692014-08-18 16:43:12 -0700867JNI_TEST(CompareAndSwapInt)
868
Ian Rogersc7792842012-03-03 15:36:20 -0800869jint my_gettext(JNIEnv* env, jclass klass, jlong val1, jobject obj1, jlong val2, jobject obj2) {
870 EXPECT_TRUE(env->IsInstanceOf(JniCompilerTest::jobj_, klass));
871 EXPECT_TRUE(env->IsSameObject(JniCompilerTest::jobj_, obj1));
872 EXPECT_TRUE(env->IsSameObject(JniCompilerTest::jobj_, obj2));
873 EXPECT_EQ(0x12345678ABCDEF88ll, val1);
874 EXPECT_EQ(0x7FEDCBA987654321ll, val2);
875 return 42;
876}
877
Andreas Gampe6e498692014-08-18 16:43:12 -0700878void JniCompilerTest::GetTextImpl() {
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700879 SetUpForTest(true, "getText", "(JLjava/lang/Object;JLjava/lang/Object;)I",
Ian Rogersc7792842012-03-03 15:36:20 -0800880 reinterpret_cast<void*>(&my_gettext));
881 jint result = env_->CallStaticIntMethod(jklass_, jmethod_, 0x12345678ABCDEF88ll, jobj_,
Ian Rogers0f678472014-03-10 16:18:37 -0700882 INT64_C(0x7FEDCBA987654321), jobj_);
Ian Rogersc7792842012-03-03 15:36:20 -0800883 EXPECT_EQ(result, 42);
884}
885
Andreas Gampe6e498692014-08-18 16:43:12 -0700886JNI_TEST(GetText)
887
Vladimir Marko4e24b9d2014-07-24 17:01:58 +0100888int gJava_MyClassNatives_GetSinkProperties_calls = 0;
889jarray Java_MyClassNatives_GetSinkProperties(JNIEnv* env, jobject thisObj, jstring s) {
890 // 1 = thisObj
891 Thread* self = Thread::Current();
892 EXPECT_EQ(kNative, self->GetState());
893 Locks::mutator_lock_->AssertNotHeld(self);
894 EXPECT_EQ(self->GetJniEnv(), env);
895 EXPECT_TRUE(thisObj != nullptr);
896 EXPECT_TRUE(env->IsInstanceOf(thisObj, JniCompilerTest::jklass_));
897 EXPECT_EQ(s, nullptr);
898 gJava_MyClassNatives_GetSinkProperties_calls++;
899 ScopedObjectAccess soa(self);
900 EXPECT_EQ(2U, self->NumStackReferences());
901 EXPECT_TRUE(self->HoldsLock(soa.Decode<mirror::Object*>(thisObj)));
902 return nullptr;
903}
904
Andreas Gampe6e498692014-08-18 16:43:12 -0700905void JniCompilerTest::GetSinkPropertiesNativeImpl() {
Vladimir Marko4e24b9d2014-07-24 17:01:58 +0100906 SetUpForTest(false, "getSinkPropertiesNative", "(Ljava/lang/String;)[Ljava/lang/Object;",
907 reinterpret_cast<void*>(&Java_MyClassNatives_GetSinkProperties));
908
909 EXPECT_EQ(0, gJava_MyClassNatives_GetSinkProperties_calls);
910 jarray result = down_cast<jarray>(
911 env_->CallNonvirtualObjectMethod(jobj_, jklass_, jmethod_, nullptr));
912 EXPECT_EQ(nullptr, result);
913 EXPECT_EQ(1, gJava_MyClassNatives_GetSinkProperties_calls);
Andreas Gampe6e498692014-08-18 16:43:12 -0700914
915 gJava_MyClassNatives_GetSinkProperties_calls = 0;
Brian Carlstromfc7120c2012-08-27 13:43:25 -0700916}
917
Andreas Gampe6e498692014-08-18 16:43:12 -0700918JNI_TEST(GetSinkPropertiesNative)
919
Elliott Hughesb264f082012-04-06 17:10:10 -0700920// This should return jclass, but we're imitating a bug pattern.
921jobject Java_MyClassNatives_instanceMethodThatShouldReturnClass(JNIEnv* env, jobject) {
922 return env->NewStringUTF("not a class!");
923}
924
925// This should return jclass, but we're imitating a bug pattern.
926jobject Java_MyClassNatives_staticMethodThatShouldReturnClass(JNIEnv* env, jclass) {
927 return env->NewStringUTF("not a class!");
928}
929
Andreas Gampe6e498692014-08-18 16:43:12 -0700930void JniCompilerTest::UpcallReturnTypeChecking_InstanceImpl() {
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700931 SetUpForTest(false, "instanceMethodThatShouldReturnClass", "()Ljava/lang/Class;",
Elliott Hughesb264f082012-04-06 17:10:10 -0700932 reinterpret_cast<void*>(&Java_MyClassNatives_instanceMethodThatShouldReturnClass));
933
934 CheckJniAbortCatcher check_jni_abort_catcher;
Elliott Hughes3f6635a2012-06-19 13:37:49 -0700935 // This native method is bad, and tries to return a jstring as a jclass.
936 env_->CallObjectMethod(jobj_, jmethod_);
937 check_jni_abort_catcher.Check("attempt to return an instance of java.lang.String from java.lang.Class MyClassNatives.instanceMethodThatShouldReturnClass()");
938
939 // Here, we just call the method incorrectly; we should catch that too.
Ian Rogers68d8b422014-07-17 11:09:10 -0700940 env_->CallObjectMethod(jobj_, jmethod_);
Elliott Hughes3f6635a2012-06-19 13:37:49 -0700941 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 -0700942 env_->CallStaticObjectMethod(jklass_, jmethod_);
943 check_jni_abort_catcher.Check("calling non-static method java.lang.Class MyClassNatives.instanceMethodThatShouldReturnClass() with CallStaticObjectMethodV");
Elliott Hughesb264f082012-04-06 17:10:10 -0700944}
945
Andreas Gampe6e498692014-08-18 16:43:12 -0700946JNI_TEST(UpcallReturnTypeChecking_Instance)
947
948void JniCompilerTest::UpcallReturnTypeChecking_StaticImpl() {
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700949 SetUpForTest(true, "staticMethodThatShouldReturnClass", "()Ljava/lang/Class;",
Elliott Hughesb264f082012-04-06 17:10:10 -0700950 reinterpret_cast<void*>(&Java_MyClassNatives_staticMethodThatShouldReturnClass));
951
952 CheckJniAbortCatcher check_jni_abort_catcher;
Elliott Hughes3f6635a2012-06-19 13:37:49 -0700953 // This native method is bad, and tries to return a jstring as a jclass.
954 env_->CallStaticObjectMethod(jklass_, jmethod_);
955 check_jni_abort_catcher.Check("attempt to return an instance of java.lang.String from java.lang.Class MyClassNatives.staticMethodThatShouldReturnClass()");
956
957 // Here, we just call the method incorrectly; we should catch that too.
Ian Rogers68d8b422014-07-17 11:09:10 -0700958 env_->CallStaticObjectMethod(jklass_, jmethod_);
Elliott Hughes3f6635a2012-06-19 13:37:49 -0700959 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 -0700960 env_->CallObjectMethod(jobj_, jmethod_);
961 check_jni_abort_catcher.Check("calling static method java.lang.Class MyClassNatives.staticMethodThatShouldReturnClass() with CallObjectMethodV");
Elliott Hughesb264f082012-04-06 17:10:10 -0700962}
963
Andreas Gampe6e498692014-08-18 16:43:12 -0700964JNI_TEST(UpcallReturnTypeChecking_Static)
965
Elliott Hughesb264f082012-04-06 17:10:10 -0700966// This should take jclass, but we're imitating a bug pattern.
967void Java_MyClassNatives_instanceMethodThatShouldTakeClass(JNIEnv*, jobject, jclass) {
968}
969
970// This should take jclass, but we're imitating a bug pattern.
971void Java_MyClassNatives_staticMethodThatShouldTakeClass(JNIEnv*, jclass, jclass) {
972}
973
Andreas Gampe6e498692014-08-18 16:43:12 -0700974void JniCompilerTest::UpcallArgumentTypeChecking_InstanceImpl() {
Andreas Gampe369810a2015-01-14 19:53:31 -0800975 // This will lead to error messages in the log.
976 ScopedLogSeverity sls(LogSeverity::FATAL);
977
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700978 SetUpForTest(false, "instanceMethodThatShouldTakeClass", "(ILjava/lang/Class;)V",
Elliott Hughesb264f082012-04-06 17:10:10 -0700979 reinterpret_cast<void*>(&Java_MyClassNatives_instanceMethodThatShouldTakeClass));
980
981 CheckJniAbortCatcher check_jni_abort_catcher;
982 // We deliberately pass a bad second argument here.
983 env_->CallVoidMethod(jobj_, jmethod_, 123, env_->NewStringUTF("not a class!"));
Elliott Hughes3f6635a2012-06-19 13:37:49 -0700984 check_jni_abort_catcher.Check("bad arguments passed to void MyClassNatives.instanceMethodThatShouldTakeClass(int, java.lang.Class)");
Elliott Hughesb264f082012-04-06 17:10:10 -0700985}
986
Andreas Gampe6e498692014-08-18 16:43:12 -0700987JNI_TEST(UpcallArgumentTypeChecking_Instance)
988
989void JniCompilerTest::UpcallArgumentTypeChecking_StaticImpl() {
Andreas Gampe369810a2015-01-14 19:53:31 -0800990 // This will lead to error messages in the log.
991 ScopedLogSeverity sls(LogSeverity::FATAL);
992
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700993 SetUpForTest(true, "staticMethodThatShouldTakeClass", "(ILjava/lang/Class;)V",
Elliott Hughesb264f082012-04-06 17:10:10 -0700994 reinterpret_cast<void*>(&Java_MyClassNatives_staticMethodThatShouldTakeClass));
995
996 CheckJniAbortCatcher check_jni_abort_catcher;
997 // We deliberately pass a bad second argument here.
998 env_->CallStaticVoidMethod(jklass_, jmethod_, 123, env_->NewStringUTF("not a class!"));
Elliott Hughes3f6635a2012-06-19 13:37:49 -0700999 check_jni_abort_catcher.Check("bad arguments passed to void MyClassNatives.staticMethodThatShouldTakeClass(int, java.lang.Class)");
Elliott Hughesb264f082012-04-06 17:10:10 -07001000}
1001
Andreas Gampe6e498692014-08-18 16:43:12 -07001002JNI_TEST(UpcallArgumentTypeChecking_Static)
1003
Andreas Gampe7a0e5042014-03-07 13:03:19 -08001004jfloat Java_MyClassNatives_checkFloats(JNIEnv* env, jobject thisObj, jfloat f1, jfloat f2) {
1005 EXPECT_EQ(kNative, Thread::Current()->GetState());
1006 EXPECT_EQ(Thread::Current()->GetJniEnv(), env);
Andreas Gampecf4035a2014-05-28 22:43:01 -07001007 EXPECT_TRUE(thisObj != nullptr);
Andreas Gampe7a0e5042014-03-07 13:03:19 -08001008 EXPECT_TRUE(env->IsInstanceOf(thisObj, JniCompilerTest::jklass_));
1009 ScopedObjectAccess soa(Thread::Current());
1010 EXPECT_EQ(1U, Thread::Current()->NumStackReferences());
1011 return f1 - f2; // non-commutative operator
1012}
1013
Andreas Gampe6e498692014-08-18 16:43:12 -07001014void JniCompilerTest::CompileAndRunFloatFloatMethodImpl() {
Andreas Gampe7a0e5042014-03-07 13:03:19 -08001015 SetUpForTest(false, "checkFloats", "(FF)F",
1016 reinterpret_cast<void*>(&Java_MyClassNatives_checkFloats));
1017
1018 jfloat result = env_->CallNonvirtualFloatMethod(jobj_, jklass_, jmethod_,
1019 99.0F, 10.0F);
Ian Rogers647b1a82014-10-10 11:02:11 -07001020 EXPECT_FLOAT_EQ(99.0F - 10.0F, result);
Andreas Gampe7a0e5042014-03-07 13:03:19 -08001021 jfloat a = 3.14159F;
1022 jfloat b = 0.69314F;
1023 result = env_->CallNonvirtualFloatMethod(jobj_, jklass_, jmethod_, a, b);
Ian Rogers647b1a82014-10-10 11:02:11 -07001024 EXPECT_FLOAT_EQ(a - b, result);
Andreas Gampe7a0e5042014-03-07 13:03:19 -08001025}
1026
Andreas Gampe6e498692014-08-18 16:43:12 -07001027JNI_TEST(CompileAndRunFloatFloatMethod)
1028
Ian Rogers6a3c1fc2014-10-31 00:33:20 -07001029void Java_MyClassNatives_checkParameterAlign(JNIEnv* env ATTRIBUTE_UNUSED,
1030 jobject thisObj ATTRIBUTE_UNUSED,
1031 jint i1 ATTRIBUTE_UNUSED,
1032 jlong l1 ATTRIBUTE_UNUSED) {
Andreas Gampecf4035a2014-05-28 22:43:01 -07001033// EXPECT_EQ(kNative, Thread::Current()->GetState());
1034// EXPECT_EQ(Thread::Current()->GetJniEnv(), env);
1035// EXPECT_TRUE(thisObj != nullptr);
1036// EXPECT_TRUE(env->IsInstanceOf(thisObj, JniCompilerTest::jklass_));
1037// ScopedObjectAccess soa(Thread::Current());
1038// EXPECT_EQ(1U, Thread::Current()->NumStackReferences());
Andreas Gampe7a0e5042014-03-07 13:03:19 -08001039 EXPECT_EQ(i1, 1234);
Ian Rogers0f678472014-03-10 16:18:37 -07001040 EXPECT_EQ(l1, INT64_C(0x12345678ABCDEF0));
Andreas Gampe7a0e5042014-03-07 13:03:19 -08001041}
1042
Andreas Gampe6e498692014-08-18 16:43:12 -07001043void JniCompilerTest::CheckParameterAlignImpl() {
Andreas Gampe7a0e5042014-03-07 13:03:19 -08001044 SetUpForTest(false, "checkParameterAlign", "(IJ)V",
1045 reinterpret_cast<void*>(&Java_MyClassNatives_checkParameterAlign));
1046
Ian Rogers0f678472014-03-10 16:18:37 -07001047 env_->CallNonvirtualVoidMethod(jobj_, jklass_, jmethod_, 1234, INT64_C(0x12345678ABCDEF0));
Andreas Gampe7a0e5042014-03-07 13:03:19 -08001048}
1049
Andreas Gampe6e498692014-08-18 16:43:12 -07001050JNI_TEST(CheckParameterAlign)
1051
Andreas Gampe7a0e5042014-03-07 13:03:19 -08001052void Java_MyClassNatives_maxParamNumber(JNIEnv* env, jobject thisObj,
1053 jobject o0, jobject o1, jobject o2, jobject o3, jobject o4, jobject o5, jobject o6, jobject o7,
1054 jobject o8, jobject o9, jobject o10, jobject o11, jobject o12, jobject o13, jobject o14, jobject o15,
1055 jobject o16, jobject o17, jobject o18, jobject o19, jobject o20, jobject o21, jobject o22, jobject o23,
1056 jobject o24, jobject o25, jobject o26, jobject o27, jobject o28, jobject o29, jobject o30, jobject o31,
1057 jobject o32, jobject o33, jobject o34, jobject o35, jobject o36, jobject o37, jobject o38, jobject o39,
1058 jobject o40, jobject o41, jobject o42, jobject o43, jobject o44, jobject o45, jobject o46, jobject o47,
1059 jobject o48, jobject o49, jobject o50, jobject o51, jobject o52, jobject o53, jobject o54, jobject o55,
1060 jobject o56, jobject o57, jobject o58, jobject o59, jobject o60, jobject o61, jobject o62, jobject o63,
1061 jobject o64, jobject o65, jobject o66, jobject o67, jobject o68, jobject o69, jobject o70, jobject o71,
1062 jobject o72, jobject o73, jobject o74, jobject o75, jobject o76, jobject o77, jobject o78, jobject o79,
1063 jobject o80, jobject o81, jobject o82, jobject o83, jobject o84, jobject o85, jobject o86, jobject o87,
1064 jobject o88, jobject o89, jobject o90, jobject o91, jobject o92, jobject o93, jobject o94, jobject o95,
1065 jobject o96, jobject o97, jobject o98, jobject o99, jobject o100, jobject o101, jobject o102, jobject o103,
1066 jobject o104, jobject o105, jobject o106, jobject o107, jobject o108, jobject o109, jobject o110, jobject o111,
1067 jobject o112, jobject o113, jobject o114, jobject o115, jobject o116, jobject o117, jobject o118, jobject o119,
1068 jobject o120, jobject o121, jobject o122, jobject o123, jobject o124, jobject o125, jobject o126, jobject o127,
1069 jobject o128, jobject o129, jobject o130, jobject o131, jobject o132, jobject o133, jobject o134, jobject o135,
1070 jobject o136, jobject o137, jobject o138, jobject o139, jobject o140, jobject o141, jobject o142, jobject o143,
1071 jobject o144, jobject o145, jobject o146, jobject o147, jobject o148, jobject o149, jobject o150, jobject o151,
1072 jobject o152, jobject o153, jobject o154, jobject o155, jobject o156, jobject o157, jobject o158, jobject o159,
1073 jobject o160, jobject o161, jobject o162, jobject o163, jobject o164, jobject o165, jobject o166, jobject o167,
1074 jobject o168, jobject o169, jobject o170, jobject o171, jobject o172, jobject o173, jobject o174, jobject o175,
1075 jobject o176, jobject o177, jobject o178, jobject o179, jobject o180, jobject o181, jobject o182, jobject o183,
1076 jobject o184, jobject o185, jobject o186, jobject o187, jobject o188, jobject o189, jobject o190, jobject o191,
1077 jobject o192, jobject o193, jobject o194, jobject o195, jobject o196, jobject o197, jobject o198, jobject o199,
1078 jobject o200, jobject o201, jobject o202, jobject o203, jobject o204, jobject o205, jobject o206, jobject o207,
1079 jobject o208, jobject o209, jobject o210, jobject o211, jobject o212, jobject o213, jobject o214, jobject o215,
1080 jobject o216, jobject o217, jobject o218, jobject o219, jobject o220, jobject o221, jobject o222, jobject o223,
1081 jobject o224, jobject o225, jobject o226, jobject o227, jobject o228, jobject o229, jobject o230, jobject o231,
1082 jobject o232, jobject o233, jobject o234, jobject o235, jobject o236, jobject o237, jobject o238, jobject o239,
1083 jobject o240, jobject o241, jobject o242, jobject o243, jobject o244, jobject o245, jobject o246, jobject o247,
1084 jobject o248, jobject o249, jobject o250, jobject o251, jobject o252, jobject o253) {
1085 EXPECT_EQ(kNative, Thread::Current()->GetState());
1086 EXPECT_EQ(Thread::Current()->GetJniEnv(), env);
Andreas Gampecf4035a2014-05-28 22:43:01 -07001087 EXPECT_TRUE(thisObj != nullptr);
Andreas Gampe7a0e5042014-03-07 13:03:19 -08001088 EXPECT_TRUE(env->IsInstanceOf(thisObj, JniCompilerTest::jklass_));
1089 ScopedObjectAccess soa(Thread::Current());
1090 EXPECT_GE(255U, Thread::Current()->NumStackReferences());
1091
1092 // two tests possible
1093 if (o0 == nullptr) {
1094 // 1) everything is null
1095 EXPECT_TRUE(o0 == nullptr && o1 == nullptr && o2 == nullptr && o3 == nullptr && o4 == nullptr
1096 && o5 == nullptr && o6 == nullptr && o7 == nullptr && o8 == nullptr && o9 == nullptr
1097 && o10 == nullptr && o11 == nullptr && o12 == nullptr && o13 == nullptr && o14 == nullptr
1098 && o15 == nullptr && o16 == nullptr && o17 == nullptr && o18 == nullptr && o19 == nullptr
1099 && o20 == nullptr && o21 == nullptr && o22 == nullptr && o23 == nullptr && o24 == nullptr
1100 && o25 == nullptr && o26 == nullptr && o27 == nullptr && o28 == nullptr && o29 == nullptr
1101 && o30 == nullptr && o31 == nullptr && o32 == nullptr && o33 == nullptr && o34 == nullptr
1102 && o35 == nullptr && o36 == nullptr && o37 == nullptr && o38 == nullptr && o39 == nullptr
1103 && o40 == nullptr && o41 == nullptr && o42 == nullptr && o43 == nullptr && o44 == nullptr
1104 && o45 == nullptr && o46 == nullptr && o47 == nullptr && o48 == nullptr && o49 == nullptr
1105 && o50 == nullptr && o51 == nullptr && o52 == nullptr && o53 == nullptr && o54 == nullptr
1106 && o55 == nullptr && o56 == nullptr && o57 == nullptr && o58 == nullptr && o59 == nullptr
1107 && o60 == nullptr && o61 == nullptr && o62 == nullptr && o63 == nullptr && o64 == nullptr
1108 && o65 == nullptr && o66 == nullptr && o67 == nullptr && o68 == nullptr && o69 == nullptr
1109 && o70 == nullptr && o71 == nullptr && o72 == nullptr && o73 == nullptr && o74 == nullptr
1110 && o75 == nullptr && o76 == nullptr && o77 == nullptr && o78 == nullptr && o79 == nullptr
1111 && o80 == nullptr && o81 == nullptr && o82 == nullptr && o83 == nullptr && o84 == nullptr
1112 && o85 == nullptr && o86 == nullptr && o87 == nullptr && o88 == nullptr && o89 == nullptr
1113 && o90 == nullptr && o91 == nullptr && o92 == nullptr && o93 == nullptr && o94 == nullptr
1114 && o95 == nullptr && o96 == nullptr && o97 == nullptr && o98 == nullptr && o99 == nullptr
1115 && o100 == nullptr && o101 == nullptr && o102 == nullptr && o103 == nullptr && o104 == nullptr
1116 && o105 == nullptr && o106 == nullptr && o107 == nullptr && o108 == nullptr && o109 == nullptr
1117 && o110 == nullptr && o111 == nullptr && o112 == nullptr && o113 == nullptr && o114 == nullptr
1118 && o115 == nullptr && o116 == nullptr && o117 == nullptr && o118 == nullptr && o119 == nullptr
1119 && o120 == nullptr && o121 == nullptr && o122 == nullptr && o123 == nullptr && o124 == nullptr
1120 && o125 == nullptr && o126 == nullptr && o127 == nullptr && o128 == nullptr && o129 == nullptr
1121 && o130 == nullptr && o131 == nullptr && o132 == nullptr && o133 == nullptr && o134 == nullptr
1122 && o135 == nullptr && o136 == nullptr && o137 == nullptr && o138 == nullptr && o139 == nullptr
1123 && o140 == nullptr && o141 == nullptr && o142 == nullptr && o143 == nullptr && o144 == nullptr
1124 && o145 == nullptr && o146 == nullptr && o147 == nullptr && o148 == nullptr && o149 == nullptr
1125 && o150 == nullptr && o151 == nullptr && o152 == nullptr && o153 == nullptr && o154 == nullptr
1126 && o155 == nullptr && o156 == nullptr && o157 == nullptr && o158 == nullptr && o159 == nullptr
1127 && o160 == nullptr && o161 == nullptr && o162 == nullptr && o163 == nullptr && o164 == nullptr
1128 && o165 == nullptr && o166 == nullptr && o167 == nullptr && o168 == nullptr && o169 == nullptr
1129 && o170 == nullptr && o171 == nullptr && o172 == nullptr && o173 == nullptr && o174 == nullptr
1130 && o175 == nullptr && o176 == nullptr && o177 == nullptr && o178 == nullptr && o179 == nullptr
1131 && o180 == nullptr && o181 == nullptr && o182 == nullptr && o183 == nullptr && o184 == nullptr
1132 && o185 == nullptr && o186 == nullptr && o187 == nullptr && o188 == nullptr && o189 == nullptr
1133 && o190 == nullptr && o191 == nullptr && o192 == nullptr && o193 == nullptr && o194 == nullptr
1134 && o195 == nullptr && o196 == nullptr && o197 == nullptr && o198 == nullptr && o199 == nullptr
1135 && o200 == nullptr && o201 == nullptr && o202 == nullptr && o203 == nullptr && o204 == nullptr
1136 && o205 == nullptr && o206 == nullptr && o207 == nullptr && o208 == nullptr && o209 == nullptr
1137 && o210 == nullptr && o211 == nullptr && o212 == nullptr && o213 == nullptr && o214 == nullptr
1138 && o215 == nullptr && o216 == nullptr && o217 == nullptr && o218 == nullptr && o219 == nullptr
1139 && o220 == nullptr && o221 == nullptr && o222 == nullptr && o223 == nullptr && o224 == nullptr
1140 && o225 == nullptr && o226 == nullptr && o227 == nullptr && o228 == nullptr && o229 == nullptr
1141 && o230 == nullptr && o231 == nullptr && o232 == nullptr && o233 == nullptr && o234 == nullptr
1142 && o235 == nullptr && o236 == nullptr && o237 == nullptr && o238 == nullptr && o239 == nullptr
1143 && o240 == nullptr && o241 == nullptr && o242 == nullptr && o243 == nullptr && o244 == nullptr
1144 && o245 == nullptr && o246 == nullptr && o247 == nullptr && o248 == nullptr && o249 == nullptr
1145 && o250 == nullptr && o251 == nullptr && o252 == nullptr && o253 == nullptr);
1146 } else {
1147 EXPECT_EQ(0, env->GetArrayLength(reinterpret_cast<jarray>(o0)));
1148 EXPECT_EQ(1, env->GetArrayLength(reinterpret_cast<jarray>(o1)));
1149 EXPECT_EQ(2, env->GetArrayLength(reinterpret_cast<jarray>(o2)));
1150 EXPECT_EQ(3, env->GetArrayLength(reinterpret_cast<jarray>(o3)));
1151 EXPECT_EQ(4, env->GetArrayLength(reinterpret_cast<jarray>(o4)));
1152 EXPECT_EQ(5, env->GetArrayLength(reinterpret_cast<jarray>(o5)));
1153 EXPECT_EQ(6, env->GetArrayLength(reinterpret_cast<jarray>(o6)));
1154 EXPECT_EQ(7, env->GetArrayLength(reinterpret_cast<jarray>(o7)));
1155 EXPECT_EQ(8, env->GetArrayLength(reinterpret_cast<jarray>(o8)));
1156 EXPECT_EQ(9, env->GetArrayLength(reinterpret_cast<jarray>(o9)));
1157 EXPECT_EQ(10, env->GetArrayLength(reinterpret_cast<jarray>(o10)));
1158 EXPECT_EQ(11, env->GetArrayLength(reinterpret_cast<jarray>(o11)));
1159 EXPECT_EQ(12, env->GetArrayLength(reinterpret_cast<jarray>(o12)));
1160 EXPECT_EQ(13, env->GetArrayLength(reinterpret_cast<jarray>(o13)));
1161 EXPECT_EQ(14, env->GetArrayLength(reinterpret_cast<jarray>(o14)));
1162 EXPECT_EQ(15, env->GetArrayLength(reinterpret_cast<jarray>(o15)));
1163 EXPECT_EQ(16, env->GetArrayLength(reinterpret_cast<jarray>(o16)));
1164 EXPECT_EQ(17, env->GetArrayLength(reinterpret_cast<jarray>(o17)));
1165 EXPECT_EQ(18, env->GetArrayLength(reinterpret_cast<jarray>(o18)));
1166 EXPECT_EQ(19, env->GetArrayLength(reinterpret_cast<jarray>(o19)));
1167 EXPECT_EQ(20, env->GetArrayLength(reinterpret_cast<jarray>(o20)));
1168 EXPECT_EQ(21, env->GetArrayLength(reinterpret_cast<jarray>(o21)));
1169 EXPECT_EQ(22, env->GetArrayLength(reinterpret_cast<jarray>(o22)));
1170 EXPECT_EQ(23, env->GetArrayLength(reinterpret_cast<jarray>(o23)));
1171 EXPECT_EQ(24, env->GetArrayLength(reinterpret_cast<jarray>(o24)));
1172 EXPECT_EQ(25, env->GetArrayLength(reinterpret_cast<jarray>(o25)));
1173 EXPECT_EQ(26, env->GetArrayLength(reinterpret_cast<jarray>(o26)));
1174 EXPECT_EQ(27, env->GetArrayLength(reinterpret_cast<jarray>(o27)));
1175 EXPECT_EQ(28, env->GetArrayLength(reinterpret_cast<jarray>(o28)));
1176 EXPECT_EQ(29, env->GetArrayLength(reinterpret_cast<jarray>(o29)));
1177 EXPECT_EQ(30, env->GetArrayLength(reinterpret_cast<jarray>(o30)));
1178 EXPECT_EQ(31, env->GetArrayLength(reinterpret_cast<jarray>(o31)));
1179 EXPECT_EQ(32, env->GetArrayLength(reinterpret_cast<jarray>(o32)));
1180 EXPECT_EQ(33, env->GetArrayLength(reinterpret_cast<jarray>(o33)));
1181 EXPECT_EQ(34, env->GetArrayLength(reinterpret_cast<jarray>(o34)));
1182 EXPECT_EQ(35, env->GetArrayLength(reinterpret_cast<jarray>(o35)));
1183 EXPECT_EQ(36, env->GetArrayLength(reinterpret_cast<jarray>(o36)));
1184 EXPECT_EQ(37, env->GetArrayLength(reinterpret_cast<jarray>(o37)));
1185 EXPECT_EQ(38, env->GetArrayLength(reinterpret_cast<jarray>(o38)));
1186 EXPECT_EQ(39, env->GetArrayLength(reinterpret_cast<jarray>(o39)));
1187 EXPECT_EQ(40, env->GetArrayLength(reinterpret_cast<jarray>(o40)));
1188 EXPECT_EQ(41, env->GetArrayLength(reinterpret_cast<jarray>(o41)));
1189 EXPECT_EQ(42, env->GetArrayLength(reinterpret_cast<jarray>(o42)));
1190 EXPECT_EQ(43, env->GetArrayLength(reinterpret_cast<jarray>(o43)));
1191 EXPECT_EQ(44, env->GetArrayLength(reinterpret_cast<jarray>(o44)));
1192 EXPECT_EQ(45, env->GetArrayLength(reinterpret_cast<jarray>(o45)));
1193 EXPECT_EQ(46, env->GetArrayLength(reinterpret_cast<jarray>(o46)));
1194 EXPECT_EQ(47, env->GetArrayLength(reinterpret_cast<jarray>(o47)));
1195 EXPECT_EQ(48, env->GetArrayLength(reinterpret_cast<jarray>(o48)));
1196 EXPECT_EQ(49, env->GetArrayLength(reinterpret_cast<jarray>(o49)));
1197 EXPECT_EQ(50, env->GetArrayLength(reinterpret_cast<jarray>(o50)));
1198 EXPECT_EQ(51, env->GetArrayLength(reinterpret_cast<jarray>(o51)));
1199 EXPECT_EQ(52, env->GetArrayLength(reinterpret_cast<jarray>(o52)));
1200 EXPECT_EQ(53, env->GetArrayLength(reinterpret_cast<jarray>(o53)));
1201 EXPECT_EQ(54, env->GetArrayLength(reinterpret_cast<jarray>(o54)));
1202 EXPECT_EQ(55, env->GetArrayLength(reinterpret_cast<jarray>(o55)));
1203 EXPECT_EQ(56, env->GetArrayLength(reinterpret_cast<jarray>(o56)));
1204 EXPECT_EQ(57, env->GetArrayLength(reinterpret_cast<jarray>(o57)));
1205 EXPECT_EQ(58, env->GetArrayLength(reinterpret_cast<jarray>(o58)));
1206 EXPECT_EQ(59, env->GetArrayLength(reinterpret_cast<jarray>(o59)));
1207 EXPECT_EQ(60, env->GetArrayLength(reinterpret_cast<jarray>(o60)));
1208 EXPECT_EQ(61, env->GetArrayLength(reinterpret_cast<jarray>(o61)));
1209 EXPECT_EQ(62, env->GetArrayLength(reinterpret_cast<jarray>(o62)));
1210 EXPECT_EQ(63, env->GetArrayLength(reinterpret_cast<jarray>(o63)));
1211 EXPECT_EQ(64, env->GetArrayLength(reinterpret_cast<jarray>(o64)));
1212 EXPECT_EQ(65, env->GetArrayLength(reinterpret_cast<jarray>(o65)));
1213 EXPECT_EQ(66, env->GetArrayLength(reinterpret_cast<jarray>(o66)));
1214 EXPECT_EQ(67, env->GetArrayLength(reinterpret_cast<jarray>(o67)));
1215 EXPECT_EQ(68, env->GetArrayLength(reinterpret_cast<jarray>(o68)));
1216 EXPECT_EQ(69, env->GetArrayLength(reinterpret_cast<jarray>(o69)));
1217 EXPECT_EQ(70, env->GetArrayLength(reinterpret_cast<jarray>(o70)));
1218 EXPECT_EQ(71, env->GetArrayLength(reinterpret_cast<jarray>(o71)));
1219 EXPECT_EQ(72, env->GetArrayLength(reinterpret_cast<jarray>(o72)));
1220 EXPECT_EQ(73, env->GetArrayLength(reinterpret_cast<jarray>(o73)));
1221 EXPECT_EQ(74, env->GetArrayLength(reinterpret_cast<jarray>(o74)));
1222 EXPECT_EQ(75, env->GetArrayLength(reinterpret_cast<jarray>(o75)));
1223 EXPECT_EQ(76, env->GetArrayLength(reinterpret_cast<jarray>(o76)));
1224 EXPECT_EQ(77, env->GetArrayLength(reinterpret_cast<jarray>(o77)));
1225 EXPECT_EQ(78, env->GetArrayLength(reinterpret_cast<jarray>(o78)));
1226 EXPECT_EQ(79, env->GetArrayLength(reinterpret_cast<jarray>(o79)));
1227 EXPECT_EQ(80, env->GetArrayLength(reinterpret_cast<jarray>(o80)));
1228 EXPECT_EQ(81, env->GetArrayLength(reinterpret_cast<jarray>(o81)));
1229 EXPECT_EQ(82, env->GetArrayLength(reinterpret_cast<jarray>(o82)));
1230 EXPECT_EQ(83, env->GetArrayLength(reinterpret_cast<jarray>(o83)));
1231 EXPECT_EQ(84, env->GetArrayLength(reinterpret_cast<jarray>(o84)));
1232 EXPECT_EQ(85, env->GetArrayLength(reinterpret_cast<jarray>(o85)));
1233 EXPECT_EQ(86, env->GetArrayLength(reinterpret_cast<jarray>(o86)));
1234 EXPECT_EQ(87, env->GetArrayLength(reinterpret_cast<jarray>(o87)));
1235 EXPECT_EQ(88, env->GetArrayLength(reinterpret_cast<jarray>(o88)));
1236 EXPECT_EQ(89, env->GetArrayLength(reinterpret_cast<jarray>(o89)));
1237 EXPECT_EQ(90, env->GetArrayLength(reinterpret_cast<jarray>(o90)));
1238 EXPECT_EQ(91, env->GetArrayLength(reinterpret_cast<jarray>(o91)));
1239 EXPECT_EQ(92, env->GetArrayLength(reinterpret_cast<jarray>(o92)));
1240 EXPECT_EQ(93, env->GetArrayLength(reinterpret_cast<jarray>(o93)));
1241 EXPECT_EQ(94, env->GetArrayLength(reinterpret_cast<jarray>(o94)));
1242 EXPECT_EQ(95, env->GetArrayLength(reinterpret_cast<jarray>(o95)));
1243 EXPECT_EQ(96, env->GetArrayLength(reinterpret_cast<jarray>(o96)));
1244 EXPECT_EQ(97, env->GetArrayLength(reinterpret_cast<jarray>(o97)));
1245 EXPECT_EQ(98, env->GetArrayLength(reinterpret_cast<jarray>(o98)));
1246 EXPECT_EQ(99, env->GetArrayLength(reinterpret_cast<jarray>(o99)));
1247 EXPECT_EQ(100, env->GetArrayLength(reinterpret_cast<jarray>(o100)));
1248 EXPECT_EQ(101, env->GetArrayLength(reinterpret_cast<jarray>(o101)));
1249 EXPECT_EQ(102, env->GetArrayLength(reinterpret_cast<jarray>(o102)));
1250 EXPECT_EQ(103, env->GetArrayLength(reinterpret_cast<jarray>(o103)));
1251 EXPECT_EQ(104, env->GetArrayLength(reinterpret_cast<jarray>(o104)));
1252 EXPECT_EQ(105, env->GetArrayLength(reinterpret_cast<jarray>(o105)));
1253 EXPECT_EQ(106, env->GetArrayLength(reinterpret_cast<jarray>(o106)));
1254 EXPECT_EQ(107, env->GetArrayLength(reinterpret_cast<jarray>(o107)));
1255 EXPECT_EQ(108, env->GetArrayLength(reinterpret_cast<jarray>(o108)));
1256 EXPECT_EQ(109, env->GetArrayLength(reinterpret_cast<jarray>(o109)));
1257 EXPECT_EQ(110, env->GetArrayLength(reinterpret_cast<jarray>(o110)));
1258 EXPECT_EQ(111, env->GetArrayLength(reinterpret_cast<jarray>(o111)));
1259 EXPECT_EQ(112, env->GetArrayLength(reinterpret_cast<jarray>(o112)));
1260 EXPECT_EQ(113, env->GetArrayLength(reinterpret_cast<jarray>(o113)));
1261 EXPECT_EQ(114, env->GetArrayLength(reinterpret_cast<jarray>(o114)));
1262 EXPECT_EQ(115, env->GetArrayLength(reinterpret_cast<jarray>(o115)));
1263 EXPECT_EQ(116, env->GetArrayLength(reinterpret_cast<jarray>(o116)));
1264 EXPECT_EQ(117, env->GetArrayLength(reinterpret_cast<jarray>(o117)));
1265 EXPECT_EQ(118, env->GetArrayLength(reinterpret_cast<jarray>(o118)));
1266 EXPECT_EQ(119, env->GetArrayLength(reinterpret_cast<jarray>(o119)));
1267 EXPECT_EQ(120, env->GetArrayLength(reinterpret_cast<jarray>(o120)));
1268 EXPECT_EQ(121, env->GetArrayLength(reinterpret_cast<jarray>(o121)));
1269 EXPECT_EQ(122, env->GetArrayLength(reinterpret_cast<jarray>(o122)));
1270 EXPECT_EQ(123, env->GetArrayLength(reinterpret_cast<jarray>(o123)));
1271 EXPECT_EQ(124, env->GetArrayLength(reinterpret_cast<jarray>(o124)));
1272 EXPECT_EQ(125, env->GetArrayLength(reinterpret_cast<jarray>(o125)));
1273 EXPECT_EQ(126, env->GetArrayLength(reinterpret_cast<jarray>(o126)));
1274 EXPECT_EQ(127, env->GetArrayLength(reinterpret_cast<jarray>(o127)));
1275 EXPECT_EQ(128, env->GetArrayLength(reinterpret_cast<jarray>(o128)));
1276 EXPECT_EQ(129, env->GetArrayLength(reinterpret_cast<jarray>(o129)));
1277 EXPECT_EQ(130, env->GetArrayLength(reinterpret_cast<jarray>(o130)));
1278 EXPECT_EQ(131, env->GetArrayLength(reinterpret_cast<jarray>(o131)));
1279 EXPECT_EQ(132, env->GetArrayLength(reinterpret_cast<jarray>(o132)));
1280 EXPECT_EQ(133, env->GetArrayLength(reinterpret_cast<jarray>(o133)));
1281 EXPECT_EQ(134, env->GetArrayLength(reinterpret_cast<jarray>(o134)));
1282 EXPECT_EQ(135, env->GetArrayLength(reinterpret_cast<jarray>(o135)));
1283 EXPECT_EQ(136, env->GetArrayLength(reinterpret_cast<jarray>(o136)));
1284 EXPECT_EQ(137, env->GetArrayLength(reinterpret_cast<jarray>(o137)));
1285 EXPECT_EQ(138, env->GetArrayLength(reinterpret_cast<jarray>(o138)));
1286 EXPECT_EQ(139, env->GetArrayLength(reinterpret_cast<jarray>(o139)));
1287 EXPECT_EQ(140, env->GetArrayLength(reinterpret_cast<jarray>(o140)));
1288 EXPECT_EQ(141, env->GetArrayLength(reinterpret_cast<jarray>(o141)));
1289 EXPECT_EQ(142, env->GetArrayLength(reinterpret_cast<jarray>(o142)));
1290 EXPECT_EQ(143, env->GetArrayLength(reinterpret_cast<jarray>(o143)));
1291 EXPECT_EQ(144, env->GetArrayLength(reinterpret_cast<jarray>(o144)));
1292 EXPECT_EQ(145, env->GetArrayLength(reinterpret_cast<jarray>(o145)));
1293 EXPECT_EQ(146, env->GetArrayLength(reinterpret_cast<jarray>(o146)));
1294 EXPECT_EQ(147, env->GetArrayLength(reinterpret_cast<jarray>(o147)));
1295 EXPECT_EQ(148, env->GetArrayLength(reinterpret_cast<jarray>(o148)));
1296 EXPECT_EQ(149, env->GetArrayLength(reinterpret_cast<jarray>(o149)));
1297 EXPECT_EQ(150, env->GetArrayLength(reinterpret_cast<jarray>(o150)));
1298 EXPECT_EQ(151, env->GetArrayLength(reinterpret_cast<jarray>(o151)));
1299 EXPECT_EQ(152, env->GetArrayLength(reinterpret_cast<jarray>(o152)));
1300 EXPECT_EQ(153, env->GetArrayLength(reinterpret_cast<jarray>(o153)));
1301 EXPECT_EQ(154, env->GetArrayLength(reinterpret_cast<jarray>(o154)));
1302 EXPECT_EQ(155, env->GetArrayLength(reinterpret_cast<jarray>(o155)));
1303 EXPECT_EQ(156, env->GetArrayLength(reinterpret_cast<jarray>(o156)));
1304 EXPECT_EQ(157, env->GetArrayLength(reinterpret_cast<jarray>(o157)));
1305 EXPECT_EQ(158, env->GetArrayLength(reinterpret_cast<jarray>(o158)));
1306 EXPECT_EQ(159, env->GetArrayLength(reinterpret_cast<jarray>(o159)));
1307 EXPECT_EQ(160, env->GetArrayLength(reinterpret_cast<jarray>(o160)));
1308 EXPECT_EQ(161, env->GetArrayLength(reinterpret_cast<jarray>(o161)));
1309 EXPECT_EQ(162, env->GetArrayLength(reinterpret_cast<jarray>(o162)));
1310 EXPECT_EQ(163, env->GetArrayLength(reinterpret_cast<jarray>(o163)));
1311 EXPECT_EQ(164, env->GetArrayLength(reinterpret_cast<jarray>(o164)));
1312 EXPECT_EQ(165, env->GetArrayLength(reinterpret_cast<jarray>(o165)));
1313 EXPECT_EQ(166, env->GetArrayLength(reinterpret_cast<jarray>(o166)));
1314 EXPECT_EQ(167, env->GetArrayLength(reinterpret_cast<jarray>(o167)));
1315 EXPECT_EQ(168, env->GetArrayLength(reinterpret_cast<jarray>(o168)));
1316 EXPECT_EQ(169, env->GetArrayLength(reinterpret_cast<jarray>(o169)));
1317 EXPECT_EQ(170, env->GetArrayLength(reinterpret_cast<jarray>(o170)));
1318 EXPECT_EQ(171, env->GetArrayLength(reinterpret_cast<jarray>(o171)));
1319 EXPECT_EQ(172, env->GetArrayLength(reinterpret_cast<jarray>(o172)));
1320 EXPECT_EQ(173, env->GetArrayLength(reinterpret_cast<jarray>(o173)));
1321 EXPECT_EQ(174, env->GetArrayLength(reinterpret_cast<jarray>(o174)));
1322 EXPECT_EQ(175, env->GetArrayLength(reinterpret_cast<jarray>(o175)));
1323 EXPECT_EQ(176, env->GetArrayLength(reinterpret_cast<jarray>(o176)));
1324 EXPECT_EQ(177, env->GetArrayLength(reinterpret_cast<jarray>(o177)));
1325 EXPECT_EQ(178, env->GetArrayLength(reinterpret_cast<jarray>(o178)));
1326 EXPECT_EQ(179, env->GetArrayLength(reinterpret_cast<jarray>(o179)));
1327 EXPECT_EQ(180, env->GetArrayLength(reinterpret_cast<jarray>(o180)));
1328 EXPECT_EQ(181, env->GetArrayLength(reinterpret_cast<jarray>(o181)));
1329 EXPECT_EQ(182, env->GetArrayLength(reinterpret_cast<jarray>(o182)));
1330 EXPECT_EQ(183, env->GetArrayLength(reinterpret_cast<jarray>(o183)));
1331 EXPECT_EQ(184, env->GetArrayLength(reinterpret_cast<jarray>(o184)));
1332 EXPECT_EQ(185, env->GetArrayLength(reinterpret_cast<jarray>(o185)));
1333 EXPECT_EQ(186, env->GetArrayLength(reinterpret_cast<jarray>(o186)));
1334 EXPECT_EQ(187, env->GetArrayLength(reinterpret_cast<jarray>(o187)));
1335 EXPECT_EQ(188, env->GetArrayLength(reinterpret_cast<jarray>(o188)));
1336 EXPECT_EQ(189, env->GetArrayLength(reinterpret_cast<jarray>(o189)));
1337 EXPECT_EQ(190, env->GetArrayLength(reinterpret_cast<jarray>(o190)));
1338 EXPECT_EQ(191, env->GetArrayLength(reinterpret_cast<jarray>(o191)));
1339 EXPECT_EQ(192, env->GetArrayLength(reinterpret_cast<jarray>(o192)));
1340 EXPECT_EQ(193, env->GetArrayLength(reinterpret_cast<jarray>(o193)));
1341 EXPECT_EQ(194, env->GetArrayLength(reinterpret_cast<jarray>(o194)));
1342 EXPECT_EQ(195, env->GetArrayLength(reinterpret_cast<jarray>(o195)));
1343 EXPECT_EQ(196, env->GetArrayLength(reinterpret_cast<jarray>(o196)));
1344 EXPECT_EQ(197, env->GetArrayLength(reinterpret_cast<jarray>(o197)));
1345 EXPECT_EQ(198, env->GetArrayLength(reinterpret_cast<jarray>(o198)));
1346 EXPECT_EQ(199, env->GetArrayLength(reinterpret_cast<jarray>(o199)));
1347 EXPECT_EQ(200, env->GetArrayLength(reinterpret_cast<jarray>(o200)));
1348 EXPECT_EQ(201, env->GetArrayLength(reinterpret_cast<jarray>(o201)));
1349 EXPECT_EQ(202, env->GetArrayLength(reinterpret_cast<jarray>(o202)));
1350 EXPECT_EQ(203, env->GetArrayLength(reinterpret_cast<jarray>(o203)));
1351 EXPECT_EQ(204, env->GetArrayLength(reinterpret_cast<jarray>(o204)));
1352 EXPECT_EQ(205, env->GetArrayLength(reinterpret_cast<jarray>(o205)));
1353 EXPECT_EQ(206, env->GetArrayLength(reinterpret_cast<jarray>(o206)));
1354 EXPECT_EQ(207, env->GetArrayLength(reinterpret_cast<jarray>(o207)));
1355 EXPECT_EQ(208, env->GetArrayLength(reinterpret_cast<jarray>(o208)));
1356 EXPECT_EQ(209, env->GetArrayLength(reinterpret_cast<jarray>(o209)));
1357 EXPECT_EQ(210, env->GetArrayLength(reinterpret_cast<jarray>(o210)));
1358 EXPECT_EQ(211, env->GetArrayLength(reinterpret_cast<jarray>(o211)));
1359 EXPECT_EQ(212, env->GetArrayLength(reinterpret_cast<jarray>(o212)));
1360 EXPECT_EQ(213, env->GetArrayLength(reinterpret_cast<jarray>(o213)));
1361 EXPECT_EQ(214, env->GetArrayLength(reinterpret_cast<jarray>(o214)));
1362 EXPECT_EQ(215, env->GetArrayLength(reinterpret_cast<jarray>(o215)));
1363 EXPECT_EQ(216, env->GetArrayLength(reinterpret_cast<jarray>(o216)));
1364 EXPECT_EQ(217, env->GetArrayLength(reinterpret_cast<jarray>(o217)));
1365 EXPECT_EQ(218, env->GetArrayLength(reinterpret_cast<jarray>(o218)));
1366 EXPECT_EQ(219, env->GetArrayLength(reinterpret_cast<jarray>(o219)));
1367 EXPECT_EQ(220, env->GetArrayLength(reinterpret_cast<jarray>(o220)));
1368 EXPECT_EQ(221, env->GetArrayLength(reinterpret_cast<jarray>(o221)));
1369 EXPECT_EQ(222, env->GetArrayLength(reinterpret_cast<jarray>(o222)));
1370 EXPECT_EQ(223, env->GetArrayLength(reinterpret_cast<jarray>(o223)));
1371 EXPECT_EQ(224, env->GetArrayLength(reinterpret_cast<jarray>(o224)));
1372 EXPECT_EQ(225, env->GetArrayLength(reinterpret_cast<jarray>(o225)));
1373 EXPECT_EQ(226, env->GetArrayLength(reinterpret_cast<jarray>(o226)));
1374 EXPECT_EQ(227, env->GetArrayLength(reinterpret_cast<jarray>(o227)));
1375 EXPECT_EQ(228, env->GetArrayLength(reinterpret_cast<jarray>(o228)));
1376 EXPECT_EQ(229, env->GetArrayLength(reinterpret_cast<jarray>(o229)));
1377 EXPECT_EQ(230, env->GetArrayLength(reinterpret_cast<jarray>(o230)));
1378 EXPECT_EQ(231, env->GetArrayLength(reinterpret_cast<jarray>(o231)));
1379 EXPECT_EQ(232, env->GetArrayLength(reinterpret_cast<jarray>(o232)));
1380 EXPECT_EQ(233, env->GetArrayLength(reinterpret_cast<jarray>(o233)));
1381 EXPECT_EQ(234, env->GetArrayLength(reinterpret_cast<jarray>(o234)));
1382 EXPECT_EQ(235, env->GetArrayLength(reinterpret_cast<jarray>(o235)));
1383 EXPECT_EQ(236, env->GetArrayLength(reinterpret_cast<jarray>(o236)));
1384 EXPECT_EQ(237, env->GetArrayLength(reinterpret_cast<jarray>(o237)));
1385 EXPECT_EQ(238, env->GetArrayLength(reinterpret_cast<jarray>(o238)));
1386 EXPECT_EQ(239, env->GetArrayLength(reinterpret_cast<jarray>(o239)));
1387 EXPECT_EQ(240, env->GetArrayLength(reinterpret_cast<jarray>(o240)));
1388 EXPECT_EQ(241, env->GetArrayLength(reinterpret_cast<jarray>(o241)));
1389 EXPECT_EQ(242, env->GetArrayLength(reinterpret_cast<jarray>(o242)));
1390 EXPECT_EQ(243, env->GetArrayLength(reinterpret_cast<jarray>(o243)));
1391 EXPECT_EQ(244, env->GetArrayLength(reinterpret_cast<jarray>(o244)));
1392 EXPECT_EQ(245, env->GetArrayLength(reinterpret_cast<jarray>(o245)));
1393 EXPECT_EQ(246, env->GetArrayLength(reinterpret_cast<jarray>(o246)));
1394 EXPECT_EQ(247, env->GetArrayLength(reinterpret_cast<jarray>(o247)));
1395 EXPECT_EQ(248, env->GetArrayLength(reinterpret_cast<jarray>(o248)));
1396 EXPECT_EQ(249, env->GetArrayLength(reinterpret_cast<jarray>(o249)));
1397 EXPECT_EQ(250, env->GetArrayLength(reinterpret_cast<jarray>(o250)));
1398 EXPECT_EQ(251, env->GetArrayLength(reinterpret_cast<jarray>(o251)));
1399 EXPECT_EQ(252, env->GetArrayLength(reinterpret_cast<jarray>(o252)));
1400 EXPECT_EQ(253, env->GetArrayLength(reinterpret_cast<jarray>(o253)));
1401 }
1402}
1403
1404const char* longSig =
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;Ljava/lang/Object;"
1455 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)V";
1456
Andreas Gampe6e498692014-08-18 16:43:12 -07001457void JniCompilerTest::MaxParamNumberImpl() {
Andreas Gampe7a0e5042014-03-07 13:03:19 -08001458 SetUpForTest(false, "maxParamNumber", longSig,
1459 reinterpret_cast<void*>(&Java_MyClassNatives_maxParamNumber));
1460
1461 jvalue args[254];
1462
1463 // First test: test with all arguments null.
1464 for (int i = 0; i < 254; ++i) {
1465 args[i].l = nullptr;
1466 }
1467
1468 env_->CallNonvirtualVoidMethodA(jobj_, jklass_, jmethod_, args);
1469
1470 // Second test: test with int[] objects with increasing lengths
1471 for (int i = 0; i < 254; ++i) {
1472 jintArray tmp = env_->NewIntArray(i);
1473 args[i].l = tmp;
1474 EXPECT_NE(args[i].l, nullptr);
1475 }
1476
1477 env_->CallNonvirtualVoidMethodA(jobj_, jklass_, jmethod_, args);
1478}
1479
Andreas Gampe6e498692014-08-18 16:43:12 -07001480JNI_TEST(MaxParamNumber)
1481
1482void JniCompilerTest::WithoutImplementationImpl() {
Andreas Gampe369810a2015-01-14 19:53:31 -08001483 // This will lead to error messages in the log.
1484 ScopedLogSeverity sls(LogSeverity::FATAL);
1485
Andreas Gampead615172014-04-04 16:20:13 -07001486 SetUpForTest(false, "withoutImplementation", "()V", nullptr);
1487
1488 env_->CallVoidMethod(jobj_, jmethod_);
1489
1490 EXPECT_TRUE(Thread::Current()->IsExceptionPending());
1491 EXPECT_TRUE(env_->ExceptionCheck() == JNI_TRUE);
1492}
1493
Andreas Gampe6e498692014-08-18 16:43:12 -07001494JNI_TEST(WithoutImplementation)
1495
Andreas Gampe48ee3562015-04-10 19:57:29 -07001496void JniCompilerTest::WithoutImplementationRefReturnImpl() {
1497 // This will lead to error messages in the log.
1498 ScopedLogSeverity sls(LogSeverity::FATAL);
1499
1500 SetUpForTest(false, "withoutImplementationRefReturn", "()Ljava/lang/Object;", nullptr);
1501
1502 env_->CallObjectMethod(jobj_, jmethod_);
1503
1504 EXPECT_TRUE(Thread::Current()->IsExceptionPending());
1505 EXPECT_TRUE(env_->ExceptionCheck() == JNI_TRUE);
1506}
1507
1508JNI_TEST(WithoutImplementationRefReturn)
1509
Ian Rogers6a3c1fc2014-10-31 00:33:20 -07001510void Java_MyClassNatives_stackArgsIntsFirst(JNIEnv*, jclass, jint i1, jint i2, jint i3,
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001511 jint i4, jint i5, jint i6, jint i7, jint i8, jint i9,
1512 jint i10, jfloat f1, jfloat f2, jfloat f3, jfloat f4,
1513 jfloat f5, jfloat f6, jfloat f7, jfloat f8, jfloat f9,
1514 jfloat f10) {
1515 EXPECT_EQ(i1, 1);
1516 EXPECT_EQ(i2, 2);
1517 EXPECT_EQ(i3, 3);
1518 EXPECT_EQ(i4, 4);
1519 EXPECT_EQ(i5, 5);
1520 EXPECT_EQ(i6, 6);
1521 EXPECT_EQ(i7, 7);
1522 EXPECT_EQ(i8, 8);
1523 EXPECT_EQ(i9, 9);
1524 EXPECT_EQ(i10, 10);
1525
Roland Levillainda4d79b2015-03-24 14:36:11 +00001526 jint i11 = bit_cast<jint, jfloat>(f1);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001527 EXPECT_EQ(i11, 11);
Roland Levillainda4d79b2015-03-24 14:36:11 +00001528 jint i12 = bit_cast<jint, jfloat>(f2);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001529 EXPECT_EQ(i12, 12);
Roland Levillainda4d79b2015-03-24 14:36:11 +00001530 jint i13 = bit_cast<jint, jfloat>(f3);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001531 EXPECT_EQ(i13, 13);
Roland Levillainda4d79b2015-03-24 14:36:11 +00001532 jint i14 = bit_cast<jint, jfloat>(f4);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001533 EXPECT_EQ(i14, 14);
Roland Levillainda4d79b2015-03-24 14:36:11 +00001534 jint i15 = bit_cast<jint, jfloat>(f5);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001535 EXPECT_EQ(i15, 15);
Roland Levillainda4d79b2015-03-24 14:36:11 +00001536 jint i16 = bit_cast<jint, jfloat>(f6);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001537 EXPECT_EQ(i16, 16);
Roland Levillainda4d79b2015-03-24 14:36:11 +00001538 jint i17 = bit_cast<jint, jfloat>(f7);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001539 EXPECT_EQ(i17, 17);
Roland Levillainda4d79b2015-03-24 14:36:11 +00001540 jint i18 = bit_cast<jint, jfloat>(f8);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001541 EXPECT_EQ(i18, 18);
Roland Levillainda4d79b2015-03-24 14:36:11 +00001542 jint i19 = bit_cast<jint, jfloat>(f9);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001543 EXPECT_EQ(i19, 19);
Roland Levillainda4d79b2015-03-24 14:36:11 +00001544 jint i20 = bit_cast<jint, jfloat>(f10);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001545 EXPECT_EQ(i20, 20);
1546}
1547
Andreas Gampe6e498692014-08-18 16:43:12 -07001548void JniCompilerTest::StackArgsIntsFirstImpl() {
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001549 SetUpForTest(true, "stackArgsIntsFirst", "(IIIIIIIIIIFFFFFFFFFF)V",
1550 reinterpret_cast<void*>(&Java_MyClassNatives_stackArgsIntsFirst));
1551
1552 jint i1 = 1;
1553 jint i2 = 2;
1554 jint i3 = 3;
1555 jint i4 = 4;
1556 jint i5 = 5;
1557 jint i6 = 6;
1558 jint i7 = 7;
1559 jint i8 = 8;
1560 jint i9 = 9;
1561 jint i10 = 10;
1562
Roland Levillainda4d79b2015-03-24 14:36:11 +00001563 jfloat f1 = bit_cast<jfloat, jint>(11);
1564 jfloat f2 = bit_cast<jfloat, jint>(12);
1565 jfloat f3 = bit_cast<jfloat, jint>(13);
1566 jfloat f4 = bit_cast<jfloat, jint>(14);
1567 jfloat f5 = bit_cast<jfloat, jint>(15);
1568 jfloat f6 = bit_cast<jfloat, jint>(16);
1569 jfloat f7 = bit_cast<jfloat, jint>(17);
1570 jfloat f8 = bit_cast<jfloat, jint>(18);
1571 jfloat f9 = bit_cast<jfloat, jint>(19);
1572 jfloat f10 = bit_cast<jfloat, jint>(20);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001573
1574 env_->CallStaticVoidMethod(jklass_, jmethod_, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, f1, f2,
1575 f3, f4, f5, f6, f7, f8, f9, f10);
1576}
1577
Andreas Gampe6e498692014-08-18 16:43:12 -07001578JNI_TEST(StackArgsIntsFirst)
1579
Ian Rogers6a3c1fc2014-10-31 00:33:20 -07001580void Java_MyClassNatives_stackArgsFloatsFirst(JNIEnv*, jclass, jfloat f1, jfloat f2,
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001581 jfloat f3, jfloat f4, jfloat f5, jfloat f6, jfloat f7,
1582 jfloat f8, jfloat f9, jfloat f10, jint i1, jint i2,
1583 jint i3, jint i4, jint i5, jint i6, jint i7, jint i8,
1584 jint i9, jint i10) {
1585 EXPECT_EQ(i1, 1);
1586 EXPECT_EQ(i2, 2);
1587 EXPECT_EQ(i3, 3);
1588 EXPECT_EQ(i4, 4);
1589 EXPECT_EQ(i5, 5);
1590 EXPECT_EQ(i6, 6);
1591 EXPECT_EQ(i7, 7);
1592 EXPECT_EQ(i8, 8);
1593 EXPECT_EQ(i9, 9);
1594 EXPECT_EQ(i10, 10);
1595
Roland Levillainda4d79b2015-03-24 14:36:11 +00001596 jint i11 = bit_cast<jint, jfloat>(f1);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001597 EXPECT_EQ(i11, 11);
Roland Levillainda4d79b2015-03-24 14:36:11 +00001598 jint i12 = bit_cast<jint, jfloat>(f2);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001599 EXPECT_EQ(i12, 12);
Roland Levillainda4d79b2015-03-24 14:36:11 +00001600 jint i13 = bit_cast<jint, jfloat>(f3);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001601 EXPECT_EQ(i13, 13);
Roland Levillainda4d79b2015-03-24 14:36:11 +00001602 jint i14 = bit_cast<jint, jfloat>(f4);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001603 EXPECT_EQ(i14, 14);
Roland Levillainda4d79b2015-03-24 14:36:11 +00001604 jint i15 = bit_cast<jint, jfloat>(f5);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001605 EXPECT_EQ(i15, 15);
Roland Levillainda4d79b2015-03-24 14:36:11 +00001606 jint i16 = bit_cast<jint, jfloat>(f6);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001607 EXPECT_EQ(i16, 16);
Roland Levillainda4d79b2015-03-24 14:36:11 +00001608 jint i17 = bit_cast<jint, jfloat>(f7);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001609 EXPECT_EQ(i17, 17);
Roland Levillainda4d79b2015-03-24 14:36:11 +00001610 jint i18 = bit_cast<jint, jfloat>(f8);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001611 EXPECT_EQ(i18, 18);
Roland Levillainda4d79b2015-03-24 14:36:11 +00001612 jint i19 = bit_cast<jint, jfloat>(f9);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001613 EXPECT_EQ(i19, 19);
Roland Levillainda4d79b2015-03-24 14:36:11 +00001614 jint i20 = bit_cast<jint, jfloat>(f10);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001615 EXPECT_EQ(i20, 20);
1616}
1617
Andreas Gampe6e498692014-08-18 16:43:12 -07001618void JniCompilerTest::StackArgsFloatsFirstImpl() {
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001619 SetUpForTest(true, "stackArgsFloatsFirst", "(FFFFFFFFFFIIIIIIIIII)V",
1620 reinterpret_cast<void*>(&Java_MyClassNatives_stackArgsFloatsFirst));
1621
1622 jint i1 = 1;
1623 jint i2 = 2;
1624 jint i3 = 3;
1625 jint i4 = 4;
1626 jint i5 = 5;
1627 jint i6 = 6;
1628 jint i7 = 7;
1629 jint i8 = 8;
1630 jint i9 = 9;
1631 jint i10 = 10;
1632
Roland Levillainda4d79b2015-03-24 14:36:11 +00001633 jfloat f1 = bit_cast<jfloat, jint>(11);
1634 jfloat f2 = bit_cast<jfloat, jint>(12);
1635 jfloat f3 = bit_cast<jfloat, jint>(13);
1636 jfloat f4 = bit_cast<jfloat, jint>(14);
1637 jfloat f5 = bit_cast<jfloat, jint>(15);
1638 jfloat f6 = bit_cast<jfloat, jint>(16);
1639 jfloat f7 = bit_cast<jfloat, jint>(17);
1640 jfloat f8 = bit_cast<jfloat, jint>(18);
1641 jfloat f9 = bit_cast<jfloat, jint>(19);
1642 jfloat f10 = bit_cast<jfloat, jint>(20);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001643
1644 env_->CallStaticVoidMethod(jklass_, jmethod_, f1, f2, f3, f4, f5, f6, f7, f8, f9, f10, i1, i2, i3,
1645 i4, i5, i6, i7, i8, i9, i10);
1646}
1647
Andreas Gampe6e498692014-08-18 16:43:12 -07001648JNI_TEST(StackArgsFloatsFirst)
1649
Ian Rogers6a3c1fc2014-10-31 00:33:20 -07001650void Java_MyClassNatives_stackArgsMixed(JNIEnv*, jclass, jint i1, jfloat f1, jint i2,
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001651 jfloat f2, jint i3, jfloat f3, jint i4, jfloat f4, jint i5,
1652 jfloat f5, jint i6, jfloat f6, jint i7, jfloat f7, jint i8,
1653 jfloat f8, jint i9, jfloat f9, jint i10, jfloat f10) {
1654 EXPECT_EQ(i1, 1);
1655 EXPECT_EQ(i2, 2);
1656 EXPECT_EQ(i3, 3);
1657 EXPECT_EQ(i4, 4);
1658 EXPECT_EQ(i5, 5);
1659 EXPECT_EQ(i6, 6);
1660 EXPECT_EQ(i7, 7);
1661 EXPECT_EQ(i8, 8);
1662 EXPECT_EQ(i9, 9);
1663 EXPECT_EQ(i10, 10);
1664
Roland Levillainda4d79b2015-03-24 14:36:11 +00001665 jint i11 = bit_cast<jint, jfloat>(f1);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001666 EXPECT_EQ(i11, 11);
Roland Levillainda4d79b2015-03-24 14:36:11 +00001667 jint i12 = bit_cast<jint, jfloat>(f2);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001668 EXPECT_EQ(i12, 12);
Roland Levillainda4d79b2015-03-24 14:36:11 +00001669 jint i13 = bit_cast<jint, jfloat>(f3);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001670 EXPECT_EQ(i13, 13);
Roland Levillainda4d79b2015-03-24 14:36:11 +00001671 jint i14 = bit_cast<jint, jfloat>(f4);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001672 EXPECT_EQ(i14, 14);
Roland Levillainda4d79b2015-03-24 14:36:11 +00001673 jint i15 = bit_cast<jint, jfloat>(f5);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001674 EXPECT_EQ(i15, 15);
Roland Levillainda4d79b2015-03-24 14:36:11 +00001675 jint i16 = bit_cast<jint, jfloat>(f6);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001676 EXPECT_EQ(i16, 16);
Roland Levillainda4d79b2015-03-24 14:36:11 +00001677 jint i17 = bit_cast<jint, jfloat>(f7);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001678 EXPECT_EQ(i17, 17);
Roland Levillainda4d79b2015-03-24 14:36:11 +00001679 jint i18 = bit_cast<jint, jfloat>(f8);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001680 EXPECT_EQ(i18, 18);
Roland Levillainda4d79b2015-03-24 14:36:11 +00001681 jint i19 = bit_cast<jint, jfloat>(f9);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001682 EXPECT_EQ(i19, 19);
Roland Levillainda4d79b2015-03-24 14:36:11 +00001683 jint i20 = bit_cast<jint, jfloat>(f10);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001684 EXPECT_EQ(i20, 20);
1685}
1686
Andreas Gampe6e498692014-08-18 16:43:12 -07001687void JniCompilerTest::StackArgsMixedImpl() {
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001688 SetUpForTest(true, "stackArgsMixed", "(IFIFIFIFIFIFIFIFIFIF)V",
1689 reinterpret_cast<void*>(&Java_MyClassNatives_stackArgsMixed));
1690
1691 jint i1 = 1;
1692 jint i2 = 2;
1693 jint i3 = 3;
1694 jint i4 = 4;
1695 jint i5 = 5;
1696 jint i6 = 6;
1697 jint i7 = 7;
1698 jint i8 = 8;
1699 jint i9 = 9;
1700 jint i10 = 10;
1701
Roland Levillainda4d79b2015-03-24 14:36:11 +00001702 jfloat f1 = bit_cast<jfloat, jint>(11);
1703 jfloat f2 = bit_cast<jfloat, jint>(12);
1704 jfloat f3 = bit_cast<jfloat, jint>(13);
1705 jfloat f4 = bit_cast<jfloat, jint>(14);
1706 jfloat f5 = bit_cast<jfloat, jint>(15);
1707 jfloat f6 = bit_cast<jfloat, jint>(16);
1708 jfloat f7 = bit_cast<jfloat, jint>(17);
1709 jfloat f8 = bit_cast<jfloat, jint>(18);
1710 jfloat f9 = bit_cast<jfloat, jint>(19);
1711 jfloat f10 = bit_cast<jfloat, jint>(20);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001712
1713 env_->CallStaticVoidMethod(jklass_, jmethod_, i1, f1, i2, f2, i3, f3, i4, f4, i5, f5, i6, f6, i7,
1714 f7, i8, f8, i9, f9, i10, f10);
1715}
1716
Andreas Gampe6e498692014-08-18 16:43:12 -07001717JNI_TEST(StackArgsMixed)
1718
Lazar Trsicf652d602015-06-24 16:30:21 +02001719void Java_MyClassNatives_stackArgsSignExtendedMips64(JNIEnv*, jclass, jint i1, jint i2, jint i3,
1720 jint i4, jint i5, jint i6, jint i7, jint i8) {
1721 EXPECT_EQ(i1, 1);
1722 EXPECT_EQ(i2, 2);
1723 EXPECT_EQ(i3, 3);
1724 EXPECT_EQ(i4, 4);
1725 EXPECT_EQ(i5, 5);
1726 EXPECT_EQ(i6, 6);
1727 EXPECT_EQ(i7, 7);
1728 EXPECT_EQ(i8, -8);
1729
1730#if defined(__mips__) && defined(__LP64__) && (__BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__)
1731 // Mips64 ABI requires that arguments passed through stack be sign-extended 8B slots.
1732 // First 8 arguments are passed through registers, check i7 and i8.
1733 uint32_t stack1_high = *(&i7 + 1);
1734 uint32_t stack2_high = *(&i8 + 1);
1735
1736 EXPECT_EQ(stack1_high, static_cast<uint32_t>(0));
1737 EXPECT_EQ(stack2_high, static_cast<uint32_t>(0xffffffff));
1738#else
1739 LOG(INFO) << "Skipping stackArgsSignExtendedMips64 as there is nothing to be done on "
1740 << kRuntimeISA;
1741 // Force-print to std::cout so it's also outside the logcat.
1742 std::cout << "Skipping stackArgsSignExtendedMips64 as there is nothing to be done on "
1743 << kRuntimeISA << std::endl;
1744#endif
1745}
1746
1747void JniCompilerTest::StackArgsSignExtendedMips64Impl() {
1748 SetUpForTest(true, "stackArgsSignExtendedMips64", "(IIIIIIII)V",
1749 reinterpret_cast<void*>(&Java_MyClassNatives_stackArgsSignExtendedMips64));
1750 jint i1 = 1;
1751 jint i2 = 2;
1752 jint i3 = 3;
1753 jint i4 = 4;
1754 jint i5 = 5;
1755 jint i6 = 6;
1756 jint i7 = 7;
1757 jint i8 = -8;
1758
1759 env_->CallStaticVoidMethod(jklass_, jmethod_, i1, i2, i3, i4, i5, i6, i7, i8);
1760}
1761
1762JNI_TEST(StackArgsSignExtendedMips64)
1763
Ian Rogersb033c752011-07-20 12:22:35 -07001764} // namespace art