blob: 4186891a2ae5c70d10e0571a90f744156fb2b6c9 [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
Brian Carlstrom578bbdc2011-07-21 14:07:47 -070021#include "class_linker.h"
Brian Carlstroma1ce1fe2014-02-24 23:23:58 -080022#include "common_compiler_test.h"
Brian Carlstrom578bbdc2011-07-21 14:07:47 -070023#include "dex_file.h"
Elliott Hughes90a33692011-08-30 13:27:07 -070024#include "gtest/gtest.h"
Ian Rogerscdd1d2d2011-08-18 09:58:17 -070025#include "indirect_reference_table.h"
Ian Rogerscdd1d2d2011-08-18 09:58:17 -070026#include "jni_internal.h"
Brian Carlstromdb4d5402011-08-09 12:18:28 -070027#include "mem_map.h"
Brian Carlstromea46f952013-07-30 01:26:50 -070028#include "mirror/art_method-inl.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);
Brian Carlstromea46f952013-07-30 01:26:50 -070068 mirror::ArtMethod* method;
Ian Rogerscdd1d2d2011-08-18 09:58:17 -070069 if (direct) {
buzbeec143c552011-08-20 17:38:58 -070070 method = c->FindDirectMethod(method_name, method_sig);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -070071 } else {
buzbeec143c552011-08-20 17:38:58 -070072 method = c->FindVirtualMethod(method_name, method_sig);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -070073 }
Andreas Gampecf4035a2014-05-28 22:43:01 -070074 ASSERT_TRUE(method != nullptr) << method_name << " " << method_sig;
Andreas Gampe6e498692014-08-18 16:43:12 -070075 if (check_generic_jni_) {
Ian Rogers6f3dbba2014-10-14 17:41:57 -070076 method->SetEntryPointFromQuickCompiledCode(class_linker_->GetRuntimeQuickGenericJniStub());
Nicolas Geoffray54accbc2014-08-13 03:40:45 +010077 } else {
Ian Rogers6f3dbba2014-10-14 17:41:57 -070078 const void* code = method->GetEntryPointFromQuickCompiledCode();
79 if (code == nullptr || class_linker_->IsQuickGenericJniStub(code)) {
Nicolas Geoffray54accbc2014-08-13 03:40:45 +010080 CompileMethod(method);
81 ASSERT_TRUE(method->GetEntryPointFromQuickCompiledCode() != nullptr)
82 << method_name << " " << method_sig;
Nicolas Geoffray54accbc2014-08-13 03:40:45 +010083 }
Brian Carlstrom25c33252011-09-18 15:58:35 -070084 }
Brian Carlstrom25c33252011-09-18 15:58:35 -070085 }
86
Ian Rogers00f7d0e2012-07-19 15:28:27 -070087 void SetUpForTest(bool direct, const char* method_name, const char* method_sig,
Andreas Gampe6e498692014-08-18 16:43:12 -070088 void* native_fnptr) {
Ian Rogers00f7d0e2012-07-19 15:28:27 -070089 // Initialize class loader and compile method when runtime not started.
Brian Carlstrom2ce745c2013-07-17 17:44:30 -070090 if (!runtime_->IsStarted()) {
Ian Rogers00f7d0e2012-07-19 15:28:27 -070091 {
92 ScopedObjectAccess soa(Thread::Current());
93 class_loader_ = LoadDex("MyClassNatives");
94 }
Andreas Gampe6e498692014-08-18 16:43:12 -070095 CompileForTest(class_loader_, direct, method_name, method_sig);
Ian Rogers00f7d0e2012-07-19 15:28:27 -070096 // Start runtime.
97 Thread::Current()->TransitionFromSuspendedToRunnable();
Brian Carlstrombd86bcc2013-03-10 20:26:16 -070098 bool started = runtime_->Start();
99 CHECK(started);
Brian Carlstrom25c33252011-09-18 15:58:35 -0700100 }
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700101 // JNI operations after runtime start.
Brian Carlstrom25c33252011-09-18 15:58:35 -0700102 env_ = Thread::Current()->GetJniEnv();
Elliott Hughesb264f082012-04-06 17:10:10 -0700103 jklass_ = env_->FindClass("MyClassNatives");
Andreas Gampecf4035a2014-05-28 22:43:01 -0700104 ASSERT_TRUE(jklass_ != nullptr) << method_name << " " << method_sig;
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700105
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700106 if (direct) {
107 jmethod_ = env_->GetStaticMethodID(jklass_, method_name, method_sig);
108 } else {
109 jmethod_ = env_->GetMethodID(jklass_, method_name, method_sig);
110 }
Andreas Gampecf4035a2014-05-28 22:43:01 -0700111 ASSERT_TRUE(jmethod_ != nullptr) << method_name << " " << method_sig;
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700112
Andreas Gampecf4035a2014-05-28 22:43:01 -0700113 if (native_fnptr != nullptr) {
Elliott Hughesb25c3f62012-03-26 16:35:06 -0700114 JNINativeMethod methods[] = { { method_name, method_sig, native_fnptr } };
Brian Carlstromfc7120c2012-08-27 13:43:25 -0700115 ASSERT_EQ(JNI_OK, env_->RegisterNatives(jklass_, methods, 1))
116 << method_name << " " << method_sig;
Ian Rogersbdb03912011-09-14 00:55:44 -0700117 } else {
118 env_->UnregisterNatives(jklass_);
Shih-wei Liao31384c52011-09-06 15:27:45 -0700119 }
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700120
121 jmethodID constructor = env_->GetMethodID(jklass_, "<init>", "()V");
122 jobj_ = env_->NewObject(jklass_, constructor);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700123 ASSERT_TRUE(jobj_ != nullptr) << method_name << " " << method_sig;
Ian Rogersb033c752011-07-20 12:22:35 -0700124 }
125
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700126 public:
127 static jclass jklass_;
128 static jobject jobj_;
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700129 static jobject class_loader_;
130
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700131 protected:
Andreas Gampe6e498692014-08-18 16:43:12 -0700132 // We have to list the methods here so we can share them between default and generic JNI.
133 void CompileAndRunNoArgMethodImpl();
134 void CompileAndRunIntMethodThroughStubImpl();
135 void CompileAndRunStaticIntMethodThroughStubImpl();
136 void CompileAndRunIntMethodImpl();
137 void CompileAndRunIntIntMethodImpl();
138 void CompileAndRunLongLongMethodImpl();
139 void CompileAndRunDoubleDoubleMethodImpl();
140 void CompileAndRun_fooJJ_synchronizedImpl();
141 void CompileAndRunIntObjectObjectMethodImpl();
142 void CompileAndRunStaticIntIntMethodImpl();
143 void CompileAndRunStaticDoubleDoubleMethodImpl();
144 void RunStaticLogDoubleMethodImpl();
145 void RunStaticLogFloatMethodImpl();
146 void RunStaticReturnTrueImpl();
147 void RunStaticReturnFalseImpl();
148 void RunGenericStaticReturnIntImpl();
149 void CompileAndRunStaticIntObjectObjectMethodImpl();
150 void CompileAndRunStaticSynchronizedIntObjectObjectMethodImpl();
151 void ExceptionHandlingImpl();
152 void NativeStackTraceElementImpl();
153 void ReturnGlobalRefImpl();
154 void LocalReferenceTableClearingTestImpl();
155 void JavaLangSystemArrayCopyImpl();
156 void CompareAndSwapIntImpl();
157 void GetTextImpl();
158 void GetSinkPropertiesNativeImpl();
159 void UpcallReturnTypeChecking_InstanceImpl();
160 void UpcallReturnTypeChecking_StaticImpl();
161 void UpcallArgumentTypeChecking_InstanceImpl();
162 void UpcallArgumentTypeChecking_StaticImpl();
163 void CompileAndRunFloatFloatMethodImpl();
164 void CheckParameterAlignImpl();
165 void MaxParamNumberImpl();
166 void WithoutImplementationImpl();
Andreas Gampe48ee3562015-04-10 19:57:29 -0700167 void WithoutImplementationRefReturnImpl();
Andreas Gampe6e498692014-08-18 16:43:12 -0700168 void StackArgsIntsFirstImpl();
169 void StackArgsFloatsFirstImpl();
170 void StackArgsMixedImpl();
171
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700172 JNIEnv* env_;
173 jmethodID jmethod_;
Andreas Gampe6e498692014-08-18 16:43:12 -0700174 bool check_generic_jni_;
Ian Rogersb033c752011-07-20 12:22:35 -0700175};
176
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700177jclass JniCompilerTest::jklass_;
178jobject JniCompilerTest::jobj_;
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700179jobject JniCompilerTest::class_loader_;
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700180
Andreas Gampe6e498692014-08-18 16:43:12 -0700181#define JNI_TEST(TestName) \
182 TEST_F(JniCompilerTest, TestName ## Default) { \
183 TestName ## Impl(); \
184 } \
185 \
186 TEST_F(JniCompilerTest, TestName ## Generic) { \
187 TEST_DISABLED_FOR_MIPS(); \
188 SetCheckGenericJni(true); \
189 TestName ## Impl(); \
190 }
Andreas Gampecf4035a2014-05-28 22:43:01 -0700191
Elliott Hughesb264f082012-04-06 17:10:10 -0700192int gJava_MyClassNatives_foo_calls = 0;
193void Java_MyClassNatives_foo(JNIEnv* env, jobject thisObj) {
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700194 // 1 = thisObj
Ian Rogers50b35e22012-10-04 10:09:15 -0700195 EXPECT_EQ(kNative, Thread::Current()->GetState());
196 Locks::mutator_lock_->AssertNotHeld(Thread::Current());
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700197 EXPECT_EQ(Thread::Current()->GetJniEnv(), env);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700198 EXPECT_TRUE(thisObj != nullptr);
Ian Rogersa8cd9f42011-08-19 16:43:41 -0700199 EXPECT_TRUE(env->IsInstanceOf(thisObj, JniCompilerTest::jklass_));
Elliott Hughesb264f082012-04-06 17:10:10 -0700200 gJava_MyClassNatives_foo_calls++;
Ian Rogersef7d42f2014-01-06 12:55:46 -0800201 ScopedObjectAccess soa(Thread::Current());
202 EXPECT_EQ(1U, Thread::Current()->NumStackReferences());
Ian Rogersb033c752011-07-20 12:22:35 -0700203}
204
Andreas Gampe6e498692014-08-18 16:43:12 -0700205void JniCompilerTest::CompileAndRunNoArgMethodImpl() {
Ian Rogersef7d42f2014-01-06 12:55:46 -0800206 SetUpForTest(false, "foo", "()V", reinterpret_cast<void*>(&Java_MyClassNatives_foo));
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700207
Elliott Hughesb264f082012-04-06 17:10:10 -0700208 EXPECT_EQ(0, 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(1, gJava_MyClassNatives_foo_calls);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700211 env_->CallNonvirtualVoidMethod(jobj_, jklass_, jmethod_);
Elliott Hughesb264f082012-04-06 17:10:10 -0700212 EXPECT_EQ(2, gJava_MyClassNatives_foo_calls);
Andreas Gampe6e498692014-08-18 16:43:12 -0700213
214 gJava_MyClassNatives_foo_calls = 0;
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700215}
216
Andreas Gampe6e498692014-08-18 16:43:12 -0700217JNI_TEST(CompileAndRunNoArgMethod)
218
219void JniCompilerTest::CompileAndRunIntMethodThroughStubImpl() {
Andreas Gampecf4035a2014-05-28 22:43:01 -0700220 SetUpForTest(false, "bar", "(I)I", nullptr);
221 // calling through stub will link with &Java_MyClassNatives_bar
Shih-wei Liao31384c52011-09-06 15:27:45 -0700222
Shih-wei Liao31384c52011-09-06 15:27:45 -0700223 std::string reason;
Ian Rogers68d8b422014-07-17 11:09:10 -0700224 ASSERT_TRUE(Runtime::Current()->GetJavaVM()->LoadNativeLibrary(env_, "", class_loader_, &reason))
225 << reason;
Shih-wei Liao31384c52011-09-06 15:27:45 -0700226
227 jint result = env_->CallNonvirtualIntMethod(jobj_, jklass_, jmethod_, 24);
228 EXPECT_EQ(25, result);
229}
230
Andreas Gampe6e498692014-08-18 16:43:12 -0700231JNI_TEST(CompileAndRunIntMethodThroughStub)
232
233void JniCompilerTest::CompileAndRunStaticIntMethodThroughStubImpl() {
Andreas Gampecf4035a2014-05-28 22:43:01 -0700234 SetUpForTest(true, "sbar", "(I)I", nullptr);
235 // calling through stub will link with &Java_MyClassNatives_sbar
Ian Rogers1cefdbd2012-02-29 09:34:50 -0800236
237 std::string reason;
Ian Rogers68d8b422014-07-17 11:09:10 -0700238 ASSERT_TRUE(Runtime::Current()->GetJavaVM()->LoadNativeLibrary(env_, "", class_loader_, &reason))
239 << reason;
Ian Rogers1cefdbd2012-02-29 09:34:50 -0800240
241 jint result = env_->CallStaticIntMethod(jklass_, jmethod_, 42);
242 EXPECT_EQ(43, result);
243}
244
Andreas Gampe6e498692014-08-18 16:43:12 -0700245JNI_TEST(CompileAndRunStaticIntMethodThroughStub)
246
Elliott Hughesb264f082012-04-06 17:10:10 -0700247int gJava_MyClassNatives_fooI_calls = 0;
248jint Java_MyClassNatives_fooI(JNIEnv* env, jobject thisObj, jint x) {
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700249 // 1 = thisObj
Ian Rogers50b35e22012-10-04 10:09:15 -0700250 EXPECT_EQ(kNative, Thread::Current()->GetState());
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700251 EXPECT_EQ(Thread::Current()->GetJniEnv(), env);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700252 EXPECT_TRUE(thisObj != nullptr);
Ian Rogersa8cd9f42011-08-19 16:43:41 -0700253 EXPECT_TRUE(env->IsInstanceOf(thisObj, JniCompilerTest::jklass_));
Elliott Hughesb264f082012-04-06 17:10:10 -0700254 gJava_MyClassNatives_fooI_calls++;
Ian Rogersef7d42f2014-01-06 12:55:46 -0800255 ScopedObjectAccess soa(Thread::Current());
256 EXPECT_EQ(1U, Thread::Current()->NumStackReferences());
Ian Rogersb033c752011-07-20 12:22:35 -0700257 return x;
258}
259
Andreas Gampe6e498692014-08-18 16:43:12 -0700260void JniCompilerTest::CompileAndRunIntMethodImpl() {
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700261 SetUpForTest(false, "fooI", "(I)I",
Elliott Hughesb264f082012-04-06 17:10:10 -0700262 reinterpret_cast<void*>(&Java_MyClassNatives_fooI));
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700263
Elliott Hughesb264f082012-04-06 17:10:10 -0700264 EXPECT_EQ(0, gJava_MyClassNatives_fooI_calls);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700265 jint result = env_->CallNonvirtualIntMethod(jobj_, jklass_, jmethod_, 42);
266 EXPECT_EQ(42, result);
Elliott Hughesb264f082012-04-06 17:10:10 -0700267 EXPECT_EQ(1, gJava_MyClassNatives_fooI_calls);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700268 result = env_->CallNonvirtualIntMethod(jobj_, jklass_, jmethod_, 0xCAFED00D);
269 EXPECT_EQ(static_cast<jint>(0xCAFED00D), result);
Elliott Hughesb264f082012-04-06 17:10:10 -0700270 EXPECT_EQ(2, gJava_MyClassNatives_fooI_calls);
Andreas Gampe6e498692014-08-18 16:43:12 -0700271
272 gJava_MyClassNatives_fooI_calls = 0;
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700273}
274
Andreas Gampe6e498692014-08-18 16:43:12 -0700275JNI_TEST(CompileAndRunIntMethod)
276
Elliott Hughesb264f082012-04-06 17:10:10 -0700277int gJava_MyClassNatives_fooII_calls = 0;
278jint Java_MyClassNatives_fooII(JNIEnv* env, jobject thisObj, jint x, jint y) {
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700279 // 1 = thisObj
Ian Rogers50b35e22012-10-04 10:09:15 -0700280 EXPECT_EQ(kNative, Thread::Current()->GetState());
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700281 EXPECT_EQ(Thread::Current()->GetJniEnv(), env);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700282 EXPECT_TRUE(thisObj != nullptr);
Ian Rogersa8cd9f42011-08-19 16:43:41 -0700283 EXPECT_TRUE(env->IsInstanceOf(thisObj, JniCompilerTest::jklass_));
Elliott Hughesb264f082012-04-06 17:10:10 -0700284 gJava_MyClassNatives_fooII_calls++;
Ian Rogersef7d42f2014-01-06 12:55:46 -0800285 ScopedObjectAccess soa(Thread::Current());
286 EXPECT_EQ(1U, Thread::Current()->NumStackReferences());
Ian Rogersb033c752011-07-20 12:22:35 -0700287 return x - y; // non-commutative operator
288}
289
Andreas Gampe6e498692014-08-18 16:43:12 -0700290void JniCompilerTest::CompileAndRunIntIntMethodImpl() {
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700291 SetUpForTest(false, "fooII", "(II)I",
Elliott Hughesb264f082012-04-06 17:10:10 -0700292 reinterpret_cast<void*>(&Java_MyClassNatives_fooII));
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700293
Elliott Hughesb264f082012-04-06 17:10:10 -0700294 EXPECT_EQ(0, gJava_MyClassNatives_fooII_calls);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700295 jint result = env_->CallNonvirtualIntMethod(jobj_, jklass_, jmethod_, 99, 10);
296 EXPECT_EQ(99 - 10, result);
Elliott Hughesb264f082012-04-06 17:10:10 -0700297 EXPECT_EQ(1, gJava_MyClassNatives_fooII_calls);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700298 result = env_->CallNonvirtualIntMethod(jobj_, jklass_, jmethod_, 0xCAFEBABE,
299 0xCAFED00D);
300 EXPECT_EQ(static_cast<jint>(0xCAFEBABE - 0xCAFED00D), result);
Elliott Hughesb264f082012-04-06 17:10:10 -0700301 EXPECT_EQ(2, gJava_MyClassNatives_fooII_calls);
Andreas Gampe6e498692014-08-18 16:43:12 -0700302
303 gJava_MyClassNatives_fooII_calls = 0;
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700304}
305
Andreas Gampe6e498692014-08-18 16:43:12 -0700306JNI_TEST(CompileAndRunIntIntMethod)
307
Elliott Hughesb264f082012-04-06 17:10:10 -0700308int gJava_MyClassNatives_fooJJ_calls = 0;
309jlong Java_MyClassNatives_fooJJ(JNIEnv* env, jobject thisObj, jlong x, jlong y) {
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700310 // 1 = thisObj
Ian Rogers50b35e22012-10-04 10:09:15 -0700311 EXPECT_EQ(kNative, Thread::Current()->GetState());
Ian Rogers9b269d22011-09-04 14:06:05 -0700312 EXPECT_EQ(Thread::Current()->GetJniEnv(), env);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700313 EXPECT_TRUE(thisObj != nullptr);
Ian Rogers9b269d22011-09-04 14:06:05 -0700314 EXPECT_TRUE(env->IsInstanceOf(thisObj, JniCompilerTest::jklass_));
Elliott Hughesb264f082012-04-06 17:10:10 -0700315 gJava_MyClassNatives_fooJJ_calls++;
Ian Rogersef7d42f2014-01-06 12:55:46 -0800316 ScopedObjectAccess soa(Thread::Current());
317 EXPECT_EQ(1U, Thread::Current()->NumStackReferences());
Ian Rogers9b269d22011-09-04 14:06:05 -0700318 return x - y; // non-commutative operator
319}
320
Andreas Gampe6e498692014-08-18 16:43:12 -0700321void JniCompilerTest::CompileAndRunLongLongMethodImpl() {
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700322 SetUpForTest(false, "fooJJ", "(JJ)J",
Elliott Hughesb264f082012-04-06 17:10:10 -0700323 reinterpret_cast<void*>(&Java_MyClassNatives_fooJJ));
Ian Rogers9b269d22011-09-04 14:06:05 -0700324
Elliott Hughesb264f082012-04-06 17:10:10 -0700325 EXPECT_EQ(0, gJava_MyClassNatives_fooJJ_calls);
Ian Rogers0f678472014-03-10 16:18:37 -0700326 jlong a = INT64_C(0x1234567890ABCDEF);
327 jlong b = INT64_C(0xFEDCBA0987654321);
Ian Rogers9b269d22011-09-04 14:06:05 -0700328 jlong result = env_->CallNonvirtualLongMethod(jobj_, jklass_, jmethod_, a, b);
329 EXPECT_EQ(a - b, result);
Elliott Hughesb264f082012-04-06 17:10:10 -0700330 EXPECT_EQ(1, gJava_MyClassNatives_fooJJ_calls);
Ian Rogers9b269d22011-09-04 14:06:05 -0700331 result = env_->CallNonvirtualLongMethod(jobj_, jklass_, jmethod_, b, a);
332 EXPECT_EQ(b - a, result);
Elliott Hughesb264f082012-04-06 17:10:10 -0700333 EXPECT_EQ(2, gJava_MyClassNatives_fooJJ_calls);
Andreas Gampe6e498692014-08-18 16:43:12 -0700334
335 gJava_MyClassNatives_fooJJ_calls = 0;
Ian Rogers9b269d22011-09-04 14:06:05 -0700336}
337
Andreas Gampe6e498692014-08-18 16:43:12 -0700338JNI_TEST(CompileAndRunLongLongMethod)
339
Elliott Hughesb264f082012-04-06 17:10:10 -0700340int gJava_MyClassNatives_fooDD_calls = 0;
341jdouble Java_MyClassNatives_fooDD(JNIEnv* env, jobject thisObj, jdouble x, jdouble y) {
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700342 // 1 = thisObj
Ian Rogers50b35e22012-10-04 10:09:15 -0700343 EXPECT_EQ(kNative, Thread::Current()->GetState());
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700344 EXPECT_EQ(Thread::Current()->GetJniEnv(), env);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700345 EXPECT_TRUE(thisObj != nullptr);
Ian Rogersa8cd9f42011-08-19 16:43:41 -0700346 EXPECT_TRUE(env->IsInstanceOf(thisObj, JniCompilerTest::jklass_));
Elliott Hughesb264f082012-04-06 17:10:10 -0700347 gJava_MyClassNatives_fooDD_calls++;
Ian Rogersef7d42f2014-01-06 12:55:46 -0800348 ScopedObjectAccess soa(Thread::Current());
349 EXPECT_EQ(1U, Thread::Current()->NumStackReferences());
Ian Rogersb033c752011-07-20 12:22:35 -0700350 return x - y; // non-commutative operator
351}
352
Andreas Gampe6e498692014-08-18 16:43:12 -0700353void JniCompilerTest::CompileAndRunDoubleDoubleMethodImpl() {
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700354 SetUpForTest(false, "fooDD", "(DD)D",
Elliott Hughesb264f082012-04-06 17:10:10 -0700355 reinterpret_cast<void*>(&Java_MyClassNatives_fooDD));
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700356
Elliott Hughesb264f082012-04-06 17:10:10 -0700357 EXPECT_EQ(0, gJava_MyClassNatives_fooDD_calls);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700358 jdouble result = env_->CallNonvirtualDoubleMethod(jobj_, jklass_, jmethod_,
359 99.0, 10.0);
Ian Rogers647b1a82014-10-10 11:02:11 -0700360 EXPECT_DOUBLE_EQ(99.0 - 10.0, result);
Elliott Hughesb264f082012-04-06 17:10:10 -0700361 EXPECT_EQ(1, gJava_MyClassNatives_fooDD_calls);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700362 jdouble a = 3.14159265358979323846;
363 jdouble b = 0.69314718055994530942;
364 result = env_->CallNonvirtualDoubleMethod(jobj_, jklass_, jmethod_, a, b);
Ian Rogers647b1a82014-10-10 11:02:11 -0700365 EXPECT_DOUBLE_EQ(a - b, result);
Elliott Hughesb264f082012-04-06 17:10:10 -0700366 EXPECT_EQ(2, gJava_MyClassNatives_fooDD_calls);
Andreas Gampe6e498692014-08-18 16:43:12 -0700367
368 gJava_MyClassNatives_fooDD_calls = 0;
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700369}
370
Elliott Hughes3e778f72012-05-21 15:29:52 -0700371int gJava_MyClassNatives_fooJJ_synchronized_calls = 0;
372jlong Java_MyClassNatives_fooJJ_synchronized(JNIEnv* env, jobject thisObj, jlong x, jlong y) {
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700373 // 1 = thisObj
Ian Rogers50b35e22012-10-04 10:09:15 -0700374 EXPECT_EQ(kNative, Thread::Current()->GetState());
Elliott Hughes3e778f72012-05-21 15:29:52 -0700375 EXPECT_EQ(Thread::Current()->GetJniEnv(), env);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700376 EXPECT_TRUE(thisObj != nullptr);
Elliott Hughes3e778f72012-05-21 15:29:52 -0700377 EXPECT_TRUE(env->IsInstanceOf(thisObj, JniCompilerTest::jklass_));
378 gJava_MyClassNatives_fooJJ_synchronized_calls++;
Ian Rogersef7d42f2014-01-06 12:55:46 -0800379 ScopedObjectAccess soa(Thread::Current());
380 EXPECT_EQ(1U, Thread::Current()->NumStackReferences());
Elliott Hughes3e778f72012-05-21 15:29:52 -0700381 return x | y;
382}
383
Andreas Gampe6e498692014-08-18 16:43:12 -0700384void JniCompilerTest::CompileAndRun_fooJJ_synchronizedImpl() {
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700385 SetUpForTest(false, "fooJJ_synchronized", "(JJ)J",
Elliott Hughes3e778f72012-05-21 15:29:52 -0700386 reinterpret_cast<void*>(&Java_MyClassNatives_fooJJ_synchronized));
387
388 EXPECT_EQ(0, gJava_MyClassNatives_fooJJ_synchronized_calls);
389 jlong a = 0x1000000020000000ULL;
390 jlong b = 0x00ff000000aa0000ULL;
391 jlong result = env_->CallNonvirtualLongMethod(jobj_, jklass_, jmethod_, a, b);
392 EXPECT_EQ(a | b, result);
393 EXPECT_EQ(1, gJava_MyClassNatives_fooJJ_synchronized_calls);
Andreas Gampe6e498692014-08-18 16:43:12 -0700394
395 gJava_MyClassNatives_fooJJ_synchronized_calls = 0;
Elliott Hughes3e778f72012-05-21 15:29:52 -0700396}
397
Andreas Gampe6e498692014-08-18 16:43:12 -0700398JNI_TEST(CompileAndRun_fooJJ_synchronized)
399
Elliott Hughesb264f082012-04-06 17:10:10 -0700400int gJava_MyClassNatives_fooIOO_calls = 0;
401jobject Java_MyClassNatives_fooIOO(JNIEnv* env, jobject thisObj, jint x, jobject y,
Ian Rogersb033c752011-07-20 12:22:35 -0700402 jobject z) {
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700403 // 3 = this + y + z
Ian Rogers50b35e22012-10-04 10:09:15 -0700404 EXPECT_EQ(kNative, Thread::Current()->GetState());
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700405 EXPECT_EQ(Thread::Current()->GetJniEnv(), env);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700406 EXPECT_TRUE(thisObj != nullptr);
Ian Rogersa8cd9f42011-08-19 16:43:41 -0700407 EXPECT_TRUE(env->IsInstanceOf(thisObj, JniCompilerTest::jklass_));
Elliott Hughesb264f082012-04-06 17:10:10 -0700408 gJava_MyClassNatives_fooIOO_calls++;
Ian Rogersef7d42f2014-01-06 12:55:46 -0800409 ScopedObjectAccess soa(Thread::Current());
Andreas Gampebf6b92a2014-03-05 16:11:04 -0800410 size_t null_args = (y == nullptr ? 1 : 0) + (z == nullptr ? 1 : 0);
411 EXPECT_TRUE(3U == Thread::Current()->NumStackReferences() ||
412 (3U - null_args) == Thread::Current()->NumStackReferences());
Ian Rogersb033c752011-07-20 12:22:35 -0700413 switch (x) {
414 case 1:
415 return y;
416 case 2:
417 return z;
418 default:
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700419 return thisObj;
Ian Rogersb033c752011-07-20 12:22:35 -0700420 }
421}
422
Andreas Gampe6e498692014-08-18 16:43:12 -0700423void JniCompilerTest::CompileAndRunIntObjectObjectMethodImpl() {
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700424 SetUpForTest(false, "fooIOO",
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700425 "(ILjava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;",
Elliott Hughesb264f082012-04-06 17:10:10 -0700426 reinterpret_cast<void*>(&Java_MyClassNatives_fooIOO));
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700427
Elliott Hughesb264f082012-04-06 17:10:10 -0700428 EXPECT_EQ(0, gJava_MyClassNatives_fooIOO_calls);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700429 jobject result = env_->CallNonvirtualObjectMethod(jobj_, jklass_, jmethod_, 0, nullptr, nullptr);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700430 EXPECT_TRUE(env_->IsSameObject(jobj_, result));
Elliott Hughesb264f082012-04-06 17:10:10 -0700431 EXPECT_EQ(1, gJava_MyClassNatives_fooIOO_calls);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700432
Andreas Gampecf4035a2014-05-28 22:43:01 -0700433 result = env_->CallNonvirtualObjectMethod(jobj_, jklass_, jmethod_, 0, nullptr, jklass_);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700434 EXPECT_TRUE(env_->IsSameObject(jobj_, result));
Elliott Hughesb264f082012-04-06 17:10:10 -0700435 EXPECT_EQ(2, gJava_MyClassNatives_fooIOO_calls);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700436 result = env_->CallNonvirtualObjectMethod(jobj_, jklass_, jmethod_, 1, nullptr, jklass_);
437 EXPECT_TRUE(env_->IsSameObject(nullptr, result));
Elliott Hughesb264f082012-04-06 17:10:10 -0700438 EXPECT_EQ(3, gJava_MyClassNatives_fooIOO_calls);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700439 result = env_->CallNonvirtualObjectMethod(jobj_, jklass_, jmethod_, 2, nullptr, jklass_);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700440 EXPECT_TRUE(env_->IsSameObject(jklass_, result));
Elliott Hughesb264f082012-04-06 17:10:10 -0700441 EXPECT_EQ(4, gJava_MyClassNatives_fooIOO_calls);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700442
Andreas Gampecf4035a2014-05-28 22:43:01 -0700443 result = env_->CallNonvirtualObjectMethod(jobj_, jklass_, jmethod_, 0, jklass_, nullptr);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700444 EXPECT_TRUE(env_->IsSameObject(jobj_, result));
Elliott Hughesb264f082012-04-06 17:10:10 -0700445 EXPECT_EQ(5, gJava_MyClassNatives_fooIOO_calls);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700446 result = env_->CallNonvirtualObjectMethod(jobj_, jklass_, jmethod_, 1, jklass_, nullptr);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700447 EXPECT_TRUE(env_->IsSameObject(jklass_, result));
Elliott Hughesb264f082012-04-06 17:10:10 -0700448 EXPECT_EQ(6, gJava_MyClassNatives_fooIOO_calls);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700449 result = env_->CallNonvirtualObjectMethod(jobj_, jklass_, jmethod_, 2, jklass_, nullptr);
450 EXPECT_TRUE(env_->IsSameObject(nullptr, result));
Elliott Hughesb264f082012-04-06 17:10:10 -0700451 EXPECT_EQ(7, gJava_MyClassNatives_fooIOO_calls);
Andreas Gampe6e498692014-08-18 16:43:12 -0700452
453 gJava_MyClassNatives_fooIOO_calls = 0;
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700454}
455
Andreas Gampe6e498692014-08-18 16:43:12 -0700456JNI_TEST(CompileAndRunIntObjectObjectMethod)
457
Elliott Hughesb264f082012-04-06 17:10:10 -0700458int gJava_MyClassNatives_fooSII_calls = 0;
459jint Java_MyClassNatives_fooSII(JNIEnv* env, jclass klass, jint x, jint y) {
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700460 // 1 = klass
Ian Rogers50b35e22012-10-04 10:09:15 -0700461 EXPECT_EQ(kNative, Thread::Current()->GetState());
Shih-wei Liao82da44b2011-09-01 00:38:04 -0700462 EXPECT_EQ(Thread::Current()->GetJniEnv(), env);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700463 EXPECT_TRUE(klass != nullptr);
Shih-wei Liao82da44b2011-09-01 00:38:04 -0700464 EXPECT_TRUE(env->IsInstanceOf(JniCompilerTest::jobj_, klass));
Elliott Hughesb264f082012-04-06 17:10:10 -0700465 gJava_MyClassNatives_fooSII_calls++;
Ian Rogersef7d42f2014-01-06 12:55:46 -0800466 ScopedObjectAccess soa(Thread::Current());
467 EXPECT_EQ(1U, Thread::Current()->NumStackReferences());
Shih-wei Liao82da44b2011-09-01 00:38:04 -0700468 return x + y;
469}
470
Andreas Gampe6e498692014-08-18 16:43:12 -0700471void JniCompilerTest::CompileAndRunStaticIntIntMethodImpl() {
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700472 SetUpForTest(true, "fooSII", "(II)I",
Elliott Hughesb264f082012-04-06 17:10:10 -0700473 reinterpret_cast<void*>(&Java_MyClassNatives_fooSII));
Shih-wei Liao82da44b2011-09-01 00:38:04 -0700474
Elliott Hughesb264f082012-04-06 17:10:10 -0700475 EXPECT_EQ(0, gJava_MyClassNatives_fooSII_calls);
Shih-wei Liao82da44b2011-09-01 00:38:04 -0700476 jint result = env_->CallStaticIntMethod(jklass_, jmethod_, 20, 30);
477 EXPECT_EQ(50, result);
Elliott Hughesb264f082012-04-06 17:10:10 -0700478 EXPECT_EQ(1, gJava_MyClassNatives_fooSII_calls);
Andreas Gampe6e498692014-08-18 16:43:12 -0700479
480 gJava_MyClassNatives_fooSII_calls = 0;
Shih-wei Liao82da44b2011-09-01 00:38:04 -0700481}
482
Andreas Gampe6e498692014-08-18 16:43:12 -0700483JNI_TEST(CompileAndRunStaticIntIntMethod)
484
Elliott Hughesb264f082012-04-06 17:10:10 -0700485int gJava_MyClassNatives_fooSDD_calls = 0;
486jdouble Java_MyClassNatives_fooSDD(JNIEnv* env, jclass klass, jdouble x, jdouble y) {
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700487 // 1 = klass
Ian Rogers50b35e22012-10-04 10:09:15 -0700488 EXPECT_EQ(kNative, Thread::Current()->GetState());
Ian Rogers7a99c112011-09-07 12:48:27 -0700489 EXPECT_EQ(Thread::Current()->GetJniEnv(), env);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700490 EXPECT_TRUE(klass != nullptr);
Ian Rogers7a99c112011-09-07 12:48:27 -0700491 EXPECT_TRUE(env->IsInstanceOf(JniCompilerTest::jobj_, klass));
Elliott Hughesb264f082012-04-06 17:10:10 -0700492 gJava_MyClassNatives_fooSDD_calls++;
Ian Rogersef7d42f2014-01-06 12:55:46 -0800493 ScopedObjectAccess soa(Thread::Current());
494 EXPECT_EQ(1U, Thread::Current()->NumStackReferences());
Ian Rogers7a99c112011-09-07 12:48:27 -0700495 return x - y; // non-commutative operator
496}
497
Andreas Gampe6e498692014-08-18 16:43:12 -0700498void JniCompilerTest::CompileAndRunStaticDoubleDoubleMethodImpl() {
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700499 SetUpForTest(true, "fooSDD", "(DD)D",
Elliott Hughesb264f082012-04-06 17:10:10 -0700500 reinterpret_cast<void*>(&Java_MyClassNatives_fooSDD));
Ian Rogers7a99c112011-09-07 12:48:27 -0700501
Elliott Hughesb264f082012-04-06 17:10:10 -0700502 EXPECT_EQ(0, gJava_MyClassNatives_fooSDD_calls);
Ian Rogers7a99c112011-09-07 12:48:27 -0700503 jdouble result = env_->CallStaticDoubleMethod(jklass_, jmethod_, 99.0, 10.0);
Ian Rogers647b1a82014-10-10 11:02:11 -0700504 EXPECT_DOUBLE_EQ(99.0 - 10.0, result);
Elliott Hughesb264f082012-04-06 17:10:10 -0700505 EXPECT_EQ(1, gJava_MyClassNatives_fooSDD_calls);
Ian Rogers7a99c112011-09-07 12:48:27 -0700506 jdouble a = 3.14159265358979323846;
507 jdouble b = 0.69314718055994530942;
508 result = env_->CallStaticDoubleMethod(jklass_, jmethod_, a, b);
Ian Rogers647b1a82014-10-10 11:02:11 -0700509 EXPECT_DOUBLE_EQ(a - b, result);
510 EXPECT_DOUBLE_EQ(2, gJava_MyClassNatives_fooSDD_calls);
Andreas Gampe6e498692014-08-18 16:43:12 -0700511
512 gJava_MyClassNatives_fooSDD_calls = 0;
Ian Rogers7a99c112011-09-07 12:48:27 -0700513}
514
Andreas Gampe6e498692014-08-18 16:43:12 -0700515JNI_TEST(CompileAndRunStaticDoubleDoubleMethod)
516
Nicolas Geoffray54accbc2014-08-13 03:40:45 +0100517// The x86 generic JNI code had a bug where it assumed a floating
518// point return value would be in xmm0. We use log, to somehow ensure
519// the compiler will use the floating point stack.
520
Ian Rogers6a3c1fc2014-10-31 00:33:20 -0700521jdouble Java_MyClassNatives_logD(JNIEnv*, jclass, jdouble x) {
Nicolas Geoffray54accbc2014-08-13 03:40:45 +0100522 return log(x);
523}
524
Andreas Gampe6e498692014-08-18 16:43:12 -0700525void JniCompilerTest::RunStaticLogDoubleMethodImpl() {
Andreas Gampe6e498692014-08-18 16:43:12 -0700526 SetUpForTest(true, "logD", "(D)D", reinterpret_cast<void*>(&Java_MyClassNatives_logD));
Nicolas Geoffray54accbc2014-08-13 03:40:45 +0100527
528 jdouble result = env_->CallStaticDoubleMethod(jklass_, jmethod_, 2.0);
Ian Rogers647b1a82014-10-10 11:02:11 -0700529 EXPECT_DOUBLE_EQ(log(2.0), result);
Nicolas Geoffray54accbc2014-08-13 03:40:45 +0100530}
531
Andreas Gampe6e498692014-08-18 16:43:12 -0700532JNI_TEST(RunStaticLogDoubleMethod)
533
Ian Rogers6a3c1fc2014-10-31 00:33:20 -0700534jfloat Java_MyClassNatives_logF(JNIEnv*, jclass, jfloat x) {
Nicolas Geoffray54accbc2014-08-13 03:40:45 +0100535 return logf(x);
536}
537
Andreas Gampe6e498692014-08-18 16:43:12 -0700538void JniCompilerTest::RunStaticLogFloatMethodImpl() {
Andreas Gampe6e498692014-08-18 16:43:12 -0700539 SetUpForTest(true, "logF", "(F)F", reinterpret_cast<void*>(&Java_MyClassNatives_logF));
Nicolas Geoffray54accbc2014-08-13 03:40:45 +0100540
541 jfloat result = env_->CallStaticFloatMethod(jklass_, jmethod_, 2.0);
Ian Rogers647b1a82014-10-10 11:02:11 -0700542 EXPECT_FLOAT_EQ(logf(2.0), result);
Nicolas Geoffray54accbc2014-08-13 03:40:45 +0100543}
544
Andreas Gampe6e498692014-08-18 16:43:12 -0700545JNI_TEST(RunStaticLogFloatMethod)
546
Ian Rogers6a3c1fc2014-10-31 00:33:20 -0700547jboolean Java_MyClassNatives_returnTrue(JNIEnv*, jclass) {
Nicolas Geoffray54accbc2014-08-13 03:40:45 +0100548 return JNI_TRUE;
549}
550
Ian Rogers6a3c1fc2014-10-31 00:33:20 -0700551jboolean Java_MyClassNatives_returnFalse(JNIEnv*, jclass) {
Nicolas Geoffray54accbc2014-08-13 03:40:45 +0100552 return JNI_FALSE;
553}
554
Ian Rogers6a3c1fc2014-10-31 00:33:20 -0700555jint Java_MyClassNatives_returnInt(JNIEnv*, jclass) {
Nicolas Geoffray54accbc2014-08-13 03:40:45 +0100556 return 42;
557}
558
Andreas Gampe6e498692014-08-18 16:43:12 -0700559void JniCompilerTest::RunStaticReturnTrueImpl() {
Andreas Gampe6e498692014-08-18 16:43:12 -0700560 SetUpForTest(true, "returnTrue", "()Z", reinterpret_cast<void*>(&Java_MyClassNatives_returnTrue));
Nicolas Geoffray54accbc2014-08-13 03:40:45 +0100561
562 jboolean result = env_->CallStaticBooleanMethod(jklass_, jmethod_);
563 EXPECT_TRUE(result);
564}
565
Andreas Gampe6e498692014-08-18 16:43:12 -0700566JNI_TEST(RunStaticReturnTrue)
567
568void JniCompilerTest::RunStaticReturnFalseImpl() {
Nicolas Geoffray54accbc2014-08-13 03:40:45 +0100569 SetUpForTest(true, "returnFalse", "()Z",
Andreas Gampe6e498692014-08-18 16:43:12 -0700570 reinterpret_cast<void*>(&Java_MyClassNatives_returnFalse));
Nicolas Geoffray54accbc2014-08-13 03:40:45 +0100571
572 jboolean result = env_->CallStaticBooleanMethod(jklass_, jmethod_);
573 EXPECT_FALSE(result);
574}
575
Andreas Gampe6e498692014-08-18 16:43:12 -0700576JNI_TEST(RunStaticReturnFalse)
577
578void JniCompilerTest::RunGenericStaticReturnIntImpl() {
Andreas Gampe6e498692014-08-18 16:43:12 -0700579 SetUpForTest(true, "returnInt", "()I", reinterpret_cast<void*>(&Java_MyClassNatives_returnInt));
Nicolas Geoffray54accbc2014-08-13 03:40:45 +0100580
581 jint result = env_->CallStaticIntMethod(jklass_, jmethod_);
582 EXPECT_EQ(42, result);
583}
584
Andreas Gampe6e498692014-08-18 16:43:12 -0700585JNI_TEST(RunGenericStaticReturnInt)
586
Elliott Hughesb264f082012-04-06 17:10:10 -0700587int gJava_MyClassNatives_fooSIOO_calls = 0;
588jobject Java_MyClassNatives_fooSIOO(JNIEnv* env, jclass klass, jint x, jobject y,
Ian Rogersb033c752011-07-20 12:22:35 -0700589 jobject z) {
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700590 // 3 = klass + y + z
Ian Rogers50b35e22012-10-04 10:09:15 -0700591 EXPECT_EQ(kNative, Thread::Current()->GetState());
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700592 EXPECT_EQ(Thread::Current()->GetJniEnv(), env);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700593 EXPECT_TRUE(klass != nullptr);
Ian Rogersa8cd9f42011-08-19 16:43:41 -0700594 EXPECT_TRUE(env->IsInstanceOf(JniCompilerTest::jobj_, klass));
Elliott Hughesb264f082012-04-06 17:10:10 -0700595 gJava_MyClassNatives_fooSIOO_calls++;
Ian Rogersef7d42f2014-01-06 12:55:46 -0800596 ScopedObjectAccess soa(Thread::Current());
Andreas Gampebf6b92a2014-03-05 16:11:04 -0800597 size_t null_args = (y == nullptr ? 1 : 0) + (z == nullptr ? 1 : 0);
598 EXPECT_TRUE(3U == Thread::Current()->NumStackReferences() ||
599 (3U - null_args) == Thread::Current()->NumStackReferences());
Ian Rogersb033c752011-07-20 12:22:35 -0700600 switch (x) {
601 case 1:
602 return y;
603 case 2:
604 return z;
605 default:
606 return klass;
607 }
608}
609
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700610
Andreas Gampe6e498692014-08-18 16:43:12 -0700611void JniCompilerTest::CompileAndRunStaticIntObjectObjectMethodImpl() {
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700612 SetUpForTest(true, "fooSIOO",
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700613 "(ILjava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;",
Elliott Hughesb264f082012-04-06 17:10:10 -0700614 reinterpret_cast<void*>(&Java_MyClassNatives_fooSIOO));
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700615
Elliott Hughesb264f082012-04-06 17:10:10 -0700616 EXPECT_EQ(0, gJava_MyClassNatives_fooSIOO_calls);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700617 jobject result = env_->CallStaticObjectMethod(jklass_, jmethod_, 0, nullptr, nullptr);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700618 EXPECT_TRUE(env_->IsSameObject(jklass_, result));
Elliott Hughesb264f082012-04-06 17:10:10 -0700619 EXPECT_EQ(1, gJava_MyClassNatives_fooSIOO_calls);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700620
Andreas Gampecf4035a2014-05-28 22:43:01 -0700621 result = env_->CallStaticObjectMethod(jklass_, jmethod_, 0, nullptr, jobj_);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700622 EXPECT_TRUE(env_->IsSameObject(jklass_, result));
Elliott Hughesb264f082012-04-06 17:10:10 -0700623 EXPECT_EQ(2, gJava_MyClassNatives_fooSIOO_calls);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700624 result = env_->CallStaticObjectMethod(jklass_, jmethod_, 1, nullptr, jobj_);
625 EXPECT_TRUE(env_->IsSameObject(nullptr, result));
Elliott Hughesb264f082012-04-06 17:10:10 -0700626 EXPECT_EQ(3, gJava_MyClassNatives_fooSIOO_calls);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700627 result = env_->CallStaticObjectMethod(jklass_, jmethod_, 2, nullptr, jobj_);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700628 EXPECT_TRUE(env_->IsSameObject(jobj_, result));
Elliott Hughesb264f082012-04-06 17:10:10 -0700629 EXPECT_EQ(4, gJava_MyClassNatives_fooSIOO_calls);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700630
Andreas Gampecf4035a2014-05-28 22:43:01 -0700631 result = env_->CallStaticObjectMethod(jklass_, jmethod_, 0, jobj_, nullptr);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700632 EXPECT_TRUE(env_->IsSameObject(jklass_, result));
Elliott Hughesb264f082012-04-06 17:10:10 -0700633 EXPECT_EQ(5, gJava_MyClassNatives_fooSIOO_calls);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700634 result = env_->CallStaticObjectMethod(jklass_, jmethod_, 1, jobj_, nullptr);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700635 EXPECT_TRUE(env_->IsSameObject(jobj_, result));
Elliott Hughesb264f082012-04-06 17:10:10 -0700636 EXPECT_EQ(6, gJava_MyClassNatives_fooSIOO_calls);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700637 result = env_->CallStaticObjectMethod(jklass_, jmethod_, 2, jobj_, nullptr);
638 EXPECT_TRUE(env_->IsSameObject(nullptr, result));
Elliott Hughesb264f082012-04-06 17:10:10 -0700639 EXPECT_EQ(7, gJava_MyClassNatives_fooSIOO_calls);
Andreas Gampe6e498692014-08-18 16:43:12 -0700640
641 gJava_MyClassNatives_fooSIOO_calls = 0;
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700642}
643
Andreas Gampe6e498692014-08-18 16:43:12 -0700644JNI_TEST(CompileAndRunStaticIntObjectObjectMethod)
645
Elliott Hughesb264f082012-04-06 17:10:10 -0700646int gJava_MyClassNatives_fooSSIOO_calls = 0;
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700647jobject Java_MyClassNatives_fooSSIOO(JNIEnv* env, jclass klass, jint x, jobject y, jobject z) {
648 // 3 = klass + y + z
Ian Rogers50b35e22012-10-04 10:09:15 -0700649 EXPECT_EQ(kNative, Thread::Current()->GetState());
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700650 EXPECT_EQ(Thread::Current()->GetJniEnv(), env);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700651 EXPECT_TRUE(klass != nullptr);
Ian Rogersa8cd9f42011-08-19 16:43:41 -0700652 EXPECT_TRUE(env->IsInstanceOf(JniCompilerTest::jobj_, klass));
Elliott Hughesb264f082012-04-06 17:10:10 -0700653 gJava_MyClassNatives_fooSSIOO_calls++;
Ian Rogersef7d42f2014-01-06 12:55:46 -0800654 ScopedObjectAccess soa(Thread::Current());
Andreas Gampebf6b92a2014-03-05 16:11:04 -0800655 size_t null_args = (y == nullptr ? 1 : 0) + (z == nullptr ? 1 : 0);
656 EXPECT_TRUE(3U == Thread::Current()->NumStackReferences() ||
657 (3U - null_args) == Thread::Current()->NumStackReferences());
Ian Rogersdf20fe02011-07-20 20:34:16 -0700658 switch (x) {
659 case 1:
660 return y;
661 case 2:
662 return z;
663 default:
664 return klass;
665 }
666}
667
Andreas Gampe6e498692014-08-18 16:43:12 -0700668void JniCompilerTest::CompileAndRunStaticSynchronizedIntObjectObjectMethodImpl() {
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700669 SetUpForTest(true, "fooSSIOO",
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700670 "(ILjava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;",
Elliott Hughesb264f082012-04-06 17:10:10 -0700671 reinterpret_cast<void*>(&Java_MyClassNatives_fooSSIOO));
Carl Shapiro419ec7b2011-08-03 14:48:33 -0700672
Elliott Hughesb264f082012-04-06 17:10:10 -0700673 EXPECT_EQ(0, gJava_MyClassNatives_fooSSIOO_calls);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700674 jobject result = env_->CallStaticObjectMethod(jklass_, jmethod_, 0, nullptr, nullptr);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700675 EXPECT_TRUE(env_->IsSameObject(jklass_, result));
Elliott Hughesb264f082012-04-06 17:10:10 -0700676 EXPECT_EQ(1, gJava_MyClassNatives_fooSSIOO_calls);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700677
Andreas Gampecf4035a2014-05-28 22:43:01 -0700678 result = env_->CallStaticObjectMethod(jklass_, jmethod_, 0, nullptr, jobj_);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700679 EXPECT_TRUE(env_->IsSameObject(jklass_, result));
Elliott Hughesb264f082012-04-06 17:10:10 -0700680 EXPECT_EQ(2, gJava_MyClassNatives_fooSSIOO_calls);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700681 result = env_->CallStaticObjectMethod(jklass_, jmethod_, 1, nullptr, jobj_);
682 EXPECT_TRUE(env_->IsSameObject(nullptr, result));
Elliott Hughesb264f082012-04-06 17:10:10 -0700683 EXPECT_EQ(3, gJava_MyClassNatives_fooSSIOO_calls);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700684 result = env_->CallStaticObjectMethod(jklass_, jmethod_, 2, nullptr, jobj_);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700685 EXPECT_TRUE(env_->IsSameObject(jobj_, result));
Elliott Hughesb264f082012-04-06 17:10:10 -0700686 EXPECT_EQ(4, gJava_MyClassNatives_fooSSIOO_calls);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700687
Andreas Gampecf4035a2014-05-28 22:43:01 -0700688 result = env_->CallStaticObjectMethod(jklass_, jmethod_, 0, jobj_, nullptr);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700689 EXPECT_TRUE(env_->IsSameObject(jklass_, result));
Elliott Hughesb264f082012-04-06 17:10:10 -0700690 EXPECT_EQ(5, gJava_MyClassNatives_fooSSIOO_calls);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700691 result = env_->CallStaticObjectMethod(jklass_, jmethod_, 1, jobj_, nullptr);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700692 EXPECT_TRUE(env_->IsSameObject(jobj_, result));
Elliott Hughesb264f082012-04-06 17:10:10 -0700693 EXPECT_EQ(6, gJava_MyClassNatives_fooSSIOO_calls);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700694 result = env_->CallStaticObjectMethod(jklass_, jmethod_, 2, jobj_, nullptr);
695 EXPECT_TRUE(env_->IsSameObject(nullptr, result));
Elliott Hughesb264f082012-04-06 17:10:10 -0700696 EXPECT_EQ(7, gJava_MyClassNatives_fooSSIOO_calls);
Andreas Gampe6e498692014-08-18 16:43:12 -0700697
698 gJava_MyClassNatives_fooSSIOO_calls = 0;
Ian Rogersdf20fe02011-07-20 20:34:16 -0700699}
700
Andreas Gampe6e498692014-08-18 16:43:12 -0700701JNI_TEST(CompileAndRunStaticSynchronizedIntObjectObjectMethod)
702
Elliott Hughesb264f082012-04-06 17:10:10 -0700703void Java_MyClassNatives_throwException(JNIEnv* env, jobject) {
Elliott Hughesa2501992011-08-26 19:39:54 -0700704 jclass c = env->FindClass("java/lang/RuntimeException");
705 env->ThrowNew(c, "hello");
706}
Ian Rogers45a76cb2011-07-21 22:00:15 -0700707
Andreas Gampe6e498692014-08-18 16:43:12 -0700708void JniCompilerTest::ExceptionHandlingImpl() {
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700709 {
710 ASSERT_FALSE(runtime_->IsStarted());
711 ScopedObjectAccess soa(Thread::Current());
712 class_loader_ = LoadDex("MyClassNatives");
Brian Carlstrom40381fb2011-10-19 14:13:40 -0700713
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700714 // all compilation needs to happen before Runtime::Start
715 CompileForTest(class_loader_, false, "foo", "()V");
716 CompileForTest(class_loader_, false, "throwException", "()V");
717 CompileForTest(class_loader_, false, "foo", "()V");
718 }
719 // Start runtime to avoid re-initialization in SetupForTest.
720 Thread::Current()->TransitionFromSuspendedToRunnable();
Brian Carlstrombd86bcc2013-03-10 20:26:16 -0700721 bool started = runtime_->Start();
722 CHECK(started);
Brian Carlstrom25c33252011-09-18 15:58:35 -0700723
Elliott Hughesb264f082012-04-06 17:10:10 -0700724 gJava_MyClassNatives_foo_calls = 0;
Elliott Hughesa2501992011-08-26 19:39:54 -0700725
Ian Rogers67375ac2011-09-14 00:55:44 -0700726 // Check a single call of a JNI method is ok
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700727 SetUpForTest(false, "foo", "()V", reinterpret_cast<void*>(&Java_MyClassNatives_foo));
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700728 env_->CallNonvirtualVoidMethod(jobj_, jklass_, jmethod_);
Elliott Hughesb264f082012-04-06 17:10:10 -0700729 EXPECT_EQ(1, gJava_MyClassNatives_foo_calls);
Ian Rogers67375ac2011-09-14 00:55:44 -0700730 EXPECT_FALSE(Thread::Current()->IsExceptionPending());
Elliott Hughesa2501992011-08-26 19:39:54 -0700731
Ian Rogers67375ac2011-09-14 00:55:44 -0700732 // Get class for exception we expect to be thrown
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700733 ScopedLocalRef<jclass> jlre(env_, env_->FindClass("java/lang/RuntimeException"));
734 SetUpForTest(false, "throwException", "()V",
Elliott Hughesb264f082012-04-06 17:10:10 -0700735 reinterpret_cast<void*>(&Java_MyClassNatives_throwException));
736 // Call Java_MyClassNatives_throwException (JNI method that throws exception)
Elliott Hughesa2501992011-08-26 19:39:54 -0700737 env_->CallNonvirtualVoidMethod(jobj_, jklass_, jmethod_);
Elliott Hughesb264f082012-04-06 17:10:10 -0700738 EXPECT_EQ(1, gJava_MyClassNatives_foo_calls);
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700739 EXPECT_TRUE(env_->ExceptionCheck() == JNI_TRUE);
740 ScopedLocalRef<jthrowable> exception(env_, env_->ExceptionOccurred());
741 env_->ExceptionClear();
742 EXPECT_TRUE(env_->IsInstanceOf(exception.get(), jlre.get()));
Elliott Hughesa2501992011-08-26 19:39:54 -0700743
Ian Rogers67375ac2011-09-14 00:55:44 -0700744 // Check a single call of a JNI method is ok
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700745 SetUpForTest(false, "foo", "()V", reinterpret_cast<void*>(&Java_MyClassNatives_foo));
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700746 env_->CallNonvirtualVoidMethod(jobj_, jklass_, jmethod_);
Elliott Hughesb264f082012-04-06 17:10:10 -0700747 EXPECT_EQ(2, gJava_MyClassNatives_foo_calls);
Andreas Gampe6e498692014-08-18 16:43:12 -0700748
749 gJava_MyClassNatives_foo_calls = 0;
Ian Rogers45a76cb2011-07-21 22:00:15 -0700750}
751
Andreas Gampe6e498692014-08-18 16:43:12 -0700752JNI_TEST(ExceptionHandling)
753
Elliott Hughesb264f082012-04-06 17:10:10 -0700754jint Java_MyClassNatives_nativeUpCall(JNIEnv* env, jobject thisObj, jint i) {
Shih-wei Liaoff0f9be2011-08-29 15:43:53 -0700755 if (i <= 0) {
Andreas Gampecf4035a2014-05-28 22:43:01 -0700756 // We want to check raw Object* / Array* below
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700757 ScopedObjectAccess soa(env);
Ian Rogersaaa20802011-09-11 21:47:37 -0700758
759 // Build stack trace
Sebastien Hertzee1d79a2014-02-21 15:46:30 +0100760 jobject internal = Thread::Current()->CreateInternalStackTrace<false>(soa);
Ian Rogers53b8b092014-03-13 23:45:53 -0700761 jobjectArray ste_array = Thread::InternalStackTraceToStackTraceElementArray(soa, internal);
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800762 mirror::ObjectArray<mirror::StackTraceElement>* trace_array =
763 soa.Decode<mirror::ObjectArray<mirror::StackTraceElement>*>(ste_array);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700764 EXPECT_TRUE(trace_array != nullptr);
Shih-wei Liaoff0f9be2011-08-29 15:43:53 -0700765 EXPECT_EQ(11, trace_array->GetLength());
766
Ian Rogersaaa20802011-09-11 21:47:37 -0700767 // Check stack trace entries have expected values
Andreas Gampe277ccbd2014-11-03 21:36:10 -0800768 for (int32_t j = 0; j < trace_array->GetLength(); ++j) {
769 EXPECT_EQ(-2, trace_array->Get(j)->GetLineNumber());
770 mirror::StackTraceElement* ste = trace_array->Get(j);
Ian Rogersaaa20802011-09-11 21:47:37 -0700771 EXPECT_STREQ("MyClassNatives.java", ste->GetFileName()->ToModifiedUtf8().c_str());
Elliott Hughesb264f082012-04-06 17:10:10 -0700772 EXPECT_STREQ("MyClassNatives", ste->GetDeclaringClass()->ToModifiedUtf8().c_str());
Ian Rogersaaa20802011-09-11 21:47:37 -0700773 EXPECT_STREQ("fooI", ste->GetMethodName()->ToModifiedUtf8().c_str());
Shih-wei Liaoff0f9be2011-08-29 15:43:53 -0700774 }
Ian Rogersaaa20802011-09-11 21:47:37 -0700775
776 // end recursion
Shih-wei Liaoff0f9be2011-08-29 15:43:53 -0700777 return 0;
778 } else {
Elliott Hughesb264f082012-04-06 17:10:10 -0700779 jclass jklass = env->FindClass("MyClassNatives");
Andreas Gampecf4035a2014-05-28 22:43:01 -0700780 EXPECT_TRUE(jklass != nullptr);
Shih-wei Liaoff0f9be2011-08-29 15:43:53 -0700781 jmethodID jmethod = env->GetMethodID(jklass, "fooI", "(I)I");
Andreas Gampecf4035a2014-05-28 22:43:01 -0700782 EXPECT_TRUE(jmethod != nullptr);
Shih-wei Liaoff0f9be2011-08-29 15:43:53 -0700783
Ian Rogersaaa20802011-09-11 21:47:37 -0700784 // Recurse with i - 1
Shih-wei Liaoff0f9be2011-08-29 15:43:53 -0700785 jint result = env->CallNonvirtualIntMethod(thisObj, jklass, jmethod, i - 1);
Ian Rogersaaa20802011-09-11 21:47:37 -0700786
787 // Return sum of all depths
Shih-wei Liaoff0f9be2011-08-29 15:43:53 -0700788 return i + result;
789 }
790}
791
Andreas Gampe6e498692014-08-18 16:43:12 -0700792void JniCompilerTest::NativeStackTraceElementImpl() {
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700793 SetUpForTest(false, "fooI", "(I)I",
Elliott Hughesb264f082012-04-06 17:10:10 -0700794 reinterpret_cast<void*>(&Java_MyClassNatives_nativeUpCall));
Shih-wei Liaoff0f9be2011-08-29 15:43:53 -0700795 jint result = env_->CallNonvirtualIntMethod(jobj_, jklass_, jmethod_, 10);
Ian Rogersaaa20802011-09-11 21:47:37 -0700796 EXPECT_EQ(10+9+8+7+6+5+4+3+2+1, result);
Shih-wei Liaoff0f9be2011-08-29 15:43:53 -0700797}
798
Andreas Gampe6e498692014-08-18 16:43:12 -0700799JNI_TEST(NativeStackTraceElement)
800
Elliott Hughesb264f082012-04-06 17:10:10 -0700801jobject Java_MyClassNatives_fooO(JNIEnv* env, jobject, jobject x) {
Shih-wei Liao558788e2011-09-01 02:39:11 -0700802 return env->NewGlobalRef(x);
803}
804
Andreas Gampe6e498692014-08-18 16:43:12 -0700805void JniCompilerTest::ReturnGlobalRefImpl() {
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700806 SetUpForTest(false, "fooO", "(Ljava/lang/Object;)Ljava/lang/Object;",
Elliott Hughesb264f082012-04-06 17:10:10 -0700807 reinterpret_cast<void*>(&Java_MyClassNatives_fooO));
Shih-wei Liao558788e2011-09-01 02:39:11 -0700808 jobject result = env_->CallNonvirtualObjectMethod(jobj_, jklass_, jmethod_, jobj_);
809 EXPECT_EQ(JNILocalRefType, env_->GetObjectRefType(result));
810 EXPECT_TRUE(env_->IsSameObject(result, jobj_));
811}
812
Andreas Gampe6e498692014-08-18 16:43:12 -0700813JNI_TEST(ReturnGlobalRef)
814
Ian Rogersdc51b792011-09-22 20:41:37 -0700815jint local_ref_test(JNIEnv* env, jobject thisObj, jint x) {
816 // Add 10 local references
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700817 ScopedObjectAccess soa(env);
Ian Rogers5a7a74a2011-09-26 16:32:29 -0700818 for (int i = 0; i < 10; i++) {
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800819 soa.AddLocalReference<jobject>(soa.Decode<mirror::Object*>(thisObj));
Ian Rogersdc51b792011-09-22 20:41:37 -0700820 }
821 return x+1;
822}
823
Andreas Gampe6e498692014-08-18 16:43:12 -0700824void JniCompilerTest::LocalReferenceTableClearingTestImpl() {
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700825 SetUpForTest(false, "fooI", "(I)I", reinterpret_cast<void*>(&local_ref_test));
Ian Rogersdc51b792011-09-22 20:41:37 -0700826 // 1000 invocations of a method that adds 10 local references
Elliott Hughesb25c3f62012-03-26 16:35:06 -0700827 for (int i = 0; i < 1000; i++) {
Ian Rogersdc51b792011-09-22 20:41:37 -0700828 jint result = env_->CallIntMethod(jobj_, jmethod_, i);
829 EXPECT_TRUE(result == i + 1);
830 }
831}
832
Andreas Gampe6e498692014-08-18 16:43:12 -0700833JNI_TEST(LocalReferenceTableClearingTest)
834
Ian Rogersb9231c82011-09-05 22:13:19 -0700835void my_arraycopy(JNIEnv* env, jclass klass, jobject src, jint src_pos, jobject dst, jint dst_pos, jint length) {
836 EXPECT_TRUE(env->IsSameObject(JniCompilerTest::jklass_, klass));
837 EXPECT_TRUE(env->IsSameObject(JniCompilerTest::jklass_, dst));
Ian Rogers82f3e092011-09-05 22:54:45 -0700838 EXPECT_TRUE(env->IsSameObject(JniCompilerTest::jobj_, src));
Ian Rogersb9231c82011-09-05 22:13:19 -0700839 EXPECT_EQ(1234, src_pos);
840 EXPECT_EQ(5678, dst_pos);
841 EXPECT_EQ(9876, length);
842}
843
Andreas Gampe6e498692014-08-18 16:43:12 -0700844void JniCompilerTest::JavaLangSystemArrayCopyImpl() {
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700845 SetUpForTest(true, "arraycopy", "(Ljava/lang/Object;ILjava/lang/Object;II)V",
Ian Rogersb9231c82011-09-05 22:13:19 -0700846 reinterpret_cast<void*>(&my_arraycopy));
Ian Rogers82f3e092011-09-05 22:54:45 -0700847 env_->CallStaticVoidMethod(jklass_, jmethod_, jobj_, 1234, jklass_, 5678, 9876);
Ian Rogersb9231c82011-09-05 22:13:19 -0700848}
849
Andreas Gampe6e498692014-08-18 16:43:12 -0700850JNI_TEST(JavaLangSystemArrayCopy)
851
Ian Rogers67375ac2011-09-14 00:55:44 -0700852jboolean my_casi(JNIEnv* env, jobject unsafe, jobject obj, jlong offset, jint expected, jint newval) {
853 EXPECT_TRUE(env->IsSameObject(JniCompilerTest::jobj_, unsafe));
854 EXPECT_TRUE(env->IsSameObject(JniCompilerTest::jobj_, obj));
Ian Rogers0f678472014-03-10 16:18:37 -0700855 EXPECT_EQ(INT64_C(0x12345678ABCDEF88), offset);
Ian Rogers67375ac2011-09-14 00:55:44 -0700856 EXPECT_EQ(static_cast<jint>(0xCAFEF00D), expected);
857 EXPECT_EQ(static_cast<jint>(0xEBADF00D), newval);
858 return JNI_TRUE;
859}
860
Andreas Gampe6e498692014-08-18 16:43:12 -0700861void JniCompilerTest::CompareAndSwapIntImpl() {
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700862 SetUpForTest(false, "compareAndSwapInt", "(Ljava/lang/Object;JII)Z",
Ian Rogers67375ac2011-09-14 00:55:44 -0700863 reinterpret_cast<void*>(&my_casi));
Ian Rogers0f678472014-03-10 16:18:37 -0700864 jboolean result = env_->CallBooleanMethod(jobj_, jmethod_, jobj_, INT64_C(0x12345678ABCDEF88),
865 0xCAFEF00D, 0xEBADF00D);
Ian Rogers67375ac2011-09-14 00:55:44 -0700866 EXPECT_EQ(result, JNI_TRUE);
867}
868
Andreas Gampe6e498692014-08-18 16:43:12 -0700869JNI_TEST(CompareAndSwapInt)
870
Ian Rogersc7792842012-03-03 15:36:20 -0800871jint my_gettext(JNIEnv* env, jclass klass, jlong val1, jobject obj1, jlong val2, jobject obj2) {
872 EXPECT_TRUE(env->IsInstanceOf(JniCompilerTest::jobj_, klass));
873 EXPECT_TRUE(env->IsSameObject(JniCompilerTest::jobj_, obj1));
874 EXPECT_TRUE(env->IsSameObject(JniCompilerTest::jobj_, obj2));
875 EXPECT_EQ(0x12345678ABCDEF88ll, val1);
876 EXPECT_EQ(0x7FEDCBA987654321ll, val2);
877 return 42;
878}
879
Andreas Gampe6e498692014-08-18 16:43:12 -0700880void JniCompilerTest::GetTextImpl() {
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700881 SetUpForTest(true, "getText", "(JLjava/lang/Object;JLjava/lang/Object;)I",
Ian Rogersc7792842012-03-03 15:36:20 -0800882 reinterpret_cast<void*>(&my_gettext));
883 jint result = env_->CallStaticIntMethod(jklass_, jmethod_, 0x12345678ABCDEF88ll, jobj_,
Ian Rogers0f678472014-03-10 16:18:37 -0700884 INT64_C(0x7FEDCBA987654321), jobj_);
Ian Rogersc7792842012-03-03 15:36:20 -0800885 EXPECT_EQ(result, 42);
886}
887
Andreas Gampe6e498692014-08-18 16:43:12 -0700888JNI_TEST(GetText)
889
Vladimir Marko4e24b9d2014-07-24 17:01:58 +0100890int gJava_MyClassNatives_GetSinkProperties_calls = 0;
891jarray Java_MyClassNatives_GetSinkProperties(JNIEnv* env, jobject thisObj, jstring s) {
892 // 1 = thisObj
893 Thread* self = Thread::Current();
894 EXPECT_EQ(kNative, self->GetState());
895 Locks::mutator_lock_->AssertNotHeld(self);
896 EXPECT_EQ(self->GetJniEnv(), env);
897 EXPECT_TRUE(thisObj != nullptr);
898 EXPECT_TRUE(env->IsInstanceOf(thisObj, JniCompilerTest::jklass_));
899 EXPECT_EQ(s, nullptr);
900 gJava_MyClassNatives_GetSinkProperties_calls++;
901 ScopedObjectAccess soa(self);
902 EXPECT_EQ(2U, self->NumStackReferences());
903 EXPECT_TRUE(self->HoldsLock(soa.Decode<mirror::Object*>(thisObj)));
904 return nullptr;
905}
906
Andreas Gampe6e498692014-08-18 16:43:12 -0700907void JniCompilerTest::GetSinkPropertiesNativeImpl() {
Vladimir Marko4e24b9d2014-07-24 17:01:58 +0100908 SetUpForTest(false, "getSinkPropertiesNative", "(Ljava/lang/String;)[Ljava/lang/Object;",
909 reinterpret_cast<void*>(&Java_MyClassNatives_GetSinkProperties));
910
911 EXPECT_EQ(0, gJava_MyClassNatives_GetSinkProperties_calls);
912 jarray result = down_cast<jarray>(
913 env_->CallNonvirtualObjectMethod(jobj_, jklass_, jmethod_, nullptr));
914 EXPECT_EQ(nullptr, result);
915 EXPECT_EQ(1, gJava_MyClassNatives_GetSinkProperties_calls);
Andreas Gampe6e498692014-08-18 16:43:12 -0700916
917 gJava_MyClassNatives_GetSinkProperties_calls = 0;
Brian Carlstromfc7120c2012-08-27 13:43:25 -0700918}
919
Andreas Gampe6e498692014-08-18 16:43:12 -0700920JNI_TEST(GetSinkPropertiesNative)
921
Elliott Hughesb264f082012-04-06 17:10:10 -0700922// This should return jclass, but we're imitating a bug pattern.
923jobject Java_MyClassNatives_instanceMethodThatShouldReturnClass(JNIEnv* env, jobject) {
924 return env->NewStringUTF("not a class!");
925}
926
927// This should return jclass, but we're imitating a bug pattern.
928jobject Java_MyClassNatives_staticMethodThatShouldReturnClass(JNIEnv* env, jclass) {
929 return env->NewStringUTF("not a class!");
930}
931
Andreas Gampe6e498692014-08-18 16:43:12 -0700932void JniCompilerTest::UpcallReturnTypeChecking_InstanceImpl() {
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700933 SetUpForTest(false, "instanceMethodThatShouldReturnClass", "()Ljava/lang/Class;",
Elliott Hughesb264f082012-04-06 17:10:10 -0700934 reinterpret_cast<void*>(&Java_MyClassNatives_instanceMethodThatShouldReturnClass));
935
936 CheckJniAbortCatcher check_jni_abort_catcher;
Elliott Hughes3f6635a2012-06-19 13:37:49 -0700937 // This native method is bad, and tries to return a jstring as a jclass.
938 env_->CallObjectMethod(jobj_, jmethod_);
939 check_jni_abort_catcher.Check("attempt to return an instance of java.lang.String from java.lang.Class MyClassNatives.instanceMethodThatShouldReturnClass()");
940
941 // Here, we just call the method incorrectly; we should catch that too.
Ian Rogers68d8b422014-07-17 11:09:10 -0700942 env_->CallObjectMethod(jobj_, jmethod_);
Elliott Hughes3f6635a2012-06-19 13:37:49 -0700943 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 -0700944 env_->CallStaticObjectMethod(jklass_, jmethod_);
945 check_jni_abort_catcher.Check("calling non-static method java.lang.Class MyClassNatives.instanceMethodThatShouldReturnClass() with CallStaticObjectMethodV");
Elliott Hughesb264f082012-04-06 17:10:10 -0700946}
947
Andreas Gampe6e498692014-08-18 16:43:12 -0700948JNI_TEST(UpcallReturnTypeChecking_Instance)
949
950void JniCompilerTest::UpcallReturnTypeChecking_StaticImpl() {
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700951 SetUpForTest(true, "staticMethodThatShouldReturnClass", "()Ljava/lang/Class;",
Elliott Hughesb264f082012-04-06 17:10:10 -0700952 reinterpret_cast<void*>(&Java_MyClassNatives_staticMethodThatShouldReturnClass));
953
954 CheckJniAbortCatcher check_jni_abort_catcher;
Elliott Hughes3f6635a2012-06-19 13:37:49 -0700955 // This native method is bad, and tries to return a jstring as a jclass.
956 env_->CallStaticObjectMethod(jklass_, jmethod_);
957 check_jni_abort_catcher.Check("attempt to return an instance of java.lang.String from java.lang.Class MyClassNatives.staticMethodThatShouldReturnClass()");
958
959 // Here, we just call the method incorrectly; we should catch that too.
Ian Rogers68d8b422014-07-17 11:09:10 -0700960 env_->CallStaticObjectMethod(jklass_, jmethod_);
Elliott Hughes3f6635a2012-06-19 13:37:49 -0700961 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 -0700962 env_->CallObjectMethod(jobj_, jmethod_);
963 check_jni_abort_catcher.Check("calling static method java.lang.Class MyClassNatives.staticMethodThatShouldReturnClass() with CallObjectMethodV");
Elliott Hughesb264f082012-04-06 17:10:10 -0700964}
965
Andreas Gampe6e498692014-08-18 16:43:12 -0700966JNI_TEST(UpcallReturnTypeChecking_Static)
967
Elliott Hughesb264f082012-04-06 17:10:10 -0700968// This should take jclass, but we're imitating a bug pattern.
969void Java_MyClassNatives_instanceMethodThatShouldTakeClass(JNIEnv*, jobject, jclass) {
970}
971
972// This should take jclass, but we're imitating a bug pattern.
973void Java_MyClassNatives_staticMethodThatShouldTakeClass(JNIEnv*, jclass, jclass) {
974}
975
Andreas Gampe6e498692014-08-18 16:43:12 -0700976void JniCompilerTest::UpcallArgumentTypeChecking_InstanceImpl() {
Andreas Gampe369810a2015-01-14 19:53:31 -0800977 // This will lead to error messages in the log.
978 ScopedLogSeverity sls(LogSeverity::FATAL);
979
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700980 SetUpForTest(false, "instanceMethodThatShouldTakeClass", "(ILjava/lang/Class;)V",
Elliott Hughesb264f082012-04-06 17:10:10 -0700981 reinterpret_cast<void*>(&Java_MyClassNatives_instanceMethodThatShouldTakeClass));
982
983 CheckJniAbortCatcher check_jni_abort_catcher;
984 // We deliberately pass a bad second argument here.
985 env_->CallVoidMethod(jobj_, jmethod_, 123, env_->NewStringUTF("not a class!"));
Elliott Hughes3f6635a2012-06-19 13:37:49 -0700986 check_jni_abort_catcher.Check("bad arguments passed to void MyClassNatives.instanceMethodThatShouldTakeClass(int, java.lang.Class)");
Elliott Hughesb264f082012-04-06 17:10:10 -0700987}
988
Andreas Gampe6e498692014-08-18 16:43:12 -0700989JNI_TEST(UpcallArgumentTypeChecking_Instance)
990
991void JniCompilerTest::UpcallArgumentTypeChecking_StaticImpl() {
Andreas Gampe369810a2015-01-14 19:53:31 -0800992 // This will lead to error messages in the log.
993 ScopedLogSeverity sls(LogSeverity::FATAL);
994
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700995 SetUpForTest(true, "staticMethodThatShouldTakeClass", "(ILjava/lang/Class;)V",
Elliott Hughesb264f082012-04-06 17:10:10 -0700996 reinterpret_cast<void*>(&Java_MyClassNatives_staticMethodThatShouldTakeClass));
997
998 CheckJniAbortCatcher check_jni_abort_catcher;
999 // We deliberately pass a bad second argument here.
1000 env_->CallStaticVoidMethod(jklass_, jmethod_, 123, env_->NewStringUTF("not a class!"));
Elliott Hughes3f6635a2012-06-19 13:37:49 -07001001 check_jni_abort_catcher.Check("bad arguments passed to void MyClassNatives.staticMethodThatShouldTakeClass(int, java.lang.Class)");
Elliott Hughesb264f082012-04-06 17:10:10 -07001002}
1003
Andreas Gampe6e498692014-08-18 16:43:12 -07001004JNI_TEST(UpcallArgumentTypeChecking_Static)
1005
Andreas Gampe7a0e5042014-03-07 13:03:19 -08001006jfloat Java_MyClassNatives_checkFloats(JNIEnv* env, jobject thisObj, jfloat f1, jfloat f2) {
1007 EXPECT_EQ(kNative, Thread::Current()->GetState());
1008 EXPECT_EQ(Thread::Current()->GetJniEnv(), env);
Andreas Gampecf4035a2014-05-28 22:43:01 -07001009 EXPECT_TRUE(thisObj != nullptr);
Andreas Gampe7a0e5042014-03-07 13:03:19 -08001010 EXPECT_TRUE(env->IsInstanceOf(thisObj, JniCompilerTest::jklass_));
1011 ScopedObjectAccess soa(Thread::Current());
1012 EXPECT_EQ(1U, Thread::Current()->NumStackReferences());
1013 return f1 - f2; // non-commutative operator
1014}
1015
Andreas Gampe6e498692014-08-18 16:43:12 -07001016void JniCompilerTest::CompileAndRunFloatFloatMethodImpl() {
Andreas Gampe7a0e5042014-03-07 13:03:19 -08001017 SetUpForTest(false, "checkFloats", "(FF)F",
1018 reinterpret_cast<void*>(&Java_MyClassNatives_checkFloats));
1019
1020 jfloat result = env_->CallNonvirtualFloatMethod(jobj_, jklass_, jmethod_,
1021 99.0F, 10.0F);
Ian Rogers647b1a82014-10-10 11:02:11 -07001022 EXPECT_FLOAT_EQ(99.0F - 10.0F, result);
Andreas Gampe7a0e5042014-03-07 13:03:19 -08001023 jfloat a = 3.14159F;
1024 jfloat b = 0.69314F;
1025 result = env_->CallNonvirtualFloatMethod(jobj_, jklass_, jmethod_, a, b);
Ian Rogers647b1a82014-10-10 11:02:11 -07001026 EXPECT_FLOAT_EQ(a - b, result);
Andreas Gampe7a0e5042014-03-07 13:03:19 -08001027}
1028
Andreas Gampe6e498692014-08-18 16:43:12 -07001029JNI_TEST(CompileAndRunFloatFloatMethod)
1030
Ian Rogers6a3c1fc2014-10-31 00:33:20 -07001031void Java_MyClassNatives_checkParameterAlign(JNIEnv* env ATTRIBUTE_UNUSED,
1032 jobject thisObj ATTRIBUTE_UNUSED,
1033 jint i1 ATTRIBUTE_UNUSED,
1034 jlong l1 ATTRIBUTE_UNUSED) {
Andreas Gampecf4035a2014-05-28 22:43:01 -07001035// EXPECT_EQ(kNative, Thread::Current()->GetState());
1036// EXPECT_EQ(Thread::Current()->GetJniEnv(), env);
1037// EXPECT_TRUE(thisObj != nullptr);
1038// EXPECT_TRUE(env->IsInstanceOf(thisObj, JniCompilerTest::jklass_));
1039// ScopedObjectAccess soa(Thread::Current());
1040// EXPECT_EQ(1U, Thread::Current()->NumStackReferences());
Andreas Gampe7a0e5042014-03-07 13:03:19 -08001041 EXPECT_EQ(i1, 1234);
Ian Rogers0f678472014-03-10 16:18:37 -07001042 EXPECT_EQ(l1, INT64_C(0x12345678ABCDEF0));
Andreas Gampe7a0e5042014-03-07 13:03:19 -08001043}
1044
Andreas Gampe6e498692014-08-18 16:43:12 -07001045void JniCompilerTest::CheckParameterAlignImpl() {
Andreas Gampe7a0e5042014-03-07 13:03:19 -08001046 SetUpForTest(false, "checkParameterAlign", "(IJ)V",
1047 reinterpret_cast<void*>(&Java_MyClassNatives_checkParameterAlign));
1048
Ian Rogers0f678472014-03-10 16:18:37 -07001049 env_->CallNonvirtualVoidMethod(jobj_, jklass_, jmethod_, 1234, INT64_C(0x12345678ABCDEF0));
Andreas Gampe7a0e5042014-03-07 13:03:19 -08001050}
1051
Andreas Gampe6e498692014-08-18 16:43:12 -07001052JNI_TEST(CheckParameterAlign)
1053
Andreas Gampe7a0e5042014-03-07 13:03:19 -08001054void Java_MyClassNatives_maxParamNumber(JNIEnv* env, jobject thisObj,
1055 jobject o0, jobject o1, jobject o2, jobject o3, jobject o4, jobject o5, jobject o6, jobject o7,
1056 jobject o8, jobject o9, jobject o10, jobject o11, jobject o12, jobject o13, jobject o14, jobject o15,
1057 jobject o16, jobject o17, jobject o18, jobject o19, jobject o20, jobject o21, jobject o22, jobject o23,
1058 jobject o24, jobject o25, jobject o26, jobject o27, jobject o28, jobject o29, jobject o30, jobject o31,
1059 jobject o32, jobject o33, jobject o34, jobject o35, jobject o36, jobject o37, jobject o38, jobject o39,
1060 jobject o40, jobject o41, jobject o42, jobject o43, jobject o44, jobject o45, jobject o46, jobject o47,
1061 jobject o48, jobject o49, jobject o50, jobject o51, jobject o52, jobject o53, jobject o54, jobject o55,
1062 jobject o56, jobject o57, jobject o58, jobject o59, jobject o60, jobject o61, jobject o62, jobject o63,
1063 jobject o64, jobject o65, jobject o66, jobject o67, jobject o68, jobject o69, jobject o70, jobject o71,
1064 jobject o72, jobject o73, jobject o74, jobject o75, jobject o76, jobject o77, jobject o78, jobject o79,
1065 jobject o80, jobject o81, jobject o82, jobject o83, jobject o84, jobject o85, jobject o86, jobject o87,
1066 jobject o88, jobject o89, jobject o90, jobject o91, jobject o92, jobject o93, jobject o94, jobject o95,
1067 jobject o96, jobject o97, jobject o98, jobject o99, jobject o100, jobject o101, jobject o102, jobject o103,
1068 jobject o104, jobject o105, jobject o106, jobject o107, jobject o108, jobject o109, jobject o110, jobject o111,
1069 jobject o112, jobject o113, jobject o114, jobject o115, jobject o116, jobject o117, jobject o118, jobject o119,
1070 jobject o120, jobject o121, jobject o122, jobject o123, jobject o124, jobject o125, jobject o126, jobject o127,
1071 jobject o128, jobject o129, jobject o130, jobject o131, jobject o132, jobject o133, jobject o134, jobject o135,
1072 jobject o136, jobject o137, jobject o138, jobject o139, jobject o140, jobject o141, jobject o142, jobject o143,
1073 jobject o144, jobject o145, jobject o146, jobject o147, jobject o148, jobject o149, jobject o150, jobject o151,
1074 jobject o152, jobject o153, jobject o154, jobject o155, jobject o156, jobject o157, jobject o158, jobject o159,
1075 jobject o160, jobject o161, jobject o162, jobject o163, jobject o164, jobject o165, jobject o166, jobject o167,
1076 jobject o168, jobject o169, jobject o170, jobject o171, jobject o172, jobject o173, jobject o174, jobject o175,
1077 jobject o176, jobject o177, jobject o178, jobject o179, jobject o180, jobject o181, jobject o182, jobject o183,
1078 jobject o184, jobject o185, jobject o186, jobject o187, jobject o188, jobject o189, jobject o190, jobject o191,
1079 jobject o192, jobject o193, jobject o194, jobject o195, jobject o196, jobject o197, jobject o198, jobject o199,
1080 jobject o200, jobject o201, jobject o202, jobject o203, jobject o204, jobject o205, jobject o206, jobject o207,
1081 jobject o208, jobject o209, jobject o210, jobject o211, jobject o212, jobject o213, jobject o214, jobject o215,
1082 jobject o216, jobject o217, jobject o218, jobject o219, jobject o220, jobject o221, jobject o222, jobject o223,
1083 jobject o224, jobject o225, jobject o226, jobject o227, jobject o228, jobject o229, jobject o230, jobject o231,
1084 jobject o232, jobject o233, jobject o234, jobject o235, jobject o236, jobject o237, jobject o238, jobject o239,
1085 jobject o240, jobject o241, jobject o242, jobject o243, jobject o244, jobject o245, jobject o246, jobject o247,
1086 jobject o248, jobject o249, jobject o250, jobject o251, jobject o252, jobject o253) {
1087 EXPECT_EQ(kNative, Thread::Current()->GetState());
1088 EXPECT_EQ(Thread::Current()->GetJniEnv(), env);
Andreas Gampecf4035a2014-05-28 22:43:01 -07001089 EXPECT_TRUE(thisObj != nullptr);
Andreas Gampe7a0e5042014-03-07 13:03:19 -08001090 EXPECT_TRUE(env->IsInstanceOf(thisObj, JniCompilerTest::jklass_));
1091 ScopedObjectAccess soa(Thread::Current());
1092 EXPECT_GE(255U, Thread::Current()->NumStackReferences());
1093
1094 // two tests possible
1095 if (o0 == nullptr) {
1096 // 1) everything is null
1097 EXPECT_TRUE(o0 == nullptr && o1 == nullptr && o2 == nullptr && o3 == nullptr && o4 == nullptr
1098 && o5 == nullptr && o6 == nullptr && o7 == nullptr && o8 == nullptr && o9 == nullptr
1099 && o10 == nullptr && o11 == nullptr && o12 == nullptr && o13 == nullptr && o14 == nullptr
1100 && o15 == nullptr && o16 == nullptr && o17 == nullptr && o18 == nullptr && o19 == nullptr
1101 && o20 == nullptr && o21 == nullptr && o22 == nullptr && o23 == nullptr && o24 == nullptr
1102 && o25 == nullptr && o26 == nullptr && o27 == nullptr && o28 == nullptr && o29 == nullptr
1103 && o30 == nullptr && o31 == nullptr && o32 == nullptr && o33 == nullptr && o34 == nullptr
1104 && o35 == nullptr && o36 == nullptr && o37 == nullptr && o38 == nullptr && o39 == nullptr
1105 && o40 == nullptr && o41 == nullptr && o42 == nullptr && o43 == nullptr && o44 == nullptr
1106 && o45 == nullptr && o46 == nullptr && o47 == nullptr && o48 == nullptr && o49 == nullptr
1107 && o50 == nullptr && o51 == nullptr && o52 == nullptr && o53 == nullptr && o54 == nullptr
1108 && o55 == nullptr && o56 == nullptr && o57 == nullptr && o58 == nullptr && o59 == nullptr
1109 && o60 == nullptr && o61 == nullptr && o62 == nullptr && o63 == nullptr && o64 == nullptr
1110 && o65 == nullptr && o66 == nullptr && o67 == nullptr && o68 == nullptr && o69 == nullptr
1111 && o70 == nullptr && o71 == nullptr && o72 == nullptr && o73 == nullptr && o74 == nullptr
1112 && o75 == nullptr && o76 == nullptr && o77 == nullptr && o78 == nullptr && o79 == nullptr
1113 && o80 == nullptr && o81 == nullptr && o82 == nullptr && o83 == nullptr && o84 == nullptr
1114 && o85 == nullptr && o86 == nullptr && o87 == nullptr && o88 == nullptr && o89 == nullptr
1115 && o90 == nullptr && o91 == nullptr && o92 == nullptr && o93 == nullptr && o94 == nullptr
1116 && o95 == nullptr && o96 == nullptr && o97 == nullptr && o98 == nullptr && o99 == nullptr
1117 && o100 == nullptr && o101 == nullptr && o102 == nullptr && o103 == nullptr && o104 == nullptr
1118 && o105 == nullptr && o106 == nullptr && o107 == nullptr && o108 == nullptr && o109 == nullptr
1119 && o110 == nullptr && o111 == nullptr && o112 == nullptr && o113 == nullptr && o114 == nullptr
1120 && o115 == nullptr && o116 == nullptr && o117 == nullptr && o118 == nullptr && o119 == nullptr
1121 && o120 == nullptr && o121 == nullptr && o122 == nullptr && o123 == nullptr && o124 == nullptr
1122 && o125 == nullptr && o126 == nullptr && o127 == nullptr && o128 == nullptr && o129 == nullptr
1123 && o130 == nullptr && o131 == nullptr && o132 == nullptr && o133 == nullptr && o134 == nullptr
1124 && o135 == nullptr && o136 == nullptr && o137 == nullptr && o138 == nullptr && o139 == nullptr
1125 && o140 == nullptr && o141 == nullptr && o142 == nullptr && o143 == nullptr && o144 == nullptr
1126 && o145 == nullptr && o146 == nullptr && o147 == nullptr && o148 == nullptr && o149 == nullptr
1127 && o150 == nullptr && o151 == nullptr && o152 == nullptr && o153 == nullptr && o154 == nullptr
1128 && o155 == nullptr && o156 == nullptr && o157 == nullptr && o158 == nullptr && o159 == nullptr
1129 && o160 == nullptr && o161 == nullptr && o162 == nullptr && o163 == nullptr && o164 == nullptr
1130 && o165 == nullptr && o166 == nullptr && o167 == nullptr && o168 == nullptr && o169 == nullptr
1131 && o170 == nullptr && o171 == nullptr && o172 == nullptr && o173 == nullptr && o174 == nullptr
1132 && o175 == nullptr && o176 == nullptr && o177 == nullptr && o178 == nullptr && o179 == nullptr
1133 && o180 == nullptr && o181 == nullptr && o182 == nullptr && o183 == nullptr && o184 == nullptr
1134 && o185 == nullptr && o186 == nullptr && o187 == nullptr && o188 == nullptr && o189 == nullptr
1135 && o190 == nullptr && o191 == nullptr && o192 == nullptr && o193 == nullptr && o194 == nullptr
1136 && o195 == nullptr && o196 == nullptr && o197 == nullptr && o198 == nullptr && o199 == nullptr
1137 && o200 == nullptr && o201 == nullptr && o202 == nullptr && o203 == nullptr && o204 == nullptr
1138 && o205 == nullptr && o206 == nullptr && o207 == nullptr && o208 == nullptr && o209 == nullptr
1139 && o210 == nullptr && o211 == nullptr && o212 == nullptr && o213 == nullptr && o214 == nullptr
1140 && o215 == nullptr && o216 == nullptr && o217 == nullptr && o218 == nullptr && o219 == nullptr
1141 && o220 == nullptr && o221 == nullptr && o222 == nullptr && o223 == nullptr && o224 == nullptr
1142 && o225 == nullptr && o226 == nullptr && o227 == nullptr && o228 == nullptr && o229 == nullptr
1143 && o230 == nullptr && o231 == nullptr && o232 == nullptr && o233 == nullptr && o234 == nullptr
1144 && o235 == nullptr && o236 == nullptr && o237 == nullptr && o238 == nullptr && o239 == nullptr
1145 && o240 == nullptr && o241 == nullptr && o242 == nullptr && o243 == nullptr && o244 == nullptr
1146 && o245 == nullptr && o246 == nullptr && o247 == nullptr && o248 == nullptr && o249 == nullptr
1147 && o250 == nullptr && o251 == nullptr && o252 == nullptr && o253 == nullptr);
1148 } else {
1149 EXPECT_EQ(0, env->GetArrayLength(reinterpret_cast<jarray>(o0)));
1150 EXPECT_EQ(1, env->GetArrayLength(reinterpret_cast<jarray>(o1)));
1151 EXPECT_EQ(2, env->GetArrayLength(reinterpret_cast<jarray>(o2)));
1152 EXPECT_EQ(3, env->GetArrayLength(reinterpret_cast<jarray>(o3)));
1153 EXPECT_EQ(4, env->GetArrayLength(reinterpret_cast<jarray>(o4)));
1154 EXPECT_EQ(5, env->GetArrayLength(reinterpret_cast<jarray>(o5)));
1155 EXPECT_EQ(6, env->GetArrayLength(reinterpret_cast<jarray>(o6)));
1156 EXPECT_EQ(7, env->GetArrayLength(reinterpret_cast<jarray>(o7)));
1157 EXPECT_EQ(8, env->GetArrayLength(reinterpret_cast<jarray>(o8)));
1158 EXPECT_EQ(9, env->GetArrayLength(reinterpret_cast<jarray>(o9)));
1159 EXPECT_EQ(10, env->GetArrayLength(reinterpret_cast<jarray>(o10)));
1160 EXPECT_EQ(11, env->GetArrayLength(reinterpret_cast<jarray>(o11)));
1161 EXPECT_EQ(12, env->GetArrayLength(reinterpret_cast<jarray>(o12)));
1162 EXPECT_EQ(13, env->GetArrayLength(reinterpret_cast<jarray>(o13)));
1163 EXPECT_EQ(14, env->GetArrayLength(reinterpret_cast<jarray>(o14)));
1164 EXPECT_EQ(15, env->GetArrayLength(reinterpret_cast<jarray>(o15)));
1165 EXPECT_EQ(16, env->GetArrayLength(reinterpret_cast<jarray>(o16)));
1166 EXPECT_EQ(17, env->GetArrayLength(reinterpret_cast<jarray>(o17)));
1167 EXPECT_EQ(18, env->GetArrayLength(reinterpret_cast<jarray>(o18)));
1168 EXPECT_EQ(19, env->GetArrayLength(reinterpret_cast<jarray>(o19)));
1169 EXPECT_EQ(20, env->GetArrayLength(reinterpret_cast<jarray>(o20)));
1170 EXPECT_EQ(21, env->GetArrayLength(reinterpret_cast<jarray>(o21)));
1171 EXPECT_EQ(22, env->GetArrayLength(reinterpret_cast<jarray>(o22)));
1172 EXPECT_EQ(23, env->GetArrayLength(reinterpret_cast<jarray>(o23)));
1173 EXPECT_EQ(24, env->GetArrayLength(reinterpret_cast<jarray>(o24)));
1174 EXPECT_EQ(25, env->GetArrayLength(reinterpret_cast<jarray>(o25)));
1175 EXPECT_EQ(26, env->GetArrayLength(reinterpret_cast<jarray>(o26)));
1176 EXPECT_EQ(27, env->GetArrayLength(reinterpret_cast<jarray>(o27)));
1177 EXPECT_EQ(28, env->GetArrayLength(reinterpret_cast<jarray>(o28)));
1178 EXPECT_EQ(29, env->GetArrayLength(reinterpret_cast<jarray>(o29)));
1179 EXPECT_EQ(30, env->GetArrayLength(reinterpret_cast<jarray>(o30)));
1180 EXPECT_EQ(31, env->GetArrayLength(reinterpret_cast<jarray>(o31)));
1181 EXPECT_EQ(32, env->GetArrayLength(reinterpret_cast<jarray>(o32)));
1182 EXPECT_EQ(33, env->GetArrayLength(reinterpret_cast<jarray>(o33)));
1183 EXPECT_EQ(34, env->GetArrayLength(reinterpret_cast<jarray>(o34)));
1184 EXPECT_EQ(35, env->GetArrayLength(reinterpret_cast<jarray>(o35)));
1185 EXPECT_EQ(36, env->GetArrayLength(reinterpret_cast<jarray>(o36)));
1186 EXPECT_EQ(37, env->GetArrayLength(reinterpret_cast<jarray>(o37)));
1187 EXPECT_EQ(38, env->GetArrayLength(reinterpret_cast<jarray>(o38)));
1188 EXPECT_EQ(39, env->GetArrayLength(reinterpret_cast<jarray>(o39)));
1189 EXPECT_EQ(40, env->GetArrayLength(reinterpret_cast<jarray>(o40)));
1190 EXPECT_EQ(41, env->GetArrayLength(reinterpret_cast<jarray>(o41)));
1191 EXPECT_EQ(42, env->GetArrayLength(reinterpret_cast<jarray>(o42)));
1192 EXPECT_EQ(43, env->GetArrayLength(reinterpret_cast<jarray>(o43)));
1193 EXPECT_EQ(44, env->GetArrayLength(reinterpret_cast<jarray>(o44)));
1194 EXPECT_EQ(45, env->GetArrayLength(reinterpret_cast<jarray>(o45)));
1195 EXPECT_EQ(46, env->GetArrayLength(reinterpret_cast<jarray>(o46)));
1196 EXPECT_EQ(47, env->GetArrayLength(reinterpret_cast<jarray>(o47)));
1197 EXPECT_EQ(48, env->GetArrayLength(reinterpret_cast<jarray>(o48)));
1198 EXPECT_EQ(49, env->GetArrayLength(reinterpret_cast<jarray>(o49)));
1199 EXPECT_EQ(50, env->GetArrayLength(reinterpret_cast<jarray>(o50)));
1200 EXPECT_EQ(51, env->GetArrayLength(reinterpret_cast<jarray>(o51)));
1201 EXPECT_EQ(52, env->GetArrayLength(reinterpret_cast<jarray>(o52)));
1202 EXPECT_EQ(53, env->GetArrayLength(reinterpret_cast<jarray>(o53)));
1203 EXPECT_EQ(54, env->GetArrayLength(reinterpret_cast<jarray>(o54)));
1204 EXPECT_EQ(55, env->GetArrayLength(reinterpret_cast<jarray>(o55)));
1205 EXPECT_EQ(56, env->GetArrayLength(reinterpret_cast<jarray>(o56)));
1206 EXPECT_EQ(57, env->GetArrayLength(reinterpret_cast<jarray>(o57)));
1207 EXPECT_EQ(58, env->GetArrayLength(reinterpret_cast<jarray>(o58)));
1208 EXPECT_EQ(59, env->GetArrayLength(reinterpret_cast<jarray>(o59)));
1209 EXPECT_EQ(60, env->GetArrayLength(reinterpret_cast<jarray>(o60)));
1210 EXPECT_EQ(61, env->GetArrayLength(reinterpret_cast<jarray>(o61)));
1211 EXPECT_EQ(62, env->GetArrayLength(reinterpret_cast<jarray>(o62)));
1212 EXPECT_EQ(63, env->GetArrayLength(reinterpret_cast<jarray>(o63)));
1213 EXPECT_EQ(64, env->GetArrayLength(reinterpret_cast<jarray>(o64)));
1214 EXPECT_EQ(65, env->GetArrayLength(reinterpret_cast<jarray>(o65)));
1215 EXPECT_EQ(66, env->GetArrayLength(reinterpret_cast<jarray>(o66)));
1216 EXPECT_EQ(67, env->GetArrayLength(reinterpret_cast<jarray>(o67)));
1217 EXPECT_EQ(68, env->GetArrayLength(reinterpret_cast<jarray>(o68)));
1218 EXPECT_EQ(69, env->GetArrayLength(reinterpret_cast<jarray>(o69)));
1219 EXPECT_EQ(70, env->GetArrayLength(reinterpret_cast<jarray>(o70)));
1220 EXPECT_EQ(71, env->GetArrayLength(reinterpret_cast<jarray>(o71)));
1221 EXPECT_EQ(72, env->GetArrayLength(reinterpret_cast<jarray>(o72)));
1222 EXPECT_EQ(73, env->GetArrayLength(reinterpret_cast<jarray>(o73)));
1223 EXPECT_EQ(74, env->GetArrayLength(reinterpret_cast<jarray>(o74)));
1224 EXPECT_EQ(75, env->GetArrayLength(reinterpret_cast<jarray>(o75)));
1225 EXPECT_EQ(76, env->GetArrayLength(reinterpret_cast<jarray>(o76)));
1226 EXPECT_EQ(77, env->GetArrayLength(reinterpret_cast<jarray>(o77)));
1227 EXPECT_EQ(78, env->GetArrayLength(reinterpret_cast<jarray>(o78)));
1228 EXPECT_EQ(79, env->GetArrayLength(reinterpret_cast<jarray>(o79)));
1229 EXPECT_EQ(80, env->GetArrayLength(reinterpret_cast<jarray>(o80)));
1230 EXPECT_EQ(81, env->GetArrayLength(reinterpret_cast<jarray>(o81)));
1231 EXPECT_EQ(82, env->GetArrayLength(reinterpret_cast<jarray>(o82)));
1232 EXPECT_EQ(83, env->GetArrayLength(reinterpret_cast<jarray>(o83)));
1233 EXPECT_EQ(84, env->GetArrayLength(reinterpret_cast<jarray>(o84)));
1234 EXPECT_EQ(85, env->GetArrayLength(reinterpret_cast<jarray>(o85)));
1235 EXPECT_EQ(86, env->GetArrayLength(reinterpret_cast<jarray>(o86)));
1236 EXPECT_EQ(87, env->GetArrayLength(reinterpret_cast<jarray>(o87)));
1237 EXPECT_EQ(88, env->GetArrayLength(reinterpret_cast<jarray>(o88)));
1238 EXPECT_EQ(89, env->GetArrayLength(reinterpret_cast<jarray>(o89)));
1239 EXPECT_EQ(90, env->GetArrayLength(reinterpret_cast<jarray>(o90)));
1240 EXPECT_EQ(91, env->GetArrayLength(reinterpret_cast<jarray>(o91)));
1241 EXPECT_EQ(92, env->GetArrayLength(reinterpret_cast<jarray>(o92)));
1242 EXPECT_EQ(93, env->GetArrayLength(reinterpret_cast<jarray>(o93)));
1243 EXPECT_EQ(94, env->GetArrayLength(reinterpret_cast<jarray>(o94)));
1244 EXPECT_EQ(95, env->GetArrayLength(reinterpret_cast<jarray>(o95)));
1245 EXPECT_EQ(96, env->GetArrayLength(reinterpret_cast<jarray>(o96)));
1246 EXPECT_EQ(97, env->GetArrayLength(reinterpret_cast<jarray>(o97)));
1247 EXPECT_EQ(98, env->GetArrayLength(reinterpret_cast<jarray>(o98)));
1248 EXPECT_EQ(99, env->GetArrayLength(reinterpret_cast<jarray>(o99)));
1249 EXPECT_EQ(100, env->GetArrayLength(reinterpret_cast<jarray>(o100)));
1250 EXPECT_EQ(101, env->GetArrayLength(reinterpret_cast<jarray>(o101)));
1251 EXPECT_EQ(102, env->GetArrayLength(reinterpret_cast<jarray>(o102)));
1252 EXPECT_EQ(103, env->GetArrayLength(reinterpret_cast<jarray>(o103)));
1253 EXPECT_EQ(104, env->GetArrayLength(reinterpret_cast<jarray>(o104)));
1254 EXPECT_EQ(105, env->GetArrayLength(reinterpret_cast<jarray>(o105)));
1255 EXPECT_EQ(106, env->GetArrayLength(reinterpret_cast<jarray>(o106)));
1256 EXPECT_EQ(107, env->GetArrayLength(reinterpret_cast<jarray>(o107)));
1257 EXPECT_EQ(108, env->GetArrayLength(reinterpret_cast<jarray>(o108)));
1258 EXPECT_EQ(109, env->GetArrayLength(reinterpret_cast<jarray>(o109)));
1259 EXPECT_EQ(110, env->GetArrayLength(reinterpret_cast<jarray>(o110)));
1260 EXPECT_EQ(111, env->GetArrayLength(reinterpret_cast<jarray>(o111)));
1261 EXPECT_EQ(112, env->GetArrayLength(reinterpret_cast<jarray>(o112)));
1262 EXPECT_EQ(113, env->GetArrayLength(reinterpret_cast<jarray>(o113)));
1263 EXPECT_EQ(114, env->GetArrayLength(reinterpret_cast<jarray>(o114)));
1264 EXPECT_EQ(115, env->GetArrayLength(reinterpret_cast<jarray>(o115)));
1265 EXPECT_EQ(116, env->GetArrayLength(reinterpret_cast<jarray>(o116)));
1266 EXPECT_EQ(117, env->GetArrayLength(reinterpret_cast<jarray>(o117)));
1267 EXPECT_EQ(118, env->GetArrayLength(reinterpret_cast<jarray>(o118)));
1268 EXPECT_EQ(119, env->GetArrayLength(reinterpret_cast<jarray>(o119)));
1269 EXPECT_EQ(120, env->GetArrayLength(reinterpret_cast<jarray>(o120)));
1270 EXPECT_EQ(121, env->GetArrayLength(reinterpret_cast<jarray>(o121)));
1271 EXPECT_EQ(122, env->GetArrayLength(reinterpret_cast<jarray>(o122)));
1272 EXPECT_EQ(123, env->GetArrayLength(reinterpret_cast<jarray>(o123)));
1273 EXPECT_EQ(124, env->GetArrayLength(reinterpret_cast<jarray>(o124)));
1274 EXPECT_EQ(125, env->GetArrayLength(reinterpret_cast<jarray>(o125)));
1275 EXPECT_EQ(126, env->GetArrayLength(reinterpret_cast<jarray>(o126)));
1276 EXPECT_EQ(127, env->GetArrayLength(reinterpret_cast<jarray>(o127)));
1277 EXPECT_EQ(128, env->GetArrayLength(reinterpret_cast<jarray>(o128)));
1278 EXPECT_EQ(129, env->GetArrayLength(reinterpret_cast<jarray>(o129)));
1279 EXPECT_EQ(130, env->GetArrayLength(reinterpret_cast<jarray>(o130)));
1280 EXPECT_EQ(131, env->GetArrayLength(reinterpret_cast<jarray>(o131)));
1281 EXPECT_EQ(132, env->GetArrayLength(reinterpret_cast<jarray>(o132)));
1282 EXPECT_EQ(133, env->GetArrayLength(reinterpret_cast<jarray>(o133)));
1283 EXPECT_EQ(134, env->GetArrayLength(reinterpret_cast<jarray>(o134)));
1284 EXPECT_EQ(135, env->GetArrayLength(reinterpret_cast<jarray>(o135)));
1285 EXPECT_EQ(136, env->GetArrayLength(reinterpret_cast<jarray>(o136)));
1286 EXPECT_EQ(137, env->GetArrayLength(reinterpret_cast<jarray>(o137)));
1287 EXPECT_EQ(138, env->GetArrayLength(reinterpret_cast<jarray>(o138)));
1288 EXPECT_EQ(139, env->GetArrayLength(reinterpret_cast<jarray>(o139)));
1289 EXPECT_EQ(140, env->GetArrayLength(reinterpret_cast<jarray>(o140)));
1290 EXPECT_EQ(141, env->GetArrayLength(reinterpret_cast<jarray>(o141)));
1291 EXPECT_EQ(142, env->GetArrayLength(reinterpret_cast<jarray>(o142)));
1292 EXPECT_EQ(143, env->GetArrayLength(reinterpret_cast<jarray>(o143)));
1293 EXPECT_EQ(144, env->GetArrayLength(reinterpret_cast<jarray>(o144)));
1294 EXPECT_EQ(145, env->GetArrayLength(reinterpret_cast<jarray>(o145)));
1295 EXPECT_EQ(146, env->GetArrayLength(reinterpret_cast<jarray>(o146)));
1296 EXPECT_EQ(147, env->GetArrayLength(reinterpret_cast<jarray>(o147)));
1297 EXPECT_EQ(148, env->GetArrayLength(reinterpret_cast<jarray>(o148)));
1298 EXPECT_EQ(149, env->GetArrayLength(reinterpret_cast<jarray>(o149)));
1299 EXPECT_EQ(150, env->GetArrayLength(reinterpret_cast<jarray>(o150)));
1300 EXPECT_EQ(151, env->GetArrayLength(reinterpret_cast<jarray>(o151)));
1301 EXPECT_EQ(152, env->GetArrayLength(reinterpret_cast<jarray>(o152)));
1302 EXPECT_EQ(153, env->GetArrayLength(reinterpret_cast<jarray>(o153)));
1303 EXPECT_EQ(154, env->GetArrayLength(reinterpret_cast<jarray>(o154)));
1304 EXPECT_EQ(155, env->GetArrayLength(reinterpret_cast<jarray>(o155)));
1305 EXPECT_EQ(156, env->GetArrayLength(reinterpret_cast<jarray>(o156)));
1306 EXPECT_EQ(157, env->GetArrayLength(reinterpret_cast<jarray>(o157)));
1307 EXPECT_EQ(158, env->GetArrayLength(reinterpret_cast<jarray>(o158)));
1308 EXPECT_EQ(159, env->GetArrayLength(reinterpret_cast<jarray>(o159)));
1309 EXPECT_EQ(160, env->GetArrayLength(reinterpret_cast<jarray>(o160)));
1310 EXPECT_EQ(161, env->GetArrayLength(reinterpret_cast<jarray>(o161)));
1311 EXPECT_EQ(162, env->GetArrayLength(reinterpret_cast<jarray>(o162)));
1312 EXPECT_EQ(163, env->GetArrayLength(reinterpret_cast<jarray>(o163)));
1313 EXPECT_EQ(164, env->GetArrayLength(reinterpret_cast<jarray>(o164)));
1314 EXPECT_EQ(165, env->GetArrayLength(reinterpret_cast<jarray>(o165)));
1315 EXPECT_EQ(166, env->GetArrayLength(reinterpret_cast<jarray>(o166)));
1316 EXPECT_EQ(167, env->GetArrayLength(reinterpret_cast<jarray>(o167)));
1317 EXPECT_EQ(168, env->GetArrayLength(reinterpret_cast<jarray>(o168)));
1318 EXPECT_EQ(169, env->GetArrayLength(reinterpret_cast<jarray>(o169)));
1319 EXPECT_EQ(170, env->GetArrayLength(reinterpret_cast<jarray>(o170)));
1320 EXPECT_EQ(171, env->GetArrayLength(reinterpret_cast<jarray>(o171)));
1321 EXPECT_EQ(172, env->GetArrayLength(reinterpret_cast<jarray>(o172)));
1322 EXPECT_EQ(173, env->GetArrayLength(reinterpret_cast<jarray>(o173)));
1323 EXPECT_EQ(174, env->GetArrayLength(reinterpret_cast<jarray>(o174)));
1324 EXPECT_EQ(175, env->GetArrayLength(reinterpret_cast<jarray>(o175)));
1325 EXPECT_EQ(176, env->GetArrayLength(reinterpret_cast<jarray>(o176)));
1326 EXPECT_EQ(177, env->GetArrayLength(reinterpret_cast<jarray>(o177)));
1327 EXPECT_EQ(178, env->GetArrayLength(reinterpret_cast<jarray>(o178)));
1328 EXPECT_EQ(179, env->GetArrayLength(reinterpret_cast<jarray>(o179)));
1329 EXPECT_EQ(180, env->GetArrayLength(reinterpret_cast<jarray>(o180)));
1330 EXPECT_EQ(181, env->GetArrayLength(reinterpret_cast<jarray>(o181)));
1331 EXPECT_EQ(182, env->GetArrayLength(reinterpret_cast<jarray>(o182)));
1332 EXPECT_EQ(183, env->GetArrayLength(reinterpret_cast<jarray>(o183)));
1333 EXPECT_EQ(184, env->GetArrayLength(reinterpret_cast<jarray>(o184)));
1334 EXPECT_EQ(185, env->GetArrayLength(reinterpret_cast<jarray>(o185)));
1335 EXPECT_EQ(186, env->GetArrayLength(reinterpret_cast<jarray>(o186)));
1336 EXPECT_EQ(187, env->GetArrayLength(reinterpret_cast<jarray>(o187)));
1337 EXPECT_EQ(188, env->GetArrayLength(reinterpret_cast<jarray>(o188)));
1338 EXPECT_EQ(189, env->GetArrayLength(reinterpret_cast<jarray>(o189)));
1339 EXPECT_EQ(190, env->GetArrayLength(reinterpret_cast<jarray>(o190)));
1340 EXPECT_EQ(191, env->GetArrayLength(reinterpret_cast<jarray>(o191)));
1341 EXPECT_EQ(192, env->GetArrayLength(reinterpret_cast<jarray>(o192)));
1342 EXPECT_EQ(193, env->GetArrayLength(reinterpret_cast<jarray>(o193)));
1343 EXPECT_EQ(194, env->GetArrayLength(reinterpret_cast<jarray>(o194)));
1344 EXPECT_EQ(195, env->GetArrayLength(reinterpret_cast<jarray>(o195)));
1345 EXPECT_EQ(196, env->GetArrayLength(reinterpret_cast<jarray>(o196)));
1346 EXPECT_EQ(197, env->GetArrayLength(reinterpret_cast<jarray>(o197)));
1347 EXPECT_EQ(198, env->GetArrayLength(reinterpret_cast<jarray>(o198)));
1348 EXPECT_EQ(199, env->GetArrayLength(reinterpret_cast<jarray>(o199)));
1349 EXPECT_EQ(200, env->GetArrayLength(reinterpret_cast<jarray>(o200)));
1350 EXPECT_EQ(201, env->GetArrayLength(reinterpret_cast<jarray>(o201)));
1351 EXPECT_EQ(202, env->GetArrayLength(reinterpret_cast<jarray>(o202)));
1352 EXPECT_EQ(203, env->GetArrayLength(reinterpret_cast<jarray>(o203)));
1353 EXPECT_EQ(204, env->GetArrayLength(reinterpret_cast<jarray>(o204)));
1354 EXPECT_EQ(205, env->GetArrayLength(reinterpret_cast<jarray>(o205)));
1355 EXPECT_EQ(206, env->GetArrayLength(reinterpret_cast<jarray>(o206)));
1356 EXPECT_EQ(207, env->GetArrayLength(reinterpret_cast<jarray>(o207)));
1357 EXPECT_EQ(208, env->GetArrayLength(reinterpret_cast<jarray>(o208)));
1358 EXPECT_EQ(209, env->GetArrayLength(reinterpret_cast<jarray>(o209)));
1359 EXPECT_EQ(210, env->GetArrayLength(reinterpret_cast<jarray>(o210)));
1360 EXPECT_EQ(211, env->GetArrayLength(reinterpret_cast<jarray>(o211)));
1361 EXPECT_EQ(212, env->GetArrayLength(reinterpret_cast<jarray>(o212)));
1362 EXPECT_EQ(213, env->GetArrayLength(reinterpret_cast<jarray>(o213)));
1363 EXPECT_EQ(214, env->GetArrayLength(reinterpret_cast<jarray>(o214)));
1364 EXPECT_EQ(215, env->GetArrayLength(reinterpret_cast<jarray>(o215)));
1365 EXPECT_EQ(216, env->GetArrayLength(reinterpret_cast<jarray>(o216)));
1366 EXPECT_EQ(217, env->GetArrayLength(reinterpret_cast<jarray>(o217)));
1367 EXPECT_EQ(218, env->GetArrayLength(reinterpret_cast<jarray>(o218)));
1368 EXPECT_EQ(219, env->GetArrayLength(reinterpret_cast<jarray>(o219)));
1369 EXPECT_EQ(220, env->GetArrayLength(reinterpret_cast<jarray>(o220)));
1370 EXPECT_EQ(221, env->GetArrayLength(reinterpret_cast<jarray>(o221)));
1371 EXPECT_EQ(222, env->GetArrayLength(reinterpret_cast<jarray>(o222)));
1372 EXPECT_EQ(223, env->GetArrayLength(reinterpret_cast<jarray>(o223)));
1373 EXPECT_EQ(224, env->GetArrayLength(reinterpret_cast<jarray>(o224)));
1374 EXPECT_EQ(225, env->GetArrayLength(reinterpret_cast<jarray>(o225)));
1375 EXPECT_EQ(226, env->GetArrayLength(reinterpret_cast<jarray>(o226)));
1376 EXPECT_EQ(227, env->GetArrayLength(reinterpret_cast<jarray>(o227)));
1377 EXPECT_EQ(228, env->GetArrayLength(reinterpret_cast<jarray>(o228)));
1378 EXPECT_EQ(229, env->GetArrayLength(reinterpret_cast<jarray>(o229)));
1379 EXPECT_EQ(230, env->GetArrayLength(reinterpret_cast<jarray>(o230)));
1380 EXPECT_EQ(231, env->GetArrayLength(reinterpret_cast<jarray>(o231)));
1381 EXPECT_EQ(232, env->GetArrayLength(reinterpret_cast<jarray>(o232)));
1382 EXPECT_EQ(233, env->GetArrayLength(reinterpret_cast<jarray>(o233)));
1383 EXPECT_EQ(234, env->GetArrayLength(reinterpret_cast<jarray>(o234)));
1384 EXPECT_EQ(235, env->GetArrayLength(reinterpret_cast<jarray>(o235)));
1385 EXPECT_EQ(236, env->GetArrayLength(reinterpret_cast<jarray>(o236)));
1386 EXPECT_EQ(237, env->GetArrayLength(reinterpret_cast<jarray>(o237)));
1387 EXPECT_EQ(238, env->GetArrayLength(reinterpret_cast<jarray>(o238)));
1388 EXPECT_EQ(239, env->GetArrayLength(reinterpret_cast<jarray>(o239)));
1389 EXPECT_EQ(240, env->GetArrayLength(reinterpret_cast<jarray>(o240)));
1390 EXPECT_EQ(241, env->GetArrayLength(reinterpret_cast<jarray>(o241)));
1391 EXPECT_EQ(242, env->GetArrayLength(reinterpret_cast<jarray>(o242)));
1392 EXPECT_EQ(243, env->GetArrayLength(reinterpret_cast<jarray>(o243)));
1393 EXPECT_EQ(244, env->GetArrayLength(reinterpret_cast<jarray>(o244)));
1394 EXPECT_EQ(245, env->GetArrayLength(reinterpret_cast<jarray>(o245)));
1395 EXPECT_EQ(246, env->GetArrayLength(reinterpret_cast<jarray>(o246)));
1396 EXPECT_EQ(247, env->GetArrayLength(reinterpret_cast<jarray>(o247)));
1397 EXPECT_EQ(248, env->GetArrayLength(reinterpret_cast<jarray>(o248)));
1398 EXPECT_EQ(249, env->GetArrayLength(reinterpret_cast<jarray>(o249)));
1399 EXPECT_EQ(250, env->GetArrayLength(reinterpret_cast<jarray>(o250)));
1400 EXPECT_EQ(251, env->GetArrayLength(reinterpret_cast<jarray>(o251)));
1401 EXPECT_EQ(252, env->GetArrayLength(reinterpret_cast<jarray>(o252)));
1402 EXPECT_EQ(253, env->GetArrayLength(reinterpret_cast<jarray>(o253)));
1403 }
1404}
1405
1406const char* longSig =
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;Ljava/lang/Object;"
1456 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1457 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)V";
1458
Andreas Gampe6e498692014-08-18 16:43:12 -07001459void JniCompilerTest::MaxParamNumberImpl() {
Andreas Gampe7a0e5042014-03-07 13:03:19 -08001460 SetUpForTest(false, "maxParamNumber", longSig,
1461 reinterpret_cast<void*>(&Java_MyClassNatives_maxParamNumber));
1462
1463 jvalue args[254];
1464
1465 // First test: test with all arguments null.
1466 for (int i = 0; i < 254; ++i) {
1467 args[i].l = nullptr;
1468 }
1469
1470 env_->CallNonvirtualVoidMethodA(jobj_, jklass_, jmethod_, args);
1471
1472 // Second test: test with int[] objects with increasing lengths
1473 for (int i = 0; i < 254; ++i) {
1474 jintArray tmp = env_->NewIntArray(i);
1475 args[i].l = tmp;
1476 EXPECT_NE(args[i].l, nullptr);
1477 }
1478
1479 env_->CallNonvirtualVoidMethodA(jobj_, jklass_, jmethod_, args);
1480}
1481
Andreas Gampe6e498692014-08-18 16:43:12 -07001482JNI_TEST(MaxParamNumber)
1483
1484void JniCompilerTest::WithoutImplementationImpl() {
Andreas Gampe369810a2015-01-14 19:53:31 -08001485 // This will lead to error messages in the log.
1486 ScopedLogSeverity sls(LogSeverity::FATAL);
1487
Andreas Gampead615172014-04-04 16:20:13 -07001488 SetUpForTest(false, "withoutImplementation", "()V", nullptr);
1489
1490 env_->CallVoidMethod(jobj_, jmethod_);
1491
1492 EXPECT_TRUE(Thread::Current()->IsExceptionPending());
1493 EXPECT_TRUE(env_->ExceptionCheck() == JNI_TRUE);
1494}
1495
Andreas Gampe6e498692014-08-18 16:43:12 -07001496JNI_TEST(WithoutImplementation)
1497
Andreas Gampe48ee3562015-04-10 19:57:29 -07001498void JniCompilerTest::WithoutImplementationRefReturnImpl() {
1499 // This will lead to error messages in the log.
1500 ScopedLogSeverity sls(LogSeverity::FATAL);
1501
1502 SetUpForTest(false, "withoutImplementationRefReturn", "()Ljava/lang/Object;", nullptr);
1503
1504 env_->CallObjectMethod(jobj_, jmethod_);
1505
1506 EXPECT_TRUE(Thread::Current()->IsExceptionPending());
1507 EXPECT_TRUE(env_->ExceptionCheck() == JNI_TRUE);
1508}
1509
1510JNI_TEST(WithoutImplementationRefReturn)
1511
Ian Rogers6a3c1fc2014-10-31 00:33:20 -07001512void Java_MyClassNatives_stackArgsIntsFirst(JNIEnv*, jclass, jint i1, jint i2, jint i3,
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001513 jint i4, jint i5, jint i6, jint i7, jint i8, jint i9,
1514 jint i10, jfloat f1, jfloat f2, jfloat f3, jfloat f4,
1515 jfloat f5, jfloat f6, jfloat f7, jfloat f8, jfloat f9,
1516 jfloat f10) {
1517 EXPECT_EQ(i1, 1);
1518 EXPECT_EQ(i2, 2);
1519 EXPECT_EQ(i3, 3);
1520 EXPECT_EQ(i4, 4);
1521 EXPECT_EQ(i5, 5);
1522 EXPECT_EQ(i6, 6);
1523 EXPECT_EQ(i7, 7);
1524 EXPECT_EQ(i8, 8);
1525 EXPECT_EQ(i9, 9);
1526 EXPECT_EQ(i10, 10);
1527
Roland Levillainda4d79b2015-03-24 14:36:11 +00001528 jint i11 = bit_cast<jint, jfloat>(f1);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001529 EXPECT_EQ(i11, 11);
Roland Levillainda4d79b2015-03-24 14:36:11 +00001530 jint i12 = bit_cast<jint, jfloat>(f2);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001531 EXPECT_EQ(i12, 12);
Roland Levillainda4d79b2015-03-24 14:36:11 +00001532 jint i13 = bit_cast<jint, jfloat>(f3);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001533 EXPECT_EQ(i13, 13);
Roland Levillainda4d79b2015-03-24 14:36:11 +00001534 jint i14 = bit_cast<jint, jfloat>(f4);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001535 EXPECT_EQ(i14, 14);
Roland Levillainda4d79b2015-03-24 14:36:11 +00001536 jint i15 = bit_cast<jint, jfloat>(f5);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001537 EXPECT_EQ(i15, 15);
Roland Levillainda4d79b2015-03-24 14:36:11 +00001538 jint i16 = bit_cast<jint, jfloat>(f6);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001539 EXPECT_EQ(i16, 16);
Roland Levillainda4d79b2015-03-24 14:36:11 +00001540 jint i17 = bit_cast<jint, jfloat>(f7);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001541 EXPECT_EQ(i17, 17);
Roland Levillainda4d79b2015-03-24 14:36:11 +00001542 jint i18 = bit_cast<jint, jfloat>(f8);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001543 EXPECT_EQ(i18, 18);
Roland Levillainda4d79b2015-03-24 14:36:11 +00001544 jint i19 = bit_cast<jint, jfloat>(f9);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001545 EXPECT_EQ(i19, 19);
Roland Levillainda4d79b2015-03-24 14:36:11 +00001546 jint i20 = bit_cast<jint, jfloat>(f10);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001547 EXPECT_EQ(i20, 20);
1548}
1549
Andreas Gampe6e498692014-08-18 16:43:12 -07001550void JniCompilerTest::StackArgsIntsFirstImpl() {
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001551 SetUpForTest(true, "stackArgsIntsFirst", "(IIIIIIIIIIFFFFFFFFFF)V",
1552 reinterpret_cast<void*>(&Java_MyClassNatives_stackArgsIntsFirst));
1553
1554 jint i1 = 1;
1555 jint i2 = 2;
1556 jint i3 = 3;
1557 jint i4 = 4;
1558 jint i5 = 5;
1559 jint i6 = 6;
1560 jint i7 = 7;
1561 jint i8 = 8;
1562 jint i9 = 9;
1563 jint i10 = 10;
1564
Roland Levillainda4d79b2015-03-24 14:36:11 +00001565 jfloat f1 = bit_cast<jfloat, jint>(11);
1566 jfloat f2 = bit_cast<jfloat, jint>(12);
1567 jfloat f3 = bit_cast<jfloat, jint>(13);
1568 jfloat f4 = bit_cast<jfloat, jint>(14);
1569 jfloat f5 = bit_cast<jfloat, jint>(15);
1570 jfloat f6 = bit_cast<jfloat, jint>(16);
1571 jfloat f7 = bit_cast<jfloat, jint>(17);
1572 jfloat f8 = bit_cast<jfloat, jint>(18);
1573 jfloat f9 = bit_cast<jfloat, jint>(19);
1574 jfloat f10 = bit_cast<jfloat, jint>(20);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001575
1576 env_->CallStaticVoidMethod(jklass_, jmethod_, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, f1, f2,
1577 f3, f4, f5, f6, f7, f8, f9, f10);
1578}
1579
Andreas Gampe6e498692014-08-18 16:43:12 -07001580JNI_TEST(StackArgsIntsFirst)
1581
Ian Rogers6a3c1fc2014-10-31 00:33:20 -07001582void Java_MyClassNatives_stackArgsFloatsFirst(JNIEnv*, jclass, jfloat f1, jfloat f2,
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001583 jfloat f3, jfloat f4, jfloat f5, jfloat f6, jfloat f7,
1584 jfloat f8, jfloat f9, jfloat f10, jint i1, jint i2,
1585 jint i3, jint i4, jint i5, jint i6, jint i7, jint i8,
1586 jint i9, jint i10) {
1587 EXPECT_EQ(i1, 1);
1588 EXPECT_EQ(i2, 2);
1589 EXPECT_EQ(i3, 3);
1590 EXPECT_EQ(i4, 4);
1591 EXPECT_EQ(i5, 5);
1592 EXPECT_EQ(i6, 6);
1593 EXPECT_EQ(i7, 7);
1594 EXPECT_EQ(i8, 8);
1595 EXPECT_EQ(i9, 9);
1596 EXPECT_EQ(i10, 10);
1597
Roland Levillainda4d79b2015-03-24 14:36:11 +00001598 jint i11 = bit_cast<jint, jfloat>(f1);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001599 EXPECT_EQ(i11, 11);
Roland Levillainda4d79b2015-03-24 14:36:11 +00001600 jint i12 = bit_cast<jint, jfloat>(f2);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001601 EXPECT_EQ(i12, 12);
Roland Levillainda4d79b2015-03-24 14:36:11 +00001602 jint i13 = bit_cast<jint, jfloat>(f3);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001603 EXPECT_EQ(i13, 13);
Roland Levillainda4d79b2015-03-24 14:36:11 +00001604 jint i14 = bit_cast<jint, jfloat>(f4);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001605 EXPECT_EQ(i14, 14);
Roland Levillainda4d79b2015-03-24 14:36:11 +00001606 jint i15 = bit_cast<jint, jfloat>(f5);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001607 EXPECT_EQ(i15, 15);
Roland Levillainda4d79b2015-03-24 14:36:11 +00001608 jint i16 = bit_cast<jint, jfloat>(f6);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001609 EXPECT_EQ(i16, 16);
Roland Levillainda4d79b2015-03-24 14:36:11 +00001610 jint i17 = bit_cast<jint, jfloat>(f7);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001611 EXPECT_EQ(i17, 17);
Roland Levillainda4d79b2015-03-24 14:36:11 +00001612 jint i18 = bit_cast<jint, jfloat>(f8);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001613 EXPECT_EQ(i18, 18);
Roland Levillainda4d79b2015-03-24 14:36:11 +00001614 jint i19 = bit_cast<jint, jfloat>(f9);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001615 EXPECT_EQ(i19, 19);
Roland Levillainda4d79b2015-03-24 14:36:11 +00001616 jint i20 = bit_cast<jint, jfloat>(f10);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001617 EXPECT_EQ(i20, 20);
1618}
1619
Andreas Gampe6e498692014-08-18 16:43:12 -07001620void JniCompilerTest::StackArgsFloatsFirstImpl() {
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001621 SetUpForTest(true, "stackArgsFloatsFirst", "(FFFFFFFFFFIIIIIIIIII)V",
1622 reinterpret_cast<void*>(&Java_MyClassNatives_stackArgsFloatsFirst));
1623
1624 jint i1 = 1;
1625 jint i2 = 2;
1626 jint i3 = 3;
1627 jint i4 = 4;
1628 jint i5 = 5;
1629 jint i6 = 6;
1630 jint i7 = 7;
1631 jint i8 = 8;
1632 jint i9 = 9;
1633 jint i10 = 10;
1634
Roland Levillainda4d79b2015-03-24 14:36:11 +00001635 jfloat f1 = bit_cast<jfloat, jint>(11);
1636 jfloat f2 = bit_cast<jfloat, jint>(12);
1637 jfloat f3 = bit_cast<jfloat, jint>(13);
1638 jfloat f4 = bit_cast<jfloat, jint>(14);
1639 jfloat f5 = bit_cast<jfloat, jint>(15);
1640 jfloat f6 = bit_cast<jfloat, jint>(16);
1641 jfloat f7 = bit_cast<jfloat, jint>(17);
1642 jfloat f8 = bit_cast<jfloat, jint>(18);
1643 jfloat f9 = bit_cast<jfloat, jint>(19);
1644 jfloat f10 = bit_cast<jfloat, jint>(20);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001645
1646 env_->CallStaticVoidMethod(jklass_, jmethod_, f1, f2, f3, f4, f5, f6, f7, f8, f9, f10, i1, i2, i3,
1647 i4, i5, i6, i7, i8, i9, i10);
1648}
1649
Andreas Gampe6e498692014-08-18 16:43:12 -07001650JNI_TEST(StackArgsFloatsFirst)
1651
Ian Rogers6a3c1fc2014-10-31 00:33:20 -07001652void Java_MyClassNatives_stackArgsMixed(JNIEnv*, jclass, jint i1, jfloat f1, jint i2,
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001653 jfloat f2, jint i3, jfloat f3, jint i4, jfloat f4, jint i5,
1654 jfloat f5, jint i6, jfloat f6, jint i7, jfloat f7, jint i8,
1655 jfloat f8, jint i9, jfloat f9, jint i10, jfloat f10) {
1656 EXPECT_EQ(i1, 1);
1657 EXPECT_EQ(i2, 2);
1658 EXPECT_EQ(i3, 3);
1659 EXPECT_EQ(i4, 4);
1660 EXPECT_EQ(i5, 5);
1661 EXPECT_EQ(i6, 6);
1662 EXPECT_EQ(i7, 7);
1663 EXPECT_EQ(i8, 8);
1664 EXPECT_EQ(i9, 9);
1665 EXPECT_EQ(i10, 10);
1666
Roland Levillainda4d79b2015-03-24 14:36:11 +00001667 jint i11 = bit_cast<jint, jfloat>(f1);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001668 EXPECT_EQ(i11, 11);
Roland Levillainda4d79b2015-03-24 14:36:11 +00001669 jint i12 = bit_cast<jint, jfloat>(f2);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001670 EXPECT_EQ(i12, 12);
Roland Levillainda4d79b2015-03-24 14:36:11 +00001671 jint i13 = bit_cast<jint, jfloat>(f3);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001672 EXPECT_EQ(i13, 13);
Roland Levillainda4d79b2015-03-24 14:36:11 +00001673 jint i14 = bit_cast<jint, jfloat>(f4);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001674 EXPECT_EQ(i14, 14);
Roland Levillainda4d79b2015-03-24 14:36:11 +00001675 jint i15 = bit_cast<jint, jfloat>(f5);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001676 EXPECT_EQ(i15, 15);
Roland Levillainda4d79b2015-03-24 14:36:11 +00001677 jint i16 = bit_cast<jint, jfloat>(f6);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001678 EXPECT_EQ(i16, 16);
Roland Levillainda4d79b2015-03-24 14:36:11 +00001679 jint i17 = bit_cast<jint, jfloat>(f7);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001680 EXPECT_EQ(i17, 17);
Roland Levillainda4d79b2015-03-24 14:36:11 +00001681 jint i18 = bit_cast<jint, jfloat>(f8);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001682 EXPECT_EQ(i18, 18);
Roland Levillainda4d79b2015-03-24 14:36:11 +00001683 jint i19 = bit_cast<jint, jfloat>(f9);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001684 EXPECT_EQ(i19, 19);
Roland Levillainda4d79b2015-03-24 14:36:11 +00001685 jint i20 = bit_cast<jint, jfloat>(f10);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001686 EXPECT_EQ(i20, 20);
1687}
1688
Andreas Gampe6e498692014-08-18 16:43:12 -07001689void JniCompilerTest::StackArgsMixedImpl() {
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001690 SetUpForTest(true, "stackArgsMixed", "(IFIFIFIFIFIFIFIFIFIF)V",
1691 reinterpret_cast<void*>(&Java_MyClassNatives_stackArgsMixed));
1692
1693 jint i1 = 1;
1694 jint i2 = 2;
1695 jint i3 = 3;
1696 jint i4 = 4;
1697 jint i5 = 5;
1698 jint i6 = 6;
1699 jint i7 = 7;
1700 jint i8 = 8;
1701 jint i9 = 9;
1702 jint i10 = 10;
1703
Roland Levillainda4d79b2015-03-24 14:36:11 +00001704 jfloat f1 = bit_cast<jfloat, jint>(11);
1705 jfloat f2 = bit_cast<jfloat, jint>(12);
1706 jfloat f3 = bit_cast<jfloat, jint>(13);
1707 jfloat f4 = bit_cast<jfloat, jint>(14);
1708 jfloat f5 = bit_cast<jfloat, jint>(15);
1709 jfloat f6 = bit_cast<jfloat, jint>(16);
1710 jfloat f7 = bit_cast<jfloat, jint>(17);
1711 jfloat f8 = bit_cast<jfloat, jint>(18);
1712 jfloat f9 = bit_cast<jfloat, jint>(19);
1713 jfloat f10 = bit_cast<jfloat, jint>(20);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001714
1715 env_->CallStaticVoidMethod(jklass_, jmethod_, i1, f1, i2, f2, i3, f3, i4, f4, i5, f5, i6, f6, i7,
1716 f7, i8, f8, i9, f9, i10, f10);
1717}
1718
Andreas Gampe6e498692014-08-18 16:43:12 -07001719JNI_TEST(StackArgsMixed)
1720
Ian Rogersb033c752011-07-20 12:22:35 -07001721} // namespace art