blob: 4626f38695e1be8f5821bdc290025cbf78fd3a14 [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 Geoffrayebee8de2014-08-13 03:40:45 +010019#include <math.h>
20
Brian Carlstrom578bbdc2011-07-21 14:07:47 -070021#include "class_linker.h"
Brian Carlstroma1ce1fe2014-02-24 23:23:58 -080022#include "common_compiler_test.h"
Brian Carlstrom578bbdc2011-07-21 14:07:47 -070023#include "dex_file.h"
Elliott Hughes90a33692011-08-30 13:27:07 -070024#include "gtest/gtest.h"
Ian Rogerscdd1d2d2011-08-18 09:58:17 -070025#include "indirect_reference_table.h"
Ian Rogerscdd1d2d2011-08-18 09:58:17 -070026#include "jni_internal.h"
Brian Carlstromdb4d5402011-08-09 12:18:28 -070027#include "mem_map.h"
Brian Carlstromea46f952013-07-30 01:26:50 -070028#include "mirror/art_method-inl.h"
Ian Rogers4f6ad8a2013-03-18 15:27:28 -070029#include "mirror/class-inl.h"
Ian Rogers2dd0e2c2013-01-24 12:42:14 -080030#include "mirror/class_loader.h"
Ian Rogers2dd0e2c2013-01-24 12:42:14 -080031#include "mirror/object_array-inl.h"
Ian Rogers04d7aa92013-03-16 14:29:17 -070032#include "mirror/object-inl.h"
Ian Rogers2dd0e2c2013-01-24 12:42:14 -080033#include "mirror/stack_trace_element.h"
Brian Carlstrom578bbdc2011-07-21 14:07:47 -070034#include "runtime.h"
Ian Rogers00f7d0e2012-07-19 15:28:27 -070035#include "ScopedLocalRef.h"
36#include "scoped_thread_state_change.h"
Brian Carlstrom578bbdc2011-07-21 14:07:47 -070037#include "thread.h"
Ian Rogersb033c752011-07-20 12:22:35 -070038
Elliott Hughesb264f082012-04-06 17:10:10 -070039extern "C" JNIEXPORT jint JNICALL Java_MyClassNatives_bar(JNIEnv*, jobject, jint count) {
Brian Carlstromb9cc1ca2012-01-27 00:57:42 -080040 return count + 1;
41}
42
Elliott Hughesb264f082012-04-06 17:10:10 -070043extern "C" JNIEXPORT jint JNICALL Java_MyClassNatives_sbar(JNIEnv*, jclass, jint count) {
Ian Rogers1cefdbd2012-02-29 09:34:50 -080044 return count + 1;
45}
46
Ian Rogersb033c752011-07-20 12:22:35 -070047namespace art {
48
Brian Carlstroma1ce1fe2014-02-24 23:23:58 -080049class JniCompilerTest : public CommonCompilerTest {
Ian Rogersb033c752011-07-20 12:22:35 -070050 protected:
Andreas Gampe38bd1e12014-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 Gampe38bd1e12014-08-18 16:43:12 -070061 const char* method_name, const char* method_sig) {
Ian Rogers00f7d0e2012-07-19 15:28:27 -070062 ScopedObjectAccess soa(Thread::Current());
Mathieu Chartiereb8167a2014-05-07 15:43:14 -070063 StackHandleScope<1> hs(soa.Self());
64 Handle<mirror::ClassLoader> loader(
65 hs.NewHandle(soa.Decode<mirror::ClassLoader*>(class_loader)));
Brian Carlstrom25c33252011-09-18 15:58:35 -070066 // Compile the native method before starting the runtime
Ian Rogers98379392014-02-24 16:53:16 -080067 mirror::Class* c = class_linker_->FindClass(soa.Self(), "LMyClassNatives;", loader);
Brian Carlstromea46f952013-07-30 01:26:50 -070068 mirror::ArtMethod* method;
Ian Rogerscdd1d2d2011-08-18 09:58:17 -070069 if (direct) {
buzbeec143c552011-08-20 17:38:58 -070070 method = c->FindDirectMethod(method_name, method_sig);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -070071 } else {
buzbeec143c552011-08-20 17:38:58 -070072 method = c->FindVirtualMethod(method_name, method_sig);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -070073 }
Andreas Gampecf4035a2014-05-28 22:43:01 -070074 ASSERT_TRUE(method != nullptr) << method_name << " " << method_sig;
Andreas Gampe38bd1e12014-08-18 16:43:12 -070075 if (check_generic_jni_) {
Nicolas Geoffrayebee8de2014-08-13 03:40:45 +010076 method->SetEntryPointFromQuickCompiledCode(class_linker_->GetQuickGenericJniTrampoline());
77 } else {
78 if (method->GetEntryPointFromQuickCompiledCode() == nullptr ||
79 method->GetEntryPointFromQuickCompiledCode() == class_linker_->GetQuickGenericJniTrampoline()) {
80 CompileMethod(method);
81 ASSERT_TRUE(method->GetEntryPointFromQuickCompiledCode() != nullptr)
82 << method_name << " " << method_sig;
83 ASSERT_TRUE(method->GetEntryPointFromPortableCompiledCode() != nullptr)
84 << method_name << " " << method_sig;
85 }
Brian Carlstrom25c33252011-09-18 15:58:35 -070086 }
Brian Carlstrom25c33252011-09-18 15:58:35 -070087 }
88
Ian Rogers00f7d0e2012-07-19 15:28:27 -070089 void SetUpForTest(bool direct, const char* method_name, const char* method_sig,
Andreas Gampe38bd1e12014-08-18 16:43:12 -070090 void* native_fnptr) {
Ian Rogers00f7d0e2012-07-19 15:28:27 -070091 // Initialize class loader and compile method when runtime not started.
Brian Carlstrom2ce745c2013-07-17 17:44:30 -070092 if (!runtime_->IsStarted()) {
Ian Rogers00f7d0e2012-07-19 15:28:27 -070093 {
94 ScopedObjectAccess soa(Thread::Current());
95 class_loader_ = LoadDex("MyClassNatives");
96 }
Andreas Gampe38bd1e12014-08-18 16:43:12 -070097 CompileForTest(class_loader_, direct, method_name, method_sig);
Ian Rogers00f7d0e2012-07-19 15:28:27 -070098 // Start runtime.
99 Thread::Current()->TransitionFromSuspendedToRunnable();
Brian Carlstrombd86bcc2013-03-10 20:26:16 -0700100 bool started = runtime_->Start();
101 CHECK(started);
Brian Carlstrom25c33252011-09-18 15:58:35 -0700102 }
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700103 // JNI operations after runtime start.
Brian Carlstrom25c33252011-09-18 15:58:35 -0700104 env_ = Thread::Current()->GetJniEnv();
Elliott Hughesb264f082012-04-06 17:10:10 -0700105 jklass_ = env_->FindClass("MyClassNatives");
Andreas Gampecf4035a2014-05-28 22:43:01 -0700106 ASSERT_TRUE(jklass_ != nullptr) << method_name << " " << method_sig;
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700107
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700108 if (direct) {
109 jmethod_ = env_->GetStaticMethodID(jklass_, method_name, method_sig);
110 } else {
111 jmethod_ = env_->GetMethodID(jklass_, method_name, method_sig);
112 }
Andreas Gampecf4035a2014-05-28 22:43:01 -0700113 ASSERT_TRUE(jmethod_ != nullptr) << method_name << " " << method_sig;
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700114
Andreas Gampecf4035a2014-05-28 22:43:01 -0700115 if (native_fnptr != nullptr) {
Elliott Hughesb25c3f62012-03-26 16:35:06 -0700116 JNINativeMethod methods[] = { { method_name, method_sig, native_fnptr } };
Brian Carlstromfc7120c2012-08-27 13:43:25 -0700117 ASSERT_EQ(JNI_OK, env_->RegisterNatives(jklass_, methods, 1))
118 << method_name << " " << method_sig;
Ian Rogersbdb03912011-09-14 00:55:44 -0700119 } else {
120 env_->UnregisterNatives(jklass_);
Shih-wei Liao31384c52011-09-06 15:27:45 -0700121 }
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700122
123 jmethodID constructor = env_->GetMethodID(jklass_, "<init>", "()V");
124 jobj_ = env_->NewObject(jklass_, constructor);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700125 ASSERT_TRUE(jobj_ != nullptr) << method_name << " " << method_sig;
Ian Rogersb033c752011-07-20 12:22:35 -0700126 }
127
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700128 public:
129 static jclass jklass_;
130 static jobject jobj_;
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700131 static jobject class_loader_;
132
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700133 protected:
Andreas Gampe38bd1e12014-08-18 16:43:12 -0700134 // We have to list the methods here so we can share them between default and generic JNI.
135 void CompileAndRunNoArgMethodImpl();
136 void CompileAndRunIntMethodThroughStubImpl();
137 void CompileAndRunStaticIntMethodThroughStubImpl();
138 void CompileAndRunIntMethodImpl();
139 void CompileAndRunIntIntMethodImpl();
140 void CompileAndRunLongLongMethodImpl();
141 void CompileAndRunDoubleDoubleMethodImpl();
142 void CompileAndRun_fooJJ_synchronizedImpl();
143 void CompileAndRunIntObjectObjectMethodImpl();
144 void CompileAndRunStaticIntIntMethodImpl();
145 void CompileAndRunStaticDoubleDoubleMethodImpl();
146 void RunStaticLogDoubleMethodImpl();
147 void RunStaticLogFloatMethodImpl();
148 void RunStaticReturnTrueImpl();
149 void RunStaticReturnFalseImpl();
150 void RunGenericStaticReturnIntImpl();
151 void CompileAndRunStaticIntObjectObjectMethodImpl();
152 void CompileAndRunStaticSynchronizedIntObjectObjectMethodImpl();
153 void ExceptionHandlingImpl();
154 void NativeStackTraceElementImpl();
155 void ReturnGlobalRefImpl();
156 void LocalReferenceTableClearingTestImpl();
157 void JavaLangSystemArrayCopyImpl();
158 void CompareAndSwapIntImpl();
159 void GetTextImpl();
160 void GetSinkPropertiesNativeImpl();
161 void UpcallReturnTypeChecking_InstanceImpl();
162 void UpcallReturnTypeChecking_StaticImpl();
163 void UpcallArgumentTypeChecking_InstanceImpl();
164 void UpcallArgumentTypeChecking_StaticImpl();
165 void CompileAndRunFloatFloatMethodImpl();
166 void CheckParameterAlignImpl();
167 void MaxParamNumberImpl();
168 void WithoutImplementationImpl();
169 void StackArgsIntsFirstImpl();
170 void StackArgsFloatsFirstImpl();
171 void StackArgsMixedImpl();
172
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700173 JNIEnv* env_;
174 jmethodID jmethod_;
Andreas Gampe38bd1e12014-08-18 16:43:12 -0700175 bool check_generic_jni_;
Ian Rogersb033c752011-07-20 12:22:35 -0700176};
177
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700178jclass JniCompilerTest::jklass_;
179jobject JniCompilerTest::jobj_;
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700180jobject JniCompilerTest::class_loader_;
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700181
Andreas Gampe38bd1e12014-08-18 16:43:12 -0700182#define JNI_TEST(TestName) \
183 TEST_F(JniCompilerTest, TestName ## Default) { \
184 TestName ## Impl(); \
185 } \
186 \
187 TEST_F(JniCompilerTest, TestName ## Generic) { \
188 TEST_DISABLED_FOR_MIPS(); \
189 SetCheckGenericJni(true); \
190 TestName ## Impl(); \
191 }
Andreas Gampecf4035a2014-05-28 22:43:01 -0700192
Elliott Hughesb264f082012-04-06 17:10:10 -0700193int gJava_MyClassNatives_foo_calls = 0;
194void Java_MyClassNatives_foo(JNIEnv* env, jobject thisObj) {
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700195 // 1 = thisObj
Ian Rogers50b35e22012-10-04 10:09:15 -0700196 EXPECT_EQ(kNative, Thread::Current()->GetState());
197 Locks::mutator_lock_->AssertNotHeld(Thread::Current());
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700198 EXPECT_EQ(Thread::Current()->GetJniEnv(), env);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700199 EXPECT_TRUE(thisObj != nullptr);
Ian Rogersa8cd9f42011-08-19 16:43:41 -0700200 EXPECT_TRUE(env->IsInstanceOf(thisObj, JniCompilerTest::jklass_));
Elliott Hughesb264f082012-04-06 17:10:10 -0700201 gJava_MyClassNatives_foo_calls++;
Ian Rogersef7d42f2014-01-06 12:55:46 -0800202 ScopedObjectAccess soa(Thread::Current());
203 EXPECT_EQ(1U, Thread::Current()->NumStackReferences());
Ian Rogersb033c752011-07-20 12:22:35 -0700204}
205
Andreas Gampe38bd1e12014-08-18 16:43:12 -0700206void JniCompilerTest::CompileAndRunNoArgMethodImpl() {
Brian Carlstrom265091e2013-01-30 14:08:26 -0800207 TEST_DISABLED_FOR_PORTABLE();
Ian Rogersef7d42f2014-01-06 12:55:46 -0800208 SetUpForTest(false, "foo", "()V", reinterpret_cast<void*>(&Java_MyClassNatives_foo));
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700209
Elliott Hughesb264f082012-04-06 17:10:10 -0700210 EXPECT_EQ(0, gJava_MyClassNatives_foo_calls);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700211 env_->CallNonvirtualVoidMethod(jobj_, jklass_, jmethod_);
Elliott Hughesb264f082012-04-06 17:10:10 -0700212 EXPECT_EQ(1, gJava_MyClassNatives_foo_calls);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700213 env_->CallNonvirtualVoidMethod(jobj_, jklass_, jmethod_);
Elliott Hughesb264f082012-04-06 17:10:10 -0700214 EXPECT_EQ(2, gJava_MyClassNatives_foo_calls);
Andreas Gampe38bd1e12014-08-18 16:43:12 -0700215
216 gJava_MyClassNatives_foo_calls = 0;
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700217}
218
Andreas Gampe38bd1e12014-08-18 16:43:12 -0700219JNI_TEST(CompileAndRunNoArgMethod)
220
221void JniCompilerTest::CompileAndRunIntMethodThroughStubImpl() {
Brian Carlstrom265091e2013-01-30 14:08:26 -0800222 TEST_DISABLED_FOR_PORTABLE();
Andreas Gampecf4035a2014-05-28 22:43:01 -0700223 SetUpForTest(false, "bar", "(I)I", nullptr);
224 // calling through stub will link with &Java_MyClassNatives_bar
Shih-wei Liao31384c52011-09-06 15:27:45 -0700225
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700226 ScopedObjectAccess soa(Thread::Current());
Shih-wei Liao31384c52011-09-06 15:27:45 -0700227 std::string reason;
Mathieu Chartiereb8167a2014-05-07 15:43:14 -0700228 StackHandleScope<1> hs(soa.Self());
229 Handle<mirror::ClassLoader> class_loader(
230 hs.NewHandle(soa.Decode<mirror::ClassLoader*>(class_loader_)));
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700231 ASSERT_TRUE(
Mathieu Chartier055d46c2014-02-06 11:22:17 -0800232 Runtime::Current()->GetJavaVM()->LoadNativeLibrary("", class_loader, &reason)) << reason;
Shih-wei Liao31384c52011-09-06 15:27:45 -0700233
234 jint result = env_->CallNonvirtualIntMethod(jobj_, jklass_, jmethod_, 24);
235 EXPECT_EQ(25, result);
236}
237
Andreas Gampe38bd1e12014-08-18 16:43:12 -0700238JNI_TEST(CompileAndRunIntMethodThroughStub)
239
240void JniCompilerTest::CompileAndRunStaticIntMethodThroughStubImpl() {
Brian Carlstrom265091e2013-01-30 14:08:26 -0800241 TEST_DISABLED_FOR_PORTABLE();
Andreas Gampecf4035a2014-05-28 22:43:01 -0700242 SetUpForTest(true, "sbar", "(I)I", nullptr);
243 // calling through stub will link with &Java_MyClassNatives_sbar
Ian Rogers1cefdbd2012-02-29 09:34:50 -0800244
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700245 ScopedObjectAccess soa(Thread::Current());
Ian Rogers1cefdbd2012-02-29 09:34:50 -0800246 std::string reason;
Mathieu Chartiereb8167a2014-05-07 15:43:14 -0700247 StackHandleScope<1> hs(soa.Self());
248 Handle<mirror::ClassLoader> class_loader(
249 hs.NewHandle(soa.Decode<mirror::ClassLoader*>(class_loader_)));
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700250 ASSERT_TRUE(
Mathieu Chartier055d46c2014-02-06 11:22:17 -0800251 Runtime::Current()->GetJavaVM()->LoadNativeLibrary("", class_loader, &reason)) << reason;
Ian Rogers1cefdbd2012-02-29 09:34:50 -0800252
253 jint result = env_->CallStaticIntMethod(jklass_, jmethod_, 42);
254 EXPECT_EQ(43, result);
255}
256
Andreas Gampe38bd1e12014-08-18 16:43:12 -0700257JNI_TEST(CompileAndRunStaticIntMethodThroughStub)
258
Elliott Hughesb264f082012-04-06 17:10:10 -0700259int gJava_MyClassNatives_fooI_calls = 0;
260jint Java_MyClassNatives_fooI(JNIEnv* env, jobject thisObj, jint x) {
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700261 // 1 = thisObj
Ian Rogers50b35e22012-10-04 10:09:15 -0700262 EXPECT_EQ(kNative, Thread::Current()->GetState());
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700263 EXPECT_EQ(Thread::Current()->GetJniEnv(), env);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700264 EXPECT_TRUE(thisObj != nullptr);
Ian Rogersa8cd9f42011-08-19 16:43:41 -0700265 EXPECT_TRUE(env->IsInstanceOf(thisObj, JniCompilerTest::jklass_));
Elliott Hughesb264f082012-04-06 17:10:10 -0700266 gJava_MyClassNatives_fooI_calls++;
Ian Rogersef7d42f2014-01-06 12:55:46 -0800267 ScopedObjectAccess soa(Thread::Current());
268 EXPECT_EQ(1U, Thread::Current()->NumStackReferences());
Ian Rogersb033c752011-07-20 12:22:35 -0700269 return x;
270}
271
Andreas Gampe38bd1e12014-08-18 16:43:12 -0700272void JniCompilerTest::CompileAndRunIntMethodImpl() {
Brian Carlstrom265091e2013-01-30 14:08:26 -0800273 TEST_DISABLED_FOR_PORTABLE();
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700274 SetUpForTest(false, "fooI", "(I)I",
Elliott Hughesb264f082012-04-06 17:10:10 -0700275 reinterpret_cast<void*>(&Java_MyClassNatives_fooI));
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700276
Elliott Hughesb264f082012-04-06 17:10:10 -0700277 EXPECT_EQ(0, gJava_MyClassNatives_fooI_calls);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700278 jint result = env_->CallNonvirtualIntMethod(jobj_, jklass_, jmethod_, 42);
279 EXPECT_EQ(42, result);
Elliott Hughesb264f082012-04-06 17:10:10 -0700280 EXPECT_EQ(1, gJava_MyClassNatives_fooI_calls);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700281 result = env_->CallNonvirtualIntMethod(jobj_, jklass_, jmethod_, 0xCAFED00D);
282 EXPECT_EQ(static_cast<jint>(0xCAFED00D), result);
Elliott Hughesb264f082012-04-06 17:10:10 -0700283 EXPECT_EQ(2, gJava_MyClassNatives_fooI_calls);
Andreas Gampe38bd1e12014-08-18 16:43:12 -0700284
285 gJava_MyClassNatives_fooI_calls = 0;
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700286}
287
Andreas Gampe38bd1e12014-08-18 16:43:12 -0700288JNI_TEST(CompileAndRunIntMethod)
289
Elliott Hughesb264f082012-04-06 17:10:10 -0700290int gJava_MyClassNatives_fooII_calls = 0;
291jint Java_MyClassNatives_fooII(JNIEnv* env, jobject thisObj, jint x, jint y) {
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700292 // 1 = thisObj
Ian Rogers50b35e22012-10-04 10:09:15 -0700293 EXPECT_EQ(kNative, Thread::Current()->GetState());
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700294 EXPECT_EQ(Thread::Current()->GetJniEnv(), env);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700295 EXPECT_TRUE(thisObj != nullptr);
Ian Rogersa8cd9f42011-08-19 16:43:41 -0700296 EXPECT_TRUE(env->IsInstanceOf(thisObj, JniCompilerTest::jklass_));
Elliott Hughesb264f082012-04-06 17:10:10 -0700297 gJava_MyClassNatives_fooII_calls++;
Ian Rogersef7d42f2014-01-06 12:55:46 -0800298 ScopedObjectAccess soa(Thread::Current());
299 EXPECT_EQ(1U, Thread::Current()->NumStackReferences());
Ian Rogersb033c752011-07-20 12:22:35 -0700300 return x - y; // non-commutative operator
301}
302
Andreas Gampe38bd1e12014-08-18 16:43:12 -0700303void JniCompilerTest::CompileAndRunIntIntMethodImpl() {
Brian Carlstrom265091e2013-01-30 14:08:26 -0800304 TEST_DISABLED_FOR_PORTABLE();
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700305 SetUpForTest(false, "fooII", "(II)I",
Elliott Hughesb264f082012-04-06 17:10:10 -0700306 reinterpret_cast<void*>(&Java_MyClassNatives_fooII));
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700307
Elliott Hughesb264f082012-04-06 17:10:10 -0700308 EXPECT_EQ(0, gJava_MyClassNatives_fooII_calls);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700309 jint result = env_->CallNonvirtualIntMethod(jobj_, jklass_, jmethod_, 99, 10);
310 EXPECT_EQ(99 - 10, result);
Elliott Hughesb264f082012-04-06 17:10:10 -0700311 EXPECT_EQ(1, gJava_MyClassNatives_fooII_calls);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700312 result = env_->CallNonvirtualIntMethod(jobj_, jklass_, jmethod_, 0xCAFEBABE,
313 0xCAFED00D);
314 EXPECT_EQ(static_cast<jint>(0xCAFEBABE - 0xCAFED00D), result);
Elliott Hughesb264f082012-04-06 17:10:10 -0700315 EXPECT_EQ(2, gJava_MyClassNatives_fooII_calls);
Andreas Gampe38bd1e12014-08-18 16:43:12 -0700316
317 gJava_MyClassNatives_fooII_calls = 0;
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700318}
319
Andreas Gampe38bd1e12014-08-18 16:43:12 -0700320JNI_TEST(CompileAndRunIntIntMethod)
321
Elliott Hughesb264f082012-04-06 17:10:10 -0700322int gJava_MyClassNatives_fooJJ_calls = 0;
323jlong Java_MyClassNatives_fooJJ(JNIEnv* env, jobject thisObj, jlong x, jlong y) {
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700324 // 1 = thisObj
Ian Rogers50b35e22012-10-04 10:09:15 -0700325 EXPECT_EQ(kNative, Thread::Current()->GetState());
Ian Rogers9b269d22011-09-04 14:06:05 -0700326 EXPECT_EQ(Thread::Current()->GetJniEnv(), env);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700327 EXPECT_TRUE(thisObj != nullptr);
Ian Rogers9b269d22011-09-04 14:06:05 -0700328 EXPECT_TRUE(env->IsInstanceOf(thisObj, JniCompilerTest::jklass_));
Elliott Hughesb264f082012-04-06 17:10:10 -0700329 gJava_MyClassNatives_fooJJ_calls++;
Ian Rogersef7d42f2014-01-06 12:55:46 -0800330 ScopedObjectAccess soa(Thread::Current());
331 EXPECT_EQ(1U, Thread::Current()->NumStackReferences());
Ian Rogers9b269d22011-09-04 14:06:05 -0700332 return x - y; // non-commutative operator
333}
334
Andreas Gampe38bd1e12014-08-18 16:43:12 -0700335void JniCompilerTest::CompileAndRunLongLongMethodImpl() {
Brian Carlstrom265091e2013-01-30 14:08:26 -0800336 TEST_DISABLED_FOR_PORTABLE();
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700337 SetUpForTest(false, "fooJJ", "(JJ)J",
Elliott Hughesb264f082012-04-06 17:10:10 -0700338 reinterpret_cast<void*>(&Java_MyClassNatives_fooJJ));
Ian Rogers9b269d22011-09-04 14:06:05 -0700339
Elliott Hughesb264f082012-04-06 17:10:10 -0700340 EXPECT_EQ(0, gJava_MyClassNatives_fooJJ_calls);
Ian Rogers0f678472014-03-10 16:18:37 -0700341 jlong a = INT64_C(0x1234567890ABCDEF);
342 jlong b = INT64_C(0xFEDCBA0987654321);
Ian Rogers9b269d22011-09-04 14:06:05 -0700343 jlong result = env_->CallNonvirtualLongMethod(jobj_, jklass_, jmethod_, a, b);
344 EXPECT_EQ(a - b, result);
Elliott Hughesb264f082012-04-06 17:10:10 -0700345 EXPECT_EQ(1, gJava_MyClassNatives_fooJJ_calls);
Ian Rogers9b269d22011-09-04 14:06:05 -0700346 result = env_->CallNonvirtualLongMethod(jobj_, jklass_, jmethod_, b, a);
347 EXPECT_EQ(b - a, result);
Elliott Hughesb264f082012-04-06 17:10:10 -0700348 EXPECT_EQ(2, gJava_MyClassNatives_fooJJ_calls);
Andreas Gampe38bd1e12014-08-18 16:43:12 -0700349
350 gJava_MyClassNatives_fooJJ_calls = 0;
Ian Rogers9b269d22011-09-04 14:06:05 -0700351}
352
Andreas Gampe38bd1e12014-08-18 16:43:12 -0700353JNI_TEST(CompileAndRunLongLongMethod)
354
Elliott Hughesb264f082012-04-06 17:10:10 -0700355int gJava_MyClassNatives_fooDD_calls = 0;
356jdouble Java_MyClassNatives_fooDD(JNIEnv* env, jobject thisObj, jdouble x, jdouble y) {
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700357 // 1 = thisObj
Ian Rogers50b35e22012-10-04 10:09:15 -0700358 EXPECT_EQ(kNative, Thread::Current()->GetState());
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700359 EXPECT_EQ(Thread::Current()->GetJniEnv(), env);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700360 EXPECT_TRUE(thisObj != nullptr);
Ian Rogersa8cd9f42011-08-19 16:43:41 -0700361 EXPECT_TRUE(env->IsInstanceOf(thisObj, JniCompilerTest::jklass_));
Elliott Hughesb264f082012-04-06 17:10:10 -0700362 gJava_MyClassNatives_fooDD_calls++;
Ian Rogersef7d42f2014-01-06 12:55:46 -0800363 ScopedObjectAccess soa(Thread::Current());
364 EXPECT_EQ(1U, Thread::Current()->NumStackReferences());
Ian Rogersb033c752011-07-20 12:22:35 -0700365 return x - y; // non-commutative operator
366}
367
Andreas Gampe38bd1e12014-08-18 16:43:12 -0700368void JniCompilerTest::CompileAndRunDoubleDoubleMethodImpl() {
Brian Carlstrom265091e2013-01-30 14:08:26 -0800369 TEST_DISABLED_FOR_PORTABLE();
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700370 SetUpForTest(false, "fooDD", "(DD)D",
Elliott Hughesb264f082012-04-06 17:10:10 -0700371 reinterpret_cast<void*>(&Java_MyClassNatives_fooDD));
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700372
Elliott Hughesb264f082012-04-06 17:10:10 -0700373 EXPECT_EQ(0, gJava_MyClassNatives_fooDD_calls);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700374 jdouble result = env_->CallNonvirtualDoubleMethod(jobj_, jklass_, jmethod_,
375 99.0, 10.0);
376 EXPECT_EQ(99.0 - 10.0, result);
Elliott Hughesb264f082012-04-06 17:10:10 -0700377 EXPECT_EQ(1, gJava_MyClassNatives_fooDD_calls);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700378 jdouble a = 3.14159265358979323846;
379 jdouble b = 0.69314718055994530942;
380 result = env_->CallNonvirtualDoubleMethod(jobj_, jklass_, jmethod_, a, b);
381 EXPECT_EQ(a - b, result);
Elliott Hughesb264f082012-04-06 17:10:10 -0700382 EXPECT_EQ(2, gJava_MyClassNatives_fooDD_calls);
Andreas Gampe38bd1e12014-08-18 16:43:12 -0700383
384 gJava_MyClassNatives_fooDD_calls = 0;
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700385}
386
Elliott Hughes3e778f72012-05-21 15:29:52 -0700387int gJava_MyClassNatives_fooJJ_synchronized_calls = 0;
388jlong Java_MyClassNatives_fooJJ_synchronized(JNIEnv* env, jobject thisObj, jlong x, jlong y) {
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700389 // 1 = thisObj
Ian Rogers50b35e22012-10-04 10:09:15 -0700390 EXPECT_EQ(kNative, Thread::Current()->GetState());
Elliott Hughes3e778f72012-05-21 15:29:52 -0700391 EXPECT_EQ(Thread::Current()->GetJniEnv(), env);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700392 EXPECT_TRUE(thisObj != nullptr);
Elliott Hughes3e778f72012-05-21 15:29:52 -0700393 EXPECT_TRUE(env->IsInstanceOf(thisObj, JniCompilerTest::jklass_));
394 gJava_MyClassNatives_fooJJ_synchronized_calls++;
Ian Rogersef7d42f2014-01-06 12:55:46 -0800395 ScopedObjectAccess soa(Thread::Current());
396 EXPECT_EQ(1U, Thread::Current()->NumStackReferences());
Elliott Hughes3e778f72012-05-21 15:29:52 -0700397 return x | y;
398}
399
Andreas Gampe38bd1e12014-08-18 16:43:12 -0700400void JniCompilerTest::CompileAndRun_fooJJ_synchronizedImpl() {
Brian Carlstrom265091e2013-01-30 14:08:26 -0800401 TEST_DISABLED_FOR_PORTABLE();
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700402 SetUpForTest(false, "fooJJ_synchronized", "(JJ)J",
Elliott Hughes3e778f72012-05-21 15:29:52 -0700403 reinterpret_cast<void*>(&Java_MyClassNatives_fooJJ_synchronized));
404
405 EXPECT_EQ(0, gJava_MyClassNatives_fooJJ_synchronized_calls);
406 jlong a = 0x1000000020000000ULL;
407 jlong b = 0x00ff000000aa0000ULL;
408 jlong result = env_->CallNonvirtualLongMethod(jobj_, jklass_, jmethod_, a, b);
409 EXPECT_EQ(a | b, result);
410 EXPECT_EQ(1, gJava_MyClassNatives_fooJJ_synchronized_calls);
Andreas Gampe38bd1e12014-08-18 16:43:12 -0700411
412 gJava_MyClassNatives_fooJJ_synchronized_calls = 0;
Elliott Hughes3e778f72012-05-21 15:29:52 -0700413}
414
Andreas Gampe38bd1e12014-08-18 16:43:12 -0700415JNI_TEST(CompileAndRun_fooJJ_synchronized)
416
Elliott Hughesb264f082012-04-06 17:10:10 -0700417int gJava_MyClassNatives_fooIOO_calls = 0;
418jobject Java_MyClassNatives_fooIOO(JNIEnv* env, jobject thisObj, jint x, jobject y,
Ian Rogersb033c752011-07-20 12:22:35 -0700419 jobject z) {
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700420 // 3 = this + y + z
Ian Rogers50b35e22012-10-04 10:09:15 -0700421 EXPECT_EQ(kNative, Thread::Current()->GetState());
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700422 EXPECT_EQ(Thread::Current()->GetJniEnv(), env);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700423 EXPECT_TRUE(thisObj != nullptr);
Ian Rogersa8cd9f42011-08-19 16:43:41 -0700424 EXPECT_TRUE(env->IsInstanceOf(thisObj, JniCompilerTest::jklass_));
Elliott Hughesb264f082012-04-06 17:10:10 -0700425 gJava_MyClassNatives_fooIOO_calls++;
Ian Rogersef7d42f2014-01-06 12:55:46 -0800426 ScopedObjectAccess soa(Thread::Current());
Andreas Gampebf6b92a2014-03-05 16:11:04 -0800427 size_t null_args = (y == nullptr ? 1 : 0) + (z == nullptr ? 1 : 0);
428 EXPECT_TRUE(3U == Thread::Current()->NumStackReferences() ||
429 (3U - null_args) == Thread::Current()->NumStackReferences());
Ian Rogersb033c752011-07-20 12:22:35 -0700430 switch (x) {
431 case 1:
432 return y;
433 case 2:
434 return z;
435 default:
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700436 return thisObj;
Ian Rogersb033c752011-07-20 12:22:35 -0700437 }
438}
439
Andreas Gampe38bd1e12014-08-18 16:43:12 -0700440void JniCompilerTest::CompileAndRunIntObjectObjectMethodImpl() {
Brian Carlstrom265091e2013-01-30 14:08:26 -0800441 TEST_DISABLED_FOR_PORTABLE();
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700442 SetUpForTest(false, "fooIOO",
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700443 "(ILjava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;",
Elliott Hughesb264f082012-04-06 17:10:10 -0700444 reinterpret_cast<void*>(&Java_MyClassNatives_fooIOO));
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700445
Elliott Hughesb264f082012-04-06 17:10:10 -0700446 EXPECT_EQ(0, gJava_MyClassNatives_fooIOO_calls);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700447 jobject result = env_->CallNonvirtualObjectMethod(jobj_, jklass_, jmethod_, 0, nullptr, nullptr);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700448 EXPECT_TRUE(env_->IsSameObject(jobj_, result));
Elliott Hughesb264f082012-04-06 17:10:10 -0700449 EXPECT_EQ(1, gJava_MyClassNatives_fooIOO_calls);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700450
Andreas Gampecf4035a2014-05-28 22:43:01 -0700451 result = env_->CallNonvirtualObjectMethod(jobj_, jklass_, jmethod_, 0, nullptr, jklass_);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700452 EXPECT_TRUE(env_->IsSameObject(jobj_, result));
Elliott Hughesb264f082012-04-06 17:10:10 -0700453 EXPECT_EQ(2, gJava_MyClassNatives_fooIOO_calls);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700454 result = env_->CallNonvirtualObjectMethod(jobj_, jklass_, jmethod_, 1, nullptr, jklass_);
455 EXPECT_TRUE(env_->IsSameObject(nullptr, result));
Elliott Hughesb264f082012-04-06 17:10:10 -0700456 EXPECT_EQ(3, gJava_MyClassNatives_fooIOO_calls);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700457 result = env_->CallNonvirtualObjectMethod(jobj_, jklass_, jmethod_, 2, nullptr, jklass_);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700458 EXPECT_TRUE(env_->IsSameObject(jklass_, result));
Elliott Hughesb264f082012-04-06 17:10:10 -0700459 EXPECT_EQ(4, gJava_MyClassNatives_fooIOO_calls);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700460
Andreas Gampecf4035a2014-05-28 22:43:01 -0700461 result = env_->CallNonvirtualObjectMethod(jobj_, jklass_, jmethod_, 0, jklass_, nullptr);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700462 EXPECT_TRUE(env_->IsSameObject(jobj_, result));
Elliott Hughesb264f082012-04-06 17:10:10 -0700463 EXPECT_EQ(5, gJava_MyClassNatives_fooIOO_calls);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700464 result = env_->CallNonvirtualObjectMethod(jobj_, jklass_, jmethod_, 1, jklass_, nullptr);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700465 EXPECT_TRUE(env_->IsSameObject(jklass_, result));
Elliott Hughesb264f082012-04-06 17:10:10 -0700466 EXPECT_EQ(6, gJava_MyClassNatives_fooIOO_calls);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700467 result = env_->CallNonvirtualObjectMethod(jobj_, jklass_, jmethod_, 2, jklass_, nullptr);
468 EXPECT_TRUE(env_->IsSameObject(nullptr, result));
Elliott Hughesb264f082012-04-06 17:10:10 -0700469 EXPECT_EQ(7, gJava_MyClassNatives_fooIOO_calls);
Andreas Gampe38bd1e12014-08-18 16:43:12 -0700470
471 gJava_MyClassNatives_fooIOO_calls = 0;
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700472}
473
Andreas Gampe38bd1e12014-08-18 16:43:12 -0700474JNI_TEST(CompileAndRunIntObjectObjectMethod)
475
Elliott Hughesb264f082012-04-06 17:10:10 -0700476int gJava_MyClassNatives_fooSII_calls = 0;
477jint Java_MyClassNatives_fooSII(JNIEnv* env, jclass klass, jint x, jint y) {
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700478 // 1 = klass
Ian Rogers50b35e22012-10-04 10:09:15 -0700479 EXPECT_EQ(kNative, Thread::Current()->GetState());
Shih-wei Liao82da44b2011-09-01 00:38:04 -0700480 EXPECT_EQ(Thread::Current()->GetJniEnv(), env);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700481 EXPECT_TRUE(klass != nullptr);
Shih-wei Liao82da44b2011-09-01 00:38:04 -0700482 EXPECT_TRUE(env->IsInstanceOf(JniCompilerTest::jobj_, klass));
Elliott Hughesb264f082012-04-06 17:10:10 -0700483 gJava_MyClassNatives_fooSII_calls++;
Ian Rogersef7d42f2014-01-06 12:55:46 -0800484 ScopedObjectAccess soa(Thread::Current());
485 EXPECT_EQ(1U, Thread::Current()->NumStackReferences());
Shih-wei Liao82da44b2011-09-01 00:38:04 -0700486 return x + y;
487}
488
Andreas Gampe38bd1e12014-08-18 16:43:12 -0700489void JniCompilerTest::CompileAndRunStaticIntIntMethodImpl() {
Brian Carlstrom265091e2013-01-30 14:08:26 -0800490 TEST_DISABLED_FOR_PORTABLE();
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700491 SetUpForTest(true, "fooSII", "(II)I",
Elliott Hughesb264f082012-04-06 17:10:10 -0700492 reinterpret_cast<void*>(&Java_MyClassNatives_fooSII));
Shih-wei Liao82da44b2011-09-01 00:38:04 -0700493
Elliott Hughesb264f082012-04-06 17:10:10 -0700494 EXPECT_EQ(0, gJava_MyClassNatives_fooSII_calls);
Shih-wei Liao82da44b2011-09-01 00:38:04 -0700495 jint result = env_->CallStaticIntMethod(jklass_, jmethod_, 20, 30);
496 EXPECT_EQ(50, result);
Elliott Hughesb264f082012-04-06 17:10:10 -0700497 EXPECT_EQ(1, gJava_MyClassNatives_fooSII_calls);
Andreas Gampe38bd1e12014-08-18 16:43:12 -0700498
499 gJava_MyClassNatives_fooSII_calls = 0;
Shih-wei Liao82da44b2011-09-01 00:38:04 -0700500}
501
Andreas Gampe38bd1e12014-08-18 16:43:12 -0700502JNI_TEST(CompileAndRunStaticIntIntMethod)
503
Elliott Hughesb264f082012-04-06 17:10:10 -0700504int gJava_MyClassNatives_fooSDD_calls = 0;
505jdouble Java_MyClassNatives_fooSDD(JNIEnv* env, jclass klass, jdouble x, jdouble y) {
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700506 // 1 = klass
Ian Rogers50b35e22012-10-04 10:09:15 -0700507 EXPECT_EQ(kNative, Thread::Current()->GetState());
Ian Rogers7a99c112011-09-07 12:48:27 -0700508 EXPECT_EQ(Thread::Current()->GetJniEnv(), env);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700509 EXPECT_TRUE(klass != nullptr);
Ian Rogers7a99c112011-09-07 12:48:27 -0700510 EXPECT_TRUE(env->IsInstanceOf(JniCompilerTest::jobj_, klass));
Elliott Hughesb264f082012-04-06 17:10:10 -0700511 gJava_MyClassNatives_fooSDD_calls++;
Ian Rogersef7d42f2014-01-06 12:55:46 -0800512 ScopedObjectAccess soa(Thread::Current());
513 EXPECT_EQ(1U, Thread::Current()->NumStackReferences());
Ian Rogers7a99c112011-09-07 12:48:27 -0700514 return x - y; // non-commutative operator
515}
516
Andreas Gampe38bd1e12014-08-18 16:43:12 -0700517void JniCompilerTest::CompileAndRunStaticDoubleDoubleMethodImpl() {
Brian Carlstrom265091e2013-01-30 14:08:26 -0800518 TEST_DISABLED_FOR_PORTABLE();
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700519 SetUpForTest(true, "fooSDD", "(DD)D",
Elliott Hughesb264f082012-04-06 17:10:10 -0700520 reinterpret_cast<void*>(&Java_MyClassNatives_fooSDD));
Ian Rogers7a99c112011-09-07 12:48:27 -0700521
Elliott Hughesb264f082012-04-06 17:10:10 -0700522 EXPECT_EQ(0, gJava_MyClassNatives_fooSDD_calls);
Ian Rogers7a99c112011-09-07 12:48:27 -0700523 jdouble result = env_->CallStaticDoubleMethod(jklass_, jmethod_, 99.0, 10.0);
524 EXPECT_EQ(99.0 - 10.0, result);
Elliott Hughesb264f082012-04-06 17:10:10 -0700525 EXPECT_EQ(1, gJava_MyClassNatives_fooSDD_calls);
Ian Rogers7a99c112011-09-07 12:48:27 -0700526 jdouble a = 3.14159265358979323846;
527 jdouble b = 0.69314718055994530942;
528 result = env_->CallStaticDoubleMethod(jklass_, jmethod_, a, b);
529 EXPECT_EQ(a - b, result);
Elliott Hughesb264f082012-04-06 17:10:10 -0700530 EXPECT_EQ(2, gJava_MyClassNatives_fooSDD_calls);
Andreas Gampe38bd1e12014-08-18 16:43:12 -0700531
532 gJava_MyClassNatives_fooSDD_calls = 0;
Ian Rogers7a99c112011-09-07 12:48:27 -0700533}
534
Andreas Gampe38bd1e12014-08-18 16:43:12 -0700535JNI_TEST(CompileAndRunStaticDoubleDoubleMethod)
536
Nicolas Geoffrayebee8de2014-08-13 03:40:45 +0100537// The x86 generic JNI code had a bug where it assumed a floating
538// point return value would be in xmm0. We use log, to somehow ensure
539// the compiler will use the floating point stack.
540
541jdouble Java_MyClassNatives_logD(JNIEnv* env, jclass klass, jdouble x) {
542 return log(x);
543}
544
Andreas Gampe38bd1e12014-08-18 16:43:12 -0700545void JniCompilerTest::RunStaticLogDoubleMethodImpl() {
Nicolas Geoffrayebee8de2014-08-13 03:40:45 +0100546 TEST_DISABLED_FOR_PORTABLE();
Andreas Gampe38bd1e12014-08-18 16:43:12 -0700547 SetUpForTest(true, "logD", "(D)D", reinterpret_cast<void*>(&Java_MyClassNatives_logD));
Nicolas Geoffrayebee8de2014-08-13 03:40:45 +0100548
549 jdouble result = env_->CallStaticDoubleMethod(jklass_, jmethod_, 2.0);
550 EXPECT_EQ(log(2.0), result);
551}
552
Andreas Gampe38bd1e12014-08-18 16:43:12 -0700553JNI_TEST(RunStaticLogDoubleMethod)
554
Nicolas Geoffrayebee8de2014-08-13 03:40:45 +0100555jfloat Java_MyClassNatives_logF(JNIEnv* env, jclass klass, jfloat x) {
556 return logf(x);
557}
558
Andreas Gampe38bd1e12014-08-18 16:43:12 -0700559void JniCompilerTest::RunStaticLogFloatMethodImpl() {
Nicolas Geoffrayebee8de2014-08-13 03:40:45 +0100560 TEST_DISABLED_FOR_PORTABLE();
Andreas Gampe38bd1e12014-08-18 16:43:12 -0700561 SetUpForTest(true, "logF", "(F)F", reinterpret_cast<void*>(&Java_MyClassNatives_logF));
Nicolas Geoffrayebee8de2014-08-13 03:40:45 +0100562
563 jfloat result = env_->CallStaticFloatMethod(jklass_, jmethod_, 2.0);
564 EXPECT_EQ(logf(2.0), result);
565}
566
Andreas Gampe38bd1e12014-08-18 16:43:12 -0700567JNI_TEST(RunStaticLogFloatMethod)
568
Nicolas Geoffrayebee8de2014-08-13 03:40:45 +0100569jboolean Java_MyClassNatives_returnTrue(JNIEnv* env, jclass klass) {
570 return JNI_TRUE;
571}
572
573jboolean Java_MyClassNatives_returnFalse(JNIEnv* env, jclass klass) {
574 return JNI_FALSE;
575}
576
577jint Java_MyClassNatives_returnInt(JNIEnv* env, jclass klass) {
578 return 42;
579}
580
Andreas Gampe38bd1e12014-08-18 16:43:12 -0700581void JniCompilerTest::RunStaticReturnTrueImpl() {
Nicolas Geoffrayebee8de2014-08-13 03:40:45 +0100582 TEST_DISABLED_FOR_PORTABLE();
Andreas Gampe38bd1e12014-08-18 16:43:12 -0700583 SetUpForTest(true, "returnTrue", "()Z", reinterpret_cast<void*>(&Java_MyClassNatives_returnTrue));
Nicolas Geoffrayebee8de2014-08-13 03:40:45 +0100584
585 jboolean result = env_->CallStaticBooleanMethod(jklass_, jmethod_);
586 EXPECT_TRUE(result);
587}
588
Andreas Gampe38bd1e12014-08-18 16:43:12 -0700589JNI_TEST(RunStaticReturnTrue)
590
591void JniCompilerTest::RunStaticReturnFalseImpl() {
Nicolas Geoffrayebee8de2014-08-13 03:40:45 +0100592 TEST_DISABLED_FOR_PORTABLE();
Nicolas Geoffrayebee8de2014-08-13 03:40:45 +0100593 SetUpForTest(true, "returnFalse", "()Z",
Andreas Gampe38bd1e12014-08-18 16:43:12 -0700594 reinterpret_cast<void*>(&Java_MyClassNatives_returnFalse));
Nicolas Geoffrayebee8de2014-08-13 03:40:45 +0100595
596 jboolean result = env_->CallStaticBooleanMethod(jklass_, jmethod_);
597 EXPECT_FALSE(result);
598}
599
Andreas Gampe38bd1e12014-08-18 16:43:12 -0700600JNI_TEST(RunStaticReturnFalse)
601
602void JniCompilerTest::RunGenericStaticReturnIntImpl() {
Nicolas Geoffrayebee8de2014-08-13 03:40:45 +0100603 TEST_DISABLED_FOR_PORTABLE();
Andreas Gampe38bd1e12014-08-18 16:43:12 -0700604 SetUpForTest(true, "returnInt", "()I", reinterpret_cast<void*>(&Java_MyClassNatives_returnInt));
Nicolas Geoffrayebee8de2014-08-13 03:40:45 +0100605
606 jint result = env_->CallStaticIntMethod(jklass_, jmethod_);
607 EXPECT_EQ(42, result);
608}
609
Andreas Gampe38bd1e12014-08-18 16:43:12 -0700610JNI_TEST(RunGenericStaticReturnInt)
611
Elliott Hughesb264f082012-04-06 17:10:10 -0700612int gJava_MyClassNatives_fooSIOO_calls = 0;
613jobject Java_MyClassNatives_fooSIOO(JNIEnv* env, jclass klass, jint x, jobject y,
Ian Rogersb033c752011-07-20 12:22:35 -0700614 jobject z) {
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700615 // 3 = klass + y + z
Ian Rogers50b35e22012-10-04 10:09:15 -0700616 EXPECT_EQ(kNative, Thread::Current()->GetState());
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700617 EXPECT_EQ(Thread::Current()->GetJniEnv(), env);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700618 EXPECT_TRUE(klass != nullptr);
Ian Rogersa8cd9f42011-08-19 16:43:41 -0700619 EXPECT_TRUE(env->IsInstanceOf(JniCompilerTest::jobj_, klass));
Elliott Hughesb264f082012-04-06 17:10:10 -0700620 gJava_MyClassNatives_fooSIOO_calls++;
Ian Rogersef7d42f2014-01-06 12:55:46 -0800621 ScopedObjectAccess soa(Thread::Current());
Andreas Gampebf6b92a2014-03-05 16:11:04 -0800622 size_t null_args = (y == nullptr ? 1 : 0) + (z == nullptr ? 1 : 0);
623 EXPECT_TRUE(3U == Thread::Current()->NumStackReferences() ||
624 (3U - null_args) == Thread::Current()->NumStackReferences());
Ian Rogersb033c752011-07-20 12:22:35 -0700625 switch (x) {
626 case 1:
627 return y;
628 case 2:
629 return z;
630 default:
631 return klass;
632 }
633}
634
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700635
Andreas Gampe38bd1e12014-08-18 16:43:12 -0700636void JniCompilerTest::CompileAndRunStaticIntObjectObjectMethodImpl() {
Brian Carlstrom265091e2013-01-30 14:08:26 -0800637 TEST_DISABLED_FOR_PORTABLE();
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700638 SetUpForTest(true, "fooSIOO",
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700639 "(ILjava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;",
Elliott Hughesb264f082012-04-06 17:10:10 -0700640 reinterpret_cast<void*>(&Java_MyClassNatives_fooSIOO));
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700641
Elliott Hughesb264f082012-04-06 17:10:10 -0700642 EXPECT_EQ(0, gJava_MyClassNatives_fooSIOO_calls);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700643 jobject result = env_->CallStaticObjectMethod(jklass_, jmethod_, 0, nullptr, nullptr);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700644 EXPECT_TRUE(env_->IsSameObject(jklass_, result));
Elliott Hughesb264f082012-04-06 17:10:10 -0700645 EXPECT_EQ(1, gJava_MyClassNatives_fooSIOO_calls);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700646
Andreas Gampecf4035a2014-05-28 22:43:01 -0700647 result = env_->CallStaticObjectMethod(jklass_, jmethod_, 0, nullptr, jobj_);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700648 EXPECT_TRUE(env_->IsSameObject(jklass_, result));
Elliott Hughesb264f082012-04-06 17:10:10 -0700649 EXPECT_EQ(2, gJava_MyClassNatives_fooSIOO_calls);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700650 result = env_->CallStaticObjectMethod(jklass_, jmethod_, 1, nullptr, jobj_);
651 EXPECT_TRUE(env_->IsSameObject(nullptr, result));
Elliott Hughesb264f082012-04-06 17:10:10 -0700652 EXPECT_EQ(3, gJava_MyClassNatives_fooSIOO_calls);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700653 result = env_->CallStaticObjectMethod(jklass_, jmethod_, 2, nullptr, jobj_);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700654 EXPECT_TRUE(env_->IsSameObject(jobj_, result));
Elliott Hughesb264f082012-04-06 17:10:10 -0700655 EXPECT_EQ(4, gJava_MyClassNatives_fooSIOO_calls);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700656
Andreas Gampecf4035a2014-05-28 22:43:01 -0700657 result = env_->CallStaticObjectMethod(jklass_, jmethod_, 0, jobj_, nullptr);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700658 EXPECT_TRUE(env_->IsSameObject(jklass_, result));
Elliott Hughesb264f082012-04-06 17:10:10 -0700659 EXPECT_EQ(5, gJava_MyClassNatives_fooSIOO_calls);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700660 result = env_->CallStaticObjectMethod(jklass_, jmethod_, 1, jobj_, nullptr);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700661 EXPECT_TRUE(env_->IsSameObject(jobj_, result));
Elliott Hughesb264f082012-04-06 17:10:10 -0700662 EXPECT_EQ(6, gJava_MyClassNatives_fooSIOO_calls);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700663 result = env_->CallStaticObjectMethod(jklass_, jmethod_, 2, jobj_, nullptr);
664 EXPECT_TRUE(env_->IsSameObject(nullptr, result));
Elliott Hughesb264f082012-04-06 17:10:10 -0700665 EXPECT_EQ(7, gJava_MyClassNatives_fooSIOO_calls);
Andreas Gampe38bd1e12014-08-18 16:43:12 -0700666
667 gJava_MyClassNatives_fooSIOO_calls = 0;
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700668}
669
Andreas Gampe38bd1e12014-08-18 16:43:12 -0700670JNI_TEST(CompileAndRunStaticIntObjectObjectMethod)
671
Elliott Hughesb264f082012-04-06 17:10:10 -0700672int gJava_MyClassNatives_fooSSIOO_calls = 0;
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700673jobject Java_MyClassNatives_fooSSIOO(JNIEnv* env, jclass klass, jint x, jobject y, jobject z) {
674 // 3 = klass + y + z
Ian Rogers50b35e22012-10-04 10:09:15 -0700675 EXPECT_EQ(kNative, Thread::Current()->GetState());
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700676 EXPECT_EQ(Thread::Current()->GetJniEnv(), env);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700677 EXPECT_TRUE(klass != nullptr);
Ian Rogersa8cd9f42011-08-19 16:43:41 -0700678 EXPECT_TRUE(env->IsInstanceOf(JniCompilerTest::jobj_, klass));
Elliott Hughesb264f082012-04-06 17:10:10 -0700679 gJava_MyClassNatives_fooSSIOO_calls++;
Ian Rogersef7d42f2014-01-06 12:55:46 -0800680 ScopedObjectAccess soa(Thread::Current());
Andreas Gampebf6b92a2014-03-05 16:11:04 -0800681 size_t null_args = (y == nullptr ? 1 : 0) + (z == nullptr ? 1 : 0);
682 EXPECT_TRUE(3U == Thread::Current()->NumStackReferences() ||
683 (3U - null_args) == Thread::Current()->NumStackReferences());
Ian Rogersdf20fe02011-07-20 20:34:16 -0700684 switch (x) {
685 case 1:
686 return y;
687 case 2:
688 return z;
689 default:
690 return klass;
691 }
692}
693
Andreas Gampe38bd1e12014-08-18 16:43:12 -0700694void JniCompilerTest::CompileAndRunStaticSynchronizedIntObjectObjectMethodImpl() {
Brian Carlstrom265091e2013-01-30 14:08:26 -0800695 TEST_DISABLED_FOR_PORTABLE();
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700696 SetUpForTest(true, "fooSSIOO",
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700697 "(ILjava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;",
Elliott Hughesb264f082012-04-06 17:10:10 -0700698 reinterpret_cast<void*>(&Java_MyClassNatives_fooSSIOO));
Carl Shapiro419ec7b2011-08-03 14:48:33 -0700699
Elliott Hughesb264f082012-04-06 17:10:10 -0700700 EXPECT_EQ(0, gJava_MyClassNatives_fooSSIOO_calls);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700701 jobject result = env_->CallStaticObjectMethod(jklass_, jmethod_, 0, nullptr, nullptr);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700702 EXPECT_TRUE(env_->IsSameObject(jklass_, result));
Elliott Hughesb264f082012-04-06 17:10:10 -0700703 EXPECT_EQ(1, gJava_MyClassNatives_fooSSIOO_calls);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700704
Andreas Gampecf4035a2014-05-28 22:43:01 -0700705 result = env_->CallStaticObjectMethod(jklass_, jmethod_, 0, nullptr, jobj_);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700706 EXPECT_TRUE(env_->IsSameObject(jklass_, result));
Elliott Hughesb264f082012-04-06 17:10:10 -0700707 EXPECT_EQ(2, gJava_MyClassNatives_fooSSIOO_calls);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700708 result = env_->CallStaticObjectMethod(jklass_, jmethod_, 1, nullptr, jobj_);
709 EXPECT_TRUE(env_->IsSameObject(nullptr, result));
Elliott Hughesb264f082012-04-06 17:10:10 -0700710 EXPECT_EQ(3, gJava_MyClassNatives_fooSSIOO_calls);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700711 result = env_->CallStaticObjectMethod(jklass_, jmethod_, 2, nullptr, jobj_);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700712 EXPECT_TRUE(env_->IsSameObject(jobj_, result));
Elliott Hughesb264f082012-04-06 17:10:10 -0700713 EXPECT_EQ(4, gJava_MyClassNatives_fooSSIOO_calls);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700714
Andreas Gampecf4035a2014-05-28 22:43:01 -0700715 result = env_->CallStaticObjectMethod(jklass_, jmethod_, 0, jobj_, nullptr);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700716 EXPECT_TRUE(env_->IsSameObject(jklass_, result));
Elliott Hughesb264f082012-04-06 17:10:10 -0700717 EXPECT_EQ(5, gJava_MyClassNatives_fooSSIOO_calls);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700718 result = env_->CallStaticObjectMethod(jklass_, jmethod_, 1, jobj_, nullptr);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700719 EXPECT_TRUE(env_->IsSameObject(jobj_, result));
Elliott Hughesb264f082012-04-06 17:10:10 -0700720 EXPECT_EQ(6, gJava_MyClassNatives_fooSSIOO_calls);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700721 result = env_->CallStaticObjectMethod(jklass_, jmethod_, 2, jobj_, nullptr);
722 EXPECT_TRUE(env_->IsSameObject(nullptr, result));
Elliott Hughesb264f082012-04-06 17:10:10 -0700723 EXPECT_EQ(7, gJava_MyClassNatives_fooSSIOO_calls);
Andreas Gampe38bd1e12014-08-18 16:43:12 -0700724
725 gJava_MyClassNatives_fooSSIOO_calls = 0;
Ian Rogersdf20fe02011-07-20 20:34:16 -0700726}
727
Andreas Gampe38bd1e12014-08-18 16:43:12 -0700728JNI_TEST(CompileAndRunStaticSynchronizedIntObjectObjectMethod)
729
Elliott Hughesb264f082012-04-06 17:10:10 -0700730void Java_MyClassNatives_throwException(JNIEnv* env, jobject) {
Elliott Hughesa2501992011-08-26 19:39:54 -0700731 jclass c = env->FindClass("java/lang/RuntimeException");
732 env->ThrowNew(c, "hello");
733}
Ian Rogers45a76cb2011-07-21 22:00:15 -0700734
Andreas Gampe38bd1e12014-08-18 16:43:12 -0700735void JniCompilerTest::ExceptionHandlingImpl() {
Brian Carlstrom265091e2013-01-30 14:08:26 -0800736 TEST_DISABLED_FOR_PORTABLE();
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700737 {
738 ASSERT_FALSE(runtime_->IsStarted());
739 ScopedObjectAccess soa(Thread::Current());
740 class_loader_ = LoadDex("MyClassNatives");
Brian Carlstrom40381fb2011-10-19 14:13:40 -0700741
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700742 // all compilation needs to happen before Runtime::Start
743 CompileForTest(class_loader_, false, "foo", "()V");
744 CompileForTest(class_loader_, false, "throwException", "()V");
745 CompileForTest(class_loader_, false, "foo", "()V");
746 }
747 // Start runtime to avoid re-initialization in SetupForTest.
748 Thread::Current()->TransitionFromSuspendedToRunnable();
Brian Carlstrombd86bcc2013-03-10 20:26:16 -0700749 bool started = runtime_->Start();
750 CHECK(started);
Brian Carlstrom25c33252011-09-18 15:58:35 -0700751
Elliott Hughesb264f082012-04-06 17:10:10 -0700752 gJava_MyClassNatives_foo_calls = 0;
Elliott Hughesa2501992011-08-26 19:39:54 -0700753
Ian Rogers67375ac2011-09-14 00:55:44 -0700754 // Check a single call of a JNI method is ok
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700755 SetUpForTest(false, "foo", "()V", reinterpret_cast<void*>(&Java_MyClassNatives_foo));
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700756 env_->CallNonvirtualVoidMethod(jobj_, jklass_, jmethod_);
Elliott Hughesb264f082012-04-06 17:10:10 -0700757 EXPECT_EQ(1, gJava_MyClassNatives_foo_calls);
Ian Rogers67375ac2011-09-14 00:55:44 -0700758 EXPECT_FALSE(Thread::Current()->IsExceptionPending());
Elliott Hughesa2501992011-08-26 19:39:54 -0700759
Ian Rogers67375ac2011-09-14 00:55:44 -0700760 // Get class for exception we expect to be thrown
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700761 ScopedLocalRef<jclass> jlre(env_, env_->FindClass("java/lang/RuntimeException"));
762 SetUpForTest(false, "throwException", "()V",
Elliott Hughesb264f082012-04-06 17:10:10 -0700763 reinterpret_cast<void*>(&Java_MyClassNatives_throwException));
764 // Call Java_MyClassNatives_throwException (JNI method that throws exception)
Elliott Hughesa2501992011-08-26 19:39:54 -0700765 env_->CallNonvirtualVoidMethod(jobj_, jklass_, jmethod_);
Elliott Hughesb264f082012-04-06 17:10:10 -0700766 EXPECT_EQ(1, gJava_MyClassNatives_foo_calls);
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700767 EXPECT_TRUE(env_->ExceptionCheck() == JNI_TRUE);
768 ScopedLocalRef<jthrowable> exception(env_, env_->ExceptionOccurred());
769 env_->ExceptionClear();
770 EXPECT_TRUE(env_->IsInstanceOf(exception.get(), jlre.get()));
Elliott Hughesa2501992011-08-26 19:39:54 -0700771
Ian Rogers67375ac2011-09-14 00:55:44 -0700772 // Check a single call of a JNI method is ok
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700773 SetUpForTest(false, "foo", "()V", reinterpret_cast<void*>(&Java_MyClassNatives_foo));
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700774 env_->CallNonvirtualVoidMethod(jobj_, jklass_, jmethod_);
Elliott Hughesb264f082012-04-06 17:10:10 -0700775 EXPECT_EQ(2, gJava_MyClassNatives_foo_calls);
Andreas Gampe38bd1e12014-08-18 16:43:12 -0700776
777 gJava_MyClassNatives_foo_calls = 0;
Ian Rogers45a76cb2011-07-21 22:00:15 -0700778}
779
Andreas Gampe38bd1e12014-08-18 16:43:12 -0700780JNI_TEST(ExceptionHandling)
781
Elliott Hughesb264f082012-04-06 17:10:10 -0700782jint Java_MyClassNatives_nativeUpCall(JNIEnv* env, jobject thisObj, jint i) {
Shih-wei Liaoff0f9be2011-08-29 15:43:53 -0700783 if (i <= 0) {
Andreas Gampecf4035a2014-05-28 22:43:01 -0700784 // We want to check raw Object* / Array* below
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700785 ScopedObjectAccess soa(env);
Ian Rogersaaa20802011-09-11 21:47:37 -0700786
787 // Build stack trace
Sebastien Hertzee1d79a2014-02-21 15:46:30 +0100788 jobject internal = Thread::Current()->CreateInternalStackTrace<false>(soa);
Ian Rogers53b8b092014-03-13 23:45:53 -0700789 jobjectArray ste_array = Thread::InternalStackTraceToStackTraceElementArray(soa, internal);
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800790 mirror::ObjectArray<mirror::StackTraceElement>* trace_array =
791 soa.Decode<mirror::ObjectArray<mirror::StackTraceElement>*>(ste_array);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700792 EXPECT_TRUE(trace_array != nullptr);
Shih-wei Liaoff0f9be2011-08-29 15:43:53 -0700793 EXPECT_EQ(11, trace_array->GetLength());
794
Ian Rogersaaa20802011-09-11 21:47:37 -0700795 // Check stack trace entries have expected values
Shih-wei Liaoff0f9be2011-08-29 15:43:53 -0700796 for (int32_t i = 0; i < trace_array->GetLength(); ++i) {
797 EXPECT_EQ(-2, trace_array->Get(i)->GetLineNumber());
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800798 mirror::StackTraceElement* ste = trace_array->Get(i);
Ian Rogersaaa20802011-09-11 21:47:37 -0700799 EXPECT_STREQ("MyClassNatives.java", ste->GetFileName()->ToModifiedUtf8().c_str());
Elliott Hughesb264f082012-04-06 17:10:10 -0700800 EXPECT_STREQ("MyClassNatives", ste->GetDeclaringClass()->ToModifiedUtf8().c_str());
Ian Rogersaaa20802011-09-11 21:47:37 -0700801 EXPECT_STREQ("fooI", ste->GetMethodName()->ToModifiedUtf8().c_str());
Shih-wei Liaoff0f9be2011-08-29 15:43:53 -0700802 }
Ian Rogersaaa20802011-09-11 21:47:37 -0700803
804 // end recursion
Shih-wei Liaoff0f9be2011-08-29 15:43:53 -0700805 return 0;
806 } else {
Elliott Hughesb264f082012-04-06 17:10:10 -0700807 jclass jklass = env->FindClass("MyClassNatives");
Andreas Gampecf4035a2014-05-28 22:43:01 -0700808 EXPECT_TRUE(jklass != nullptr);
Shih-wei Liaoff0f9be2011-08-29 15:43:53 -0700809 jmethodID jmethod = env->GetMethodID(jklass, "fooI", "(I)I");
Andreas Gampecf4035a2014-05-28 22:43:01 -0700810 EXPECT_TRUE(jmethod != nullptr);
Shih-wei Liaoff0f9be2011-08-29 15:43:53 -0700811
Ian Rogersaaa20802011-09-11 21:47:37 -0700812 // Recurse with i - 1
Shih-wei Liaoff0f9be2011-08-29 15:43:53 -0700813 jint result = env->CallNonvirtualIntMethod(thisObj, jklass, jmethod, i - 1);
Ian Rogersaaa20802011-09-11 21:47:37 -0700814
815 // Return sum of all depths
Shih-wei Liaoff0f9be2011-08-29 15:43:53 -0700816 return i + result;
817 }
818}
819
Andreas Gampe38bd1e12014-08-18 16:43:12 -0700820void JniCompilerTest::NativeStackTraceElementImpl() {
Brian Carlstrom265091e2013-01-30 14:08:26 -0800821 TEST_DISABLED_FOR_PORTABLE();
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700822 SetUpForTest(false, "fooI", "(I)I",
Elliott Hughesb264f082012-04-06 17:10:10 -0700823 reinterpret_cast<void*>(&Java_MyClassNatives_nativeUpCall));
Shih-wei Liaoff0f9be2011-08-29 15:43:53 -0700824 jint result = env_->CallNonvirtualIntMethod(jobj_, jklass_, jmethod_, 10);
Ian Rogersaaa20802011-09-11 21:47:37 -0700825 EXPECT_EQ(10+9+8+7+6+5+4+3+2+1, result);
Shih-wei Liaoff0f9be2011-08-29 15:43:53 -0700826}
827
Andreas Gampe38bd1e12014-08-18 16:43:12 -0700828JNI_TEST(NativeStackTraceElement)
829
Elliott Hughesb264f082012-04-06 17:10:10 -0700830jobject Java_MyClassNatives_fooO(JNIEnv* env, jobject, jobject x) {
Shih-wei Liao558788e2011-09-01 02:39:11 -0700831 return env->NewGlobalRef(x);
832}
833
Andreas Gampe38bd1e12014-08-18 16:43:12 -0700834void JniCompilerTest::ReturnGlobalRefImpl() {
Brian Carlstrom265091e2013-01-30 14:08:26 -0800835 TEST_DISABLED_FOR_PORTABLE();
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700836 SetUpForTest(false, "fooO", "(Ljava/lang/Object;)Ljava/lang/Object;",
Elliott Hughesb264f082012-04-06 17:10:10 -0700837 reinterpret_cast<void*>(&Java_MyClassNatives_fooO));
Shih-wei Liao558788e2011-09-01 02:39:11 -0700838 jobject result = env_->CallNonvirtualObjectMethod(jobj_, jklass_, jmethod_, jobj_);
839 EXPECT_EQ(JNILocalRefType, env_->GetObjectRefType(result));
840 EXPECT_TRUE(env_->IsSameObject(result, jobj_));
841}
842
Andreas Gampe38bd1e12014-08-18 16:43:12 -0700843JNI_TEST(ReturnGlobalRef)
844
Ian Rogersdc51b792011-09-22 20:41:37 -0700845jint local_ref_test(JNIEnv* env, jobject thisObj, jint x) {
846 // Add 10 local references
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700847 ScopedObjectAccess soa(env);
Ian Rogers5a7a74a2011-09-26 16:32:29 -0700848 for (int i = 0; i < 10; i++) {
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800849 soa.AddLocalReference<jobject>(soa.Decode<mirror::Object*>(thisObj));
Ian Rogersdc51b792011-09-22 20:41:37 -0700850 }
851 return x+1;
852}
853
Andreas Gampe38bd1e12014-08-18 16:43:12 -0700854void JniCompilerTest::LocalReferenceTableClearingTestImpl() {
Brian Carlstrom265091e2013-01-30 14:08:26 -0800855 TEST_DISABLED_FOR_PORTABLE();
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700856 SetUpForTest(false, "fooI", "(I)I", reinterpret_cast<void*>(&local_ref_test));
Ian Rogersdc51b792011-09-22 20:41:37 -0700857 // 1000 invocations of a method that adds 10 local references
Elliott Hughesb25c3f62012-03-26 16:35:06 -0700858 for (int i = 0; i < 1000; i++) {
Ian Rogersdc51b792011-09-22 20:41:37 -0700859 jint result = env_->CallIntMethod(jobj_, jmethod_, i);
860 EXPECT_TRUE(result == i + 1);
861 }
862}
863
Andreas Gampe38bd1e12014-08-18 16:43:12 -0700864JNI_TEST(LocalReferenceTableClearingTest)
865
Ian Rogersb9231c82011-09-05 22:13:19 -0700866void my_arraycopy(JNIEnv* env, jclass klass, jobject src, jint src_pos, jobject dst, jint dst_pos, jint length) {
867 EXPECT_TRUE(env->IsSameObject(JniCompilerTest::jklass_, klass));
868 EXPECT_TRUE(env->IsSameObject(JniCompilerTest::jklass_, dst));
Ian Rogers82f3e092011-09-05 22:54:45 -0700869 EXPECT_TRUE(env->IsSameObject(JniCompilerTest::jobj_, src));
Ian Rogersb9231c82011-09-05 22:13:19 -0700870 EXPECT_EQ(1234, src_pos);
871 EXPECT_EQ(5678, dst_pos);
872 EXPECT_EQ(9876, length);
873}
874
Andreas Gampe38bd1e12014-08-18 16:43:12 -0700875void JniCompilerTest::JavaLangSystemArrayCopyImpl() {
Brian Carlstrom265091e2013-01-30 14:08:26 -0800876 TEST_DISABLED_FOR_PORTABLE();
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700877 SetUpForTest(true, "arraycopy", "(Ljava/lang/Object;ILjava/lang/Object;II)V",
Ian Rogersb9231c82011-09-05 22:13:19 -0700878 reinterpret_cast<void*>(&my_arraycopy));
Ian Rogers82f3e092011-09-05 22:54:45 -0700879 env_->CallStaticVoidMethod(jklass_, jmethod_, jobj_, 1234, jklass_, 5678, 9876);
Ian Rogersb9231c82011-09-05 22:13:19 -0700880}
881
Andreas Gampe38bd1e12014-08-18 16:43:12 -0700882JNI_TEST(JavaLangSystemArrayCopy)
883
Ian Rogers67375ac2011-09-14 00:55:44 -0700884jboolean my_casi(JNIEnv* env, jobject unsafe, jobject obj, jlong offset, jint expected, jint newval) {
885 EXPECT_TRUE(env->IsSameObject(JniCompilerTest::jobj_, unsafe));
886 EXPECT_TRUE(env->IsSameObject(JniCompilerTest::jobj_, obj));
Ian Rogers0f678472014-03-10 16:18:37 -0700887 EXPECT_EQ(INT64_C(0x12345678ABCDEF88), offset);
Ian Rogers67375ac2011-09-14 00:55:44 -0700888 EXPECT_EQ(static_cast<jint>(0xCAFEF00D), expected);
889 EXPECT_EQ(static_cast<jint>(0xEBADF00D), newval);
890 return JNI_TRUE;
891}
892
Andreas Gampe38bd1e12014-08-18 16:43:12 -0700893void JniCompilerTest::CompareAndSwapIntImpl() {
Brian Carlstrom265091e2013-01-30 14:08:26 -0800894 TEST_DISABLED_FOR_PORTABLE();
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700895 SetUpForTest(false, "compareAndSwapInt", "(Ljava/lang/Object;JII)Z",
Ian Rogers67375ac2011-09-14 00:55:44 -0700896 reinterpret_cast<void*>(&my_casi));
Ian Rogers0f678472014-03-10 16:18:37 -0700897 jboolean result = env_->CallBooleanMethod(jobj_, jmethod_, jobj_, INT64_C(0x12345678ABCDEF88),
898 0xCAFEF00D, 0xEBADF00D);
Ian Rogers67375ac2011-09-14 00:55:44 -0700899 EXPECT_EQ(result, JNI_TRUE);
900}
901
Andreas Gampe38bd1e12014-08-18 16:43:12 -0700902JNI_TEST(CompareAndSwapInt)
903
Ian Rogersc7792842012-03-03 15:36:20 -0800904jint my_gettext(JNIEnv* env, jclass klass, jlong val1, jobject obj1, jlong val2, jobject obj2) {
905 EXPECT_TRUE(env->IsInstanceOf(JniCompilerTest::jobj_, klass));
906 EXPECT_TRUE(env->IsSameObject(JniCompilerTest::jobj_, obj1));
907 EXPECT_TRUE(env->IsSameObject(JniCompilerTest::jobj_, obj2));
908 EXPECT_EQ(0x12345678ABCDEF88ll, val1);
909 EXPECT_EQ(0x7FEDCBA987654321ll, val2);
910 return 42;
911}
912
Andreas Gampe38bd1e12014-08-18 16:43:12 -0700913void JniCompilerTest::GetTextImpl() {
Brian Carlstrom265091e2013-01-30 14:08:26 -0800914 TEST_DISABLED_FOR_PORTABLE();
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700915 SetUpForTest(true, "getText", "(JLjava/lang/Object;JLjava/lang/Object;)I",
Ian Rogersc7792842012-03-03 15:36:20 -0800916 reinterpret_cast<void*>(&my_gettext));
917 jint result = env_->CallStaticIntMethod(jklass_, jmethod_, 0x12345678ABCDEF88ll, jobj_,
Ian Rogers0f678472014-03-10 16:18:37 -0700918 INT64_C(0x7FEDCBA987654321), jobj_);
Ian Rogersc7792842012-03-03 15:36:20 -0800919 EXPECT_EQ(result, 42);
920}
921
Andreas Gampe38bd1e12014-08-18 16:43:12 -0700922JNI_TEST(GetText)
923
Vladimir Markoee2d1ad2014-07-24 17:01:58 +0100924int gJava_MyClassNatives_GetSinkProperties_calls = 0;
925jarray Java_MyClassNatives_GetSinkProperties(JNIEnv* env, jobject thisObj, jstring s) {
926 // 1 = thisObj
927 Thread* self = Thread::Current();
928 EXPECT_EQ(kNative, self->GetState());
929 Locks::mutator_lock_->AssertNotHeld(self);
930 EXPECT_EQ(self->GetJniEnv(), env);
931 EXPECT_TRUE(thisObj != nullptr);
932 EXPECT_TRUE(env->IsInstanceOf(thisObj, JniCompilerTest::jklass_));
933 EXPECT_EQ(s, nullptr);
934 gJava_MyClassNatives_GetSinkProperties_calls++;
935 ScopedObjectAccess soa(self);
936 EXPECT_EQ(2U, self->NumStackReferences());
937 EXPECT_TRUE(self->HoldsLock(soa.Decode<mirror::Object*>(thisObj)));
938 return nullptr;
939}
940
Andreas Gampe38bd1e12014-08-18 16:43:12 -0700941void JniCompilerTest::GetSinkPropertiesNativeImpl() {
Brian Carlstrom265091e2013-01-30 14:08:26 -0800942 TEST_DISABLED_FOR_PORTABLE();
Vladimir Markoee2d1ad2014-07-24 17:01:58 +0100943 SetUpForTest(false, "getSinkPropertiesNative", "(Ljava/lang/String;)[Ljava/lang/Object;",
944 reinterpret_cast<void*>(&Java_MyClassNatives_GetSinkProperties));
945
946 EXPECT_EQ(0, gJava_MyClassNatives_GetSinkProperties_calls);
947 jarray result = down_cast<jarray>(
948 env_->CallNonvirtualObjectMethod(jobj_, jklass_, jmethod_, nullptr));
949 EXPECT_EQ(nullptr, result);
950 EXPECT_EQ(1, gJava_MyClassNatives_GetSinkProperties_calls);
Andreas Gampe38bd1e12014-08-18 16:43:12 -0700951
952 gJava_MyClassNatives_GetSinkProperties_calls = 0;
Brian Carlstromfc7120c2012-08-27 13:43:25 -0700953}
954
Andreas Gampe38bd1e12014-08-18 16:43:12 -0700955JNI_TEST(GetSinkPropertiesNative)
956
Elliott Hughesb264f082012-04-06 17:10:10 -0700957// This should return jclass, but we're imitating a bug pattern.
958jobject Java_MyClassNatives_instanceMethodThatShouldReturnClass(JNIEnv* env, jobject) {
959 return env->NewStringUTF("not a class!");
960}
961
962// This should return jclass, but we're imitating a bug pattern.
963jobject Java_MyClassNatives_staticMethodThatShouldReturnClass(JNIEnv* env, jclass) {
964 return env->NewStringUTF("not a class!");
965}
966
Andreas Gampe38bd1e12014-08-18 16:43:12 -0700967void JniCompilerTest::UpcallReturnTypeChecking_InstanceImpl() {
Brian Carlstrom265091e2013-01-30 14:08:26 -0800968 TEST_DISABLED_FOR_PORTABLE();
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700969 SetUpForTest(false, "instanceMethodThatShouldReturnClass", "()Ljava/lang/Class;",
Elliott Hughesb264f082012-04-06 17:10:10 -0700970 reinterpret_cast<void*>(&Java_MyClassNatives_instanceMethodThatShouldReturnClass));
971
972 CheckJniAbortCatcher check_jni_abort_catcher;
Elliott Hughes3f6635a2012-06-19 13:37:49 -0700973 // TODO: check type of returns with portable JNI compiler.
974 // This native method is bad, and tries to return a jstring as a jclass.
975 env_->CallObjectMethod(jobj_, jmethod_);
976 check_jni_abort_catcher.Check("attempt to return an instance of java.lang.String from java.lang.Class MyClassNatives.instanceMethodThatShouldReturnClass()");
977
978 // Here, we just call the method incorrectly; we should catch that too.
Elliott Hughesb264f082012-04-06 17:10:10 -0700979 env_->CallVoidMethod(jobj_, jmethod_);
Elliott Hughes3f6635a2012-06-19 13:37:49 -0700980 check_jni_abort_catcher.Check("attempt to return an instance of java.lang.String from java.lang.Class MyClassNatives.instanceMethodThatShouldReturnClass()");
981 env_->CallStaticVoidMethod(jklass_, jmethod_);
982 check_jni_abort_catcher.Check("calling non-static method java.lang.Class MyClassNatives.instanceMethodThatShouldReturnClass() with CallStaticVoidMethodV");
Elliott Hughesb264f082012-04-06 17:10:10 -0700983}
984
Andreas Gampe38bd1e12014-08-18 16:43:12 -0700985JNI_TEST(UpcallReturnTypeChecking_Instance)
986
987void JniCompilerTest::UpcallReturnTypeChecking_StaticImpl() {
Brian Carlstrom265091e2013-01-30 14:08:26 -0800988 TEST_DISABLED_FOR_PORTABLE();
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700989 SetUpForTest(true, "staticMethodThatShouldReturnClass", "()Ljava/lang/Class;",
Elliott Hughesb264f082012-04-06 17:10:10 -0700990 reinterpret_cast<void*>(&Java_MyClassNatives_staticMethodThatShouldReturnClass));
991
992 CheckJniAbortCatcher check_jni_abort_catcher;
Elliott Hughes3f6635a2012-06-19 13:37:49 -0700993 // TODO: check type of returns with portable JNI compiler.
994 // This native method is bad, and tries to return a jstring as a jclass.
995 env_->CallStaticObjectMethod(jklass_, jmethod_);
996 check_jni_abort_catcher.Check("attempt to return an instance of java.lang.String from java.lang.Class MyClassNatives.staticMethodThatShouldReturnClass()");
997
998 // Here, we just call the method incorrectly; we should catch that too.
999 env_->CallStaticVoidMethod(jklass_, jmethod_);
1000 check_jni_abort_catcher.Check("attempt to return an instance of java.lang.String from java.lang.Class MyClassNatives.staticMethodThatShouldReturnClass()");
Elliott Hughesb264f082012-04-06 17:10:10 -07001001 env_->CallVoidMethod(jobj_, jmethod_);
Elliott Hughes3f6635a2012-06-19 13:37:49 -07001002 check_jni_abort_catcher.Check("calling static method java.lang.Class MyClassNatives.staticMethodThatShouldReturnClass() with CallVoidMethodV");
Elliott Hughesb264f082012-04-06 17:10:10 -07001003}
1004
Andreas Gampe38bd1e12014-08-18 16:43:12 -07001005JNI_TEST(UpcallReturnTypeChecking_Static)
1006
Elliott Hughesb264f082012-04-06 17:10:10 -07001007// This should take jclass, but we're imitating a bug pattern.
1008void Java_MyClassNatives_instanceMethodThatShouldTakeClass(JNIEnv*, jobject, jclass) {
1009}
1010
1011// This should take jclass, but we're imitating a bug pattern.
1012void Java_MyClassNatives_staticMethodThatShouldTakeClass(JNIEnv*, jclass, jclass) {
1013}
1014
Andreas Gampe38bd1e12014-08-18 16:43:12 -07001015void JniCompilerTest::UpcallArgumentTypeChecking_InstanceImpl() {
Brian Carlstrom265091e2013-01-30 14:08:26 -08001016 TEST_DISABLED_FOR_PORTABLE();
Ian Rogers00f7d0e2012-07-19 15:28:27 -07001017 SetUpForTest(false, "instanceMethodThatShouldTakeClass", "(ILjava/lang/Class;)V",
Elliott Hughesb264f082012-04-06 17:10:10 -07001018 reinterpret_cast<void*>(&Java_MyClassNatives_instanceMethodThatShouldTakeClass));
1019
1020 CheckJniAbortCatcher check_jni_abort_catcher;
1021 // We deliberately pass a bad second argument here.
1022 env_->CallVoidMethod(jobj_, jmethod_, 123, env_->NewStringUTF("not a class!"));
Elliott Hughes3f6635a2012-06-19 13:37:49 -07001023 check_jni_abort_catcher.Check("bad arguments passed to void MyClassNatives.instanceMethodThatShouldTakeClass(int, java.lang.Class)");
Elliott Hughesb264f082012-04-06 17:10:10 -07001024}
1025
Andreas Gampe38bd1e12014-08-18 16:43:12 -07001026JNI_TEST(UpcallArgumentTypeChecking_Instance)
1027
1028void JniCompilerTest::UpcallArgumentTypeChecking_StaticImpl() {
Brian Carlstrom265091e2013-01-30 14:08:26 -08001029 TEST_DISABLED_FOR_PORTABLE();
Ian Rogers00f7d0e2012-07-19 15:28:27 -07001030 SetUpForTest(true, "staticMethodThatShouldTakeClass", "(ILjava/lang/Class;)V",
Elliott Hughesb264f082012-04-06 17:10:10 -07001031 reinterpret_cast<void*>(&Java_MyClassNatives_staticMethodThatShouldTakeClass));
1032
1033 CheckJniAbortCatcher check_jni_abort_catcher;
1034 // We deliberately pass a bad second argument here.
1035 env_->CallStaticVoidMethod(jklass_, jmethod_, 123, env_->NewStringUTF("not a class!"));
Elliott Hughes3f6635a2012-06-19 13:37:49 -07001036 check_jni_abort_catcher.Check("bad arguments passed to void MyClassNatives.staticMethodThatShouldTakeClass(int, java.lang.Class)");
Elliott Hughesb264f082012-04-06 17:10:10 -07001037}
1038
Andreas Gampe38bd1e12014-08-18 16:43:12 -07001039JNI_TEST(UpcallArgumentTypeChecking_Static)
1040
Andreas Gampe7a0e5042014-03-07 13:03:19 -08001041jfloat Java_MyClassNatives_checkFloats(JNIEnv* env, jobject thisObj, jfloat f1, jfloat f2) {
1042 EXPECT_EQ(kNative, Thread::Current()->GetState());
1043 EXPECT_EQ(Thread::Current()->GetJniEnv(), env);
Andreas Gampecf4035a2014-05-28 22:43:01 -07001044 EXPECT_TRUE(thisObj != nullptr);
Andreas Gampe7a0e5042014-03-07 13:03:19 -08001045 EXPECT_TRUE(env->IsInstanceOf(thisObj, JniCompilerTest::jklass_));
1046 ScopedObjectAccess soa(Thread::Current());
1047 EXPECT_EQ(1U, Thread::Current()->NumStackReferences());
1048 return f1 - f2; // non-commutative operator
1049}
1050
Andreas Gampe38bd1e12014-08-18 16:43:12 -07001051void JniCompilerTest::CompileAndRunFloatFloatMethodImpl() {
Andreas Gampe7a0e5042014-03-07 13:03:19 -08001052 TEST_DISABLED_FOR_PORTABLE();
1053 SetUpForTest(false, "checkFloats", "(FF)F",
1054 reinterpret_cast<void*>(&Java_MyClassNatives_checkFloats));
1055
1056 jfloat result = env_->CallNonvirtualFloatMethod(jobj_, jklass_, jmethod_,
1057 99.0F, 10.0F);
1058 EXPECT_EQ(99.0F - 10.0F, result);
1059 jfloat a = 3.14159F;
1060 jfloat b = 0.69314F;
1061 result = env_->CallNonvirtualFloatMethod(jobj_, jklass_, jmethod_, a, b);
1062 EXPECT_EQ(a - b, result);
1063}
1064
Andreas Gampe38bd1e12014-08-18 16:43:12 -07001065JNI_TEST(CompileAndRunFloatFloatMethod)
1066
Andreas Gampe7a0e5042014-03-07 13:03:19 -08001067void Java_MyClassNatives_checkParameterAlign(JNIEnv* env, jobject thisObj, jint i1, jlong l1) {
Andreas Gampecf4035a2014-05-28 22:43:01 -07001068// EXPECT_EQ(kNative, Thread::Current()->GetState());
1069// EXPECT_EQ(Thread::Current()->GetJniEnv(), env);
1070// EXPECT_TRUE(thisObj != nullptr);
1071// EXPECT_TRUE(env->IsInstanceOf(thisObj, JniCompilerTest::jklass_));
1072// ScopedObjectAccess soa(Thread::Current());
1073// EXPECT_EQ(1U, Thread::Current()->NumStackReferences());
Andreas Gampe7a0e5042014-03-07 13:03:19 -08001074 EXPECT_EQ(i1, 1234);
Ian Rogers0f678472014-03-10 16:18:37 -07001075 EXPECT_EQ(l1, INT64_C(0x12345678ABCDEF0));
Andreas Gampe7a0e5042014-03-07 13:03:19 -08001076}
1077
Andreas Gampe38bd1e12014-08-18 16:43:12 -07001078void JniCompilerTest::CheckParameterAlignImpl() {
Andreas Gampe7a0e5042014-03-07 13:03:19 -08001079 TEST_DISABLED_FOR_PORTABLE();
1080 SetUpForTest(false, "checkParameterAlign", "(IJ)V",
1081 reinterpret_cast<void*>(&Java_MyClassNatives_checkParameterAlign));
1082
Ian Rogers0f678472014-03-10 16:18:37 -07001083 env_->CallNonvirtualVoidMethod(jobj_, jklass_, jmethod_, 1234, INT64_C(0x12345678ABCDEF0));
Andreas Gampe7a0e5042014-03-07 13:03:19 -08001084}
1085
Andreas Gampe38bd1e12014-08-18 16:43:12 -07001086JNI_TEST(CheckParameterAlign)
1087
Andreas Gampe7a0e5042014-03-07 13:03:19 -08001088void Java_MyClassNatives_maxParamNumber(JNIEnv* env, jobject thisObj,
1089 jobject o0, jobject o1, jobject o2, jobject o3, jobject o4, jobject o5, jobject o6, jobject o7,
1090 jobject o8, jobject o9, jobject o10, jobject o11, jobject o12, jobject o13, jobject o14, jobject o15,
1091 jobject o16, jobject o17, jobject o18, jobject o19, jobject o20, jobject o21, jobject o22, jobject o23,
1092 jobject o24, jobject o25, jobject o26, jobject o27, jobject o28, jobject o29, jobject o30, jobject o31,
1093 jobject o32, jobject o33, jobject o34, jobject o35, jobject o36, jobject o37, jobject o38, jobject o39,
1094 jobject o40, jobject o41, jobject o42, jobject o43, jobject o44, jobject o45, jobject o46, jobject o47,
1095 jobject o48, jobject o49, jobject o50, jobject o51, jobject o52, jobject o53, jobject o54, jobject o55,
1096 jobject o56, jobject o57, jobject o58, jobject o59, jobject o60, jobject o61, jobject o62, jobject o63,
1097 jobject o64, jobject o65, jobject o66, jobject o67, jobject o68, jobject o69, jobject o70, jobject o71,
1098 jobject o72, jobject o73, jobject o74, jobject o75, jobject o76, jobject o77, jobject o78, jobject o79,
1099 jobject o80, jobject o81, jobject o82, jobject o83, jobject o84, jobject o85, jobject o86, jobject o87,
1100 jobject o88, jobject o89, jobject o90, jobject o91, jobject o92, jobject o93, jobject o94, jobject o95,
1101 jobject o96, jobject o97, jobject o98, jobject o99, jobject o100, jobject o101, jobject o102, jobject o103,
1102 jobject o104, jobject o105, jobject o106, jobject o107, jobject o108, jobject o109, jobject o110, jobject o111,
1103 jobject o112, jobject o113, jobject o114, jobject o115, jobject o116, jobject o117, jobject o118, jobject o119,
1104 jobject o120, jobject o121, jobject o122, jobject o123, jobject o124, jobject o125, jobject o126, jobject o127,
1105 jobject o128, jobject o129, jobject o130, jobject o131, jobject o132, jobject o133, jobject o134, jobject o135,
1106 jobject o136, jobject o137, jobject o138, jobject o139, jobject o140, jobject o141, jobject o142, jobject o143,
1107 jobject o144, jobject o145, jobject o146, jobject o147, jobject o148, jobject o149, jobject o150, jobject o151,
1108 jobject o152, jobject o153, jobject o154, jobject o155, jobject o156, jobject o157, jobject o158, jobject o159,
1109 jobject o160, jobject o161, jobject o162, jobject o163, jobject o164, jobject o165, jobject o166, jobject o167,
1110 jobject o168, jobject o169, jobject o170, jobject o171, jobject o172, jobject o173, jobject o174, jobject o175,
1111 jobject o176, jobject o177, jobject o178, jobject o179, jobject o180, jobject o181, jobject o182, jobject o183,
1112 jobject o184, jobject o185, jobject o186, jobject o187, jobject o188, jobject o189, jobject o190, jobject o191,
1113 jobject o192, jobject o193, jobject o194, jobject o195, jobject o196, jobject o197, jobject o198, jobject o199,
1114 jobject o200, jobject o201, jobject o202, jobject o203, jobject o204, jobject o205, jobject o206, jobject o207,
1115 jobject o208, jobject o209, jobject o210, jobject o211, jobject o212, jobject o213, jobject o214, jobject o215,
1116 jobject o216, jobject o217, jobject o218, jobject o219, jobject o220, jobject o221, jobject o222, jobject o223,
1117 jobject o224, jobject o225, jobject o226, jobject o227, jobject o228, jobject o229, jobject o230, jobject o231,
1118 jobject o232, jobject o233, jobject o234, jobject o235, jobject o236, jobject o237, jobject o238, jobject o239,
1119 jobject o240, jobject o241, jobject o242, jobject o243, jobject o244, jobject o245, jobject o246, jobject o247,
1120 jobject o248, jobject o249, jobject o250, jobject o251, jobject o252, jobject o253) {
1121 EXPECT_EQ(kNative, Thread::Current()->GetState());
1122 EXPECT_EQ(Thread::Current()->GetJniEnv(), env);
Andreas Gampecf4035a2014-05-28 22:43:01 -07001123 EXPECT_TRUE(thisObj != nullptr);
Andreas Gampe7a0e5042014-03-07 13:03:19 -08001124 EXPECT_TRUE(env->IsInstanceOf(thisObj, JniCompilerTest::jklass_));
1125 ScopedObjectAccess soa(Thread::Current());
1126 EXPECT_GE(255U, Thread::Current()->NumStackReferences());
1127
1128 // two tests possible
1129 if (o0 == nullptr) {
1130 // 1) everything is null
1131 EXPECT_TRUE(o0 == nullptr && o1 == nullptr && o2 == nullptr && o3 == nullptr && o4 == nullptr
1132 && o5 == nullptr && o6 == nullptr && o7 == nullptr && o8 == nullptr && o9 == nullptr
1133 && o10 == nullptr && o11 == nullptr && o12 == nullptr && o13 == nullptr && o14 == nullptr
1134 && o15 == nullptr && o16 == nullptr && o17 == nullptr && o18 == nullptr && o19 == nullptr
1135 && o20 == nullptr && o21 == nullptr && o22 == nullptr && o23 == nullptr && o24 == nullptr
1136 && o25 == nullptr && o26 == nullptr && o27 == nullptr && o28 == nullptr && o29 == nullptr
1137 && o30 == nullptr && o31 == nullptr && o32 == nullptr && o33 == nullptr && o34 == nullptr
1138 && o35 == nullptr && o36 == nullptr && o37 == nullptr && o38 == nullptr && o39 == nullptr
1139 && o40 == nullptr && o41 == nullptr && o42 == nullptr && o43 == nullptr && o44 == nullptr
1140 && o45 == nullptr && o46 == nullptr && o47 == nullptr && o48 == nullptr && o49 == nullptr
1141 && o50 == nullptr && o51 == nullptr && o52 == nullptr && o53 == nullptr && o54 == nullptr
1142 && o55 == nullptr && o56 == nullptr && o57 == nullptr && o58 == nullptr && o59 == nullptr
1143 && o60 == nullptr && o61 == nullptr && o62 == nullptr && o63 == nullptr && o64 == nullptr
1144 && o65 == nullptr && o66 == nullptr && o67 == nullptr && o68 == nullptr && o69 == nullptr
1145 && o70 == nullptr && o71 == nullptr && o72 == nullptr && o73 == nullptr && o74 == nullptr
1146 && o75 == nullptr && o76 == nullptr && o77 == nullptr && o78 == nullptr && o79 == nullptr
1147 && o80 == nullptr && o81 == nullptr && o82 == nullptr && o83 == nullptr && o84 == nullptr
1148 && o85 == nullptr && o86 == nullptr && o87 == nullptr && o88 == nullptr && o89 == nullptr
1149 && o90 == nullptr && o91 == nullptr && o92 == nullptr && o93 == nullptr && o94 == nullptr
1150 && o95 == nullptr && o96 == nullptr && o97 == nullptr && o98 == nullptr && o99 == nullptr
1151 && o100 == nullptr && o101 == nullptr && o102 == nullptr && o103 == nullptr && o104 == nullptr
1152 && o105 == nullptr && o106 == nullptr && o107 == nullptr && o108 == nullptr && o109 == nullptr
1153 && o110 == nullptr && o111 == nullptr && o112 == nullptr && o113 == nullptr && o114 == nullptr
1154 && o115 == nullptr && o116 == nullptr && o117 == nullptr && o118 == nullptr && o119 == nullptr
1155 && o120 == nullptr && o121 == nullptr && o122 == nullptr && o123 == nullptr && o124 == nullptr
1156 && o125 == nullptr && o126 == nullptr && o127 == nullptr && o128 == nullptr && o129 == nullptr
1157 && o130 == nullptr && o131 == nullptr && o132 == nullptr && o133 == nullptr && o134 == nullptr
1158 && o135 == nullptr && o136 == nullptr && o137 == nullptr && o138 == nullptr && o139 == nullptr
1159 && o140 == nullptr && o141 == nullptr && o142 == nullptr && o143 == nullptr && o144 == nullptr
1160 && o145 == nullptr && o146 == nullptr && o147 == nullptr && o148 == nullptr && o149 == nullptr
1161 && o150 == nullptr && o151 == nullptr && o152 == nullptr && o153 == nullptr && o154 == nullptr
1162 && o155 == nullptr && o156 == nullptr && o157 == nullptr && o158 == nullptr && o159 == nullptr
1163 && o160 == nullptr && o161 == nullptr && o162 == nullptr && o163 == nullptr && o164 == nullptr
1164 && o165 == nullptr && o166 == nullptr && o167 == nullptr && o168 == nullptr && o169 == nullptr
1165 && o170 == nullptr && o171 == nullptr && o172 == nullptr && o173 == nullptr && o174 == nullptr
1166 && o175 == nullptr && o176 == nullptr && o177 == nullptr && o178 == nullptr && o179 == nullptr
1167 && o180 == nullptr && o181 == nullptr && o182 == nullptr && o183 == nullptr && o184 == nullptr
1168 && o185 == nullptr && o186 == nullptr && o187 == nullptr && o188 == nullptr && o189 == nullptr
1169 && o190 == nullptr && o191 == nullptr && o192 == nullptr && o193 == nullptr && o194 == nullptr
1170 && o195 == nullptr && o196 == nullptr && o197 == nullptr && o198 == nullptr && o199 == nullptr
1171 && o200 == nullptr && o201 == nullptr && o202 == nullptr && o203 == nullptr && o204 == nullptr
1172 && o205 == nullptr && o206 == nullptr && o207 == nullptr && o208 == nullptr && o209 == nullptr
1173 && o210 == nullptr && o211 == nullptr && o212 == nullptr && o213 == nullptr && o214 == nullptr
1174 && o215 == nullptr && o216 == nullptr && o217 == nullptr && o218 == nullptr && o219 == nullptr
1175 && o220 == nullptr && o221 == nullptr && o222 == nullptr && o223 == nullptr && o224 == nullptr
1176 && o225 == nullptr && o226 == nullptr && o227 == nullptr && o228 == nullptr && o229 == nullptr
1177 && o230 == nullptr && o231 == nullptr && o232 == nullptr && o233 == nullptr && o234 == nullptr
1178 && o235 == nullptr && o236 == nullptr && o237 == nullptr && o238 == nullptr && o239 == nullptr
1179 && o240 == nullptr && o241 == nullptr && o242 == nullptr && o243 == nullptr && o244 == nullptr
1180 && o245 == nullptr && o246 == nullptr && o247 == nullptr && o248 == nullptr && o249 == nullptr
1181 && o250 == nullptr && o251 == nullptr && o252 == nullptr && o253 == nullptr);
1182 } else {
1183 EXPECT_EQ(0, env->GetArrayLength(reinterpret_cast<jarray>(o0)));
1184 EXPECT_EQ(1, env->GetArrayLength(reinterpret_cast<jarray>(o1)));
1185 EXPECT_EQ(2, env->GetArrayLength(reinterpret_cast<jarray>(o2)));
1186 EXPECT_EQ(3, env->GetArrayLength(reinterpret_cast<jarray>(o3)));
1187 EXPECT_EQ(4, env->GetArrayLength(reinterpret_cast<jarray>(o4)));
1188 EXPECT_EQ(5, env->GetArrayLength(reinterpret_cast<jarray>(o5)));
1189 EXPECT_EQ(6, env->GetArrayLength(reinterpret_cast<jarray>(o6)));
1190 EXPECT_EQ(7, env->GetArrayLength(reinterpret_cast<jarray>(o7)));
1191 EXPECT_EQ(8, env->GetArrayLength(reinterpret_cast<jarray>(o8)));
1192 EXPECT_EQ(9, env->GetArrayLength(reinterpret_cast<jarray>(o9)));
1193 EXPECT_EQ(10, env->GetArrayLength(reinterpret_cast<jarray>(o10)));
1194 EXPECT_EQ(11, env->GetArrayLength(reinterpret_cast<jarray>(o11)));
1195 EXPECT_EQ(12, env->GetArrayLength(reinterpret_cast<jarray>(o12)));
1196 EXPECT_EQ(13, env->GetArrayLength(reinterpret_cast<jarray>(o13)));
1197 EXPECT_EQ(14, env->GetArrayLength(reinterpret_cast<jarray>(o14)));
1198 EXPECT_EQ(15, env->GetArrayLength(reinterpret_cast<jarray>(o15)));
1199 EXPECT_EQ(16, env->GetArrayLength(reinterpret_cast<jarray>(o16)));
1200 EXPECT_EQ(17, env->GetArrayLength(reinterpret_cast<jarray>(o17)));
1201 EXPECT_EQ(18, env->GetArrayLength(reinterpret_cast<jarray>(o18)));
1202 EXPECT_EQ(19, env->GetArrayLength(reinterpret_cast<jarray>(o19)));
1203 EXPECT_EQ(20, env->GetArrayLength(reinterpret_cast<jarray>(o20)));
1204 EXPECT_EQ(21, env->GetArrayLength(reinterpret_cast<jarray>(o21)));
1205 EXPECT_EQ(22, env->GetArrayLength(reinterpret_cast<jarray>(o22)));
1206 EXPECT_EQ(23, env->GetArrayLength(reinterpret_cast<jarray>(o23)));
1207 EXPECT_EQ(24, env->GetArrayLength(reinterpret_cast<jarray>(o24)));
1208 EXPECT_EQ(25, env->GetArrayLength(reinterpret_cast<jarray>(o25)));
1209 EXPECT_EQ(26, env->GetArrayLength(reinterpret_cast<jarray>(o26)));
1210 EXPECT_EQ(27, env->GetArrayLength(reinterpret_cast<jarray>(o27)));
1211 EXPECT_EQ(28, env->GetArrayLength(reinterpret_cast<jarray>(o28)));
1212 EXPECT_EQ(29, env->GetArrayLength(reinterpret_cast<jarray>(o29)));
1213 EXPECT_EQ(30, env->GetArrayLength(reinterpret_cast<jarray>(o30)));
1214 EXPECT_EQ(31, env->GetArrayLength(reinterpret_cast<jarray>(o31)));
1215 EXPECT_EQ(32, env->GetArrayLength(reinterpret_cast<jarray>(o32)));
1216 EXPECT_EQ(33, env->GetArrayLength(reinterpret_cast<jarray>(o33)));
1217 EXPECT_EQ(34, env->GetArrayLength(reinterpret_cast<jarray>(o34)));
1218 EXPECT_EQ(35, env->GetArrayLength(reinterpret_cast<jarray>(o35)));
1219 EXPECT_EQ(36, env->GetArrayLength(reinterpret_cast<jarray>(o36)));
1220 EXPECT_EQ(37, env->GetArrayLength(reinterpret_cast<jarray>(o37)));
1221 EXPECT_EQ(38, env->GetArrayLength(reinterpret_cast<jarray>(o38)));
1222 EXPECT_EQ(39, env->GetArrayLength(reinterpret_cast<jarray>(o39)));
1223 EXPECT_EQ(40, env->GetArrayLength(reinterpret_cast<jarray>(o40)));
1224 EXPECT_EQ(41, env->GetArrayLength(reinterpret_cast<jarray>(o41)));
1225 EXPECT_EQ(42, env->GetArrayLength(reinterpret_cast<jarray>(o42)));
1226 EXPECT_EQ(43, env->GetArrayLength(reinterpret_cast<jarray>(o43)));
1227 EXPECT_EQ(44, env->GetArrayLength(reinterpret_cast<jarray>(o44)));
1228 EXPECT_EQ(45, env->GetArrayLength(reinterpret_cast<jarray>(o45)));
1229 EXPECT_EQ(46, env->GetArrayLength(reinterpret_cast<jarray>(o46)));
1230 EXPECT_EQ(47, env->GetArrayLength(reinterpret_cast<jarray>(o47)));
1231 EXPECT_EQ(48, env->GetArrayLength(reinterpret_cast<jarray>(o48)));
1232 EXPECT_EQ(49, env->GetArrayLength(reinterpret_cast<jarray>(o49)));
1233 EXPECT_EQ(50, env->GetArrayLength(reinterpret_cast<jarray>(o50)));
1234 EXPECT_EQ(51, env->GetArrayLength(reinterpret_cast<jarray>(o51)));
1235 EXPECT_EQ(52, env->GetArrayLength(reinterpret_cast<jarray>(o52)));
1236 EXPECT_EQ(53, env->GetArrayLength(reinterpret_cast<jarray>(o53)));
1237 EXPECT_EQ(54, env->GetArrayLength(reinterpret_cast<jarray>(o54)));
1238 EXPECT_EQ(55, env->GetArrayLength(reinterpret_cast<jarray>(o55)));
1239 EXPECT_EQ(56, env->GetArrayLength(reinterpret_cast<jarray>(o56)));
1240 EXPECT_EQ(57, env->GetArrayLength(reinterpret_cast<jarray>(o57)));
1241 EXPECT_EQ(58, env->GetArrayLength(reinterpret_cast<jarray>(o58)));
1242 EXPECT_EQ(59, env->GetArrayLength(reinterpret_cast<jarray>(o59)));
1243 EXPECT_EQ(60, env->GetArrayLength(reinterpret_cast<jarray>(o60)));
1244 EXPECT_EQ(61, env->GetArrayLength(reinterpret_cast<jarray>(o61)));
1245 EXPECT_EQ(62, env->GetArrayLength(reinterpret_cast<jarray>(o62)));
1246 EXPECT_EQ(63, env->GetArrayLength(reinterpret_cast<jarray>(o63)));
1247 EXPECT_EQ(64, env->GetArrayLength(reinterpret_cast<jarray>(o64)));
1248 EXPECT_EQ(65, env->GetArrayLength(reinterpret_cast<jarray>(o65)));
1249 EXPECT_EQ(66, env->GetArrayLength(reinterpret_cast<jarray>(o66)));
1250 EXPECT_EQ(67, env->GetArrayLength(reinterpret_cast<jarray>(o67)));
1251 EXPECT_EQ(68, env->GetArrayLength(reinterpret_cast<jarray>(o68)));
1252 EXPECT_EQ(69, env->GetArrayLength(reinterpret_cast<jarray>(o69)));
1253 EXPECT_EQ(70, env->GetArrayLength(reinterpret_cast<jarray>(o70)));
1254 EXPECT_EQ(71, env->GetArrayLength(reinterpret_cast<jarray>(o71)));
1255 EXPECT_EQ(72, env->GetArrayLength(reinterpret_cast<jarray>(o72)));
1256 EXPECT_EQ(73, env->GetArrayLength(reinterpret_cast<jarray>(o73)));
1257 EXPECT_EQ(74, env->GetArrayLength(reinterpret_cast<jarray>(o74)));
1258 EXPECT_EQ(75, env->GetArrayLength(reinterpret_cast<jarray>(o75)));
1259 EXPECT_EQ(76, env->GetArrayLength(reinterpret_cast<jarray>(o76)));
1260 EXPECT_EQ(77, env->GetArrayLength(reinterpret_cast<jarray>(o77)));
1261 EXPECT_EQ(78, env->GetArrayLength(reinterpret_cast<jarray>(o78)));
1262 EXPECT_EQ(79, env->GetArrayLength(reinterpret_cast<jarray>(o79)));
1263 EXPECT_EQ(80, env->GetArrayLength(reinterpret_cast<jarray>(o80)));
1264 EXPECT_EQ(81, env->GetArrayLength(reinterpret_cast<jarray>(o81)));
1265 EXPECT_EQ(82, env->GetArrayLength(reinterpret_cast<jarray>(o82)));
1266 EXPECT_EQ(83, env->GetArrayLength(reinterpret_cast<jarray>(o83)));
1267 EXPECT_EQ(84, env->GetArrayLength(reinterpret_cast<jarray>(o84)));
1268 EXPECT_EQ(85, env->GetArrayLength(reinterpret_cast<jarray>(o85)));
1269 EXPECT_EQ(86, env->GetArrayLength(reinterpret_cast<jarray>(o86)));
1270 EXPECT_EQ(87, env->GetArrayLength(reinterpret_cast<jarray>(o87)));
1271 EXPECT_EQ(88, env->GetArrayLength(reinterpret_cast<jarray>(o88)));
1272 EXPECT_EQ(89, env->GetArrayLength(reinterpret_cast<jarray>(o89)));
1273 EXPECT_EQ(90, env->GetArrayLength(reinterpret_cast<jarray>(o90)));
1274 EXPECT_EQ(91, env->GetArrayLength(reinterpret_cast<jarray>(o91)));
1275 EXPECT_EQ(92, env->GetArrayLength(reinterpret_cast<jarray>(o92)));
1276 EXPECT_EQ(93, env->GetArrayLength(reinterpret_cast<jarray>(o93)));
1277 EXPECT_EQ(94, env->GetArrayLength(reinterpret_cast<jarray>(o94)));
1278 EXPECT_EQ(95, env->GetArrayLength(reinterpret_cast<jarray>(o95)));
1279 EXPECT_EQ(96, env->GetArrayLength(reinterpret_cast<jarray>(o96)));
1280 EXPECT_EQ(97, env->GetArrayLength(reinterpret_cast<jarray>(o97)));
1281 EXPECT_EQ(98, env->GetArrayLength(reinterpret_cast<jarray>(o98)));
1282 EXPECT_EQ(99, env->GetArrayLength(reinterpret_cast<jarray>(o99)));
1283 EXPECT_EQ(100, env->GetArrayLength(reinterpret_cast<jarray>(o100)));
1284 EXPECT_EQ(101, env->GetArrayLength(reinterpret_cast<jarray>(o101)));
1285 EXPECT_EQ(102, env->GetArrayLength(reinterpret_cast<jarray>(o102)));
1286 EXPECT_EQ(103, env->GetArrayLength(reinterpret_cast<jarray>(o103)));
1287 EXPECT_EQ(104, env->GetArrayLength(reinterpret_cast<jarray>(o104)));
1288 EXPECT_EQ(105, env->GetArrayLength(reinterpret_cast<jarray>(o105)));
1289 EXPECT_EQ(106, env->GetArrayLength(reinterpret_cast<jarray>(o106)));
1290 EXPECT_EQ(107, env->GetArrayLength(reinterpret_cast<jarray>(o107)));
1291 EXPECT_EQ(108, env->GetArrayLength(reinterpret_cast<jarray>(o108)));
1292 EXPECT_EQ(109, env->GetArrayLength(reinterpret_cast<jarray>(o109)));
1293 EXPECT_EQ(110, env->GetArrayLength(reinterpret_cast<jarray>(o110)));
1294 EXPECT_EQ(111, env->GetArrayLength(reinterpret_cast<jarray>(o111)));
1295 EXPECT_EQ(112, env->GetArrayLength(reinterpret_cast<jarray>(o112)));
1296 EXPECT_EQ(113, env->GetArrayLength(reinterpret_cast<jarray>(o113)));
1297 EXPECT_EQ(114, env->GetArrayLength(reinterpret_cast<jarray>(o114)));
1298 EXPECT_EQ(115, env->GetArrayLength(reinterpret_cast<jarray>(o115)));
1299 EXPECT_EQ(116, env->GetArrayLength(reinterpret_cast<jarray>(o116)));
1300 EXPECT_EQ(117, env->GetArrayLength(reinterpret_cast<jarray>(o117)));
1301 EXPECT_EQ(118, env->GetArrayLength(reinterpret_cast<jarray>(o118)));
1302 EXPECT_EQ(119, env->GetArrayLength(reinterpret_cast<jarray>(o119)));
1303 EXPECT_EQ(120, env->GetArrayLength(reinterpret_cast<jarray>(o120)));
1304 EXPECT_EQ(121, env->GetArrayLength(reinterpret_cast<jarray>(o121)));
1305 EXPECT_EQ(122, env->GetArrayLength(reinterpret_cast<jarray>(o122)));
1306 EXPECT_EQ(123, env->GetArrayLength(reinterpret_cast<jarray>(o123)));
1307 EXPECT_EQ(124, env->GetArrayLength(reinterpret_cast<jarray>(o124)));
1308 EXPECT_EQ(125, env->GetArrayLength(reinterpret_cast<jarray>(o125)));
1309 EXPECT_EQ(126, env->GetArrayLength(reinterpret_cast<jarray>(o126)));
1310 EXPECT_EQ(127, env->GetArrayLength(reinterpret_cast<jarray>(o127)));
1311 EXPECT_EQ(128, env->GetArrayLength(reinterpret_cast<jarray>(o128)));
1312 EXPECT_EQ(129, env->GetArrayLength(reinterpret_cast<jarray>(o129)));
1313 EXPECT_EQ(130, env->GetArrayLength(reinterpret_cast<jarray>(o130)));
1314 EXPECT_EQ(131, env->GetArrayLength(reinterpret_cast<jarray>(o131)));
1315 EXPECT_EQ(132, env->GetArrayLength(reinterpret_cast<jarray>(o132)));
1316 EXPECT_EQ(133, env->GetArrayLength(reinterpret_cast<jarray>(o133)));
1317 EXPECT_EQ(134, env->GetArrayLength(reinterpret_cast<jarray>(o134)));
1318 EXPECT_EQ(135, env->GetArrayLength(reinterpret_cast<jarray>(o135)));
1319 EXPECT_EQ(136, env->GetArrayLength(reinterpret_cast<jarray>(o136)));
1320 EXPECT_EQ(137, env->GetArrayLength(reinterpret_cast<jarray>(o137)));
1321 EXPECT_EQ(138, env->GetArrayLength(reinterpret_cast<jarray>(o138)));
1322 EXPECT_EQ(139, env->GetArrayLength(reinterpret_cast<jarray>(o139)));
1323 EXPECT_EQ(140, env->GetArrayLength(reinterpret_cast<jarray>(o140)));
1324 EXPECT_EQ(141, env->GetArrayLength(reinterpret_cast<jarray>(o141)));
1325 EXPECT_EQ(142, env->GetArrayLength(reinterpret_cast<jarray>(o142)));
1326 EXPECT_EQ(143, env->GetArrayLength(reinterpret_cast<jarray>(o143)));
1327 EXPECT_EQ(144, env->GetArrayLength(reinterpret_cast<jarray>(o144)));
1328 EXPECT_EQ(145, env->GetArrayLength(reinterpret_cast<jarray>(o145)));
1329 EXPECT_EQ(146, env->GetArrayLength(reinterpret_cast<jarray>(o146)));
1330 EXPECT_EQ(147, env->GetArrayLength(reinterpret_cast<jarray>(o147)));
1331 EXPECT_EQ(148, env->GetArrayLength(reinterpret_cast<jarray>(o148)));
1332 EXPECT_EQ(149, env->GetArrayLength(reinterpret_cast<jarray>(o149)));
1333 EXPECT_EQ(150, env->GetArrayLength(reinterpret_cast<jarray>(o150)));
1334 EXPECT_EQ(151, env->GetArrayLength(reinterpret_cast<jarray>(o151)));
1335 EXPECT_EQ(152, env->GetArrayLength(reinterpret_cast<jarray>(o152)));
1336 EXPECT_EQ(153, env->GetArrayLength(reinterpret_cast<jarray>(o153)));
1337 EXPECT_EQ(154, env->GetArrayLength(reinterpret_cast<jarray>(o154)));
1338 EXPECT_EQ(155, env->GetArrayLength(reinterpret_cast<jarray>(o155)));
1339 EXPECT_EQ(156, env->GetArrayLength(reinterpret_cast<jarray>(o156)));
1340 EXPECT_EQ(157, env->GetArrayLength(reinterpret_cast<jarray>(o157)));
1341 EXPECT_EQ(158, env->GetArrayLength(reinterpret_cast<jarray>(o158)));
1342 EXPECT_EQ(159, env->GetArrayLength(reinterpret_cast<jarray>(o159)));
1343 EXPECT_EQ(160, env->GetArrayLength(reinterpret_cast<jarray>(o160)));
1344 EXPECT_EQ(161, env->GetArrayLength(reinterpret_cast<jarray>(o161)));
1345 EXPECT_EQ(162, env->GetArrayLength(reinterpret_cast<jarray>(o162)));
1346 EXPECT_EQ(163, env->GetArrayLength(reinterpret_cast<jarray>(o163)));
1347 EXPECT_EQ(164, env->GetArrayLength(reinterpret_cast<jarray>(o164)));
1348 EXPECT_EQ(165, env->GetArrayLength(reinterpret_cast<jarray>(o165)));
1349 EXPECT_EQ(166, env->GetArrayLength(reinterpret_cast<jarray>(o166)));
1350 EXPECT_EQ(167, env->GetArrayLength(reinterpret_cast<jarray>(o167)));
1351 EXPECT_EQ(168, env->GetArrayLength(reinterpret_cast<jarray>(o168)));
1352 EXPECT_EQ(169, env->GetArrayLength(reinterpret_cast<jarray>(o169)));
1353 EXPECT_EQ(170, env->GetArrayLength(reinterpret_cast<jarray>(o170)));
1354 EXPECT_EQ(171, env->GetArrayLength(reinterpret_cast<jarray>(o171)));
1355 EXPECT_EQ(172, env->GetArrayLength(reinterpret_cast<jarray>(o172)));
1356 EXPECT_EQ(173, env->GetArrayLength(reinterpret_cast<jarray>(o173)));
1357 EXPECT_EQ(174, env->GetArrayLength(reinterpret_cast<jarray>(o174)));
1358 EXPECT_EQ(175, env->GetArrayLength(reinterpret_cast<jarray>(o175)));
1359 EXPECT_EQ(176, env->GetArrayLength(reinterpret_cast<jarray>(o176)));
1360 EXPECT_EQ(177, env->GetArrayLength(reinterpret_cast<jarray>(o177)));
1361 EXPECT_EQ(178, env->GetArrayLength(reinterpret_cast<jarray>(o178)));
1362 EXPECT_EQ(179, env->GetArrayLength(reinterpret_cast<jarray>(o179)));
1363 EXPECT_EQ(180, env->GetArrayLength(reinterpret_cast<jarray>(o180)));
1364 EXPECT_EQ(181, env->GetArrayLength(reinterpret_cast<jarray>(o181)));
1365 EXPECT_EQ(182, env->GetArrayLength(reinterpret_cast<jarray>(o182)));
1366 EXPECT_EQ(183, env->GetArrayLength(reinterpret_cast<jarray>(o183)));
1367 EXPECT_EQ(184, env->GetArrayLength(reinterpret_cast<jarray>(o184)));
1368 EXPECT_EQ(185, env->GetArrayLength(reinterpret_cast<jarray>(o185)));
1369 EXPECT_EQ(186, env->GetArrayLength(reinterpret_cast<jarray>(o186)));
1370 EXPECT_EQ(187, env->GetArrayLength(reinterpret_cast<jarray>(o187)));
1371 EXPECT_EQ(188, env->GetArrayLength(reinterpret_cast<jarray>(o188)));
1372 EXPECT_EQ(189, env->GetArrayLength(reinterpret_cast<jarray>(o189)));
1373 EXPECT_EQ(190, env->GetArrayLength(reinterpret_cast<jarray>(o190)));
1374 EXPECT_EQ(191, env->GetArrayLength(reinterpret_cast<jarray>(o191)));
1375 EXPECT_EQ(192, env->GetArrayLength(reinterpret_cast<jarray>(o192)));
1376 EXPECT_EQ(193, env->GetArrayLength(reinterpret_cast<jarray>(o193)));
1377 EXPECT_EQ(194, env->GetArrayLength(reinterpret_cast<jarray>(o194)));
1378 EXPECT_EQ(195, env->GetArrayLength(reinterpret_cast<jarray>(o195)));
1379 EXPECT_EQ(196, env->GetArrayLength(reinterpret_cast<jarray>(o196)));
1380 EXPECT_EQ(197, env->GetArrayLength(reinterpret_cast<jarray>(o197)));
1381 EXPECT_EQ(198, env->GetArrayLength(reinterpret_cast<jarray>(o198)));
1382 EXPECT_EQ(199, env->GetArrayLength(reinterpret_cast<jarray>(o199)));
1383 EXPECT_EQ(200, env->GetArrayLength(reinterpret_cast<jarray>(o200)));
1384 EXPECT_EQ(201, env->GetArrayLength(reinterpret_cast<jarray>(o201)));
1385 EXPECT_EQ(202, env->GetArrayLength(reinterpret_cast<jarray>(o202)));
1386 EXPECT_EQ(203, env->GetArrayLength(reinterpret_cast<jarray>(o203)));
1387 EXPECT_EQ(204, env->GetArrayLength(reinterpret_cast<jarray>(o204)));
1388 EXPECT_EQ(205, env->GetArrayLength(reinterpret_cast<jarray>(o205)));
1389 EXPECT_EQ(206, env->GetArrayLength(reinterpret_cast<jarray>(o206)));
1390 EXPECT_EQ(207, env->GetArrayLength(reinterpret_cast<jarray>(o207)));
1391 EXPECT_EQ(208, env->GetArrayLength(reinterpret_cast<jarray>(o208)));
1392 EXPECT_EQ(209, env->GetArrayLength(reinterpret_cast<jarray>(o209)));
1393 EXPECT_EQ(210, env->GetArrayLength(reinterpret_cast<jarray>(o210)));
1394 EXPECT_EQ(211, env->GetArrayLength(reinterpret_cast<jarray>(o211)));
1395 EXPECT_EQ(212, env->GetArrayLength(reinterpret_cast<jarray>(o212)));
1396 EXPECT_EQ(213, env->GetArrayLength(reinterpret_cast<jarray>(o213)));
1397 EXPECT_EQ(214, env->GetArrayLength(reinterpret_cast<jarray>(o214)));
1398 EXPECT_EQ(215, env->GetArrayLength(reinterpret_cast<jarray>(o215)));
1399 EXPECT_EQ(216, env->GetArrayLength(reinterpret_cast<jarray>(o216)));
1400 EXPECT_EQ(217, env->GetArrayLength(reinterpret_cast<jarray>(o217)));
1401 EXPECT_EQ(218, env->GetArrayLength(reinterpret_cast<jarray>(o218)));
1402 EXPECT_EQ(219, env->GetArrayLength(reinterpret_cast<jarray>(o219)));
1403 EXPECT_EQ(220, env->GetArrayLength(reinterpret_cast<jarray>(o220)));
1404 EXPECT_EQ(221, env->GetArrayLength(reinterpret_cast<jarray>(o221)));
1405 EXPECT_EQ(222, env->GetArrayLength(reinterpret_cast<jarray>(o222)));
1406 EXPECT_EQ(223, env->GetArrayLength(reinterpret_cast<jarray>(o223)));
1407 EXPECT_EQ(224, env->GetArrayLength(reinterpret_cast<jarray>(o224)));
1408 EXPECT_EQ(225, env->GetArrayLength(reinterpret_cast<jarray>(o225)));
1409 EXPECT_EQ(226, env->GetArrayLength(reinterpret_cast<jarray>(o226)));
1410 EXPECT_EQ(227, env->GetArrayLength(reinterpret_cast<jarray>(o227)));
1411 EXPECT_EQ(228, env->GetArrayLength(reinterpret_cast<jarray>(o228)));
1412 EXPECT_EQ(229, env->GetArrayLength(reinterpret_cast<jarray>(o229)));
1413 EXPECT_EQ(230, env->GetArrayLength(reinterpret_cast<jarray>(o230)));
1414 EXPECT_EQ(231, env->GetArrayLength(reinterpret_cast<jarray>(o231)));
1415 EXPECT_EQ(232, env->GetArrayLength(reinterpret_cast<jarray>(o232)));
1416 EXPECT_EQ(233, env->GetArrayLength(reinterpret_cast<jarray>(o233)));
1417 EXPECT_EQ(234, env->GetArrayLength(reinterpret_cast<jarray>(o234)));
1418 EXPECT_EQ(235, env->GetArrayLength(reinterpret_cast<jarray>(o235)));
1419 EXPECT_EQ(236, env->GetArrayLength(reinterpret_cast<jarray>(o236)));
1420 EXPECT_EQ(237, env->GetArrayLength(reinterpret_cast<jarray>(o237)));
1421 EXPECT_EQ(238, env->GetArrayLength(reinterpret_cast<jarray>(o238)));
1422 EXPECT_EQ(239, env->GetArrayLength(reinterpret_cast<jarray>(o239)));
1423 EXPECT_EQ(240, env->GetArrayLength(reinterpret_cast<jarray>(o240)));
1424 EXPECT_EQ(241, env->GetArrayLength(reinterpret_cast<jarray>(o241)));
1425 EXPECT_EQ(242, env->GetArrayLength(reinterpret_cast<jarray>(o242)));
1426 EXPECT_EQ(243, env->GetArrayLength(reinterpret_cast<jarray>(o243)));
1427 EXPECT_EQ(244, env->GetArrayLength(reinterpret_cast<jarray>(o244)));
1428 EXPECT_EQ(245, env->GetArrayLength(reinterpret_cast<jarray>(o245)));
1429 EXPECT_EQ(246, env->GetArrayLength(reinterpret_cast<jarray>(o246)));
1430 EXPECT_EQ(247, env->GetArrayLength(reinterpret_cast<jarray>(o247)));
1431 EXPECT_EQ(248, env->GetArrayLength(reinterpret_cast<jarray>(o248)));
1432 EXPECT_EQ(249, env->GetArrayLength(reinterpret_cast<jarray>(o249)));
1433 EXPECT_EQ(250, env->GetArrayLength(reinterpret_cast<jarray>(o250)));
1434 EXPECT_EQ(251, env->GetArrayLength(reinterpret_cast<jarray>(o251)));
1435 EXPECT_EQ(252, env->GetArrayLength(reinterpret_cast<jarray>(o252)));
1436 EXPECT_EQ(253, env->GetArrayLength(reinterpret_cast<jarray>(o253)));
1437 }
1438}
1439
1440const char* longSig =
1441 "(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1442 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1443 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1444 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1445 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1446 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1447 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1448 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1449 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1450 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1451 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1452 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1453 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1454 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1455 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1456 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1457 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1458 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1459 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1460 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1461 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1462 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1463 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1464 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1465 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1466 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1467 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1468 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1469 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1470 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1471 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1472 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1473 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1474 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1475 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1476 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1477 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1478 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1479 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1480 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1481 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1482 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1483 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1484 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1485 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1486 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1487 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1488 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1489 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1490 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1491 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)V";
1492
Andreas Gampe38bd1e12014-08-18 16:43:12 -07001493void JniCompilerTest::MaxParamNumberImpl() {
Andreas Gampe7a0e5042014-03-07 13:03:19 -08001494 TEST_DISABLED_FOR_PORTABLE();
1495 SetUpForTest(false, "maxParamNumber", longSig,
1496 reinterpret_cast<void*>(&Java_MyClassNatives_maxParamNumber));
1497
1498 jvalue args[254];
1499
1500 // First test: test with all arguments null.
1501 for (int i = 0; i < 254; ++i) {
1502 args[i].l = nullptr;
1503 }
1504
1505 env_->CallNonvirtualVoidMethodA(jobj_, jklass_, jmethod_, args);
1506
1507 // Second test: test with int[] objects with increasing lengths
1508 for (int i = 0; i < 254; ++i) {
1509 jintArray tmp = env_->NewIntArray(i);
1510 args[i].l = tmp;
1511 EXPECT_NE(args[i].l, nullptr);
1512 }
1513
1514 env_->CallNonvirtualVoidMethodA(jobj_, jklass_, jmethod_, args);
1515}
1516
Andreas Gampe38bd1e12014-08-18 16:43:12 -07001517JNI_TEST(MaxParamNumber)
1518
1519void JniCompilerTest::WithoutImplementationImpl() {
Andreas Gampead615172014-04-04 16:20:13 -07001520 TEST_DISABLED_FOR_PORTABLE();
1521 SetUpForTest(false, "withoutImplementation", "()V", nullptr);
1522
1523 env_->CallVoidMethod(jobj_, jmethod_);
1524
1525 EXPECT_TRUE(Thread::Current()->IsExceptionPending());
1526 EXPECT_TRUE(env_->ExceptionCheck() == JNI_TRUE);
1527}
1528
Andreas Gampe38bd1e12014-08-18 16:43:12 -07001529JNI_TEST(WithoutImplementation)
1530
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001531void Java_MyClassNatives_stackArgsIntsFirst(JNIEnv* env, jclass klass, jint i1, jint i2, jint i3,
1532 jint i4, jint i5, jint i6, jint i7, jint i8, jint i9,
1533 jint i10, jfloat f1, jfloat f2, jfloat f3, jfloat f4,
1534 jfloat f5, jfloat f6, jfloat f7, jfloat f8, jfloat f9,
1535 jfloat f10) {
1536 EXPECT_EQ(i1, 1);
1537 EXPECT_EQ(i2, 2);
1538 EXPECT_EQ(i3, 3);
1539 EXPECT_EQ(i4, 4);
1540 EXPECT_EQ(i5, 5);
1541 EXPECT_EQ(i6, 6);
1542 EXPECT_EQ(i7, 7);
1543 EXPECT_EQ(i8, 8);
1544 EXPECT_EQ(i9, 9);
1545 EXPECT_EQ(i10, 10);
1546
Andreas Gampec200a4a2014-06-16 18:39:09 -07001547 jint i11 = bit_cast<jfloat, jint>(f1);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001548 EXPECT_EQ(i11, 11);
Andreas Gampec200a4a2014-06-16 18:39:09 -07001549 jint i12 = bit_cast<jfloat, jint>(f2);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001550 EXPECT_EQ(i12, 12);
Andreas Gampec200a4a2014-06-16 18:39:09 -07001551 jint i13 = bit_cast<jfloat, jint>(f3);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001552 EXPECT_EQ(i13, 13);
Andreas Gampec200a4a2014-06-16 18:39:09 -07001553 jint i14 = bit_cast<jfloat, jint>(f4);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001554 EXPECT_EQ(i14, 14);
Andreas Gampec200a4a2014-06-16 18:39:09 -07001555 jint i15 = bit_cast<jfloat, jint>(f5);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001556 EXPECT_EQ(i15, 15);
Andreas Gampec200a4a2014-06-16 18:39:09 -07001557 jint i16 = bit_cast<jfloat, jint>(f6);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001558 EXPECT_EQ(i16, 16);
Andreas Gampec200a4a2014-06-16 18:39:09 -07001559 jint i17 = bit_cast<jfloat, jint>(f7);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001560 EXPECT_EQ(i17, 17);
Andreas Gampec200a4a2014-06-16 18:39:09 -07001561 jint i18 = bit_cast<jfloat, jint>(f8);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001562 EXPECT_EQ(i18, 18);
Andreas Gampec200a4a2014-06-16 18:39:09 -07001563 jint i19 = bit_cast<jfloat, jint>(f9);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001564 EXPECT_EQ(i19, 19);
Andreas Gampec200a4a2014-06-16 18:39:09 -07001565 jint i20 = bit_cast<jfloat, jint>(f10);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001566 EXPECT_EQ(i20, 20);
1567}
1568
Andreas Gampe38bd1e12014-08-18 16:43:12 -07001569void JniCompilerTest::StackArgsIntsFirstImpl() {
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001570 TEST_DISABLED_FOR_PORTABLE();
1571 SetUpForTest(true, "stackArgsIntsFirst", "(IIIIIIIIIIFFFFFFFFFF)V",
1572 reinterpret_cast<void*>(&Java_MyClassNatives_stackArgsIntsFirst));
1573
1574 jint i1 = 1;
1575 jint i2 = 2;
1576 jint i3 = 3;
1577 jint i4 = 4;
1578 jint i5 = 5;
1579 jint i6 = 6;
1580 jint i7 = 7;
1581 jint i8 = 8;
1582 jint i9 = 9;
1583 jint i10 = 10;
1584
Andreas Gampec200a4a2014-06-16 18:39:09 -07001585 jfloat f1 = bit_cast<jint, jfloat>(11);
1586 jfloat f2 = bit_cast<jint, jfloat>(12);
1587 jfloat f3 = bit_cast<jint, jfloat>(13);
1588 jfloat f4 = bit_cast<jint, jfloat>(14);
1589 jfloat f5 = bit_cast<jint, jfloat>(15);
1590 jfloat f6 = bit_cast<jint, jfloat>(16);
1591 jfloat f7 = bit_cast<jint, jfloat>(17);
1592 jfloat f8 = bit_cast<jint, jfloat>(18);
1593 jfloat f9 = bit_cast<jint, jfloat>(19);
1594 jfloat f10 = bit_cast<jint, jfloat>(20);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001595
1596 env_->CallStaticVoidMethod(jklass_, jmethod_, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, f1, f2,
1597 f3, f4, f5, f6, f7, f8, f9, f10);
1598}
1599
Andreas Gampe38bd1e12014-08-18 16:43:12 -07001600JNI_TEST(StackArgsIntsFirst)
1601
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001602void Java_MyClassNatives_stackArgsFloatsFirst(JNIEnv* env, jclass klass, jfloat f1, jfloat f2,
1603 jfloat f3, jfloat f4, jfloat f5, jfloat f6, jfloat f7,
1604 jfloat f8, jfloat f9, jfloat f10, jint i1, jint i2,
1605 jint i3, jint i4, jint i5, jint i6, jint i7, jint i8,
1606 jint i9, jint i10) {
1607 EXPECT_EQ(i1, 1);
1608 EXPECT_EQ(i2, 2);
1609 EXPECT_EQ(i3, 3);
1610 EXPECT_EQ(i4, 4);
1611 EXPECT_EQ(i5, 5);
1612 EXPECT_EQ(i6, 6);
1613 EXPECT_EQ(i7, 7);
1614 EXPECT_EQ(i8, 8);
1615 EXPECT_EQ(i9, 9);
1616 EXPECT_EQ(i10, 10);
1617
Andreas Gampec200a4a2014-06-16 18:39:09 -07001618 jint i11 = bit_cast<jfloat, jint>(f1);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001619 EXPECT_EQ(i11, 11);
Andreas Gampec200a4a2014-06-16 18:39:09 -07001620 jint i12 = bit_cast<jfloat, jint>(f2);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001621 EXPECT_EQ(i12, 12);
Andreas Gampec200a4a2014-06-16 18:39:09 -07001622 jint i13 = bit_cast<jfloat, jint>(f3);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001623 EXPECT_EQ(i13, 13);
Andreas Gampec200a4a2014-06-16 18:39:09 -07001624 jint i14 = bit_cast<jfloat, jint>(f4);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001625 EXPECT_EQ(i14, 14);
Andreas Gampec200a4a2014-06-16 18:39:09 -07001626 jint i15 = bit_cast<jfloat, jint>(f5);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001627 EXPECT_EQ(i15, 15);
Andreas Gampec200a4a2014-06-16 18:39:09 -07001628 jint i16 = bit_cast<jfloat, jint>(f6);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001629 EXPECT_EQ(i16, 16);
Andreas Gampec200a4a2014-06-16 18:39:09 -07001630 jint i17 = bit_cast<jfloat, jint>(f7);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001631 EXPECT_EQ(i17, 17);
Andreas Gampec200a4a2014-06-16 18:39:09 -07001632 jint i18 = bit_cast<jfloat, jint>(f8);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001633 EXPECT_EQ(i18, 18);
Andreas Gampec200a4a2014-06-16 18:39:09 -07001634 jint i19 = bit_cast<jfloat, jint>(f9);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001635 EXPECT_EQ(i19, 19);
Andreas Gampec200a4a2014-06-16 18:39:09 -07001636 jint i20 = bit_cast<jfloat, jint>(f10);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001637 EXPECT_EQ(i20, 20);
1638}
1639
Andreas Gampe38bd1e12014-08-18 16:43:12 -07001640void JniCompilerTest::StackArgsFloatsFirstImpl() {
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001641 TEST_DISABLED_FOR_PORTABLE();
1642 SetUpForTest(true, "stackArgsFloatsFirst", "(FFFFFFFFFFIIIIIIIIII)V",
1643 reinterpret_cast<void*>(&Java_MyClassNatives_stackArgsFloatsFirst));
1644
1645 jint i1 = 1;
1646 jint i2 = 2;
1647 jint i3 = 3;
1648 jint i4 = 4;
1649 jint i5 = 5;
1650 jint i6 = 6;
1651 jint i7 = 7;
1652 jint i8 = 8;
1653 jint i9 = 9;
1654 jint i10 = 10;
1655
Andreas Gampec200a4a2014-06-16 18:39:09 -07001656 jfloat f1 = bit_cast<jint, jfloat>(11);
1657 jfloat f2 = bit_cast<jint, jfloat>(12);
1658 jfloat f3 = bit_cast<jint, jfloat>(13);
1659 jfloat f4 = bit_cast<jint, jfloat>(14);
1660 jfloat f5 = bit_cast<jint, jfloat>(15);
1661 jfloat f6 = bit_cast<jint, jfloat>(16);
1662 jfloat f7 = bit_cast<jint, jfloat>(17);
1663 jfloat f8 = bit_cast<jint, jfloat>(18);
1664 jfloat f9 = bit_cast<jint, jfloat>(19);
1665 jfloat f10 = bit_cast<jint, jfloat>(20);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001666
1667 env_->CallStaticVoidMethod(jklass_, jmethod_, f1, f2, f3, f4, f5, f6, f7, f8, f9, f10, i1, i2, i3,
1668 i4, i5, i6, i7, i8, i9, i10);
1669}
1670
Andreas Gampe38bd1e12014-08-18 16:43:12 -07001671JNI_TEST(StackArgsFloatsFirst)
1672
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001673void Java_MyClassNatives_stackArgsMixed(JNIEnv* env, jclass klass, jint i1, jfloat f1, jint i2,
1674 jfloat f2, jint i3, jfloat f3, jint i4, jfloat f4, jint i5,
1675 jfloat f5, jint i6, jfloat f6, jint i7, jfloat f7, jint i8,
1676 jfloat f8, jint i9, jfloat f9, jint i10, jfloat f10) {
1677 EXPECT_EQ(i1, 1);
1678 EXPECT_EQ(i2, 2);
1679 EXPECT_EQ(i3, 3);
1680 EXPECT_EQ(i4, 4);
1681 EXPECT_EQ(i5, 5);
1682 EXPECT_EQ(i6, 6);
1683 EXPECT_EQ(i7, 7);
1684 EXPECT_EQ(i8, 8);
1685 EXPECT_EQ(i9, 9);
1686 EXPECT_EQ(i10, 10);
1687
Andreas Gampec200a4a2014-06-16 18:39:09 -07001688 jint i11 = bit_cast<jfloat, jint>(f1);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001689 EXPECT_EQ(i11, 11);
Andreas Gampec200a4a2014-06-16 18:39:09 -07001690 jint i12 = bit_cast<jfloat, jint>(f2);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001691 EXPECT_EQ(i12, 12);
Andreas Gampec200a4a2014-06-16 18:39:09 -07001692 jint i13 = bit_cast<jfloat, jint>(f3);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001693 EXPECT_EQ(i13, 13);
Andreas Gampec200a4a2014-06-16 18:39:09 -07001694 jint i14 = bit_cast<jfloat, jint>(f4);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001695 EXPECT_EQ(i14, 14);
Andreas Gampec200a4a2014-06-16 18:39:09 -07001696 jint i15 = bit_cast<jfloat, jint>(f5);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001697 EXPECT_EQ(i15, 15);
Andreas Gampec200a4a2014-06-16 18:39:09 -07001698 jint i16 = bit_cast<jfloat, jint>(f6);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001699 EXPECT_EQ(i16, 16);
Andreas Gampec200a4a2014-06-16 18:39:09 -07001700 jint i17 = bit_cast<jfloat, jint>(f7);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001701 EXPECT_EQ(i17, 17);
Andreas Gampec200a4a2014-06-16 18:39:09 -07001702 jint i18 = bit_cast<jfloat, jint>(f8);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001703 EXPECT_EQ(i18, 18);
Andreas Gampec200a4a2014-06-16 18:39:09 -07001704 jint i19 = bit_cast<jfloat, jint>(f9);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001705 EXPECT_EQ(i19, 19);
Andreas Gampec200a4a2014-06-16 18:39:09 -07001706 jint i20 = bit_cast<jfloat, jint>(f10);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001707 EXPECT_EQ(i20, 20);
1708}
1709
Andreas Gampe38bd1e12014-08-18 16:43:12 -07001710void JniCompilerTest::StackArgsMixedImpl() {
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001711 TEST_DISABLED_FOR_PORTABLE();
1712 SetUpForTest(true, "stackArgsMixed", "(IFIFIFIFIFIFIFIFIFIF)V",
1713 reinterpret_cast<void*>(&Java_MyClassNatives_stackArgsMixed));
1714
1715 jint i1 = 1;
1716 jint i2 = 2;
1717 jint i3 = 3;
1718 jint i4 = 4;
1719 jint i5 = 5;
1720 jint i6 = 6;
1721 jint i7 = 7;
1722 jint i8 = 8;
1723 jint i9 = 9;
1724 jint i10 = 10;
1725
Andreas Gampec200a4a2014-06-16 18:39:09 -07001726 jfloat f1 = bit_cast<jint, jfloat>(11);
1727 jfloat f2 = bit_cast<jint, jfloat>(12);
1728 jfloat f3 = bit_cast<jint, jfloat>(13);
1729 jfloat f4 = bit_cast<jint, jfloat>(14);
1730 jfloat f5 = bit_cast<jint, jfloat>(15);
1731 jfloat f6 = bit_cast<jint, jfloat>(16);
1732 jfloat f7 = bit_cast<jint, jfloat>(17);
1733 jfloat f8 = bit_cast<jint, jfloat>(18);
1734 jfloat f9 = bit_cast<jint, jfloat>(19);
1735 jfloat f10 = bit_cast<jint, jfloat>(20);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001736
1737 env_->CallStaticVoidMethod(jklass_, jmethod_, i1, f1, i2, f2, i3, f3, i4, f4, i5, f5, i6, f6, i7,
1738 f7, i8, f8, i9, f9, i10, f10);
1739}
1740
Andreas Gampe38bd1e12014-08-18 16:43:12 -07001741JNI_TEST(StackArgsMixed)
1742
Ian Rogersb033c752011-07-20 12:22:35 -07001743} // namespace art