blob: 0fea2a7de737c6bbd6a569af1e1db382dba7d1a6 [file] [log] [blame]
Elliott Hughes2faa5f12012-01-30 14:42:07 -08001/*
2 * Copyright (C) 2011 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
Ian Rogersb033c752011-07-20 12:22:35 -070016
Ian Rogers700a4022014-05-19 16:49:03 -070017#include <memory>
18
Nicolas Geoffray54accbc2014-08-13 03:40:45 +010019#include <math.h>
20
Brian Carlstrom578bbdc2011-07-21 14:07:47 -070021#include "class_linker.h"
Brian Carlstroma1ce1fe2014-02-24 23:23:58 -080022#include "common_compiler_test.h"
Brian Carlstrom578bbdc2011-07-21 14:07:47 -070023#include "dex_file.h"
Elliott Hughes90a33692011-08-30 13:27:07 -070024#include "gtest/gtest.h"
Ian Rogerscdd1d2d2011-08-18 09:58:17 -070025#include "indirect_reference_table.h"
Ian Rogerscdd1d2d2011-08-18 09:58:17 -070026#include "jni_internal.h"
Brian Carlstromdb4d5402011-08-09 12:18:28 -070027#include "mem_map.h"
Brian Carlstromea46f952013-07-30 01:26:50 -070028#include "mirror/art_method-inl.h"
Ian Rogers4f6ad8a2013-03-18 15:27:28 -070029#include "mirror/class-inl.h"
Ian Rogers2dd0e2c2013-01-24 12:42:14 -080030#include "mirror/class_loader.h"
Ian Rogers2dd0e2c2013-01-24 12:42:14 -080031#include "mirror/object_array-inl.h"
Ian Rogers04d7aa92013-03-16 14:29:17 -070032#include "mirror/object-inl.h"
Ian Rogers2dd0e2c2013-01-24 12:42:14 -080033#include "mirror/stack_trace_element.h"
Brian Carlstrom578bbdc2011-07-21 14:07:47 -070034#include "runtime.h"
Ian Rogers00f7d0e2012-07-19 15:28:27 -070035#include "ScopedLocalRef.h"
36#include "scoped_thread_state_change.h"
Brian Carlstrom578bbdc2011-07-21 14:07:47 -070037#include "thread.h"
Ian Rogersb033c752011-07-20 12:22:35 -070038
Elliott Hughesb264f082012-04-06 17:10:10 -070039extern "C" JNIEXPORT jint JNICALL Java_MyClassNatives_bar(JNIEnv*, jobject, jint count) {
Brian Carlstromb9cc1ca2012-01-27 00:57:42 -080040 return count + 1;
41}
42
Elliott Hughesb264f082012-04-06 17:10:10 -070043extern "C" JNIEXPORT jint JNICALL Java_MyClassNatives_sbar(JNIEnv*, jclass, jint count) {
Ian Rogers1cefdbd2012-02-29 09:34:50 -080044 return count + 1;
45}
46
Ian Rogersb033c752011-07-20 12:22:35 -070047namespace art {
48
Brian Carlstroma1ce1fe2014-02-24 23:23:58 -080049class JniCompilerTest : public CommonCompilerTest {
Ian Rogersb033c752011-07-20 12:22:35 -070050 protected:
Andreas Gampe6e498692014-08-18 16:43:12 -070051 void SetUp() OVERRIDE {
52 CommonCompilerTest::SetUp();
53 check_generic_jni_ = false;
54 }
55
56 void SetCheckGenericJni(bool generic) {
57 check_generic_jni_ = generic;
58 }
59
Ian Rogers00f7d0e2012-07-19 15:28:27 -070060 void CompileForTest(jobject class_loader, bool direct,
Andreas Gampe6e498692014-08-18 16:43:12 -070061 const char* method_name, const char* method_sig) {
Ian Rogers00f7d0e2012-07-19 15:28:27 -070062 ScopedObjectAccess soa(Thread::Current());
Mathieu Chartiereb8167a2014-05-07 15:43:14 -070063 StackHandleScope<1> hs(soa.Self());
64 Handle<mirror::ClassLoader> loader(
65 hs.NewHandle(soa.Decode<mirror::ClassLoader*>(class_loader)));
Brian Carlstrom25c33252011-09-18 15:58:35 -070066 // Compile the native method before starting the runtime
Ian Rogers98379392014-02-24 16:53:16 -080067 mirror::Class* c = class_linker_->FindClass(soa.Self(), "LMyClassNatives;", loader);
Brian Carlstromea46f952013-07-30 01:26:50 -070068 mirror::ArtMethod* method;
Ian Rogerscdd1d2d2011-08-18 09:58:17 -070069 if (direct) {
buzbeec143c552011-08-20 17:38:58 -070070 method = c->FindDirectMethod(method_name, method_sig);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -070071 } else {
buzbeec143c552011-08-20 17:38:58 -070072 method = c->FindVirtualMethod(method_name, method_sig);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -070073 }
Andreas Gampecf4035a2014-05-28 22:43:01 -070074 ASSERT_TRUE(method != nullptr) << method_name << " " << method_sig;
Andreas Gampe6e498692014-08-18 16:43:12 -070075 if (check_generic_jni_) {
Ian Rogers6f3dbba2014-10-14 17:41:57 -070076 method->SetEntryPointFromQuickCompiledCode(class_linker_->GetRuntimeQuickGenericJniStub());
Nicolas Geoffray54accbc2014-08-13 03:40:45 +010077 } else {
Ian Rogers6f3dbba2014-10-14 17:41:57 -070078 const void* code = method->GetEntryPointFromQuickCompiledCode();
79 if (code == nullptr || class_linker_->IsQuickGenericJniStub(code)) {
Nicolas Geoffray54accbc2014-08-13 03:40:45 +010080 CompileMethod(method);
81 ASSERT_TRUE(method->GetEntryPointFromQuickCompiledCode() != nullptr)
82 << method_name << " " << method_sig;
83 ASSERT_TRUE(method->GetEntryPointFromPortableCompiledCode() != nullptr)
84 << method_name << " " << method_sig;
85 }
Brian Carlstrom25c33252011-09-18 15:58:35 -070086 }
Brian Carlstrom25c33252011-09-18 15:58:35 -070087 }
88
Ian Rogers00f7d0e2012-07-19 15:28:27 -070089 void SetUpForTest(bool direct, const char* method_name, const char* method_sig,
Andreas Gampe6e498692014-08-18 16:43:12 -070090 void* native_fnptr) {
Ian Rogers00f7d0e2012-07-19 15:28:27 -070091 // Initialize class loader and compile method when runtime not started.
Brian Carlstrom2ce745c2013-07-17 17:44:30 -070092 if (!runtime_->IsStarted()) {
Ian Rogers00f7d0e2012-07-19 15:28:27 -070093 {
94 ScopedObjectAccess soa(Thread::Current());
95 class_loader_ = LoadDex("MyClassNatives");
96 }
Andreas Gampe6e498692014-08-18 16:43:12 -070097 CompileForTest(class_loader_, direct, method_name, method_sig);
Ian Rogers00f7d0e2012-07-19 15:28:27 -070098 // Start runtime.
99 Thread::Current()->TransitionFromSuspendedToRunnable();
Brian Carlstrombd86bcc2013-03-10 20:26:16 -0700100 bool started = runtime_->Start();
101 CHECK(started);
Brian Carlstrom25c33252011-09-18 15:58:35 -0700102 }
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700103 // JNI operations after runtime start.
Brian Carlstrom25c33252011-09-18 15:58:35 -0700104 env_ = Thread::Current()->GetJniEnv();
Elliott Hughesb264f082012-04-06 17:10:10 -0700105 jklass_ = env_->FindClass("MyClassNatives");
Andreas Gampecf4035a2014-05-28 22:43:01 -0700106 ASSERT_TRUE(jklass_ != nullptr) << method_name << " " << method_sig;
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700107
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700108 if (direct) {
109 jmethod_ = env_->GetStaticMethodID(jklass_, method_name, method_sig);
110 } else {
111 jmethod_ = env_->GetMethodID(jklass_, method_name, method_sig);
112 }
Andreas Gampecf4035a2014-05-28 22:43:01 -0700113 ASSERT_TRUE(jmethod_ != nullptr) << method_name << " " << method_sig;
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700114
Andreas Gampecf4035a2014-05-28 22:43:01 -0700115 if (native_fnptr != nullptr) {
Elliott Hughesb25c3f62012-03-26 16:35:06 -0700116 JNINativeMethod methods[] = { { method_name, method_sig, native_fnptr } };
Brian Carlstromfc7120c2012-08-27 13:43:25 -0700117 ASSERT_EQ(JNI_OK, env_->RegisterNatives(jklass_, methods, 1))
118 << method_name << " " << method_sig;
Ian Rogersbdb03912011-09-14 00:55:44 -0700119 } else {
120 env_->UnregisterNatives(jklass_);
Shih-wei Liao31384c52011-09-06 15:27:45 -0700121 }
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700122
123 jmethodID constructor = env_->GetMethodID(jklass_, "<init>", "()V");
124 jobj_ = env_->NewObject(jklass_, constructor);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700125 ASSERT_TRUE(jobj_ != nullptr) << method_name << " " << method_sig;
Ian Rogersb033c752011-07-20 12:22:35 -0700126 }
127
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700128 public:
129 static jclass jklass_;
130 static jobject jobj_;
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700131 static jobject class_loader_;
132
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700133 protected:
Andreas Gampe6e498692014-08-18 16:43:12 -0700134 // We have to list the methods here so we can share them between default and generic JNI.
135 void CompileAndRunNoArgMethodImpl();
136 void CompileAndRunIntMethodThroughStubImpl();
137 void CompileAndRunStaticIntMethodThroughStubImpl();
138 void CompileAndRunIntMethodImpl();
139 void CompileAndRunIntIntMethodImpl();
140 void CompileAndRunLongLongMethodImpl();
141 void CompileAndRunDoubleDoubleMethodImpl();
142 void CompileAndRun_fooJJ_synchronizedImpl();
143 void CompileAndRunIntObjectObjectMethodImpl();
144 void CompileAndRunStaticIntIntMethodImpl();
145 void CompileAndRunStaticDoubleDoubleMethodImpl();
146 void RunStaticLogDoubleMethodImpl();
147 void RunStaticLogFloatMethodImpl();
148 void RunStaticReturnTrueImpl();
149 void RunStaticReturnFalseImpl();
150 void RunGenericStaticReturnIntImpl();
151 void CompileAndRunStaticIntObjectObjectMethodImpl();
152 void CompileAndRunStaticSynchronizedIntObjectObjectMethodImpl();
153 void ExceptionHandlingImpl();
154 void NativeStackTraceElementImpl();
155 void ReturnGlobalRefImpl();
156 void LocalReferenceTableClearingTestImpl();
157 void JavaLangSystemArrayCopyImpl();
158 void CompareAndSwapIntImpl();
159 void GetTextImpl();
160 void GetSinkPropertiesNativeImpl();
161 void UpcallReturnTypeChecking_InstanceImpl();
162 void UpcallReturnTypeChecking_StaticImpl();
163 void UpcallArgumentTypeChecking_InstanceImpl();
164 void UpcallArgumentTypeChecking_StaticImpl();
165 void CompileAndRunFloatFloatMethodImpl();
166 void CheckParameterAlignImpl();
167 void MaxParamNumberImpl();
168 void WithoutImplementationImpl();
169 void StackArgsIntsFirstImpl();
170 void StackArgsFloatsFirstImpl();
171 void StackArgsMixedImpl();
172
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700173 JNIEnv* env_;
174 jmethodID jmethod_;
Andreas Gampe6e498692014-08-18 16:43:12 -0700175 bool check_generic_jni_;
Ian Rogersb033c752011-07-20 12:22:35 -0700176};
177
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700178jclass JniCompilerTest::jklass_;
179jobject JniCompilerTest::jobj_;
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700180jobject JniCompilerTest::class_loader_;
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700181
Andreas Gampe6e498692014-08-18 16:43:12 -0700182#define JNI_TEST(TestName) \
183 TEST_F(JniCompilerTest, TestName ## Default) { \
184 TestName ## Impl(); \
185 } \
186 \
187 TEST_F(JniCompilerTest, TestName ## Generic) { \
188 TEST_DISABLED_FOR_MIPS(); \
189 SetCheckGenericJni(true); \
190 TestName ## Impl(); \
191 }
Andreas Gampecf4035a2014-05-28 22:43:01 -0700192
Elliott Hughesb264f082012-04-06 17:10:10 -0700193int gJava_MyClassNatives_foo_calls = 0;
194void Java_MyClassNatives_foo(JNIEnv* env, jobject thisObj) {
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700195 // 1 = thisObj
Ian Rogers50b35e22012-10-04 10:09:15 -0700196 EXPECT_EQ(kNative, Thread::Current()->GetState());
197 Locks::mutator_lock_->AssertNotHeld(Thread::Current());
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700198 EXPECT_EQ(Thread::Current()->GetJniEnv(), env);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700199 EXPECT_TRUE(thisObj != nullptr);
Ian Rogersa8cd9f42011-08-19 16:43:41 -0700200 EXPECT_TRUE(env->IsInstanceOf(thisObj, JniCompilerTest::jklass_));
Elliott Hughesb264f082012-04-06 17:10:10 -0700201 gJava_MyClassNatives_foo_calls++;
Ian Rogersef7d42f2014-01-06 12:55:46 -0800202 ScopedObjectAccess soa(Thread::Current());
203 EXPECT_EQ(1U, Thread::Current()->NumStackReferences());
Ian Rogersb033c752011-07-20 12:22:35 -0700204}
205
Andreas Gampe6e498692014-08-18 16:43:12 -0700206void JniCompilerTest::CompileAndRunNoArgMethodImpl() {
Brian Carlstrom265091e2013-01-30 14:08:26 -0800207 TEST_DISABLED_FOR_PORTABLE();
Ian Rogersef7d42f2014-01-06 12:55:46 -0800208 SetUpForTest(false, "foo", "()V", reinterpret_cast<void*>(&Java_MyClassNatives_foo));
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700209
Elliott Hughesb264f082012-04-06 17:10:10 -0700210 EXPECT_EQ(0, gJava_MyClassNatives_foo_calls);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700211 env_->CallNonvirtualVoidMethod(jobj_, jklass_, jmethod_);
Elliott Hughesb264f082012-04-06 17:10:10 -0700212 EXPECT_EQ(1, gJava_MyClassNatives_foo_calls);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700213 env_->CallNonvirtualVoidMethod(jobj_, jklass_, jmethod_);
Elliott Hughesb264f082012-04-06 17:10:10 -0700214 EXPECT_EQ(2, gJava_MyClassNatives_foo_calls);
Andreas Gampe6e498692014-08-18 16:43:12 -0700215
216 gJava_MyClassNatives_foo_calls = 0;
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700217}
218
Andreas Gampe6e498692014-08-18 16:43:12 -0700219JNI_TEST(CompileAndRunNoArgMethod)
220
221void JniCompilerTest::CompileAndRunIntMethodThroughStubImpl() {
Brian Carlstrom265091e2013-01-30 14:08:26 -0800222 TEST_DISABLED_FOR_PORTABLE();
Andreas Gampecf4035a2014-05-28 22:43:01 -0700223 SetUpForTest(false, "bar", "(I)I", nullptr);
224 // calling through stub will link with &Java_MyClassNatives_bar
Shih-wei Liao31384c52011-09-06 15:27:45 -0700225
Shih-wei Liao31384c52011-09-06 15:27:45 -0700226 std::string reason;
Ian Rogers68d8b422014-07-17 11:09:10 -0700227 ASSERT_TRUE(Runtime::Current()->GetJavaVM()->LoadNativeLibrary(env_, "", class_loader_, &reason))
228 << reason;
Shih-wei Liao31384c52011-09-06 15:27:45 -0700229
230 jint result = env_->CallNonvirtualIntMethod(jobj_, jklass_, jmethod_, 24);
231 EXPECT_EQ(25, result);
232}
233
Andreas Gampe6e498692014-08-18 16:43:12 -0700234JNI_TEST(CompileAndRunIntMethodThroughStub)
235
236void JniCompilerTest::CompileAndRunStaticIntMethodThroughStubImpl() {
Brian Carlstrom265091e2013-01-30 14:08:26 -0800237 TEST_DISABLED_FOR_PORTABLE();
Andreas Gampecf4035a2014-05-28 22:43:01 -0700238 SetUpForTest(true, "sbar", "(I)I", nullptr);
239 // calling through stub will link with &Java_MyClassNatives_sbar
Ian Rogers1cefdbd2012-02-29 09:34:50 -0800240
241 std::string reason;
Ian Rogers68d8b422014-07-17 11:09:10 -0700242 ASSERT_TRUE(Runtime::Current()->GetJavaVM()->LoadNativeLibrary(env_, "", class_loader_, &reason))
243 << reason;
Ian Rogers1cefdbd2012-02-29 09:34:50 -0800244
245 jint result = env_->CallStaticIntMethod(jklass_, jmethod_, 42);
246 EXPECT_EQ(43, result);
247}
248
Andreas Gampe6e498692014-08-18 16:43:12 -0700249JNI_TEST(CompileAndRunStaticIntMethodThroughStub)
250
Elliott Hughesb264f082012-04-06 17:10:10 -0700251int gJava_MyClassNatives_fooI_calls = 0;
252jint Java_MyClassNatives_fooI(JNIEnv* env, jobject thisObj, jint x) {
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700253 // 1 = thisObj
Ian Rogers50b35e22012-10-04 10:09:15 -0700254 EXPECT_EQ(kNative, Thread::Current()->GetState());
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700255 EXPECT_EQ(Thread::Current()->GetJniEnv(), env);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700256 EXPECT_TRUE(thisObj != nullptr);
Ian Rogersa8cd9f42011-08-19 16:43:41 -0700257 EXPECT_TRUE(env->IsInstanceOf(thisObj, JniCompilerTest::jklass_));
Elliott Hughesb264f082012-04-06 17:10:10 -0700258 gJava_MyClassNatives_fooI_calls++;
Ian Rogersef7d42f2014-01-06 12:55:46 -0800259 ScopedObjectAccess soa(Thread::Current());
260 EXPECT_EQ(1U, Thread::Current()->NumStackReferences());
Ian Rogersb033c752011-07-20 12:22:35 -0700261 return x;
262}
263
Andreas Gampe6e498692014-08-18 16:43:12 -0700264void JniCompilerTest::CompileAndRunIntMethodImpl() {
Brian Carlstrom265091e2013-01-30 14:08:26 -0800265 TEST_DISABLED_FOR_PORTABLE();
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700266 SetUpForTest(false, "fooI", "(I)I",
Elliott Hughesb264f082012-04-06 17:10:10 -0700267 reinterpret_cast<void*>(&Java_MyClassNatives_fooI));
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700268
Elliott Hughesb264f082012-04-06 17:10:10 -0700269 EXPECT_EQ(0, gJava_MyClassNatives_fooI_calls);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700270 jint result = env_->CallNonvirtualIntMethod(jobj_, jklass_, jmethod_, 42);
271 EXPECT_EQ(42, result);
Elliott Hughesb264f082012-04-06 17:10:10 -0700272 EXPECT_EQ(1, gJava_MyClassNatives_fooI_calls);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700273 result = env_->CallNonvirtualIntMethod(jobj_, jklass_, jmethod_, 0xCAFED00D);
274 EXPECT_EQ(static_cast<jint>(0xCAFED00D), result);
Elliott Hughesb264f082012-04-06 17:10:10 -0700275 EXPECT_EQ(2, gJava_MyClassNatives_fooI_calls);
Andreas Gampe6e498692014-08-18 16:43:12 -0700276
277 gJava_MyClassNatives_fooI_calls = 0;
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700278}
279
Andreas Gampe6e498692014-08-18 16:43:12 -0700280JNI_TEST(CompileAndRunIntMethod)
281
Elliott Hughesb264f082012-04-06 17:10:10 -0700282int gJava_MyClassNatives_fooII_calls = 0;
283jint Java_MyClassNatives_fooII(JNIEnv* env, jobject thisObj, jint x, jint y) {
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700284 // 1 = thisObj
Ian Rogers50b35e22012-10-04 10:09:15 -0700285 EXPECT_EQ(kNative, Thread::Current()->GetState());
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700286 EXPECT_EQ(Thread::Current()->GetJniEnv(), env);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700287 EXPECT_TRUE(thisObj != nullptr);
Ian Rogersa8cd9f42011-08-19 16:43:41 -0700288 EXPECT_TRUE(env->IsInstanceOf(thisObj, JniCompilerTest::jklass_));
Elliott Hughesb264f082012-04-06 17:10:10 -0700289 gJava_MyClassNatives_fooII_calls++;
Ian Rogersef7d42f2014-01-06 12:55:46 -0800290 ScopedObjectAccess soa(Thread::Current());
291 EXPECT_EQ(1U, Thread::Current()->NumStackReferences());
Ian Rogersb033c752011-07-20 12:22:35 -0700292 return x - y; // non-commutative operator
293}
294
Andreas Gampe6e498692014-08-18 16:43:12 -0700295void JniCompilerTest::CompileAndRunIntIntMethodImpl() {
Brian Carlstrom265091e2013-01-30 14:08:26 -0800296 TEST_DISABLED_FOR_PORTABLE();
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700297 SetUpForTest(false, "fooII", "(II)I",
Elliott Hughesb264f082012-04-06 17:10:10 -0700298 reinterpret_cast<void*>(&Java_MyClassNatives_fooII));
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700299
Elliott Hughesb264f082012-04-06 17:10:10 -0700300 EXPECT_EQ(0, gJava_MyClassNatives_fooII_calls);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700301 jint result = env_->CallNonvirtualIntMethod(jobj_, jklass_, jmethod_, 99, 10);
302 EXPECT_EQ(99 - 10, result);
Elliott Hughesb264f082012-04-06 17:10:10 -0700303 EXPECT_EQ(1, gJava_MyClassNatives_fooII_calls);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700304 result = env_->CallNonvirtualIntMethod(jobj_, jklass_, jmethod_, 0xCAFEBABE,
305 0xCAFED00D);
306 EXPECT_EQ(static_cast<jint>(0xCAFEBABE - 0xCAFED00D), result);
Elliott Hughesb264f082012-04-06 17:10:10 -0700307 EXPECT_EQ(2, gJava_MyClassNatives_fooII_calls);
Andreas Gampe6e498692014-08-18 16:43:12 -0700308
309 gJava_MyClassNatives_fooII_calls = 0;
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700310}
311
Andreas Gampe6e498692014-08-18 16:43:12 -0700312JNI_TEST(CompileAndRunIntIntMethod)
313
Elliott Hughesb264f082012-04-06 17:10:10 -0700314int gJava_MyClassNatives_fooJJ_calls = 0;
315jlong Java_MyClassNatives_fooJJ(JNIEnv* env, jobject thisObj, jlong x, jlong y) {
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700316 // 1 = thisObj
Ian Rogers50b35e22012-10-04 10:09:15 -0700317 EXPECT_EQ(kNative, Thread::Current()->GetState());
Ian Rogers9b269d22011-09-04 14:06:05 -0700318 EXPECT_EQ(Thread::Current()->GetJniEnv(), env);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700319 EXPECT_TRUE(thisObj != nullptr);
Ian Rogers9b269d22011-09-04 14:06:05 -0700320 EXPECT_TRUE(env->IsInstanceOf(thisObj, JniCompilerTest::jklass_));
Elliott Hughesb264f082012-04-06 17:10:10 -0700321 gJava_MyClassNatives_fooJJ_calls++;
Ian Rogersef7d42f2014-01-06 12:55:46 -0800322 ScopedObjectAccess soa(Thread::Current());
323 EXPECT_EQ(1U, Thread::Current()->NumStackReferences());
Ian Rogers9b269d22011-09-04 14:06:05 -0700324 return x - y; // non-commutative operator
325}
326
Andreas Gampe6e498692014-08-18 16:43:12 -0700327void JniCompilerTest::CompileAndRunLongLongMethodImpl() {
Brian Carlstrom265091e2013-01-30 14:08:26 -0800328 TEST_DISABLED_FOR_PORTABLE();
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700329 SetUpForTest(false, "fooJJ", "(JJ)J",
Elliott Hughesb264f082012-04-06 17:10:10 -0700330 reinterpret_cast<void*>(&Java_MyClassNatives_fooJJ));
Ian Rogers9b269d22011-09-04 14:06:05 -0700331
Elliott Hughesb264f082012-04-06 17:10:10 -0700332 EXPECT_EQ(0, gJava_MyClassNatives_fooJJ_calls);
Ian Rogers0f678472014-03-10 16:18:37 -0700333 jlong a = INT64_C(0x1234567890ABCDEF);
334 jlong b = INT64_C(0xFEDCBA0987654321);
Ian Rogers9b269d22011-09-04 14:06:05 -0700335 jlong result = env_->CallNonvirtualLongMethod(jobj_, jklass_, jmethod_, a, b);
336 EXPECT_EQ(a - b, result);
Elliott Hughesb264f082012-04-06 17:10:10 -0700337 EXPECT_EQ(1, gJava_MyClassNatives_fooJJ_calls);
Ian Rogers9b269d22011-09-04 14:06:05 -0700338 result = env_->CallNonvirtualLongMethod(jobj_, jklass_, jmethod_, b, a);
339 EXPECT_EQ(b - a, result);
Elliott Hughesb264f082012-04-06 17:10:10 -0700340 EXPECT_EQ(2, gJava_MyClassNatives_fooJJ_calls);
Andreas Gampe6e498692014-08-18 16:43:12 -0700341
342 gJava_MyClassNatives_fooJJ_calls = 0;
Ian Rogers9b269d22011-09-04 14:06:05 -0700343}
344
Andreas Gampe6e498692014-08-18 16:43:12 -0700345JNI_TEST(CompileAndRunLongLongMethod)
346
Elliott Hughesb264f082012-04-06 17:10:10 -0700347int gJava_MyClassNatives_fooDD_calls = 0;
348jdouble Java_MyClassNatives_fooDD(JNIEnv* env, jobject thisObj, jdouble x, jdouble y) {
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700349 // 1 = thisObj
Ian Rogers50b35e22012-10-04 10:09:15 -0700350 EXPECT_EQ(kNative, Thread::Current()->GetState());
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700351 EXPECT_EQ(Thread::Current()->GetJniEnv(), env);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700352 EXPECT_TRUE(thisObj != nullptr);
Ian Rogersa8cd9f42011-08-19 16:43:41 -0700353 EXPECT_TRUE(env->IsInstanceOf(thisObj, JniCompilerTest::jklass_));
Elliott Hughesb264f082012-04-06 17:10:10 -0700354 gJava_MyClassNatives_fooDD_calls++;
Ian Rogersef7d42f2014-01-06 12:55:46 -0800355 ScopedObjectAccess soa(Thread::Current());
356 EXPECT_EQ(1U, Thread::Current()->NumStackReferences());
Ian Rogersb033c752011-07-20 12:22:35 -0700357 return x - y; // non-commutative operator
358}
359
Andreas Gampe6e498692014-08-18 16:43:12 -0700360void JniCompilerTest::CompileAndRunDoubleDoubleMethodImpl() {
Brian Carlstrom265091e2013-01-30 14:08:26 -0800361 TEST_DISABLED_FOR_PORTABLE();
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700362 SetUpForTest(false, "fooDD", "(DD)D",
Elliott Hughesb264f082012-04-06 17:10:10 -0700363 reinterpret_cast<void*>(&Java_MyClassNatives_fooDD));
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700364
Elliott Hughesb264f082012-04-06 17:10:10 -0700365 EXPECT_EQ(0, gJava_MyClassNatives_fooDD_calls);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700366 jdouble result = env_->CallNonvirtualDoubleMethod(jobj_, jklass_, jmethod_,
367 99.0, 10.0);
Ian Rogers647b1a82014-10-10 11:02:11 -0700368 EXPECT_DOUBLE_EQ(99.0 - 10.0, result);
Elliott Hughesb264f082012-04-06 17:10:10 -0700369 EXPECT_EQ(1, gJava_MyClassNatives_fooDD_calls);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700370 jdouble a = 3.14159265358979323846;
371 jdouble b = 0.69314718055994530942;
372 result = env_->CallNonvirtualDoubleMethod(jobj_, jklass_, jmethod_, a, b);
Ian Rogers647b1a82014-10-10 11:02:11 -0700373 EXPECT_DOUBLE_EQ(a - b, result);
Elliott Hughesb264f082012-04-06 17:10:10 -0700374 EXPECT_EQ(2, gJava_MyClassNatives_fooDD_calls);
Andreas Gampe6e498692014-08-18 16:43:12 -0700375
376 gJava_MyClassNatives_fooDD_calls = 0;
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700377}
378
Elliott Hughes3e778f72012-05-21 15:29:52 -0700379int gJava_MyClassNatives_fooJJ_synchronized_calls = 0;
380jlong Java_MyClassNatives_fooJJ_synchronized(JNIEnv* env, jobject thisObj, jlong x, jlong y) {
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700381 // 1 = thisObj
Ian Rogers50b35e22012-10-04 10:09:15 -0700382 EXPECT_EQ(kNative, Thread::Current()->GetState());
Elliott Hughes3e778f72012-05-21 15:29:52 -0700383 EXPECT_EQ(Thread::Current()->GetJniEnv(), env);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700384 EXPECT_TRUE(thisObj != nullptr);
Elliott Hughes3e778f72012-05-21 15:29:52 -0700385 EXPECT_TRUE(env->IsInstanceOf(thisObj, JniCompilerTest::jklass_));
386 gJava_MyClassNatives_fooJJ_synchronized_calls++;
Ian Rogersef7d42f2014-01-06 12:55:46 -0800387 ScopedObjectAccess soa(Thread::Current());
388 EXPECT_EQ(1U, Thread::Current()->NumStackReferences());
Elliott Hughes3e778f72012-05-21 15:29:52 -0700389 return x | y;
390}
391
Andreas Gampe6e498692014-08-18 16:43:12 -0700392void JniCompilerTest::CompileAndRun_fooJJ_synchronizedImpl() {
Brian Carlstrom265091e2013-01-30 14:08:26 -0800393 TEST_DISABLED_FOR_PORTABLE();
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700394 SetUpForTest(false, "fooJJ_synchronized", "(JJ)J",
Elliott Hughes3e778f72012-05-21 15:29:52 -0700395 reinterpret_cast<void*>(&Java_MyClassNatives_fooJJ_synchronized));
396
397 EXPECT_EQ(0, gJava_MyClassNatives_fooJJ_synchronized_calls);
398 jlong a = 0x1000000020000000ULL;
399 jlong b = 0x00ff000000aa0000ULL;
400 jlong result = env_->CallNonvirtualLongMethod(jobj_, jklass_, jmethod_, a, b);
401 EXPECT_EQ(a | b, result);
402 EXPECT_EQ(1, gJava_MyClassNatives_fooJJ_synchronized_calls);
Andreas Gampe6e498692014-08-18 16:43:12 -0700403
404 gJava_MyClassNatives_fooJJ_synchronized_calls = 0;
Elliott Hughes3e778f72012-05-21 15:29:52 -0700405}
406
Andreas Gampe6e498692014-08-18 16:43:12 -0700407JNI_TEST(CompileAndRun_fooJJ_synchronized)
408
Elliott Hughesb264f082012-04-06 17:10:10 -0700409int gJava_MyClassNatives_fooIOO_calls = 0;
410jobject Java_MyClassNatives_fooIOO(JNIEnv* env, jobject thisObj, jint x, jobject y,
Ian Rogersb033c752011-07-20 12:22:35 -0700411 jobject z) {
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700412 // 3 = this + y + z
Ian Rogers50b35e22012-10-04 10:09:15 -0700413 EXPECT_EQ(kNative, Thread::Current()->GetState());
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700414 EXPECT_EQ(Thread::Current()->GetJniEnv(), env);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700415 EXPECT_TRUE(thisObj != nullptr);
Ian Rogersa8cd9f42011-08-19 16:43:41 -0700416 EXPECT_TRUE(env->IsInstanceOf(thisObj, JniCompilerTest::jklass_));
Elliott Hughesb264f082012-04-06 17:10:10 -0700417 gJava_MyClassNatives_fooIOO_calls++;
Ian Rogersef7d42f2014-01-06 12:55:46 -0800418 ScopedObjectAccess soa(Thread::Current());
Andreas Gampebf6b92a2014-03-05 16:11:04 -0800419 size_t null_args = (y == nullptr ? 1 : 0) + (z == nullptr ? 1 : 0);
420 EXPECT_TRUE(3U == Thread::Current()->NumStackReferences() ||
421 (3U - null_args) == Thread::Current()->NumStackReferences());
Ian Rogersb033c752011-07-20 12:22:35 -0700422 switch (x) {
423 case 1:
424 return y;
425 case 2:
426 return z;
427 default:
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700428 return thisObj;
Ian Rogersb033c752011-07-20 12:22:35 -0700429 }
430}
431
Andreas Gampe6e498692014-08-18 16:43:12 -0700432void JniCompilerTest::CompileAndRunIntObjectObjectMethodImpl() {
Brian Carlstrom265091e2013-01-30 14:08:26 -0800433 TEST_DISABLED_FOR_PORTABLE();
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700434 SetUpForTest(false, "fooIOO",
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700435 "(ILjava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;",
Elliott Hughesb264f082012-04-06 17:10:10 -0700436 reinterpret_cast<void*>(&Java_MyClassNatives_fooIOO));
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700437
Elliott Hughesb264f082012-04-06 17:10:10 -0700438 EXPECT_EQ(0, gJava_MyClassNatives_fooIOO_calls);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700439 jobject result = env_->CallNonvirtualObjectMethod(jobj_, jklass_, jmethod_, 0, nullptr, nullptr);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700440 EXPECT_TRUE(env_->IsSameObject(jobj_, result));
Elliott Hughesb264f082012-04-06 17:10:10 -0700441 EXPECT_EQ(1, gJava_MyClassNatives_fooIOO_calls);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700442
Andreas Gampecf4035a2014-05-28 22:43:01 -0700443 result = env_->CallNonvirtualObjectMethod(jobj_, jklass_, jmethod_, 0, nullptr, jklass_);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700444 EXPECT_TRUE(env_->IsSameObject(jobj_, result));
Elliott Hughesb264f082012-04-06 17:10:10 -0700445 EXPECT_EQ(2, gJava_MyClassNatives_fooIOO_calls);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700446 result = env_->CallNonvirtualObjectMethod(jobj_, jklass_, jmethod_, 1, nullptr, jklass_);
447 EXPECT_TRUE(env_->IsSameObject(nullptr, result));
Elliott Hughesb264f082012-04-06 17:10:10 -0700448 EXPECT_EQ(3, gJava_MyClassNatives_fooIOO_calls);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700449 result = env_->CallNonvirtualObjectMethod(jobj_, jklass_, jmethod_, 2, nullptr, jklass_);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700450 EXPECT_TRUE(env_->IsSameObject(jklass_, result));
Elliott Hughesb264f082012-04-06 17:10:10 -0700451 EXPECT_EQ(4, 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, jklass_, nullptr);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700454 EXPECT_TRUE(env_->IsSameObject(jobj_, result));
Elliott Hughesb264f082012-04-06 17:10:10 -0700455 EXPECT_EQ(5, gJava_MyClassNatives_fooIOO_calls);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700456 result = env_->CallNonvirtualObjectMethod(jobj_, jklass_, jmethod_, 1, jklass_, nullptr);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700457 EXPECT_TRUE(env_->IsSameObject(jklass_, result));
Elliott Hughesb264f082012-04-06 17:10:10 -0700458 EXPECT_EQ(6, gJava_MyClassNatives_fooIOO_calls);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700459 result = env_->CallNonvirtualObjectMethod(jobj_, jklass_, jmethod_, 2, jklass_, nullptr);
460 EXPECT_TRUE(env_->IsSameObject(nullptr, result));
Elliott Hughesb264f082012-04-06 17:10:10 -0700461 EXPECT_EQ(7, gJava_MyClassNatives_fooIOO_calls);
Andreas Gampe6e498692014-08-18 16:43:12 -0700462
463 gJava_MyClassNatives_fooIOO_calls = 0;
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700464}
465
Andreas Gampe6e498692014-08-18 16:43:12 -0700466JNI_TEST(CompileAndRunIntObjectObjectMethod)
467
Elliott Hughesb264f082012-04-06 17:10:10 -0700468int gJava_MyClassNatives_fooSII_calls = 0;
469jint Java_MyClassNatives_fooSII(JNIEnv* env, jclass klass, jint x, jint y) {
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700470 // 1 = klass
Ian Rogers50b35e22012-10-04 10:09:15 -0700471 EXPECT_EQ(kNative, Thread::Current()->GetState());
Shih-wei Liao82da44b2011-09-01 00:38:04 -0700472 EXPECT_EQ(Thread::Current()->GetJniEnv(), env);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700473 EXPECT_TRUE(klass != nullptr);
Shih-wei Liao82da44b2011-09-01 00:38:04 -0700474 EXPECT_TRUE(env->IsInstanceOf(JniCompilerTest::jobj_, klass));
Elliott Hughesb264f082012-04-06 17:10:10 -0700475 gJava_MyClassNatives_fooSII_calls++;
Ian Rogersef7d42f2014-01-06 12:55:46 -0800476 ScopedObjectAccess soa(Thread::Current());
477 EXPECT_EQ(1U, Thread::Current()->NumStackReferences());
Shih-wei Liao82da44b2011-09-01 00:38:04 -0700478 return x + y;
479}
480
Andreas Gampe6e498692014-08-18 16:43:12 -0700481void JniCompilerTest::CompileAndRunStaticIntIntMethodImpl() {
Brian Carlstrom265091e2013-01-30 14:08:26 -0800482 TEST_DISABLED_FOR_PORTABLE();
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700483 SetUpForTest(true, "fooSII", "(II)I",
Elliott Hughesb264f082012-04-06 17:10:10 -0700484 reinterpret_cast<void*>(&Java_MyClassNatives_fooSII));
Shih-wei Liao82da44b2011-09-01 00:38:04 -0700485
Elliott Hughesb264f082012-04-06 17:10:10 -0700486 EXPECT_EQ(0, gJava_MyClassNatives_fooSII_calls);
Shih-wei Liao82da44b2011-09-01 00:38:04 -0700487 jint result = env_->CallStaticIntMethod(jklass_, jmethod_, 20, 30);
488 EXPECT_EQ(50, result);
Elliott Hughesb264f082012-04-06 17:10:10 -0700489 EXPECT_EQ(1, gJava_MyClassNatives_fooSII_calls);
Andreas Gampe6e498692014-08-18 16:43:12 -0700490
491 gJava_MyClassNatives_fooSII_calls = 0;
Shih-wei Liao82da44b2011-09-01 00:38:04 -0700492}
493
Andreas Gampe6e498692014-08-18 16:43:12 -0700494JNI_TEST(CompileAndRunStaticIntIntMethod)
495
Elliott Hughesb264f082012-04-06 17:10:10 -0700496int gJava_MyClassNatives_fooSDD_calls = 0;
497jdouble Java_MyClassNatives_fooSDD(JNIEnv* env, jclass klass, jdouble x, jdouble y) {
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700498 // 1 = klass
Ian Rogers50b35e22012-10-04 10:09:15 -0700499 EXPECT_EQ(kNative, Thread::Current()->GetState());
Ian Rogers7a99c112011-09-07 12:48:27 -0700500 EXPECT_EQ(Thread::Current()->GetJniEnv(), env);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700501 EXPECT_TRUE(klass != nullptr);
Ian Rogers7a99c112011-09-07 12:48:27 -0700502 EXPECT_TRUE(env->IsInstanceOf(JniCompilerTest::jobj_, klass));
Elliott Hughesb264f082012-04-06 17:10:10 -0700503 gJava_MyClassNatives_fooSDD_calls++;
Ian Rogersef7d42f2014-01-06 12:55:46 -0800504 ScopedObjectAccess soa(Thread::Current());
505 EXPECT_EQ(1U, Thread::Current()->NumStackReferences());
Ian Rogers7a99c112011-09-07 12:48:27 -0700506 return x - y; // non-commutative operator
507}
508
Andreas Gampe6e498692014-08-18 16:43:12 -0700509void JniCompilerTest::CompileAndRunStaticDoubleDoubleMethodImpl() {
Brian Carlstrom265091e2013-01-30 14:08:26 -0800510 TEST_DISABLED_FOR_PORTABLE();
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700511 SetUpForTest(true, "fooSDD", "(DD)D",
Elliott Hughesb264f082012-04-06 17:10:10 -0700512 reinterpret_cast<void*>(&Java_MyClassNatives_fooSDD));
Ian Rogers7a99c112011-09-07 12:48:27 -0700513
Elliott Hughesb264f082012-04-06 17:10:10 -0700514 EXPECT_EQ(0, gJava_MyClassNatives_fooSDD_calls);
Ian Rogers7a99c112011-09-07 12:48:27 -0700515 jdouble result = env_->CallStaticDoubleMethod(jklass_, jmethod_, 99.0, 10.0);
Ian Rogers647b1a82014-10-10 11:02:11 -0700516 EXPECT_DOUBLE_EQ(99.0 - 10.0, result);
Elliott Hughesb264f082012-04-06 17:10:10 -0700517 EXPECT_EQ(1, gJava_MyClassNatives_fooSDD_calls);
Ian Rogers7a99c112011-09-07 12:48:27 -0700518 jdouble a = 3.14159265358979323846;
519 jdouble b = 0.69314718055994530942;
520 result = env_->CallStaticDoubleMethod(jklass_, jmethod_, a, b);
Ian Rogers647b1a82014-10-10 11:02:11 -0700521 EXPECT_DOUBLE_EQ(a - b, result);
522 EXPECT_DOUBLE_EQ(2, gJava_MyClassNatives_fooSDD_calls);
Andreas Gampe6e498692014-08-18 16:43:12 -0700523
524 gJava_MyClassNatives_fooSDD_calls = 0;
Ian Rogers7a99c112011-09-07 12:48:27 -0700525}
526
Andreas Gampe6e498692014-08-18 16:43:12 -0700527JNI_TEST(CompileAndRunStaticDoubleDoubleMethod)
528
Nicolas Geoffray54accbc2014-08-13 03:40:45 +0100529// The x86 generic JNI code had a bug where it assumed a floating
530// point return value would be in xmm0. We use log, to somehow ensure
531// the compiler will use the floating point stack.
532
533jdouble Java_MyClassNatives_logD(JNIEnv* env, jclass klass, jdouble x) {
534 return log(x);
535}
536
Andreas Gampe6e498692014-08-18 16:43:12 -0700537void JniCompilerTest::RunStaticLogDoubleMethodImpl() {
Nicolas Geoffray54accbc2014-08-13 03:40:45 +0100538 TEST_DISABLED_FOR_PORTABLE();
Andreas Gampe6e498692014-08-18 16:43:12 -0700539 SetUpForTest(true, "logD", "(D)D", reinterpret_cast<void*>(&Java_MyClassNatives_logD));
Nicolas Geoffray54accbc2014-08-13 03:40:45 +0100540
541 jdouble result = env_->CallStaticDoubleMethod(jklass_, jmethod_, 2.0);
Ian Rogers647b1a82014-10-10 11:02:11 -0700542 EXPECT_DOUBLE_EQ(log(2.0), result);
Nicolas Geoffray54accbc2014-08-13 03:40:45 +0100543}
544
Andreas Gampe6e498692014-08-18 16:43:12 -0700545JNI_TEST(RunStaticLogDoubleMethod)
546
Nicolas Geoffray54accbc2014-08-13 03:40:45 +0100547jfloat Java_MyClassNatives_logF(JNIEnv* env, jclass klass, jfloat x) {
548 return logf(x);
549}
550
Andreas Gampe6e498692014-08-18 16:43:12 -0700551void JniCompilerTest::RunStaticLogFloatMethodImpl() {
Nicolas Geoffray54accbc2014-08-13 03:40:45 +0100552 TEST_DISABLED_FOR_PORTABLE();
Andreas Gampe6e498692014-08-18 16:43:12 -0700553 SetUpForTest(true, "logF", "(F)F", reinterpret_cast<void*>(&Java_MyClassNatives_logF));
Nicolas Geoffray54accbc2014-08-13 03:40:45 +0100554
555 jfloat result = env_->CallStaticFloatMethod(jklass_, jmethod_, 2.0);
Ian Rogers647b1a82014-10-10 11:02:11 -0700556 EXPECT_FLOAT_EQ(logf(2.0), result);
Nicolas Geoffray54accbc2014-08-13 03:40:45 +0100557}
558
Andreas Gampe6e498692014-08-18 16:43:12 -0700559JNI_TEST(RunStaticLogFloatMethod)
560
Nicolas Geoffray54accbc2014-08-13 03:40:45 +0100561jboolean Java_MyClassNatives_returnTrue(JNIEnv* env, jclass klass) {
562 return JNI_TRUE;
563}
564
565jboolean Java_MyClassNatives_returnFalse(JNIEnv* env, jclass klass) {
566 return JNI_FALSE;
567}
568
569jint Java_MyClassNatives_returnInt(JNIEnv* env, jclass klass) {
570 return 42;
571}
572
Andreas Gampe6e498692014-08-18 16:43:12 -0700573void JniCompilerTest::RunStaticReturnTrueImpl() {
Nicolas Geoffray54accbc2014-08-13 03:40:45 +0100574 TEST_DISABLED_FOR_PORTABLE();
Andreas Gampe6e498692014-08-18 16:43:12 -0700575 SetUpForTest(true, "returnTrue", "()Z", reinterpret_cast<void*>(&Java_MyClassNatives_returnTrue));
Nicolas Geoffray54accbc2014-08-13 03:40:45 +0100576
577 jboolean result = env_->CallStaticBooleanMethod(jklass_, jmethod_);
578 EXPECT_TRUE(result);
579}
580
Andreas Gampe6e498692014-08-18 16:43:12 -0700581JNI_TEST(RunStaticReturnTrue)
582
583void JniCompilerTest::RunStaticReturnFalseImpl() {
Nicolas Geoffray54accbc2014-08-13 03:40:45 +0100584 TEST_DISABLED_FOR_PORTABLE();
Nicolas Geoffray54accbc2014-08-13 03:40:45 +0100585 SetUpForTest(true, "returnFalse", "()Z",
Andreas Gampe6e498692014-08-18 16:43:12 -0700586 reinterpret_cast<void*>(&Java_MyClassNatives_returnFalse));
Nicolas Geoffray54accbc2014-08-13 03:40:45 +0100587
588 jboolean result = env_->CallStaticBooleanMethod(jklass_, jmethod_);
589 EXPECT_FALSE(result);
590}
591
Andreas Gampe6e498692014-08-18 16:43:12 -0700592JNI_TEST(RunStaticReturnFalse)
593
594void JniCompilerTest::RunGenericStaticReturnIntImpl() {
Nicolas Geoffray54accbc2014-08-13 03:40:45 +0100595 TEST_DISABLED_FOR_PORTABLE();
Andreas Gampe6e498692014-08-18 16:43:12 -0700596 SetUpForTest(true, "returnInt", "()I", reinterpret_cast<void*>(&Java_MyClassNatives_returnInt));
Nicolas Geoffray54accbc2014-08-13 03:40:45 +0100597
598 jint result = env_->CallStaticIntMethod(jklass_, jmethod_);
599 EXPECT_EQ(42, result);
600}
601
Andreas Gampe6e498692014-08-18 16:43:12 -0700602JNI_TEST(RunGenericStaticReturnInt)
603
Elliott Hughesb264f082012-04-06 17:10:10 -0700604int gJava_MyClassNatives_fooSIOO_calls = 0;
605jobject Java_MyClassNatives_fooSIOO(JNIEnv* env, jclass klass, jint x, jobject y,
Ian Rogersb033c752011-07-20 12:22:35 -0700606 jobject z) {
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700607 // 3 = klass + y + z
Ian Rogers50b35e22012-10-04 10:09:15 -0700608 EXPECT_EQ(kNative, Thread::Current()->GetState());
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700609 EXPECT_EQ(Thread::Current()->GetJniEnv(), env);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700610 EXPECT_TRUE(klass != nullptr);
Ian Rogersa8cd9f42011-08-19 16:43:41 -0700611 EXPECT_TRUE(env->IsInstanceOf(JniCompilerTest::jobj_, klass));
Elliott Hughesb264f082012-04-06 17:10:10 -0700612 gJava_MyClassNatives_fooSIOO_calls++;
Ian Rogersef7d42f2014-01-06 12:55:46 -0800613 ScopedObjectAccess soa(Thread::Current());
Andreas Gampebf6b92a2014-03-05 16:11:04 -0800614 size_t null_args = (y == nullptr ? 1 : 0) + (z == nullptr ? 1 : 0);
615 EXPECT_TRUE(3U == Thread::Current()->NumStackReferences() ||
616 (3U - null_args) == Thread::Current()->NumStackReferences());
Ian Rogersb033c752011-07-20 12:22:35 -0700617 switch (x) {
618 case 1:
619 return y;
620 case 2:
621 return z;
622 default:
623 return klass;
624 }
625}
626
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700627
Andreas Gampe6e498692014-08-18 16:43:12 -0700628void JniCompilerTest::CompileAndRunStaticIntObjectObjectMethodImpl() {
Brian Carlstrom265091e2013-01-30 14:08:26 -0800629 TEST_DISABLED_FOR_PORTABLE();
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700630 SetUpForTest(true, "fooSIOO",
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700631 "(ILjava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;",
Elliott Hughesb264f082012-04-06 17:10:10 -0700632 reinterpret_cast<void*>(&Java_MyClassNatives_fooSIOO));
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700633
Elliott Hughesb264f082012-04-06 17:10:10 -0700634 EXPECT_EQ(0, gJava_MyClassNatives_fooSIOO_calls);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700635 jobject result = env_->CallStaticObjectMethod(jklass_, jmethod_, 0, nullptr, nullptr);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700636 EXPECT_TRUE(env_->IsSameObject(jklass_, result));
Elliott Hughesb264f082012-04-06 17:10:10 -0700637 EXPECT_EQ(1, gJava_MyClassNatives_fooSIOO_calls);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700638
Andreas Gampecf4035a2014-05-28 22:43:01 -0700639 result = env_->CallStaticObjectMethod(jklass_, jmethod_, 0, nullptr, jobj_);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700640 EXPECT_TRUE(env_->IsSameObject(jklass_, result));
Elliott Hughesb264f082012-04-06 17:10:10 -0700641 EXPECT_EQ(2, gJava_MyClassNatives_fooSIOO_calls);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700642 result = env_->CallStaticObjectMethod(jklass_, jmethod_, 1, nullptr, jobj_);
643 EXPECT_TRUE(env_->IsSameObject(nullptr, result));
Elliott Hughesb264f082012-04-06 17:10:10 -0700644 EXPECT_EQ(3, gJava_MyClassNatives_fooSIOO_calls);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700645 result = env_->CallStaticObjectMethod(jklass_, jmethod_, 2, nullptr, jobj_);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700646 EXPECT_TRUE(env_->IsSameObject(jobj_, result));
Elliott Hughesb264f082012-04-06 17:10:10 -0700647 EXPECT_EQ(4, 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, jobj_, nullptr);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700650 EXPECT_TRUE(env_->IsSameObject(jklass_, result));
Elliott Hughesb264f082012-04-06 17:10:10 -0700651 EXPECT_EQ(5, gJava_MyClassNatives_fooSIOO_calls);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700652 result = env_->CallStaticObjectMethod(jklass_, jmethod_, 1, jobj_, nullptr);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700653 EXPECT_TRUE(env_->IsSameObject(jobj_, result));
Elliott Hughesb264f082012-04-06 17:10:10 -0700654 EXPECT_EQ(6, gJava_MyClassNatives_fooSIOO_calls);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700655 result = env_->CallStaticObjectMethod(jklass_, jmethod_, 2, jobj_, nullptr);
656 EXPECT_TRUE(env_->IsSameObject(nullptr, result));
Elliott Hughesb264f082012-04-06 17:10:10 -0700657 EXPECT_EQ(7, gJava_MyClassNatives_fooSIOO_calls);
Andreas Gampe6e498692014-08-18 16:43:12 -0700658
659 gJava_MyClassNatives_fooSIOO_calls = 0;
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700660}
661
Andreas Gampe6e498692014-08-18 16:43:12 -0700662JNI_TEST(CompileAndRunStaticIntObjectObjectMethod)
663
Elliott Hughesb264f082012-04-06 17:10:10 -0700664int gJava_MyClassNatives_fooSSIOO_calls = 0;
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700665jobject Java_MyClassNatives_fooSSIOO(JNIEnv* env, jclass klass, jint x, jobject y, jobject z) {
666 // 3 = klass + y + z
Ian Rogers50b35e22012-10-04 10:09:15 -0700667 EXPECT_EQ(kNative, Thread::Current()->GetState());
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700668 EXPECT_EQ(Thread::Current()->GetJniEnv(), env);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700669 EXPECT_TRUE(klass != nullptr);
Ian Rogersa8cd9f42011-08-19 16:43:41 -0700670 EXPECT_TRUE(env->IsInstanceOf(JniCompilerTest::jobj_, klass));
Elliott Hughesb264f082012-04-06 17:10:10 -0700671 gJava_MyClassNatives_fooSSIOO_calls++;
Ian Rogersef7d42f2014-01-06 12:55:46 -0800672 ScopedObjectAccess soa(Thread::Current());
Andreas Gampebf6b92a2014-03-05 16:11:04 -0800673 size_t null_args = (y == nullptr ? 1 : 0) + (z == nullptr ? 1 : 0);
674 EXPECT_TRUE(3U == Thread::Current()->NumStackReferences() ||
675 (3U - null_args) == Thread::Current()->NumStackReferences());
Ian Rogersdf20fe02011-07-20 20:34:16 -0700676 switch (x) {
677 case 1:
678 return y;
679 case 2:
680 return z;
681 default:
682 return klass;
683 }
684}
685
Andreas Gampe6e498692014-08-18 16:43:12 -0700686void JniCompilerTest::CompileAndRunStaticSynchronizedIntObjectObjectMethodImpl() {
Brian Carlstrom265091e2013-01-30 14:08:26 -0800687 TEST_DISABLED_FOR_PORTABLE();
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700688 SetUpForTest(true, "fooSSIOO",
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700689 "(ILjava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;",
Elliott Hughesb264f082012-04-06 17:10:10 -0700690 reinterpret_cast<void*>(&Java_MyClassNatives_fooSSIOO));
Carl Shapiro419ec7b2011-08-03 14:48:33 -0700691
Elliott Hughesb264f082012-04-06 17:10:10 -0700692 EXPECT_EQ(0, gJava_MyClassNatives_fooSSIOO_calls);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700693 jobject result = env_->CallStaticObjectMethod(jklass_, jmethod_, 0, nullptr, nullptr);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700694 EXPECT_TRUE(env_->IsSameObject(jklass_, result));
Elliott Hughesb264f082012-04-06 17:10:10 -0700695 EXPECT_EQ(1, gJava_MyClassNatives_fooSSIOO_calls);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700696
Andreas Gampecf4035a2014-05-28 22:43:01 -0700697 result = env_->CallStaticObjectMethod(jklass_, jmethod_, 0, nullptr, jobj_);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700698 EXPECT_TRUE(env_->IsSameObject(jklass_, result));
Elliott Hughesb264f082012-04-06 17:10:10 -0700699 EXPECT_EQ(2, gJava_MyClassNatives_fooSSIOO_calls);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700700 result = env_->CallStaticObjectMethod(jklass_, jmethod_, 1, nullptr, jobj_);
701 EXPECT_TRUE(env_->IsSameObject(nullptr, result));
Elliott Hughesb264f082012-04-06 17:10:10 -0700702 EXPECT_EQ(3, gJava_MyClassNatives_fooSSIOO_calls);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700703 result = env_->CallStaticObjectMethod(jklass_, jmethod_, 2, nullptr, jobj_);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700704 EXPECT_TRUE(env_->IsSameObject(jobj_, result));
Elliott Hughesb264f082012-04-06 17:10:10 -0700705 EXPECT_EQ(4, 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, jobj_, nullptr);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700708 EXPECT_TRUE(env_->IsSameObject(jklass_, result));
Elliott Hughesb264f082012-04-06 17:10:10 -0700709 EXPECT_EQ(5, gJava_MyClassNatives_fooSSIOO_calls);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700710 result = env_->CallStaticObjectMethod(jklass_, jmethod_, 1, jobj_, nullptr);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700711 EXPECT_TRUE(env_->IsSameObject(jobj_, result));
Elliott Hughesb264f082012-04-06 17:10:10 -0700712 EXPECT_EQ(6, gJava_MyClassNatives_fooSSIOO_calls);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700713 result = env_->CallStaticObjectMethod(jklass_, jmethod_, 2, jobj_, nullptr);
714 EXPECT_TRUE(env_->IsSameObject(nullptr, result));
Elliott Hughesb264f082012-04-06 17:10:10 -0700715 EXPECT_EQ(7, gJava_MyClassNatives_fooSSIOO_calls);
Andreas Gampe6e498692014-08-18 16:43:12 -0700716
717 gJava_MyClassNatives_fooSSIOO_calls = 0;
Ian Rogersdf20fe02011-07-20 20:34:16 -0700718}
719
Andreas Gampe6e498692014-08-18 16:43:12 -0700720JNI_TEST(CompileAndRunStaticSynchronizedIntObjectObjectMethod)
721
Elliott Hughesb264f082012-04-06 17:10:10 -0700722void Java_MyClassNatives_throwException(JNIEnv* env, jobject) {
Elliott Hughesa2501992011-08-26 19:39:54 -0700723 jclass c = env->FindClass("java/lang/RuntimeException");
724 env->ThrowNew(c, "hello");
725}
Ian Rogers45a76cb2011-07-21 22:00:15 -0700726
Andreas Gampe6e498692014-08-18 16:43:12 -0700727void JniCompilerTest::ExceptionHandlingImpl() {
Brian Carlstrom265091e2013-01-30 14:08:26 -0800728 TEST_DISABLED_FOR_PORTABLE();
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700729 {
730 ASSERT_FALSE(runtime_->IsStarted());
731 ScopedObjectAccess soa(Thread::Current());
732 class_loader_ = LoadDex("MyClassNatives");
Brian Carlstrom40381fb2011-10-19 14:13:40 -0700733
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700734 // all compilation needs to happen before Runtime::Start
735 CompileForTest(class_loader_, false, "foo", "()V");
736 CompileForTest(class_loader_, false, "throwException", "()V");
737 CompileForTest(class_loader_, false, "foo", "()V");
738 }
739 // Start runtime to avoid re-initialization in SetupForTest.
740 Thread::Current()->TransitionFromSuspendedToRunnable();
Brian Carlstrombd86bcc2013-03-10 20:26:16 -0700741 bool started = runtime_->Start();
742 CHECK(started);
Brian Carlstrom25c33252011-09-18 15:58:35 -0700743
Elliott Hughesb264f082012-04-06 17:10:10 -0700744 gJava_MyClassNatives_foo_calls = 0;
Elliott Hughesa2501992011-08-26 19:39:54 -0700745
Ian Rogers67375ac2011-09-14 00:55:44 -0700746 // Check a single call of a JNI method is ok
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700747 SetUpForTest(false, "foo", "()V", reinterpret_cast<void*>(&Java_MyClassNatives_foo));
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700748 env_->CallNonvirtualVoidMethod(jobj_, jklass_, jmethod_);
Elliott Hughesb264f082012-04-06 17:10:10 -0700749 EXPECT_EQ(1, gJava_MyClassNatives_foo_calls);
Ian Rogers67375ac2011-09-14 00:55:44 -0700750 EXPECT_FALSE(Thread::Current()->IsExceptionPending());
Elliott Hughesa2501992011-08-26 19:39:54 -0700751
Ian Rogers67375ac2011-09-14 00:55:44 -0700752 // Get class for exception we expect to be thrown
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700753 ScopedLocalRef<jclass> jlre(env_, env_->FindClass("java/lang/RuntimeException"));
754 SetUpForTest(false, "throwException", "()V",
Elliott Hughesb264f082012-04-06 17:10:10 -0700755 reinterpret_cast<void*>(&Java_MyClassNatives_throwException));
756 // Call Java_MyClassNatives_throwException (JNI method that throws exception)
Elliott Hughesa2501992011-08-26 19:39:54 -0700757 env_->CallNonvirtualVoidMethod(jobj_, jklass_, jmethod_);
Elliott Hughesb264f082012-04-06 17:10:10 -0700758 EXPECT_EQ(1, gJava_MyClassNatives_foo_calls);
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700759 EXPECT_TRUE(env_->ExceptionCheck() == JNI_TRUE);
760 ScopedLocalRef<jthrowable> exception(env_, env_->ExceptionOccurred());
761 env_->ExceptionClear();
762 EXPECT_TRUE(env_->IsInstanceOf(exception.get(), jlre.get()));
Elliott Hughesa2501992011-08-26 19:39:54 -0700763
Ian Rogers67375ac2011-09-14 00:55:44 -0700764 // Check a single call of a JNI method is ok
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700765 SetUpForTest(false, "foo", "()V", reinterpret_cast<void*>(&Java_MyClassNatives_foo));
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700766 env_->CallNonvirtualVoidMethod(jobj_, jklass_, jmethod_);
Elliott Hughesb264f082012-04-06 17:10:10 -0700767 EXPECT_EQ(2, gJava_MyClassNatives_foo_calls);
Andreas Gampe6e498692014-08-18 16:43:12 -0700768
769 gJava_MyClassNatives_foo_calls = 0;
Ian Rogers45a76cb2011-07-21 22:00:15 -0700770}
771
Andreas Gampe6e498692014-08-18 16:43:12 -0700772JNI_TEST(ExceptionHandling)
773
Elliott Hughesb264f082012-04-06 17:10:10 -0700774jint Java_MyClassNatives_nativeUpCall(JNIEnv* env, jobject thisObj, jint i) {
Shih-wei Liaoff0f9be2011-08-29 15:43:53 -0700775 if (i <= 0) {
Andreas Gampecf4035a2014-05-28 22:43:01 -0700776 // We want to check raw Object* / Array* below
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700777 ScopedObjectAccess soa(env);
Ian Rogersaaa20802011-09-11 21:47:37 -0700778
779 // Build stack trace
Sebastien Hertzee1d79a2014-02-21 15:46:30 +0100780 jobject internal = Thread::Current()->CreateInternalStackTrace<false>(soa);
Ian Rogers53b8b092014-03-13 23:45:53 -0700781 jobjectArray ste_array = Thread::InternalStackTraceToStackTraceElementArray(soa, internal);
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800782 mirror::ObjectArray<mirror::StackTraceElement>* trace_array =
783 soa.Decode<mirror::ObjectArray<mirror::StackTraceElement>*>(ste_array);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700784 EXPECT_TRUE(trace_array != nullptr);
Shih-wei Liaoff0f9be2011-08-29 15:43:53 -0700785 EXPECT_EQ(11, trace_array->GetLength());
786
Ian Rogersaaa20802011-09-11 21:47:37 -0700787 // Check stack trace entries have expected values
Shih-wei Liaoff0f9be2011-08-29 15:43:53 -0700788 for (int32_t i = 0; i < trace_array->GetLength(); ++i) {
789 EXPECT_EQ(-2, trace_array->Get(i)->GetLineNumber());
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800790 mirror::StackTraceElement* ste = trace_array->Get(i);
Ian Rogersaaa20802011-09-11 21:47:37 -0700791 EXPECT_STREQ("MyClassNatives.java", ste->GetFileName()->ToModifiedUtf8().c_str());
Elliott Hughesb264f082012-04-06 17:10:10 -0700792 EXPECT_STREQ("MyClassNatives", ste->GetDeclaringClass()->ToModifiedUtf8().c_str());
Ian Rogersaaa20802011-09-11 21:47:37 -0700793 EXPECT_STREQ("fooI", ste->GetMethodName()->ToModifiedUtf8().c_str());
Shih-wei Liaoff0f9be2011-08-29 15:43:53 -0700794 }
Ian Rogersaaa20802011-09-11 21:47:37 -0700795
796 // end recursion
Shih-wei Liaoff0f9be2011-08-29 15:43:53 -0700797 return 0;
798 } else {
Elliott Hughesb264f082012-04-06 17:10:10 -0700799 jclass jklass = env->FindClass("MyClassNatives");
Andreas Gampecf4035a2014-05-28 22:43:01 -0700800 EXPECT_TRUE(jklass != nullptr);
Shih-wei Liaoff0f9be2011-08-29 15:43:53 -0700801 jmethodID jmethod = env->GetMethodID(jklass, "fooI", "(I)I");
Andreas Gampecf4035a2014-05-28 22:43:01 -0700802 EXPECT_TRUE(jmethod != nullptr);
Shih-wei Liaoff0f9be2011-08-29 15:43:53 -0700803
Ian Rogersaaa20802011-09-11 21:47:37 -0700804 // Recurse with i - 1
Shih-wei Liaoff0f9be2011-08-29 15:43:53 -0700805 jint result = env->CallNonvirtualIntMethod(thisObj, jklass, jmethod, i - 1);
Ian Rogersaaa20802011-09-11 21:47:37 -0700806
807 // Return sum of all depths
Shih-wei Liaoff0f9be2011-08-29 15:43:53 -0700808 return i + result;
809 }
810}
811
Andreas Gampe6e498692014-08-18 16:43:12 -0700812void JniCompilerTest::NativeStackTraceElementImpl() {
Brian Carlstrom265091e2013-01-30 14:08:26 -0800813 TEST_DISABLED_FOR_PORTABLE();
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700814 SetUpForTest(false, "fooI", "(I)I",
Elliott Hughesb264f082012-04-06 17:10:10 -0700815 reinterpret_cast<void*>(&Java_MyClassNatives_nativeUpCall));
Shih-wei Liaoff0f9be2011-08-29 15:43:53 -0700816 jint result = env_->CallNonvirtualIntMethod(jobj_, jklass_, jmethod_, 10);
Ian Rogersaaa20802011-09-11 21:47:37 -0700817 EXPECT_EQ(10+9+8+7+6+5+4+3+2+1, result);
Shih-wei Liaoff0f9be2011-08-29 15:43:53 -0700818}
819
Andreas Gampe6e498692014-08-18 16:43:12 -0700820JNI_TEST(NativeStackTraceElement)
821
Elliott Hughesb264f082012-04-06 17:10:10 -0700822jobject Java_MyClassNatives_fooO(JNIEnv* env, jobject, jobject x) {
Shih-wei Liao558788e2011-09-01 02:39:11 -0700823 return env->NewGlobalRef(x);
824}
825
Andreas Gampe6e498692014-08-18 16:43:12 -0700826void JniCompilerTest::ReturnGlobalRefImpl() {
Brian Carlstrom265091e2013-01-30 14:08:26 -0800827 TEST_DISABLED_FOR_PORTABLE();
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700828 SetUpForTest(false, "fooO", "(Ljava/lang/Object;)Ljava/lang/Object;",
Elliott Hughesb264f082012-04-06 17:10:10 -0700829 reinterpret_cast<void*>(&Java_MyClassNatives_fooO));
Shih-wei Liao558788e2011-09-01 02:39:11 -0700830 jobject result = env_->CallNonvirtualObjectMethod(jobj_, jklass_, jmethod_, jobj_);
831 EXPECT_EQ(JNILocalRefType, env_->GetObjectRefType(result));
832 EXPECT_TRUE(env_->IsSameObject(result, jobj_));
833}
834
Andreas Gampe6e498692014-08-18 16:43:12 -0700835JNI_TEST(ReturnGlobalRef)
836
Ian Rogersdc51b792011-09-22 20:41:37 -0700837jint local_ref_test(JNIEnv* env, jobject thisObj, jint x) {
838 // Add 10 local references
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700839 ScopedObjectAccess soa(env);
Ian Rogers5a7a74a2011-09-26 16:32:29 -0700840 for (int i = 0; i < 10; i++) {
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800841 soa.AddLocalReference<jobject>(soa.Decode<mirror::Object*>(thisObj));
Ian Rogersdc51b792011-09-22 20:41:37 -0700842 }
843 return x+1;
844}
845
Andreas Gampe6e498692014-08-18 16:43:12 -0700846void JniCompilerTest::LocalReferenceTableClearingTestImpl() {
Brian Carlstrom265091e2013-01-30 14:08:26 -0800847 TEST_DISABLED_FOR_PORTABLE();
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700848 SetUpForTest(false, "fooI", "(I)I", reinterpret_cast<void*>(&local_ref_test));
Ian Rogersdc51b792011-09-22 20:41:37 -0700849 // 1000 invocations of a method that adds 10 local references
Elliott Hughesb25c3f62012-03-26 16:35:06 -0700850 for (int i = 0; i < 1000; i++) {
Ian Rogersdc51b792011-09-22 20:41:37 -0700851 jint result = env_->CallIntMethod(jobj_, jmethod_, i);
852 EXPECT_TRUE(result == i + 1);
853 }
854}
855
Andreas Gampe6e498692014-08-18 16:43:12 -0700856JNI_TEST(LocalReferenceTableClearingTest)
857
Ian Rogersb9231c82011-09-05 22:13:19 -0700858void my_arraycopy(JNIEnv* env, jclass klass, jobject src, jint src_pos, jobject dst, jint dst_pos, jint length) {
859 EXPECT_TRUE(env->IsSameObject(JniCompilerTest::jklass_, klass));
860 EXPECT_TRUE(env->IsSameObject(JniCompilerTest::jklass_, dst));
Ian Rogers82f3e092011-09-05 22:54:45 -0700861 EXPECT_TRUE(env->IsSameObject(JniCompilerTest::jobj_, src));
Ian Rogersb9231c82011-09-05 22:13:19 -0700862 EXPECT_EQ(1234, src_pos);
863 EXPECT_EQ(5678, dst_pos);
864 EXPECT_EQ(9876, length);
865}
866
Andreas Gampe6e498692014-08-18 16:43:12 -0700867void JniCompilerTest::JavaLangSystemArrayCopyImpl() {
Brian Carlstrom265091e2013-01-30 14:08:26 -0800868 TEST_DISABLED_FOR_PORTABLE();
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700869 SetUpForTest(true, "arraycopy", "(Ljava/lang/Object;ILjava/lang/Object;II)V",
Ian Rogersb9231c82011-09-05 22:13:19 -0700870 reinterpret_cast<void*>(&my_arraycopy));
Ian Rogers82f3e092011-09-05 22:54:45 -0700871 env_->CallStaticVoidMethod(jklass_, jmethod_, jobj_, 1234, jklass_, 5678, 9876);
Ian Rogersb9231c82011-09-05 22:13:19 -0700872}
873
Andreas Gampe6e498692014-08-18 16:43:12 -0700874JNI_TEST(JavaLangSystemArrayCopy)
875
Ian Rogers67375ac2011-09-14 00:55:44 -0700876jboolean my_casi(JNIEnv* env, jobject unsafe, jobject obj, jlong offset, jint expected, jint newval) {
877 EXPECT_TRUE(env->IsSameObject(JniCompilerTest::jobj_, unsafe));
878 EXPECT_TRUE(env->IsSameObject(JniCompilerTest::jobj_, obj));
Ian Rogers0f678472014-03-10 16:18:37 -0700879 EXPECT_EQ(INT64_C(0x12345678ABCDEF88), offset);
Ian Rogers67375ac2011-09-14 00:55:44 -0700880 EXPECT_EQ(static_cast<jint>(0xCAFEF00D), expected);
881 EXPECT_EQ(static_cast<jint>(0xEBADF00D), newval);
882 return JNI_TRUE;
883}
884
Andreas Gampe6e498692014-08-18 16:43:12 -0700885void JniCompilerTest::CompareAndSwapIntImpl() {
Brian Carlstrom265091e2013-01-30 14:08:26 -0800886 TEST_DISABLED_FOR_PORTABLE();
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700887 SetUpForTest(false, "compareAndSwapInt", "(Ljava/lang/Object;JII)Z",
Ian Rogers67375ac2011-09-14 00:55:44 -0700888 reinterpret_cast<void*>(&my_casi));
Ian Rogers0f678472014-03-10 16:18:37 -0700889 jboolean result = env_->CallBooleanMethod(jobj_, jmethod_, jobj_, INT64_C(0x12345678ABCDEF88),
890 0xCAFEF00D, 0xEBADF00D);
Ian Rogers67375ac2011-09-14 00:55:44 -0700891 EXPECT_EQ(result, JNI_TRUE);
892}
893
Andreas Gampe6e498692014-08-18 16:43:12 -0700894JNI_TEST(CompareAndSwapInt)
895
Ian Rogersc7792842012-03-03 15:36:20 -0800896jint my_gettext(JNIEnv* env, jclass klass, jlong val1, jobject obj1, jlong val2, jobject obj2) {
897 EXPECT_TRUE(env->IsInstanceOf(JniCompilerTest::jobj_, klass));
898 EXPECT_TRUE(env->IsSameObject(JniCompilerTest::jobj_, obj1));
899 EXPECT_TRUE(env->IsSameObject(JniCompilerTest::jobj_, obj2));
900 EXPECT_EQ(0x12345678ABCDEF88ll, val1);
901 EXPECT_EQ(0x7FEDCBA987654321ll, val2);
902 return 42;
903}
904
Andreas Gampe6e498692014-08-18 16:43:12 -0700905void JniCompilerTest::GetTextImpl() {
Brian Carlstrom265091e2013-01-30 14:08:26 -0800906 TEST_DISABLED_FOR_PORTABLE();
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700907 SetUpForTest(true, "getText", "(JLjava/lang/Object;JLjava/lang/Object;)I",
Ian Rogersc7792842012-03-03 15:36:20 -0800908 reinterpret_cast<void*>(&my_gettext));
909 jint result = env_->CallStaticIntMethod(jklass_, jmethod_, 0x12345678ABCDEF88ll, jobj_,
Ian Rogers0f678472014-03-10 16:18:37 -0700910 INT64_C(0x7FEDCBA987654321), jobj_);
Ian Rogersc7792842012-03-03 15:36:20 -0800911 EXPECT_EQ(result, 42);
912}
913
Andreas Gampe6e498692014-08-18 16:43:12 -0700914JNI_TEST(GetText)
915
Vladimir Marko4e24b9d2014-07-24 17:01:58 +0100916int gJava_MyClassNatives_GetSinkProperties_calls = 0;
917jarray Java_MyClassNatives_GetSinkProperties(JNIEnv* env, jobject thisObj, jstring s) {
918 // 1 = thisObj
919 Thread* self = Thread::Current();
920 EXPECT_EQ(kNative, self->GetState());
921 Locks::mutator_lock_->AssertNotHeld(self);
922 EXPECT_EQ(self->GetJniEnv(), env);
923 EXPECT_TRUE(thisObj != nullptr);
924 EXPECT_TRUE(env->IsInstanceOf(thisObj, JniCompilerTest::jklass_));
925 EXPECT_EQ(s, nullptr);
926 gJava_MyClassNatives_GetSinkProperties_calls++;
927 ScopedObjectAccess soa(self);
928 EXPECT_EQ(2U, self->NumStackReferences());
929 EXPECT_TRUE(self->HoldsLock(soa.Decode<mirror::Object*>(thisObj)));
930 return nullptr;
931}
932
Andreas Gampe6e498692014-08-18 16:43:12 -0700933void JniCompilerTest::GetSinkPropertiesNativeImpl() {
Brian Carlstrom265091e2013-01-30 14:08:26 -0800934 TEST_DISABLED_FOR_PORTABLE();
Vladimir Marko4e24b9d2014-07-24 17:01:58 +0100935 SetUpForTest(false, "getSinkPropertiesNative", "(Ljava/lang/String;)[Ljava/lang/Object;",
936 reinterpret_cast<void*>(&Java_MyClassNatives_GetSinkProperties));
937
938 EXPECT_EQ(0, gJava_MyClassNatives_GetSinkProperties_calls);
939 jarray result = down_cast<jarray>(
940 env_->CallNonvirtualObjectMethod(jobj_, jklass_, jmethod_, nullptr));
941 EXPECT_EQ(nullptr, result);
942 EXPECT_EQ(1, gJava_MyClassNatives_GetSinkProperties_calls);
Andreas Gampe6e498692014-08-18 16:43:12 -0700943
944 gJava_MyClassNatives_GetSinkProperties_calls = 0;
Brian Carlstromfc7120c2012-08-27 13:43:25 -0700945}
946
Andreas Gampe6e498692014-08-18 16:43:12 -0700947JNI_TEST(GetSinkPropertiesNative)
948
Elliott Hughesb264f082012-04-06 17:10:10 -0700949// This should return jclass, but we're imitating a bug pattern.
950jobject Java_MyClassNatives_instanceMethodThatShouldReturnClass(JNIEnv* env, jobject) {
951 return env->NewStringUTF("not a class!");
952}
953
954// This should return jclass, but we're imitating a bug pattern.
955jobject Java_MyClassNatives_staticMethodThatShouldReturnClass(JNIEnv* env, jclass) {
956 return env->NewStringUTF("not a class!");
957}
958
Andreas Gampe6e498692014-08-18 16:43:12 -0700959void JniCompilerTest::UpcallReturnTypeChecking_InstanceImpl() {
Brian Carlstrom265091e2013-01-30 14:08:26 -0800960 TEST_DISABLED_FOR_PORTABLE();
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700961 SetUpForTest(false, "instanceMethodThatShouldReturnClass", "()Ljava/lang/Class;",
Elliott Hughesb264f082012-04-06 17:10:10 -0700962 reinterpret_cast<void*>(&Java_MyClassNatives_instanceMethodThatShouldReturnClass));
963
964 CheckJniAbortCatcher check_jni_abort_catcher;
Elliott Hughes3f6635a2012-06-19 13:37:49 -0700965 // TODO: check type of returns with portable JNI compiler.
966 // This native method is bad, and tries to return a jstring as a jclass.
967 env_->CallObjectMethod(jobj_, jmethod_);
968 check_jni_abort_catcher.Check("attempt to return an instance of java.lang.String from java.lang.Class MyClassNatives.instanceMethodThatShouldReturnClass()");
969
970 // Here, we just call the method incorrectly; we should catch that too.
Ian Rogers68d8b422014-07-17 11:09:10 -0700971 env_->CallObjectMethod(jobj_, jmethod_);
Elliott Hughes3f6635a2012-06-19 13:37:49 -0700972 check_jni_abort_catcher.Check("attempt to return an instance of java.lang.String from java.lang.Class MyClassNatives.instanceMethodThatShouldReturnClass()");
Ian Rogers68d8b422014-07-17 11:09:10 -0700973 env_->CallStaticObjectMethod(jklass_, jmethod_);
974 check_jni_abort_catcher.Check("calling non-static method java.lang.Class MyClassNatives.instanceMethodThatShouldReturnClass() with CallStaticObjectMethodV");
Elliott Hughesb264f082012-04-06 17:10:10 -0700975}
976
Andreas Gampe6e498692014-08-18 16:43:12 -0700977JNI_TEST(UpcallReturnTypeChecking_Instance)
978
979void JniCompilerTest::UpcallReturnTypeChecking_StaticImpl() {
Brian Carlstrom265091e2013-01-30 14:08:26 -0800980 TEST_DISABLED_FOR_PORTABLE();
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700981 SetUpForTest(true, "staticMethodThatShouldReturnClass", "()Ljava/lang/Class;",
Elliott Hughesb264f082012-04-06 17:10:10 -0700982 reinterpret_cast<void*>(&Java_MyClassNatives_staticMethodThatShouldReturnClass));
983
984 CheckJniAbortCatcher check_jni_abort_catcher;
Elliott Hughes3f6635a2012-06-19 13:37:49 -0700985 // TODO: check type of returns with portable JNI compiler.
986 // This native method is bad, and tries to return a jstring as a jclass.
987 env_->CallStaticObjectMethod(jklass_, jmethod_);
988 check_jni_abort_catcher.Check("attempt to return an instance of java.lang.String from java.lang.Class MyClassNatives.staticMethodThatShouldReturnClass()");
989
990 // Here, we just call the method incorrectly; we should catch that too.
Ian Rogers68d8b422014-07-17 11:09:10 -0700991 env_->CallStaticObjectMethod(jklass_, jmethod_);
Elliott Hughes3f6635a2012-06-19 13:37:49 -0700992 check_jni_abort_catcher.Check("attempt to return an instance of java.lang.String from java.lang.Class MyClassNatives.staticMethodThatShouldReturnClass()");
Ian Rogers68d8b422014-07-17 11:09:10 -0700993 env_->CallObjectMethod(jobj_, jmethod_);
994 check_jni_abort_catcher.Check("calling static method java.lang.Class MyClassNatives.staticMethodThatShouldReturnClass() with CallObjectMethodV");
Elliott Hughesb264f082012-04-06 17:10:10 -0700995}
996
Andreas Gampe6e498692014-08-18 16:43:12 -0700997JNI_TEST(UpcallReturnTypeChecking_Static)
998
Elliott Hughesb264f082012-04-06 17:10:10 -0700999// This should take jclass, but we're imitating a bug pattern.
1000void Java_MyClassNatives_instanceMethodThatShouldTakeClass(JNIEnv*, jobject, jclass) {
1001}
1002
1003// This should take jclass, but we're imitating a bug pattern.
1004void Java_MyClassNatives_staticMethodThatShouldTakeClass(JNIEnv*, jclass, jclass) {
1005}
1006
Andreas Gampe6e498692014-08-18 16:43:12 -07001007void JniCompilerTest::UpcallArgumentTypeChecking_InstanceImpl() {
Brian Carlstrom265091e2013-01-30 14:08:26 -08001008 TEST_DISABLED_FOR_PORTABLE();
Ian Rogers00f7d0e2012-07-19 15:28:27 -07001009 SetUpForTest(false, "instanceMethodThatShouldTakeClass", "(ILjava/lang/Class;)V",
Elliott Hughesb264f082012-04-06 17:10:10 -07001010 reinterpret_cast<void*>(&Java_MyClassNatives_instanceMethodThatShouldTakeClass));
1011
1012 CheckJniAbortCatcher check_jni_abort_catcher;
1013 // We deliberately pass a bad second argument here.
1014 env_->CallVoidMethod(jobj_, jmethod_, 123, env_->NewStringUTF("not a class!"));
Elliott Hughes3f6635a2012-06-19 13:37:49 -07001015 check_jni_abort_catcher.Check("bad arguments passed to void MyClassNatives.instanceMethodThatShouldTakeClass(int, java.lang.Class)");
Elliott Hughesb264f082012-04-06 17:10:10 -07001016}
1017
Andreas Gampe6e498692014-08-18 16:43:12 -07001018JNI_TEST(UpcallArgumentTypeChecking_Instance)
1019
1020void JniCompilerTest::UpcallArgumentTypeChecking_StaticImpl() {
Brian Carlstrom265091e2013-01-30 14:08:26 -08001021 TEST_DISABLED_FOR_PORTABLE();
Ian Rogers00f7d0e2012-07-19 15:28:27 -07001022 SetUpForTest(true, "staticMethodThatShouldTakeClass", "(ILjava/lang/Class;)V",
Elliott Hughesb264f082012-04-06 17:10:10 -07001023 reinterpret_cast<void*>(&Java_MyClassNatives_staticMethodThatShouldTakeClass));
1024
1025 CheckJniAbortCatcher check_jni_abort_catcher;
1026 // We deliberately pass a bad second argument here.
1027 env_->CallStaticVoidMethod(jklass_, jmethod_, 123, env_->NewStringUTF("not a class!"));
Elliott Hughes3f6635a2012-06-19 13:37:49 -07001028 check_jni_abort_catcher.Check("bad arguments passed to void MyClassNatives.staticMethodThatShouldTakeClass(int, java.lang.Class)");
Elliott Hughesb264f082012-04-06 17:10:10 -07001029}
1030
Andreas Gampe6e498692014-08-18 16:43:12 -07001031JNI_TEST(UpcallArgumentTypeChecking_Static)
1032
Andreas Gampe7a0e5042014-03-07 13:03:19 -08001033jfloat Java_MyClassNatives_checkFloats(JNIEnv* env, jobject thisObj, jfloat f1, jfloat f2) {
1034 EXPECT_EQ(kNative, Thread::Current()->GetState());
1035 EXPECT_EQ(Thread::Current()->GetJniEnv(), env);
Andreas Gampecf4035a2014-05-28 22:43:01 -07001036 EXPECT_TRUE(thisObj != nullptr);
Andreas Gampe7a0e5042014-03-07 13:03:19 -08001037 EXPECT_TRUE(env->IsInstanceOf(thisObj, JniCompilerTest::jklass_));
1038 ScopedObjectAccess soa(Thread::Current());
1039 EXPECT_EQ(1U, Thread::Current()->NumStackReferences());
1040 return f1 - f2; // non-commutative operator
1041}
1042
Andreas Gampe6e498692014-08-18 16:43:12 -07001043void JniCompilerTest::CompileAndRunFloatFloatMethodImpl() {
Andreas Gampe7a0e5042014-03-07 13:03:19 -08001044 TEST_DISABLED_FOR_PORTABLE();
1045 SetUpForTest(false, "checkFloats", "(FF)F",
1046 reinterpret_cast<void*>(&Java_MyClassNatives_checkFloats));
1047
1048 jfloat result = env_->CallNonvirtualFloatMethod(jobj_, jklass_, jmethod_,
1049 99.0F, 10.0F);
Ian Rogers647b1a82014-10-10 11:02:11 -07001050 EXPECT_FLOAT_EQ(99.0F - 10.0F, result);
Andreas Gampe7a0e5042014-03-07 13:03:19 -08001051 jfloat a = 3.14159F;
1052 jfloat b = 0.69314F;
1053 result = env_->CallNonvirtualFloatMethod(jobj_, jklass_, jmethod_, a, b);
Ian Rogers647b1a82014-10-10 11:02:11 -07001054 EXPECT_FLOAT_EQ(a - b, result);
Andreas Gampe7a0e5042014-03-07 13:03:19 -08001055}
1056
Andreas Gampe6e498692014-08-18 16:43:12 -07001057JNI_TEST(CompileAndRunFloatFloatMethod)
1058
Andreas Gampe7a0e5042014-03-07 13:03:19 -08001059void Java_MyClassNatives_checkParameterAlign(JNIEnv* env, jobject thisObj, jint i1, jlong l1) {
Andreas Gampecf4035a2014-05-28 22:43:01 -07001060// EXPECT_EQ(kNative, Thread::Current()->GetState());
1061// EXPECT_EQ(Thread::Current()->GetJniEnv(), env);
1062// EXPECT_TRUE(thisObj != nullptr);
1063// EXPECT_TRUE(env->IsInstanceOf(thisObj, JniCompilerTest::jklass_));
1064// ScopedObjectAccess soa(Thread::Current());
1065// EXPECT_EQ(1U, Thread::Current()->NumStackReferences());
Andreas Gampe7a0e5042014-03-07 13:03:19 -08001066 EXPECT_EQ(i1, 1234);
Ian Rogers0f678472014-03-10 16:18:37 -07001067 EXPECT_EQ(l1, INT64_C(0x12345678ABCDEF0));
Andreas Gampe7a0e5042014-03-07 13:03:19 -08001068}
1069
Andreas Gampe6e498692014-08-18 16:43:12 -07001070void JniCompilerTest::CheckParameterAlignImpl() {
Andreas Gampe7a0e5042014-03-07 13:03:19 -08001071 TEST_DISABLED_FOR_PORTABLE();
1072 SetUpForTest(false, "checkParameterAlign", "(IJ)V",
1073 reinterpret_cast<void*>(&Java_MyClassNatives_checkParameterAlign));
1074
Ian Rogers0f678472014-03-10 16:18:37 -07001075 env_->CallNonvirtualVoidMethod(jobj_, jklass_, jmethod_, 1234, INT64_C(0x12345678ABCDEF0));
Andreas Gampe7a0e5042014-03-07 13:03:19 -08001076}
1077
Andreas Gampe6e498692014-08-18 16:43:12 -07001078JNI_TEST(CheckParameterAlign)
1079
Andreas Gampe7a0e5042014-03-07 13:03:19 -08001080void Java_MyClassNatives_maxParamNumber(JNIEnv* env, jobject thisObj,
1081 jobject o0, jobject o1, jobject o2, jobject o3, jobject o4, jobject o5, jobject o6, jobject o7,
1082 jobject o8, jobject o9, jobject o10, jobject o11, jobject o12, jobject o13, jobject o14, jobject o15,
1083 jobject o16, jobject o17, jobject o18, jobject o19, jobject o20, jobject o21, jobject o22, jobject o23,
1084 jobject o24, jobject o25, jobject o26, jobject o27, jobject o28, jobject o29, jobject o30, jobject o31,
1085 jobject o32, jobject o33, jobject o34, jobject o35, jobject o36, jobject o37, jobject o38, jobject o39,
1086 jobject o40, jobject o41, jobject o42, jobject o43, jobject o44, jobject o45, jobject o46, jobject o47,
1087 jobject o48, jobject o49, jobject o50, jobject o51, jobject o52, jobject o53, jobject o54, jobject o55,
1088 jobject o56, jobject o57, jobject o58, jobject o59, jobject o60, jobject o61, jobject o62, jobject o63,
1089 jobject o64, jobject o65, jobject o66, jobject o67, jobject o68, jobject o69, jobject o70, jobject o71,
1090 jobject o72, jobject o73, jobject o74, jobject o75, jobject o76, jobject o77, jobject o78, jobject o79,
1091 jobject o80, jobject o81, jobject o82, jobject o83, jobject o84, jobject o85, jobject o86, jobject o87,
1092 jobject o88, jobject o89, jobject o90, jobject o91, jobject o92, jobject o93, jobject o94, jobject o95,
1093 jobject o96, jobject o97, jobject o98, jobject o99, jobject o100, jobject o101, jobject o102, jobject o103,
1094 jobject o104, jobject o105, jobject o106, jobject o107, jobject o108, jobject o109, jobject o110, jobject o111,
1095 jobject o112, jobject o113, jobject o114, jobject o115, jobject o116, jobject o117, jobject o118, jobject o119,
1096 jobject o120, jobject o121, jobject o122, jobject o123, jobject o124, jobject o125, jobject o126, jobject o127,
1097 jobject o128, jobject o129, jobject o130, jobject o131, jobject o132, jobject o133, jobject o134, jobject o135,
1098 jobject o136, jobject o137, jobject o138, jobject o139, jobject o140, jobject o141, jobject o142, jobject o143,
1099 jobject o144, jobject o145, jobject o146, jobject o147, jobject o148, jobject o149, jobject o150, jobject o151,
1100 jobject o152, jobject o153, jobject o154, jobject o155, jobject o156, jobject o157, jobject o158, jobject o159,
1101 jobject o160, jobject o161, jobject o162, jobject o163, jobject o164, jobject o165, jobject o166, jobject o167,
1102 jobject o168, jobject o169, jobject o170, jobject o171, jobject o172, jobject o173, jobject o174, jobject o175,
1103 jobject o176, jobject o177, jobject o178, jobject o179, jobject o180, jobject o181, jobject o182, jobject o183,
1104 jobject o184, jobject o185, jobject o186, jobject o187, jobject o188, jobject o189, jobject o190, jobject o191,
1105 jobject o192, jobject o193, jobject o194, jobject o195, jobject o196, jobject o197, jobject o198, jobject o199,
1106 jobject o200, jobject o201, jobject o202, jobject o203, jobject o204, jobject o205, jobject o206, jobject o207,
1107 jobject o208, jobject o209, jobject o210, jobject o211, jobject o212, jobject o213, jobject o214, jobject o215,
1108 jobject o216, jobject o217, jobject o218, jobject o219, jobject o220, jobject o221, jobject o222, jobject o223,
1109 jobject o224, jobject o225, jobject o226, jobject o227, jobject o228, jobject o229, jobject o230, jobject o231,
1110 jobject o232, jobject o233, jobject o234, jobject o235, jobject o236, jobject o237, jobject o238, jobject o239,
1111 jobject o240, jobject o241, jobject o242, jobject o243, jobject o244, jobject o245, jobject o246, jobject o247,
1112 jobject o248, jobject o249, jobject o250, jobject o251, jobject o252, jobject o253) {
1113 EXPECT_EQ(kNative, Thread::Current()->GetState());
1114 EXPECT_EQ(Thread::Current()->GetJniEnv(), env);
Andreas Gampecf4035a2014-05-28 22:43:01 -07001115 EXPECT_TRUE(thisObj != nullptr);
Andreas Gampe7a0e5042014-03-07 13:03:19 -08001116 EXPECT_TRUE(env->IsInstanceOf(thisObj, JniCompilerTest::jklass_));
1117 ScopedObjectAccess soa(Thread::Current());
1118 EXPECT_GE(255U, Thread::Current()->NumStackReferences());
1119
1120 // two tests possible
1121 if (o0 == nullptr) {
1122 // 1) everything is null
1123 EXPECT_TRUE(o0 == nullptr && o1 == nullptr && o2 == nullptr && o3 == nullptr && o4 == nullptr
1124 && o5 == nullptr && o6 == nullptr && o7 == nullptr && o8 == nullptr && o9 == nullptr
1125 && o10 == nullptr && o11 == nullptr && o12 == nullptr && o13 == nullptr && o14 == nullptr
1126 && o15 == nullptr && o16 == nullptr && o17 == nullptr && o18 == nullptr && o19 == nullptr
1127 && o20 == nullptr && o21 == nullptr && o22 == nullptr && o23 == nullptr && o24 == nullptr
1128 && o25 == nullptr && o26 == nullptr && o27 == nullptr && o28 == nullptr && o29 == nullptr
1129 && o30 == nullptr && o31 == nullptr && o32 == nullptr && o33 == nullptr && o34 == nullptr
1130 && o35 == nullptr && o36 == nullptr && o37 == nullptr && o38 == nullptr && o39 == nullptr
1131 && o40 == nullptr && o41 == nullptr && o42 == nullptr && o43 == nullptr && o44 == nullptr
1132 && o45 == nullptr && o46 == nullptr && o47 == nullptr && o48 == nullptr && o49 == nullptr
1133 && o50 == nullptr && o51 == nullptr && o52 == nullptr && o53 == nullptr && o54 == nullptr
1134 && o55 == nullptr && o56 == nullptr && o57 == nullptr && o58 == nullptr && o59 == nullptr
1135 && o60 == nullptr && o61 == nullptr && o62 == nullptr && o63 == nullptr && o64 == nullptr
1136 && o65 == nullptr && o66 == nullptr && o67 == nullptr && o68 == nullptr && o69 == nullptr
1137 && o70 == nullptr && o71 == nullptr && o72 == nullptr && o73 == nullptr && o74 == nullptr
1138 && o75 == nullptr && o76 == nullptr && o77 == nullptr && o78 == nullptr && o79 == nullptr
1139 && o80 == nullptr && o81 == nullptr && o82 == nullptr && o83 == nullptr && o84 == nullptr
1140 && o85 == nullptr && o86 == nullptr && o87 == nullptr && o88 == nullptr && o89 == nullptr
1141 && o90 == nullptr && o91 == nullptr && o92 == nullptr && o93 == nullptr && o94 == nullptr
1142 && o95 == nullptr && o96 == nullptr && o97 == nullptr && o98 == nullptr && o99 == nullptr
1143 && o100 == nullptr && o101 == nullptr && o102 == nullptr && o103 == nullptr && o104 == nullptr
1144 && o105 == nullptr && o106 == nullptr && o107 == nullptr && o108 == nullptr && o109 == nullptr
1145 && o110 == nullptr && o111 == nullptr && o112 == nullptr && o113 == nullptr && o114 == nullptr
1146 && o115 == nullptr && o116 == nullptr && o117 == nullptr && o118 == nullptr && o119 == nullptr
1147 && o120 == nullptr && o121 == nullptr && o122 == nullptr && o123 == nullptr && o124 == nullptr
1148 && o125 == nullptr && o126 == nullptr && o127 == nullptr && o128 == nullptr && o129 == nullptr
1149 && o130 == nullptr && o131 == nullptr && o132 == nullptr && o133 == nullptr && o134 == nullptr
1150 && o135 == nullptr && o136 == nullptr && o137 == nullptr && o138 == nullptr && o139 == nullptr
1151 && o140 == nullptr && o141 == nullptr && o142 == nullptr && o143 == nullptr && o144 == nullptr
1152 && o145 == nullptr && o146 == nullptr && o147 == nullptr && o148 == nullptr && o149 == nullptr
1153 && o150 == nullptr && o151 == nullptr && o152 == nullptr && o153 == nullptr && o154 == nullptr
1154 && o155 == nullptr && o156 == nullptr && o157 == nullptr && o158 == nullptr && o159 == nullptr
1155 && o160 == nullptr && o161 == nullptr && o162 == nullptr && o163 == nullptr && o164 == nullptr
1156 && o165 == nullptr && o166 == nullptr && o167 == nullptr && o168 == nullptr && o169 == nullptr
1157 && o170 == nullptr && o171 == nullptr && o172 == nullptr && o173 == nullptr && o174 == nullptr
1158 && o175 == nullptr && o176 == nullptr && o177 == nullptr && o178 == nullptr && o179 == nullptr
1159 && o180 == nullptr && o181 == nullptr && o182 == nullptr && o183 == nullptr && o184 == nullptr
1160 && o185 == nullptr && o186 == nullptr && o187 == nullptr && o188 == nullptr && o189 == nullptr
1161 && o190 == nullptr && o191 == nullptr && o192 == nullptr && o193 == nullptr && o194 == nullptr
1162 && o195 == nullptr && o196 == nullptr && o197 == nullptr && o198 == nullptr && o199 == nullptr
1163 && o200 == nullptr && o201 == nullptr && o202 == nullptr && o203 == nullptr && o204 == nullptr
1164 && o205 == nullptr && o206 == nullptr && o207 == nullptr && o208 == nullptr && o209 == nullptr
1165 && o210 == nullptr && o211 == nullptr && o212 == nullptr && o213 == nullptr && o214 == nullptr
1166 && o215 == nullptr && o216 == nullptr && o217 == nullptr && o218 == nullptr && o219 == nullptr
1167 && o220 == nullptr && o221 == nullptr && o222 == nullptr && o223 == nullptr && o224 == nullptr
1168 && o225 == nullptr && o226 == nullptr && o227 == nullptr && o228 == nullptr && o229 == nullptr
1169 && o230 == nullptr && o231 == nullptr && o232 == nullptr && o233 == nullptr && o234 == nullptr
1170 && o235 == nullptr && o236 == nullptr && o237 == nullptr && o238 == nullptr && o239 == nullptr
1171 && o240 == nullptr && o241 == nullptr && o242 == nullptr && o243 == nullptr && o244 == nullptr
1172 && o245 == nullptr && o246 == nullptr && o247 == nullptr && o248 == nullptr && o249 == nullptr
1173 && o250 == nullptr && o251 == nullptr && o252 == nullptr && o253 == nullptr);
1174 } else {
1175 EXPECT_EQ(0, env->GetArrayLength(reinterpret_cast<jarray>(o0)));
1176 EXPECT_EQ(1, env->GetArrayLength(reinterpret_cast<jarray>(o1)));
1177 EXPECT_EQ(2, env->GetArrayLength(reinterpret_cast<jarray>(o2)));
1178 EXPECT_EQ(3, env->GetArrayLength(reinterpret_cast<jarray>(o3)));
1179 EXPECT_EQ(4, env->GetArrayLength(reinterpret_cast<jarray>(o4)));
1180 EXPECT_EQ(5, env->GetArrayLength(reinterpret_cast<jarray>(o5)));
1181 EXPECT_EQ(6, env->GetArrayLength(reinterpret_cast<jarray>(o6)));
1182 EXPECT_EQ(7, env->GetArrayLength(reinterpret_cast<jarray>(o7)));
1183 EXPECT_EQ(8, env->GetArrayLength(reinterpret_cast<jarray>(o8)));
1184 EXPECT_EQ(9, env->GetArrayLength(reinterpret_cast<jarray>(o9)));
1185 EXPECT_EQ(10, env->GetArrayLength(reinterpret_cast<jarray>(o10)));
1186 EXPECT_EQ(11, env->GetArrayLength(reinterpret_cast<jarray>(o11)));
1187 EXPECT_EQ(12, env->GetArrayLength(reinterpret_cast<jarray>(o12)));
1188 EXPECT_EQ(13, env->GetArrayLength(reinterpret_cast<jarray>(o13)));
1189 EXPECT_EQ(14, env->GetArrayLength(reinterpret_cast<jarray>(o14)));
1190 EXPECT_EQ(15, env->GetArrayLength(reinterpret_cast<jarray>(o15)));
1191 EXPECT_EQ(16, env->GetArrayLength(reinterpret_cast<jarray>(o16)));
1192 EXPECT_EQ(17, env->GetArrayLength(reinterpret_cast<jarray>(o17)));
1193 EXPECT_EQ(18, env->GetArrayLength(reinterpret_cast<jarray>(o18)));
1194 EXPECT_EQ(19, env->GetArrayLength(reinterpret_cast<jarray>(o19)));
1195 EXPECT_EQ(20, env->GetArrayLength(reinterpret_cast<jarray>(o20)));
1196 EXPECT_EQ(21, env->GetArrayLength(reinterpret_cast<jarray>(o21)));
1197 EXPECT_EQ(22, env->GetArrayLength(reinterpret_cast<jarray>(o22)));
1198 EXPECT_EQ(23, env->GetArrayLength(reinterpret_cast<jarray>(o23)));
1199 EXPECT_EQ(24, env->GetArrayLength(reinterpret_cast<jarray>(o24)));
1200 EXPECT_EQ(25, env->GetArrayLength(reinterpret_cast<jarray>(o25)));
1201 EXPECT_EQ(26, env->GetArrayLength(reinterpret_cast<jarray>(o26)));
1202 EXPECT_EQ(27, env->GetArrayLength(reinterpret_cast<jarray>(o27)));
1203 EXPECT_EQ(28, env->GetArrayLength(reinterpret_cast<jarray>(o28)));
1204 EXPECT_EQ(29, env->GetArrayLength(reinterpret_cast<jarray>(o29)));
1205 EXPECT_EQ(30, env->GetArrayLength(reinterpret_cast<jarray>(o30)));
1206 EXPECT_EQ(31, env->GetArrayLength(reinterpret_cast<jarray>(o31)));
1207 EXPECT_EQ(32, env->GetArrayLength(reinterpret_cast<jarray>(o32)));
1208 EXPECT_EQ(33, env->GetArrayLength(reinterpret_cast<jarray>(o33)));
1209 EXPECT_EQ(34, env->GetArrayLength(reinterpret_cast<jarray>(o34)));
1210 EXPECT_EQ(35, env->GetArrayLength(reinterpret_cast<jarray>(o35)));
1211 EXPECT_EQ(36, env->GetArrayLength(reinterpret_cast<jarray>(o36)));
1212 EXPECT_EQ(37, env->GetArrayLength(reinterpret_cast<jarray>(o37)));
1213 EXPECT_EQ(38, env->GetArrayLength(reinterpret_cast<jarray>(o38)));
1214 EXPECT_EQ(39, env->GetArrayLength(reinterpret_cast<jarray>(o39)));
1215 EXPECT_EQ(40, env->GetArrayLength(reinterpret_cast<jarray>(o40)));
1216 EXPECT_EQ(41, env->GetArrayLength(reinterpret_cast<jarray>(o41)));
1217 EXPECT_EQ(42, env->GetArrayLength(reinterpret_cast<jarray>(o42)));
1218 EXPECT_EQ(43, env->GetArrayLength(reinterpret_cast<jarray>(o43)));
1219 EXPECT_EQ(44, env->GetArrayLength(reinterpret_cast<jarray>(o44)));
1220 EXPECT_EQ(45, env->GetArrayLength(reinterpret_cast<jarray>(o45)));
1221 EXPECT_EQ(46, env->GetArrayLength(reinterpret_cast<jarray>(o46)));
1222 EXPECT_EQ(47, env->GetArrayLength(reinterpret_cast<jarray>(o47)));
1223 EXPECT_EQ(48, env->GetArrayLength(reinterpret_cast<jarray>(o48)));
1224 EXPECT_EQ(49, env->GetArrayLength(reinterpret_cast<jarray>(o49)));
1225 EXPECT_EQ(50, env->GetArrayLength(reinterpret_cast<jarray>(o50)));
1226 EXPECT_EQ(51, env->GetArrayLength(reinterpret_cast<jarray>(o51)));
1227 EXPECT_EQ(52, env->GetArrayLength(reinterpret_cast<jarray>(o52)));
1228 EXPECT_EQ(53, env->GetArrayLength(reinterpret_cast<jarray>(o53)));
1229 EXPECT_EQ(54, env->GetArrayLength(reinterpret_cast<jarray>(o54)));
1230 EXPECT_EQ(55, env->GetArrayLength(reinterpret_cast<jarray>(o55)));
1231 EXPECT_EQ(56, env->GetArrayLength(reinterpret_cast<jarray>(o56)));
1232 EXPECT_EQ(57, env->GetArrayLength(reinterpret_cast<jarray>(o57)));
1233 EXPECT_EQ(58, env->GetArrayLength(reinterpret_cast<jarray>(o58)));
1234 EXPECT_EQ(59, env->GetArrayLength(reinterpret_cast<jarray>(o59)));
1235 EXPECT_EQ(60, env->GetArrayLength(reinterpret_cast<jarray>(o60)));
1236 EXPECT_EQ(61, env->GetArrayLength(reinterpret_cast<jarray>(o61)));
1237 EXPECT_EQ(62, env->GetArrayLength(reinterpret_cast<jarray>(o62)));
1238 EXPECT_EQ(63, env->GetArrayLength(reinterpret_cast<jarray>(o63)));
1239 EXPECT_EQ(64, env->GetArrayLength(reinterpret_cast<jarray>(o64)));
1240 EXPECT_EQ(65, env->GetArrayLength(reinterpret_cast<jarray>(o65)));
1241 EXPECT_EQ(66, env->GetArrayLength(reinterpret_cast<jarray>(o66)));
1242 EXPECT_EQ(67, env->GetArrayLength(reinterpret_cast<jarray>(o67)));
1243 EXPECT_EQ(68, env->GetArrayLength(reinterpret_cast<jarray>(o68)));
1244 EXPECT_EQ(69, env->GetArrayLength(reinterpret_cast<jarray>(o69)));
1245 EXPECT_EQ(70, env->GetArrayLength(reinterpret_cast<jarray>(o70)));
1246 EXPECT_EQ(71, env->GetArrayLength(reinterpret_cast<jarray>(o71)));
1247 EXPECT_EQ(72, env->GetArrayLength(reinterpret_cast<jarray>(o72)));
1248 EXPECT_EQ(73, env->GetArrayLength(reinterpret_cast<jarray>(o73)));
1249 EXPECT_EQ(74, env->GetArrayLength(reinterpret_cast<jarray>(o74)));
1250 EXPECT_EQ(75, env->GetArrayLength(reinterpret_cast<jarray>(o75)));
1251 EXPECT_EQ(76, env->GetArrayLength(reinterpret_cast<jarray>(o76)));
1252 EXPECT_EQ(77, env->GetArrayLength(reinterpret_cast<jarray>(o77)));
1253 EXPECT_EQ(78, env->GetArrayLength(reinterpret_cast<jarray>(o78)));
1254 EXPECT_EQ(79, env->GetArrayLength(reinterpret_cast<jarray>(o79)));
1255 EXPECT_EQ(80, env->GetArrayLength(reinterpret_cast<jarray>(o80)));
1256 EXPECT_EQ(81, env->GetArrayLength(reinterpret_cast<jarray>(o81)));
1257 EXPECT_EQ(82, env->GetArrayLength(reinterpret_cast<jarray>(o82)));
1258 EXPECT_EQ(83, env->GetArrayLength(reinterpret_cast<jarray>(o83)));
1259 EXPECT_EQ(84, env->GetArrayLength(reinterpret_cast<jarray>(o84)));
1260 EXPECT_EQ(85, env->GetArrayLength(reinterpret_cast<jarray>(o85)));
1261 EXPECT_EQ(86, env->GetArrayLength(reinterpret_cast<jarray>(o86)));
1262 EXPECT_EQ(87, env->GetArrayLength(reinterpret_cast<jarray>(o87)));
1263 EXPECT_EQ(88, env->GetArrayLength(reinterpret_cast<jarray>(o88)));
1264 EXPECT_EQ(89, env->GetArrayLength(reinterpret_cast<jarray>(o89)));
1265 EXPECT_EQ(90, env->GetArrayLength(reinterpret_cast<jarray>(o90)));
1266 EXPECT_EQ(91, env->GetArrayLength(reinterpret_cast<jarray>(o91)));
1267 EXPECT_EQ(92, env->GetArrayLength(reinterpret_cast<jarray>(o92)));
1268 EXPECT_EQ(93, env->GetArrayLength(reinterpret_cast<jarray>(o93)));
1269 EXPECT_EQ(94, env->GetArrayLength(reinterpret_cast<jarray>(o94)));
1270 EXPECT_EQ(95, env->GetArrayLength(reinterpret_cast<jarray>(o95)));
1271 EXPECT_EQ(96, env->GetArrayLength(reinterpret_cast<jarray>(o96)));
1272 EXPECT_EQ(97, env->GetArrayLength(reinterpret_cast<jarray>(o97)));
1273 EXPECT_EQ(98, env->GetArrayLength(reinterpret_cast<jarray>(o98)));
1274 EXPECT_EQ(99, env->GetArrayLength(reinterpret_cast<jarray>(o99)));
1275 EXPECT_EQ(100, env->GetArrayLength(reinterpret_cast<jarray>(o100)));
1276 EXPECT_EQ(101, env->GetArrayLength(reinterpret_cast<jarray>(o101)));
1277 EXPECT_EQ(102, env->GetArrayLength(reinterpret_cast<jarray>(o102)));
1278 EXPECT_EQ(103, env->GetArrayLength(reinterpret_cast<jarray>(o103)));
1279 EXPECT_EQ(104, env->GetArrayLength(reinterpret_cast<jarray>(o104)));
1280 EXPECT_EQ(105, env->GetArrayLength(reinterpret_cast<jarray>(o105)));
1281 EXPECT_EQ(106, env->GetArrayLength(reinterpret_cast<jarray>(o106)));
1282 EXPECT_EQ(107, env->GetArrayLength(reinterpret_cast<jarray>(o107)));
1283 EXPECT_EQ(108, env->GetArrayLength(reinterpret_cast<jarray>(o108)));
1284 EXPECT_EQ(109, env->GetArrayLength(reinterpret_cast<jarray>(o109)));
1285 EXPECT_EQ(110, env->GetArrayLength(reinterpret_cast<jarray>(o110)));
1286 EXPECT_EQ(111, env->GetArrayLength(reinterpret_cast<jarray>(o111)));
1287 EXPECT_EQ(112, env->GetArrayLength(reinterpret_cast<jarray>(o112)));
1288 EXPECT_EQ(113, env->GetArrayLength(reinterpret_cast<jarray>(o113)));
1289 EXPECT_EQ(114, env->GetArrayLength(reinterpret_cast<jarray>(o114)));
1290 EXPECT_EQ(115, env->GetArrayLength(reinterpret_cast<jarray>(o115)));
1291 EXPECT_EQ(116, env->GetArrayLength(reinterpret_cast<jarray>(o116)));
1292 EXPECT_EQ(117, env->GetArrayLength(reinterpret_cast<jarray>(o117)));
1293 EXPECT_EQ(118, env->GetArrayLength(reinterpret_cast<jarray>(o118)));
1294 EXPECT_EQ(119, env->GetArrayLength(reinterpret_cast<jarray>(o119)));
1295 EXPECT_EQ(120, env->GetArrayLength(reinterpret_cast<jarray>(o120)));
1296 EXPECT_EQ(121, env->GetArrayLength(reinterpret_cast<jarray>(o121)));
1297 EXPECT_EQ(122, env->GetArrayLength(reinterpret_cast<jarray>(o122)));
1298 EXPECT_EQ(123, env->GetArrayLength(reinterpret_cast<jarray>(o123)));
1299 EXPECT_EQ(124, env->GetArrayLength(reinterpret_cast<jarray>(o124)));
1300 EXPECT_EQ(125, env->GetArrayLength(reinterpret_cast<jarray>(o125)));
1301 EXPECT_EQ(126, env->GetArrayLength(reinterpret_cast<jarray>(o126)));
1302 EXPECT_EQ(127, env->GetArrayLength(reinterpret_cast<jarray>(o127)));
1303 EXPECT_EQ(128, env->GetArrayLength(reinterpret_cast<jarray>(o128)));
1304 EXPECT_EQ(129, env->GetArrayLength(reinterpret_cast<jarray>(o129)));
1305 EXPECT_EQ(130, env->GetArrayLength(reinterpret_cast<jarray>(o130)));
1306 EXPECT_EQ(131, env->GetArrayLength(reinterpret_cast<jarray>(o131)));
1307 EXPECT_EQ(132, env->GetArrayLength(reinterpret_cast<jarray>(o132)));
1308 EXPECT_EQ(133, env->GetArrayLength(reinterpret_cast<jarray>(o133)));
1309 EXPECT_EQ(134, env->GetArrayLength(reinterpret_cast<jarray>(o134)));
1310 EXPECT_EQ(135, env->GetArrayLength(reinterpret_cast<jarray>(o135)));
1311 EXPECT_EQ(136, env->GetArrayLength(reinterpret_cast<jarray>(o136)));
1312 EXPECT_EQ(137, env->GetArrayLength(reinterpret_cast<jarray>(o137)));
1313 EXPECT_EQ(138, env->GetArrayLength(reinterpret_cast<jarray>(o138)));
1314 EXPECT_EQ(139, env->GetArrayLength(reinterpret_cast<jarray>(o139)));
1315 EXPECT_EQ(140, env->GetArrayLength(reinterpret_cast<jarray>(o140)));
1316 EXPECT_EQ(141, env->GetArrayLength(reinterpret_cast<jarray>(o141)));
1317 EXPECT_EQ(142, env->GetArrayLength(reinterpret_cast<jarray>(o142)));
1318 EXPECT_EQ(143, env->GetArrayLength(reinterpret_cast<jarray>(o143)));
1319 EXPECT_EQ(144, env->GetArrayLength(reinterpret_cast<jarray>(o144)));
1320 EXPECT_EQ(145, env->GetArrayLength(reinterpret_cast<jarray>(o145)));
1321 EXPECT_EQ(146, env->GetArrayLength(reinterpret_cast<jarray>(o146)));
1322 EXPECT_EQ(147, env->GetArrayLength(reinterpret_cast<jarray>(o147)));
1323 EXPECT_EQ(148, env->GetArrayLength(reinterpret_cast<jarray>(o148)));
1324 EXPECT_EQ(149, env->GetArrayLength(reinterpret_cast<jarray>(o149)));
1325 EXPECT_EQ(150, env->GetArrayLength(reinterpret_cast<jarray>(o150)));
1326 EXPECT_EQ(151, env->GetArrayLength(reinterpret_cast<jarray>(o151)));
1327 EXPECT_EQ(152, env->GetArrayLength(reinterpret_cast<jarray>(o152)));
1328 EXPECT_EQ(153, env->GetArrayLength(reinterpret_cast<jarray>(o153)));
1329 EXPECT_EQ(154, env->GetArrayLength(reinterpret_cast<jarray>(o154)));
1330 EXPECT_EQ(155, env->GetArrayLength(reinterpret_cast<jarray>(o155)));
1331 EXPECT_EQ(156, env->GetArrayLength(reinterpret_cast<jarray>(o156)));
1332 EXPECT_EQ(157, env->GetArrayLength(reinterpret_cast<jarray>(o157)));
1333 EXPECT_EQ(158, env->GetArrayLength(reinterpret_cast<jarray>(o158)));
1334 EXPECT_EQ(159, env->GetArrayLength(reinterpret_cast<jarray>(o159)));
1335 EXPECT_EQ(160, env->GetArrayLength(reinterpret_cast<jarray>(o160)));
1336 EXPECT_EQ(161, env->GetArrayLength(reinterpret_cast<jarray>(o161)));
1337 EXPECT_EQ(162, env->GetArrayLength(reinterpret_cast<jarray>(o162)));
1338 EXPECT_EQ(163, env->GetArrayLength(reinterpret_cast<jarray>(o163)));
1339 EXPECT_EQ(164, env->GetArrayLength(reinterpret_cast<jarray>(o164)));
1340 EXPECT_EQ(165, env->GetArrayLength(reinterpret_cast<jarray>(o165)));
1341 EXPECT_EQ(166, env->GetArrayLength(reinterpret_cast<jarray>(o166)));
1342 EXPECT_EQ(167, env->GetArrayLength(reinterpret_cast<jarray>(o167)));
1343 EXPECT_EQ(168, env->GetArrayLength(reinterpret_cast<jarray>(o168)));
1344 EXPECT_EQ(169, env->GetArrayLength(reinterpret_cast<jarray>(o169)));
1345 EXPECT_EQ(170, env->GetArrayLength(reinterpret_cast<jarray>(o170)));
1346 EXPECT_EQ(171, env->GetArrayLength(reinterpret_cast<jarray>(o171)));
1347 EXPECT_EQ(172, env->GetArrayLength(reinterpret_cast<jarray>(o172)));
1348 EXPECT_EQ(173, env->GetArrayLength(reinterpret_cast<jarray>(o173)));
1349 EXPECT_EQ(174, env->GetArrayLength(reinterpret_cast<jarray>(o174)));
1350 EXPECT_EQ(175, env->GetArrayLength(reinterpret_cast<jarray>(o175)));
1351 EXPECT_EQ(176, env->GetArrayLength(reinterpret_cast<jarray>(o176)));
1352 EXPECT_EQ(177, env->GetArrayLength(reinterpret_cast<jarray>(o177)));
1353 EXPECT_EQ(178, env->GetArrayLength(reinterpret_cast<jarray>(o178)));
1354 EXPECT_EQ(179, env->GetArrayLength(reinterpret_cast<jarray>(o179)));
1355 EXPECT_EQ(180, env->GetArrayLength(reinterpret_cast<jarray>(o180)));
1356 EXPECT_EQ(181, env->GetArrayLength(reinterpret_cast<jarray>(o181)));
1357 EXPECT_EQ(182, env->GetArrayLength(reinterpret_cast<jarray>(o182)));
1358 EXPECT_EQ(183, env->GetArrayLength(reinterpret_cast<jarray>(o183)));
1359 EXPECT_EQ(184, env->GetArrayLength(reinterpret_cast<jarray>(o184)));
1360 EXPECT_EQ(185, env->GetArrayLength(reinterpret_cast<jarray>(o185)));
1361 EXPECT_EQ(186, env->GetArrayLength(reinterpret_cast<jarray>(o186)));
1362 EXPECT_EQ(187, env->GetArrayLength(reinterpret_cast<jarray>(o187)));
1363 EXPECT_EQ(188, env->GetArrayLength(reinterpret_cast<jarray>(o188)));
1364 EXPECT_EQ(189, env->GetArrayLength(reinterpret_cast<jarray>(o189)));
1365 EXPECT_EQ(190, env->GetArrayLength(reinterpret_cast<jarray>(o190)));
1366 EXPECT_EQ(191, env->GetArrayLength(reinterpret_cast<jarray>(o191)));
1367 EXPECT_EQ(192, env->GetArrayLength(reinterpret_cast<jarray>(o192)));
1368 EXPECT_EQ(193, env->GetArrayLength(reinterpret_cast<jarray>(o193)));
1369 EXPECT_EQ(194, env->GetArrayLength(reinterpret_cast<jarray>(o194)));
1370 EXPECT_EQ(195, env->GetArrayLength(reinterpret_cast<jarray>(o195)));
1371 EXPECT_EQ(196, env->GetArrayLength(reinterpret_cast<jarray>(o196)));
1372 EXPECT_EQ(197, env->GetArrayLength(reinterpret_cast<jarray>(o197)));
1373 EXPECT_EQ(198, env->GetArrayLength(reinterpret_cast<jarray>(o198)));
1374 EXPECT_EQ(199, env->GetArrayLength(reinterpret_cast<jarray>(o199)));
1375 EXPECT_EQ(200, env->GetArrayLength(reinterpret_cast<jarray>(o200)));
1376 EXPECT_EQ(201, env->GetArrayLength(reinterpret_cast<jarray>(o201)));
1377 EXPECT_EQ(202, env->GetArrayLength(reinterpret_cast<jarray>(o202)));
1378 EXPECT_EQ(203, env->GetArrayLength(reinterpret_cast<jarray>(o203)));
1379 EXPECT_EQ(204, env->GetArrayLength(reinterpret_cast<jarray>(o204)));
1380 EXPECT_EQ(205, env->GetArrayLength(reinterpret_cast<jarray>(o205)));
1381 EXPECT_EQ(206, env->GetArrayLength(reinterpret_cast<jarray>(o206)));
1382 EXPECT_EQ(207, env->GetArrayLength(reinterpret_cast<jarray>(o207)));
1383 EXPECT_EQ(208, env->GetArrayLength(reinterpret_cast<jarray>(o208)));
1384 EXPECT_EQ(209, env->GetArrayLength(reinterpret_cast<jarray>(o209)));
1385 EXPECT_EQ(210, env->GetArrayLength(reinterpret_cast<jarray>(o210)));
1386 EXPECT_EQ(211, env->GetArrayLength(reinterpret_cast<jarray>(o211)));
1387 EXPECT_EQ(212, env->GetArrayLength(reinterpret_cast<jarray>(o212)));
1388 EXPECT_EQ(213, env->GetArrayLength(reinterpret_cast<jarray>(o213)));
1389 EXPECT_EQ(214, env->GetArrayLength(reinterpret_cast<jarray>(o214)));
1390 EXPECT_EQ(215, env->GetArrayLength(reinterpret_cast<jarray>(o215)));
1391 EXPECT_EQ(216, env->GetArrayLength(reinterpret_cast<jarray>(o216)));
1392 EXPECT_EQ(217, env->GetArrayLength(reinterpret_cast<jarray>(o217)));
1393 EXPECT_EQ(218, env->GetArrayLength(reinterpret_cast<jarray>(o218)));
1394 EXPECT_EQ(219, env->GetArrayLength(reinterpret_cast<jarray>(o219)));
1395 EXPECT_EQ(220, env->GetArrayLength(reinterpret_cast<jarray>(o220)));
1396 EXPECT_EQ(221, env->GetArrayLength(reinterpret_cast<jarray>(o221)));
1397 EXPECT_EQ(222, env->GetArrayLength(reinterpret_cast<jarray>(o222)));
1398 EXPECT_EQ(223, env->GetArrayLength(reinterpret_cast<jarray>(o223)));
1399 EXPECT_EQ(224, env->GetArrayLength(reinterpret_cast<jarray>(o224)));
1400 EXPECT_EQ(225, env->GetArrayLength(reinterpret_cast<jarray>(o225)));
1401 EXPECT_EQ(226, env->GetArrayLength(reinterpret_cast<jarray>(o226)));
1402 EXPECT_EQ(227, env->GetArrayLength(reinterpret_cast<jarray>(o227)));
1403 EXPECT_EQ(228, env->GetArrayLength(reinterpret_cast<jarray>(o228)));
1404 EXPECT_EQ(229, env->GetArrayLength(reinterpret_cast<jarray>(o229)));
1405 EXPECT_EQ(230, env->GetArrayLength(reinterpret_cast<jarray>(o230)));
1406 EXPECT_EQ(231, env->GetArrayLength(reinterpret_cast<jarray>(o231)));
1407 EXPECT_EQ(232, env->GetArrayLength(reinterpret_cast<jarray>(o232)));
1408 EXPECT_EQ(233, env->GetArrayLength(reinterpret_cast<jarray>(o233)));
1409 EXPECT_EQ(234, env->GetArrayLength(reinterpret_cast<jarray>(o234)));
1410 EXPECT_EQ(235, env->GetArrayLength(reinterpret_cast<jarray>(o235)));
1411 EXPECT_EQ(236, env->GetArrayLength(reinterpret_cast<jarray>(o236)));
1412 EXPECT_EQ(237, env->GetArrayLength(reinterpret_cast<jarray>(o237)));
1413 EXPECT_EQ(238, env->GetArrayLength(reinterpret_cast<jarray>(o238)));
1414 EXPECT_EQ(239, env->GetArrayLength(reinterpret_cast<jarray>(o239)));
1415 EXPECT_EQ(240, env->GetArrayLength(reinterpret_cast<jarray>(o240)));
1416 EXPECT_EQ(241, env->GetArrayLength(reinterpret_cast<jarray>(o241)));
1417 EXPECT_EQ(242, env->GetArrayLength(reinterpret_cast<jarray>(o242)));
1418 EXPECT_EQ(243, env->GetArrayLength(reinterpret_cast<jarray>(o243)));
1419 EXPECT_EQ(244, env->GetArrayLength(reinterpret_cast<jarray>(o244)));
1420 EXPECT_EQ(245, env->GetArrayLength(reinterpret_cast<jarray>(o245)));
1421 EXPECT_EQ(246, env->GetArrayLength(reinterpret_cast<jarray>(o246)));
1422 EXPECT_EQ(247, env->GetArrayLength(reinterpret_cast<jarray>(o247)));
1423 EXPECT_EQ(248, env->GetArrayLength(reinterpret_cast<jarray>(o248)));
1424 EXPECT_EQ(249, env->GetArrayLength(reinterpret_cast<jarray>(o249)));
1425 EXPECT_EQ(250, env->GetArrayLength(reinterpret_cast<jarray>(o250)));
1426 EXPECT_EQ(251, env->GetArrayLength(reinterpret_cast<jarray>(o251)));
1427 EXPECT_EQ(252, env->GetArrayLength(reinterpret_cast<jarray>(o252)));
1428 EXPECT_EQ(253, env->GetArrayLength(reinterpret_cast<jarray>(o253)));
1429 }
1430}
1431
1432const char* longSig =
1433 "(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1434 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1435 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1436 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1437 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1438 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1439 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1440 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1441 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1442 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1443 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1444 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1445 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1446 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1447 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1448 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1449 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1450 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1451 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1452 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1453 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1454 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1455 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1456 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1457 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1458 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1459 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;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;)V";
1484
Andreas Gampe6e498692014-08-18 16:43:12 -07001485void JniCompilerTest::MaxParamNumberImpl() {
Andreas Gampe7a0e5042014-03-07 13:03:19 -08001486 TEST_DISABLED_FOR_PORTABLE();
1487 SetUpForTest(false, "maxParamNumber", longSig,
1488 reinterpret_cast<void*>(&Java_MyClassNatives_maxParamNumber));
1489
1490 jvalue args[254];
1491
1492 // First test: test with all arguments null.
1493 for (int i = 0; i < 254; ++i) {
1494 args[i].l = nullptr;
1495 }
1496
1497 env_->CallNonvirtualVoidMethodA(jobj_, jklass_, jmethod_, args);
1498
1499 // Second test: test with int[] objects with increasing lengths
1500 for (int i = 0; i < 254; ++i) {
1501 jintArray tmp = env_->NewIntArray(i);
1502 args[i].l = tmp;
1503 EXPECT_NE(args[i].l, nullptr);
1504 }
1505
1506 env_->CallNonvirtualVoidMethodA(jobj_, jklass_, jmethod_, args);
1507}
1508
Andreas Gampe6e498692014-08-18 16:43:12 -07001509JNI_TEST(MaxParamNumber)
1510
1511void JniCompilerTest::WithoutImplementationImpl() {
Andreas Gampead615172014-04-04 16:20:13 -07001512 TEST_DISABLED_FOR_PORTABLE();
1513 SetUpForTest(false, "withoutImplementation", "()V", nullptr);
1514
1515 env_->CallVoidMethod(jobj_, jmethod_);
1516
1517 EXPECT_TRUE(Thread::Current()->IsExceptionPending());
1518 EXPECT_TRUE(env_->ExceptionCheck() == JNI_TRUE);
1519}
1520
Andreas Gampe6e498692014-08-18 16:43:12 -07001521JNI_TEST(WithoutImplementation)
1522
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001523void Java_MyClassNatives_stackArgsIntsFirst(JNIEnv* env, jclass klass, jint i1, jint i2, jint i3,
1524 jint i4, jint i5, jint i6, jint i7, jint i8, jint i9,
1525 jint i10, jfloat f1, jfloat f2, jfloat f3, jfloat f4,
1526 jfloat f5, jfloat f6, jfloat f7, jfloat f8, jfloat f9,
1527 jfloat f10) {
1528 EXPECT_EQ(i1, 1);
1529 EXPECT_EQ(i2, 2);
1530 EXPECT_EQ(i3, 3);
1531 EXPECT_EQ(i4, 4);
1532 EXPECT_EQ(i5, 5);
1533 EXPECT_EQ(i6, 6);
1534 EXPECT_EQ(i7, 7);
1535 EXPECT_EQ(i8, 8);
1536 EXPECT_EQ(i9, 9);
1537 EXPECT_EQ(i10, 10);
1538
Andreas Gampec200a4a2014-06-16 18:39:09 -07001539 jint i11 = bit_cast<jfloat, jint>(f1);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001540 EXPECT_EQ(i11, 11);
Andreas Gampec200a4a2014-06-16 18:39:09 -07001541 jint i12 = bit_cast<jfloat, jint>(f2);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001542 EXPECT_EQ(i12, 12);
Andreas Gampec200a4a2014-06-16 18:39:09 -07001543 jint i13 = bit_cast<jfloat, jint>(f3);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001544 EXPECT_EQ(i13, 13);
Andreas Gampec200a4a2014-06-16 18:39:09 -07001545 jint i14 = bit_cast<jfloat, jint>(f4);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001546 EXPECT_EQ(i14, 14);
Andreas Gampec200a4a2014-06-16 18:39:09 -07001547 jint i15 = bit_cast<jfloat, jint>(f5);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001548 EXPECT_EQ(i15, 15);
Andreas Gampec200a4a2014-06-16 18:39:09 -07001549 jint i16 = bit_cast<jfloat, jint>(f6);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001550 EXPECT_EQ(i16, 16);
Andreas Gampec200a4a2014-06-16 18:39:09 -07001551 jint i17 = bit_cast<jfloat, jint>(f7);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001552 EXPECT_EQ(i17, 17);
Andreas Gampec200a4a2014-06-16 18:39:09 -07001553 jint i18 = bit_cast<jfloat, jint>(f8);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001554 EXPECT_EQ(i18, 18);
Andreas Gampec200a4a2014-06-16 18:39:09 -07001555 jint i19 = bit_cast<jfloat, jint>(f9);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001556 EXPECT_EQ(i19, 19);
Andreas Gampec200a4a2014-06-16 18:39:09 -07001557 jint i20 = bit_cast<jfloat, jint>(f10);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001558 EXPECT_EQ(i20, 20);
1559}
1560
Andreas Gampe6e498692014-08-18 16:43:12 -07001561void JniCompilerTest::StackArgsIntsFirstImpl() {
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001562 TEST_DISABLED_FOR_PORTABLE();
1563 SetUpForTest(true, "stackArgsIntsFirst", "(IIIIIIIIIIFFFFFFFFFF)V",
1564 reinterpret_cast<void*>(&Java_MyClassNatives_stackArgsIntsFirst));
1565
1566 jint i1 = 1;
1567 jint i2 = 2;
1568 jint i3 = 3;
1569 jint i4 = 4;
1570 jint i5 = 5;
1571 jint i6 = 6;
1572 jint i7 = 7;
1573 jint i8 = 8;
1574 jint i9 = 9;
1575 jint i10 = 10;
1576
Andreas Gampec200a4a2014-06-16 18:39:09 -07001577 jfloat f1 = bit_cast<jint, jfloat>(11);
1578 jfloat f2 = bit_cast<jint, jfloat>(12);
1579 jfloat f3 = bit_cast<jint, jfloat>(13);
1580 jfloat f4 = bit_cast<jint, jfloat>(14);
1581 jfloat f5 = bit_cast<jint, jfloat>(15);
1582 jfloat f6 = bit_cast<jint, jfloat>(16);
1583 jfloat f7 = bit_cast<jint, jfloat>(17);
1584 jfloat f8 = bit_cast<jint, jfloat>(18);
1585 jfloat f9 = bit_cast<jint, jfloat>(19);
1586 jfloat f10 = bit_cast<jint, jfloat>(20);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001587
1588 env_->CallStaticVoidMethod(jklass_, jmethod_, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, f1, f2,
1589 f3, f4, f5, f6, f7, f8, f9, f10);
1590}
1591
Andreas Gampe6e498692014-08-18 16:43:12 -07001592JNI_TEST(StackArgsIntsFirst)
1593
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001594void Java_MyClassNatives_stackArgsFloatsFirst(JNIEnv* env, jclass klass, jfloat f1, jfloat f2,
1595 jfloat f3, jfloat f4, jfloat f5, jfloat f6, jfloat f7,
1596 jfloat f8, jfloat f9, jfloat f10, jint i1, jint i2,
1597 jint i3, jint i4, jint i5, jint i6, jint i7, jint i8,
1598 jint i9, jint i10) {
1599 EXPECT_EQ(i1, 1);
1600 EXPECT_EQ(i2, 2);
1601 EXPECT_EQ(i3, 3);
1602 EXPECT_EQ(i4, 4);
1603 EXPECT_EQ(i5, 5);
1604 EXPECT_EQ(i6, 6);
1605 EXPECT_EQ(i7, 7);
1606 EXPECT_EQ(i8, 8);
1607 EXPECT_EQ(i9, 9);
1608 EXPECT_EQ(i10, 10);
1609
Andreas Gampec200a4a2014-06-16 18:39:09 -07001610 jint i11 = bit_cast<jfloat, jint>(f1);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001611 EXPECT_EQ(i11, 11);
Andreas Gampec200a4a2014-06-16 18:39:09 -07001612 jint i12 = bit_cast<jfloat, jint>(f2);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001613 EXPECT_EQ(i12, 12);
Andreas Gampec200a4a2014-06-16 18:39:09 -07001614 jint i13 = bit_cast<jfloat, jint>(f3);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001615 EXPECT_EQ(i13, 13);
Andreas Gampec200a4a2014-06-16 18:39:09 -07001616 jint i14 = bit_cast<jfloat, jint>(f4);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001617 EXPECT_EQ(i14, 14);
Andreas Gampec200a4a2014-06-16 18:39:09 -07001618 jint i15 = bit_cast<jfloat, jint>(f5);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001619 EXPECT_EQ(i15, 15);
Andreas Gampec200a4a2014-06-16 18:39:09 -07001620 jint i16 = bit_cast<jfloat, jint>(f6);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001621 EXPECT_EQ(i16, 16);
Andreas Gampec200a4a2014-06-16 18:39:09 -07001622 jint i17 = bit_cast<jfloat, jint>(f7);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001623 EXPECT_EQ(i17, 17);
Andreas Gampec200a4a2014-06-16 18:39:09 -07001624 jint i18 = bit_cast<jfloat, jint>(f8);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001625 EXPECT_EQ(i18, 18);
Andreas Gampec200a4a2014-06-16 18:39:09 -07001626 jint i19 = bit_cast<jfloat, jint>(f9);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001627 EXPECT_EQ(i19, 19);
Andreas Gampec200a4a2014-06-16 18:39:09 -07001628 jint i20 = bit_cast<jfloat, jint>(f10);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001629 EXPECT_EQ(i20, 20);
1630}
1631
Andreas Gampe6e498692014-08-18 16:43:12 -07001632void JniCompilerTest::StackArgsFloatsFirstImpl() {
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001633 TEST_DISABLED_FOR_PORTABLE();
1634 SetUpForTest(true, "stackArgsFloatsFirst", "(FFFFFFFFFFIIIIIIIIII)V",
1635 reinterpret_cast<void*>(&Java_MyClassNatives_stackArgsFloatsFirst));
1636
1637 jint i1 = 1;
1638 jint i2 = 2;
1639 jint i3 = 3;
1640 jint i4 = 4;
1641 jint i5 = 5;
1642 jint i6 = 6;
1643 jint i7 = 7;
1644 jint i8 = 8;
1645 jint i9 = 9;
1646 jint i10 = 10;
1647
Andreas Gampec200a4a2014-06-16 18:39:09 -07001648 jfloat f1 = bit_cast<jint, jfloat>(11);
1649 jfloat f2 = bit_cast<jint, jfloat>(12);
1650 jfloat f3 = bit_cast<jint, jfloat>(13);
1651 jfloat f4 = bit_cast<jint, jfloat>(14);
1652 jfloat f5 = bit_cast<jint, jfloat>(15);
1653 jfloat f6 = bit_cast<jint, jfloat>(16);
1654 jfloat f7 = bit_cast<jint, jfloat>(17);
1655 jfloat f8 = bit_cast<jint, jfloat>(18);
1656 jfloat f9 = bit_cast<jint, jfloat>(19);
1657 jfloat f10 = bit_cast<jint, jfloat>(20);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001658
1659 env_->CallStaticVoidMethod(jklass_, jmethod_, f1, f2, f3, f4, f5, f6, f7, f8, f9, f10, i1, i2, i3,
1660 i4, i5, i6, i7, i8, i9, i10);
1661}
1662
Andreas Gampe6e498692014-08-18 16:43:12 -07001663JNI_TEST(StackArgsFloatsFirst)
1664
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001665void Java_MyClassNatives_stackArgsMixed(JNIEnv* env, jclass klass, jint i1, jfloat f1, jint i2,
1666 jfloat f2, jint i3, jfloat f3, jint i4, jfloat f4, jint i5,
1667 jfloat f5, jint i6, jfloat f6, jint i7, jfloat f7, jint i8,
1668 jfloat f8, jint i9, jfloat f9, jint i10, jfloat f10) {
1669 EXPECT_EQ(i1, 1);
1670 EXPECT_EQ(i2, 2);
1671 EXPECT_EQ(i3, 3);
1672 EXPECT_EQ(i4, 4);
1673 EXPECT_EQ(i5, 5);
1674 EXPECT_EQ(i6, 6);
1675 EXPECT_EQ(i7, 7);
1676 EXPECT_EQ(i8, 8);
1677 EXPECT_EQ(i9, 9);
1678 EXPECT_EQ(i10, 10);
1679
Andreas Gampec200a4a2014-06-16 18:39:09 -07001680 jint i11 = bit_cast<jfloat, jint>(f1);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001681 EXPECT_EQ(i11, 11);
Andreas Gampec200a4a2014-06-16 18:39:09 -07001682 jint i12 = bit_cast<jfloat, jint>(f2);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001683 EXPECT_EQ(i12, 12);
Andreas Gampec200a4a2014-06-16 18:39:09 -07001684 jint i13 = bit_cast<jfloat, jint>(f3);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001685 EXPECT_EQ(i13, 13);
Andreas Gampec200a4a2014-06-16 18:39:09 -07001686 jint i14 = bit_cast<jfloat, jint>(f4);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001687 EXPECT_EQ(i14, 14);
Andreas Gampec200a4a2014-06-16 18:39:09 -07001688 jint i15 = bit_cast<jfloat, jint>(f5);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001689 EXPECT_EQ(i15, 15);
Andreas Gampec200a4a2014-06-16 18:39:09 -07001690 jint i16 = bit_cast<jfloat, jint>(f6);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001691 EXPECT_EQ(i16, 16);
Andreas Gampec200a4a2014-06-16 18:39:09 -07001692 jint i17 = bit_cast<jfloat, jint>(f7);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001693 EXPECT_EQ(i17, 17);
Andreas Gampec200a4a2014-06-16 18:39:09 -07001694 jint i18 = bit_cast<jfloat, jint>(f8);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001695 EXPECT_EQ(i18, 18);
Andreas Gampec200a4a2014-06-16 18:39:09 -07001696 jint i19 = bit_cast<jfloat, jint>(f9);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001697 EXPECT_EQ(i19, 19);
Andreas Gampec200a4a2014-06-16 18:39:09 -07001698 jint i20 = bit_cast<jfloat, jint>(f10);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001699 EXPECT_EQ(i20, 20);
1700}
1701
Andreas Gampe6e498692014-08-18 16:43:12 -07001702void JniCompilerTest::StackArgsMixedImpl() {
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001703 TEST_DISABLED_FOR_PORTABLE();
1704 SetUpForTest(true, "stackArgsMixed", "(IFIFIFIFIFIFIFIFIFIF)V",
1705 reinterpret_cast<void*>(&Java_MyClassNatives_stackArgsMixed));
1706
1707 jint i1 = 1;
1708 jint i2 = 2;
1709 jint i3 = 3;
1710 jint i4 = 4;
1711 jint i5 = 5;
1712 jint i6 = 6;
1713 jint i7 = 7;
1714 jint i8 = 8;
1715 jint i9 = 9;
1716 jint i10 = 10;
1717
Andreas Gampec200a4a2014-06-16 18:39:09 -07001718 jfloat f1 = bit_cast<jint, jfloat>(11);
1719 jfloat f2 = bit_cast<jint, jfloat>(12);
1720 jfloat f3 = bit_cast<jint, jfloat>(13);
1721 jfloat f4 = bit_cast<jint, jfloat>(14);
1722 jfloat f5 = bit_cast<jint, jfloat>(15);
1723 jfloat f6 = bit_cast<jint, jfloat>(16);
1724 jfloat f7 = bit_cast<jint, jfloat>(17);
1725 jfloat f8 = bit_cast<jint, jfloat>(18);
1726 jfloat f9 = bit_cast<jint, jfloat>(19);
1727 jfloat f10 = bit_cast<jint, jfloat>(20);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001728
1729 env_->CallStaticVoidMethod(jklass_, jmethod_, i1, f1, i2, f2, i3, f3, i4, f4, i5, f5, i6, f6, i7,
1730 f7, i8, f8, i9, f9, i10, f10);
1731}
1732
Andreas Gampe6e498692014-08-18 16:43:12 -07001733JNI_TEST(StackArgsMixed)
1734
Ian Rogersb033c752011-07-20 12:22:35 -07001735} // namespace art