blob: 8d60be20eeef856ef3eb753118ace6be2d02f125 [file] [log] [blame]
Elliott Hughes2faa5f12012-01-30 14:42:07 -08001/*
2 * Copyright (C) 2011 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
Ian Rogersb033c752011-07-20 12:22:35 -070016
Ian Rogers700a4022014-05-19 16:49:03 -070017#include <memory>
18
Nicolas Geoffray54accbc2014-08-13 03:40:45 +010019#include <math.h>
20
Mathieu Chartiere401d142015-04-22 13:56:20 -070021#include "art_method-inl.h"
Brian Carlstrom578bbdc2011-07-21 14:07:47 -070022#include "class_linker.h"
Brian Carlstroma1ce1fe2014-02-24 23:23:58 -080023#include "common_compiler_test.h"
Brian Carlstrom578bbdc2011-07-21 14:07:47 -070024#include "dex_file.h"
Elliott Hughes90a33692011-08-30 13:27:07 -070025#include "gtest/gtest.h"
Ian Rogerscdd1d2d2011-08-18 09:58:17 -070026#include "indirect_reference_table.h"
Ian Rogerscdd1d2d2011-08-18 09:58:17 -070027#include "jni_internal.h"
Brian Carlstromdb4d5402011-08-09 12:18:28 -070028#include "mem_map.h"
Ian Rogers4f6ad8a2013-03-18 15:27:28 -070029#include "mirror/class-inl.h"
Ian Rogers2dd0e2c2013-01-24 12:42:14 -080030#include "mirror/class_loader.h"
Ian Rogers2dd0e2c2013-01-24 12:42:14 -080031#include "mirror/object_array-inl.h"
Ian Rogers04d7aa92013-03-16 14:29:17 -070032#include "mirror/object-inl.h"
Ian Rogers2dd0e2c2013-01-24 12:42:14 -080033#include "mirror/stack_trace_element.h"
Brian Carlstrom578bbdc2011-07-21 14:07:47 -070034#include "runtime.h"
Ian Rogers00f7d0e2012-07-19 15:28:27 -070035#include "ScopedLocalRef.h"
36#include "scoped_thread_state_change.h"
Brian Carlstrom578bbdc2011-07-21 14:07:47 -070037#include "thread.h"
Ian Rogersb033c752011-07-20 12:22:35 -070038
Elliott Hughesb264f082012-04-06 17:10:10 -070039extern "C" JNIEXPORT jint JNICALL Java_MyClassNatives_bar(JNIEnv*, jobject, jint count) {
Brian Carlstromb9cc1ca2012-01-27 00:57:42 -080040 return count + 1;
41}
42
Elliott Hughesb264f082012-04-06 17:10:10 -070043extern "C" JNIEXPORT jint JNICALL Java_MyClassNatives_sbar(JNIEnv*, jclass, jint count) {
Ian Rogers1cefdbd2012-02-29 09:34:50 -080044 return count + 1;
45}
46
Ian Rogersb033c752011-07-20 12:22:35 -070047namespace art {
48
Brian Carlstroma1ce1fe2014-02-24 23:23:58 -080049class JniCompilerTest : public CommonCompilerTest {
Ian Rogersb033c752011-07-20 12:22:35 -070050 protected:
Andreas Gampe6e498692014-08-18 16:43:12 -070051 void SetUp() OVERRIDE {
52 CommonCompilerTest::SetUp();
53 check_generic_jni_ = false;
54 }
55
56 void SetCheckGenericJni(bool generic) {
57 check_generic_jni_ = generic;
58 }
59
Ian Rogers00f7d0e2012-07-19 15:28:27 -070060 void CompileForTest(jobject class_loader, bool direct,
Andreas Gampe6e498692014-08-18 16:43:12 -070061 const char* method_name, const char* method_sig) {
Ian Rogers00f7d0e2012-07-19 15:28:27 -070062 ScopedObjectAccess soa(Thread::Current());
Mathieu Chartiereb8167a2014-05-07 15:43:14 -070063 StackHandleScope<1> hs(soa.Self());
64 Handle<mirror::ClassLoader> loader(
65 hs.NewHandle(soa.Decode<mirror::ClassLoader*>(class_loader)));
Brian Carlstrom25c33252011-09-18 15:58:35 -070066 // Compile the native method before starting the runtime
Ian Rogers98379392014-02-24 16:53:16 -080067 mirror::Class* c = class_linker_->FindClass(soa.Self(), "LMyClassNatives;", loader);
Mathieu Chartiere401d142015-04-22 13:56:20 -070068 const auto pointer_size = class_linker_->GetImagePointerSize();
69 ArtMethod* method = direct ? c->FindDirectMethod(method_name, method_sig, pointer_size) :
70 c->FindVirtualMethod(method_name, method_sig, pointer_size);
Andreas Gampecf4035a2014-05-28 22:43:01 -070071 ASSERT_TRUE(method != nullptr) << method_name << " " << method_sig;
Andreas Gampe6e498692014-08-18 16:43:12 -070072 if (check_generic_jni_) {
Ian Rogers6f3dbba2014-10-14 17:41:57 -070073 method->SetEntryPointFromQuickCompiledCode(class_linker_->GetRuntimeQuickGenericJniStub());
Nicolas Geoffray54accbc2014-08-13 03:40:45 +010074 } else {
Ian Rogers6f3dbba2014-10-14 17:41:57 -070075 const void* code = method->GetEntryPointFromQuickCompiledCode();
76 if (code == nullptr || class_linker_->IsQuickGenericJniStub(code)) {
Nicolas Geoffray54accbc2014-08-13 03:40:45 +010077 CompileMethod(method);
78 ASSERT_TRUE(method->GetEntryPointFromQuickCompiledCode() != nullptr)
79 << method_name << " " << method_sig;
Nicolas Geoffray54accbc2014-08-13 03:40:45 +010080 }
Brian Carlstrom25c33252011-09-18 15:58:35 -070081 }
Brian Carlstrom25c33252011-09-18 15:58:35 -070082 }
83
Ian Rogers00f7d0e2012-07-19 15:28:27 -070084 void SetUpForTest(bool direct, const char* method_name, const char* method_sig,
Andreas Gampe6e498692014-08-18 16:43:12 -070085 void* native_fnptr) {
Ian Rogers00f7d0e2012-07-19 15:28:27 -070086 // Initialize class loader and compile method when runtime not started.
Brian Carlstrom2ce745c2013-07-17 17:44:30 -070087 if (!runtime_->IsStarted()) {
Ian Rogers00f7d0e2012-07-19 15:28:27 -070088 {
89 ScopedObjectAccess soa(Thread::Current());
90 class_loader_ = LoadDex("MyClassNatives");
91 }
Andreas Gampe6e498692014-08-18 16:43:12 -070092 CompileForTest(class_loader_, direct, method_name, method_sig);
Ian Rogers00f7d0e2012-07-19 15:28:27 -070093 // Start runtime.
94 Thread::Current()->TransitionFromSuspendedToRunnable();
Brian Carlstrombd86bcc2013-03-10 20:26:16 -070095 bool started = runtime_->Start();
96 CHECK(started);
Brian Carlstrom25c33252011-09-18 15:58:35 -070097 }
Ian Rogers00f7d0e2012-07-19 15:28:27 -070098 // JNI operations after runtime start.
Brian Carlstrom25c33252011-09-18 15:58:35 -070099 env_ = Thread::Current()->GetJniEnv();
Elliott Hughesb264f082012-04-06 17:10:10 -0700100 jklass_ = env_->FindClass("MyClassNatives");
Andreas Gampecf4035a2014-05-28 22:43:01 -0700101 ASSERT_TRUE(jklass_ != nullptr) << method_name << " " << method_sig;
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700102
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700103 if (direct) {
104 jmethod_ = env_->GetStaticMethodID(jklass_, method_name, method_sig);
105 } else {
106 jmethod_ = env_->GetMethodID(jklass_, method_name, method_sig);
107 }
Andreas Gampecf4035a2014-05-28 22:43:01 -0700108 ASSERT_TRUE(jmethod_ != nullptr) << method_name << " " << method_sig;
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700109
Andreas Gampecf4035a2014-05-28 22:43:01 -0700110 if (native_fnptr != nullptr) {
Elliott Hughesb25c3f62012-03-26 16:35:06 -0700111 JNINativeMethod methods[] = { { method_name, method_sig, native_fnptr } };
Brian Carlstromfc7120c2012-08-27 13:43:25 -0700112 ASSERT_EQ(JNI_OK, env_->RegisterNatives(jklass_, methods, 1))
113 << method_name << " " << method_sig;
Ian Rogersbdb03912011-09-14 00:55:44 -0700114 } else {
115 env_->UnregisterNatives(jklass_);
Shih-wei Liao31384c52011-09-06 15:27:45 -0700116 }
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700117
118 jmethodID constructor = env_->GetMethodID(jklass_, "<init>", "()V");
119 jobj_ = env_->NewObject(jklass_, constructor);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700120 ASSERT_TRUE(jobj_ != nullptr) << method_name << " " << method_sig;
Ian Rogersb033c752011-07-20 12:22:35 -0700121 }
122
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700123 public:
124 static jclass jklass_;
125 static jobject jobj_;
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700126 static jobject class_loader_;
127
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700128 protected:
Andreas Gampe6e498692014-08-18 16:43:12 -0700129 // We have to list the methods here so we can share them between default and generic JNI.
130 void CompileAndRunNoArgMethodImpl();
131 void CompileAndRunIntMethodThroughStubImpl();
132 void CompileAndRunStaticIntMethodThroughStubImpl();
133 void CompileAndRunIntMethodImpl();
134 void CompileAndRunIntIntMethodImpl();
135 void CompileAndRunLongLongMethodImpl();
136 void CompileAndRunDoubleDoubleMethodImpl();
137 void CompileAndRun_fooJJ_synchronizedImpl();
138 void CompileAndRunIntObjectObjectMethodImpl();
139 void CompileAndRunStaticIntIntMethodImpl();
140 void CompileAndRunStaticDoubleDoubleMethodImpl();
141 void RunStaticLogDoubleMethodImpl();
142 void RunStaticLogFloatMethodImpl();
143 void RunStaticReturnTrueImpl();
144 void RunStaticReturnFalseImpl();
145 void RunGenericStaticReturnIntImpl();
146 void CompileAndRunStaticIntObjectObjectMethodImpl();
147 void CompileAndRunStaticSynchronizedIntObjectObjectMethodImpl();
148 void ExceptionHandlingImpl();
149 void NativeStackTraceElementImpl();
150 void ReturnGlobalRefImpl();
151 void LocalReferenceTableClearingTestImpl();
152 void JavaLangSystemArrayCopyImpl();
153 void CompareAndSwapIntImpl();
154 void GetTextImpl();
155 void GetSinkPropertiesNativeImpl();
156 void UpcallReturnTypeChecking_InstanceImpl();
157 void UpcallReturnTypeChecking_StaticImpl();
158 void UpcallArgumentTypeChecking_InstanceImpl();
159 void UpcallArgumentTypeChecking_StaticImpl();
160 void CompileAndRunFloatFloatMethodImpl();
161 void CheckParameterAlignImpl();
162 void MaxParamNumberImpl();
163 void WithoutImplementationImpl();
Andreas Gampe48ee3562015-04-10 19:57:29 -0700164 void WithoutImplementationRefReturnImpl();
Andreas Gampe6e498692014-08-18 16:43:12 -0700165 void StackArgsIntsFirstImpl();
166 void StackArgsFloatsFirstImpl();
167 void StackArgsMixedImpl();
Lazar Trsicf652d602015-06-24 16:30:21 +0200168 void StackArgsSignExtendedMips64Impl();
Andreas Gampe6e498692014-08-18 16:43:12 -0700169
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700170 JNIEnv* env_;
171 jmethodID jmethod_;
Andreas Gampe6e498692014-08-18 16:43:12 -0700172 bool check_generic_jni_;
Ian Rogersb033c752011-07-20 12:22:35 -0700173};
174
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700175jclass JniCompilerTest::jklass_;
176jobject JniCompilerTest::jobj_;
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700177jobject JniCompilerTest::class_loader_;
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700178
Andreas Gampe6e498692014-08-18 16:43:12 -0700179#define JNI_TEST(TestName) \
180 TEST_F(JniCompilerTest, TestName ## Default) { \
181 TestName ## Impl(); \
182 } \
183 \
184 TEST_F(JniCompilerTest, TestName ## Generic) { \
185 TEST_DISABLED_FOR_MIPS(); \
186 SetCheckGenericJni(true); \
187 TestName ## Impl(); \
188 }
Andreas Gampecf4035a2014-05-28 22:43:01 -0700189
Elliott Hughesb264f082012-04-06 17:10:10 -0700190int gJava_MyClassNatives_foo_calls = 0;
191void Java_MyClassNatives_foo(JNIEnv* env, jobject thisObj) {
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700192 // 1 = thisObj
Ian Rogers50b35e22012-10-04 10:09:15 -0700193 EXPECT_EQ(kNative, Thread::Current()->GetState());
194 Locks::mutator_lock_->AssertNotHeld(Thread::Current());
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700195 EXPECT_EQ(Thread::Current()->GetJniEnv(), env);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700196 EXPECT_TRUE(thisObj != nullptr);
Ian Rogersa8cd9f42011-08-19 16:43:41 -0700197 EXPECT_TRUE(env->IsInstanceOf(thisObj, JniCompilerTest::jklass_));
Elliott Hughesb264f082012-04-06 17:10:10 -0700198 gJava_MyClassNatives_foo_calls++;
Ian Rogersef7d42f2014-01-06 12:55:46 -0800199 ScopedObjectAccess soa(Thread::Current());
200 EXPECT_EQ(1U, Thread::Current()->NumStackReferences());
Ian Rogersb033c752011-07-20 12:22:35 -0700201}
202
Andreas Gampe6e498692014-08-18 16:43:12 -0700203void JniCompilerTest::CompileAndRunNoArgMethodImpl() {
Ian Rogersef7d42f2014-01-06 12:55:46 -0800204 SetUpForTest(false, "foo", "()V", reinterpret_cast<void*>(&Java_MyClassNatives_foo));
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700205
Elliott Hughesb264f082012-04-06 17:10:10 -0700206 EXPECT_EQ(0, gJava_MyClassNatives_foo_calls);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700207 env_->CallNonvirtualVoidMethod(jobj_, jklass_, jmethod_);
Elliott Hughesb264f082012-04-06 17:10:10 -0700208 EXPECT_EQ(1, gJava_MyClassNatives_foo_calls);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700209 env_->CallNonvirtualVoidMethod(jobj_, jklass_, jmethod_);
Elliott Hughesb264f082012-04-06 17:10:10 -0700210 EXPECT_EQ(2, gJava_MyClassNatives_foo_calls);
Andreas Gampe6e498692014-08-18 16:43:12 -0700211
212 gJava_MyClassNatives_foo_calls = 0;
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700213}
214
Andreas Gampe6e498692014-08-18 16:43:12 -0700215JNI_TEST(CompileAndRunNoArgMethod)
216
217void JniCompilerTest::CompileAndRunIntMethodThroughStubImpl() {
Andreas Gampecf4035a2014-05-28 22:43:01 -0700218 SetUpForTest(false, "bar", "(I)I", nullptr);
219 // calling through stub will link with &Java_MyClassNatives_bar
Shih-wei Liao31384c52011-09-06 15:27:45 -0700220
Shih-wei Liao31384c52011-09-06 15:27:45 -0700221 std::string reason;
Dmitriy Ivanovf5a30992015-11-11 14:18:55 -0800222 ASSERT_TRUE(Runtime::Current()->GetJavaVM()->
Dimitry Ivanov986f6502015-12-15 14:08:18 -0800223 LoadNativeLibrary(env_, "", class_loader_, /* is_shared_namespace */ false,
224 nullptr, nullptr, &reason))
Ian Rogers68d8b422014-07-17 11:09:10 -0700225 << 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;
Dmitriy Ivanovf5a30992015-11-11 14:18:55 -0800238 ASSERT_TRUE(Runtime::Current()->GetJavaVM()->
Dimitry Ivanov986f6502015-12-15 14:08:18 -0800239 LoadNativeLibrary(env_, "", class_loader_, /* is_shared_namespace */ false,
240 nullptr, nullptr, &reason))
Ian Rogers68d8b422014-07-17 11:09:10 -0700241 << reason;
Ian Rogers1cefdbd2012-02-29 09:34:50 -0800242
243 jint result = env_->CallStaticIntMethod(jklass_, jmethod_, 42);
244 EXPECT_EQ(43, result);
245}
246
Andreas Gampe6e498692014-08-18 16:43:12 -0700247JNI_TEST(CompileAndRunStaticIntMethodThroughStub)
248
Elliott Hughesb264f082012-04-06 17:10:10 -0700249int gJava_MyClassNatives_fooI_calls = 0;
250jint Java_MyClassNatives_fooI(JNIEnv* env, jobject thisObj, jint x) {
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700251 // 1 = thisObj
Ian Rogers50b35e22012-10-04 10:09:15 -0700252 EXPECT_EQ(kNative, Thread::Current()->GetState());
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700253 EXPECT_EQ(Thread::Current()->GetJniEnv(), env);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700254 EXPECT_TRUE(thisObj != nullptr);
Ian Rogersa8cd9f42011-08-19 16:43:41 -0700255 EXPECT_TRUE(env->IsInstanceOf(thisObj, JniCompilerTest::jklass_));
Elliott Hughesb264f082012-04-06 17:10:10 -0700256 gJava_MyClassNatives_fooI_calls++;
Ian Rogersef7d42f2014-01-06 12:55:46 -0800257 ScopedObjectAccess soa(Thread::Current());
258 EXPECT_EQ(1U, Thread::Current()->NumStackReferences());
Ian Rogersb033c752011-07-20 12:22:35 -0700259 return x;
260}
261
Andreas Gampe6e498692014-08-18 16:43:12 -0700262void JniCompilerTest::CompileAndRunIntMethodImpl() {
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700263 SetUpForTest(false, "fooI", "(I)I",
Elliott Hughesb264f082012-04-06 17:10:10 -0700264 reinterpret_cast<void*>(&Java_MyClassNatives_fooI));
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700265
Elliott Hughesb264f082012-04-06 17:10:10 -0700266 EXPECT_EQ(0, gJava_MyClassNatives_fooI_calls);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700267 jint result = env_->CallNonvirtualIntMethod(jobj_, jklass_, jmethod_, 42);
268 EXPECT_EQ(42, result);
Elliott Hughesb264f082012-04-06 17:10:10 -0700269 EXPECT_EQ(1, gJava_MyClassNatives_fooI_calls);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700270 result = env_->CallNonvirtualIntMethod(jobj_, jklass_, jmethod_, 0xCAFED00D);
271 EXPECT_EQ(static_cast<jint>(0xCAFED00D), result);
Elliott Hughesb264f082012-04-06 17:10:10 -0700272 EXPECT_EQ(2, gJava_MyClassNatives_fooI_calls);
Andreas Gampe6e498692014-08-18 16:43:12 -0700273
274 gJava_MyClassNatives_fooI_calls = 0;
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700275}
276
Andreas Gampe6e498692014-08-18 16:43:12 -0700277JNI_TEST(CompileAndRunIntMethod)
278
Elliott Hughesb264f082012-04-06 17:10:10 -0700279int gJava_MyClassNatives_fooII_calls = 0;
280jint Java_MyClassNatives_fooII(JNIEnv* env, jobject thisObj, jint x, jint y) {
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700281 // 1 = thisObj
Ian Rogers50b35e22012-10-04 10:09:15 -0700282 EXPECT_EQ(kNative, Thread::Current()->GetState());
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700283 EXPECT_EQ(Thread::Current()->GetJniEnv(), env);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700284 EXPECT_TRUE(thisObj != nullptr);
Ian Rogersa8cd9f42011-08-19 16:43:41 -0700285 EXPECT_TRUE(env->IsInstanceOf(thisObj, JniCompilerTest::jklass_));
Elliott Hughesb264f082012-04-06 17:10:10 -0700286 gJava_MyClassNatives_fooII_calls++;
Ian Rogersef7d42f2014-01-06 12:55:46 -0800287 ScopedObjectAccess soa(Thread::Current());
288 EXPECT_EQ(1U, Thread::Current()->NumStackReferences());
Ian Rogersb033c752011-07-20 12:22:35 -0700289 return x - y; // non-commutative operator
290}
291
Andreas Gampe6e498692014-08-18 16:43:12 -0700292void JniCompilerTest::CompileAndRunIntIntMethodImpl() {
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700293 SetUpForTest(false, "fooII", "(II)I",
Elliott Hughesb264f082012-04-06 17:10:10 -0700294 reinterpret_cast<void*>(&Java_MyClassNatives_fooII));
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700295
Elliott Hughesb264f082012-04-06 17:10:10 -0700296 EXPECT_EQ(0, gJava_MyClassNatives_fooII_calls);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700297 jint result = env_->CallNonvirtualIntMethod(jobj_, jklass_, jmethod_, 99, 10);
298 EXPECT_EQ(99 - 10, result);
Elliott Hughesb264f082012-04-06 17:10:10 -0700299 EXPECT_EQ(1, gJava_MyClassNatives_fooII_calls);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700300 result = env_->CallNonvirtualIntMethod(jobj_, jklass_, jmethod_, 0xCAFEBABE,
301 0xCAFED00D);
302 EXPECT_EQ(static_cast<jint>(0xCAFEBABE - 0xCAFED00D), result);
Elliott Hughesb264f082012-04-06 17:10:10 -0700303 EXPECT_EQ(2, gJava_MyClassNatives_fooII_calls);
Andreas Gampe6e498692014-08-18 16:43:12 -0700304
305 gJava_MyClassNatives_fooII_calls = 0;
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700306}
307
Andreas Gampe6e498692014-08-18 16:43:12 -0700308JNI_TEST(CompileAndRunIntIntMethod)
309
Elliott Hughesb264f082012-04-06 17:10:10 -0700310int gJava_MyClassNatives_fooJJ_calls = 0;
311jlong Java_MyClassNatives_fooJJ(JNIEnv* env, jobject thisObj, jlong x, jlong y) {
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700312 // 1 = thisObj
Ian Rogers50b35e22012-10-04 10:09:15 -0700313 EXPECT_EQ(kNative, Thread::Current()->GetState());
Ian Rogers9b269d22011-09-04 14:06:05 -0700314 EXPECT_EQ(Thread::Current()->GetJniEnv(), env);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700315 EXPECT_TRUE(thisObj != nullptr);
Ian Rogers9b269d22011-09-04 14:06:05 -0700316 EXPECT_TRUE(env->IsInstanceOf(thisObj, JniCompilerTest::jklass_));
Elliott Hughesb264f082012-04-06 17:10:10 -0700317 gJava_MyClassNatives_fooJJ_calls++;
Ian Rogersef7d42f2014-01-06 12:55:46 -0800318 ScopedObjectAccess soa(Thread::Current());
319 EXPECT_EQ(1U, Thread::Current()->NumStackReferences());
Ian Rogers9b269d22011-09-04 14:06:05 -0700320 return x - y; // non-commutative operator
321}
322
Andreas Gampe6e498692014-08-18 16:43:12 -0700323void JniCompilerTest::CompileAndRunLongLongMethodImpl() {
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700324 SetUpForTest(false, "fooJJ", "(JJ)J",
Elliott Hughesb264f082012-04-06 17:10:10 -0700325 reinterpret_cast<void*>(&Java_MyClassNatives_fooJJ));
Ian Rogers9b269d22011-09-04 14:06:05 -0700326
Elliott Hughesb264f082012-04-06 17:10:10 -0700327 EXPECT_EQ(0, gJava_MyClassNatives_fooJJ_calls);
Ian Rogers0f678472014-03-10 16:18:37 -0700328 jlong a = INT64_C(0x1234567890ABCDEF);
329 jlong b = INT64_C(0xFEDCBA0987654321);
Ian Rogers9b269d22011-09-04 14:06:05 -0700330 jlong result = env_->CallNonvirtualLongMethod(jobj_, jklass_, jmethod_, a, b);
331 EXPECT_EQ(a - b, result);
Elliott Hughesb264f082012-04-06 17:10:10 -0700332 EXPECT_EQ(1, gJava_MyClassNatives_fooJJ_calls);
Ian Rogers9b269d22011-09-04 14:06:05 -0700333 result = env_->CallNonvirtualLongMethod(jobj_, jklass_, jmethod_, b, a);
334 EXPECT_EQ(b - a, result);
Elliott Hughesb264f082012-04-06 17:10:10 -0700335 EXPECT_EQ(2, gJava_MyClassNatives_fooJJ_calls);
Andreas Gampe6e498692014-08-18 16:43:12 -0700336
337 gJava_MyClassNatives_fooJJ_calls = 0;
Ian Rogers9b269d22011-09-04 14:06:05 -0700338}
339
Andreas Gampe6e498692014-08-18 16:43:12 -0700340JNI_TEST(CompileAndRunLongLongMethod)
341
Elliott Hughesb264f082012-04-06 17:10:10 -0700342int gJava_MyClassNatives_fooDD_calls = 0;
343jdouble Java_MyClassNatives_fooDD(JNIEnv* env, jobject thisObj, jdouble x, jdouble y) {
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700344 // 1 = thisObj
Ian Rogers50b35e22012-10-04 10:09:15 -0700345 EXPECT_EQ(kNative, Thread::Current()->GetState());
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700346 EXPECT_EQ(Thread::Current()->GetJniEnv(), env);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700347 EXPECT_TRUE(thisObj != nullptr);
Ian Rogersa8cd9f42011-08-19 16:43:41 -0700348 EXPECT_TRUE(env->IsInstanceOf(thisObj, JniCompilerTest::jklass_));
Elliott Hughesb264f082012-04-06 17:10:10 -0700349 gJava_MyClassNatives_fooDD_calls++;
Ian Rogersef7d42f2014-01-06 12:55:46 -0800350 ScopedObjectAccess soa(Thread::Current());
351 EXPECT_EQ(1U, Thread::Current()->NumStackReferences());
Ian Rogersb033c752011-07-20 12:22:35 -0700352 return x - y; // non-commutative operator
353}
354
Andreas Gampe6e498692014-08-18 16:43:12 -0700355void JniCompilerTest::CompileAndRunDoubleDoubleMethodImpl() {
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700356 SetUpForTest(false, "fooDD", "(DD)D",
Elliott Hughesb264f082012-04-06 17:10:10 -0700357 reinterpret_cast<void*>(&Java_MyClassNatives_fooDD));
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700358
Elliott Hughesb264f082012-04-06 17:10:10 -0700359 EXPECT_EQ(0, gJava_MyClassNatives_fooDD_calls);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700360 jdouble result = env_->CallNonvirtualDoubleMethod(jobj_, jklass_, jmethod_,
361 99.0, 10.0);
Ian Rogers647b1a82014-10-10 11:02:11 -0700362 EXPECT_DOUBLE_EQ(99.0 - 10.0, result);
Elliott Hughesb264f082012-04-06 17:10:10 -0700363 EXPECT_EQ(1, gJava_MyClassNatives_fooDD_calls);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700364 jdouble a = 3.14159265358979323846;
365 jdouble b = 0.69314718055994530942;
366 result = env_->CallNonvirtualDoubleMethod(jobj_, jklass_, jmethod_, a, b);
Ian Rogers647b1a82014-10-10 11:02:11 -0700367 EXPECT_DOUBLE_EQ(a - b, result);
Elliott Hughesb264f082012-04-06 17:10:10 -0700368 EXPECT_EQ(2, gJava_MyClassNatives_fooDD_calls);
Andreas Gampe6e498692014-08-18 16:43:12 -0700369
370 gJava_MyClassNatives_fooDD_calls = 0;
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700371}
372
Elliott Hughes3e778f72012-05-21 15:29:52 -0700373int gJava_MyClassNatives_fooJJ_synchronized_calls = 0;
374jlong Java_MyClassNatives_fooJJ_synchronized(JNIEnv* env, jobject thisObj, jlong x, jlong y) {
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700375 // 1 = thisObj
Ian Rogers50b35e22012-10-04 10:09:15 -0700376 EXPECT_EQ(kNative, Thread::Current()->GetState());
Elliott Hughes3e778f72012-05-21 15:29:52 -0700377 EXPECT_EQ(Thread::Current()->GetJniEnv(), env);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700378 EXPECT_TRUE(thisObj != nullptr);
Elliott Hughes3e778f72012-05-21 15:29:52 -0700379 EXPECT_TRUE(env->IsInstanceOf(thisObj, JniCompilerTest::jklass_));
380 gJava_MyClassNatives_fooJJ_synchronized_calls++;
Ian Rogersef7d42f2014-01-06 12:55:46 -0800381 ScopedObjectAccess soa(Thread::Current());
382 EXPECT_EQ(1U, Thread::Current()->NumStackReferences());
Elliott Hughes3e778f72012-05-21 15:29:52 -0700383 return x | y;
384}
385
Andreas Gampe6e498692014-08-18 16:43:12 -0700386void JniCompilerTest::CompileAndRun_fooJJ_synchronizedImpl() {
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700387 SetUpForTest(false, "fooJJ_synchronized", "(JJ)J",
Elliott Hughes3e778f72012-05-21 15:29:52 -0700388 reinterpret_cast<void*>(&Java_MyClassNatives_fooJJ_synchronized));
389
390 EXPECT_EQ(0, gJava_MyClassNatives_fooJJ_synchronized_calls);
391 jlong a = 0x1000000020000000ULL;
392 jlong b = 0x00ff000000aa0000ULL;
393 jlong result = env_->CallNonvirtualLongMethod(jobj_, jklass_, jmethod_, a, b);
394 EXPECT_EQ(a | b, result);
395 EXPECT_EQ(1, gJava_MyClassNatives_fooJJ_synchronized_calls);
Andreas Gampe6e498692014-08-18 16:43:12 -0700396
397 gJava_MyClassNatives_fooJJ_synchronized_calls = 0;
Elliott Hughes3e778f72012-05-21 15:29:52 -0700398}
399
Andreas Gampe6e498692014-08-18 16:43:12 -0700400JNI_TEST(CompileAndRun_fooJJ_synchronized)
401
Elliott Hughesb264f082012-04-06 17:10:10 -0700402int gJava_MyClassNatives_fooIOO_calls = 0;
403jobject Java_MyClassNatives_fooIOO(JNIEnv* env, jobject thisObj, jint x, jobject y,
Ian Rogersb033c752011-07-20 12:22:35 -0700404 jobject z) {
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700405 // 3 = this + y + z
Ian Rogers50b35e22012-10-04 10:09:15 -0700406 EXPECT_EQ(kNative, Thread::Current()->GetState());
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700407 EXPECT_EQ(Thread::Current()->GetJniEnv(), env);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700408 EXPECT_TRUE(thisObj != nullptr);
Ian Rogersa8cd9f42011-08-19 16:43:41 -0700409 EXPECT_TRUE(env->IsInstanceOf(thisObj, JniCompilerTest::jklass_));
Elliott Hughesb264f082012-04-06 17:10:10 -0700410 gJava_MyClassNatives_fooIOO_calls++;
Ian Rogersef7d42f2014-01-06 12:55:46 -0800411 ScopedObjectAccess soa(Thread::Current());
Andreas Gampebf6b92a2014-03-05 16:11:04 -0800412 size_t null_args = (y == nullptr ? 1 : 0) + (z == nullptr ? 1 : 0);
413 EXPECT_TRUE(3U == Thread::Current()->NumStackReferences() ||
414 (3U - null_args) == Thread::Current()->NumStackReferences());
Ian Rogersb033c752011-07-20 12:22:35 -0700415 switch (x) {
416 case 1:
417 return y;
418 case 2:
419 return z;
420 default:
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700421 return thisObj;
Ian Rogersb033c752011-07-20 12:22:35 -0700422 }
423}
424
Andreas Gampe6e498692014-08-18 16:43:12 -0700425void JniCompilerTest::CompileAndRunIntObjectObjectMethodImpl() {
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700426 SetUpForTest(false, "fooIOO",
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700427 "(ILjava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;",
Elliott Hughesb264f082012-04-06 17:10:10 -0700428 reinterpret_cast<void*>(&Java_MyClassNatives_fooIOO));
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700429
Elliott Hughesb264f082012-04-06 17:10:10 -0700430 EXPECT_EQ(0, gJava_MyClassNatives_fooIOO_calls);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700431 jobject result = env_->CallNonvirtualObjectMethod(jobj_, jklass_, jmethod_, 0, nullptr, nullptr);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700432 EXPECT_TRUE(env_->IsSameObject(jobj_, result));
Elliott Hughesb264f082012-04-06 17:10:10 -0700433 EXPECT_EQ(1, gJava_MyClassNatives_fooIOO_calls);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700434
Andreas Gampecf4035a2014-05-28 22:43:01 -0700435 result = env_->CallNonvirtualObjectMethod(jobj_, jklass_, jmethod_, 0, nullptr, jklass_);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700436 EXPECT_TRUE(env_->IsSameObject(jobj_, result));
Elliott Hughesb264f082012-04-06 17:10:10 -0700437 EXPECT_EQ(2, gJava_MyClassNatives_fooIOO_calls);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700438 result = env_->CallNonvirtualObjectMethod(jobj_, jklass_, jmethod_, 1, nullptr, jklass_);
439 EXPECT_TRUE(env_->IsSameObject(nullptr, result));
Elliott Hughesb264f082012-04-06 17:10:10 -0700440 EXPECT_EQ(3, gJava_MyClassNatives_fooIOO_calls);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700441 result = env_->CallNonvirtualObjectMethod(jobj_, jklass_, jmethod_, 2, nullptr, jklass_);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700442 EXPECT_TRUE(env_->IsSameObject(jklass_, result));
Elliott Hughesb264f082012-04-06 17:10:10 -0700443 EXPECT_EQ(4, gJava_MyClassNatives_fooIOO_calls);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700444
Andreas Gampecf4035a2014-05-28 22:43:01 -0700445 result = env_->CallNonvirtualObjectMethod(jobj_, jklass_, jmethod_, 0, jklass_, nullptr);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700446 EXPECT_TRUE(env_->IsSameObject(jobj_, result));
Elliott Hughesb264f082012-04-06 17:10:10 -0700447 EXPECT_EQ(5, gJava_MyClassNatives_fooIOO_calls);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700448 result = env_->CallNonvirtualObjectMethod(jobj_, jklass_, jmethod_, 1, jklass_, nullptr);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700449 EXPECT_TRUE(env_->IsSameObject(jklass_, result));
Elliott Hughesb264f082012-04-06 17:10:10 -0700450 EXPECT_EQ(6, gJava_MyClassNatives_fooIOO_calls);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700451 result = env_->CallNonvirtualObjectMethod(jobj_, jklass_, jmethod_, 2, jklass_, nullptr);
452 EXPECT_TRUE(env_->IsSameObject(nullptr, result));
Elliott Hughesb264f082012-04-06 17:10:10 -0700453 EXPECT_EQ(7, gJava_MyClassNatives_fooIOO_calls);
Andreas Gampe6e498692014-08-18 16:43:12 -0700454
455 gJava_MyClassNatives_fooIOO_calls = 0;
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700456}
457
Andreas Gampe6e498692014-08-18 16:43:12 -0700458JNI_TEST(CompileAndRunIntObjectObjectMethod)
459
Elliott Hughesb264f082012-04-06 17:10:10 -0700460int gJava_MyClassNatives_fooSII_calls = 0;
461jint Java_MyClassNatives_fooSII(JNIEnv* env, jclass klass, jint x, jint y) {
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700462 // 1 = klass
Ian Rogers50b35e22012-10-04 10:09:15 -0700463 EXPECT_EQ(kNative, Thread::Current()->GetState());
Shih-wei Liao82da44b2011-09-01 00:38:04 -0700464 EXPECT_EQ(Thread::Current()->GetJniEnv(), env);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700465 EXPECT_TRUE(klass != nullptr);
Shih-wei Liao82da44b2011-09-01 00:38:04 -0700466 EXPECT_TRUE(env->IsInstanceOf(JniCompilerTest::jobj_, klass));
Elliott Hughesb264f082012-04-06 17:10:10 -0700467 gJava_MyClassNatives_fooSII_calls++;
Ian Rogersef7d42f2014-01-06 12:55:46 -0800468 ScopedObjectAccess soa(Thread::Current());
469 EXPECT_EQ(1U, Thread::Current()->NumStackReferences());
Shih-wei Liao82da44b2011-09-01 00:38:04 -0700470 return x + y;
471}
472
Andreas Gampe6e498692014-08-18 16:43:12 -0700473void JniCompilerTest::CompileAndRunStaticIntIntMethodImpl() {
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700474 SetUpForTest(true, "fooSII", "(II)I",
Elliott Hughesb264f082012-04-06 17:10:10 -0700475 reinterpret_cast<void*>(&Java_MyClassNatives_fooSII));
Shih-wei Liao82da44b2011-09-01 00:38:04 -0700476
Elliott Hughesb264f082012-04-06 17:10:10 -0700477 EXPECT_EQ(0, gJava_MyClassNatives_fooSII_calls);
Shih-wei Liao82da44b2011-09-01 00:38:04 -0700478 jint result = env_->CallStaticIntMethod(jklass_, jmethod_, 20, 30);
479 EXPECT_EQ(50, result);
Elliott Hughesb264f082012-04-06 17:10:10 -0700480 EXPECT_EQ(1, gJava_MyClassNatives_fooSII_calls);
Andreas Gampe6e498692014-08-18 16:43:12 -0700481
482 gJava_MyClassNatives_fooSII_calls = 0;
Shih-wei Liao82da44b2011-09-01 00:38:04 -0700483}
484
Andreas Gampe6e498692014-08-18 16:43:12 -0700485JNI_TEST(CompileAndRunStaticIntIntMethod)
486
Elliott Hughesb264f082012-04-06 17:10:10 -0700487int gJava_MyClassNatives_fooSDD_calls = 0;
488jdouble Java_MyClassNatives_fooSDD(JNIEnv* env, jclass klass, jdouble x, jdouble y) {
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700489 // 1 = klass
Ian Rogers50b35e22012-10-04 10:09:15 -0700490 EXPECT_EQ(kNative, Thread::Current()->GetState());
Ian Rogers7a99c112011-09-07 12:48:27 -0700491 EXPECT_EQ(Thread::Current()->GetJniEnv(), env);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700492 EXPECT_TRUE(klass != nullptr);
Ian Rogers7a99c112011-09-07 12:48:27 -0700493 EXPECT_TRUE(env->IsInstanceOf(JniCompilerTest::jobj_, klass));
Elliott Hughesb264f082012-04-06 17:10:10 -0700494 gJava_MyClassNatives_fooSDD_calls++;
Ian Rogersef7d42f2014-01-06 12:55:46 -0800495 ScopedObjectAccess soa(Thread::Current());
496 EXPECT_EQ(1U, Thread::Current()->NumStackReferences());
Ian Rogers7a99c112011-09-07 12:48:27 -0700497 return x - y; // non-commutative operator
498}
499
Andreas Gampe6e498692014-08-18 16:43:12 -0700500void JniCompilerTest::CompileAndRunStaticDoubleDoubleMethodImpl() {
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700501 SetUpForTest(true, "fooSDD", "(DD)D",
Elliott Hughesb264f082012-04-06 17:10:10 -0700502 reinterpret_cast<void*>(&Java_MyClassNatives_fooSDD));
Ian Rogers7a99c112011-09-07 12:48:27 -0700503
Elliott Hughesb264f082012-04-06 17:10:10 -0700504 EXPECT_EQ(0, gJava_MyClassNatives_fooSDD_calls);
Ian Rogers7a99c112011-09-07 12:48:27 -0700505 jdouble result = env_->CallStaticDoubleMethod(jklass_, jmethod_, 99.0, 10.0);
Ian Rogers647b1a82014-10-10 11:02:11 -0700506 EXPECT_DOUBLE_EQ(99.0 - 10.0, result);
Elliott Hughesb264f082012-04-06 17:10:10 -0700507 EXPECT_EQ(1, gJava_MyClassNatives_fooSDD_calls);
Ian Rogers7a99c112011-09-07 12:48:27 -0700508 jdouble a = 3.14159265358979323846;
509 jdouble b = 0.69314718055994530942;
510 result = env_->CallStaticDoubleMethod(jklass_, jmethod_, a, b);
Ian Rogers647b1a82014-10-10 11:02:11 -0700511 EXPECT_DOUBLE_EQ(a - b, result);
512 EXPECT_DOUBLE_EQ(2, gJava_MyClassNatives_fooSDD_calls);
Andreas Gampe6e498692014-08-18 16:43:12 -0700513
514 gJava_MyClassNatives_fooSDD_calls = 0;
Ian Rogers7a99c112011-09-07 12:48:27 -0700515}
516
Andreas Gampe6e498692014-08-18 16:43:12 -0700517JNI_TEST(CompileAndRunStaticDoubleDoubleMethod)
518
Nicolas Geoffray54accbc2014-08-13 03:40:45 +0100519// The x86 generic JNI code had a bug where it assumed a floating
520// point return value would be in xmm0. We use log, to somehow ensure
521// the compiler will use the floating point stack.
522
Ian Rogers6a3c1fc2014-10-31 00:33:20 -0700523jdouble Java_MyClassNatives_logD(JNIEnv*, jclass, jdouble x) {
Nicolas Geoffray54accbc2014-08-13 03:40:45 +0100524 return log(x);
525}
526
Andreas Gampe6e498692014-08-18 16:43:12 -0700527void JniCompilerTest::RunStaticLogDoubleMethodImpl() {
Andreas Gampe6e498692014-08-18 16:43:12 -0700528 SetUpForTest(true, "logD", "(D)D", reinterpret_cast<void*>(&Java_MyClassNatives_logD));
Nicolas Geoffray54accbc2014-08-13 03:40:45 +0100529
530 jdouble result = env_->CallStaticDoubleMethod(jklass_, jmethod_, 2.0);
Ian Rogers647b1a82014-10-10 11:02:11 -0700531 EXPECT_DOUBLE_EQ(log(2.0), result);
Nicolas Geoffray54accbc2014-08-13 03:40:45 +0100532}
533
Andreas Gampe6e498692014-08-18 16:43:12 -0700534JNI_TEST(RunStaticLogDoubleMethod)
535
Ian Rogers6a3c1fc2014-10-31 00:33:20 -0700536jfloat Java_MyClassNatives_logF(JNIEnv*, jclass, jfloat x) {
Nicolas Geoffray54accbc2014-08-13 03:40:45 +0100537 return logf(x);
538}
539
Andreas Gampe6e498692014-08-18 16:43:12 -0700540void JniCompilerTest::RunStaticLogFloatMethodImpl() {
Andreas Gampe6e498692014-08-18 16:43:12 -0700541 SetUpForTest(true, "logF", "(F)F", reinterpret_cast<void*>(&Java_MyClassNatives_logF));
Nicolas Geoffray54accbc2014-08-13 03:40:45 +0100542
543 jfloat result = env_->CallStaticFloatMethod(jklass_, jmethod_, 2.0);
Ian Rogers647b1a82014-10-10 11:02:11 -0700544 EXPECT_FLOAT_EQ(logf(2.0), result);
Nicolas Geoffray54accbc2014-08-13 03:40:45 +0100545}
546
Andreas Gampe6e498692014-08-18 16:43:12 -0700547JNI_TEST(RunStaticLogFloatMethod)
548
Ian Rogers6a3c1fc2014-10-31 00:33:20 -0700549jboolean Java_MyClassNatives_returnTrue(JNIEnv*, jclass) {
Nicolas Geoffray54accbc2014-08-13 03:40:45 +0100550 return JNI_TRUE;
551}
552
Ian Rogers6a3c1fc2014-10-31 00:33:20 -0700553jboolean Java_MyClassNatives_returnFalse(JNIEnv*, jclass) {
Nicolas Geoffray54accbc2014-08-13 03:40:45 +0100554 return JNI_FALSE;
555}
556
Ian Rogers6a3c1fc2014-10-31 00:33:20 -0700557jint Java_MyClassNatives_returnInt(JNIEnv*, jclass) {
Nicolas Geoffray54accbc2014-08-13 03:40:45 +0100558 return 42;
559}
560
Andreas Gampe6e498692014-08-18 16:43:12 -0700561void JniCompilerTest::RunStaticReturnTrueImpl() {
Andreas Gampe6e498692014-08-18 16:43:12 -0700562 SetUpForTest(true, "returnTrue", "()Z", reinterpret_cast<void*>(&Java_MyClassNatives_returnTrue));
Nicolas Geoffray54accbc2014-08-13 03:40:45 +0100563
564 jboolean result = env_->CallStaticBooleanMethod(jklass_, jmethod_);
565 EXPECT_TRUE(result);
566}
567
Andreas Gampe6e498692014-08-18 16:43:12 -0700568JNI_TEST(RunStaticReturnTrue)
569
570void JniCompilerTest::RunStaticReturnFalseImpl() {
Nicolas Geoffray54accbc2014-08-13 03:40:45 +0100571 SetUpForTest(true, "returnFalse", "()Z",
Andreas Gampe6e498692014-08-18 16:43:12 -0700572 reinterpret_cast<void*>(&Java_MyClassNatives_returnFalse));
Nicolas Geoffray54accbc2014-08-13 03:40:45 +0100573
574 jboolean result = env_->CallStaticBooleanMethod(jklass_, jmethod_);
575 EXPECT_FALSE(result);
576}
577
Andreas Gampe6e498692014-08-18 16:43:12 -0700578JNI_TEST(RunStaticReturnFalse)
579
580void JniCompilerTest::RunGenericStaticReturnIntImpl() {
Andreas Gampe6e498692014-08-18 16:43:12 -0700581 SetUpForTest(true, "returnInt", "()I", reinterpret_cast<void*>(&Java_MyClassNatives_returnInt));
Nicolas Geoffray54accbc2014-08-13 03:40:45 +0100582
583 jint result = env_->CallStaticIntMethod(jklass_, jmethod_);
584 EXPECT_EQ(42, result);
585}
586
Andreas Gampe6e498692014-08-18 16:43:12 -0700587JNI_TEST(RunGenericStaticReturnInt)
588
Elliott Hughesb264f082012-04-06 17:10:10 -0700589int gJava_MyClassNatives_fooSIOO_calls = 0;
590jobject Java_MyClassNatives_fooSIOO(JNIEnv* env, jclass klass, jint x, jobject y,
Ian Rogersb033c752011-07-20 12:22:35 -0700591 jobject z) {
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700592 // 3 = klass + y + z
Ian Rogers50b35e22012-10-04 10:09:15 -0700593 EXPECT_EQ(kNative, Thread::Current()->GetState());
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700594 EXPECT_EQ(Thread::Current()->GetJniEnv(), env);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700595 EXPECT_TRUE(klass != nullptr);
Ian Rogersa8cd9f42011-08-19 16:43:41 -0700596 EXPECT_TRUE(env->IsInstanceOf(JniCompilerTest::jobj_, klass));
Elliott Hughesb264f082012-04-06 17:10:10 -0700597 gJava_MyClassNatives_fooSIOO_calls++;
Ian Rogersef7d42f2014-01-06 12:55:46 -0800598 ScopedObjectAccess soa(Thread::Current());
Andreas Gampebf6b92a2014-03-05 16:11:04 -0800599 size_t null_args = (y == nullptr ? 1 : 0) + (z == nullptr ? 1 : 0);
600 EXPECT_TRUE(3U == Thread::Current()->NumStackReferences() ||
601 (3U - null_args) == Thread::Current()->NumStackReferences());
Ian Rogersb033c752011-07-20 12:22:35 -0700602 switch (x) {
603 case 1:
604 return y;
605 case 2:
606 return z;
607 default:
608 return klass;
609 }
610}
611
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700612
Andreas Gampe6e498692014-08-18 16:43:12 -0700613void JniCompilerTest::CompileAndRunStaticIntObjectObjectMethodImpl() {
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700614 SetUpForTest(true, "fooSIOO",
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700615 "(ILjava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;",
Elliott Hughesb264f082012-04-06 17:10:10 -0700616 reinterpret_cast<void*>(&Java_MyClassNatives_fooSIOO));
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700617
Elliott Hughesb264f082012-04-06 17:10:10 -0700618 EXPECT_EQ(0, gJava_MyClassNatives_fooSIOO_calls);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700619 jobject result = env_->CallStaticObjectMethod(jklass_, jmethod_, 0, nullptr, nullptr);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700620 EXPECT_TRUE(env_->IsSameObject(jklass_, result));
Elliott Hughesb264f082012-04-06 17:10:10 -0700621 EXPECT_EQ(1, gJava_MyClassNatives_fooSIOO_calls);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700622
Andreas Gampecf4035a2014-05-28 22:43:01 -0700623 result = env_->CallStaticObjectMethod(jklass_, jmethod_, 0, nullptr, jobj_);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700624 EXPECT_TRUE(env_->IsSameObject(jklass_, result));
Elliott Hughesb264f082012-04-06 17:10:10 -0700625 EXPECT_EQ(2, gJava_MyClassNatives_fooSIOO_calls);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700626 result = env_->CallStaticObjectMethod(jklass_, jmethod_, 1, nullptr, jobj_);
627 EXPECT_TRUE(env_->IsSameObject(nullptr, result));
Elliott Hughesb264f082012-04-06 17:10:10 -0700628 EXPECT_EQ(3, gJava_MyClassNatives_fooSIOO_calls);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700629 result = env_->CallStaticObjectMethod(jklass_, jmethod_, 2, nullptr, jobj_);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700630 EXPECT_TRUE(env_->IsSameObject(jobj_, result));
Elliott Hughesb264f082012-04-06 17:10:10 -0700631 EXPECT_EQ(4, gJava_MyClassNatives_fooSIOO_calls);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700632
Andreas Gampecf4035a2014-05-28 22:43:01 -0700633 result = env_->CallStaticObjectMethod(jklass_, jmethod_, 0, jobj_, nullptr);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700634 EXPECT_TRUE(env_->IsSameObject(jklass_, result));
Elliott Hughesb264f082012-04-06 17:10:10 -0700635 EXPECT_EQ(5, gJava_MyClassNatives_fooSIOO_calls);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700636 result = env_->CallStaticObjectMethod(jklass_, jmethod_, 1, jobj_, nullptr);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700637 EXPECT_TRUE(env_->IsSameObject(jobj_, result));
Elliott Hughesb264f082012-04-06 17:10:10 -0700638 EXPECT_EQ(6, gJava_MyClassNatives_fooSIOO_calls);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700639 result = env_->CallStaticObjectMethod(jklass_, jmethod_, 2, jobj_, nullptr);
640 EXPECT_TRUE(env_->IsSameObject(nullptr, result));
Elliott Hughesb264f082012-04-06 17:10:10 -0700641 EXPECT_EQ(7, gJava_MyClassNatives_fooSIOO_calls);
Andreas Gampe6e498692014-08-18 16:43:12 -0700642
643 gJava_MyClassNatives_fooSIOO_calls = 0;
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700644}
645
Andreas Gampe6e498692014-08-18 16:43:12 -0700646JNI_TEST(CompileAndRunStaticIntObjectObjectMethod)
647
Elliott Hughesb264f082012-04-06 17:10:10 -0700648int gJava_MyClassNatives_fooSSIOO_calls = 0;
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700649jobject Java_MyClassNatives_fooSSIOO(JNIEnv* env, jclass klass, jint x, jobject y, jobject z) {
650 // 3 = klass + y + z
Ian Rogers50b35e22012-10-04 10:09:15 -0700651 EXPECT_EQ(kNative, Thread::Current()->GetState());
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700652 EXPECT_EQ(Thread::Current()->GetJniEnv(), env);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700653 EXPECT_TRUE(klass != nullptr);
Ian Rogersa8cd9f42011-08-19 16:43:41 -0700654 EXPECT_TRUE(env->IsInstanceOf(JniCompilerTest::jobj_, klass));
Elliott Hughesb264f082012-04-06 17:10:10 -0700655 gJava_MyClassNatives_fooSSIOO_calls++;
Ian Rogersef7d42f2014-01-06 12:55:46 -0800656 ScopedObjectAccess soa(Thread::Current());
Andreas Gampebf6b92a2014-03-05 16:11:04 -0800657 size_t null_args = (y == nullptr ? 1 : 0) + (z == nullptr ? 1 : 0);
658 EXPECT_TRUE(3U == Thread::Current()->NumStackReferences() ||
659 (3U - null_args) == Thread::Current()->NumStackReferences());
Ian Rogersdf20fe02011-07-20 20:34:16 -0700660 switch (x) {
661 case 1:
662 return y;
663 case 2:
664 return z;
665 default:
666 return klass;
667 }
668}
669
Andreas Gampe6e498692014-08-18 16:43:12 -0700670void JniCompilerTest::CompileAndRunStaticSynchronizedIntObjectObjectMethodImpl() {
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700671 SetUpForTest(true, "fooSSIOO",
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700672 "(ILjava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;",
Elliott Hughesb264f082012-04-06 17:10:10 -0700673 reinterpret_cast<void*>(&Java_MyClassNatives_fooSSIOO));
Carl Shapiro419ec7b2011-08-03 14:48:33 -0700674
Elliott Hughesb264f082012-04-06 17:10:10 -0700675 EXPECT_EQ(0, gJava_MyClassNatives_fooSSIOO_calls);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700676 jobject result = env_->CallStaticObjectMethod(jklass_, jmethod_, 0, nullptr, nullptr);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700677 EXPECT_TRUE(env_->IsSameObject(jklass_, result));
Elliott Hughesb264f082012-04-06 17:10:10 -0700678 EXPECT_EQ(1, gJava_MyClassNatives_fooSSIOO_calls);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700679
Andreas Gampecf4035a2014-05-28 22:43:01 -0700680 result = env_->CallStaticObjectMethod(jklass_, jmethod_, 0, nullptr, jobj_);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700681 EXPECT_TRUE(env_->IsSameObject(jklass_, result));
Elliott Hughesb264f082012-04-06 17:10:10 -0700682 EXPECT_EQ(2, gJava_MyClassNatives_fooSSIOO_calls);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700683 result = env_->CallStaticObjectMethod(jklass_, jmethod_, 1, nullptr, jobj_);
684 EXPECT_TRUE(env_->IsSameObject(nullptr, result));
Elliott Hughesb264f082012-04-06 17:10:10 -0700685 EXPECT_EQ(3, gJava_MyClassNatives_fooSSIOO_calls);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700686 result = env_->CallStaticObjectMethod(jklass_, jmethod_, 2, nullptr, jobj_);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700687 EXPECT_TRUE(env_->IsSameObject(jobj_, result));
Elliott Hughesb264f082012-04-06 17:10:10 -0700688 EXPECT_EQ(4, gJava_MyClassNatives_fooSSIOO_calls);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700689
Andreas Gampecf4035a2014-05-28 22:43:01 -0700690 result = env_->CallStaticObjectMethod(jklass_, jmethod_, 0, jobj_, nullptr);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700691 EXPECT_TRUE(env_->IsSameObject(jklass_, result));
Elliott Hughesb264f082012-04-06 17:10:10 -0700692 EXPECT_EQ(5, gJava_MyClassNatives_fooSSIOO_calls);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700693 result = env_->CallStaticObjectMethod(jklass_, jmethod_, 1, jobj_, nullptr);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700694 EXPECT_TRUE(env_->IsSameObject(jobj_, result));
Elliott Hughesb264f082012-04-06 17:10:10 -0700695 EXPECT_EQ(6, gJava_MyClassNatives_fooSSIOO_calls);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700696 result = env_->CallStaticObjectMethod(jklass_, jmethod_, 2, jobj_, nullptr);
697 EXPECT_TRUE(env_->IsSameObject(nullptr, result));
Elliott Hughesb264f082012-04-06 17:10:10 -0700698 EXPECT_EQ(7, gJava_MyClassNatives_fooSSIOO_calls);
Andreas Gampe6e498692014-08-18 16:43:12 -0700699
700 gJava_MyClassNatives_fooSSIOO_calls = 0;
Ian Rogersdf20fe02011-07-20 20:34:16 -0700701}
702
Andreas Gampe6e498692014-08-18 16:43:12 -0700703JNI_TEST(CompileAndRunStaticSynchronizedIntObjectObjectMethod)
704
Elliott Hughesb264f082012-04-06 17:10:10 -0700705void Java_MyClassNatives_throwException(JNIEnv* env, jobject) {
Elliott Hughesa2501992011-08-26 19:39:54 -0700706 jclass c = env->FindClass("java/lang/RuntimeException");
707 env->ThrowNew(c, "hello");
708}
Ian Rogers45a76cb2011-07-21 22:00:15 -0700709
Andreas Gampe6e498692014-08-18 16:43:12 -0700710void JniCompilerTest::ExceptionHandlingImpl() {
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700711 {
712 ASSERT_FALSE(runtime_->IsStarted());
713 ScopedObjectAccess soa(Thread::Current());
714 class_loader_ = LoadDex("MyClassNatives");
Brian Carlstrom40381fb2011-10-19 14:13:40 -0700715
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700716 // all compilation needs to happen before Runtime::Start
717 CompileForTest(class_loader_, false, "foo", "()V");
718 CompileForTest(class_loader_, false, "throwException", "()V");
719 CompileForTest(class_loader_, false, "foo", "()V");
720 }
721 // Start runtime to avoid re-initialization in SetupForTest.
722 Thread::Current()->TransitionFromSuspendedToRunnable();
Brian Carlstrombd86bcc2013-03-10 20:26:16 -0700723 bool started = runtime_->Start();
724 CHECK(started);
Brian Carlstrom25c33252011-09-18 15:58:35 -0700725
Elliott Hughesb264f082012-04-06 17:10:10 -0700726 gJava_MyClassNatives_foo_calls = 0;
Elliott Hughesa2501992011-08-26 19:39:54 -0700727
Ian Rogers67375ac2011-09-14 00:55:44 -0700728 // Check a single call of a JNI method is ok
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700729 SetUpForTest(false, "foo", "()V", reinterpret_cast<void*>(&Java_MyClassNatives_foo));
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700730 env_->CallNonvirtualVoidMethod(jobj_, jklass_, jmethod_);
Elliott Hughesb264f082012-04-06 17:10:10 -0700731 EXPECT_EQ(1, gJava_MyClassNatives_foo_calls);
Ian Rogers67375ac2011-09-14 00:55:44 -0700732 EXPECT_FALSE(Thread::Current()->IsExceptionPending());
Elliott Hughesa2501992011-08-26 19:39:54 -0700733
Ian Rogers67375ac2011-09-14 00:55:44 -0700734 // Get class for exception we expect to be thrown
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700735 ScopedLocalRef<jclass> jlre(env_, env_->FindClass("java/lang/RuntimeException"));
736 SetUpForTest(false, "throwException", "()V",
Elliott Hughesb264f082012-04-06 17:10:10 -0700737 reinterpret_cast<void*>(&Java_MyClassNatives_throwException));
738 // Call Java_MyClassNatives_throwException (JNI method that throws exception)
Elliott Hughesa2501992011-08-26 19:39:54 -0700739 env_->CallNonvirtualVoidMethod(jobj_, jklass_, jmethod_);
Elliott Hughesb264f082012-04-06 17:10:10 -0700740 EXPECT_EQ(1, gJava_MyClassNatives_foo_calls);
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700741 EXPECT_TRUE(env_->ExceptionCheck() == JNI_TRUE);
742 ScopedLocalRef<jthrowable> exception(env_, env_->ExceptionOccurred());
743 env_->ExceptionClear();
744 EXPECT_TRUE(env_->IsInstanceOf(exception.get(), jlre.get()));
Elliott Hughesa2501992011-08-26 19:39:54 -0700745
Ian Rogers67375ac2011-09-14 00:55:44 -0700746 // Check a single call of a JNI method is ok
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700747 SetUpForTest(false, "foo", "()V", reinterpret_cast<void*>(&Java_MyClassNatives_foo));
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700748 env_->CallNonvirtualVoidMethod(jobj_, jklass_, jmethod_);
Elliott Hughesb264f082012-04-06 17:10:10 -0700749 EXPECT_EQ(2, gJava_MyClassNatives_foo_calls);
Andreas Gampe6e498692014-08-18 16:43:12 -0700750
751 gJava_MyClassNatives_foo_calls = 0;
Ian Rogers45a76cb2011-07-21 22:00:15 -0700752}
753
Andreas Gampe6e498692014-08-18 16:43:12 -0700754JNI_TEST(ExceptionHandling)
755
Elliott Hughesb264f082012-04-06 17:10:10 -0700756jint Java_MyClassNatives_nativeUpCall(JNIEnv* env, jobject thisObj, jint i) {
Shih-wei Liaoff0f9be2011-08-29 15:43:53 -0700757 if (i <= 0) {
Andreas Gampecf4035a2014-05-28 22:43:01 -0700758 // We want to check raw Object* / Array* below
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700759 ScopedObjectAccess soa(env);
Ian Rogersaaa20802011-09-11 21:47:37 -0700760
761 // Build stack trace
Sebastien Hertzee1d79a2014-02-21 15:46:30 +0100762 jobject internal = Thread::Current()->CreateInternalStackTrace<false>(soa);
Ian Rogers53b8b092014-03-13 23:45:53 -0700763 jobjectArray ste_array = Thread::InternalStackTraceToStackTraceElementArray(soa, internal);
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800764 mirror::ObjectArray<mirror::StackTraceElement>* trace_array =
765 soa.Decode<mirror::ObjectArray<mirror::StackTraceElement>*>(ste_array);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700766 EXPECT_TRUE(trace_array != nullptr);
Shih-wei Liaoff0f9be2011-08-29 15:43:53 -0700767 EXPECT_EQ(11, trace_array->GetLength());
768
Ian Rogersaaa20802011-09-11 21:47:37 -0700769 // Check stack trace entries have expected values
Andreas Gampe277ccbd2014-11-03 21:36:10 -0800770 for (int32_t j = 0; j < trace_array->GetLength(); ++j) {
771 EXPECT_EQ(-2, trace_array->Get(j)->GetLineNumber());
772 mirror::StackTraceElement* ste = trace_array->Get(j);
Ian Rogersaaa20802011-09-11 21:47:37 -0700773 EXPECT_STREQ("MyClassNatives.java", ste->GetFileName()->ToModifiedUtf8().c_str());
Elliott Hughesb264f082012-04-06 17:10:10 -0700774 EXPECT_STREQ("MyClassNatives", ste->GetDeclaringClass()->ToModifiedUtf8().c_str());
Ian Rogersaaa20802011-09-11 21:47:37 -0700775 EXPECT_STREQ("fooI", ste->GetMethodName()->ToModifiedUtf8().c_str());
Shih-wei Liaoff0f9be2011-08-29 15:43:53 -0700776 }
Ian Rogersaaa20802011-09-11 21:47:37 -0700777
778 // end recursion
Shih-wei Liaoff0f9be2011-08-29 15:43:53 -0700779 return 0;
780 } else {
Elliott Hughesb264f082012-04-06 17:10:10 -0700781 jclass jklass = env->FindClass("MyClassNatives");
Andreas Gampecf4035a2014-05-28 22:43:01 -0700782 EXPECT_TRUE(jklass != nullptr);
Shih-wei Liaoff0f9be2011-08-29 15:43:53 -0700783 jmethodID jmethod = env->GetMethodID(jklass, "fooI", "(I)I");
Andreas Gampecf4035a2014-05-28 22:43:01 -0700784 EXPECT_TRUE(jmethod != nullptr);
Shih-wei Liaoff0f9be2011-08-29 15:43:53 -0700785
Ian Rogersaaa20802011-09-11 21:47:37 -0700786 // Recurse with i - 1
Shih-wei Liaoff0f9be2011-08-29 15:43:53 -0700787 jint result = env->CallNonvirtualIntMethod(thisObj, jklass, jmethod, i - 1);
Ian Rogersaaa20802011-09-11 21:47:37 -0700788
789 // Return sum of all depths
Shih-wei Liaoff0f9be2011-08-29 15:43:53 -0700790 return i + result;
791 }
792}
793
Andreas Gampe6e498692014-08-18 16:43:12 -0700794void JniCompilerTest::NativeStackTraceElementImpl() {
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700795 SetUpForTest(false, "fooI", "(I)I",
Elliott Hughesb264f082012-04-06 17:10:10 -0700796 reinterpret_cast<void*>(&Java_MyClassNatives_nativeUpCall));
Shih-wei Liaoff0f9be2011-08-29 15:43:53 -0700797 jint result = env_->CallNonvirtualIntMethod(jobj_, jklass_, jmethod_, 10);
Ian Rogersaaa20802011-09-11 21:47:37 -0700798 EXPECT_EQ(10+9+8+7+6+5+4+3+2+1, result);
Shih-wei Liaoff0f9be2011-08-29 15:43:53 -0700799}
800
Andreas Gampe6e498692014-08-18 16:43:12 -0700801JNI_TEST(NativeStackTraceElement)
802
Elliott Hughesb264f082012-04-06 17:10:10 -0700803jobject Java_MyClassNatives_fooO(JNIEnv* env, jobject, jobject x) {
Shih-wei Liao558788e2011-09-01 02:39:11 -0700804 return env->NewGlobalRef(x);
805}
806
Andreas Gampe6e498692014-08-18 16:43:12 -0700807void JniCompilerTest::ReturnGlobalRefImpl() {
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700808 SetUpForTest(false, "fooO", "(Ljava/lang/Object;)Ljava/lang/Object;",
Elliott Hughesb264f082012-04-06 17:10:10 -0700809 reinterpret_cast<void*>(&Java_MyClassNatives_fooO));
Shih-wei Liao558788e2011-09-01 02:39:11 -0700810 jobject result = env_->CallNonvirtualObjectMethod(jobj_, jklass_, jmethod_, jobj_);
811 EXPECT_EQ(JNILocalRefType, env_->GetObjectRefType(result));
812 EXPECT_TRUE(env_->IsSameObject(result, jobj_));
813}
814
Andreas Gampe6e498692014-08-18 16:43:12 -0700815JNI_TEST(ReturnGlobalRef)
816
Ian Rogersdc51b792011-09-22 20:41:37 -0700817jint local_ref_test(JNIEnv* env, jobject thisObj, jint x) {
818 // Add 10 local references
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700819 ScopedObjectAccess soa(env);
Ian Rogers5a7a74a2011-09-26 16:32:29 -0700820 for (int i = 0; i < 10; i++) {
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800821 soa.AddLocalReference<jobject>(soa.Decode<mirror::Object*>(thisObj));
Ian Rogersdc51b792011-09-22 20:41:37 -0700822 }
823 return x+1;
824}
825
Andreas Gampe6e498692014-08-18 16:43:12 -0700826void JniCompilerTest::LocalReferenceTableClearingTestImpl() {
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700827 SetUpForTest(false, "fooI", "(I)I", reinterpret_cast<void*>(&local_ref_test));
Ian Rogersdc51b792011-09-22 20:41:37 -0700828 // 1000 invocations of a method that adds 10 local references
Elliott Hughesb25c3f62012-03-26 16:35:06 -0700829 for (int i = 0; i < 1000; i++) {
Ian Rogersdc51b792011-09-22 20:41:37 -0700830 jint result = env_->CallIntMethod(jobj_, jmethod_, i);
831 EXPECT_TRUE(result == i + 1);
832 }
833}
834
Andreas Gampe6e498692014-08-18 16:43:12 -0700835JNI_TEST(LocalReferenceTableClearingTest)
836
Ian Rogersb9231c82011-09-05 22:13:19 -0700837void my_arraycopy(JNIEnv* env, jclass klass, jobject src, jint src_pos, jobject dst, jint dst_pos, jint length) {
838 EXPECT_TRUE(env->IsSameObject(JniCompilerTest::jklass_, klass));
839 EXPECT_TRUE(env->IsSameObject(JniCompilerTest::jklass_, dst));
Ian Rogers82f3e092011-09-05 22:54:45 -0700840 EXPECT_TRUE(env->IsSameObject(JniCompilerTest::jobj_, src));
Ian Rogersb9231c82011-09-05 22:13:19 -0700841 EXPECT_EQ(1234, src_pos);
842 EXPECT_EQ(5678, dst_pos);
843 EXPECT_EQ(9876, length);
844}
845
Andreas Gampe6e498692014-08-18 16:43:12 -0700846void JniCompilerTest::JavaLangSystemArrayCopyImpl() {
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700847 SetUpForTest(true, "arraycopy", "(Ljava/lang/Object;ILjava/lang/Object;II)V",
Ian Rogersb9231c82011-09-05 22:13:19 -0700848 reinterpret_cast<void*>(&my_arraycopy));
Ian Rogers82f3e092011-09-05 22:54:45 -0700849 env_->CallStaticVoidMethod(jklass_, jmethod_, jobj_, 1234, jklass_, 5678, 9876);
Ian Rogersb9231c82011-09-05 22:13:19 -0700850}
851
Andreas Gampe6e498692014-08-18 16:43:12 -0700852JNI_TEST(JavaLangSystemArrayCopy)
853
Ian Rogers67375ac2011-09-14 00:55:44 -0700854jboolean my_casi(JNIEnv* env, jobject unsafe, jobject obj, jlong offset, jint expected, jint newval) {
855 EXPECT_TRUE(env->IsSameObject(JniCompilerTest::jobj_, unsafe));
856 EXPECT_TRUE(env->IsSameObject(JniCompilerTest::jobj_, obj));
Ian Rogers0f678472014-03-10 16:18:37 -0700857 EXPECT_EQ(INT64_C(0x12345678ABCDEF88), offset);
Ian Rogers67375ac2011-09-14 00:55:44 -0700858 EXPECT_EQ(static_cast<jint>(0xCAFEF00D), expected);
859 EXPECT_EQ(static_cast<jint>(0xEBADF00D), newval);
860 return JNI_TRUE;
861}
862
Andreas Gampe6e498692014-08-18 16:43:12 -0700863void JniCompilerTest::CompareAndSwapIntImpl() {
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700864 SetUpForTest(false, "compareAndSwapInt", "(Ljava/lang/Object;JII)Z",
Ian Rogers67375ac2011-09-14 00:55:44 -0700865 reinterpret_cast<void*>(&my_casi));
Ian Rogers0f678472014-03-10 16:18:37 -0700866 jboolean result = env_->CallBooleanMethod(jobj_, jmethod_, jobj_, INT64_C(0x12345678ABCDEF88),
867 0xCAFEF00D, 0xEBADF00D);
Ian Rogers67375ac2011-09-14 00:55:44 -0700868 EXPECT_EQ(result, JNI_TRUE);
869}
870
Andreas Gampe6e498692014-08-18 16:43:12 -0700871JNI_TEST(CompareAndSwapInt)
872
Ian Rogersc7792842012-03-03 15:36:20 -0800873jint my_gettext(JNIEnv* env, jclass klass, jlong val1, jobject obj1, jlong val2, jobject obj2) {
874 EXPECT_TRUE(env->IsInstanceOf(JniCompilerTest::jobj_, klass));
875 EXPECT_TRUE(env->IsSameObject(JniCompilerTest::jobj_, obj1));
876 EXPECT_TRUE(env->IsSameObject(JniCompilerTest::jobj_, obj2));
877 EXPECT_EQ(0x12345678ABCDEF88ll, val1);
878 EXPECT_EQ(0x7FEDCBA987654321ll, val2);
879 return 42;
880}
881
Andreas Gampe6e498692014-08-18 16:43:12 -0700882void JniCompilerTest::GetTextImpl() {
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700883 SetUpForTest(true, "getText", "(JLjava/lang/Object;JLjava/lang/Object;)I",
Ian Rogersc7792842012-03-03 15:36:20 -0800884 reinterpret_cast<void*>(&my_gettext));
885 jint result = env_->CallStaticIntMethod(jklass_, jmethod_, 0x12345678ABCDEF88ll, jobj_,
Ian Rogers0f678472014-03-10 16:18:37 -0700886 INT64_C(0x7FEDCBA987654321), jobj_);
Ian Rogersc7792842012-03-03 15:36:20 -0800887 EXPECT_EQ(result, 42);
888}
889
Andreas Gampe6e498692014-08-18 16:43:12 -0700890JNI_TEST(GetText)
891
Vladimir Marko4e24b9d2014-07-24 17:01:58 +0100892int gJava_MyClassNatives_GetSinkProperties_calls = 0;
893jarray Java_MyClassNatives_GetSinkProperties(JNIEnv* env, jobject thisObj, jstring s) {
894 // 1 = thisObj
895 Thread* self = Thread::Current();
896 EXPECT_EQ(kNative, self->GetState());
897 Locks::mutator_lock_->AssertNotHeld(self);
898 EXPECT_EQ(self->GetJniEnv(), env);
899 EXPECT_TRUE(thisObj != nullptr);
900 EXPECT_TRUE(env->IsInstanceOf(thisObj, JniCompilerTest::jklass_));
901 EXPECT_EQ(s, nullptr);
902 gJava_MyClassNatives_GetSinkProperties_calls++;
903 ScopedObjectAccess soa(self);
904 EXPECT_EQ(2U, self->NumStackReferences());
905 EXPECT_TRUE(self->HoldsLock(soa.Decode<mirror::Object*>(thisObj)));
906 return nullptr;
907}
908
Andreas Gampe6e498692014-08-18 16:43:12 -0700909void JniCompilerTest::GetSinkPropertiesNativeImpl() {
Vladimir Marko4e24b9d2014-07-24 17:01:58 +0100910 SetUpForTest(false, "getSinkPropertiesNative", "(Ljava/lang/String;)[Ljava/lang/Object;",
911 reinterpret_cast<void*>(&Java_MyClassNatives_GetSinkProperties));
912
913 EXPECT_EQ(0, gJava_MyClassNatives_GetSinkProperties_calls);
914 jarray result = down_cast<jarray>(
915 env_->CallNonvirtualObjectMethod(jobj_, jklass_, jmethod_, nullptr));
916 EXPECT_EQ(nullptr, result);
917 EXPECT_EQ(1, gJava_MyClassNatives_GetSinkProperties_calls);
Andreas Gampe6e498692014-08-18 16:43:12 -0700918
919 gJava_MyClassNatives_GetSinkProperties_calls = 0;
Brian Carlstromfc7120c2012-08-27 13:43:25 -0700920}
921
Andreas Gampe6e498692014-08-18 16:43:12 -0700922JNI_TEST(GetSinkPropertiesNative)
923
Elliott Hughesb264f082012-04-06 17:10:10 -0700924// This should return jclass, but we're imitating a bug pattern.
925jobject Java_MyClassNatives_instanceMethodThatShouldReturnClass(JNIEnv* env, jobject) {
926 return env->NewStringUTF("not a class!");
927}
928
929// This should return jclass, but we're imitating a bug pattern.
930jobject Java_MyClassNatives_staticMethodThatShouldReturnClass(JNIEnv* env, jclass) {
931 return env->NewStringUTF("not a class!");
932}
933
Andreas Gampe6e498692014-08-18 16:43:12 -0700934void JniCompilerTest::UpcallReturnTypeChecking_InstanceImpl() {
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700935 SetUpForTest(false, "instanceMethodThatShouldReturnClass", "()Ljava/lang/Class;",
Elliott Hughesb264f082012-04-06 17:10:10 -0700936 reinterpret_cast<void*>(&Java_MyClassNatives_instanceMethodThatShouldReturnClass));
937
938 CheckJniAbortCatcher check_jni_abort_catcher;
Elliott Hughes3f6635a2012-06-19 13:37:49 -0700939 // This native method is bad, and tries to return a jstring as a jclass.
940 env_->CallObjectMethod(jobj_, jmethod_);
941 check_jni_abort_catcher.Check("attempt to return an instance of java.lang.String from java.lang.Class MyClassNatives.instanceMethodThatShouldReturnClass()");
942
943 // Here, we just call the method incorrectly; we should catch that too.
Ian Rogers68d8b422014-07-17 11:09:10 -0700944 env_->CallObjectMethod(jobj_, jmethod_);
Elliott Hughes3f6635a2012-06-19 13:37:49 -0700945 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 -0700946 env_->CallStaticObjectMethod(jklass_, jmethod_);
947 check_jni_abort_catcher.Check("calling non-static method java.lang.Class MyClassNatives.instanceMethodThatShouldReturnClass() with CallStaticObjectMethodV");
Elliott Hughesb264f082012-04-06 17:10:10 -0700948}
949
Andreas Gampe6e498692014-08-18 16:43:12 -0700950JNI_TEST(UpcallReturnTypeChecking_Instance)
951
952void JniCompilerTest::UpcallReturnTypeChecking_StaticImpl() {
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700953 SetUpForTest(true, "staticMethodThatShouldReturnClass", "()Ljava/lang/Class;",
Elliott Hughesb264f082012-04-06 17:10:10 -0700954 reinterpret_cast<void*>(&Java_MyClassNatives_staticMethodThatShouldReturnClass));
955
956 CheckJniAbortCatcher check_jni_abort_catcher;
Elliott Hughes3f6635a2012-06-19 13:37:49 -0700957 // This native method is bad, and tries to return a jstring as a jclass.
958 env_->CallStaticObjectMethod(jklass_, jmethod_);
959 check_jni_abort_catcher.Check("attempt to return an instance of java.lang.String from java.lang.Class MyClassNatives.staticMethodThatShouldReturnClass()");
960
961 // Here, we just call the method incorrectly; we should catch that too.
Ian Rogers68d8b422014-07-17 11:09:10 -0700962 env_->CallStaticObjectMethod(jklass_, jmethod_);
Elliott Hughes3f6635a2012-06-19 13:37:49 -0700963 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 -0700964 env_->CallObjectMethod(jobj_, jmethod_);
965 check_jni_abort_catcher.Check("calling static method java.lang.Class MyClassNatives.staticMethodThatShouldReturnClass() with CallObjectMethodV");
Elliott Hughesb264f082012-04-06 17:10:10 -0700966}
967
Andreas Gampe6e498692014-08-18 16:43:12 -0700968JNI_TEST(UpcallReturnTypeChecking_Static)
969
Elliott Hughesb264f082012-04-06 17:10:10 -0700970// This should take jclass, but we're imitating a bug pattern.
971void Java_MyClassNatives_instanceMethodThatShouldTakeClass(JNIEnv*, jobject, jclass) {
972}
973
974// This should take jclass, but we're imitating a bug pattern.
975void Java_MyClassNatives_staticMethodThatShouldTakeClass(JNIEnv*, jclass, jclass) {
976}
977
Andreas Gampe6e498692014-08-18 16:43:12 -0700978void JniCompilerTest::UpcallArgumentTypeChecking_InstanceImpl() {
Andreas Gampe369810a2015-01-14 19:53:31 -0800979 // This will lead to error messages in the log.
980 ScopedLogSeverity sls(LogSeverity::FATAL);
981
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700982 SetUpForTest(false, "instanceMethodThatShouldTakeClass", "(ILjava/lang/Class;)V",
Elliott Hughesb264f082012-04-06 17:10:10 -0700983 reinterpret_cast<void*>(&Java_MyClassNatives_instanceMethodThatShouldTakeClass));
984
985 CheckJniAbortCatcher check_jni_abort_catcher;
986 // We deliberately pass a bad second argument here.
987 env_->CallVoidMethod(jobj_, jmethod_, 123, env_->NewStringUTF("not a class!"));
Elliott Hughes3f6635a2012-06-19 13:37:49 -0700988 check_jni_abort_catcher.Check("bad arguments passed to void MyClassNatives.instanceMethodThatShouldTakeClass(int, java.lang.Class)");
Elliott Hughesb264f082012-04-06 17:10:10 -0700989}
990
Andreas Gampe6e498692014-08-18 16:43:12 -0700991JNI_TEST(UpcallArgumentTypeChecking_Instance)
992
993void JniCompilerTest::UpcallArgumentTypeChecking_StaticImpl() {
Andreas Gampe369810a2015-01-14 19:53:31 -0800994 // This will lead to error messages in the log.
995 ScopedLogSeverity sls(LogSeverity::FATAL);
996
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700997 SetUpForTest(true, "staticMethodThatShouldTakeClass", "(ILjava/lang/Class;)V",
Elliott Hughesb264f082012-04-06 17:10:10 -0700998 reinterpret_cast<void*>(&Java_MyClassNatives_staticMethodThatShouldTakeClass));
999
1000 CheckJniAbortCatcher check_jni_abort_catcher;
1001 // We deliberately pass a bad second argument here.
1002 env_->CallStaticVoidMethod(jklass_, jmethod_, 123, env_->NewStringUTF("not a class!"));
Elliott Hughes3f6635a2012-06-19 13:37:49 -07001003 check_jni_abort_catcher.Check("bad arguments passed to void MyClassNatives.staticMethodThatShouldTakeClass(int, java.lang.Class)");
Elliott Hughesb264f082012-04-06 17:10:10 -07001004}
1005
Andreas Gampe6e498692014-08-18 16:43:12 -07001006JNI_TEST(UpcallArgumentTypeChecking_Static)
1007
Andreas Gampe7a0e5042014-03-07 13:03:19 -08001008jfloat Java_MyClassNatives_checkFloats(JNIEnv* env, jobject thisObj, jfloat f1, jfloat f2) {
1009 EXPECT_EQ(kNative, Thread::Current()->GetState());
1010 EXPECT_EQ(Thread::Current()->GetJniEnv(), env);
Andreas Gampecf4035a2014-05-28 22:43:01 -07001011 EXPECT_TRUE(thisObj != nullptr);
Andreas Gampe7a0e5042014-03-07 13:03:19 -08001012 EXPECT_TRUE(env->IsInstanceOf(thisObj, JniCompilerTest::jklass_));
1013 ScopedObjectAccess soa(Thread::Current());
1014 EXPECT_EQ(1U, Thread::Current()->NumStackReferences());
1015 return f1 - f2; // non-commutative operator
1016}
1017
Andreas Gampe6e498692014-08-18 16:43:12 -07001018void JniCompilerTest::CompileAndRunFloatFloatMethodImpl() {
Andreas Gampe7a0e5042014-03-07 13:03:19 -08001019 SetUpForTest(false, "checkFloats", "(FF)F",
1020 reinterpret_cast<void*>(&Java_MyClassNatives_checkFloats));
1021
1022 jfloat result = env_->CallNonvirtualFloatMethod(jobj_, jklass_, jmethod_,
1023 99.0F, 10.0F);
Ian Rogers647b1a82014-10-10 11:02:11 -07001024 EXPECT_FLOAT_EQ(99.0F - 10.0F, result);
Andreas Gampe7a0e5042014-03-07 13:03:19 -08001025 jfloat a = 3.14159F;
1026 jfloat b = 0.69314F;
1027 result = env_->CallNonvirtualFloatMethod(jobj_, jklass_, jmethod_, a, b);
Ian Rogers647b1a82014-10-10 11:02:11 -07001028 EXPECT_FLOAT_EQ(a - b, result);
Andreas Gampe7a0e5042014-03-07 13:03:19 -08001029}
1030
Andreas Gampe6e498692014-08-18 16:43:12 -07001031JNI_TEST(CompileAndRunFloatFloatMethod)
1032
Ian Rogers6a3c1fc2014-10-31 00:33:20 -07001033void Java_MyClassNatives_checkParameterAlign(JNIEnv* env ATTRIBUTE_UNUSED,
1034 jobject thisObj ATTRIBUTE_UNUSED,
1035 jint i1 ATTRIBUTE_UNUSED,
1036 jlong l1 ATTRIBUTE_UNUSED) {
Andreas Gampecf4035a2014-05-28 22:43:01 -07001037// EXPECT_EQ(kNative, Thread::Current()->GetState());
1038// EXPECT_EQ(Thread::Current()->GetJniEnv(), env);
1039// EXPECT_TRUE(thisObj != nullptr);
1040// EXPECT_TRUE(env->IsInstanceOf(thisObj, JniCompilerTest::jklass_));
1041// ScopedObjectAccess soa(Thread::Current());
1042// EXPECT_EQ(1U, Thread::Current()->NumStackReferences());
Andreas Gampe7a0e5042014-03-07 13:03:19 -08001043 EXPECT_EQ(i1, 1234);
Ian Rogers0f678472014-03-10 16:18:37 -07001044 EXPECT_EQ(l1, INT64_C(0x12345678ABCDEF0));
Andreas Gampe7a0e5042014-03-07 13:03:19 -08001045}
1046
Andreas Gampe6e498692014-08-18 16:43:12 -07001047void JniCompilerTest::CheckParameterAlignImpl() {
Andreas Gampe7a0e5042014-03-07 13:03:19 -08001048 SetUpForTest(false, "checkParameterAlign", "(IJ)V",
1049 reinterpret_cast<void*>(&Java_MyClassNatives_checkParameterAlign));
1050
Ian Rogers0f678472014-03-10 16:18:37 -07001051 env_->CallNonvirtualVoidMethod(jobj_, jklass_, jmethod_, 1234, INT64_C(0x12345678ABCDEF0));
Andreas Gampe7a0e5042014-03-07 13:03:19 -08001052}
1053
Andreas Gampe6e498692014-08-18 16:43:12 -07001054JNI_TEST(CheckParameterAlign)
1055
Andreas Gampe7a0e5042014-03-07 13:03:19 -08001056void Java_MyClassNatives_maxParamNumber(JNIEnv* env, jobject thisObj,
1057 jobject o0, jobject o1, jobject o2, jobject o3, jobject o4, jobject o5, jobject o6, jobject o7,
1058 jobject o8, jobject o9, jobject o10, jobject o11, jobject o12, jobject o13, jobject o14, jobject o15,
1059 jobject o16, jobject o17, jobject o18, jobject o19, jobject o20, jobject o21, jobject o22, jobject o23,
1060 jobject o24, jobject o25, jobject o26, jobject o27, jobject o28, jobject o29, jobject o30, jobject o31,
1061 jobject o32, jobject o33, jobject o34, jobject o35, jobject o36, jobject o37, jobject o38, jobject o39,
1062 jobject o40, jobject o41, jobject o42, jobject o43, jobject o44, jobject o45, jobject o46, jobject o47,
1063 jobject o48, jobject o49, jobject o50, jobject o51, jobject o52, jobject o53, jobject o54, jobject o55,
1064 jobject o56, jobject o57, jobject o58, jobject o59, jobject o60, jobject o61, jobject o62, jobject o63,
1065 jobject o64, jobject o65, jobject o66, jobject o67, jobject o68, jobject o69, jobject o70, jobject o71,
1066 jobject o72, jobject o73, jobject o74, jobject o75, jobject o76, jobject o77, jobject o78, jobject o79,
1067 jobject o80, jobject o81, jobject o82, jobject o83, jobject o84, jobject o85, jobject o86, jobject o87,
1068 jobject o88, jobject o89, jobject o90, jobject o91, jobject o92, jobject o93, jobject o94, jobject o95,
1069 jobject o96, jobject o97, jobject o98, jobject o99, jobject o100, jobject o101, jobject o102, jobject o103,
1070 jobject o104, jobject o105, jobject o106, jobject o107, jobject o108, jobject o109, jobject o110, jobject o111,
1071 jobject o112, jobject o113, jobject o114, jobject o115, jobject o116, jobject o117, jobject o118, jobject o119,
1072 jobject o120, jobject o121, jobject o122, jobject o123, jobject o124, jobject o125, jobject o126, jobject o127,
1073 jobject o128, jobject o129, jobject o130, jobject o131, jobject o132, jobject o133, jobject o134, jobject o135,
1074 jobject o136, jobject o137, jobject o138, jobject o139, jobject o140, jobject o141, jobject o142, jobject o143,
1075 jobject o144, jobject o145, jobject o146, jobject o147, jobject o148, jobject o149, jobject o150, jobject o151,
1076 jobject o152, jobject o153, jobject o154, jobject o155, jobject o156, jobject o157, jobject o158, jobject o159,
1077 jobject o160, jobject o161, jobject o162, jobject o163, jobject o164, jobject o165, jobject o166, jobject o167,
1078 jobject o168, jobject o169, jobject o170, jobject o171, jobject o172, jobject o173, jobject o174, jobject o175,
1079 jobject o176, jobject o177, jobject o178, jobject o179, jobject o180, jobject o181, jobject o182, jobject o183,
1080 jobject o184, jobject o185, jobject o186, jobject o187, jobject o188, jobject o189, jobject o190, jobject o191,
1081 jobject o192, jobject o193, jobject o194, jobject o195, jobject o196, jobject o197, jobject o198, jobject o199,
1082 jobject o200, jobject o201, jobject o202, jobject o203, jobject o204, jobject o205, jobject o206, jobject o207,
1083 jobject o208, jobject o209, jobject o210, jobject o211, jobject o212, jobject o213, jobject o214, jobject o215,
1084 jobject o216, jobject o217, jobject o218, jobject o219, jobject o220, jobject o221, jobject o222, jobject o223,
1085 jobject o224, jobject o225, jobject o226, jobject o227, jobject o228, jobject o229, jobject o230, jobject o231,
1086 jobject o232, jobject o233, jobject o234, jobject o235, jobject o236, jobject o237, jobject o238, jobject o239,
1087 jobject o240, jobject o241, jobject o242, jobject o243, jobject o244, jobject o245, jobject o246, jobject o247,
1088 jobject o248, jobject o249, jobject o250, jobject o251, jobject o252, jobject o253) {
1089 EXPECT_EQ(kNative, Thread::Current()->GetState());
1090 EXPECT_EQ(Thread::Current()->GetJniEnv(), env);
Andreas Gampecf4035a2014-05-28 22:43:01 -07001091 EXPECT_TRUE(thisObj != nullptr);
Andreas Gampe7a0e5042014-03-07 13:03:19 -08001092 EXPECT_TRUE(env->IsInstanceOf(thisObj, JniCompilerTest::jklass_));
1093 ScopedObjectAccess soa(Thread::Current());
1094 EXPECT_GE(255U, Thread::Current()->NumStackReferences());
1095
1096 // two tests possible
1097 if (o0 == nullptr) {
1098 // 1) everything is null
1099 EXPECT_TRUE(o0 == nullptr && o1 == nullptr && o2 == nullptr && o3 == nullptr && o4 == nullptr
1100 && o5 == nullptr && o6 == nullptr && o7 == nullptr && o8 == nullptr && o9 == nullptr
1101 && o10 == nullptr && o11 == nullptr && o12 == nullptr && o13 == nullptr && o14 == nullptr
1102 && o15 == nullptr && o16 == nullptr && o17 == nullptr && o18 == nullptr && o19 == nullptr
1103 && o20 == nullptr && o21 == nullptr && o22 == nullptr && o23 == nullptr && o24 == nullptr
1104 && o25 == nullptr && o26 == nullptr && o27 == nullptr && o28 == nullptr && o29 == nullptr
1105 && o30 == nullptr && o31 == nullptr && o32 == nullptr && o33 == nullptr && o34 == nullptr
1106 && o35 == nullptr && o36 == nullptr && o37 == nullptr && o38 == nullptr && o39 == nullptr
1107 && o40 == nullptr && o41 == nullptr && o42 == nullptr && o43 == nullptr && o44 == nullptr
1108 && o45 == nullptr && o46 == nullptr && o47 == nullptr && o48 == nullptr && o49 == nullptr
1109 && o50 == nullptr && o51 == nullptr && o52 == nullptr && o53 == nullptr && o54 == nullptr
1110 && o55 == nullptr && o56 == nullptr && o57 == nullptr && o58 == nullptr && o59 == nullptr
1111 && o60 == nullptr && o61 == nullptr && o62 == nullptr && o63 == nullptr && o64 == nullptr
1112 && o65 == nullptr && o66 == nullptr && o67 == nullptr && o68 == nullptr && o69 == nullptr
1113 && o70 == nullptr && o71 == nullptr && o72 == nullptr && o73 == nullptr && o74 == nullptr
1114 && o75 == nullptr && o76 == nullptr && o77 == nullptr && o78 == nullptr && o79 == nullptr
1115 && o80 == nullptr && o81 == nullptr && o82 == nullptr && o83 == nullptr && o84 == nullptr
1116 && o85 == nullptr && o86 == nullptr && o87 == nullptr && o88 == nullptr && o89 == nullptr
1117 && o90 == nullptr && o91 == nullptr && o92 == nullptr && o93 == nullptr && o94 == nullptr
1118 && o95 == nullptr && o96 == nullptr && o97 == nullptr && o98 == nullptr && o99 == nullptr
1119 && o100 == nullptr && o101 == nullptr && o102 == nullptr && o103 == nullptr && o104 == nullptr
1120 && o105 == nullptr && o106 == nullptr && o107 == nullptr && o108 == nullptr && o109 == nullptr
1121 && o110 == nullptr && o111 == nullptr && o112 == nullptr && o113 == nullptr && o114 == nullptr
1122 && o115 == nullptr && o116 == nullptr && o117 == nullptr && o118 == nullptr && o119 == nullptr
1123 && o120 == nullptr && o121 == nullptr && o122 == nullptr && o123 == nullptr && o124 == nullptr
1124 && o125 == nullptr && o126 == nullptr && o127 == nullptr && o128 == nullptr && o129 == nullptr
1125 && o130 == nullptr && o131 == nullptr && o132 == nullptr && o133 == nullptr && o134 == nullptr
1126 && o135 == nullptr && o136 == nullptr && o137 == nullptr && o138 == nullptr && o139 == nullptr
1127 && o140 == nullptr && o141 == nullptr && o142 == nullptr && o143 == nullptr && o144 == nullptr
1128 && o145 == nullptr && o146 == nullptr && o147 == nullptr && o148 == nullptr && o149 == nullptr
1129 && o150 == nullptr && o151 == nullptr && o152 == nullptr && o153 == nullptr && o154 == nullptr
1130 && o155 == nullptr && o156 == nullptr && o157 == nullptr && o158 == nullptr && o159 == nullptr
1131 && o160 == nullptr && o161 == nullptr && o162 == nullptr && o163 == nullptr && o164 == nullptr
1132 && o165 == nullptr && o166 == nullptr && o167 == nullptr && o168 == nullptr && o169 == nullptr
1133 && o170 == nullptr && o171 == nullptr && o172 == nullptr && o173 == nullptr && o174 == nullptr
1134 && o175 == nullptr && o176 == nullptr && o177 == nullptr && o178 == nullptr && o179 == nullptr
1135 && o180 == nullptr && o181 == nullptr && o182 == nullptr && o183 == nullptr && o184 == nullptr
1136 && o185 == nullptr && o186 == nullptr && o187 == nullptr && o188 == nullptr && o189 == nullptr
1137 && o190 == nullptr && o191 == nullptr && o192 == nullptr && o193 == nullptr && o194 == nullptr
1138 && o195 == nullptr && o196 == nullptr && o197 == nullptr && o198 == nullptr && o199 == nullptr
1139 && o200 == nullptr && o201 == nullptr && o202 == nullptr && o203 == nullptr && o204 == nullptr
1140 && o205 == nullptr && o206 == nullptr && o207 == nullptr && o208 == nullptr && o209 == nullptr
1141 && o210 == nullptr && o211 == nullptr && o212 == nullptr && o213 == nullptr && o214 == nullptr
1142 && o215 == nullptr && o216 == nullptr && o217 == nullptr && o218 == nullptr && o219 == nullptr
1143 && o220 == nullptr && o221 == nullptr && o222 == nullptr && o223 == nullptr && o224 == nullptr
1144 && o225 == nullptr && o226 == nullptr && o227 == nullptr && o228 == nullptr && o229 == nullptr
1145 && o230 == nullptr && o231 == nullptr && o232 == nullptr && o233 == nullptr && o234 == nullptr
1146 && o235 == nullptr && o236 == nullptr && o237 == nullptr && o238 == nullptr && o239 == nullptr
1147 && o240 == nullptr && o241 == nullptr && o242 == nullptr && o243 == nullptr && o244 == nullptr
1148 && o245 == nullptr && o246 == nullptr && o247 == nullptr && o248 == nullptr && o249 == nullptr
1149 && o250 == nullptr && o251 == nullptr && o252 == nullptr && o253 == nullptr);
1150 } else {
1151 EXPECT_EQ(0, env->GetArrayLength(reinterpret_cast<jarray>(o0)));
1152 EXPECT_EQ(1, env->GetArrayLength(reinterpret_cast<jarray>(o1)));
1153 EXPECT_EQ(2, env->GetArrayLength(reinterpret_cast<jarray>(o2)));
1154 EXPECT_EQ(3, env->GetArrayLength(reinterpret_cast<jarray>(o3)));
1155 EXPECT_EQ(4, env->GetArrayLength(reinterpret_cast<jarray>(o4)));
1156 EXPECT_EQ(5, env->GetArrayLength(reinterpret_cast<jarray>(o5)));
1157 EXPECT_EQ(6, env->GetArrayLength(reinterpret_cast<jarray>(o6)));
1158 EXPECT_EQ(7, env->GetArrayLength(reinterpret_cast<jarray>(o7)));
1159 EXPECT_EQ(8, env->GetArrayLength(reinterpret_cast<jarray>(o8)));
1160 EXPECT_EQ(9, env->GetArrayLength(reinterpret_cast<jarray>(o9)));
1161 EXPECT_EQ(10, env->GetArrayLength(reinterpret_cast<jarray>(o10)));
1162 EXPECT_EQ(11, env->GetArrayLength(reinterpret_cast<jarray>(o11)));
1163 EXPECT_EQ(12, env->GetArrayLength(reinterpret_cast<jarray>(o12)));
1164 EXPECT_EQ(13, env->GetArrayLength(reinterpret_cast<jarray>(o13)));
1165 EXPECT_EQ(14, env->GetArrayLength(reinterpret_cast<jarray>(o14)));
1166 EXPECT_EQ(15, env->GetArrayLength(reinterpret_cast<jarray>(o15)));
1167 EXPECT_EQ(16, env->GetArrayLength(reinterpret_cast<jarray>(o16)));
1168 EXPECT_EQ(17, env->GetArrayLength(reinterpret_cast<jarray>(o17)));
1169 EXPECT_EQ(18, env->GetArrayLength(reinterpret_cast<jarray>(o18)));
1170 EXPECT_EQ(19, env->GetArrayLength(reinterpret_cast<jarray>(o19)));
1171 EXPECT_EQ(20, env->GetArrayLength(reinterpret_cast<jarray>(o20)));
1172 EXPECT_EQ(21, env->GetArrayLength(reinterpret_cast<jarray>(o21)));
1173 EXPECT_EQ(22, env->GetArrayLength(reinterpret_cast<jarray>(o22)));
1174 EXPECT_EQ(23, env->GetArrayLength(reinterpret_cast<jarray>(o23)));
1175 EXPECT_EQ(24, env->GetArrayLength(reinterpret_cast<jarray>(o24)));
1176 EXPECT_EQ(25, env->GetArrayLength(reinterpret_cast<jarray>(o25)));
1177 EXPECT_EQ(26, env->GetArrayLength(reinterpret_cast<jarray>(o26)));
1178 EXPECT_EQ(27, env->GetArrayLength(reinterpret_cast<jarray>(o27)));
1179 EXPECT_EQ(28, env->GetArrayLength(reinterpret_cast<jarray>(o28)));
1180 EXPECT_EQ(29, env->GetArrayLength(reinterpret_cast<jarray>(o29)));
1181 EXPECT_EQ(30, env->GetArrayLength(reinterpret_cast<jarray>(o30)));
1182 EXPECT_EQ(31, env->GetArrayLength(reinterpret_cast<jarray>(o31)));
1183 EXPECT_EQ(32, env->GetArrayLength(reinterpret_cast<jarray>(o32)));
1184 EXPECT_EQ(33, env->GetArrayLength(reinterpret_cast<jarray>(o33)));
1185 EXPECT_EQ(34, env->GetArrayLength(reinterpret_cast<jarray>(o34)));
1186 EXPECT_EQ(35, env->GetArrayLength(reinterpret_cast<jarray>(o35)));
1187 EXPECT_EQ(36, env->GetArrayLength(reinterpret_cast<jarray>(o36)));
1188 EXPECT_EQ(37, env->GetArrayLength(reinterpret_cast<jarray>(o37)));
1189 EXPECT_EQ(38, env->GetArrayLength(reinterpret_cast<jarray>(o38)));
1190 EXPECT_EQ(39, env->GetArrayLength(reinterpret_cast<jarray>(o39)));
1191 EXPECT_EQ(40, env->GetArrayLength(reinterpret_cast<jarray>(o40)));
1192 EXPECT_EQ(41, env->GetArrayLength(reinterpret_cast<jarray>(o41)));
1193 EXPECT_EQ(42, env->GetArrayLength(reinterpret_cast<jarray>(o42)));
1194 EXPECT_EQ(43, env->GetArrayLength(reinterpret_cast<jarray>(o43)));
1195 EXPECT_EQ(44, env->GetArrayLength(reinterpret_cast<jarray>(o44)));
1196 EXPECT_EQ(45, env->GetArrayLength(reinterpret_cast<jarray>(o45)));
1197 EXPECT_EQ(46, env->GetArrayLength(reinterpret_cast<jarray>(o46)));
1198 EXPECT_EQ(47, env->GetArrayLength(reinterpret_cast<jarray>(o47)));
1199 EXPECT_EQ(48, env->GetArrayLength(reinterpret_cast<jarray>(o48)));
1200 EXPECT_EQ(49, env->GetArrayLength(reinterpret_cast<jarray>(o49)));
1201 EXPECT_EQ(50, env->GetArrayLength(reinterpret_cast<jarray>(o50)));
1202 EXPECT_EQ(51, env->GetArrayLength(reinterpret_cast<jarray>(o51)));
1203 EXPECT_EQ(52, env->GetArrayLength(reinterpret_cast<jarray>(o52)));
1204 EXPECT_EQ(53, env->GetArrayLength(reinterpret_cast<jarray>(o53)));
1205 EXPECT_EQ(54, env->GetArrayLength(reinterpret_cast<jarray>(o54)));
1206 EXPECT_EQ(55, env->GetArrayLength(reinterpret_cast<jarray>(o55)));
1207 EXPECT_EQ(56, env->GetArrayLength(reinterpret_cast<jarray>(o56)));
1208 EXPECT_EQ(57, env->GetArrayLength(reinterpret_cast<jarray>(o57)));
1209 EXPECT_EQ(58, env->GetArrayLength(reinterpret_cast<jarray>(o58)));
1210 EXPECT_EQ(59, env->GetArrayLength(reinterpret_cast<jarray>(o59)));
1211 EXPECT_EQ(60, env->GetArrayLength(reinterpret_cast<jarray>(o60)));
1212 EXPECT_EQ(61, env->GetArrayLength(reinterpret_cast<jarray>(o61)));
1213 EXPECT_EQ(62, env->GetArrayLength(reinterpret_cast<jarray>(o62)));
1214 EXPECT_EQ(63, env->GetArrayLength(reinterpret_cast<jarray>(o63)));
1215 EXPECT_EQ(64, env->GetArrayLength(reinterpret_cast<jarray>(o64)));
1216 EXPECT_EQ(65, env->GetArrayLength(reinterpret_cast<jarray>(o65)));
1217 EXPECT_EQ(66, env->GetArrayLength(reinterpret_cast<jarray>(o66)));
1218 EXPECT_EQ(67, env->GetArrayLength(reinterpret_cast<jarray>(o67)));
1219 EXPECT_EQ(68, env->GetArrayLength(reinterpret_cast<jarray>(o68)));
1220 EXPECT_EQ(69, env->GetArrayLength(reinterpret_cast<jarray>(o69)));
1221 EXPECT_EQ(70, env->GetArrayLength(reinterpret_cast<jarray>(o70)));
1222 EXPECT_EQ(71, env->GetArrayLength(reinterpret_cast<jarray>(o71)));
1223 EXPECT_EQ(72, env->GetArrayLength(reinterpret_cast<jarray>(o72)));
1224 EXPECT_EQ(73, env->GetArrayLength(reinterpret_cast<jarray>(o73)));
1225 EXPECT_EQ(74, env->GetArrayLength(reinterpret_cast<jarray>(o74)));
1226 EXPECT_EQ(75, env->GetArrayLength(reinterpret_cast<jarray>(o75)));
1227 EXPECT_EQ(76, env->GetArrayLength(reinterpret_cast<jarray>(o76)));
1228 EXPECT_EQ(77, env->GetArrayLength(reinterpret_cast<jarray>(o77)));
1229 EXPECT_EQ(78, env->GetArrayLength(reinterpret_cast<jarray>(o78)));
1230 EXPECT_EQ(79, env->GetArrayLength(reinterpret_cast<jarray>(o79)));
1231 EXPECT_EQ(80, env->GetArrayLength(reinterpret_cast<jarray>(o80)));
1232 EXPECT_EQ(81, env->GetArrayLength(reinterpret_cast<jarray>(o81)));
1233 EXPECT_EQ(82, env->GetArrayLength(reinterpret_cast<jarray>(o82)));
1234 EXPECT_EQ(83, env->GetArrayLength(reinterpret_cast<jarray>(o83)));
1235 EXPECT_EQ(84, env->GetArrayLength(reinterpret_cast<jarray>(o84)));
1236 EXPECT_EQ(85, env->GetArrayLength(reinterpret_cast<jarray>(o85)));
1237 EXPECT_EQ(86, env->GetArrayLength(reinterpret_cast<jarray>(o86)));
1238 EXPECT_EQ(87, env->GetArrayLength(reinterpret_cast<jarray>(o87)));
1239 EXPECT_EQ(88, env->GetArrayLength(reinterpret_cast<jarray>(o88)));
1240 EXPECT_EQ(89, env->GetArrayLength(reinterpret_cast<jarray>(o89)));
1241 EXPECT_EQ(90, env->GetArrayLength(reinterpret_cast<jarray>(o90)));
1242 EXPECT_EQ(91, env->GetArrayLength(reinterpret_cast<jarray>(o91)));
1243 EXPECT_EQ(92, env->GetArrayLength(reinterpret_cast<jarray>(o92)));
1244 EXPECT_EQ(93, env->GetArrayLength(reinterpret_cast<jarray>(o93)));
1245 EXPECT_EQ(94, env->GetArrayLength(reinterpret_cast<jarray>(o94)));
1246 EXPECT_EQ(95, env->GetArrayLength(reinterpret_cast<jarray>(o95)));
1247 EXPECT_EQ(96, env->GetArrayLength(reinterpret_cast<jarray>(o96)));
1248 EXPECT_EQ(97, env->GetArrayLength(reinterpret_cast<jarray>(o97)));
1249 EXPECT_EQ(98, env->GetArrayLength(reinterpret_cast<jarray>(o98)));
1250 EXPECT_EQ(99, env->GetArrayLength(reinterpret_cast<jarray>(o99)));
1251 EXPECT_EQ(100, env->GetArrayLength(reinterpret_cast<jarray>(o100)));
1252 EXPECT_EQ(101, env->GetArrayLength(reinterpret_cast<jarray>(o101)));
1253 EXPECT_EQ(102, env->GetArrayLength(reinterpret_cast<jarray>(o102)));
1254 EXPECT_EQ(103, env->GetArrayLength(reinterpret_cast<jarray>(o103)));
1255 EXPECT_EQ(104, env->GetArrayLength(reinterpret_cast<jarray>(o104)));
1256 EXPECT_EQ(105, env->GetArrayLength(reinterpret_cast<jarray>(o105)));
1257 EXPECT_EQ(106, env->GetArrayLength(reinterpret_cast<jarray>(o106)));
1258 EXPECT_EQ(107, env->GetArrayLength(reinterpret_cast<jarray>(o107)));
1259 EXPECT_EQ(108, env->GetArrayLength(reinterpret_cast<jarray>(o108)));
1260 EXPECT_EQ(109, env->GetArrayLength(reinterpret_cast<jarray>(o109)));
1261 EXPECT_EQ(110, env->GetArrayLength(reinterpret_cast<jarray>(o110)));
1262 EXPECT_EQ(111, env->GetArrayLength(reinterpret_cast<jarray>(o111)));
1263 EXPECT_EQ(112, env->GetArrayLength(reinterpret_cast<jarray>(o112)));
1264 EXPECT_EQ(113, env->GetArrayLength(reinterpret_cast<jarray>(o113)));
1265 EXPECT_EQ(114, env->GetArrayLength(reinterpret_cast<jarray>(o114)));
1266 EXPECT_EQ(115, env->GetArrayLength(reinterpret_cast<jarray>(o115)));
1267 EXPECT_EQ(116, env->GetArrayLength(reinterpret_cast<jarray>(o116)));
1268 EXPECT_EQ(117, env->GetArrayLength(reinterpret_cast<jarray>(o117)));
1269 EXPECT_EQ(118, env->GetArrayLength(reinterpret_cast<jarray>(o118)));
1270 EXPECT_EQ(119, env->GetArrayLength(reinterpret_cast<jarray>(o119)));
1271 EXPECT_EQ(120, env->GetArrayLength(reinterpret_cast<jarray>(o120)));
1272 EXPECT_EQ(121, env->GetArrayLength(reinterpret_cast<jarray>(o121)));
1273 EXPECT_EQ(122, env->GetArrayLength(reinterpret_cast<jarray>(o122)));
1274 EXPECT_EQ(123, env->GetArrayLength(reinterpret_cast<jarray>(o123)));
1275 EXPECT_EQ(124, env->GetArrayLength(reinterpret_cast<jarray>(o124)));
1276 EXPECT_EQ(125, env->GetArrayLength(reinterpret_cast<jarray>(o125)));
1277 EXPECT_EQ(126, env->GetArrayLength(reinterpret_cast<jarray>(o126)));
1278 EXPECT_EQ(127, env->GetArrayLength(reinterpret_cast<jarray>(o127)));
1279 EXPECT_EQ(128, env->GetArrayLength(reinterpret_cast<jarray>(o128)));
1280 EXPECT_EQ(129, env->GetArrayLength(reinterpret_cast<jarray>(o129)));
1281 EXPECT_EQ(130, env->GetArrayLength(reinterpret_cast<jarray>(o130)));
1282 EXPECT_EQ(131, env->GetArrayLength(reinterpret_cast<jarray>(o131)));
1283 EXPECT_EQ(132, env->GetArrayLength(reinterpret_cast<jarray>(o132)));
1284 EXPECT_EQ(133, env->GetArrayLength(reinterpret_cast<jarray>(o133)));
1285 EXPECT_EQ(134, env->GetArrayLength(reinterpret_cast<jarray>(o134)));
1286 EXPECT_EQ(135, env->GetArrayLength(reinterpret_cast<jarray>(o135)));
1287 EXPECT_EQ(136, env->GetArrayLength(reinterpret_cast<jarray>(o136)));
1288 EXPECT_EQ(137, env->GetArrayLength(reinterpret_cast<jarray>(o137)));
1289 EXPECT_EQ(138, env->GetArrayLength(reinterpret_cast<jarray>(o138)));
1290 EXPECT_EQ(139, env->GetArrayLength(reinterpret_cast<jarray>(o139)));
1291 EXPECT_EQ(140, env->GetArrayLength(reinterpret_cast<jarray>(o140)));
1292 EXPECT_EQ(141, env->GetArrayLength(reinterpret_cast<jarray>(o141)));
1293 EXPECT_EQ(142, env->GetArrayLength(reinterpret_cast<jarray>(o142)));
1294 EXPECT_EQ(143, env->GetArrayLength(reinterpret_cast<jarray>(o143)));
1295 EXPECT_EQ(144, env->GetArrayLength(reinterpret_cast<jarray>(o144)));
1296 EXPECT_EQ(145, env->GetArrayLength(reinterpret_cast<jarray>(o145)));
1297 EXPECT_EQ(146, env->GetArrayLength(reinterpret_cast<jarray>(o146)));
1298 EXPECT_EQ(147, env->GetArrayLength(reinterpret_cast<jarray>(o147)));
1299 EXPECT_EQ(148, env->GetArrayLength(reinterpret_cast<jarray>(o148)));
1300 EXPECT_EQ(149, env->GetArrayLength(reinterpret_cast<jarray>(o149)));
1301 EXPECT_EQ(150, env->GetArrayLength(reinterpret_cast<jarray>(o150)));
1302 EXPECT_EQ(151, env->GetArrayLength(reinterpret_cast<jarray>(o151)));
1303 EXPECT_EQ(152, env->GetArrayLength(reinterpret_cast<jarray>(o152)));
1304 EXPECT_EQ(153, env->GetArrayLength(reinterpret_cast<jarray>(o153)));
1305 EXPECT_EQ(154, env->GetArrayLength(reinterpret_cast<jarray>(o154)));
1306 EXPECT_EQ(155, env->GetArrayLength(reinterpret_cast<jarray>(o155)));
1307 EXPECT_EQ(156, env->GetArrayLength(reinterpret_cast<jarray>(o156)));
1308 EXPECT_EQ(157, env->GetArrayLength(reinterpret_cast<jarray>(o157)));
1309 EXPECT_EQ(158, env->GetArrayLength(reinterpret_cast<jarray>(o158)));
1310 EXPECT_EQ(159, env->GetArrayLength(reinterpret_cast<jarray>(o159)));
1311 EXPECT_EQ(160, env->GetArrayLength(reinterpret_cast<jarray>(o160)));
1312 EXPECT_EQ(161, env->GetArrayLength(reinterpret_cast<jarray>(o161)));
1313 EXPECT_EQ(162, env->GetArrayLength(reinterpret_cast<jarray>(o162)));
1314 EXPECT_EQ(163, env->GetArrayLength(reinterpret_cast<jarray>(o163)));
1315 EXPECT_EQ(164, env->GetArrayLength(reinterpret_cast<jarray>(o164)));
1316 EXPECT_EQ(165, env->GetArrayLength(reinterpret_cast<jarray>(o165)));
1317 EXPECT_EQ(166, env->GetArrayLength(reinterpret_cast<jarray>(o166)));
1318 EXPECT_EQ(167, env->GetArrayLength(reinterpret_cast<jarray>(o167)));
1319 EXPECT_EQ(168, env->GetArrayLength(reinterpret_cast<jarray>(o168)));
1320 EXPECT_EQ(169, env->GetArrayLength(reinterpret_cast<jarray>(o169)));
1321 EXPECT_EQ(170, env->GetArrayLength(reinterpret_cast<jarray>(o170)));
1322 EXPECT_EQ(171, env->GetArrayLength(reinterpret_cast<jarray>(o171)));
1323 EXPECT_EQ(172, env->GetArrayLength(reinterpret_cast<jarray>(o172)));
1324 EXPECT_EQ(173, env->GetArrayLength(reinterpret_cast<jarray>(o173)));
1325 EXPECT_EQ(174, env->GetArrayLength(reinterpret_cast<jarray>(o174)));
1326 EXPECT_EQ(175, env->GetArrayLength(reinterpret_cast<jarray>(o175)));
1327 EXPECT_EQ(176, env->GetArrayLength(reinterpret_cast<jarray>(o176)));
1328 EXPECT_EQ(177, env->GetArrayLength(reinterpret_cast<jarray>(o177)));
1329 EXPECT_EQ(178, env->GetArrayLength(reinterpret_cast<jarray>(o178)));
1330 EXPECT_EQ(179, env->GetArrayLength(reinterpret_cast<jarray>(o179)));
1331 EXPECT_EQ(180, env->GetArrayLength(reinterpret_cast<jarray>(o180)));
1332 EXPECT_EQ(181, env->GetArrayLength(reinterpret_cast<jarray>(o181)));
1333 EXPECT_EQ(182, env->GetArrayLength(reinterpret_cast<jarray>(o182)));
1334 EXPECT_EQ(183, env->GetArrayLength(reinterpret_cast<jarray>(o183)));
1335 EXPECT_EQ(184, env->GetArrayLength(reinterpret_cast<jarray>(o184)));
1336 EXPECT_EQ(185, env->GetArrayLength(reinterpret_cast<jarray>(o185)));
1337 EXPECT_EQ(186, env->GetArrayLength(reinterpret_cast<jarray>(o186)));
1338 EXPECT_EQ(187, env->GetArrayLength(reinterpret_cast<jarray>(o187)));
1339 EXPECT_EQ(188, env->GetArrayLength(reinterpret_cast<jarray>(o188)));
1340 EXPECT_EQ(189, env->GetArrayLength(reinterpret_cast<jarray>(o189)));
1341 EXPECT_EQ(190, env->GetArrayLength(reinterpret_cast<jarray>(o190)));
1342 EXPECT_EQ(191, env->GetArrayLength(reinterpret_cast<jarray>(o191)));
1343 EXPECT_EQ(192, env->GetArrayLength(reinterpret_cast<jarray>(o192)));
1344 EXPECT_EQ(193, env->GetArrayLength(reinterpret_cast<jarray>(o193)));
1345 EXPECT_EQ(194, env->GetArrayLength(reinterpret_cast<jarray>(o194)));
1346 EXPECT_EQ(195, env->GetArrayLength(reinterpret_cast<jarray>(o195)));
1347 EXPECT_EQ(196, env->GetArrayLength(reinterpret_cast<jarray>(o196)));
1348 EXPECT_EQ(197, env->GetArrayLength(reinterpret_cast<jarray>(o197)));
1349 EXPECT_EQ(198, env->GetArrayLength(reinterpret_cast<jarray>(o198)));
1350 EXPECT_EQ(199, env->GetArrayLength(reinterpret_cast<jarray>(o199)));
1351 EXPECT_EQ(200, env->GetArrayLength(reinterpret_cast<jarray>(o200)));
1352 EXPECT_EQ(201, env->GetArrayLength(reinterpret_cast<jarray>(o201)));
1353 EXPECT_EQ(202, env->GetArrayLength(reinterpret_cast<jarray>(o202)));
1354 EXPECT_EQ(203, env->GetArrayLength(reinterpret_cast<jarray>(o203)));
1355 EXPECT_EQ(204, env->GetArrayLength(reinterpret_cast<jarray>(o204)));
1356 EXPECT_EQ(205, env->GetArrayLength(reinterpret_cast<jarray>(o205)));
1357 EXPECT_EQ(206, env->GetArrayLength(reinterpret_cast<jarray>(o206)));
1358 EXPECT_EQ(207, env->GetArrayLength(reinterpret_cast<jarray>(o207)));
1359 EXPECT_EQ(208, env->GetArrayLength(reinterpret_cast<jarray>(o208)));
1360 EXPECT_EQ(209, env->GetArrayLength(reinterpret_cast<jarray>(o209)));
1361 EXPECT_EQ(210, env->GetArrayLength(reinterpret_cast<jarray>(o210)));
1362 EXPECT_EQ(211, env->GetArrayLength(reinterpret_cast<jarray>(o211)));
1363 EXPECT_EQ(212, env->GetArrayLength(reinterpret_cast<jarray>(o212)));
1364 EXPECT_EQ(213, env->GetArrayLength(reinterpret_cast<jarray>(o213)));
1365 EXPECT_EQ(214, env->GetArrayLength(reinterpret_cast<jarray>(o214)));
1366 EXPECT_EQ(215, env->GetArrayLength(reinterpret_cast<jarray>(o215)));
1367 EXPECT_EQ(216, env->GetArrayLength(reinterpret_cast<jarray>(o216)));
1368 EXPECT_EQ(217, env->GetArrayLength(reinterpret_cast<jarray>(o217)));
1369 EXPECT_EQ(218, env->GetArrayLength(reinterpret_cast<jarray>(o218)));
1370 EXPECT_EQ(219, env->GetArrayLength(reinterpret_cast<jarray>(o219)));
1371 EXPECT_EQ(220, env->GetArrayLength(reinterpret_cast<jarray>(o220)));
1372 EXPECT_EQ(221, env->GetArrayLength(reinterpret_cast<jarray>(o221)));
1373 EXPECT_EQ(222, env->GetArrayLength(reinterpret_cast<jarray>(o222)));
1374 EXPECT_EQ(223, env->GetArrayLength(reinterpret_cast<jarray>(o223)));
1375 EXPECT_EQ(224, env->GetArrayLength(reinterpret_cast<jarray>(o224)));
1376 EXPECT_EQ(225, env->GetArrayLength(reinterpret_cast<jarray>(o225)));
1377 EXPECT_EQ(226, env->GetArrayLength(reinterpret_cast<jarray>(o226)));
1378 EXPECT_EQ(227, env->GetArrayLength(reinterpret_cast<jarray>(o227)));
1379 EXPECT_EQ(228, env->GetArrayLength(reinterpret_cast<jarray>(o228)));
1380 EXPECT_EQ(229, env->GetArrayLength(reinterpret_cast<jarray>(o229)));
1381 EXPECT_EQ(230, env->GetArrayLength(reinterpret_cast<jarray>(o230)));
1382 EXPECT_EQ(231, env->GetArrayLength(reinterpret_cast<jarray>(o231)));
1383 EXPECT_EQ(232, env->GetArrayLength(reinterpret_cast<jarray>(o232)));
1384 EXPECT_EQ(233, env->GetArrayLength(reinterpret_cast<jarray>(o233)));
1385 EXPECT_EQ(234, env->GetArrayLength(reinterpret_cast<jarray>(o234)));
1386 EXPECT_EQ(235, env->GetArrayLength(reinterpret_cast<jarray>(o235)));
1387 EXPECT_EQ(236, env->GetArrayLength(reinterpret_cast<jarray>(o236)));
1388 EXPECT_EQ(237, env->GetArrayLength(reinterpret_cast<jarray>(o237)));
1389 EXPECT_EQ(238, env->GetArrayLength(reinterpret_cast<jarray>(o238)));
1390 EXPECT_EQ(239, env->GetArrayLength(reinterpret_cast<jarray>(o239)));
1391 EXPECT_EQ(240, env->GetArrayLength(reinterpret_cast<jarray>(o240)));
1392 EXPECT_EQ(241, env->GetArrayLength(reinterpret_cast<jarray>(o241)));
1393 EXPECT_EQ(242, env->GetArrayLength(reinterpret_cast<jarray>(o242)));
1394 EXPECT_EQ(243, env->GetArrayLength(reinterpret_cast<jarray>(o243)));
1395 EXPECT_EQ(244, env->GetArrayLength(reinterpret_cast<jarray>(o244)));
1396 EXPECT_EQ(245, env->GetArrayLength(reinterpret_cast<jarray>(o245)));
1397 EXPECT_EQ(246, env->GetArrayLength(reinterpret_cast<jarray>(o246)));
1398 EXPECT_EQ(247, env->GetArrayLength(reinterpret_cast<jarray>(o247)));
1399 EXPECT_EQ(248, env->GetArrayLength(reinterpret_cast<jarray>(o248)));
1400 EXPECT_EQ(249, env->GetArrayLength(reinterpret_cast<jarray>(o249)));
1401 EXPECT_EQ(250, env->GetArrayLength(reinterpret_cast<jarray>(o250)));
1402 EXPECT_EQ(251, env->GetArrayLength(reinterpret_cast<jarray>(o251)));
1403 EXPECT_EQ(252, env->GetArrayLength(reinterpret_cast<jarray>(o252)));
1404 EXPECT_EQ(253, env->GetArrayLength(reinterpret_cast<jarray>(o253)));
1405 }
1406}
1407
1408const char* longSig =
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;Ljava/lang/Object;"
1458 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1459 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)V";
1460
Andreas Gampe6e498692014-08-18 16:43:12 -07001461void JniCompilerTest::MaxParamNumberImpl() {
Andreas Gampe7a0e5042014-03-07 13:03:19 -08001462 SetUpForTest(false, "maxParamNumber", longSig,
1463 reinterpret_cast<void*>(&Java_MyClassNatives_maxParamNumber));
1464
1465 jvalue args[254];
1466
1467 // First test: test with all arguments null.
1468 for (int i = 0; i < 254; ++i) {
1469 args[i].l = nullptr;
1470 }
1471
1472 env_->CallNonvirtualVoidMethodA(jobj_, jklass_, jmethod_, args);
1473
1474 // Second test: test with int[] objects with increasing lengths
1475 for (int i = 0; i < 254; ++i) {
1476 jintArray tmp = env_->NewIntArray(i);
1477 args[i].l = tmp;
1478 EXPECT_NE(args[i].l, nullptr);
1479 }
1480
1481 env_->CallNonvirtualVoidMethodA(jobj_, jklass_, jmethod_, args);
1482}
1483
Andreas Gampe6e498692014-08-18 16:43:12 -07001484JNI_TEST(MaxParamNumber)
1485
1486void JniCompilerTest::WithoutImplementationImpl() {
Andreas Gampe369810a2015-01-14 19:53:31 -08001487 // This will lead to error messages in the log.
1488 ScopedLogSeverity sls(LogSeverity::FATAL);
1489
Andreas Gampead615172014-04-04 16:20:13 -07001490 SetUpForTest(false, "withoutImplementation", "()V", nullptr);
1491
1492 env_->CallVoidMethod(jobj_, jmethod_);
1493
1494 EXPECT_TRUE(Thread::Current()->IsExceptionPending());
1495 EXPECT_TRUE(env_->ExceptionCheck() == JNI_TRUE);
1496}
1497
Andreas Gampe6e498692014-08-18 16:43:12 -07001498JNI_TEST(WithoutImplementation)
1499
Andreas Gampe48ee3562015-04-10 19:57:29 -07001500void JniCompilerTest::WithoutImplementationRefReturnImpl() {
1501 // This will lead to error messages in the log.
1502 ScopedLogSeverity sls(LogSeverity::FATAL);
1503
1504 SetUpForTest(false, "withoutImplementationRefReturn", "()Ljava/lang/Object;", nullptr);
1505
1506 env_->CallObjectMethod(jobj_, jmethod_);
1507
1508 EXPECT_TRUE(Thread::Current()->IsExceptionPending());
1509 EXPECT_TRUE(env_->ExceptionCheck() == JNI_TRUE);
1510}
1511
1512JNI_TEST(WithoutImplementationRefReturn)
1513
Ian Rogers6a3c1fc2014-10-31 00:33:20 -07001514void Java_MyClassNatives_stackArgsIntsFirst(JNIEnv*, jclass, jint i1, jint i2, jint i3,
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001515 jint i4, jint i5, jint i6, jint i7, jint i8, jint i9,
1516 jint i10, jfloat f1, jfloat f2, jfloat f3, jfloat f4,
1517 jfloat f5, jfloat f6, jfloat f7, jfloat f8, jfloat f9,
1518 jfloat f10) {
1519 EXPECT_EQ(i1, 1);
1520 EXPECT_EQ(i2, 2);
1521 EXPECT_EQ(i3, 3);
1522 EXPECT_EQ(i4, 4);
1523 EXPECT_EQ(i5, 5);
1524 EXPECT_EQ(i6, 6);
1525 EXPECT_EQ(i7, 7);
1526 EXPECT_EQ(i8, 8);
1527 EXPECT_EQ(i9, 9);
1528 EXPECT_EQ(i10, 10);
1529
Roland Levillainda4d79b2015-03-24 14:36:11 +00001530 jint i11 = bit_cast<jint, jfloat>(f1);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001531 EXPECT_EQ(i11, 11);
Roland Levillainda4d79b2015-03-24 14:36:11 +00001532 jint i12 = bit_cast<jint, jfloat>(f2);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001533 EXPECT_EQ(i12, 12);
Roland Levillainda4d79b2015-03-24 14:36:11 +00001534 jint i13 = bit_cast<jint, jfloat>(f3);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001535 EXPECT_EQ(i13, 13);
Roland Levillainda4d79b2015-03-24 14:36:11 +00001536 jint i14 = bit_cast<jint, jfloat>(f4);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001537 EXPECT_EQ(i14, 14);
Roland Levillainda4d79b2015-03-24 14:36:11 +00001538 jint i15 = bit_cast<jint, jfloat>(f5);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001539 EXPECT_EQ(i15, 15);
Roland Levillainda4d79b2015-03-24 14:36:11 +00001540 jint i16 = bit_cast<jint, jfloat>(f6);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001541 EXPECT_EQ(i16, 16);
Roland Levillainda4d79b2015-03-24 14:36:11 +00001542 jint i17 = bit_cast<jint, jfloat>(f7);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001543 EXPECT_EQ(i17, 17);
Roland Levillainda4d79b2015-03-24 14:36:11 +00001544 jint i18 = bit_cast<jint, jfloat>(f8);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001545 EXPECT_EQ(i18, 18);
Roland Levillainda4d79b2015-03-24 14:36:11 +00001546 jint i19 = bit_cast<jint, jfloat>(f9);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001547 EXPECT_EQ(i19, 19);
Roland Levillainda4d79b2015-03-24 14:36:11 +00001548 jint i20 = bit_cast<jint, jfloat>(f10);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001549 EXPECT_EQ(i20, 20);
1550}
1551
Andreas Gampe6e498692014-08-18 16:43:12 -07001552void JniCompilerTest::StackArgsIntsFirstImpl() {
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001553 SetUpForTest(true, "stackArgsIntsFirst", "(IIIIIIIIIIFFFFFFFFFF)V",
1554 reinterpret_cast<void*>(&Java_MyClassNatives_stackArgsIntsFirst));
1555
1556 jint i1 = 1;
1557 jint i2 = 2;
1558 jint i3 = 3;
1559 jint i4 = 4;
1560 jint i5 = 5;
1561 jint i6 = 6;
1562 jint i7 = 7;
1563 jint i8 = 8;
1564 jint i9 = 9;
1565 jint i10 = 10;
1566
Roland Levillainda4d79b2015-03-24 14:36:11 +00001567 jfloat f1 = bit_cast<jfloat, jint>(11);
1568 jfloat f2 = bit_cast<jfloat, jint>(12);
1569 jfloat f3 = bit_cast<jfloat, jint>(13);
1570 jfloat f4 = bit_cast<jfloat, jint>(14);
1571 jfloat f5 = bit_cast<jfloat, jint>(15);
1572 jfloat f6 = bit_cast<jfloat, jint>(16);
1573 jfloat f7 = bit_cast<jfloat, jint>(17);
1574 jfloat f8 = bit_cast<jfloat, jint>(18);
1575 jfloat f9 = bit_cast<jfloat, jint>(19);
1576 jfloat f10 = bit_cast<jfloat, jint>(20);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001577
1578 env_->CallStaticVoidMethod(jklass_, jmethod_, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, f1, f2,
1579 f3, f4, f5, f6, f7, f8, f9, f10);
1580}
1581
Andreas Gampe6e498692014-08-18 16:43:12 -07001582JNI_TEST(StackArgsIntsFirst)
1583
Ian Rogers6a3c1fc2014-10-31 00:33:20 -07001584void Java_MyClassNatives_stackArgsFloatsFirst(JNIEnv*, jclass, jfloat f1, jfloat f2,
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001585 jfloat f3, jfloat f4, jfloat f5, jfloat f6, jfloat f7,
1586 jfloat f8, jfloat f9, jfloat f10, jint i1, jint i2,
1587 jint i3, jint i4, jint i5, jint i6, jint i7, jint i8,
1588 jint i9, jint i10) {
1589 EXPECT_EQ(i1, 1);
1590 EXPECT_EQ(i2, 2);
1591 EXPECT_EQ(i3, 3);
1592 EXPECT_EQ(i4, 4);
1593 EXPECT_EQ(i5, 5);
1594 EXPECT_EQ(i6, 6);
1595 EXPECT_EQ(i7, 7);
1596 EXPECT_EQ(i8, 8);
1597 EXPECT_EQ(i9, 9);
1598 EXPECT_EQ(i10, 10);
1599
Roland Levillainda4d79b2015-03-24 14:36:11 +00001600 jint i11 = bit_cast<jint, jfloat>(f1);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001601 EXPECT_EQ(i11, 11);
Roland Levillainda4d79b2015-03-24 14:36:11 +00001602 jint i12 = bit_cast<jint, jfloat>(f2);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001603 EXPECT_EQ(i12, 12);
Roland Levillainda4d79b2015-03-24 14:36:11 +00001604 jint i13 = bit_cast<jint, jfloat>(f3);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001605 EXPECT_EQ(i13, 13);
Roland Levillainda4d79b2015-03-24 14:36:11 +00001606 jint i14 = bit_cast<jint, jfloat>(f4);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001607 EXPECT_EQ(i14, 14);
Roland Levillainda4d79b2015-03-24 14:36:11 +00001608 jint i15 = bit_cast<jint, jfloat>(f5);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001609 EXPECT_EQ(i15, 15);
Roland Levillainda4d79b2015-03-24 14:36:11 +00001610 jint i16 = bit_cast<jint, jfloat>(f6);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001611 EXPECT_EQ(i16, 16);
Roland Levillainda4d79b2015-03-24 14:36:11 +00001612 jint i17 = bit_cast<jint, jfloat>(f7);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001613 EXPECT_EQ(i17, 17);
Roland Levillainda4d79b2015-03-24 14:36:11 +00001614 jint i18 = bit_cast<jint, jfloat>(f8);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001615 EXPECT_EQ(i18, 18);
Roland Levillainda4d79b2015-03-24 14:36:11 +00001616 jint i19 = bit_cast<jint, jfloat>(f9);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001617 EXPECT_EQ(i19, 19);
Roland Levillainda4d79b2015-03-24 14:36:11 +00001618 jint i20 = bit_cast<jint, jfloat>(f10);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001619 EXPECT_EQ(i20, 20);
1620}
1621
Andreas Gampe6e498692014-08-18 16:43:12 -07001622void JniCompilerTest::StackArgsFloatsFirstImpl() {
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001623 SetUpForTest(true, "stackArgsFloatsFirst", "(FFFFFFFFFFIIIIIIIIII)V",
1624 reinterpret_cast<void*>(&Java_MyClassNatives_stackArgsFloatsFirst));
1625
1626 jint i1 = 1;
1627 jint i2 = 2;
1628 jint i3 = 3;
1629 jint i4 = 4;
1630 jint i5 = 5;
1631 jint i6 = 6;
1632 jint i7 = 7;
1633 jint i8 = 8;
1634 jint i9 = 9;
1635 jint i10 = 10;
1636
Roland Levillainda4d79b2015-03-24 14:36:11 +00001637 jfloat f1 = bit_cast<jfloat, jint>(11);
1638 jfloat f2 = bit_cast<jfloat, jint>(12);
1639 jfloat f3 = bit_cast<jfloat, jint>(13);
1640 jfloat f4 = bit_cast<jfloat, jint>(14);
1641 jfloat f5 = bit_cast<jfloat, jint>(15);
1642 jfloat f6 = bit_cast<jfloat, jint>(16);
1643 jfloat f7 = bit_cast<jfloat, jint>(17);
1644 jfloat f8 = bit_cast<jfloat, jint>(18);
1645 jfloat f9 = bit_cast<jfloat, jint>(19);
1646 jfloat f10 = bit_cast<jfloat, jint>(20);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001647
1648 env_->CallStaticVoidMethod(jklass_, jmethod_, f1, f2, f3, f4, f5, f6, f7, f8, f9, f10, i1, i2, i3,
1649 i4, i5, i6, i7, i8, i9, i10);
1650}
1651
Andreas Gampe6e498692014-08-18 16:43:12 -07001652JNI_TEST(StackArgsFloatsFirst)
1653
Ian Rogers6a3c1fc2014-10-31 00:33:20 -07001654void Java_MyClassNatives_stackArgsMixed(JNIEnv*, jclass, jint i1, jfloat f1, jint i2,
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001655 jfloat f2, jint i3, jfloat f3, jint i4, jfloat f4, jint i5,
1656 jfloat f5, jint i6, jfloat f6, jint i7, jfloat f7, jint i8,
1657 jfloat f8, jint i9, jfloat f9, jint i10, jfloat f10) {
1658 EXPECT_EQ(i1, 1);
1659 EXPECT_EQ(i2, 2);
1660 EXPECT_EQ(i3, 3);
1661 EXPECT_EQ(i4, 4);
1662 EXPECT_EQ(i5, 5);
1663 EXPECT_EQ(i6, 6);
1664 EXPECT_EQ(i7, 7);
1665 EXPECT_EQ(i8, 8);
1666 EXPECT_EQ(i9, 9);
1667 EXPECT_EQ(i10, 10);
1668
Roland Levillainda4d79b2015-03-24 14:36:11 +00001669 jint i11 = bit_cast<jint, jfloat>(f1);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001670 EXPECT_EQ(i11, 11);
Roland Levillainda4d79b2015-03-24 14:36:11 +00001671 jint i12 = bit_cast<jint, jfloat>(f2);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001672 EXPECT_EQ(i12, 12);
Roland Levillainda4d79b2015-03-24 14:36:11 +00001673 jint i13 = bit_cast<jint, jfloat>(f3);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001674 EXPECT_EQ(i13, 13);
Roland Levillainda4d79b2015-03-24 14:36:11 +00001675 jint i14 = bit_cast<jint, jfloat>(f4);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001676 EXPECT_EQ(i14, 14);
Roland Levillainda4d79b2015-03-24 14:36:11 +00001677 jint i15 = bit_cast<jint, jfloat>(f5);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001678 EXPECT_EQ(i15, 15);
Roland Levillainda4d79b2015-03-24 14:36:11 +00001679 jint i16 = bit_cast<jint, jfloat>(f6);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001680 EXPECT_EQ(i16, 16);
Roland Levillainda4d79b2015-03-24 14:36:11 +00001681 jint i17 = bit_cast<jint, jfloat>(f7);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001682 EXPECT_EQ(i17, 17);
Roland Levillainda4d79b2015-03-24 14:36:11 +00001683 jint i18 = bit_cast<jint, jfloat>(f8);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001684 EXPECT_EQ(i18, 18);
Roland Levillainda4d79b2015-03-24 14:36:11 +00001685 jint i19 = bit_cast<jint, jfloat>(f9);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001686 EXPECT_EQ(i19, 19);
Roland Levillainda4d79b2015-03-24 14:36:11 +00001687 jint i20 = bit_cast<jint, jfloat>(f10);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001688 EXPECT_EQ(i20, 20);
1689}
1690
Andreas Gampe6e498692014-08-18 16:43:12 -07001691void JniCompilerTest::StackArgsMixedImpl() {
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001692 SetUpForTest(true, "stackArgsMixed", "(IFIFIFIFIFIFIFIFIFIF)V",
1693 reinterpret_cast<void*>(&Java_MyClassNatives_stackArgsMixed));
1694
1695 jint i1 = 1;
1696 jint i2 = 2;
1697 jint i3 = 3;
1698 jint i4 = 4;
1699 jint i5 = 5;
1700 jint i6 = 6;
1701 jint i7 = 7;
1702 jint i8 = 8;
1703 jint i9 = 9;
1704 jint i10 = 10;
1705
Roland Levillainda4d79b2015-03-24 14:36:11 +00001706 jfloat f1 = bit_cast<jfloat, jint>(11);
1707 jfloat f2 = bit_cast<jfloat, jint>(12);
1708 jfloat f3 = bit_cast<jfloat, jint>(13);
1709 jfloat f4 = bit_cast<jfloat, jint>(14);
1710 jfloat f5 = bit_cast<jfloat, jint>(15);
1711 jfloat f6 = bit_cast<jfloat, jint>(16);
1712 jfloat f7 = bit_cast<jfloat, jint>(17);
1713 jfloat f8 = bit_cast<jfloat, jint>(18);
1714 jfloat f9 = bit_cast<jfloat, jint>(19);
1715 jfloat f10 = bit_cast<jfloat, jint>(20);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001716
1717 env_->CallStaticVoidMethod(jklass_, jmethod_, i1, f1, i2, f2, i3, f3, i4, f4, i5, f5, i6, f6, i7,
1718 f7, i8, f8, i9, f9, i10, f10);
1719}
1720
Andreas Gampe6e498692014-08-18 16:43:12 -07001721JNI_TEST(StackArgsMixed)
1722
Lazar Trsicf652d602015-06-24 16:30:21 +02001723void Java_MyClassNatives_stackArgsSignExtendedMips64(JNIEnv*, jclass, jint i1, jint i2, jint i3,
1724 jint i4, jint i5, jint i6, jint i7, jint i8) {
1725 EXPECT_EQ(i1, 1);
1726 EXPECT_EQ(i2, 2);
1727 EXPECT_EQ(i3, 3);
1728 EXPECT_EQ(i4, 4);
1729 EXPECT_EQ(i5, 5);
1730 EXPECT_EQ(i6, 6);
1731 EXPECT_EQ(i7, 7);
1732 EXPECT_EQ(i8, -8);
1733
1734#if defined(__mips__) && defined(__LP64__) && (__BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__)
1735 // Mips64 ABI requires that arguments passed through stack be sign-extended 8B slots.
1736 // First 8 arguments are passed through registers, check i7 and i8.
1737 uint32_t stack1_high = *(&i7 + 1);
1738 uint32_t stack2_high = *(&i8 + 1);
1739
1740 EXPECT_EQ(stack1_high, static_cast<uint32_t>(0));
1741 EXPECT_EQ(stack2_high, static_cast<uint32_t>(0xffffffff));
1742#else
1743 LOG(INFO) << "Skipping stackArgsSignExtendedMips64 as there is nothing to be done on "
1744 << kRuntimeISA;
1745 // Force-print to std::cout so it's also outside the logcat.
1746 std::cout << "Skipping stackArgsSignExtendedMips64 as there is nothing to be done on "
1747 << kRuntimeISA << std::endl;
1748#endif
1749}
1750
1751void JniCompilerTest::StackArgsSignExtendedMips64Impl() {
1752 SetUpForTest(true, "stackArgsSignExtendedMips64", "(IIIIIIII)V",
1753 reinterpret_cast<void*>(&Java_MyClassNatives_stackArgsSignExtendedMips64));
1754 jint i1 = 1;
1755 jint i2 = 2;
1756 jint i3 = 3;
1757 jint i4 = 4;
1758 jint i5 = 5;
1759 jint i6 = 6;
1760 jint i7 = 7;
1761 jint i8 = -8;
1762
1763 env_->CallStaticVoidMethod(jklass_, jmethod_, i1, i2, i3, i4, i5, i6, i7, i8);
1764}
1765
1766JNI_TEST(StackArgsSignExtendedMips64)
1767
Ian Rogersb033c752011-07-20 12:22:35 -07001768} // namespace art