blob: ed1175b48bcfa67b219072a1f01091f4642a9a86 [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;
Ian Rogers63bc11e2014-09-18 08:56:45 -070083#if defined(ART_USE_PORTABLE_COMPILER)
Nicolas Geoffrayebee8de2014-08-13 03:40:45 +010084 ASSERT_TRUE(method->GetEntryPointFromPortableCompiledCode() != nullptr)
85 << method_name << " " << method_sig;
Ian Rogers63bc11e2014-09-18 08:56:45 -070086#endif
Nicolas Geoffrayebee8de2014-08-13 03:40:45 +010087 }
Brian Carlstrom25c33252011-09-18 15:58:35 -070088 }
Brian Carlstrom25c33252011-09-18 15:58:35 -070089 }
90
Ian Rogers00f7d0e2012-07-19 15:28:27 -070091 void SetUpForTest(bool direct, const char* method_name, const char* method_sig,
Andreas Gampe38bd1e12014-08-18 16:43:12 -070092 void* native_fnptr) {
Ian Rogers00f7d0e2012-07-19 15:28:27 -070093 // Initialize class loader and compile method when runtime not started.
Brian Carlstrom2ce745c2013-07-17 17:44:30 -070094 if (!runtime_->IsStarted()) {
Ian Rogers00f7d0e2012-07-19 15:28:27 -070095 {
96 ScopedObjectAccess soa(Thread::Current());
97 class_loader_ = LoadDex("MyClassNatives");
98 }
Andreas Gampe38bd1e12014-08-18 16:43:12 -070099 CompileForTest(class_loader_, direct, method_name, method_sig);
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700100 // Start runtime.
101 Thread::Current()->TransitionFromSuspendedToRunnable();
Brian Carlstrombd86bcc2013-03-10 20:26:16 -0700102 bool started = runtime_->Start();
103 CHECK(started);
Brian Carlstrom25c33252011-09-18 15:58:35 -0700104 }
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700105 // JNI operations after runtime start.
Brian Carlstrom25c33252011-09-18 15:58:35 -0700106 env_ = Thread::Current()->GetJniEnv();
Elliott Hughesb264f082012-04-06 17:10:10 -0700107 jklass_ = env_->FindClass("MyClassNatives");
Andreas Gampecf4035a2014-05-28 22:43:01 -0700108 ASSERT_TRUE(jklass_ != nullptr) << method_name << " " << method_sig;
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700109
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700110 if (direct) {
111 jmethod_ = env_->GetStaticMethodID(jklass_, method_name, method_sig);
112 } else {
113 jmethod_ = env_->GetMethodID(jklass_, method_name, method_sig);
114 }
Andreas Gampecf4035a2014-05-28 22:43:01 -0700115 ASSERT_TRUE(jmethod_ != nullptr) << method_name << " " << method_sig;
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700116
Andreas Gampecf4035a2014-05-28 22:43:01 -0700117 if (native_fnptr != nullptr) {
Elliott Hughesb25c3f62012-03-26 16:35:06 -0700118 JNINativeMethod methods[] = { { method_name, method_sig, native_fnptr } };
Brian Carlstromfc7120c2012-08-27 13:43:25 -0700119 ASSERT_EQ(JNI_OK, env_->RegisterNatives(jklass_, methods, 1))
120 << method_name << " " << method_sig;
Ian Rogersbdb03912011-09-14 00:55:44 -0700121 } else {
122 env_->UnregisterNatives(jklass_);
Shih-wei Liao31384c52011-09-06 15:27:45 -0700123 }
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700124
125 jmethodID constructor = env_->GetMethodID(jklass_, "<init>", "()V");
126 jobj_ = env_->NewObject(jklass_, constructor);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700127 ASSERT_TRUE(jobj_ != nullptr) << method_name << " " << method_sig;
Ian Rogersb033c752011-07-20 12:22:35 -0700128 }
129
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700130 public:
131 static jclass jklass_;
132 static jobject jobj_;
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700133 static jobject class_loader_;
134
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700135 protected:
Andreas Gampe38bd1e12014-08-18 16:43:12 -0700136 // We have to list the methods here so we can share them between default and generic JNI.
137 void CompileAndRunNoArgMethodImpl();
138 void CompileAndRunIntMethodThroughStubImpl();
139 void CompileAndRunStaticIntMethodThroughStubImpl();
140 void CompileAndRunIntMethodImpl();
141 void CompileAndRunIntIntMethodImpl();
142 void CompileAndRunLongLongMethodImpl();
143 void CompileAndRunDoubleDoubleMethodImpl();
144 void CompileAndRun_fooJJ_synchronizedImpl();
145 void CompileAndRunIntObjectObjectMethodImpl();
146 void CompileAndRunStaticIntIntMethodImpl();
147 void CompileAndRunStaticDoubleDoubleMethodImpl();
148 void RunStaticLogDoubleMethodImpl();
149 void RunStaticLogFloatMethodImpl();
150 void RunStaticReturnTrueImpl();
151 void RunStaticReturnFalseImpl();
152 void RunGenericStaticReturnIntImpl();
153 void CompileAndRunStaticIntObjectObjectMethodImpl();
154 void CompileAndRunStaticSynchronizedIntObjectObjectMethodImpl();
155 void ExceptionHandlingImpl();
156 void NativeStackTraceElementImpl();
157 void ReturnGlobalRefImpl();
158 void LocalReferenceTableClearingTestImpl();
159 void JavaLangSystemArrayCopyImpl();
160 void CompareAndSwapIntImpl();
161 void GetTextImpl();
162 void GetSinkPropertiesNativeImpl();
163 void UpcallReturnTypeChecking_InstanceImpl();
164 void UpcallReturnTypeChecking_StaticImpl();
165 void UpcallArgumentTypeChecking_InstanceImpl();
166 void UpcallArgumentTypeChecking_StaticImpl();
167 void CompileAndRunFloatFloatMethodImpl();
168 void CheckParameterAlignImpl();
169 void MaxParamNumberImpl();
170 void WithoutImplementationImpl();
171 void StackArgsIntsFirstImpl();
172 void StackArgsFloatsFirstImpl();
173 void StackArgsMixedImpl();
174
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700175 JNIEnv* env_;
176 jmethodID jmethod_;
Andreas Gampe38bd1e12014-08-18 16:43:12 -0700177 bool check_generic_jni_;
Ian Rogersb033c752011-07-20 12:22:35 -0700178};
179
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700180jclass JniCompilerTest::jklass_;
181jobject JniCompilerTest::jobj_;
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700182jobject JniCompilerTest::class_loader_;
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700183
Andreas Gampe38bd1e12014-08-18 16:43:12 -0700184#define JNI_TEST(TestName) \
185 TEST_F(JniCompilerTest, TestName ## Default) { \
186 TestName ## Impl(); \
187 } \
188 \
189 TEST_F(JniCompilerTest, TestName ## Generic) { \
190 TEST_DISABLED_FOR_MIPS(); \
191 SetCheckGenericJni(true); \
192 TestName ## Impl(); \
193 }
Andreas Gampecf4035a2014-05-28 22:43:01 -0700194
Elliott Hughesb264f082012-04-06 17:10:10 -0700195int gJava_MyClassNatives_foo_calls = 0;
196void Java_MyClassNatives_foo(JNIEnv* env, jobject thisObj) {
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700197 // 1 = thisObj
Ian Rogers50b35e22012-10-04 10:09:15 -0700198 EXPECT_EQ(kNative, Thread::Current()->GetState());
199 Locks::mutator_lock_->AssertNotHeld(Thread::Current());
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700200 EXPECT_EQ(Thread::Current()->GetJniEnv(), env);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700201 EXPECT_TRUE(thisObj != nullptr);
Ian Rogersa8cd9f42011-08-19 16:43:41 -0700202 EXPECT_TRUE(env->IsInstanceOf(thisObj, JniCompilerTest::jklass_));
Elliott Hughesb264f082012-04-06 17:10:10 -0700203 gJava_MyClassNatives_foo_calls++;
Ian Rogersef7d42f2014-01-06 12:55:46 -0800204 ScopedObjectAccess soa(Thread::Current());
205 EXPECT_EQ(1U, Thread::Current()->NumStackReferences());
Ian Rogersb033c752011-07-20 12:22:35 -0700206}
207
Andreas Gampe38bd1e12014-08-18 16:43:12 -0700208void JniCompilerTest::CompileAndRunNoArgMethodImpl() {
Brian Carlstrom265091e2013-01-30 14:08:26 -0800209 TEST_DISABLED_FOR_PORTABLE();
Ian Rogersef7d42f2014-01-06 12:55:46 -0800210 SetUpForTest(false, "foo", "()V", reinterpret_cast<void*>(&Java_MyClassNatives_foo));
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700211
Elliott Hughesb264f082012-04-06 17:10:10 -0700212 EXPECT_EQ(0, 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(1, gJava_MyClassNatives_foo_calls);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700215 env_->CallNonvirtualVoidMethod(jobj_, jklass_, jmethod_);
Elliott Hughesb264f082012-04-06 17:10:10 -0700216 EXPECT_EQ(2, gJava_MyClassNatives_foo_calls);
Andreas Gampe38bd1e12014-08-18 16:43:12 -0700217
218 gJava_MyClassNatives_foo_calls = 0;
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700219}
220
Andreas Gampe38bd1e12014-08-18 16:43:12 -0700221JNI_TEST(CompileAndRunNoArgMethod)
222
223void JniCompilerTest::CompileAndRunIntMethodThroughStubImpl() {
Brian Carlstrom265091e2013-01-30 14:08:26 -0800224 TEST_DISABLED_FOR_PORTABLE();
Andreas Gampecf4035a2014-05-28 22:43:01 -0700225 SetUpForTest(false, "bar", "(I)I", nullptr);
226 // calling through stub will link with &Java_MyClassNatives_bar
Shih-wei Liao31384c52011-09-06 15:27:45 -0700227
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700228 ScopedObjectAccess soa(Thread::Current());
Shih-wei Liao31384c52011-09-06 15:27:45 -0700229 std::string reason;
Mathieu Chartiereb8167a2014-05-07 15:43:14 -0700230 StackHandleScope<1> hs(soa.Self());
231 Handle<mirror::ClassLoader> class_loader(
232 hs.NewHandle(soa.Decode<mirror::ClassLoader*>(class_loader_)));
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700233 ASSERT_TRUE(
Mathieu Chartier055d46c2014-02-06 11:22:17 -0800234 Runtime::Current()->GetJavaVM()->LoadNativeLibrary("", class_loader, &reason)) << reason;
Shih-wei Liao31384c52011-09-06 15:27:45 -0700235
236 jint result = env_->CallNonvirtualIntMethod(jobj_, jklass_, jmethod_, 24);
237 EXPECT_EQ(25, result);
238}
239
Andreas Gampe38bd1e12014-08-18 16:43:12 -0700240JNI_TEST(CompileAndRunIntMethodThroughStub)
241
242void JniCompilerTest::CompileAndRunStaticIntMethodThroughStubImpl() {
Brian Carlstrom265091e2013-01-30 14:08:26 -0800243 TEST_DISABLED_FOR_PORTABLE();
Andreas Gampecf4035a2014-05-28 22:43:01 -0700244 SetUpForTest(true, "sbar", "(I)I", nullptr);
245 // calling through stub will link with &Java_MyClassNatives_sbar
Ian Rogers1cefdbd2012-02-29 09:34:50 -0800246
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700247 ScopedObjectAccess soa(Thread::Current());
Ian Rogers1cefdbd2012-02-29 09:34:50 -0800248 std::string reason;
Mathieu Chartiereb8167a2014-05-07 15:43:14 -0700249 StackHandleScope<1> hs(soa.Self());
250 Handle<mirror::ClassLoader> class_loader(
251 hs.NewHandle(soa.Decode<mirror::ClassLoader*>(class_loader_)));
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700252 ASSERT_TRUE(
Mathieu Chartier055d46c2014-02-06 11:22:17 -0800253 Runtime::Current()->GetJavaVM()->LoadNativeLibrary("", class_loader, &reason)) << reason;
Ian Rogers1cefdbd2012-02-29 09:34:50 -0800254
255 jint result = env_->CallStaticIntMethod(jklass_, jmethod_, 42);
256 EXPECT_EQ(43, result);
257}
258
Andreas Gampe38bd1e12014-08-18 16:43:12 -0700259JNI_TEST(CompileAndRunStaticIntMethodThroughStub)
260
Elliott Hughesb264f082012-04-06 17:10:10 -0700261int gJava_MyClassNatives_fooI_calls = 0;
262jint Java_MyClassNatives_fooI(JNIEnv* env, jobject thisObj, jint x) {
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700263 // 1 = thisObj
Ian Rogers50b35e22012-10-04 10:09:15 -0700264 EXPECT_EQ(kNative, Thread::Current()->GetState());
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700265 EXPECT_EQ(Thread::Current()->GetJniEnv(), env);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700266 EXPECT_TRUE(thisObj != nullptr);
Ian Rogersa8cd9f42011-08-19 16:43:41 -0700267 EXPECT_TRUE(env->IsInstanceOf(thisObj, JniCompilerTest::jklass_));
Elliott Hughesb264f082012-04-06 17:10:10 -0700268 gJava_MyClassNatives_fooI_calls++;
Ian Rogersef7d42f2014-01-06 12:55:46 -0800269 ScopedObjectAccess soa(Thread::Current());
270 EXPECT_EQ(1U, Thread::Current()->NumStackReferences());
Ian Rogersb033c752011-07-20 12:22:35 -0700271 return x;
272}
273
Andreas Gampe38bd1e12014-08-18 16:43:12 -0700274void JniCompilerTest::CompileAndRunIntMethodImpl() {
Brian Carlstrom265091e2013-01-30 14:08:26 -0800275 TEST_DISABLED_FOR_PORTABLE();
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700276 SetUpForTest(false, "fooI", "(I)I",
Elliott Hughesb264f082012-04-06 17:10:10 -0700277 reinterpret_cast<void*>(&Java_MyClassNatives_fooI));
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700278
Elliott Hughesb264f082012-04-06 17:10:10 -0700279 EXPECT_EQ(0, gJava_MyClassNatives_fooI_calls);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700280 jint result = env_->CallNonvirtualIntMethod(jobj_, jklass_, jmethod_, 42);
281 EXPECT_EQ(42, result);
Elliott Hughesb264f082012-04-06 17:10:10 -0700282 EXPECT_EQ(1, gJava_MyClassNatives_fooI_calls);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700283 result = env_->CallNonvirtualIntMethod(jobj_, jklass_, jmethod_, 0xCAFED00D);
284 EXPECT_EQ(static_cast<jint>(0xCAFED00D), result);
Elliott Hughesb264f082012-04-06 17:10:10 -0700285 EXPECT_EQ(2, gJava_MyClassNatives_fooI_calls);
Andreas Gampe38bd1e12014-08-18 16:43:12 -0700286
287 gJava_MyClassNatives_fooI_calls = 0;
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700288}
289
Andreas Gampe38bd1e12014-08-18 16:43:12 -0700290JNI_TEST(CompileAndRunIntMethod)
291
Elliott Hughesb264f082012-04-06 17:10:10 -0700292int gJava_MyClassNatives_fooII_calls = 0;
293jint Java_MyClassNatives_fooII(JNIEnv* env, jobject thisObj, jint x, jint y) {
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700294 // 1 = thisObj
Ian Rogers50b35e22012-10-04 10:09:15 -0700295 EXPECT_EQ(kNative, Thread::Current()->GetState());
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700296 EXPECT_EQ(Thread::Current()->GetJniEnv(), env);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700297 EXPECT_TRUE(thisObj != nullptr);
Ian Rogersa8cd9f42011-08-19 16:43:41 -0700298 EXPECT_TRUE(env->IsInstanceOf(thisObj, JniCompilerTest::jklass_));
Elliott Hughesb264f082012-04-06 17:10:10 -0700299 gJava_MyClassNatives_fooII_calls++;
Ian Rogersef7d42f2014-01-06 12:55:46 -0800300 ScopedObjectAccess soa(Thread::Current());
301 EXPECT_EQ(1U, Thread::Current()->NumStackReferences());
Ian Rogersb033c752011-07-20 12:22:35 -0700302 return x - y; // non-commutative operator
303}
304
Andreas Gampe38bd1e12014-08-18 16:43:12 -0700305void JniCompilerTest::CompileAndRunIntIntMethodImpl() {
Brian Carlstrom265091e2013-01-30 14:08:26 -0800306 TEST_DISABLED_FOR_PORTABLE();
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700307 SetUpForTest(false, "fooII", "(II)I",
Elliott Hughesb264f082012-04-06 17:10:10 -0700308 reinterpret_cast<void*>(&Java_MyClassNatives_fooII));
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700309
Elliott Hughesb264f082012-04-06 17:10:10 -0700310 EXPECT_EQ(0, gJava_MyClassNatives_fooII_calls);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700311 jint result = env_->CallNonvirtualIntMethod(jobj_, jklass_, jmethod_, 99, 10);
312 EXPECT_EQ(99 - 10, result);
Elliott Hughesb264f082012-04-06 17:10:10 -0700313 EXPECT_EQ(1, gJava_MyClassNatives_fooII_calls);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700314 result = env_->CallNonvirtualIntMethod(jobj_, jklass_, jmethod_, 0xCAFEBABE,
315 0xCAFED00D);
316 EXPECT_EQ(static_cast<jint>(0xCAFEBABE - 0xCAFED00D), result);
Elliott Hughesb264f082012-04-06 17:10:10 -0700317 EXPECT_EQ(2, gJava_MyClassNatives_fooII_calls);
Andreas Gampe38bd1e12014-08-18 16:43:12 -0700318
319 gJava_MyClassNatives_fooII_calls = 0;
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700320}
321
Andreas Gampe38bd1e12014-08-18 16:43:12 -0700322JNI_TEST(CompileAndRunIntIntMethod)
323
Elliott Hughesb264f082012-04-06 17:10:10 -0700324int gJava_MyClassNatives_fooJJ_calls = 0;
325jlong Java_MyClassNatives_fooJJ(JNIEnv* env, jobject thisObj, jlong x, jlong y) {
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700326 // 1 = thisObj
Ian Rogers50b35e22012-10-04 10:09:15 -0700327 EXPECT_EQ(kNative, Thread::Current()->GetState());
Ian Rogers9b269d22011-09-04 14:06:05 -0700328 EXPECT_EQ(Thread::Current()->GetJniEnv(), env);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700329 EXPECT_TRUE(thisObj != nullptr);
Ian Rogers9b269d22011-09-04 14:06:05 -0700330 EXPECT_TRUE(env->IsInstanceOf(thisObj, JniCompilerTest::jklass_));
Elliott Hughesb264f082012-04-06 17:10:10 -0700331 gJava_MyClassNatives_fooJJ_calls++;
Ian Rogersef7d42f2014-01-06 12:55:46 -0800332 ScopedObjectAccess soa(Thread::Current());
333 EXPECT_EQ(1U, Thread::Current()->NumStackReferences());
Ian Rogers9b269d22011-09-04 14:06:05 -0700334 return x - y; // non-commutative operator
335}
336
Andreas Gampe38bd1e12014-08-18 16:43:12 -0700337void JniCompilerTest::CompileAndRunLongLongMethodImpl() {
Brian Carlstrom265091e2013-01-30 14:08:26 -0800338 TEST_DISABLED_FOR_PORTABLE();
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700339 SetUpForTest(false, "fooJJ", "(JJ)J",
Elliott Hughesb264f082012-04-06 17:10:10 -0700340 reinterpret_cast<void*>(&Java_MyClassNatives_fooJJ));
Ian Rogers9b269d22011-09-04 14:06:05 -0700341
Elliott Hughesb264f082012-04-06 17:10:10 -0700342 EXPECT_EQ(0, gJava_MyClassNatives_fooJJ_calls);
Ian Rogers0f678472014-03-10 16:18:37 -0700343 jlong a = INT64_C(0x1234567890ABCDEF);
344 jlong b = INT64_C(0xFEDCBA0987654321);
Ian Rogers9b269d22011-09-04 14:06:05 -0700345 jlong result = env_->CallNonvirtualLongMethod(jobj_, jklass_, jmethod_, a, b);
346 EXPECT_EQ(a - b, result);
Elliott Hughesb264f082012-04-06 17:10:10 -0700347 EXPECT_EQ(1, gJava_MyClassNatives_fooJJ_calls);
Ian Rogers9b269d22011-09-04 14:06:05 -0700348 result = env_->CallNonvirtualLongMethod(jobj_, jklass_, jmethod_, b, a);
349 EXPECT_EQ(b - a, result);
Elliott Hughesb264f082012-04-06 17:10:10 -0700350 EXPECT_EQ(2, gJava_MyClassNatives_fooJJ_calls);
Andreas Gampe38bd1e12014-08-18 16:43:12 -0700351
352 gJava_MyClassNatives_fooJJ_calls = 0;
Ian Rogers9b269d22011-09-04 14:06:05 -0700353}
354
Andreas Gampe38bd1e12014-08-18 16:43:12 -0700355JNI_TEST(CompileAndRunLongLongMethod)
356
Elliott Hughesb264f082012-04-06 17:10:10 -0700357int gJava_MyClassNatives_fooDD_calls = 0;
358jdouble Java_MyClassNatives_fooDD(JNIEnv* env, jobject thisObj, jdouble x, jdouble y) {
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700359 // 1 = thisObj
Ian Rogers50b35e22012-10-04 10:09:15 -0700360 EXPECT_EQ(kNative, Thread::Current()->GetState());
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700361 EXPECT_EQ(Thread::Current()->GetJniEnv(), env);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700362 EXPECT_TRUE(thisObj != nullptr);
Ian Rogersa8cd9f42011-08-19 16:43:41 -0700363 EXPECT_TRUE(env->IsInstanceOf(thisObj, JniCompilerTest::jklass_));
Elliott Hughesb264f082012-04-06 17:10:10 -0700364 gJava_MyClassNatives_fooDD_calls++;
Ian Rogersef7d42f2014-01-06 12:55:46 -0800365 ScopedObjectAccess soa(Thread::Current());
366 EXPECT_EQ(1U, Thread::Current()->NumStackReferences());
Ian Rogersb033c752011-07-20 12:22:35 -0700367 return x - y; // non-commutative operator
368}
369
Andreas Gampe38bd1e12014-08-18 16:43:12 -0700370void JniCompilerTest::CompileAndRunDoubleDoubleMethodImpl() {
Brian Carlstrom265091e2013-01-30 14:08:26 -0800371 TEST_DISABLED_FOR_PORTABLE();
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700372 SetUpForTest(false, "fooDD", "(DD)D",
Elliott Hughesb264f082012-04-06 17:10:10 -0700373 reinterpret_cast<void*>(&Java_MyClassNatives_fooDD));
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700374
Elliott Hughesb264f082012-04-06 17:10:10 -0700375 EXPECT_EQ(0, gJava_MyClassNatives_fooDD_calls);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700376 jdouble result = env_->CallNonvirtualDoubleMethod(jobj_, jklass_, jmethod_,
377 99.0, 10.0);
378 EXPECT_EQ(99.0 - 10.0, result);
Elliott Hughesb264f082012-04-06 17:10:10 -0700379 EXPECT_EQ(1, gJava_MyClassNatives_fooDD_calls);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700380 jdouble a = 3.14159265358979323846;
381 jdouble b = 0.69314718055994530942;
382 result = env_->CallNonvirtualDoubleMethod(jobj_, jklass_, jmethod_, a, b);
383 EXPECT_EQ(a - b, result);
Elliott Hughesb264f082012-04-06 17:10:10 -0700384 EXPECT_EQ(2, gJava_MyClassNatives_fooDD_calls);
Andreas Gampe38bd1e12014-08-18 16:43:12 -0700385
386 gJava_MyClassNatives_fooDD_calls = 0;
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700387}
388
Elliott Hughes3e778f72012-05-21 15:29:52 -0700389int gJava_MyClassNatives_fooJJ_synchronized_calls = 0;
390jlong Java_MyClassNatives_fooJJ_synchronized(JNIEnv* env, jobject thisObj, jlong x, jlong y) {
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700391 // 1 = thisObj
Ian Rogers50b35e22012-10-04 10:09:15 -0700392 EXPECT_EQ(kNative, Thread::Current()->GetState());
Elliott Hughes3e778f72012-05-21 15:29:52 -0700393 EXPECT_EQ(Thread::Current()->GetJniEnv(), env);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700394 EXPECT_TRUE(thisObj != nullptr);
Elliott Hughes3e778f72012-05-21 15:29:52 -0700395 EXPECT_TRUE(env->IsInstanceOf(thisObj, JniCompilerTest::jklass_));
396 gJava_MyClassNatives_fooJJ_synchronized_calls++;
Ian Rogersef7d42f2014-01-06 12:55:46 -0800397 ScopedObjectAccess soa(Thread::Current());
398 EXPECT_EQ(1U, Thread::Current()->NumStackReferences());
Elliott Hughes3e778f72012-05-21 15:29:52 -0700399 return x | y;
400}
401
Andreas Gampe38bd1e12014-08-18 16:43:12 -0700402void JniCompilerTest::CompileAndRun_fooJJ_synchronizedImpl() {
Brian Carlstrom265091e2013-01-30 14:08:26 -0800403 TEST_DISABLED_FOR_PORTABLE();
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700404 SetUpForTest(false, "fooJJ_synchronized", "(JJ)J",
Elliott Hughes3e778f72012-05-21 15:29:52 -0700405 reinterpret_cast<void*>(&Java_MyClassNatives_fooJJ_synchronized));
406
407 EXPECT_EQ(0, gJava_MyClassNatives_fooJJ_synchronized_calls);
408 jlong a = 0x1000000020000000ULL;
409 jlong b = 0x00ff000000aa0000ULL;
410 jlong result = env_->CallNonvirtualLongMethod(jobj_, jklass_, jmethod_, a, b);
411 EXPECT_EQ(a | b, result);
412 EXPECT_EQ(1, gJava_MyClassNatives_fooJJ_synchronized_calls);
Andreas Gampe38bd1e12014-08-18 16:43:12 -0700413
414 gJava_MyClassNatives_fooJJ_synchronized_calls = 0;
Elliott Hughes3e778f72012-05-21 15:29:52 -0700415}
416
Andreas Gampe38bd1e12014-08-18 16:43:12 -0700417JNI_TEST(CompileAndRun_fooJJ_synchronized)
418
Elliott Hughesb264f082012-04-06 17:10:10 -0700419int gJava_MyClassNatives_fooIOO_calls = 0;
420jobject Java_MyClassNatives_fooIOO(JNIEnv* env, jobject thisObj, jint x, jobject y,
Ian Rogersb033c752011-07-20 12:22:35 -0700421 jobject z) {
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700422 // 3 = this + y + z
Ian Rogers50b35e22012-10-04 10:09:15 -0700423 EXPECT_EQ(kNative, Thread::Current()->GetState());
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700424 EXPECT_EQ(Thread::Current()->GetJniEnv(), env);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700425 EXPECT_TRUE(thisObj != nullptr);
Ian Rogersa8cd9f42011-08-19 16:43:41 -0700426 EXPECT_TRUE(env->IsInstanceOf(thisObj, JniCompilerTest::jklass_));
Elliott Hughesb264f082012-04-06 17:10:10 -0700427 gJava_MyClassNatives_fooIOO_calls++;
Ian Rogersef7d42f2014-01-06 12:55:46 -0800428 ScopedObjectAccess soa(Thread::Current());
Andreas Gampebf6b92a2014-03-05 16:11:04 -0800429 size_t null_args = (y == nullptr ? 1 : 0) + (z == nullptr ? 1 : 0);
430 EXPECT_TRUE(3U == Thread::Current()->NumStackReferences() ||
431 (3U - null_args) == Thread::Current()->NumStackReferences());
Ian Rogersb033c752011-07-20 12:22:35 -0700432 switch (x) {
433 case 1:
434 return y;
435 case 2:
436 return z;
437 default:
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700438 return thisObj;
Ian Rogersb033c752011-07-20 12:22:35 -0700439 }
440}
441
Andreas Gampe38bd1e12014-08-18 16:43:12 -0700442void JniCompilerTest::CompileAndRunIntObjectObjectMethodImpl() {
Brian Carlstrom265091e2013-01-30 14:08:26 -0800443 TEST_DISABLED_FOR_PORTABLE();
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700444 SetUpForTest(false, "fooIOO",
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700445 "(ILjava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;",
Elliott Hughesb264f082012-04-06 17:10:10 -0700446 reinterpret_cast<void*>(&Java_MyClassNatives_fooIOO));
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700447
Elliott Hughesb264f082012-04-06 17:10:10 -0700448 EXPECT_EQ(0, gJava_MyClassNatives_fooIOO_calls);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700449 jobject result = env_->CallNonvirtualObjectMethod(jobj_, jklass_, jmethod_, 0, nullptr, nullptr);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700450 EXPECT_TRUE(env_->IsSameObject(jobj_, result));
Elliott Hughesb264f082012-04-06 17:10:10 -0700451 EXPECT_EQ(1, gJava_MyClassNatives_fooIOO_calls);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700452
Andreas Gampecf4035a2014-05-28 22:43:01 -0700453 result = env_->CallNonvirtualObjectMethod(jobj_, jklass_, jmethod_, 0, nullptr, jklass_);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700454 EXPECT_TRUE(env_->IsSameObject(jobj_, result));
Elliott Hughesb264f082012-04-06 17:10:10 -0700455 EXPECT_EQ(2, gJava_MyClassNatives_fooIOO_calls);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700456 result = env_->CallNonvirtualObjectMethod(jobj_, jklass_, jmethod_, 1, nullptr, jklass_);
457 EXPECT_TRUE(env_->IsSameObject(nullptr, result));
Elliott Hughesb264f082012-04-06 17:10:10 -0700458 EXPECT_EQ(3, gJava_MyClassNatives_fooIOO_calls);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700459 result = env_->CallNonvirtualObjectMethod(jobj_, jklass_, jmethod_, 2, nullptr, jklass_);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700460 EXPECT_TRUE(env_->IsSameObject(jklass_, result));
Elliott Hughesb264f082012-04-06 17:10:10 -0700461 EXPECT_EQ(4, gJava_MyClassNatives_fooIOO_calls);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700462
Andreas Gampecf4035a2014-05-28 22:43:01 -0700463 result = env_->CallNonvirtualObjectMethod(jobj_, jklass_, jmethod_, 0, jklass_, nullptr);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700464 EXPECT_TRUE(env_->IsSameObject(jobj_, result));
Elliott Hughesb264f082012-04-06 17:10:10 -0700465 EXPECT_EQ(5, gJava_MyClassNatives_fooIOO_calls);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700466 result = env_->CallNonvirtualObjectMethod(jobj_, jklass_, jmethod_, 1, jklass_, nullptr);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700467 EXPECT_TRUE(env_->IsSameObject(jklass_, result));
Elliott Hughesb264f082012-04-06 17:10:10 -0700468 EXPECT_EQ(6, gJava_MyClassNatives_fooIOO_calls);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700469 result = env_->CallNonvirtualObjectMethod(jobj_, jklass_, jmethod_, 2, jklass_, nullptr);
470 EXPECT_TRUE(env_->IsSameObject(nullptr, result));
Elliott Hughesb264f082012-04-06 17:10:10 -0700471 EXPECT_EQ(7, gJava_MyClassNatives_fooIOO_calls);
Andreas Gampe38bd1e12014-08-18 16:43:12 -0700472
473 gJava_MyClassNatives_fooIOO_calls = 0;
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700474}
475
Andreas Gampe38bd1e12014-08-18 16:43:12 -0700476JNI_TEST(CompileAndRunIntObjectObjectMethod)
477
Elliott Hughesb264f082012-04-06 17:10:10 -0700478int gJava_MyClassNatives_fooSII_calls = 0;
479jint Java_MyClassNatives_fooSII(JNIEnv* env, jclass klass, jint x, jint y) {
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700480 // 1 = klass
Ian Rogers50b35e22012-10-04 10:09:15 -0700481 EXPECT_EQ(kNative, Thread::Current()->GetState());
Shih-wei Liao82da44b2011-09-01 00:38:04 -0700482 EXPECT_EQ(Thread::Current()->GetJniEnv(), env);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700483 EXPECT_TRUE(klass != nullptr);
Shih-wei Liao82da44b2011-09-01 00:38:04 -0700484 EXPECT_TRUE(env->IsInstanceOf(JniCompilerTest::jobj_, klass));
Elliott Hughesb264f082012-04-06 17:10:10 -0700485 gJava_MyClassNatives_fooSII_calls++;
Ian Rogersef7d42f2014-01-06 12:55:46 -0800486 ScopedObjectAccess soa(Thread::Current());
487 EXPECT_EQ(1U, Thread::Current()->NumStackReferences());
Shih-wei Liao82da44b2011-09-01 00:38:04 -0700488 return x + y;
489}
490
Andreas Gampe38bd1e12014-08-18 16:43:12 -0700491void JniCompilerTest::CompileAndRunStaticIntIntMethodImpl() {
Brian Carlstrom265091e2013-01-30 14:08:26 -0800492 TEST_DISABLED_FOR_PORTABLE();
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700493 SetUpForTest(true, "fooSII", "(II)I",
Elliott Hughesb264f082012-04-06 17:10:10 -0700494 reinterpret_cast<void*>(&Java_MyClassNatives_fooSII));
Shih-wei Liao82da44b2011-09-01 00:38:04 -0700495
Elliott Hughesb264f082012-04-06 17:10:10 -0700496 EXPECT_EQ(0, gJava_MyClassNatives_fooSII_calls);
Shih-wei Liao82da44b2011-09-01 00:38:04 -0700497 jint result = env_->CallStaticIntMethod(jklass_, jmethod_, 20, 30);
498 EXPECT_EQ(50, result);
Elliott Hughesb264f082012-04-06 17:10:10 -0700499 EXPECT_EQ(1, gJava_MyClassNatives_fooSII_calls);
Andreas Gampe38bd1e12014-08-18 16:43:12 -0700500
501 gJava_MyClassNatives_fooSII_calls = 0;
Shih-wei Liao82da44b2011-09-01 00:38:04 -0700502}
503
Andreas Gampe38bd1e12014-08-18 16:43:12 -0700504JNI_TEST(CompileAndRunStaticIntIntMethod)
505
Elliott Hughesb264f082012-04-06 17:10:10 -0700506int gJava_MyClassNatives_fooSDD_calls = 0;
507jdouble Java_MyClassNatives_fooSDD(JNIEnv* env, jclass klass, jdouble x, jdouble y) {
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700508 // 1 = klass
Ian Rogers50b35e22012-10-04 10:09:15 -0700509 EXPECT_EQ(kNative, Thread::Current()->GetState());
Ian Rogers7a99c112011-09-07 12:48:27 -0700510 EXPECT_EQ(Thread::Current()->GetJniEnv(), env);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700511 EXPECT_TRUE(klass != nullptr);
Ian Rogers7a99c112011-09-07 12:48:27 -0700512 EXPECT_TRUE(env->IsInstanceOf(JniCompilerTest::jobj_, klass));
Elliott Hughesb264f082012-04-06 17:10:10 -0700513 gJava_MyClassNatives_fooSDD_calls++;
Ian Rogersef7d42f2014-01-06 12:55:46 -0800514 ScopedObjectAccess soa(Thread::Current());
515 EXPECT_EQ(1U, Thread::Current()->NumStackReferences());
Ian Rogers7a99c112011-09-07 12:48:27 -0700516 return x - y; // non-commutative operator
517}
518
Andreas Gampe38bd1e12014-08-18 16:43:12 -0700519void JniCompilerTest::CompileAndRunStaticDoubleDoubleMethodImpl() {
Brian Carlstrom265091e2013-01-30 14:08:26 -0800520 TEST_DISABLED_FOR_PORTABLE();
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700521 SetUpForTest(true, "fooSDD", "(DD)D",
Elliott Hughesb264f082012-04-06 17:10:10 -0700522 reinterpret_cast<void*>(&Java_MyClassNatives_fooSDD));
Ian Rogers7a99c112011-09-07 12:48:27 -0700523
Elliott Hughesb264f082012-04-06 17:10:10 -0700524 EXPECT_EQ(0, gJava_MyClassNatives_fooSDD_calls);
Ian Rogers7a99c112011-09-07 12:48:27 -0700525 jdouble result = env_->CallStaticDoubleMethod(jklass_, jmethod_, 99.0, 10.0);
526 EXPECT_EQ(99.0 - 10.0, result);
Elliott Hughesb264f082012-04-06 17:10:10 -0700527 EXPECT_EQ(1, gJava_MyClassNatives_fooSDD_calls);
Ian Rogers7a99c112011-09-07 12:48:27 -0700528 jdouble a = 3.14159265358979323846;
529 jdouble b = 0.69314718055994530942;
530 result = env_->CallStaticDoubleMethod(jklass_, jmethod_, a, b);
531 EXPECT_EQ(a - b, result);
Elliott Hughesb264f082012-04-06 17:10:10 -0700532 EXPECT_EQ(2, gJava_MyClassNatives_fooSDD_calls);
Andreas Gampe38bd1e12014-08-18 16:43:12 -0700533
534 gJava_MyClassNatives_fooSDD_calls = 0;
Ian Rogers7a99c112011-09-07 12:48:27 -0700535}
536
Andreas Gampe38bd1e12014-08-18 16:43:12 -0700537JNI_TEST(CompileAndRunStaticDoubleDoubleMethod)
538
Nicolas Geoffrayebee8de2014-08-13 03:40:45 +0100539// The x86 generic JNI code had a bug where it assumed a floating
540// point return value would be in xmm0. We use log, to somehow ensure
541// the compiler will use the floating point stack.
542
543jdouble Java_MyClassNatives_logD(JNIEnv* env, jclass klass, jdouble x) {
544 return log(x);
545}
546
Andreas Gampe38bd1e12014-08-18 16:43:12 -0700547void JniCompilerTest::RunStaticLogDoubleMethodImpl() {
Nicolas Geoffrayebee8de2014-08-13 03:40:45 +0100548 TEST_DISABLED_FOR_PORTABLE();
Andreas Gampe38bd1e12014-08-18 16:43:12 -0700549 SetUpForTest(true, "logD", "(D)D", reinterpret_cast<void*>(&Java_MyClassNatives_logD));
Nicolas Geoffrayebee8de2014-08-13 03:40:45 +0100550
551 jdouble result = env_->CallStaticDoubleMethod(jklass_, jmethod_, 2.0);
552 EXPECT_EQ(log(2.0), result);
553}
554
Andreas Gampe38bd1e12014-08-18 16:43:12 -0700555JNI_TEST(RunStaticLogDoubleMethod)
556
Nicolas Geoffrayebee8de2014-08-13 03:40:45 +0100557jfloat Java_MyClassNatives_logF(JNIEnv* env, jclass klass, jfloat x) {
558 return logf(x);
559}
560
Andreas Gampe38bd1e12014-08-18 16:43:12 -0700561void JniCompilerTest::RunStaticLogFloatMethodImpl() {
Nicolas Geoffrayebee8de2014-08-13 03:40:45 +0100562 TEST_DISABLED_FOR_PORTABLE();
Andreas Gampe38bd1e12014-08-18 16:43:12 -0700563 SetUpForTest(true, "logF", "(F)F", reinterpret_cast<void*>(&Java_MyClassNatives_logF));
Nicolas Geoffrayebee8de2014-08-13 03:40:45 +0100564
565 jfloat result = env_->CallStaticFloatMethod(jklass_, jmethod_, 2.0);
566 EXPECT_EQ(logf(2.0), result);
567}
568
Andreas Gampe38bd1e12014-08-18 16:43:12 -0700569JNI_TEST(RunStaticLogFloatMethod)
570
Nicolas Geoffrayebee8de2014-08-13 03:40:45 +0100571jboolean Java_MyClassNatives_returnTrue(JNIEnv* env, jclass klass) {
572 return JNI_TRUE;
573}
574
575jboolean Java_MyClassNatives_returnFalse(JNIEnv* env, jclass klass) {
576 return JNI_FALSE;
577}
578
579jint Java_MyClassNatives_returnInt(JNIEnv* env, jclass klass) {
580 return 42;
581}
582
Andreas Gampe38bd1e12014-08-18 16:43:12 -0700583void JniCompilerTest::RunStaticReturnTrueImpl() {
Nicolas Geoffrayebee8de2014-08-13 03:40:45 +0100584 TEST_DISABLED_FOR_PORTABLE();
Andreas Gampe38bd1e12014-08-18 16:43:12 -0700585 SetUpForTest(true, "returnTrue", "()Z", reinterpret_cast<void*>(&Java_MyClassNatives_returnTrue));
Nicolas Geoffrayebee8de2014-08-13 03:40:45 +0100586
587 jboolean result = env_->CallStaticBooleanMethod(jklass_, jmethod_);
588 EXPECT_TRUE(result);
589}
590
Andreas Gampe38bd1e12014-08-18 16:43:12 -0700591JNI_TEST(RunStaticReturnTrue)
592
593void JniCompilerTest::RunStaticReturnFalseImpl() {
Nicolas Geoffrayebee8de2014-08-13 03:40:45 +0100594 TEST_DISABLED_FOR_PORTABLE();
Nicolas Geoffrayebee8de2014-08-13 03:40:45 +0100595 SetUpForTest(true, "returnFalse", "()Z",
Andreas Gampe38bd1e12014-08-18 16:43:12 -0700596 reinterpret_cast<void*>(&Java_MyClassNatives_returnFalse));
Nicolas Geoffrayebee8de2014-08-13 03:40:45 +0100597
598 jboolean result = env_->CallStaticBooleanMethod(jklass_, jmethod_);
599 EXPECT_FALSE(result);
600}
601
Andreas Gampe38bd1e12014-08-18 16:43:12 -0700602JNI_TEST(RunStaticReturnFalse)
603
604void JniCompilerTest::RunGenericStaticReturnIntImpl() {
Nicolas Geoffrayebee8de2014-08-13 03:40:45 +0100605 TEST_DISABLED_FOR_PORTABLE();
Andreas Gampe38bd1e12014-08-18 16:43:12 -0700606 SetUpForTest(true, "returnInt", "()I", reinterpret_cast<void*>(&Java_MyClassNatives_returnInt));
Nicolas Geoffrayebee8de2014-08-13 03:40:45 +0100607
608 jint result = env_->CallStaticIntMethod(jklass_, jmethod_);
609 EXPECT_EQ(42, result);
610}
611
Andreas Gampe38bd1e12014-08-18 16:43:12 -0700612JNI_TEST(RunGenericStaticReturnInt)
613
Elliott Hughesb264f082012-04-06 17:10:10 -0700614int gJava_MyClassNatives_fooSIOO_calls = 0;
615jobject Java_MyClassNatives_fooSIOO(JNIEnv* env, jclass klass, jint x, jobject y,
Ian Rogersb033c752011-07-20 12:22:35 -0700616 jobject z) {
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700617 // 3 = klass + y + z
Ian Rogers50b35e22012-10-04 10:09:15 -0700618 EXPECT_EQ(kNative, Thread::Current()->GetState());
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700619 EXPECT_EQ(Thread::Current()->GetJniEnv(), env);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700620 EXPECT_TRUE(klass != nullptr);
Ian Rogersa8cd9f42011-08-19 16:43:41 -0700621 EXPECT_TRUE(env->IsInstanceOf(JniCompilerTest::jobj_, klass));
Elliott Hughesb264f082012-04-06 17:10:10 -0700622 gJava_MyClassNatives_fooSIOO_calls++;
Ian Rogersef7d42f2014-01-06 12:55:46 -0800623 ScopedObjectAccess soa(Thread::Current());
Andreas Gampebf6b92a2014-03-05 16:11:04 -0800624 size_t null_args = (y == nullptr ? 1 : 0) + (z == nullptr ? 1 : 0);
625 EXPECT_TRUE(3U == Thread::Current()->NumStackReferences() ||
626 (3U - null_args) == Thread::Current()->NumStackReferences());
Ian Rogersb033c752011-07-20 12:22:35 -0700627 switch (x) {
628 case 1:
629 return y;
630 case 2:
631 return z;
632 default:
633 return klass;
634 }
635}
636
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700637
Andreas Gampe38bd1e12014-08-18 16:43:12 -0700638void JniCompilerTest::CompileAndRunStaticIntObjectObjectMethodImpl() {
Brian Carlstrom265091e2013-01-30 14:08:26 -0800639 TEST_DISABLED_FOR_PORTABLE();
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700640 SetUpForTest(true, "fooSIOO",
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700641 "(ILjava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;",
Elliott Hughesb264f082012-04-06 17:10:10 -0700642 reinterpret_cast<void*>(&Java_MyClassNatives_fooSIOO));
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700643
Elliott Hughesb264f082012-04-06 17:10:10 -0700644 EXPECT_EQ(0, gJava_MyClassNatives_fooSIOO_calls);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700645 jobject result = env_->CallStaticObjectMethod(jklass_, jmethod_, 0, nullptr, nullptr);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700646 EXPECT_TRUE(env_->IsSameObject(jklass_, result));
Elliott Hughesb264f082012-04-06 17:10:10 -0700647 EXPECT_EQ(1, gJava_MyClassNatives_fooSIOO_calls);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700648
Andreas Gampecf4035a2014-05-28 22:43:01 -0700649 result = env_->CallStaticObjectMethod(jklass_, jmethod_, 0, nullptr, jobj_);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700650 EXPECT_TRUE(env_->IsSameObject(jklass_, result));
Elliott Hughesb264f082012-04-06 17:10:10 -0700651 EXPECT_EQ(2, gJava_MyClassNatives_fooSIOO_calls);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700652 result = env_->CallStaticObjectMethod(jklass_, jmethod_, 1, nullptr, jobj_);
653 EXPECT_TRUE(env_->IsSameObject(nullptr, result));
Elliott Hughesb264f082012-04-06 17:10:10 -0700654 EXPECT_EQ(3, gJava_MyClassNatives_fooSIOO_calls);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700655 result = env_->CallStaticObjectMethod(jklass_, jmethod_, 2, nullptr, jobj_);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700656 EXPECT_TRUE(env_->IsSameObject(jobj_, result));
Elliott Hughesb264f082012-04-06 17:10:10 -0700657 EXPECT_EQ(4, gJava_MyClassNatives_fooSIOO_calls);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700658
Andreas Gampecf4035a2014-05-28 22:43:01 -0700659 result = env_->CallStaticObjectMethod(jklass_, jmethod_, 0, jobj_, nullptr);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700660 EXPECT_TRUE(env_->IsSameObject(jklass_, result));
Elliott Hughesb264f082012-04-06 17:10:10 -0700661 EXPECT_EQ(5, gJava_MyClassNatives_fooSIOO_calls);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700662 result = env_->CallStaticObjectMethod(jklass_, jmethod_, 1, jobj_, nullptr);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700663 EXPECT_TRUE(env_->IsSameObject(jobj_, result));
Elliott Hughesb264f082012-04-06 17:10:10 -0700664 EXPECT_EQ(6, gJava_MyClassNatives_fooSIOO_calls);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700665 result = env_->CallStaticObjectMethod(jklass_, jmethod_, 2, jobj_, nullptr);
666 EXPECT_TRUE(env_->IsSameObject(nullptr, result));
Elliott Hughesb264f082012-04-06 17:10:10 -0700667 EXPECT_EQ(7, gJava_MyClassNatives_fooSIOO_calls);
Andreas Gampe38bd1e12014-08-18 16:43:12 -0700668
669 gJava_MyClassNatives_fooSIOO_calls = 0;
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700670}
671
Andreas Gampe38bd1e12014-08-18 16:43:12 -0700672JNI_TEST(CompileAndRunStaticIntObjectObjectMethod)
673
Elliott Hughesb264f082012-04-06 17:10:10 -0700674int gJava_MyClassNatives_fooSSIOO_calls = 0;
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700675jobject Java_MyClassNatives_fooSSIOO(JNIEnv* env, jclass klass, jint x, jobject y, jobject z) {
676 // 3 = klass + y + z
Ian Rogers50b35e22012-10-04 10:09:15 -0700677 EXPECT_EQ(kNative, Thread::Current()->GetState());
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700678 EXPECT_EQ(Thread::Current()->GetJniEnv(), env);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700679 EXPECT_TRUE(klass != nullptr);
Ian Rogersa8cd9f42011-08-19 16:43:41 -0700680 EXPECT_TRUE(env->IsInstanceOf(JniCompilerTest::jobj_, klass));
Elliott Hughesb264f082012-04-06 17:10:10 -0700681 gJava_MyClassNatives_fooSSIOO_calls++;
Ian Rogersef7d42f2014-01-06 12:55:46 -0800682 ScopedObjectAccess soa(Thread::Current());
Andreas Gampebf6b92a2014-03-05 16:11:04 -0800683 size_t null_args = (y == nullptr ? 1 : 0) + (z == nullptr ? 1 : 0);
684 EXPECT_TRUE(3U == Thread::Current()->NumStackReferences() ||
685 (3U - null_args) == Thread::Current()->NumStackReferences());
Ian Rogersdf20fe02011-07-20 20:34:16 -0700686 switch (x) {
687 case 1:
688 return y;
689 case 2:
690 return z;
691 default:
692 return klass;
693 }
694}
695
Andreas Gampe38bd1e12014-08-18 16:43:12 -0700696void JniCompilerTest::CompileAndRunStaticSynchronizedIntObjectObjectMethodImpl() {
Brian Carlstrom265091e2013-01-30 14:08:26 -0800697 TEST_DISABLED_FOR_PORTABLE();
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700698 SetUpForTest(true, "fooSSIOO",
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700699 "(ILjava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;",
Elliott Hughesb264f082012-04-06 17:10:10 -0700700 reinterpret_cast<void*>(&Java_MyClassNatives_fooSSIOO));
Carl Shapiro419ec7b2011-08-03 14:48:33 -0700701
Elliott Hughesb264f082012-04-06 17:10:10 -0700702 EXPECT_EQ(0, gJava_MyClassNatives_fooSSIOO_calls);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700703 jobject result = env_->CallStaticObjectMethod(jklass_, jmethod_, 0, nullptr, nullptr);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700704 EXPECT_TRUE(env_->IsSameObject(jklass_, result));
Elliott Hughesb264f082012-04-06 17:10:10 -0700705 EXPECT_EQ(1, gJava_MyClassNatives_fooSSIOO_calls);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700706
Andreas Gampecf4035a2014-05-28 22:43:01 -0700707 result = env_->CallStaticObjectMethod(jklass_, jmethod_, 0, nullptr, jobj_);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700708 EXPECT_TRUE(env_->IsSameObject(jklass_, result));
Elliott Hughesb264f082012-04-06 17:10:10 -0700709 EXPECT_EQ(2, gJava_MyClassNatives_fooSSIOO_calls);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700710 result = env_->CallStaticObjectMethod(jklass_, jmethod_, 1, nullptr, jobj_);
711 EXPECT_TRUE(env_->IsSameObject(nullptr, result));
Elliott Hughesb264f082012-04-06 17:10:10 -0700712 EXPECT_EQ(3, gJava_MyClassNatives_fooSSIOO_calls);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700713 result = env_->CallStaticObjectMethod(jklass_, jmethod_, 2, nullptr, jobj_);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700714 EXPECT_TRUE(env_->IsSameObject(jobj_, result));
Elliott Hughesb264f082012-04-06 17:10:10 -0700715 EXPECT_EQ(4, gJava_MyClassNatives_fooSSIOO_calls);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700716
Andreas Gampecf4035a2014-05-28 22:43:01 -0700717 result = env_->CallStaticObjectMethod(jklass_, jmethod_, 0, jobj_, nullptr);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700718 EXPECT_TRUE(env_->IsSameObject(jklass_, result));
Elliott Hughesb264f082012-04-06 17:10:10 -0700719 EXPECT_EQ(5, gJava_MyClassNatives_fooSSIOO_calls);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700720 result = env_->CallStaticObjectMethod(jklass_, jmethod_, 1, jobj_, nullptr);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700721 EXPECT_TRUE(env_->IsSameObject(jobj_, result));
Elliott Hughesb264f082012-04-06 17:10:10 -0700722 EXPECT_EQ(6, gJava_MyClassNatives_fooSSIOO_calls);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700723 result = env_->CallStaticObjectMethod(jklass_, jmethod_, 2, jobj_, nullptr);
724 EXPECT_TRUE(env_->IsSameObject(nullptr, result));
Elliott Hughesb264f082012-04-06 17:10:10 -0700725 EXPECT_EQ(7, gJava_MyClassNatives_fooSSIOO_calls);
Andreas Gampe38bd1e12014-08-18 16:43:12 -0700726
727 gJava_MyClassNatives_fooSSIOO_calls = 0;
Ian Rogersdf20fe02011-07-20 20:34:16 -0700728}
729
Andreas Gampe38bd1e12014-08-18 16:43:12 -0700730JNI_TEST(CompileAndRunStaticSynchronizedIntObjectObjectMethod)
731
Elliott Hughesb264f082012-04-06 17:10:10 -0700732void Java_MyClassNatives_throwException(JNIEnv* env, jobject) {
Elliott Hughesa2501992011-08-26 19:39:54 -0700733 jclass c = env->FindClass("java/lang/RuntimeException");
734 env->ThrowNew(c, "hello");
735}
Ian Rogers45a76cb2011-07-21 22:00:15 -0700736
Andreas Gampe38bd1e12014-08-18 16:43:12 -0700737void JniCompilerTest::ExceptionHandlingImpl() {
Brian Carlstrom265091e2013-01-30 14:08:26 -0800738 TEST_DISABLED_FOR_PORTABLE();
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700739 {
740 ASSERT_FALSE(runtime_->IsStarted());
741 ScopedObjectAccess soa(Thread::Current());
742 class_loader_ = LoadDex("MyClassNatives");
Brian Carlstrom40381fb2011-10-19 14:13:40 -0700743
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700744 // all compilation needs to happen before Runtime::Start
745 CompileForTest(class_loader_, false, "foo", "()V");
746 CompileForTest(class_loader_, false, "throwException", "()V");
747 CompileForTest(class_loader_, false, "foo", "()V");
748 }
749 // Start runtime to avoid re-initialization in SetupForTest.
750 Thread::Current()->TransitionFromSuspendedToRunnable();
Brian Carlstrombd86bcc2013-03-10 20:26:16 -0700751 bool started = runtime_->Start();
752 CHECK(started);
Brian Carlstrom25c33252011-09-18 15:58:35 -0700753
Elliott Hughesb264f082012-04-06 17:10:10 -0700754 gJava_MyClassNatives_foo_calls = 0;
Elliott Hughesa2501992011-08-26 19:39:54 -0700755
Ian Rogers67375ac2011-09-14 00:55:44 -0700756 // Check a single call of a JNI method is ok
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700757 SetUpForTest(false, "foo", "()V", reinterpret_cast<void*>(&Java_MyClassNatives_foo));
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700758 env_->CallNonvirtualVoidMethod(jobj_, jklass_, jmethod_);
Elliott Hughesb264f082012-04-06 17:10:10 -0700759 EXPECT_EQ(1, gJava_MyClassNatives_foo_calls);
Ian Rogers67375ac2011-09-14 00:55:44 -0700760 EXPECT_FALSE(Thread::Current()->IsExceptionPending());
Elliott Hughesa2501992011-08-26 19:39:54 -0700761
Ian Rogers67375ac2011-09-14 00:55:44 -0700762 // Get class for exception we expect to be thrown
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700763 ScopedLocalRef<jclass> jlre(env_, env_->FindClass("java/lang/RuntimeException"));
764 SetUpForTest(false, "throwException", "()V",
Elliott Hughesb264f082012-04-06 17:10:10 -0700765 reinterpret_cast<void*>(&Java_MyClassNatives_throwException));
766 // Call Java_MyClassNatives_throwException (JNI method that throws exception)
Elliott Hughesa2501992011-08-26 19:39:54 -0700767 env_->CallNonvirtualVoidMethod(jobj_, jklass_, jmethod_);
Elliott Hughesb264f082012-04-06 17:10:10 -0700768 EXPECT_EQ(1, gJava_MyClassNatives_foo_calls);
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700769 EXPECT_TRUE(env_->ExceptionCheck() == JNI_TRUE);
770 ScopedLocalRef<jthrowable> exception(env_, env_->ExceptionOccurred());
771 env_->ExceptionClear();
772 EXPECT_TRUE(env_->IsInstanceOf(exception.get(), jlre.get()));
Elliott Hughesa2501992011-08-26 19:39:54 -0700773
Ian Rogers67375ac2011-09-14 00:55:44 -0700774 // Check a single call of a JNI method is ok
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700775 SetUpForTest(false, "foo", "()V", reinterpret_cast<void*>(&Java_MyClassNatives_foo));
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700776 env_->CallNonvirtualVoidMethod(jobj_, jklass_, jmethod_);
Elliott Hughesb264f082012-04-06 17:10:10 -0700777 EXPECT_EQ(2, gJava_MyClassNatives_foo_calls);
Andreas Gampe38bd1e12014-08-18 16:43:12 -0700778
779 gJava_MyClassNatives_foo_calls = 0;
Ian Rogers45a76cb2011-07-21 22:00:15 -0700780}
781
Andreas Gampe38bd1e12014-08-18 16:43:12 -0700782JNI_TEST(ExceptionHandling)
783
Elliott Hughesb264f082012-04-06 17:10:10 -0700784jint Java_MyClassNatives_nativeUpCall(JNIEnv* env, jobject thisObj, jint i) {
Shih-wei Liaoff0f9be2011-08-29 15:43:53 -0700785 if (i <= 0) {
Andreas Gampecf4035a2014-05-28 22:43:01 -0700786 // We want to check raw Object* / Array* below
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700787 ScopedObjectAccess soa(env);
Ian Rogersaaa20802011-09-11 21:47:37 -0700788
789 // Build stack trace
Sebastien Hertzee1d79a2014-02-21 15:46:30 +0100790 jobject internal = Thread::Current()->CreateInternalStackTrace<false>(soa);
Ian Rogers53b8b092014-03-13 23:45:53 -0700791 jobjectArray ste_array = Thread::InternalStackTraceToStackTraceElementArray(soa, internal);
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800792 mirror::ObjectArray<mirror::StackTraceElement>* trace_array =
793 soa.Decode<mirror::ObjectArray<mirror::StackTraceElement>*>(ste_array);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700794 EXPECT_TRUE(trace_array != nullptr);
Shih-wei Liaoff0f9be2011-08-29 15:43:53 -0700795 EXPECT_EQ(11, trace_array->GetLength());
796
Ian Rogersaaa20802011-09-11 21:47:37 -0700797 // Check stack trace entries have expected values
Shih-wei Liaoff0f9be2011-08-29 15:43:53 -0700798 for (int32_t i = 0; i < trace_array->GetLength(); ++i) {
799 EXPECT_EQ(-2, trace_array->Get(i)->GetLineNumber());
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800800 mirror::StackTraceElement* ste = trace_array->Get(i);
Ian Rogersaaa20802011-09-11 21:47:37 -0700801 EXPECT_STREQ("MyClassNatives.java", ste->GetFileName()->ToModifiedUtf8().c_str());
Elliott Hughesb264f082012-04-06 17:10:10 -0700802 EXPECT_STREQ("MyClassNatives", ste->GetDeclaringClass()->ToModifiedUtf8().c_str());
Ian Rogersaaa20802011-09-11 21:47:37 -0700803 EXPECT_STREQ("fooI", ste->GetMethodName()->ToModifiedUtf8().c_str());
Shih-wei Liaoff0f9be2011-08-29 15:43:53 -0700804 }
Ian Rogersaaa20802011-09-11 21:47:37 -0700805
806 // end recursion
Shih-wei Liaoff0f9be2011-08-29 15:43:53 -0700807 return 0;
808 } else {
Elliott Hughesb264f082012-04-06 17:10:10 -0700809 jclass jklass = env->FindClass("MyClassNatives");
Andreas Gampecf4035a2014-05-28 22:43:01 -0700810 EXPECT_TRUE(jklass != nullptr);
Shih-wei Liaoff0f9be2011-08-29 15:43:53 -0700811 jmethodID jmethod = env->GetMethodID(jklass, "fooI", "(I)I");
Andreas Gampecf4035a2014-05-28 22:43:01 -0700812 EXPECT_TRUE(jmethod != nullptr);
Shih-wei Liaoff0f9be2011-08-29 15:43:53 -0700813
Ian Rogersaaa20802011-09-11 21:47:37 -0700814 // Recurse with i - 1
Shih-wei Liaoff0f9be2011-08-29 15:43:53 -0700815 jint result = env->CallNonvirtualIntMethod(thisObj, jklass, jmethod, i - 1);
Ian Rogersaaa20802011-09-11 21:47:37 -0700816
817 // Return sum of all depths
Shih-wei Liaoff0f9be2011-08-29 15:43:53 -0700818 return i + result;
819 }
820}
821
Andreas Gampe38bd1e12014-08-18 16:43:12 -0700822void JniCompilerTest::NativeStackTraceElementImpl() {
Brian Carlstrom265091e2013-01-30 14:08:26 -0800823 TEST_DISABLED_FOR_PORTABLE();
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700824 SetUpForTest(false, "fooI", "(I)I",
Elliott Hughesb264f082012-04-06 17:10:10 -0700825 reinterpret_cast<void*>(&Java_MyClassNatives_nativeUpCall));
Shih-wei Liaoff0f9be2011-08-29 15:43:53 -0700826 jint result = env_->CallNonvirtualIntMethod(jobj_, jklass_, jmethod_, 10);
Ian Rogersaaa20802011-09-11 21:47:37 -0700827 EXPECT_EQ(10+9+8+7+6+5+4+3+2+1, result);
Shih-wei Liaoff0f9be2011-08-29 15:43:53 -0700828}
829
Andreas Gampe38bd1e12014-08-18 16:43:12 -0700830JNI_TEST(NativeStackTraceElement)
831
Elliott Hughesb264f082012-04-06 17:10:10 -0700832jobject Java_MyClassNatives_fooO(JNIEnv* env, jobject, jobject x) {
Shih-wei Liao558788e2011-09-01 02:39:11 -0700833 return env->NewGlobalRef(x);
834}
835
Andreas Gampe38bd1e12014-08-18 16:43:12 -0700836void JniCompilerTest::ReturnGlobalRefImpl() {
Brian Carlstrom265091e2013-01-30 14:08:26 -0800837 TEST_DISABLED_FOR_PORTABLE();
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700838 SetUpForTest(false, "fooO", "(Ljava/lang/Object;)Ljava/lang/Object;",
Elliott Hughesb264f082012-04-06 17:10:10 -0700839 reinterpret_cast<void*>(&Java_MyClassNatives_fooO));
Shih-wei Liao558788e2011-09-01 02:39:11 -0700840 jobject result = env_->CallNonvirtualObjectMethod(jobj_, jklass_, jmethod_, jobj_);
841 EXPECT_EQ(JNILocalRefType, env_->GetObjectRefType(result));
842 EXPECT_TRUE(env_->IsSameObject(result, jobj_));
843}
844
Andreas Gampe38bd1e12014-08-18 16:43:12 -0700845JNI_TEST(ReturnGlobalRef)
846
Ian Rogersdc51b792011-09-22 20:41:37 -0700847jint local_ref_test(JNIEnv* env, jobject thisObj, jint x) {
848 // Add 10 local references
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700849 ScopedObjectAccess soa(env);
Ian Rogers5a7a74a2011-09-26 16:32:29 -0700850 for (int i = 0; i < 10; i++) {
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800851 soa.AddLocalReference<jobject>(soa.Decode<mirror::Object*>(thisObj));
Ian Rogersdc51b792011-09-22 20:41:37 -0700852 }
853 return x+1;
854}
855
Andreas Gampe38bd1e12014-08-18 16:43:12 -0700856void JniCompilerTest::LocalReferenceTableClearingTestImpl() {
Brian Carlstrom265091e2013-01-30 14:08:26 -0800857 TEST_DISABLED_FOR_PORTABLE();
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700858 SetUpForTest(false, "fooI", "(I)I", reinterpret_cast<void*>(&local_ref_test));
Ian Rogersdc51b792011-09-22 20:41:37 -0700859 // 1000 invocations of a method that adds 10 local references
Elliott Hughesb25c3f62012-03-26 16:35:06 -0700860 for (int i = 0; i < 1000; i++) {
Ian Rogersdc51b792011-09-22 20:41:37 -0700861 jint result = env_->CallIntMethod(jobj_, jmethod_, i);
862 EXPECT_TRUE(result == i + 1);
863 }
864}
865
Andreas Gampe38bd1e12014-08-18 16:43:12 -0700866JNI_TEST(LocalReferenceTableClearingTest)
867
Ian Rogersb9231c82011-09-05 22:13:19 -0700868void my_arraycopy(JNIEnv* env, jclass klass, jobject src, jint src_pos, jobject dst, jint dst_pos, jint length) {
869 EXPECT_TRUE(env->IsSameObject(JniCompilerTest::jklass_, klass));
870 EXPECT_TRUE(env->IsSameObject(JniCompilerTest::jklass_, dst));
Ian Rogers82f3e092011-09-05 22:54:45 -0700871 EXPECT_TRUE(env->IsSameObject(JniCompilerTest::jobj_, src));
Ian Rogersb9231c82011-09-05 22:13:19 -0700872 EXPECT_EQ(1234, src_pos);
873 EXPECT_EQ(5678, dst_pos);
874 EXPECT_EQ(9876, length);
875}
876
Andreas Gampe38bd1e12014-08-18 16:43:12 -0700877void JniCompilerTest::JavaLangSystemArrayCopyImpl() {
Brian Carlstrom265091e2013-01-30 14:08:26 -0800878 TEST_DISABLED_FOR_PORTABLE();
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700879 SetUpForTest(true, "arraycopy", "(Ljava/lang/Object;ILjava/lang/Object;II)V",
Ian Rogersb9231c82011-09-05 22:13:19 -0700880 reinterpret_cast<void*>(&my_arraycopy));
Ian Rogers82f3e092011-09-05 22:54:45 -0700881 env_->CallStaticVoidMethod(jklass_, jmethod_, jobj_, 1234, jklass_, 5678, 9876);
Ian Rogersb9231c82011-09-05 22:13:19 -0700882}
883
Andreas Gampe38bd1e12014-08-18 16:43:12 -0700884JNI_TEST(JavaLangSystemArrayCopy)
885
Ian Rogers67375ac2011-09-14 00:55:44 -0700886jboolean my_casi(JNIEnv* env, jobject unsafe, jobject obj, jlong offset, jint expected, jint newval) {
887 EXPECT_TRUE(env->IsSameObject(JniCompilerTest::jobj_, unsafe));
888 EXPECT_TRUE(env->IsSameObject(JniCompilerTest::jobj_, obj));
Ian Rogers0f678472014-03-10 16:18:37 -0700889 EXPECT_EQ(INT64_C(0x12345678ABCDEF88), offset);
Ian Rogers67375ac2011-09-14 00:55:44 -0700890 EXPECT_EQ(static_cast<jint>(0xCAFEF00D), expected);
891 EXPECT_EQ(static_cast<jint>(0xEBADF00D), newval);
892 return JNI_TRUE;
893}
894
Andreas Gampe38bd1e12014-08-18 16:43:12 -0700895void JniCompilerTest::CompareAndSwapIntImpl() {
Brian Carlstrom265091e2013-01-30 14:08:26 -0800896 TEST_DISABLED_FOR_PORTABLE();
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700897 SetUpForTest(false, "compareAndSwapInt", "(Ljava/lang/Object;JII)Z",
Ian Rogers67375ac2011-09-14 00:55:44 -0700898 reinterpret_cast<void*>(&my_casi));
Ian Rogers0f678472014-03-10 16:18:37 -0700899 jboolean result = env_->CallBooleanMethod(jobj_, jmethod_, jobj_, INT64_C(0x12345678ABCDEF88),
900 0xCAFEF00D, 0xEBADF00D);
Ian Rogers67375ac2011-09-14 00:55:44 -0700901 EXPECT_EQ(result, JNI_TRUE);
902}
903
Andreas Gampe38bd1e12014-08-18 16:43:12 -0700904JNI_TEST(CompareAndSwapInt)
905
Ian Rogersc7792842012-03-03 15:36:20 -0800906jint my_gettext(JNIEnv* env, jclass klass, jlong val1, jobject obj1, jlong val2, jobject obj2) {
907 EXPECT_TRUE(env->IsInstanceOf(JniCompilerTest::jobj_, klass));
908 EXPECT_TRUE(env->IsSameObject(JniCompilerTest::jobj_, obj1));
909 EXPECT_TRUE(env->IsSameObject(JniCompilerTest::jobj_, obj2));
910 EXPECT_EQ(0x12345678ABCDEF88ll, val1);
911 EXPECT_EQ(0x7FEDCBA987654321ll, val2);
912 return 42;
913}
914
Andreas Gampe38bd1e12014-08-18 16:43:12 -0700915void JniCompilerTest::GetTextImpl() {
Brian Carlstrom265091e2013-01-30 14:08:26 -0800916 TEST_DISABLED_FOR_PORTABLE();
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700917 SetUpForTest(true, "getText", "(JLjava/lang/Object;JLjava/lang/Object;)I",
Ian Rogersc7792842012-03-03 15:36:20 -0800918 reinterpret_cast<void*>(&my_gettext));
919 jint result = env_->CallStaticIntMethod(jklass_, jmethod_, 0x12345678ABCDEF88ll, jobj_,
Ian Rogers0f678472014-03-10 16:18:37 -0700920 INT64_C(0x7FEDCBA987654321), jobj_);
Ian Rogersc7792842012-03-03 15:36:20 -0800921 EXPECT_EQ(result, 42);
922}
923
Andreas Gampe38bd1e12014-08-18 16:43:12 -0700924JNI_TEST(GetText)
925
Vladimir Markoee2d1ad2014-07-24 17:01:58 +0100926int gJava_MyClassNatives_GetSinkProperties_calls = 0;
927jarray Java_MyClassNatives_GetSinkProperties(JNIEnv* env, jobject thisObj, jstring s) {
928 // 1 = thisObj
929 Thread* self = Thread::Current();
930 EXPECT_EQ(kNative, self->GetState());
931 Locks::mutator_lock_->AssertNotHeld(self);
932 EXPECT_EQ(self->GetJniEnv(), env);
933 EXPECT_TRUE(thisObj != nullptr);
934 EXPECT_TRUE(env->IsInstanceOf(thisObj, JniCompilerTest::jklass_));
935 EXPECT_EQ(s, nullptr);
936 gJava_MyClassNatives_GetSinkProperties_calls++;
937 ScopedObjectAccess soa(self);
938 EXPECT_EQ(2U, self->NumStackReferences());
939 EXPECT_TRUE(self->HoldsLock(soa.Decode<mirror::Object*>(thisObj)));
940 return nullptr;
941}
942
Andreas Gampe38bd1e12014-08-18 16:43:12 -0700943void JniCompilerTest::GetSinkPropertiesNativeImpl() {
Brian Carlstrom265091e2013-01-30 14:08:26 -0800944 TEST_DISABLED_FOR_PORTABLE();
Vladimir Markoee2d1ad2014-07-24 17:01:58 +0100945 SetUpForTest(false, "getSinkPropertiesNative", "(Ljava/lang/String;)[Ljava/lang/Object;",
946 reinterpret_cast<void*>(&Java_MyClassNatives_GetSinkProperties));
947
948 EXPECT_EQ(0, gJava_MyClassNatives_GetSinkProperties_calls);
949 jarray result = down_cast<jarray>(
950 env_->CallNonvirtualObjectMethod(jobj_, jklass_, jmethod_, nullptr));
951 EXPECT_EQ(nullptr, result);
952 EXPECT_EQ(1, gJava_MyClassNatives_GetSinkProperties_calls);
Andreas Gampe38bd1e12014-08-18 16:43:12 -0700953
954 gJava_MyClassNatives_GetSinkProperties_calls = 0;
Brian Carlstromfc7120c2012-08-27 13:43:25 -0700955}
956
Andreas Gampe38bd1e12014-08-18 16:43:12 -0700957JNI_TEST(GetSinkPropertiesNative)
958
Elliott Hughesb264f082012-04-06 17:10:10 -0700959// This should return jclass, but we're imitating a bug pattern.
960jobject Java_MyClassNatives_instanceMethodThatShouldReturnClass(JNIEnv* env, jobject) {
961 return env->NewStringUTF("not a class!");
962}
963
964// This should return jclass, but we're imitating a bug pattern.
965jobject Java_MyClassNatives_staticMethodThatShouldReturnClass(JNIEnv* env, jclass) {
966 return env->NewStringUTF("not a class!");
967}
968
Andreas Gampe38bd1e12014-08-18 16:43:12 -0700969void JniCompilerTest::UpcallReturnTypeChecking_InstanceImpl() {
Brian Carlstrom265091e2013-01-30 14:08:26 -0800970 TEST_DISABLED_FOR_PORTABLE();
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700971 SetUpForTest(false, "instanceMethodThatShouldReturnClass", "()Ljava/lang/Class;",
Elliott Hughesb264f082012-04-06 17:10:10 -0700972 reinterpret_cast<void*>(&Java_MyClassNatives_instanceMethodThatShouldReturnClass));
973
974 CheckJniAbortCatcher check_jni_abort_catcher;
Elliott Hughes3f6635a2012-06-19 13:37:49 -0700975 // TODO: check type of returns with portable JNI compiler.
976 // This native method is bad, and tries to return a jstring as a jclass.
977 env_->CallObjectMethod(jobj_, jmethod_);
978 check_jni_abort_catcher.Check("attempt to return an instance of java.lang.String from java.lang.Class MyClassNatives.instanceMethodThatShouldReturnClass()");
979
980 // Here, we just call the method incorrectly; we should catch that too.
Elliott Hughesb264f082012-04-06 17:10:10 -0700981 env_->CallVoidMethod(jobj_, jmethod_);
Elliott Hughes3f6635a2012-06-19 13:37:49 -0700982 check_jni_abort_catcher.Check("attempt to return an instance of java.lang.String from java.lang.Class MyClassNatives.instanceMethodThatShouldReturnClass()");
983 env_->CallStaticVoidMethod(jklass_, jmethod_);
984 check_jni_abort_catcher.Check("calling non-static method java.lang.Class MyClassNatives.instanceMethodThatShouldReturnClass() with CallStaticVoidMethodV");
Elliott Hughesb264f082012-04-06 17:10:10 -0700985}
986
Andreas Gampe38bd1e12014-08-18 16:43:12 -0700987JNI_TEST(UpcallReturnTypeChecking_Instance)
988
989void JniCompilerTest::UpcallReturnTypeChecking_StaticImpl() {
Brian Carlstrom265091e2013-01-30 14:08:26 -0800990 TEST_DISABLED_FOR_PORTABLE();
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700991 SetUpForTest(true, "staticMethodThatShouldReturnClass", "()Ljava/lang/Class;",
Elliott Hughesb264f082012-04-06 17:10:10 -0700992 reinterpret_cast<void*>(&Java_MyClassNatives_staticMethodThatShouldReturnClass));
993
994 CheckJniAbortCatcher check_jni_abort_catcher;
Elliott Hughes3f6635a2012-06-19 13:37:49 -0700995 // TODO: check type of returns with portable JNI compiler.
996 // This native method is bad, and tries to return a jstring as a jclass.
997 env_->CallStaticObjectMethod(jklass_, jmethod_);
998 check_jni_abort_catcher.Check("attempt to return an instance of java.lang.String from java.lang.Class MyClassNatives.staticMethodThatShouldReturnClass()");
999
1000 // Here, we just call the method incorrectly; we should catch that too.
1001 env_->CallStaticVoidMethod(jklass_, jmethod_);
1002 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 -07001003 env_->CallVoidMethod(jobj_, jmethod_);
Elliott Hughes3f6635a2012-06-19 13:37:49 -07001004 check_jni_abort_catcher.Check("calling static method java.lang.Class MyClassNatives.staticMethodThatShouldReturnClass() with CallVoidMethodV");
Elliott Hughesb264f082012-04-06 17:10:10 -07001005}
1006
Andreas Gampe38bd1e12014-08-18 16:43:12 -07001007JNI_TEST(UpcallReturnTypeChecking_Static)
1008
Elliott Hughesb264f082012-04-06 17:10:10 -07001009// This should take jclass, but we're imitating a bug pattern.
1010void Java_MyClassNatives_instanceMethodThatShouldTakeClass(JNIEnv*, jobject, jclass) {
1011}
1012
1013// This should take jclass, but we're imitating a bug pattern.
1014void Java_MyClassNatives_staticMethodThatShouldTakeClass(JNIEnv*, jclass, jclass) {
1015}
1016
Andreas Gampe38bd1e12014-08-18 16:43:12 -07001017void JniCompilerTest::UpcallArgumentTypeChecking_InstanceImpl() {
Brian Carlstrom265091e2013-01-30 14:08:26 -08001018 TEST_DISABLED_FOR_PORTABLE();
Ian Rogers00f7d0e2012-07-19 15:28:27 -07001019 SetUpForTest(false, "instanceMethodThatShouldTakeClass", "(ILjava/lang/Class;)V",
Elliott Hughesb264f082012-04-06 17:10:10 -07001020 reinterpret_cast<void*>(&Java_MyClassNatives_instanceMethodThatShouldTakeClass));
1021
1022 CheckJniAbortCatcher check_jni_abort_catcher;
1023 // We deliberately pass a bad second argument here.
1024 env_->CallVoidMethod(jobj_, jmethod_, 123, env_->NewStringUTF("not a class!"));
Elliott Hughes3f6635a2012-06-19 13:37:49 -07001025 check_jni_abort_catcher.Check("bad arguments passed to void MyClassNatives.instanceMethodThatShouldTakeClass(int, java.lang.Class)");
Elliott Hughesb264f082012-04-06 17:10:10 -07001026}
1027
Andreas Gampe38bd1e12014-08-18 16:43:12 -07001028JNI_TEST(UpcallArgumentTypeChecking_Instance)
1029
1030void JniCompilerTest::UpcallArgumentTypeChecking_StaticImpl() {
Brian Carlstrom265091e2013-01-30 14:08:26 -08001031 TEST_DISABLED_FOR_PORTABLE();
Ian Rogers00f7d0e2012-07-19 15:28:27 -07001032 SetUpForTest(true, "staticMethodThatShouldTakeClass", "(ILjava/lang/Class;)V",
Elliott Hughesb264f082012-04-06 17:10:10 -07001033 reinterpret_cast<void*>(&Java_MyClassNatives_staticMethodThatShouldTakeClass));
1034
1035 CheckJniAbortCatcher check_jni_abort_catcher;
1036 // We deliberately pass a bad second argument here.
1037 env_->CallStaticVoidMethod(jklass_, jmethod_, 123, env_->NewStringUTF("not a class!"));
Elliott Hughes3f6635a2012-06-19 13:37:49 -07001038 check_jni_abort_catcher.Check("bad arguments passed to void MyClassNatives.staticMethodThatShouldTakeClass(int, java.lang.Class)");
Elliott Hughesb264f082012-04-06 17:10:10 -07001039}
1040
Andreas Gampe38bd1e12014-08-18 16:43:12 -07001041JNI_TEST(UpcallArgumentTypeChecking_Static)
1042
Andreas Gampe7a0e5042014-03-07 13:03:19 -08001043jfloat Java_MyClassNatives_checkFloats(JNIEnv* env, jobject thisObj, jfloat f1, jfloat f2) {
1044 EXPECT_EQ(kNative, Thread::Current()->GetState());
1045 EXPECT_EQ(Thread::Current()->GetJniEnv(), env);
Andreas Gampecf4035a2014-05-28 22:43:01 -07001046 EXPECT_TRUE(thisObj != nullptr);
Andreas Gampe7a0e5042014-03-07 13:03:19 -08001047 EXPECT_TRUE(env->IsInstanceOf(thisObj, JniCompilerTest::jklass_));
1048 ScopedObjectAccess soa(Thread::Current());
1049 EXPECT_EQ(1U, Thread::Current()->NumStackReferences());
1050 return f1 - f2; // non-commutative operator
1051}
1052
Andreas Gampe38bd1e12014-08-18 16:43:12 -07001053void JniCompilerTest::CompileAndRunFloatFloatMethodImpl() {
Andreas Gampe7a0e5042014-03-07 13:03:19 -08001054 TEST_DISABLED_FOR_PORTABLE();
1055 SetUpForTest(false, "checkFloats", "(FF)F",
1056 reinterpret_cast<void*>(&Java_MyClassNatives_checkFloats));
1057
1058 jfloat result = env_->CallNonvirtualFloatMethod(jobj_, jklass_, jmethod_,
1059 99.0F, 10.0F);
1060 EXPECT_EQ(99.0F - 10.0F, result);
1061 jfloat a = 3.14159F;
1062 jfloat b = 0.69314F;
1063 result = env_->CallNonvirtualFloatMethod(jobj_, jklass_, jmethod_, a, b);
1064 EXPECT_EQ(a - b, result);
1065}
1066
Andreas Gampe38bd1e12014-08-18 16:43:12 -07001067JNI_TEST(CompileAndRunFloatFloatMethod)
1068
Andreas Gampe7a0e5042014-03-07 13:03:19 -08001069void Java_MyClassNatives_checkParameterAlign(JNIEnv* env, jobject thisObj, jint i1, jlong l1) {
Andreas Gampecf4035a2014-05-28 22:43:01 -07001070// EXPECT_EQ(kNative, Thread::Current()->GetState());
1071// EXPECT_EQ(Thread::Current()->GetJniEnv(), env);
1072// EXPECT_TRUE(thisObj != nullptr);
1073// EXPECT_TRUE(env->IsInstanceOf(thisObj, JniCompilerTest::jklass_));
1074// ScopedObjectAccess soa(Thread::Current());
1075// EXPECT_EQ(1U, Thread::Current()->NumStackReferences());
Andreas Gampe7a0e5042014-03-07 13:03:19 -08001076 EXPECT_EQ(i1, 1234);
Ian Rogers0f678472014-03-10 16:18:37 -07001077 EXPECT_EQ(l1, INT64_C(0x12345678ABCDEF0));
Andreas Gampe7a0e5042014-03-07 13:03:19 -08001078}
1079
Andreas Gampe38bd1e12014-08-18 16:43:12 -07001080void JniCompilerTest::CheckParameterAlignImpl() {
Andreas Gampe7a0e5042014-03-07 13:03:19 -08001081 TEST_DISABLED_FOR_PORTABLE();
1082 SetUpForTest(false, "checkParameterAlign", "(IJ)V",
1083 reinterpret_cast<void*>(&Java_MyClassNatives_checkParameterAlign));
1084
Ian Rogers0f678472014-03-10 16:18:37 -07001085 env_->CallNonvirtualVoidMethod(jobj_, jklass_, jmethod_, 1234, INT64_C(0x12345678ABCDEF0));
Andreas Gampe7a0e5042014-03-07 13:03:19 -08001086}
1087
Andreas Gampe38bd1e12014-08-18 16:43:12 -07001088JNI_TEST(CheckParameterAlign)
1089
Andreas Gampe7a0e5042014-03-07 13:03:19 -08001090void Java_MyClassNatives_maxParamNumber(JNIEnv* env, jobject thisObj,
1091 jobject o0, jobject o1, jobject o2, jobject o3, jobject o4, jobject o5, jobject o6, jobject o7,
1092 jobject o8, jobject o9, jobject o10, jobject o11, jobject o12, jobject o13, jobject o14, jobject o15,
1093 jobject o16, jobject o17, jobject o18, jobject o19, jobject o20, jobject o21, jobject o22, jobject o23,
1094 jobject o24, jobject o25, jobject o26, jobject o27, jobject o28, jobject o29, jobject o30, jobject o31,
1095 jobject o32, jobject o33, jobject o34, jobject o35, jobject o36, jobject o37, jobject o38, jobject o39,
1096 jobject o40, jobject o41, jobject o42, jobject o43, jobject o44, jobject o45, jobject o46, jobject o47,
1097 jobject o48, jobject o49, jobject o50, jobject o51, jobject o52, jobject o53, jobject o54, jobject o55,
1098 jobject o56, jobject o57, jobject o58, jobject o59, jobject o60, jobject o61, jobject o62, jobject o63,
1099 jobject o64, jobject o65, jobject o66, jobject o67, jobject o68, jobject o69, jobject o70, jobject o71,
1100 jobject o72, jobject o73, jobject o74, jobject o75, jobject o76, jobject o77, jobject o78, jobject o79,
1101 jobject o80, jobject o81, jobject o82, jobject o83, jobject o84, jobject o85, jobject o86, jobject o87,
1102 jobject o88, jobject o89, jobject o90, jobject o91, jobject o92, jobject o93, jobject o94, jobject o95,
1103 jobject o96, jobject o97, jobject o98, jobject o99, jobject o100, jobject o101, jobject o102, jobject o103,
1104 jobject o104, jobject o105, jobject o106, jobject o107, jobject o108, jobject o109, jobject o110, jobject o111,
1105 jobject o112, jobject o113, jobject o114, jobject o115, jobject o116, jobject o117, jobject o118, jobject o119,
1106 jobject o120, jobject o121, jobject o122, jobject o123, jobject o124, jobject o125, jobject o126, jobject o127,
1107 jobject o128, jobject o129, jobject o130, jobject o131, jobject o132, jobject o133, jobject o134, jobject o135,
1108 jobject o136, jobject o137, jobject o138, jobject o139, jobject o140, jobject o141, jobject o142, jobject o143,
1109 jobject o144, jobject o145, jobject o146, jobject o147, jobject o148, jobject o149, jobject o150, jobject o151,
1110 jobject o152, jobject o153, jobject o154, jobject o155, jobject o156, jobject o157, jobject o158, jobject o159,
1111 jobject o160, jobject o161, jobject o162, jobject o163, jobject o164, jobject o165, jobject o166, jobject o167,
1112 jobject o168, jobject o169, jobject o170, jobject o171, jobject o172, jobject o173, jobject o174, jobject o175,
1113 jobject o176, jobject o177, jobject o178, jobject o179, jobject o180, jobject o181, jobject o182, jobject o183,
1114 jobject o184, jobject o185, jobject o186, jobject o187, jobject o188, jobject o189, jobject o190, jobject o191,
1115 jobject o192, jobject o193, jobject o194, jobject o195, jobject o196, jobject o197, jobject o198, jobject o199,
1116 jobject o200, jobject o201, jobject o202, jobject o203, jobject o204, jobject o205, jobject o206, jobject o207,
1117 jobject o208, jobject o209, jobject o210, jobject o211, jobject o212, jobject o213, jobject o214, jobject o215,
1118 jobject o216, jobject o217, jobject o218, jobject o219, jobject o220, jobject o221, jobject o222, jobject o223,
1119 jobject o224, jobject o225, jobject o226, jobject o227, jobject o228, jobject o229, jobject o230, jobject o231,
1120 jobject o232, jobject o233, jobject o234, jobject o235, jobject o236, jobject o237, jobject o238, jobject o239,
1121 jobject o240, jobject o241, jobject o242, jobject o243, jobject o244, jobject o245, jobject o246, jobject o247,
1122 jobject o248, jobject o249, jobject o250, jobject o251, jobject o252, jobject o253) {
1123 EXPECT_EQ(kNative, Thread::Current()->GetState());
1124 EXPECT_EQ(Thread::Current()->GetJniEnv(), env);
Andreas Gampecf4035a2014-05-28 22:43:01 -07001125 EXPECT_TRUE(thisObj != nullptr);
Andreas Gampe7a0e5042014-03-07 13:03:19 -08001126 EXPECT_TRUE(env->IsInstanceOf(thisObj, JniCompilerTest::jklass_));
1127 ScopedObjectAccess soa(Thread::Current());
1128 EXPECT_GE(255U, Thread::Current()->NumStackReferences());
1129
1130 // two tests possible
1131 if (o0 == nullptr) {
1132 // 1) everything is null
1133 EXPECT_TRUE(o0 == nullptr && o1 == nullptr && o2 == nullptr && o3 == nullptr && o4 == nullptr
1134 && o5 == nullptr && o6 == nullptr && o7 == nullptr && o8 == nullptr && o9 == nullptr
1135 && o10 == nullptr && o11 == nullptr && o12 == nullptr && o13 == nullptr && o14 == nullptr
1136 && o15 == nullptr && o16 == nullptr && o17 == nullptr && o18 == nullptr && o19 == nullptr
1137 && o20 == nullptr && o21 == nullptr && o22 == nullptr && o23 == nullptr && o24 == nullptr
1138 && o25 == nullptr && o26 == nullptr && o27 == nullptr && o28 == nullptr && o29 == nullptr
1139 && o30 == nullptr && o31 == nullptr && o32 == nullptr && o33 == nullptr && o34 == nullptr
1140 && o35 == nullptr && o36 == nullptr && o37 == nullptr && o38 == nullptr && o39 == nullptr
1141 && o40 == nullptr && o41 == nullptr && o42 == nullptr && o43 == nullptr && o44 == nullptr
1142 && o45 == nullptr && o46 == nullptr && o47 == nullptr && o48 == nullptr && o49 == nullptr
1143 && o50 == nullptr && o51 == nullptr && o52 == nullptr && o53 == nullptr && o54 == nullptr
1144 && o55 == nullptr && o56 == nullptr && o57 == nullptr && o58 == nullptr && o59 == nullptr
1145 && o60 == nullptr && o61 == nullptr && o62 == nullptr && o63 == nullptr && o64 == nullptr
1146 && o65 == nullptr && o66 == nullptr && o67 == nullptr && o68 == nullptr && o69 == nullptr
1147 && o70 == nullptr && o71 == nullptr && o72 == nullptr && o73 == nullptr && o74 == nullptr
1148 && o75 == nullptr && o76 == nullptr && o77 == nullptr && o78 == nullptr && o79 == nullptr
1149 && o80 == nullptr && o81 == nullptr && o82 == nullptr && o83 == nullptr && o84 == nullptr
1150 && o85 == nullptr && o86 == nullptr && o87 == nullptr && o88 == nullptr && o89 == nullptr
1151 && o90 == nullptr && o91 == nullptr && o92 == nullptr && o93 == nullptr && o94 == nullptr
1152 && o95 == nullptr && o96 == nullptr && o97 == nullptr && o98 == nullptr && o99 == nullptr
1153 && o100 == nullptr && o101 == nullptr && o102 == nullptr && o103 == nullptr && o104 == nullptr
1154 && o105 == nullptr && o106 == nullptr && o107 == nullptr && o108 == nullptr && o109 == nullptr
1155 && o110 == nullptr && o111 == nullptr && o112 == nullptr && o113 == nullptr && o114 == nullptr
1156 && o115 == nullptr && o116 == nullptr && o117 == nullptr && o118 == nullptr && o119 == nullptr
1157 && o120 == nullptr && o121 == nullptr && o122 == nullptr && o123 == nullptr && o124 == nullptr
1158 && o125 == nullptr && o126 == nullptr && o127 == nullptr && o128 == nullptr && o129 == nullptr
1159 && o130 == nullptr && o131 == nullptr && o132 == nullptr && o133 == nullptr && o134 == nullptr
1160 && o135 == nullptr && o136 == nullptr && o137 == nullptr && o138 == nullptr && o139 == nullptr
1161 && o140 == nullptr && o141 == nullptr && o142 == nullptr && o143 == nullptr && o144 == nullptr
1162 && o145 == nullptr && o146 == nullptr && o147 == nullptr && o148 == nullptr && o149 == nullptr
1163 && o150 == nullptr && o151 == nullptr && o152 == nullptr && o153 == nullptr && o154 == nullptr
1164 && o155 == nullptr && o156 == nullptr && o157 == nullptr && o158 == nullptr && o159 == nullptr
1165 && o160 == nullptr && o161 == nullptr && o162 == nullptr && o163 == nullptr && o164 == nullptr
1166 && o165 == nullptr && o166 == nullptr && o167 == nullptr && o168 == nullptr && o169 == nullptr
1167 && o170 == nullptr && o171 == nullptr && o172 == nullptr && o173 == nullptr && o174 == nullptr
1168 && o175 == nullptr && o176 == nullptr && o177 == nullptr && o178 == nullptr && o179 == nullptr
1169 && o180 == nullptr && o181 == nullptr && o182 == nullptr && o183 == nullptr && o184 == nullptr
1170 && o185 == nullptr && o186 == nullptr && o187 == nullptr && o188 == nullptr && o189 == nullptr
1171 && o190 == nullptr && o191 == nullptr && o192 == nullptr && o193 == nullptr && o194 == nullptr
1172 && o195 == nullptr && o196 == nullptr && o197 == nullptr && o198 == nullptr && o199 == nullptr
1173 && o200 == nullptr && o201 == nullptr && o202 == nullptr && o203 == nullptr && o204 == nullptr
1174 && o205 == nullptr && o206 == nullptr && o207 == nullptr && o208 == nullptr && o209 == nullptr
1175 && o210 == nullptr && o211 == nullptr && o212 == nullptr && o213 == nullptr && o214 == nullptr
1176 && o215 == nullptr && o216 == nullptr && o217 == nullptr && o218 == nullptr && o219 == nullptr
1177 && o220 == nullptr && o221 == nullptr && o222 == nullptr && o223 == nullptr && o224 == nullptr
1178 && o225 == nullptr && o226 == nullptr && o227 == nullptr && o228 == nullptr && o229 == nullptr
1179 && o230 == nullptr && o231 == nullptr && o232 == nullptr && o233 == nullptr && o234 == nullptr
1180 && o235 == nullptr && o236 == nullptr && o237 == nullptr && o238 == nullptr && o239 == nullptr
1181 && o240 == nullptr && o241 == nullptr && o242 == nullptr && o243 == nullptr && o244 == nullptr
1182 && o245 == nullptr && o246 == nullptr && o247 == nullptr && o248 == nullptr && o249 == nullptr
1183 && o250 == nullptr && o251 == nullptr && o252 == nullptr && o253 == nullptr);
1184 } else {
1185 EXPECT_EQ(0, env->GetArrayLength(reinterpret_cast<jarray>(o0)));
1186 EXPECT_EQ(1, env->GetArrayLength(reinterpret_cast<jarray>(o1)));
1187 EXPECT_EQ(2, env->GetArrayLength(reinterpret_cast<jarray>(o2)));
1188 EXPECT_EQ(3, env->GetArrayLength(reinterpret_cast<jarray>(o3)));
1189 EXPECT_EQ(4, env->GetArrayLength(reinterpret_cast<jarray>(o4)));
1190 EXPECT_EQ(5, env->GetArrayLength(reinterpret_cast<jarray>(o5)));
1191 EXPECT_EQ(6, env->GetArrayLength(reinterpret_cast<jarray>(o6)));
1192 EXPECT_EQ(7, env->GetArrayLength(reinterpret_cast<jarray>(o7)));
1193 EXPECT_EQ(8, env->GetArrayLength(reinterpret_cast<jarray>(o8)));
1194 EXPECT_EQ(9, env->GetArrayLength(reinterpret_cast<jarray>(o9)));
1195 EXPECT_EQ(10, env->GetArrayLength(reinterpret_cast<jarray>(o10)));
1196 EXPECT_EQ(11, env->GetArrayLength(reinterpret_cast<jarray>(o11)));
1197 EXPECT_EQ(12, env->GetArrayLength(reinterpret_cast<jarray>(o12)));
1198 EXPECT_EQ(13, env->GetArrayLength(reinterpret_cast<jarray>(o13)));
1199 EXPECT_EQ(14, env->GetArrayLength(reinterpret_cast<jarray>(o14)));
1200 EXPECT_EQ(15, env->GetArrayLength(reinterpret_cast<jarray>(o15)));
1201 EXPECT_EQ(16, env->GetArrayLength(reinterpret_cast<jarray>(o16)));
1202 EXPECT_EQ(17, env->GetArrayLength(reinterpret_cast<jarray>(o17)));
1203 EXPECT_EQ(18, env->GetArrayLength(reinterpret_cast<jarray>(o18)));
1204 EXPECT_EQ(19, env->GetArrayLength(reinterpret_cast<jarray>(o19)));
1205 EXPECT_EQ(20, env->GetArrayLength(reinterpret_cast<jarray>(o20)));
1206 EXPECT_EQ(21, env->GetArrayLength(reinterpret_cast<jarray>(o21)));
1207 EXPECT_EQ(22, env->GetArrayLength(reinterpret_cast<jarray>(o22)));
1208 EXPECT_EQ(23, env->GetArrayLength(reinterpret_cast<jarray>(o23)));
1209 EXPECT_EQ(24, env->GetArrayLength(reinterpret_cast<jarray>(o24)));
1210 EXPECT_EQ(25, env->GetArrayLength(reinterpret_cast<jarray>(o25)));
1211 EXPECT_EQ(26, env->GetArrayLength(reinterpret_cast<jarray>(o26)));
1212 EXPECT_EQ(27, env->GetArrayLength(reinterpret_cast<jarray>(o27)));
1213 EXPECT_EQ(28, env->GetArrayLength(reinterpret_cast<jarray>(o28)));
1214 EXPECT_EQ(29, env->GetArrayLength(reinterpret_cast<jarray>(o29)));
1215 EXPECT_EQ(30, env->GetArrayLength(reinterpret_cast<jarray>(o30)));
1216 EXPECT_EQ(31, env->GetArrayLength(reinterpret_cast<jarray>(o31)));
1217 EXPECT_EQ(32, env->GetArrayLength(reinterpret_cast<jarray>(o32)));
1218 EXPECT_EQ(33, env->GetArrayLength(reinterpret_cast<jarray>(o33)));
1219 EXPECT_EQ(34, env->GetArrayLength(reinterpret_cast<jarray>(o34)));
1220 EXPECT_EQ(35, env->GetArrayLength(reinterpret_cast<jarray>(o35)));
1221 EXPECT_EQ(36, env->GetArrayLength(reinterpret_cast<jarray>(o36)));
1222 EXPECT_EQ(37, env->GetArrayLength(reinterpret_cast<jarray>(o37)));
1223 EXPECT_EQ(38, env->GetArrayLength(reinterpret_cast<jarray>(o38)));
1224 EXPECT_EQ(39, env->GetArrayLength(reinterpret_cast<jarray>(o39)));
1225 EXPECT_EQ(40, env->GetArrayLength(reinterpret_cast<jarray>(o40)));
1226 EXPECT_EQ(41, env->GetArrayLength(reinterpret_cast<jarray>(o41)));
1227 EXPECT_EQ(42, env->GetArrayLength(reinterpret_cast<jarray>(o42)));
1228 EXPECT_EQ(43, env->GetArrayLength(reinterpret_cast<jarray>(o43)));
1229 EXPECT_EQ(44, env->GetArrayLength(reinterpret_cast<jarray>(o44)));
1230 EXPECT_EQ(45, env->GetArrayLength(reinterpret_cast<jarray>(o45)));
1231 EXPECT_EQ(46, env->GetArrayLength(reinterpret_cast<jarray>(o46)));
1232 EXPECT_EQ(47, env->GetArrayLength(reinterpret_cast<jarray>(o47)));
1233 EXPECT_EQ(48, env->GetArrayLength(reinterpret_cast<jarray>(o48)));
1234 EXPECT_EQ(49, env->GetArrayLength(reinterpret_cast<jarray>(o49)));
1235 EXPECT_EQ(50, env->GetArrayLength(reinterpret_cast<jarray>(o50)));
1236 EXPECT_EQ(51, env->GetArrayLength(reinterpret_cast<jarray>(o51)));
1237 EXPECT_EQ(52, env->GetArrayLength(reinterpret_cast<jarray>(o52)));
1238 EXPECT_EQ(53, env->GetArrayLength(reinterpret_cast<jarray>(o53)));
1239 EXPECT_EQ(54, env->GetArrayLength(reinterpret_cast<jarray>(o54)));
1240 EXPECT_EQ(55, env->GetArrayLength(reinterpret_cast<jarray>(o55)));
1241 EXPECT_EQ(56, env->GetArrayLength(reinterpret_cast<jarray>(o56)));
1242 EXPECT_EQ(57, env->GetArrayLength(reinterpret_cast<jarray>(o57)));
1243 EXPECT_EQ(58, env->GetArrayLength(reinterpret_cast<jarray>(o58)));
1244 EXPECT_EQ(59, env->GetArrayLength(reinterpret_cast<jarray>(o59)));
1245 EXPECT_EQ(60, env->GetArrayLength(reinterpret_cast<jarray>(o60)));
1246 EXPECT_EQ(61, env->GetArrayLength(reinterpret_cast<jarray>(o61)));
1247 EXPECT_EQ(62, env->GetArrayLength(reinterpret_cast<jarray>(o62)));
1248 EXPECT_EQ(63, env->GetArrayLength(reinterpret_cast<jarray>(o63)));
1249 EXPECT_EQ(64, env->GetArrayLength(reinterpret_cast<jarray>(o64)));
1250 EXPECT_EQ(65, env->GetArrayLength(reinterpret_cast<jarray>(o65)));
1251 EXPECT_EQ(66, env->GetArrayLength(reinterpret_cast<jarray>(o66)));
1252 EXPECT_EQ(67, env->GetArrayLength(reinterpret_cast<jarray>(o67)));
1253 EXPECT_EQ(68, env->GetArrayLength(reinterpret_cast<jarray>(o68)));
1254 EXPECT_EQ(69, env->GetArrayLength(reinterpret_cast<jarray>(o69)));
1255 EXPECT_EQ(70, env->GetArrayLength(reinterpret_cast<jarray>(o70)));
1256 EXPECT_EQ(71, env->GetArrayLength(reinterpret_cast<jarray>(o71)));
1257 EXPECT_EQ(72, env->GetArrayLength(reinterpret_cast<jarray>(o72)));
1258 EXPECT_EQ(73, env->GetArrayLength(reinterpret_cast<jarray>(o73)));
1259 EXPECT_EQ(74, env->GetArrayLength(reinterpret_cast<jarray>(o74)));
1260 EXPECT_EQ(75, env->GetArrayLength(reinterpret_cast<jarray>(o75)));
1261 EXPECT_EQ(76, env->GetArrayLength(reinterpret_cast<jarray>(o76)));
1262 EXPECT_EQ(77, env->GetArrayLength(reinterpret_cast<jarray>(o77)));
1263 EXPECT_EQ(78, env->GetArrayLength(reinterpret_cast<jarray>(o78)));
1264 EXPECT_EQ(79, env->GetArrayLength(reinterpret_cast<jarray>(o79)));
1265 EXPECT_EQ(80, env->GetArrayLength(reinterpret_cast<jarray>(o80)));
1266 EXPECT_EQ(81, env->GetArrayLength(reinterpret_cast<jarray>(o81)));
1267 EXPECT_EQ(82, env->GetArrayLength(reinterpret_cast<jarray>(o82)));
1268 EXPECT_EQ(83, env->GetArrayLength(reinterpret_cast<jarray>(o83)));
1269 EXPECT_EQ(84, env->GetArrayLength(reinterpret_cast<jarray>(o84)));
1270 EXPECT_EQ(85, env->GetArrayLength(reinterpret_cast<jarray>(o85)));
1271 EXPECT_EQ(86, env->GetArrayLength(reinterpret_cast<jarray>(o86)));
1272 EXPECT_EQ(87, env->GetArrayLength(reinterpret_cast<jarray>(o87)));
1273 EXPECT_EQ(88, env->GetArrayLength(reinterpret_cast<jarray>(o88)));
1274 EXPECT_EQ(89, env->GetArrayLength(reinterpret_cast<jarray>(o89)));
1275 EXPECT_EQ(90, env->GetArrayLength(reinterpret_cast<jarray>(o90)));
1276 EXPECT_EQ(91, env->GetArrayLength(reinterpret_cast<jarray>(o91)));
1277 EXPECT_EQ(92, env->GetArrayLength(reinterpret_cast<jarray>(o92)));
1278 EXPECT_EQ(93, env->GetArrayLength(reinterpret_cast<jarray>(o93)));
1279 EXPECT_EQ(94, env->GetArrayLength(reinterpret_cast<jarray>(o94)));
1280 EXPECT_EQ(95, env->GetArrayLength(reinterpret_cast<jarray>(o95)));
1281 EXPECT_EQ(96, env->GetArrayLength(reinterpret_cast<jarray>(o96)));
1282 EXPECT_EQ(97, env->GetArrayLength(reinterpret_cast<jarray>(o97)));
1283 EXPECT_EQ(98, env->GetArrayLength(reinterpret_cast<jarray>(o98)));
1284 EXPECT_EQ(99, env->GetArrayLength(reinterpret_cast<jarray>(o99)));
1285 EXPECT_EQ(100, env->GetArrayLength(reinterpret_cast<jarray>(o100)));
1286 EXPECT_EQ(101, env->GetArrayLength(reinterpret_cast<jarray>(o101)));
1287 EXPECT_EQ(102, env->GetArrayLength(reinterpret_cast<jarray>(o102)));
1288 EXPECT_EQ(103, env->GetArrayLength(reinterpret_cast<jarray>(o103)));
1289 EXPECT_EQ(104, env->GetArrayLength(reinterpret_cast<jarray>(o104)));
1290 EXPECT_EQ(105, env->GetArrayLength(reinterpret_cast<jarray>(o105)));
1291 EXPECT_EQ(106, env->GetArrayLength(reinterpret_cast<jarray>(o106)));
1292 EXPECT_EQ(107, env->GetArrayLength(reinterpret_cast<jarray>(o107)));
1293 EXPECT_EQ(108, env->GetArrayLength(reinterpret_cast<jarray>(o108)));
1294 EXPECT_EQ(109, env->GetArrayLength(reinterpret_cast<jarray>(o109)));
1295 EXPECT_EQ(110, env->GetArrayLength(reinterpret_cast<jarray>(o110)));
1296 EXPECT_EQ(111, env->GetArrayLength(reinterpret_cast<jarray>(o111)));
1297 EXPECT_EQ(112, env->GetArrayLength(reinterpret_cast<jarray>(o112)));
1298 EXPECT_EQ(113, env->GetArrayLength(reinterpret_cast<jarray>(o113)));
1299 EXPECT_EQ(114, env->GetArrayLength(reinterpret_cast<jarray>(o114)));
1300 EXPECT_EQ(115, env->GetArrayLength(reinterpret_cast<jarray>(o115)));
1301 EXPECT_EQ(116, env->GetArrayLength(reinterpret_cast<jarray>(o116)));
1302 EXPECT_EQ(117, env->GetArrayLength(reinterpret_cast<jarray>(o117)));
1303 EXPECT_EQ(118, env->GetArrayLength(reinterpret_cast<jarray>(o118)));
1304 EXPECT_EQ(119, env->GetArrayLength(reinterpret_cast<jarray>(o119)));
1305 EXPECT_EQ(120, env->GetArrayLength(reinterpret_cast<jarray>(o120)));
1306 EXPECT_EQ(121, env->GetArrayLength(reinterpret_cast<jarray>(o121)));
1307 EXPECT_EQ(122, env->GetArrayLength(reinterpret_cast<jarray>(o122)));
1308 EXPECT_EQ(123, env->GetArrayLength(reinterpret_cast<jarray>(o123)));
1309 EXPECT_EQ(124, env->GetArrayLength(reinterpret_cast<jarray>(o124)));
1310 EXPECT_EQ(125, env->GetArrayLength(reinterpret_cast<jarray>(o125)));
1311 EXPECT_EQ(126, env->GetArrayLength(reinterpret_cast<jarray>(o126)));
1312 EXPECT_EQ(127, env->GetArrayLength(reinterpret_cast<jarray>(o127)));
1313 EXPECT_EQ(128, env->GetArrayLength(reinterpret_cast<jarray>(o128)));
1314 EXPECT_EQ(129, env->GetArrayLength(reinterpret_cast<jarray>(o129)));
1315 EXPECT_EQ(130, env->GetArrayLength(reinterpret_cast<jarray>(o130)));
1316 EXPECT_EQ(131, env->GetArrayLength(reinterpret_cast<jarray>(o131)));
1317 EXPECT_EQ(132, env->GetArrayLength(reinterpret_cast<jarray>(o132)));
1318 EXPECT_EQ(133, env->GetArrayLength(reinterpret_cast<jarray>(o133)));
1319 EXPECT_EQ(134, env->GetArrayLength(reinterpret_cast<jarray>(o134)));
1320 EXPECT_EQ(135, env->GetArrayLength(reinterpret_cast<jarray>(o135)));
1321 EXPECT_EQ(136, env->GetArrayLength(reinterpret_cast<jarray>(o136)));
1322 EXPECT_EQ(137, env->GetArrayLength(reinterpret_cast<jarray>(o137)));
1323 EXPECT_EQ(138, env->GetArrayLength(reinterpret_cast<jarray>(o138)));
1324 EXPECT_EQ(139, env->GetArrayLength(reinterpret_cast<jarray>(o139)));
1325 EXPECT_EQ(140, env->GetArrayLength(reinterpret_cast<jarray>(o140)));
1326 EXPECT_EQ(141, env->GetArrayLength(reinterpret_cast<jarray>(o141)));
1327 EXPECT_EQ(142, env->GetArrayLength(reinterpret_cast<jarray>(o142)));
1328 EXPECT_EQ(143, env->GetArrayLength(reinterpret_cast<jarray>(o143)));
1329 EXPECT_EQ(144, env->GetArrayLength(reinterpret_cast<jarray>(o144)));
1330 EXPECT_EQ(145, env->GetArrayLength(reinterpret_cast<jarray>(o145)));
1331 EXPECT_EQ(146, env->GetArrayLength(reinterpret_cast<jarray>(o146)));
1332 EXPECT_EQ(147, env->GetArrayLength(reinterpret_cast<jarray>(o147)));
1333 EXPECT_EQ(148, env->GetArrayLength(reinterpret_cast<jarray>(o148)));
1334 EXPECT_EQ(149, env->GetArrayLength(reinterpret_cast<jarray>(o149)));
1335 EXPECT_EQ(150, env->GetArrayLength(reinterpret_cast<jarray>(o150)));
1336 EXPECT_EQ(151, env->GetArrayLength(reinterpret_cast<jarray>(o151)));
1337 EXPECT_EQ(152, env->GetArrayLength(reinterpret_cast<jarray>(o152)));
1338 EXPECT_EQ(153, env->GetArrayLength(reinterpret_cast<jarray>(o153)));
1339 EXPECT_EQ(154, env->GetArrayLength(reinterpret_cast<jarray>(o154)));
1340 EXPECT_EQ(155, env->GetArrayLength(reinterpret_cast<jarray>(o155)));
1341 EXPECT_EQ(156, env->GetArrayLength(reinterpret_cast<jarray>(o156)));
1342 EXPECT_EQ(157, env->GetArrayLength(reinterpret_cast<jarray>(o157)));
1343 EXPECT_EQ(158, env->GetArrayLength(reinterpret_cast<jarray>(o158)));
1344 EXPECT_EQ(159, env->GetArrayLength(reinterpret_cast<jarray>(o159)));
1345 EXPECT_EQ(160, env->GetArrayLength(reinterpret_cast<jarray>(o160)));
1346 EXPECT_EQ(161, env->GetArrayLength(reinterpret_cast<jarray>(o161)));
1347 EXPECT_EQ(162, env->GetArrayLength(reinterpret_cast<jarray>(o162)));
1348 EXPECT_EQ(163, env->GetArrayLength(reinterpret_cast<jarray>(o163)));
1349 EXPECT_EQ(164, env->GetArrayLength(reinterpret_cast<jarray>(o164)));
1350 EXPECT_EQ(165, env->GetArrayLength(reinterpret_cast<jarray>(o165)));
1351 EXPECT_EQ(166, env->GetArrayLength(reinterpret_cast<jarray>(o166)));
1352 EXPECT_EQ(167, env->GetArrayLength(reinterpret_cast<jarray>(o167)));
1353 EXPECT_EQ(168, env->GetArrayLength(reinterpret_cast<jarray>(o168)));
1354 EXPECT_EQ(169, env->GetArrayLength(reinterpret_cast<jarray>(o169)));
1355 EXPECT_EQ(170, env->GetArrayLength(reinterpret_cast<jarray>(o170)));
1356 EXPECT_EQ(171, env->GetArrayLength(reinterpret_cast<jarray>(o171)));
1357 EXPECT_EQ(172, env->GetArrayLength(reinterpret_cast<jarray>(o172)));
1358 EXPECT_EQ(173, env->GetArrayLength(reinterpret_cast<jarray>(o173)));
1359 EXPECT_EQ(174, env->GetArrayLength(reinterpret_cast<jarray>(o174)));
1360 EXPECT_EQ(175, env->GetArrayLength(reinterpret_cast<jarray>(o175)));
1361 EXPECT_EQ(176, env->GetArrayLength(reinterpret_cast<jarray>(o176)));
1362 EXPECT_EQ(177, env->GetArrayLength(reinterpret_cast<jarray>(o177)));
1363 EXPECT_EQ(178, env->GetArrayLength(reinterpret_cast<jarray>(o178)));
1364 EXPECT_EQ(179, env->GetArrayLength(reinterpret_cast<jarray>(o179)));
1365 EXPECT_EQ(180, env->GetArrayLength(reinterpret_cast<jarray>(o180)));
1366 EXPECT_EQ(181, env->GetArrayLength(reinterpret_cast<jarray>(o181)));
1367 EXPECT_EQ(182, env->GetArrayLength(reinterpret_cast<jarray>(o182)));
1368 EXPECT_EQ(183, env->GetArrayLength(reinterpret_cast<jarray>(o183)));
1369 EXPECT_EQ(184, env->GetArrayLength(reinterpret_cast<jarray>(o184)));
1370 EXPECT_EQ(185, env->GetArrayLength(reinterpret_cast<jarray>(o185)));
1371 EXPECT_EQ(186, env->GetArrayLength(reinterpret_cast<jarray>(o186)));
1372 EXPECT_EQ(187, env->GetArrayLength(reinterpret_cast<jarray>(o187)));
1373 EXPECT_EQ(188, env->GetArrayLength(reinterpret_cast<jarray>(o188)));
1374 EXPECT_EQ(189, env->GetArrayLength(reinterpret_cast<jarray>(o189)));
1375 EXPECT_EQ(190, env->GetArrayLength(reinterpret_cast<jarray>(o190)));
1376 EXPECT_EQ(191, env->GetArrayLength(reinterpret_cast<jarray>(o191)));
1377 EXPECT_EQ(192, env->GetArrayLength(reinterpret_cast<jarray>(o192)));
1378 EXPECT_EQ(193, env->GetArrayLength(reinterpret_cast<jarray>(o193)));
1379 EXPECT_EQ(194, env->GetArrayLength(reinterpret_cast<jarray>(o194)));
1380 EXPECT_EQ(195, env->GetArrayLength(reinterpret_cast<jarray>(o195)));
1381 EXPECT_EQ(196, env->GetArrayLength(reinterpret_cast<jarray>(o196)));
1382 EXPECT_EQ(197, env->GetArrayLength(reinterpret_cast<jarray>(o197)));
1383 EXPECT_EQ(198, env->GetArrayLength(reinterpret_cast<jarray>(o198)));
1384 EXPECT_EQ(199, env->GetArrayLength(reinterpret_cast<jarray>(o199)));
1385 EXPECT_EQ(200, env->GetArrayLength(reinterpret_cast<jarray>(o200)));
1386 EXPECT_EQ(201, env->GetArrayLength(reinterpret_cast<jarray>(o201)));
1387 EXPECT_EQ(202, env->GetArrayLength(reinterpret_cast<jarray>(o202)));
1388 EXPECT_EQ(203, env->GetArrayLength(reinterpret_cast<jarray>(o203)));
1389 EXPECT_EQ(204, env->GetArrayLength(reinterpret_cast<jarray>(o204)));
1390 EXPECT_EQ(205, env->GetArrayLength(reinterpret_cast<jarray>(o205)));
1391 EXPECT_EQ(206, env->GetArrayLength(reinterpret_cast<jarray>(o206)));
1392 EXPECT_EQ(207, env->GetArrayLength(reinterpret_cast<jarray>(o207)));
1393 EXPECT_EQ(208, env->GetArrayLength(reinterpret_cast<jarray>(o208)));
1394 EXPECT_EQ(209, env->GetArrayLength(reinterpret_cast<jarray>(o209)));
1395 EXPECT_EQ(210, env->GetArrayLength(reinterpret_cast<jarray>(o210)));
1396 EXPECT_EQ(211, env->GetArrayLength(reinterpret_cast<jarray>(o211)));
1397 EXPECT_EQ(212, env->GetArrayLength(reinterpret_cast<jarray>(o212)));
1398 EXPECT_EQ(213, env->GetArrayLength(reinterpret_cast<jarray>(o213)));
1399 EXPECT_EQ(214, env->GetArrayLength(reinterpret_cast<jarray>(o214)));
1400 EXPECT_EQ(215, env->GetArrayLength(reinterpret_cast<jarray>(o215)));
1401 EXPECT_EQ(216, env->GetArrayLength(reinterpret_cast<jarray>(o216)));
1402 EXPECT_EQ(217, env->GetArrayLength(reinterpret_cast<jarray>(o217)));
1403 EXPECT_EQ(218, env->GetArrayLength(reinterpret_cast<jarray>(o218)));
1404 EXPECT_EQ(219, env->GetArrayLength(reinterpret_cast<jarray>(o219)));
1405 EXPECT_EQ(220, env->GetArrayLength(reinterpret_cast<jarray>(o220)));
1406 EXPECT_EQ(221, env->GetArrayLength(reinterpret_cast<jarray>(o221)));
1407 EXPECT_EQ(222, env->GetArrayLength(reinterpret_cast<jarray>(o222)));
1408 EXPECT_EQ(223, env->GetArrayLength(reinterpret_cast<jarray>(o223)));
1409 EXPECT_EQ(224, env->GetArrayLength(reinterpret_cast<jarray>(o224)));
1410 EXPECT_EQ(225, env->GetArrayLength(reinterpret_cast<jarray>(o225)));
1411 EXPECT_EQ(226, env->GetArrayLength(reinterpret_cast<jarray>(o226)));
1412 EXPECT_EQ(227, env->GetArrayLength(reinterpret_cast<jarray>(o227)));
1413 EXPECT_EQ(228, env->GetArrayLength(reinterpret_cast<jarray>(o228)));
1414 EXPECT_EQ(229, env->GetArrayLength(reinterpret_cast<jarray>(o229)));
1415 EXPECT_EQ(230, env->GetArrayLength(reinterpret_cast<jarray>(o230)));
1416 EXPECT_EQ(231, env->GetArrayLength(reinterpret_cast<jarray>(o231)));
1417 EXPECT_EQ(232, env->GetArrayLength(reinterpret_cast<jarray>(o232)));
1418 EXPECT_EQ(233, env->GetArrayLength(reinterpret_cast<jarray>(o233)));
1419 EXPECT_EQ(234, env->GetArrayLength(reinterpret_cast<jarray>(o234)));
1420 EXPECT_EQ(235, env->GetArrayLength(reinterpret_cast<jarray>(o235)));
1421 EXPECT_EQ(236, env->GetArrayLength(reinterpret_cast<jarray>(o236)));
1422 EXPECT_EQ(237, env->GetArrayLength(reinterpret_cast<jarray>(o237)));
1423 EXPECT_EQ(238, env->GetArrayLength(reinterpret_cast<jarray>(o238)));
1424 EXPECT_EQ(239, env->GetArrayLength(reinterpret_cast<jarray>(o239)));
1425 EXPECT_EQ(240, env->GetArrayLength(reinterpret_cast<jarray>(o240)));
1426 EXPECT_EQ(241, env->GetArrayLength(reinterpret_cast<jarray>(o241)));
1427 EXPECT_EQ(242, env->GetArrayLength(reinterpret_cast<jarray>(o242)));
1428 EXPECT_EQ(243, env->GetArrayLength(reinterpret_cast<jarray>(o243)));
1429 EXPECT_EQ(244, env->GetArrayLength(reinterpret_cast<jarray>(o244)));
1430 EXPECT_EQ(245, env->GetArrayLength(reinterpret_cast<jarray>(o245)));
1431 EXPECT_EQ(246, env->GetArrayLength(reinterpret_cast<jarray>(o246)));
1432 EXPECT_EQ(247, env->GetArrayLength(reinterpret_cast<jarray>(o247)));
1433 EXPECT_EQ(248, env->GetArrayLength(reinterpret_cast<jarray>(o248)));
1434 EXPECT_EQ(249, env->GetArrayLength(reinterpret_cast<jarray>(o249)));
1435 EXPECT_EQ(250, env->GetArrayLength(reinterpret_cast<jarray>(o250)));
1436 EXPECT_EQ(251, env->GetArrayLength(reinterpret_cast<jarray>(o251)));
1437 EXPECT_EQ(252, env->GetArrayLength(reinterpret_cast<jarray>(o252)));
1438 EXPECT_EQ(253, env->GetArrayLength(reinterpret_cast<jarray>(o253)));
1439 }
1440}
1441
1442const char* longSig =
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;Ljava/lang/Object;"
1492 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1493 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)V";
1494
Andreas Gampe38bd1e12014-08-18 16:43:12 -07001495void JniCompilerTest::MaxParamNumberImpl() {
Andreas Gampe7a0e5042014-03-07 13:03:19 -08001496 TEST_DISABLED_FOR_PORTABLE();
1497 SetUpForTest(false, "maxParamNumber", longSig,
1498 reinterpret_cast<void*>(&Java_MyClassNatives_maxParamNumber));
1499
1500 jvalue args[254];
1501
1502 // First test: test with all arguments null.
1503 for (int i = 0; i < 254; ++i) {
1504 args[i].l = nullptr;
1505 }
1506
1507 env_->CallNonvirtualVoidMethodA(jobj_, jklass_, jmethod_, args);
1508
1509 // Second test: test with int[] objects with increasing lengths
1510 for (int i = 0; i < 254; ++i) {
1511 jintArray tmp = env_->NewIntArray(i);
1512 args[i].l = tmp;
1513 EXPECT_NE(args[i].l, nullptr);
1514 }
1515
1516 env_->CallNonvirtualVoidMethodA(jobj_, jklass_, jmethod_, args);
1517}
1518
Andreas Gampe38bd1e12014-08-18 16:43:12 -07001519JNI_TEST(MaxParamNumber)
1520
1521void JniCompilerTest::WithoutImplementationImpl() {
Andreas Gampead615172014-04-04 16:20:13 -07001522 TEST_DISABLED_FOR_PORTABLE();
1523 SetUpForTest(false, "withoutImplementation", "()V", nullptr);
1524
1525 env_->CallVoidMethod(jobj_, jmethod_);
1526
1527 EXPECT_TRUE(Thread::Current()->IsExceptionPending());
1528 EXPECT_TRUE(env_->ExceptionCheck() == JNI_TRUE);
1529}
1530
Andreas Gampe38bd1e12014-08-18 16:43:12 -07001531JNI_TEST(WithoutImplementation)
1532
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001533void Java_MyClassNatives_stackArgsIntsFirst(JNIEnv* env, jclass klass, jint i1, jint i2, jint i3,
1534 jint i4, jint i5, jint i6, jint i7, jint i8, jint i9,
1535 jint i10, jfloat f1, jfloat f2, jfloat f3, jfloat f4,
1536 jfloat f5, jfloat f6, jfloat f7, jfloat f8, jfloat f9,
1537 jfloat f10) {
1538 EXPECT_EQ(i1, 1);
1539 EXPECT_EQ(i2, 2);
1540 EXPECT_EQ(i3, 3);
1541 EXPECT_EQ(i4, 4);
1542 EXPECT_EQ(i5, 5);
1543 EXPECT_EQ(i6, 6);
1544 EXPECT_EQ(i7, 7);
1545 EXPECT_EQ(i8, 8);
1546 EXPECT_EQ(i9, 9);
1547 EXPECT_EQ(i10, 10);
1548
Andreas Gampec200a4a2014-06-16 18:39:09 -07001549 jint i11 = bit_cast<jfloat, jint>(f1);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001550 EXPECT_EQ(i11, 11);
Andreas Gampec200a4a2014-06-16 18:39:09 -07001551 jint i12 = bit_cast<jfloat, jint>(f2);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001552 EXPECT_EQ(i12, 12);
Andreas Gampec200a4a2014-06-16 18:39:09 -07001553 jint i13 = bit_cast<jfloat, jint>(f3);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001554 EXPECT_EQ(i13, 13);
Andreas Gampec200a4a2014-06-16 18:39:09 -07001555 jint i14 = bit_cast<jfloat, jint>(f4);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001556 EXPECT_EQ(i14, 14);
Andreas Gampec200a4a2014-06-16 18:39:09 -07001557 jint i15 = bit_cast<jfloat, jint>(f5);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001558 EXPECT_EQ(i15, 15);
Andreas Gampec200a4a2014-06-16 18:39:09 -07001559 jint i16 = bit_cast<jfloat, jint>(f6);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001560 EXPECT_EQ(i16, 16);
Andreas Gampec200a4a2014-06-16 18:39:09 -07001561 jint i17 = bit_cast<jfloat, jint>(f7);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001562 EXPECT_EQ(i17, 17);
Andreas Gampec200a4a2014-06-16 18:39:09 -07001563 jint i18 = bit_cast<jfloat, jint>(f8);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001564 EXPECT_EQ(i18, 18);
Andreas Gampec200a4a2014-06-16 18:39:09 -07001565 jint i19 = bit_cast<jfloat, jint>(f9);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001566 EXPECT_EQ(i19, 19);
Andreas Gampec200a4a2014-06-16 18:39:09 -07001567 jint i20 = bit_cast<jfloat, jint>(f10);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001568 EXPECT_EQ(i20, 20);
1569}
1570
Andreas Gampe38bd1e12014-08-18 16:43:12 -07001571void JniCompilerTest::StackArgsIntsFirstImpl() {
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001572 TEST_DISABLED_FOR_PORTABLE();
1573 SetUpForTest(true, "stackArgsIntsFirst", "(IIIIIIIIIIFFFFFFFFFF)V",
1574 reinterpret_cast<void*>(&Java_MyClassNatives_stackArgsIntsFirst));
1575
1576 jint i1 = 1;
1577 jint i2 = 2;
1578 jint i3 = 3;
1579 jint i4 = 4;
1580 jint i5 = 5;
1581 jint i6 = 6;
1582 jint i7 = 7;
1583 jint i8 = 8;
1584 jint i9 = 9;
1585 jint i10 = 10;
1586
Andreas Gampec200a4a2014-06-16 18:39:09 -07001587 jfloat f1 = bit_cast<jint, jfloat>(11);
1588 jfloat f2 = bit_cast<jint, jfloat>(12);
1589 jfloat f3 = bit_cast<jint, jfloat>(13);
1590 jfloat f4 = bit_cast<jint, jfloat>(14);
1591 jfloat f5 = bit_cast<jint, jfloat>(15);
1592 jfloat f6 = bit_cast<jint, jfloat>(16);
1593 jfloat f7 = bit_cast<jint, jfloat>(17);
1594 jfloat f8 = bit_cast<jint, jfloat>(18);
1595 jfloat f9 = bit_cast<jint, jfloat>(19);
1596 jfloat f10 = bit_cast<jint, jfloat>(20);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001597
1598 env_->CallStaticVoidMethod(jklass_, jmethod_, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, f1, f2,
1599 f3, f4, f5, f6, f7, f8, f9, f10);
1600}
1601
Andreas Gampe38bd1e12014-08-18 16:43:12 -07001602JNI_TEST(StackArgsIntsFirst)
1603
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001604void Java_MyClassNatives_stackArgsFloatsFirst(JNIEnv* env, jclass klass, jfloat f1, jfloat f2,
1605 jfloat f3, jfloat f4, jfloat f5, jfloat f6, jfloat f7,
1606 jfloat f8, jfloat f9, jfloat f10, jint i1, jint i2,
1607 jint i3, jint i4, jint i5, jint i6, jint i7, jint i8,
1608 jint i9, jint i10) {
1609 EXPECT_EQ(i1, 1);
1610 EXPECT_EQ(i2, 2);
1611 EXPECT_EQ(i3, 3);
1612 EXPECT_EQ(i4, 4);
1613 EXPECT_EQ(i5, 5);
1614 EXPECT_EQ(i6, 6);
1615 EXPECT_EQ(i7, 7);
1616 EXPECT_EQ(i8, 8);
1617 EXPECT_EQ(i9, 9);
1618 EXPECT_EQ(i10, 10);
1619
Andreas Gampec200a4a2014-06-16 18:39:09 -07001620 jint i11 = bit_cast<jfloat, jint>(f1);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001621 EXPECT_EQ(i11, 11);
Andreas Gampec200a4a2014-06-16 18:39:09 -07001622 jint i12 = bit_cast<jfloat, jint>(f2);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001623 EXPECT_EQ(i12, 12);
Andreas Gampec200a4a2014-06-16 18:39:09 -07001624 jint i13 = bit_cast<jfloat, jint>(f3);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001625 EXPECT_EQ(i13, 13);
Andreas Gampec200a4a2014-06-16 18:39:09 -07001626 jint i14 = bit_cast<jfloat, jint>(f4);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001627 EXPECT_EQ(i14, 14);
Andreas Gampec200a4a2014-06-16 18:39:09 -07001628 jint i15 = bit_cast<jfloat, jint>(f5);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001629 EXPECT_EQ(i15, 15);
Andreas Gampec200a4a2014-06-16 18:39:09 -07001630 jint i16 = bit_cast<jfloat, jint>(f6);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001631 EXPECT_EQ(i16, 16);
Andreas Gampec200a4a2014-06-16 18:39:09 -07001632 jint i17 = bit_cast<jfloat, jint>(f7);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001633 EXPECT_EQ(i17, 17);
Andreas Gampec200a4a2014-06-16 18:39:09 -07001634 jint i18 = bit_cast<jfloat, jint>(f8);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001635 EXPECT_EQ(i18, 18);
Andreas Gampec200a4a2014-06-16 18:39:09 -07001636 jint i19 = bit_cast<jfloat, jint>(f9);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001637 EXPECT_EQ(i19, 19);
Andreas Gampec200a4a2014-06-16 18:39:09 -07001638 jint i20 = bit_cast<jfloat, jint>(f10);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001639 EXPECT_EQ(i20, 20);
1640}
1641
Andreas Gampe38bd1e12014-08-18 16:43:12 -07001642void JniCompilerTest::StackArgsFloatsFirstImpl() {
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001643 TEST_DISABLED_FOR_PORTABLE();
1644 SetUpForTest(true, "stackArgsFloatsFirst", "(FFFFFFFFFFIIIIIIIIII)V",
1645 reinterpret_cast<void*>(&Java_MyClassNatives_stackArgsFloatsFirst));
1646
1647 jint i1 = 1;
1648 jint i2 = 2;
1649 jint i3 = 3;
1650 jint i4 = 4;
1651 jint i5 = 5;
1652 jint i6 = 6;
1653 jint i7 = 7;
1654 jint i8 = 8;
1655 jint i9 = 9;
1656 jint i10 = 10;
1657
Andreas Gampec200a4a2014-06-16 18:39:09 -07001658 jfloat f1 = bit_cast<jint, jfloat>(11);
1659 jfloat f2 = bit_cast<jint, jfloat>(12);
1660 jfloat f3 = bit_cast<jint, jfloat>(13);
1661 jfloat f4 = bit_cast<jint, jfloat>(14);
1662 jfloat f5 = bit_cast<jint, jfloat>(15);
1663 jfloat f6 = bit_cast<jint, jfloat>(16);
1664 jfloat f7 = bit_cast<jint, jfloat>(17);
1665 jfloat f8 = bit_cast<jint, jfloat>(18);
1666 jfloat f9 = bit_cast<jint, jfloat>(19);
1667 jfloat f10 = bit_cast<jint, jfloat>(20);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001668
1669 env_->CallStaticVoidMethod(jklass_, jmethod_, f1, f2, f3, f4, f5, f6, f7, f8, f9, f10, i1, i2, i3,
1670 i4, i5, i6, i7, i8, i9, i10);
1671}
1672
Andreas Gampe38bd1e12014-08-18 16:43:12 -07001673JNI_TEST(StackArgsFloatsFirst)
1674
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001675void Java_MyClassNatives_stackArgsMixed(JNIEnv* env, jclass klass, jint i1, jfloat f1, jint i2,
1676 jfloat f2, jint i3, jfloat f3, jint i4, jfloat f4, jint i5,
1677 jfloat f5, jint i6, jfloat f6, jint i7, jfloat f7, jint i8,
1678 jfloat f8, jint i9, jfloat f9, jint i10, jfloat f10) {
1679 EXPECT_EQ(i1, 1);
1680 EXPECT_EQ(i2, 2);
1681 EXPECT_EQ(i3, 3);
1682 EXPECT_EQ(i4, 4);
1683 EXPECT_EQ(i5, 5);
1684 EXPECT_EQ(i6, 6);
1685 EXPECT_EQ(i7, 7);
1686 EXPECT_EQ(i8, 8);
1687 EXPECT_EQ(i9, 9);
1688 EXPECT_EQ(i10, 10);
1689
Andreas Gampec200a4a2014-06-16 18:39:09 -07001690 jint i11 = bit_cast<jfloat, jint>(f1);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001691 EXPECT_EQ(i11, 11);
Andreas Gampec200a4a2014-06-16 18:39:09 -07001692 jint i12 = bit_cast<jfloat, jint>(f2);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001693 EXPECT_EQ(i12, 12);
Andreas Gampec200a4a2014-06-16 18:39:09 -07001694 jint i13 = bit_cast<jfloat, jint>(f3);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001695 EXPECT_EQ(i13, 13);
Andreas Gampec200a4a2014-06-16 18:39:09 -07001696 jint i14 = bit_cast<jfloat, jint>(f4);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001697 EXPECT_EQ(i14, 14);
Andreas Gampec200a4a2014-06-16 18:39:09 -07001698 jint i15 = bit_cast<jfloat, jint>(f5);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001699 EXPECT_EQ(i15, 15);
Andreas Gampec200a4a2014-06-16 18:39:09 -07001700 jint i16 = bit_cast<jfloat, jint>(f6);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001701 EXPECT_EQ(i16, 16);
Andreas Gampec200a4a2014-06-16 18:39:09 -07001702 jint i17 = bit_cast<jfloat, jint>(f7);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001703 EXPECT_EQ(i17, 17);
Andreas Gampec200a4a2014-06-16 18:39:09 -07001704 jint i18 = bit_cast<jfloat, jint>(f8);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001705 EXPECT_EQ(i18, 18);
Andreas Gampec200a4a2014-06-16 18:39:09 -07001706 jint i19 = bit_cast<jfloat, jint>(f9);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001707 EXPECT_EQ(i19, 19);
Andreas Gampec200a4a2014-06-16 18:39:09 -07001708 jint i20 = bit_cast<jfloat, jint>(f10);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001709 EXPECT_EQ(i20, 20);
1710}
1711
Andreas Gampe38bd1e12014-08-18 16:43:12 -07001712void JniCompilerTest::StackArgsMixedImpl() {
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001713 TEST_DISABLED_FOR_PORTABLE();
1714 SetUpForTest(true, "stackArgsMixed", "(IFIFIFIFIFIFIFIFIFIF)V",
1715 reinterpret_cast<void*>(&Java_MyClassNatives_stackArgsMixed));
1716
1717 jint i1 = 1;
1718 jint i2 = 2;
1719 jint i3 = 3;
1720 jint i4 = 4;
1721 jint i5 = 5;
1722 jint i6 = 6;
1723 jint i7 = 7;
1724 jint i8 = 8;
1725 jint i9 = 9;
1726 jint i10 = 10;
1727
Andreas Gampec200a4a2014-06-16 18:39:09 -07001728 jfloat f1 = bit_cast<jint, jfloat>(11);
1729 jfloat f2 = bit_cast<jint, jfloat>(12);
1730 jfloat f3 = bit_cast<jint, jfloat>(13);
1731 jfloat f4 = bit_cast<jint, jfloat>(14);
1732 jfloat f5 = bit_cast<jint, jfloat>(15);
1733 jfloat f6 = bit_cast<jint, jfloat>(16);
1734 jfloat f7 = bit_cast<jint, jfloat>(17);
1735 jfloat f8 = bit_cast<jint, jfloat>(18);
1736 jfloat f9 = bit_cast<jint, jfloat>(19);
1737 jfloat f10 = bit_cast<jint, jfloat>(20);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001738
1739 env_->CallStaticVoidMethod(jklass_, jmethod_, i1, f1, i2, f2, i3, f3, i4, f4, i5, f5, i6, f6, i7,
1740 f7, i8, f8, i9, f9, i10, f10);
1741}
1742
Andreas Gampe38bd1e12014-08-18 16:43:12 -07001743JNI_TEST(StackArgsMixed)
1744
Ian Rogersb033c752011-07-20 12:22:35 -07001745} // namespace art