blob: 36e252742cca89201f09c058689384edcbd9f6b7 [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>
Igor Murashkin367f3dd2016-09-01 17:00:24 -070018#include <type_traits>
Ian Rogers700a4022014-05-19 16:49:03 -070019
Nicolas Geoffray54accbc2014-08-13 03:40:45 +010020#include <math.h>
21
Mathieu Chartiere401d142015-04-22 13:56:20 -070022#include "art_method-inl.h"
Brian Carlstrom578bbdc2011-07-21 14:07:47 -070023#include "class_linker.h"
Brian Carlstroma1ce1fe2014-02-24 23:23:58 -080024#include "common_compiler_test.h"
Igor Murashkin367f3dd2016-09-01 17:00:24 -070025#include "compiler.h"
Brian Carlstrom578bbdc2011-07-21 14:07:47 -070026#include "dex_file.h"
Elliott Hughes90a33692011-08-30 13:27:07 -070027#include "gtest/gtest.h"
Ian Rogerscdd1d2d2011-08-18 09:58:17 -070028#include "indirect_reference_table.h"
Ian Rogerscdd1d2d2011-08-18 09:58:17 -070029#include "jni_internal.h"
Brian Carlstromdb4d5402011-08-09 12:18:28 -070030#include "mem_map.h"
Ian Rogers4f6ad8a2013-03-18 15:27:28 -070031#include "mirror/class-inl.h"
Ian Rogers2dd0e2c2013-01-24 12:42:14 -080032#include "mirror/class_loader.h"
Ian Rogers2dd0e2c2013-01-24 12:42:14 -080033#include "mirror/object_array-inl.h"
Ian Rogers04d7aa92013-03-16 14:29:17 -070034#include "mirror/object-inl.h"
Ian Rogers2dd0e2c2013-01-24 12:42:14 -080035#include "mirror/stack_trace_element.h"
Dimitry Ivanov5edb0632016-04-29 11:14:25 -070036#include "nativeloader/native_loader.h"
Brian Carlstrom578bbdc2011-07-21 14:07:47 -070037#include "runtime.h"
Ian Rogers00f7d0e2012-07-19 15:28:27 -070038#include "ScopedLocalRef.h"
Mathieu Chartier0795f232016-09-27 18:43:30 -070039#include "scoped_thread_state_change-inl.h"
Brian Carlstrom578bbdc2011-07-21 14:07:47 -070040#include "thread.h"
Ian Rogersb033c752011-07-20 12:22:35 -070041
Elliott Hughesb264f082012-04-06 17:10:10 -070042extern "C" JNIEXPORT jint JNICALL Java_MyClassNatives_bar(JNIEnv*, jobject, jint count) {
Brian Carlstromb9cc1ca2012-01-27 00:57:42 -080043 return count + 1;
44}
45
Elliott Hughesb264f082012-04-06 17:10:10 -070046extern "C" JNIEXPORT jint JNICALL Java_MyClassNatives_sbar(JNIEnv*, jclass, jint count) {
Ian Rogers1cefdbd2012-02-29 09:34:50 -080047 return count + 1;
48}
49
Ian Rogersb033c752011-07-20 12:22:35 -070050namespace art {
51
Igor Murashkin367f3dd2016-09-01 17:00:24 -070052enum class JniKind {
53 kNormal = Compiler::kNone, // Regular kind of un-annotated natives.
54 kFast = Compiler::kFastNative, // Native method annotated with @FastNative.
55 kCritical = Compiler::kCriticalNative, // Native method annotated with @CriticalNative.
56 kCount = Compiler::kCriticalNative + 1 // How many different types of JNIs we can have.
57};
58
59// Used to initialize array sizes that want to have different state per current jni.
60static constexpr size_t kJniKindCount = static_cast<size_t>(JniKind::kCount);
61// Do not use directly, use the helpers instead.
62uint32_t gCurrentJni = static_cast<uint32_t>(JniKind::kNormal);
63
64// Is the current native method under test @CriticalNative?
65static bool IsCurrentJniCritical() {
66 return gCurrentJni == static_cast<uint32_t>(JniKind::kCritical);
67}
68
69// Is the current native method a plain-old non-annotated native?
70static bool IsCurrentJniNormal() {
71 return gCurrentJni == static_cast<uint32_t>(JniKind::kNormal);
72}
73
74// Signifify that a different kind of JNI is about to be tested.
75static void UpdateCurrentJni(JniKind kind) {
76 gCurrentJni = static_cast<uint32_t>(kind);
77}
78
79// (Match the name suffixes of native methods in MyClassNatives.java)
80static std::string CurrentJniStringSuffix() {
81 switch (gCurrentJni) {
82 case static_cast<uint32_t>(JniKind::kNormal): {
83 return "";
84 }
85 case static_cast<uint32_t>(JniKind::kFast): {
86 return "_Fast";
87 }
88 case static_cast<uint32_t>(JniKind::kCritical): {
89 return "_Critical";
90 }
91 default:
92 LOG(FATAL) << "Invalid current JNI value: " << gCurrentJni;
93 UNREACHABLE();
94 }
95}
96
97// Dummy values passed to our JNI handlers when we enter @CriticalNative.
98// Normally @CriticalNative calling convention strips out the "JNIEnv*, jclass" parameters.
99// However to avoid duplicating every single test method we have a templated handler
100// that inserts dummy parameters (0,1) to make it compatible with a regular JNI handler.
101static JNIEnv* const kCriticalDummyJniEnv = reinterpret_cast<JNIEnv*>(0xDEADFEAD);
102static jclass const kCriticalDummyJniClass = reinterpret_cast<jclass>(0xBEAFBEEF);
103
104// Type trait. Returns true if "T" is the same type as one of the types in Args...
105//
106// Logically equal to OR(std::same_type<T, U> for all U in Args).
107template <typename T, typename ... Args>
108struct is_any_of;
109
110template <typename T, typename U, typename ... Args>
111struct is_any_of<T, U, Args ...> {
112 using value_type = bool;
113 static constexpr const bool value = std::is_same<T, U>::value || is_any_of<T, Args ...>::value;
114};
115
116template <typename T, typename U>
117struct is_any_of<T, U> {
118 using value_type = bool;
119 static constexpr const bool value = std::is_same<T, U>::value;
120};
121
122// Type traits for JNI types.
123template <typename T>
124struct jni_type_traits {
125 // True if type T ends up holding an object reference. False otherwise.
126 // (Non-JNI types will also be false).
127 static constexpr const bool is_ref =
128 is_any_of<T, jclass, jobject, jstring, jobjectArray, jintArray,
129 jcharArray, jfloatArray, jshortArray, jdoubleArray, jlongArray>::value;
130};
131
132template <typename ... Args>
133struct count_refs_helper {
134 using value_type = size_t;
135 static constexpr const size_t value = 0;
136};
137
138template <typename Arg, typename ... Args>
139struct count_refs_helper<Arg, Args ...> {
140 using value_type = size_t;
141 static constexpr size_t value =
142 (jni_type_traits<Arg>::is_ref ? 1 : 0) + count_refs_helper<Args ...>::value;
143};
144
145template <typename T, T fn>
146struct count_refs_fn_helper;
147
148template <typename R, typename ... Args, R fn(Args...)>
149struct count_refs_fn_helper<R(Args...), fn> : public count_refs_helper<Args...> {};
150
151// Given a function type 'T' figure out how many of the parameter types are a reference.
152// -- The implicit jclass and thisObject also count as 1 reference.
153//
154// Fields:
155// * value - the result counting # of refs
156// * value_type - the type of value (size_t)
157template <typename T, T fn>
158struct count_refs : public count_refs_fn_helper<T, fn> {};
159
160// Base case: No parameters = 0 refs.
161size_t count_nonnull_refs_helper() {
162 return 0;
163}
164
165// SFINAE for ref types. 1 if non-null, 0 otherwise.
166template <typename T>
167size_t count_nonnull_refs_single_helper(T arg,
168 typename std::enable_if<jni_type_traits<T>::is_ref>::type*
169 = nullptr) {
170 return ((arg == NULL) ? 0 : 1);
171}
172
173// SFINAE for non-ref-types. Always 0.
174template <typename T>
175size_t count_nonnull_refs_single_helper(T arg ATTRIBUTE_UNUSED,
176 typename std::enable_if<!jni_type_traits<T>::is_ref>::type*
177 = nullptr) {
178 return 0;
179}
180
181// Recursive case.
182template <typename T, typename ... Args>
183size_t count_nonnull_refs_helper(T arg, Args ... args) {
184 return count_nonnull_refs_single_helper(arg) + count_nonnull_refs_helper(args...);
185}
186
187// Given any list of parameters, check how many object refs there are and only count
188// them if their runtime value is non-null.
189//
190// For example given (jobject, jint, jclass) we can get (2) if both #0/#2 are non-null,
191// (1) if either #0/#2 are null but not both, and (0) if all parameters are null.
192// Primitive parameters (including JNIEnv*, if present) are ignored.
193template <typename ... Args>
194size_t count_nonnull_refs(Args ... args) {
195 return count_nonnull_refs_helper(args...);
196}
197
198template <typename T, T fn>
199struct remove_extra_parameters_helper;
200
201template <typename R, typename Arg1, typename Arg2, typename ... Args, R fn(Arg1, Arg2, Args...)>
202struct remove_extra_parameters_helper<R(Arg1, Arg2, Args...), fn> {
203 // Note: Do not use Args&& here to maintain C-style parameter types.
204 static R apply(Args... args) {
205 JNIEnv* env = kCriticalDummyJniEnv;
206 jclass kls = kCriticalDummyJniClass;
207 return fn(env, kls, args...);
208 }
209};
210
211// Given a function 'fn' create a function 'apply' which will omit the JNIEnv/jklass parameters
212//
213// i.e. if fn(JNIEnv*,jklass,a,b,c,d,e...) then apply(a,b,c,d,e,...)
214template <typename T, T fn>
215struct jni_remove_extra_parameters : public remove_extra_parameters_helper<T, fn> {};
216
Brian Carlstroma1ce1fe2014-02-24 23:23:58 -0800217class JniCompilerTest : public CommonCompilerTest {
Ian Rogersb033c752011-07-20 12:22:35 -0700218 protected:
Andreas Gampe6e498692014-08-18 16:43:12 -0700219 void SetUp() OVERRIDE {
220 CommonCompilerTest::SetUp();
221 check_generic_jni_ = false;
222 }
223
Dimitry Ivanov5edb0632016-04-29 11:14:25 -0700224 void TearDown() OVERRIDE {
225 android::ResetNativeLoader();
226 CommonCompilerTest::TearDown();
227 }
228
Andreas Gampe6e498692014-08-18 16:43:12 -0700229 void SetCheckGenericJni(bool generic) {
230 check_generic_jni_ = generic;
231 }
232
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700233 private:
234 void CompileForTest(jobject class_loader,
235 bool direct,
236 const char* method_name,
237 const char* method_sig) {
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700238 ScopedObjectAccess soa(Thread::Current());
Mathieu Chartiereb8167a2014-05-07 15:43:14 -0700239 StackHandleScope<1> hs(soa.Self());
240 Handle<mirror::ClassLoader> loader(
Mathieu Chartier0795f232016-09-27 18:43:30 -0700241 hs.NewHandle(soa.Decode<mirror::ClassLoader>(class_loader)));
Brian Carlstrom25c33252011-09-18 15:58:35 -0700242 // Compile the native method before starting the runtime
Ian Rogers98379392014-02-24 16:53:16 -0800243 mirror::Class* c = class_linker_->FindClass(soa.Self(), "LMyClassNatives;", loader);
Mathieu Chartiere401d142015-04-22 13:56:20 -0700244 const auto pointer_size = class_linker_->GetImagePointerSize();
245 ArtMethod* method = direct ? c->FindDirectMethod(method_name, method_sig, pointer_size) :
246 c->FindVirtualMethod(method_name, method_sig, pointer_size);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700247 ASSERT_TRUE(method != nullptr) << method_name << " " << method_sig;
Andreas Gampe6e498692014-08-18 16:43:12 -0700248 if (check_generic_jni_) {
Ian Rogers6f3dbba2014-10-14 17:41:57 -0700249 method->SetEntryPointFromQuickCompiledCode(class_linker_->GetRuntimeQuickGenericJniStub());
Nicolas Geoffray54accbc2014-08-13 03:40:45 +0100250 } else {
Ian Rogers6f3dbba2014-10-14 17:41:57 -0700251 const void* code = method->GetEntryPointFromQuickCompiledCode();
252 if (code == nullptr || class_linker_->IsQuickGenericJniStub(code)) {
Nicolas Geoffray54accbc2014-08-13 03:40:45 +0100253 CompileMethod(method);
254 ASSERT_TRUE(method->GetEntryPointFromQuickCompiledCode() != nullptr)
255 << method_name << " " << method_sig;
Nicolas Geoffray54accbc2014-08-13 03:40:45 +0100256 }
Brian Carlstrom25c33252011-09-18 15:58:35 -0700257 }
Brian Carlstrom25c33252011-09-18 15:58:35 -0700258 }
259
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700260 protected:
261 void CompileForTestWithCurrentJni(jobject class_loader,
262 bool direct,
263 const char* method_name_orig,
264 const char* method_sig) {
265 // Append the JNI kind to the method name, so that we automatically get the
266 // fast or critical versions of the same method.
267 std::string method_name_str = std::string(method_name_orig) + CurrentJniStringSuffix();
268 const char* method_name = method_name_str.c_str();
269
270 CompileForTest(class_loader, direct, method_name, method_sig);
271 }
272
273 void SetUpForTest(bool direct,
274 const char* method_name_orig,
275 const char* method_sig,
Andreas Gampe6e498692014-08-18 16:43:12 -0700276 void* native_fnptr) {
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700277 // Append the JNI kind to the method name, so that we automatically get the
278 // fast or critical versions of the same method.
279 std::string method_name_str = std::string(method_name_orig) + CurrentJniStringSuffix();
280 const char* method_name = method_name_str.c_str();
281
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700282 // Initialize class loader and compile method when runtime not started.
Brian Carlstrom2ce745c2013-07-17 17:44:30 -0700283 if (!runtime_->IsStarted()) {
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700284 {
285 ScopedObjectAccess soa(Thread::Current());
286 class_loader_ = LoadDex("MyClassNatives");
287 }
Andreas Gampe6e498692014-08-18 16:43:12 -0700288 CompileForTest(class_loader_, direct, method_name, method_sig);
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700289 // Start runtime.
290 Thread::Current()->TransitionFromSuspendedToRunnable();
Dimitry Ivanov5edb0632016-04-29 11:14:25 -0700291 android::InitializeNativeLoader();
Dimitry Ivanovc544f342016-05-09 16:26:13 -0700292 bool started = runtime_->Start();
Brian Carlstrombd86bcc2013-03-10 20:26:16 -0700293 CHECK(started);
Brian Carlstrom25c33252011-09-18 15:58:35 -0700294 }
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700295 // JNI operations after runtime start.
Brian Carlstrom25c33252011-09-18 15:58:35 -0700296 env_ = Thread::Current()->GetJniEnv();
Dimitry Ivanov5edb0632016-04-29 11:14:25 -0700297 library_search_path_ = env_->NewStringUTF("");
Elliott Hughesb264f082012-04-06 17:10:10 -0700298 jklass_ = env_->FindClass("MyClassNatives");
Andreas Gampecf4035a2014-05-28 22:43:01 -0700299 ASSERT_TRUE(jklass_ != nullptr) << method_name << " " << method_sig;
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700300
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700301 if (direct) {
302 jmethod_ = env_->GetStaticMethodID(jklass_, method_name, method_sig);
303 } else {
304 jmethod_ = env_->GetMethodID(jklass_, method_name, method_sig);
305 }
Andreas Gampecf4035a2014-05-28 22:43:01 -0700306 ASSERT_TRUE(jmethod_ != nullptr) << method_name << " " << method_sig;
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700307
Andreas Gampecf4035a2014-05-28 22:43:01 -0700308 if (native_fnptr != nullptr) {
Elliott Hughesb25c3f62012-03-26 16:35:06 -0700309 JNINativeMethod methods[] = { { method_name, method_sig, native_fnptr } };
Brian Carlstromfc7120c2012-08-27 13:43:25 -0700310 ASSERT_EQ(JNI_OK, env_->RegisterNatives(jklass_, methods, 1))
311 << method_name << " " << method_sig;
Ian Rogersbdb03912011-09-14 00:55:44 -0700312 } else {
313 env_->UnregisterNatives(jklass_);
Shih-wei Liao31384c52011-09-06 15:27:45 -0700314 }
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700315
316 jmethodID constructor = env_->GetMethodID(jklass_, "<init>", "()V");
317 jobj_ = env_->NewObject(jklass_, constructor);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700318 ASSERT_TRUE(jobj_ != nullptr) << method_name << " " << method_sig;
Ian Rogersb033c752011-07-20 12:22:35 -0700319 }
320
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700321 public:
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700322 // Available as statics so our JNI handlers can access these.
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700323 static jclass jklass_;
324 static jobject jobj_;
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700325 static jobject class_loader_;
326
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700327 protected:
Andreas Gampe6e498692014-08-18 16:43:12 -0700328 // We have to list the methods here so we can share them between default and generic JNI.
329 void CompileAndRunNoArgMethodImpl();
330 void CompileAndRunIntMethodThroughStubImpl();
331 void CompileAndRunStaticIntMethodThroughStubImpl();
332 void CompileAndRunIntMethodImpl();
333 void CompileAndRunIntIntMethodImpl();
334 void CompileAndRunLongLongMethodImpl();
335 void CompileAndRunDoubleDoubleMethodImpl();
336 void CompileAndRun_fooJJ_synchronizedImpl();
337 void CompileAndRunIntObjectObjectMethodImpl();
338 void CompileAndRunStaticIntIntMethodImpl();
339 void CompileAndRunStaticDoubleDoubleMethodImpl();
340 void RunStaticLogDoubleMethodImpl();
341 void RunStaticLogFloatMethodImpl();
342 void RunStaticReturnTrueImpl();
343 void RunStaticReturnFalseImpl();
344 void RunGenericStaticReturnIntImpl();
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700345 void RunGenericStaticReturnDoubleImpl();
346 void RunGenericStaticReturnLongImpl();
Andreas Gampe6e498692014-08-18 16:43:12 -0700347 void CompileAndRunStaticIntObjectObjectMethodImpl();
348 void CompileAndRunStaticSynchronizedIntObjectObjectMethodImpl();
349 void ExceptionHandlingImpl();
350 void NativeStackTraceElementImpl();
351 void ReturnGlobalRefImpl();
352 void LocalReferenceTableClearingTestImpl();
353 void JavaLangSystemArrayCopyImpl();
354 void CompareAndSwapIntImpl();
355 void GetTextImpl();
356 void GetSinkPropertiesNativeImpl();
357 void UpcallReturnTypeChecking_InstanceImpl();
358 void UpcallReturnTypeChecking_StaticImpl();
359 void UpcallArgumentTypeChecking_InstanceImpl();
360 void UpcallArgumentTypeChecking_StaticImpl();
361 void CompileAndRunFloatFloatMethodImpl();
362 void CheckParameterAlignImpl();
363 void MaxParamNumberImpl();
364 void WithoutImplementationImpl();
Andreas Gampe48ee3562015-04-10 19:57:29 -0700365 void WithoutImplementationRefReturnImpl();
Andreas Gampe6e498692014-08-18 16:43:12 -0700366 void StackArgsIntsFirstImpl();
367 void StackArgsFloatsFirstImpl();
368 void StackArgsMixedImpl();
Lazar Trsicf652d602015-06-24 16:30:21 +0200369 void StackArgsSignExtendedMips64Impl();
Andreas Gampe6e498692014-08-18 16:43:12 -0700370
Igor Murashkin9d4b6da2016-07-29 09:51:58 -0700371 void NormalNativeImpl();
372 void FastNativeImpl();
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700373 void CriticalNativeImpl();
Igor Murashkin9d4b6da2016-07-29 09:51:58 -0700374
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700375 JNIEnv* env_;
Dimitry Ivanov5edb0632016-04-29 11:14:25 -0700376 jstring library_search_path_;
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700377 jmethodID jmethod_;
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700378
379 private:
Andreas Gampe6e498692014-08-18 16:43:12 -0700380 bool check_generic_jni_;
Ian Rogersb033c752011-07-20 12:22:35 -0700381};
382
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700383jclass JniCompilerTest::jklass_;
384jobject JniCompilerTest::jobj_;
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700385jobject JniCompilerTest::class_loader_;
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700386
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700387// Test the normal compiler and normal generic JNI only.
388// The following features are unsupported in @FastNative:
389// 1) JNI stubs (lookup via dlsym) when methods aren't explicitly registered
390// 2) Returning objects from the JNI function
391// 3) synchronized keyword
392// -- TODO: We can support (1) if we remove the mutator lock assert during stub lookup.
393# define JNI_TEST_NORMAL_ONLY(TestName) \
Igor Murashkin06a04e02016-09-13 15:57:37 -0700394 TEST_F(JniCompilerTest, TestName ## NormalCompiler) { \
Igor Murashkina51d8b72016-10-05 14:33:30 -0700395 ScopedCheckHandleScope top_handle_scope_check; \
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700396 SCOPED_TRACE("Normal JNI with compiler"); \
397 gCurrentJni = static_cast<uint32_t>(JniKind::kNormal); \
Andreas Gampe6e498692014-08-18 16:43:12 -0700398 TestName ## Impl(); \
399 } \
Igor Murashkin06a04e02016-09-13 15:57:37 -0700400 TEST_F(JniCompilerTest, TestName ## NormalGeneric) { \
Igor Murashkina51d8b72016-10-05 14:33:30 -0700401 ScopedCheckHandleScope top_handle_scope_check; \
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700402 SCOPED_TRACE("Normal JNI with generic"); \
403 gCurrentJni = static_cast<uint32_t>(JniKind::kNormal); \
Andreas Gampe6e498692014-08-18 16:43:12 -0700404 TEST_DISABLED_FOR_MIPS(); \
405 SetCheckGenericJni(true); \
406 TestName ## Impl(); \
407 }
Andreas Gampecf4035a2014-05-28 22:43:01 -0700408
Igor Murashkin06a04e02016-09-13 15:57:37 -0700409// Test (normal, @FastNative) x (compiler, generic).
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700410#define JNI_TEST(TestName) \
411 JNI_TEST_NORMAL_ONLY(TestName) \
Igor Murashkin06a04e02016-09-13 15:57:37 -0700412 TEST_F(JniCompilerTest, TestName ## FastCompiler) { \
Igor Murashkina51d8b72016-10-05 14:33:30 -0700413 ScopedCheckHandleScope top_handle_scope_check; \
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700414 SCOPED_TRACE("@FastNative JNI with compiler"); \
415 gCurrentJni = static_cast<uint32_t>(JniKind::kFast); \
416 TestName ## Impl(); \
417 } \
Igor Murashkin06a04e02016-09-13 15:57:37 -0700418 \
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700419 TEST_F(JniCompilerTest, TestName ## FastGeneric) { \
Igor Murashkina51d8b72016-10-05 14:33:30 -0700420 ScopedCheckHandleScope top_handle_scope_check; \
Igor Murashkin06a04e02016-09-13 15:57:37 -0700421 SCOPED_TRACE("@FastNative JNI with generic"); \
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700422 gCurrentJni = static_cast<uint32_t>(JniKind::kFast); \
423 TEST_DISABLED_FOR_MIPS(); \
424 SetCheckGenericJni(true); \
425 TestName ## Impl(); \
426 }
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700427
Igor Murashkin06a04e02016-09-13 15:57:37 -0700428// Test (@CriticalNative) x (compiler, generic) only.
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700429#define JNI_TEST_CRITICAL_ONLY(TestName) \
Igor Murashkin06a04e02016-09-13 15:57:37 -0700430 TEST_F(JniCompilerTest, TestName ## CriticalCompiler) { \
Igor Murashkina51d8b72016-10-05 14:33:30 -0700431 ScopedCheckHandleScope top_handle_scope_check; \
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700432 SCOPED_TRACE("@CriticalNative JNI with compiler"); \
433 gCurrentJni = static_cast<uint32_t>(JniKind::kCritical); \
434 TestName ## Impl(); \
Igor Murashkin06a04e02016-09-13 15:57:37 -0700435 } \
436 TEST_F(JniCompilerTest, TestName ## CriticalGeneric) { \
Igor Murashkina51d8b72016-10-05 14:33:30 -0700437 ScopedCheckHandleScope top_handle_scope_check; \
Igor Murashkin06a04e02016-09-13 15:57:37 -0700438 SCOPED_TRACE("@CriticalNative JNI with generic"); \
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700439 gCurrentJni = static_cast<uint32_t>(JniKind::kCritical); \
Igor Murashkin294a9152016-09-28 13:23:19 -0700440 SetCheckGenericJni(true); \
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700441 TestName ## Impl(); \
442 }
Igor Murashkin06a04e02016-09-13 15:57:37 -0700443
444// Test everything: (normal, @FastNative, @CriticalNative) x (compiler, generic).
445#define JNI_TEST_CRITICAL(TestName) \
446 JNI_TEST(TestName) \
447 JNI_TEST_CRITICAL_ONLY(TestName) \
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700448
449static void expectValidThreadState() {
450 // Normal JNI always transitions to "Native". Other JNIs stay in the "Runnable" state.
451 if (IsCurrentJniNormal()) {
452 EXPECT_EQ(kNative, Thread::Current()->GetState());
453 } else {
454 EXPECT_EQ(kRunnable, Thread::Current()->GetState());
455 }
456}
457
458#define EXPECT_THREAD_STATE_FOR_CURRENT_JNI() expectValidThreadState()
459
460static void expectValidMutatorLockHeld() {
461 if (IsCurrentJniNormal()) {
462 Locks::mutator_lock_->AssertNotHeld(Thread::Current());
463 } else {
464 Locks::mutator_lock_->AssertSharedHeld(Thread::Current());
465 }
466}
467
468#define EXPECT_MUTATOR_LOCK_FOR_CURRENT_JNI() expectValidMutatorLockHeld()
469
470static void expectValidJniEnvAndObject(JNIEnv* env, jobject thisObj) {
471 if (!IsCurrentJniCritical()) {
472 EXPECT_EQ(Thread::Current()->GetJniEnv(), env);
473 ASSERT_TRUE(thisObj != nullptr);
474 EXPECT_TRUE(env->IsInstanceOf(thisObj, JniCompilerTest::jklass_));
475 } else {
476 LOG(FATAL) << "Objects are not supported for @CriticalNative, why is this being tested?";
477 UNREACHABLE();
478 }
479}
480
481// Validates the JNIEnv to be the same as the current thread's JNIEnv, and makes sure
482// that the object here is an instance of the class we registered the method with.
483//
484// Hard-fails if this somehow gets invoked for @CriticalNative since objects are unsupported.
485#define EXPECT_JNI_ENV_AND_OBJECT_FOR_CURRENT_JNI(env, thisObj) \
486 expectValidJniEnvAndObject(env, thisObj)
487
488static void expectValidJniEnvAndClass(JNIEnv* env, jclass kls) {
489 if (!IsCurrentJniCritical()) {
490 EXPECT_EQ(Thread::Current()->GetJniEnv(), env);
491 ASSERT_TRUE(kls != nullptr);
492 EXPECT_TRUE(env->IsSameObject(static_cast<jobject>(JniCompilerTest::jklass_),
493 static_cast<jobject>(kls)));
494 } else {
495 // This is pretty much vacuously true but catch any testing setup mistakes.
496 EXPECT_EQ(env, kCriticalDummyJniEnv);
497 EXPECT_EQ(kls, kCriticalDummyJniClass);
498 }
499}
500
501// Validates the JNIEnv is the same as the current thread's JNIenv, and makes sure
502// that the jclass we got in the JNI handler is the same one as the class the method was looked
503// up for.
504//
505// (Checks are skipped for @CriticalNative since the two values are dummy).
506#define EXPECT_JNI_ENV_AND_CLASS_FOR_CURRENT_JNI(env, kls) expectValidJniEnvAndClass(env, kls)
507
508// Temporarily disable the EXPECT_NUM_STACK_REFERENCES check (for a single test).
509struct ScopedDisableCheckNumStackReferences {
510 ScopedDisableCheckNumStackReferences() {
Igor Murashkin06a04e02016-09-13 15:57:37 -0700511 CHECK(sCheckNumStackReferences); // No nested support.
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700512 sCheckNumStackReferences = false;
513 }
514
515 ~ScopedDisableCheckNumStackReferences() {
516 sCheckNumStackReferences = true;
517 }
518
519 static bool sCheckNumStackReferences;
520};
521
522bool ScopedDisableCheckNumStackReferences::sCheckNumStackReferences = true;
523
Igor Murashkina51d8b72016-10-05 14:33:30 -0700524// Check that the handle scope at the start of this block is the same as the handle scope at the end of the block.
525struct ScopedCheckHandleScope {
Igor Murashkin42298112016-10-06 10:51:11 -0700526 ScopedCheckHandleScope() : handle_scope_(Thread::Current()->GetTopHandleScope()) {
Igor Murashkina51d8b72016-10-05 14:33:30 -0700527 }
528
529 ~ScopedCheckHandleScope() {
530 EXPECT_EQ(handle_scope_, Thread::Current()->GetTopHandleScope())
531 << "Top-most handle scope must be the same after all the JNI "
532 << "invocations have finished (as before they were invoked).";
533 }
534
Igor Murashkin42298112016-10-06 10:51:11 -0700535 HandleScope* const handle_scope_;
Igor Murashkina51d8b72016-10-05 14:33:30 -0700536};
537
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700538static void expectNumStackReferences(size_t val1, size_t val2) {
539 // In rare cases when JNI functions call themselves recursively,
540 // disable this test because it will have a false negative.
541 if (!IsCurrentJniCritical() && ScopedDisableCheckNumStackReferences::sCheckNumStackReferences) {
542 /* @CriticalNative doesn't build a HandleScope, so this test is meaningless then. */
543 ScopedObjectAccess soa(Thread::Current());
544
545 size_t actual_num = Thread::Current()->NumStackReferences();
546 // XX: Not too sure what's going on.
547 // Sometimes null references get placed and sometimes they don't?
548 EXPECT_TRUE(val1 == actual_num || val2 == actual_num)
549 << "expected either " << val1 << " or " << val2
550 << " number of stack references, but got: " << actual_num;
551 }
552}
553
554#define EXPECT_NUM_STACK_REFERENCES(val1, val2) expectNumStackReferences(val1, val2)
555
556template <typename T, T fn>
557struct make_jni_test_decorator;
558
559// Decorator for "static" JNI callbacks.
560template <typename R, typename ... Args, R fn(JNIEnv*, jclass, Args...)>
561struct make_jni_test_decorator<R(JNIEnv*, jclass kls, Args...), fn> {
562 static R apply(JNIEnv* env, jclass kls, Args ... args) {
563 EXPECT_THREAD_STATE_FOR_CURRENT_JNI();
564 EXPECT_MUTATOR_LOCK_FOR_CURRENT_JNI();
565 EXPECT_JNI_ENV_AND_CLASS_FOR_CURRENT_JNI(env, kls);
566 // All incoming parameters + the jclass get put into the transition's StackHandleScope.
567 EXPECT_NUM_STACK_REFERENCES(count_nonnull_refs(kls, args...),
568 (count_refs_helper<jclass, Args...>::value));
569
570 return fn(env, kls, args...);
571 }
572};
573
574// Decorator for instance JNI callbacks.
575template <typename R, typename ... Args, R fn(JNIEnv*, jobject, Args...)>
576struct make_jni_test_decorator<R(JNIEnv*, jobject, Args...), fn> {
577 static R apply(JNIEnv* env, jobject thisObj, Args ... args) {
578 EXPECT_THREAD_STATE_FOR_CURRENT_JNI();
579 EXPECT_MUTATOR_LOCK_FOR_CURRENT_JNI();
580 EXPECT_JNI_ENV_AND_OBJECT_FOR_CURRENT_JNI(env, thisObj);
581 // All incoming parameters + the implicit 'this' get put into the transition's StackHandleScope.
582 EXPECT_NUM_STACK_REFERENCES(count_nonnull_refs(thisObj, args...),
583 (count_refs_helper<jobject, Args...>::value));
584
585 return fn(env, thisObj, args...);
586 }
587};
588
589// Decorate the regular JNI callee with the extra gtest checks.
590// This way we can have common test logic for everything generic like checking if a lock is held,
591// checking handle scope state, etc.
592#define MAKE_JNI_TEST_DECORATOR(fn) make_jni_test_decorator<decltype(fn), (fn)>::apply
593
594// Convert function f(JNIEnv*,jclass,a,b,c,d...) into f2(a,b,c,d...)
595// -- This way we don't have to write out each implementation twice for @CriticalNative.
596#define JNI_CRITICAL_WRAPPER(func) jni_remove_extra_parameters<decltype(func), (func)>::apply
597// Get a function pointer whose calling convention either matches a regular native
598// or a critical native depending on which kind of jni is currently under test.
599// -- This also has the benefit of genering a compile time error if the 'func' doesn't properly
600// have JNIEnv and jclass parameters first.
601#define CURRENT_JNI_WRAPPER(func) \
602 (IsCurrentJniCritical() \
603 ? reinterpret_cast<void*>(&JNI_CRITICAL_WRAPPER(MAKE_JNI_TEST_DECORATOR(func))) \
604 : reinterpret_cast<void*>(&MAKE_JNI_TEST_DECORATOR(func)))
605
606// Do the opposite of the above. Do *not* wrap the function, instead just cast it to a void*.
607// Only for "TEST_JNI_NORMAL_ONLY" configs, and it inserts a test assert to ensure this is the case.
608#define NORMAL_JNI_ONLY_NOWRAP(func) \
609 ({ ASSERT_TRUE(IsCurrentJniNormal()); reinterpret_cast<void*>(&(func)); })
610// Same as above, but with nullptr. When we want to test the stub functionality.
611#define NORMAL_JNI_ONLY_NULLPTR \
612 ({ ASSERT_TRUE(IsCurrentJniNormal()); nullptr; })
613
614
615int gJava_MyClassNatives_foo_calls[kJniKindCount] = {};
616void Java_MyClassNatives_foo(JNIEnv*, jobject) {
617 gJava_MyClassNatives_foo_calls[gCurrentJni]++;
Ian Rogersb033c752011-07-20 12:22:35 -0700618}
619
Andreas Gampe6e498692014-08-18 16:43:12 -0700620void JniCompilerTest::CompileAndRunNoArgMethodImpl() {
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700621 SetUpForTest(false, "foo", "()V", CURRENT_JNI_WRAPPER(Java_MyClassNatives_foo));
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700622
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700623 EXPECT_EQ(0, gJava_MyClassNatives_foo_calls[gCurrentJni]);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700624 env_->CallNonvirtualVoidMethod(jobj_, jklass_, jmethod_);
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700625 EXPECT_EQ(1, gJava_MyClassNatives_foo_calls[gCurrentJni]);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700626 env_->CallNonvirtualVoidMethod(jobj_, jklass_, jmethod_);
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700627 EXPECT_EQ(2, gJava_MyClassNatives_foo_calls[gCurrentJni]);
Andreas Gampe6e498692014-08-18 16:43:12 -0700628
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700629 gJava_MyClassNatives_foo_calls[gCurrentJni] = 0;
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700630}
631
Andreas Gampe6e498692014-08-18 16:43:12 -0700632JNI_TEST(CompileAndRunNoArgMethod)
633
634void JniCompilerTest::CompileAndRunIntMethodThroughStubImpl() {
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700635 SetUpForTest(false, "bar", "(I)I", NORMAL_JNI_ONLY_NULLPTR);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700636 // calling through stub will link with &Java_MyClassNatives_bar
Shih-wei Liao31384c52011-09-06 15:27:45 -0700637
Shih-wei Liao31384c52011-09-06 15:27:45 -0700638 std::string reason;
Dmitriy Ivanovf5a30992015-11-11 14:18:55 -0800639 ASSERT_TRUE(Runtime::Current()->GetJavaVM()->
Dimitry Ivanov5edb0632016-04-29 11:14:25 -0700640 LoadNativeLibrary(env_, "", class_loader_, library_search_path_, &reason))
Ian Rogers68d8b422014-07-17 11:09:10 -0700641 << reason;
Shih-wei Liao31384c52011-09-06 15:27:45 -0700642
643 jint result = env_->CallNonvirtualIntMethod(jobj_, jklass_, jmethod_, 24);
644 EXPECT_EQ(25, result);
645}
646
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700647// TODO: Support @FastNative and @CriticalNative through stubs.
648JNI_TEST_NORMAL_ONLY(CompileAndRunIntMethodThroughStub)
Andreas Gampe6e498692014-08-18 16:43:12 -0700649
650void JniCompilerTest::CompileAndRunStaticIntMethodThroughStubImpl() {
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700651 SetUpForTest(true, "sbar", "(I)I", NORMAL_JNI_ONLY_NULLPTR);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700652 // calling through stub will link with &Java_MyClassNatives_sbar
Ian Rogers1cefdbd2012-02-29 09:34:50 -0800653
654 std::string reason;
Dmitriy Ivanovf5a30992015-11-11 14:18:55 -0800655 ASSERT_TRUE(Runtime::Current()->GetJavaVM()->
Dimitry Ivanov5edb0632016-04-29 11:14:25 -0700656 LoadNativeLibrary(env_, "", class_loader_, library_search_path_, &reason))
Ian Rogers68d8b422014-07-17 11:09:10 -0700657 << reason;
Ian Rogers1cefdbd2012-02-29 09:34:50 -0800658
659 jint result = env_->CallStaticIntMethod(jklass_, jmethod_, 42);
660 EXPECT_EQ(43, result);
661}
662
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700663// TODO: Support @FastNative and @CriticalNative through stubs.
664JNI_TEST_NORMAL_ONLY(CompileAndRunStaticIntMethodThroughStub)
Andreas Gampe6e498692014-08-18 16:43:12 -0700665
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700666int gJava_MyClassNatives_fooI_calls[kJniKindCount] = {};
667jint Java_MyClassNatives_fooI(JNIEnv*, jobject, jint x) {
668 gJava_MyClassNatives_fooI_calls[gCurrentJni]++;
Ian Rogersb033c752011-07-20 12:22:35 -0700669 return x;
670}
671
Andreas Gampe6e498692014-08-18 16:43:12 -0700672void JniCompilerTest::CompileAndRunIntMethodImpl() {
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700673 SetUpForTest(false, "fooI", "(I)I",
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700674 CURRENT_JNI_WRAPPER(Java_MyClassNatives_fooI));
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700675
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700676 EXPECT_EQ(0, gJava_MyClassNatives_fooI_calls[gCurrentJni]);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700677 jint result = env_->CallNonvirtualIntMethod(jobj_, jklass_, jmethod_, 42);
678 EXPECT_EQ(42, result);
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700679 EXPECT_EQ(1, gJava_MyClassNatives_fooI_calls[gCurrentJni]);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700680 result = env_->CallNonvirtualIntMethod(jobj_, jklass_, jmethod_, 0xCAFED00D);
681 EXPECT_EQ(static_cast<jint>(0xCAFED00D), result);
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700682 EXPECT_EQ(2, gJava_MyClassNatives_fooI_calls[gCurrentJni]);
Andreas Gampe6e498692014-08-18 16:43:12 -0700683
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700684 gJava_MyClassNatives_fooI_calls[gCurrentJni] = 0;
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700685}
686
Andreas Gampe6e498692014-08-18 16:43:12 -0700687JNI_TEST(CompileAndRunIntMethod)
688
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700689int gJava_MyClassNatives_fooII_calls[kJniKindCount] = {};
690jint Java_MyClassNatives_fooII(JNIEnv*, jobject, jint x, jint y) {
691 gJava_MyClassNatives_fooII_calls[gCurrentJni]++;
Ian Rogersb033c752011-07-20 12:22:35 -0700692 return x - y; // non-commutative operator
693}
694
Andreas Gampe6e498692014-08-18 16:43:12 -0700695void JniCompilerTest::CompileAndRunIntIntMethodImpl() {
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700696 SetUpForTest(false, "fooII", "(II)I",
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700697 CURRENT_JNI_WRAPPER(Java_MyClassNatives_fooII));
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700698
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700699 EXPECT_EQ(0, gJava_MyClassNatives_fooII_calls[gCurrentJni]);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700700 jint result = env_->CallNonvirtualIntMethod(jobj_, jklass_, jmethod_, 99, 10);
701 EXPECT_EQ(99 - 10, result);
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700702 EXPECT_EQ(1, gJava_MyClassNatives_fooII_calls[gCurrentJni]);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700703 result = env_->CallNonvirtualIntMethod(jobj_, jklass_, jmethod_, 0xCAFEBABE,
704 0xCAFED00D);
705 EXPECT_EQ(static_cast<jint>(0xCAFEBABE - 0xCAFED00D), result);
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700706 EXPECT_EQ(2, gJava_MyClassNatives_fooII_calls[gCurrentJni]);
Andreas Gampe6e498692014-08-18 16:43:12 -0700707
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700708 gJava_MyClassNatives_fooII_calls[gCurrentJni] = 0;
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700709}
710
Andreas Gampe6e498692014-08-18 16:43:12 -0700711JNI_TEST(CompileAndRunIntIntMethod)
712
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700713int gJava_MyClassNatives_fooJJ_calls[kJniKindCount] = {};
714jlong Java_MyClassNatives_fooJJ(JNIEnv*, jobject, jlong x, jlong y) {
715 gJava_MyClassNatives_fooJJ_calls[gCurrentJni]++;
Ian Rogers9b269d22011-09-04 14:06:05 -0700716 return x - y; // non-commutative operator
717}
718
Andreas Gampe6e498692014-08-18 16:43:12 -0700719void JniCompilerTest::CompileAndRunLongLongMethodImpl() {
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700720 SetUpForTest(false, "fooJJ", "(JJ)J",
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700721 CURRENT_JNI_WRAPPER(Java_MyClassNatives_fooJJ));
Ian Rogers9b269d22011-09-04 14:06:05 -0700722
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700723 EXPECT_EQ(0, gJava_MyClassNatives_fooJJ_calls[gCurrentJni]);
Ian Rogers0f678472014-03-10 16:18:37 -0700724 jlong a = INT64_C(0x1234567890ABCDEF);
725 jlong b = INT64_C(0xFEDCBA0987654321);
Ian Rogers9b269d22011-09-04 14:06:05 -0700726 jlong result = env_->CallNonvirtualLongMethod(jobj_, jklass_, jmethod_, a, b);
727 EXPECT_EQ(a - b, result);
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700728 EXPECT_EQ(1, gJava_MyClassNatives_fooJJ_calls[gCurrentJni]);
Ian Rogers9b269d22011-09-04 14:06:05 -0700729 result = env_->CallNonvirtualLongMethod(jobj_, jklass_, jmethod_, b, a);
730 EXPECT_EQ(b - a, result);
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700731 EXPECT_EQ(2, gJava_MyClassNatives_fooJJ_calls[gCurrentJni]);
Andreas Gampe6e498692014-08-18 16:43:12 -0700732
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700733 gJava_MyClassNatives_fooJJ_calls[gCurrentJni] = 0;
Ian Rogers9b269d22011-09-04 14:06:05 -0700734}
735
Andreas Gampe6e498692014-08-18 16:43:12 -0700736JNI_TEST(CompileAndRunLongLongMethod)
737
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700738int gJava_MyClassNatives_fooDD_calls[kJniKindCount] = {};
739jdouble Java_MyClassNatives_fooDD(JNIEnv*, jobject, jdouble x, jdouble y) {
740 gJava_MyClassNatives_fooDD_calls[gCurrentJni]++;
Ian Rogersb033c752011-07-20 12:22:35 -0700741 return x - y; // non-commutative operator
742}
743
Andreas Gampe6e498692014-08-18 16:43:12 -0700744void JniCompilerTest::CompileAndRunDoubleDoubleMethodImpl() {
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700745 SetUpForTest(false, "fooDD", "(DD)D",
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700746 CURRENT_JNI_WRAPPER(Java_MyClassNatives_fooDD));
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700747
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700748 EXPECT_EQ(0, gJava_MyClassNatives_fooDD_calls[gCurrentJni]);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700749 jdouble result = env_->CallNonvirtualDoubleMethod(jobj_, jklass_, jmethod_,
750 99.0, 10.0);
Ian Rogers647b1a82014-10-10 11:02:11 -0700751 EXPECT_DOUBLE_EQ(99.0 - 10.0, result);
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700752 EXPECT_EQ(1, gJava_MyClassNatives_fooDD_calls[gCurrentJni]);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700753 jdouble a = 3.14159265358979323846;
754 jdouble b = 0.69314718055994530942;
755 result = env_->CallNonvirtualDoubleMethod(jobj_, jklass_, jmethod_, a, b);
Ian Rogers647b1a82014-10-10 11:02:11 -0700756 EXPECT_DOUBLE_EQ(a - b, result);
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700757 EXPECT_EQ(2, gJava_MyClassNatives_fooDD_calls[gCurrentJni]);
Andreas Gampe6e498692014-08-18 16:43:12 -0700758
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700759 gJava_MyClassNatives_fooDD_calls[gCurrentJni] = 0;
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700760}
761
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700762int gJava_MyClassNatives_fooJJ_synchronized_calls[kJniKindCount] = {};
763jlong Java_MyClassNatives_fooJJ_synchronized(JNIEnv*, jobject, jlong x, jlong y) {
764 gJava_MyClassNatives_fooJJ_synchronized_calls[gCurrentJni]++;
Elliott Hughes3e778f72012-05-21 15:29:52 -0700765 return x | y;
766}
767
Andreas Gampe6e498692014-08-18 16:43:12 -0700768void JniCompilerTest::CompileAndRun_fooJJ_synchronizedImpl() {
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700769 SetUpForTest(false, "fooJJ_synchronized", "(JJ)J",
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700770 CURRENT_JNI_WRAPPER(Java_MyClassNatives_fooJJ_synchronized));
Elliott Hughes3e778f72012-05-21 15:29:52 -0700771
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700772 EXPECT_EQ(0, gJava_MyClassNatives_fooJJ_synchronized_calls[gCurrentJni]);
Elliott Hughes3e778f72012-05-21 15:29:52 -0700773 jlong a = 0x1000000020000000ULL;
774 jlong b = 0x00ff000000aa0000ULL;
775 jlong result = env_->CallNonvirtualLongMethod(jobj_, jklass_, jmethod_, a, b);
776 EXPECT_EQ(a | b, result);
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700777 EXPECT_EQ(1, gJava_MyClassNatives_fooJJ_synchronized_calls[gCurrentJni]);
Andreas Gampe6e498692014-08-18 16:43:12 -0700778
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700779 gJava_MyClassNatives_fooJJ_synchronized_calls[gCurrentJni] = 0;
Elliott Hughes3e778f72012-05-21 15:29:52 -0700780}
781
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700782JNI_TEST_NORMAL_ONLY(CompileAndRun_fooJJ_synchronized)
Andreas Gampe6e498692014-08-18 16:43:12 -0700783
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700784int gJava_MyClassNatives_fooIOO_calls[kJniKindCount] = {};
785jobject Java_MyClassNatives_fooIOO(JNIEnv*, jobject thisObj, jint x, jobject y,
Ian Rogersb033c752011-07-20 12:22:35 -0700786 jobject z) {
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700787 gJava_MyClassNatives_fooIOO_calls[gCurrentJni]++;
Ian Rogersb033c752011-07-20 12:22:35 -0700788 switch (x) {
789 case 1:
790 return y;
791 case 2:
792 return z;
793 default:
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700794 return thisObj;
Ian Rogersb033c752011-07-20 12:22:35 -0700795 }
796}
797
Andreas Gampe6e498692014-08-18 16:43:12 -0700798void JniCompilerTest::CompileAndRunIntObjectObjectMethodImpl() {
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700799 SetUpForTest(false, "fooIOO",
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700800 "(ILjava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;",
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700801 CURRENT_JNI_WRAPPER(Java_MyClassNatives_fooIOO));
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700802
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700803 EXPECT_EQ(0, gJava_MyClassNatives_fooIOO_calls[gCurrentJni]);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700804 jobject result = env_->CallNonvirtualObjectMethod(jobj_, jklass_, jmethod_, 0, nullptr, nullptr);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700805 EXPECT_TRUE(env_->IsSameObject(jobj_, result));
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700806 EXPECT_EQ(1, gJava_MyClassNatives_fooIOO_calls[gCurrentJni]);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700807
Andreas Gampecf4035a2014-05-28 22:43:01 -0700808 result = env_->CallNonvirtualObjectMethod(jobj_, jklass_, jmethod_, 0, nullptr, jklass_);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700809 EXPECT_TRUE(env_->IsSameObject(jobj_, result));
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700810 EXPECT_EQ(2, gJava_MyClassNatives_fooIOO_calls[gCurrentJni]);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700811 result = env_->CallNonvirtualObjectMethod(jobj_, jklass_, jmethod_, 1, nullptr, jklass_);
812 EXPECT_TRUE(env_->IsSameObject(nullptr, result));
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700813 EXPECT_EQ(3, gJava_MyClassNatives_fooIOO_calls[gCurrentJni]);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700814 result = env_->CallNonvirtualObjectMethod(jobj_, jklass_, jmethod_, 2, nullptr, jklass_);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700815 EXPECT_TRUE(env_->IsSameObject(jklass_, result));
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700816 EXPECT_EQ(4, gJava_MyClassNatives_fooIOO_calls[gCurrentJni]);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700817
Andreas Gampecf4035a2014-05-28 22:43:01 -0700818 result = env_->CallNonvirtualObjectMethod(jobj_, jklass_, jmethod_, 0, jklass_, nullptr);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700819 EXPECT_TRUE(env_->IsSameObject(jobj_, result));
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700820 EXPECT_EQ(5, gJava_MyClassNatives_fooIOO_calls[gCurrentJni]);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700821 result = env_->CallNonvirtualObjectMethod(jobj_, jklass_, jmethod_, 1, jklass_, nullptr);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700822 EXPECT_TRUE(env_->IsSameObject(jklass_, result));
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700823 EXPECT_EQ(6, gJava_MyClassNatives_fooIOO_calls[gCurrentJni]);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700824 result = env_->CallNonvirtualObjectMethod(jobj_, jklass_, jmethod_, 2, jklass_, nullptr);
825 EXPECT_TRUE(env_->IsSameObject(nullptr, result));
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700826 EXPECT_EQ(7, gJava_MyClassNatives_fooIOO_calls[gCurrentJni]);
Andreas Gampe6e498692014-08-18 16:43:12 -0700827
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700828 gJava_MyClassNatives_fooIOO_calls[gCurrentJni] = 0;
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700829}
830
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700831// TODO: Maybe. @FastNative support for returning Objects?
832JNI_TEST_NORMAL_ONLY(CompileAndRunIntObjectObjectMethod)
Andreas Gampe6e498692014-08-18 16:43:12 -0700833
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700834int gJava_MyClassNatives_fooSII_calls[kJniKindCount] = {};
835jint Java_MyClassNatives_fooSII(JNIEnv* env ATTRIBUTE_UNUSED,
836 jclass klass ATTRIBUTE_UNUSED,
837 jint x,
838 jint y) {
839 gJava_MyClassNatives_fooSII_calls[gCurrentJni]++;
Shih-wei Liao82da44b2011-09-01 00:38:04 -0700840 return x + y;
841}
842
Andreas Gampe6e498692014-08-18 16:43:12 -0700843void JniCompilerTest::CompileAndRunStaticIntIntMethodImpl() {
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700844 SetUpForTest(true, "fooSII", "(II)I",
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700845 CURRENT_JNI_WRAPPER(Java_MyClassNatives_fooSII));
Shih-wei Liao82da44b2011-09-01 00:38:04 -0700846
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700847 EXPECT_EQ(0, gJava_MyClassNatives_fooSII_calls[gCurrentJni]);
Shih-wei Liao82da44b2011-09-01 00:38:04 -0700848 jint result = env_->CallStaticIntMethod(jklass_, jmethod_, 20, 30);
849 EXPECT_EQ(50, result);
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700850 EXPECT_EQ(1, gJava_MyClassNatives_fooSII_calls[gCurrentJni]);
Andreas Gampe6e498692014-08-18 16:43:12 -0700851
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700852 gJava_MyClassNatives_fooSII_calls[gCurrentJni] = 0;
Shih-wei Liao82da44b2011-09-01 00:38:04 -0700853}
854
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700855JNI_TEST_CRITICAL(CompileAndRunStaticIntIntMethod)
Andreas Gampe6e498692014-08-18 16:43:12 -0700856
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700857int gJava_MyClassNatives_fooSDD_calls[kJniKindCount] = {};
858jdouble Java_MyClassNatives_fooSDD(JNIEnv* env ATTRIBUTE_UNUSED,
859 jclass klass ATTRIBUTE_UNUSED,
860 jdouble x,
861 jdouble y) {
862 gJava_MyClassNatives_fooSDD_calls[gCurrentJni]++;
Ian Rogers7a99c112011-09-07 12:48:27 -0700863 return x - y; // non-commutative operator
864}
865
Andreas Gampe6e498692014-08-18 16:43:12 -0700866void JniCompilerTest::CompileAndRunStaticDoubleDoubleMethodImpl() {
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700867 SetUpForTest(true, "fooSDD", "(DD)D",
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700868 CURRENT_JNI_WRAPPER(Java_MyClassNatives_fooSDD));
Ian Rogers7a99c112011-09-07 12:48:27 -0700869
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700870 EXPECT_EQ(0, gJava_MyClassNatives_fooSDD_calls[gCurrentJni]);
Ian Rogers7a99c112011-09-07 12:48:27 -0700871 jdouble result = env_->CallStaticDoubleMethod(jklass_, jmethod_, 99.0, 10.0);
Ian Rogers647b1a82014-10-10 11:02:11 -0700872 EXPECT_DOUBLE_EQ(99.0 - 10.0, result);
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700873 EXPECT_EQ(1, gJava_MyClassNatives_fooSDD_calls[gCurrentJni]);
Ian Rogers7a99c112011-09-07 12:48:27 -0700874 jdouble a = 3.14159265358979323846;
875 jdouble b = 0.69314718055994530942;
876 result = env_->CallStaticDoubleMethod(jklass_, jmethod_, a, b);
Ian Rogers647b1a82014-10-10 11:02:11 -0700877 EXPECT_DOUBLE_EQ(a - b, result);
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700878 EXPECT_DOUBLE_EQ(2, gJava_MyClassNatives_fooSDD_calls[gCurrentJni]);
Andreas Gampe6e498692014-08-18 16:43:12 -0700879
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700880 gJava_MyClassNatives_fooSDD_calls[gCurrentJni] = 0;
Ian Rogers7a99c112011-09-07 12:48:27 -0700881}
882
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700883JNI_TEST_CRITICAL(CompileAndRunStaticDoubleDoubleMethod)
Andreas Gampe6e498692014-08-18 16:43:12 -0700884
Nicolas Geoffray54accbc2014-08-13 03:40:45 +0100885// The x86 generic JNI code had a bug where it assumed a floating
886// point return value would be in xmm0. We use log, to somehow ensure
887// the compiler will use the floating point stack.
888
Ian Rogers6a3c1fc2014-10-31 00:33:20 -0700889jdouble Java_MyClassNatives_logD(JNIEnv*, jclass, jdouble x) {
Nicolas Geoffray54accbc2014-08-13 03:40:45 +0100890 return log(x);
891}
892
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700893jdouble Java_MyClassNatives_logD_notNormal(JNIEnv*, jclass, jdouble x) {
894 EXPECT_DOUBLE_EQ(2.0, x);
895 return log(x);
896}
897
Andreas Gampe6e498692014-08-18 16:43:12 -0700898void JniCompilerTest::RunStaticLogDoubleMethodImpl() {
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700899 void* jni_handler;
900 if (IsCurrentJniNormal()) {
901 // This test seems a bit special, don't use a JNI wrapper here.
902 jni_handler = NORMAL_JNI_ONLY_NOWRAP(Java_MyClassNatives_logD);
903 } else {
904 jni_handler = CURRENT_JNI_WRAPPER(Java_MyClassNatives_logD_notNormal);
905 }
906 SetUpForTest(true, "logD", "(D)D", jni_handler);
Nicolas Geoffray54accbc2014-08-13 03:40:45 +0100907
908 jdouble result = env_->CallStaticDoubleMethod(jklass_, jmethod_, 2.0);
Ian Rogers647b1a82014-10-10 11:02:11 -0700909 EXPECT_DOUBLE_EQ(log(2.0), result);
Nicolas Geoffray54accbc2014-08-13 03:40:45 +0100910}
911
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700912JNI_TEST_CRITICAL(RunStaticLogDoubleMethod)
Andreas Gampe6e498692014-08-18 16:43:12 -0700913
Ian Rogers6a3c1fc2014-10-31 00:33:20 -0700914jfloat Java_MyClassNatives_logF(JNIEnv*, jclass, jfloat x) {
Nicolas Geoffray54accbc2014-08-13 03:40:45 +0100915 return logf(x);
916}
917
Andreas Gampe6e498692014-08-18 16:43:12 -0700918void JniCompilerTest::RunStaticLogFloatMethodImpl() {
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700919 void* jni_handler;
920 if (IsCurrentJniNormal()) {
921 // This test seems a bit special, don't use a JNI wrapper here.
922 jni_handler = NORMAL_JNI_ONLY_NOWRAP(Java_MyClassNatives_logF);
923 } else {
924 jni_handler = CURRENT_JNI_WRAPPER(Java_MyClassNatives_logF);
925 }
926
927 SetUpForTest(true, "logF", "(F)F", jni_handler);
Nicolas Geoffray54accbc2014-08-13 03:40:45 +0100928
929 jfloat result = env_->CallStaticFloatMethod(jklass_, jmethod_, 2.0);
Ian Rogers647b1a82014-10-10 11:02:11 -0700930 EXPECT_FLOAT_EQ(logf(2.0), result);
Nicolas Geoffray54accbc2014-08-13 03:40:45 +0100931}
932
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700933JNI_TEST_CRITICAL(RunStaticLogFloatMethod)
Andreas Gampe6e498692014-08-18 16:43:12 -0700934
Ian Rogers6a3c1fc2014-10-31 00:33:20 -0700935jboolean Java_MyClassNatives_returnTrue(JNIEnv*, jclass) {
Nicolas Geoffray54accbc2014-08-13 03:40:45 +0100936 return JNI_TRUE;
937}
938
Ian Rogers6a3c1fc2014-10-31 00:33:20 -0700939jboolean Java_MyClassNatives_returnFalse(JNIEnv*, jclass) {
Nicolas Geoffray54accbc2014-08-13 03:40:45 +0100940 return JNI_FALSE;
941}
942
Ian Rogers6a3c1fc2014-10-31 00:33:20 -0700943jint Java_MyClassNatives_returnInt(JNIEnv*, jclass) {
Nicolas Geoffray54accbc2014-08-13 03:40:45 +0100944 return 42;
945}
946
Andreas Gampe6e498692014-08-18 16:43:12 -0700947void JniCompilerTest::RunStaticReturnTrueImpl() {
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700948 SetUpForTest(true, "returnTrue", "()Z", CURRENT_JNI_WRAPPER(Java_MyClassNatives_returnTrue));
Nicolas Geoffray54accbc2014-08-13 03:40:45 +0100949
950 jboolean result = env_->CallStaticBooleanMethod(jklass_, jmethod_);
951 EXPECT_TRUE(result);
952}
953
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700954JNI_TEST_CRITICAL(RunStaticReturnTrue)
Andreas Gampe6e498692014-08-18 16:43:12 -0700955
956void JniCompilerTest::RunStaticReturnFalseImpl() {
Nicolas Geoffray54accbc2014-08-13 03:40:45 +0100957 SetUpForTest(true, "returnFalse", "()Z",
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700958 CURRENT_JNI_WRAPPER(Java_MyClassNatives_returnFalse));
Nicolas Geoffray54accbc2014-08-13 03:40:45 +0100959
960 jboolean result = env_->CallStaticBooleanMethod(jklass_, jmethod_);
961 EXPECT_FALSE(result);
962}
963
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700964JNI_TEST_CRITICAL(RunStaticReturnFalse)
Andreas Gampe6e498692014-08-18 16:43:12 -0700965
966void JniCompilerTest::RunGenericStaticReturnIntImpl() {
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700967 SetUpForTest(true, "returnInt", "()I", CURRENT_JNI_WRAPPER(Java_MyClassNatives_returnInt));
Nicolas Geoffray54accbc2014-08-13 03:40:45 +0100968
969 jint result = env_->CallStaticIntMethod(jklass_, jmethod_);
970 EXPECT_EQ(42, result);
971}
972
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700973JNI_TEST_CRITICAL(RunGenericStaticReturnInt)
Andreas Gampe6e498692014-08-18 16:43:12 -0700974
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700975int gJava_MyClassNatives_returnDouble_calls[kJniKindCount] = {};
976jdouble Java_MyClassNatives_returnDouble(JNIEnv*, jclass) {
977 gJava_MyClassNatives_returnDouble_calls[gCurrentJni]++;
978 return 4.0;
979}
980
981void JniCompilerTest::RunGenericStaticReturnDoubleImpl() {
982 SetUpForTest(true, "returnDouble", "()D", CURRENT_JNI_WRAPPER(Java_MyClassNatives_returnDouble));
983
984 jdouble result = env_->CallStaticDoubleMethod(jklass_, jmethod_);
985 EXPECT_DOUBLE_EQ(4.0, result);
986 EXPECT_EQ(1, gJava_MyClassNatives_returnDouble_calls[gCurrentJni]);
987
988 gJava_MyClassNatives_returnDouble_calls[gCurrentJni] = 0;
989}
990
991JNI_TEST_CRITICAL(RunGenericStaticReturnDouble)
992
993jlong Java_MyClassNatives_returnLong(JNIEnv*, jclass) {
994 return 0xFEEDDEADFEEDL;
995}
996
997void JniCompilerTest::RunGenericStaticReturnLongImpl() {
998 SetUpForTest(true, "returnLong", "()J", CURRENT_JNI_WRAPPER(Java_MyClassNatives_returnLong));
999
1000 jlong result = env_->CallStaticLongMethod(jklass_, jmethod_);
1001 EXPECT_EQ(0xFEEDDEADFEEDL, result);
1002}
1003
1004JNI_TEST_CRITICAL(RunGenericStaticReturnLong)
1005
1006int gJava_MyClassNatives_fooSIOO_calls[kJniKindCount] = {};
1007jobject Java_MyClassNatives_fooSIOO(JNIEnv*, jclass klass, jint x, jobject y, jobject z) {
1008 gJava_MyClassNatives_fooSIOO_calls[gCurrentJni]++;
Ian Rogersb033c752011-07-20 12:22:35 -07001009 switch (x) {
1010 case 1:
1011 return y;
1012 case 2:
1013 return z;
1014 default:
1015 return klass;
1016 }
1017}
1018
Andreas Gampe6e498692014-08-18 16:43:12 -07001019void JniCompilerTest::CompileAndRunStaticIntObjectObjectMethodImpl() {
Ian Rogers00f7d0e2012-07-19 15:28:27 -07001020 SetUpForTest(true, "fooSIOO",
Ian Rogerscdd1d2d2011-08-18 09:58:17 -07001021 "(ILjava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;",
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001022 CURRENT_JNI_WRAPPER(Java_MyClassNatives_fooSIOO));
Ian Rogerscdd1d2d2011-08-18 09:58:17 -07001023
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001024 EXPECT_EQ(0, gJava_MyClassNatives_fooSIOO_calls[gCurrentJni]);
Andreas Gampecf4035a2014-05-28 22:43:01 -07001025 jobject result = env_->CallStaticObjectMethod(jklass_, jmethod_, 0, nullptr, nullptr);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -07001026 EXPECT_TRUE(env_->IsSameObject(jklass_, result));
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001027 EXPECT_EQ(1, gJava_MyClassNatives_fooSIOO_calls[gCurrentJni]);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -07001028
Andreas Gampecf4035a2014-05-28 22:43:01 -07001029 result = env_->CallStaticObjectMethod(jklass_, jmethod_, 0, nullptr, jobj_);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -07001030 EXPECT_TRUE(env_->IsSameObject(jklass_, result));
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001031 EXPECT_EQ(2, gJava_MyClassNatives_fooSIOO_calls[gCurrentJni]);
Andreas Gampecf4035a2014-05-28 22:43:01 -07001032 result = env_->CallStaticObjectMethod(jklass_, jmethod_, 1, nullptr, jobj_);
1033 EXPECT_TRUE(env_->IsSameObject(nullptr, result));
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001034 EXPECT_EQ(3, gJava_MyClassNatives_fooSIOO_calls[gCurrentJni]);
Andreas Gampecf4035a2014-05-28 22:43:01 -07001035 result = env_->CallStaticObjectMethod(jklass_, jmethod_, 2, nullptr, jobj_);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -07001036 EXPECT_TRUE(env_->IsSameObject(jobj_, result));
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001037 EXPECT_EQ(4, gJava_MyClassNatives_fooSIOO_calls[gCurrentJni]);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -07001038
Andreas Gampecf4035a2014-05-28 22:43:01 -07001039 result = env_->CallStaticObjectMethod(jklass_, jmethod_, 0, jobj_, nullptr);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -07001040 EXPECT_TRUE(env_->IsSameObject(jklass_, result));
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001041 EXPECT_EQ(5, gJava_MyClassNatives_fooSIOO_calls[gCurrentJni]);
Andreas Gampecf4035a2014-05-28 22:43:01 -07001042 result = env_->CallStaticObjectMethod(jklass_, jmethod_, 1, jobj_, nullptr);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -07001043 EXPECT_TRUE(env_->IsSameObject(jobj_, result));
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001044 EXPECT_EQ(6, gJava_MyClassNatives_fooSIOO_calls[gCurrentJni]);
Andreas Gampecf4035a2014-05-28 22:43:01 -07001045 result = env_->CallStaticObjectMethod(jklass_, jmethod_, 2, jobj_, nullptr);
1046 EXPECT_TRUE(env_->IsSameObject(nullptr, result));
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001047 EXPECT_EQ(7, gJava_MyClassNatives_fooSIOO_calls[gCurrentJni]);
Andreas Gampe6e498692014-08-18 16:43:12 -07001048
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001049 gJava_MyClassNatives_fooSIOO_calls[gCurrentJni] = 0;
Ian Rogerscdd1d2d2011-08-18 09:58:17 -07001050}
1051
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001052// TODO: Maybe. @FastNative support for returning Objects?
1053JNI_TEST_NORMAL_ONLY(CompileAndRunStaticIntObjectObjectMethod)
Andreas Gampe6e498692014-08-18 16:43:12 -07001054
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001055int gJava_MyClassNatives_fooSSIOO_calls[kJniKindCount] = {};
1056jobject Java_MyClassNatives_fooSSIOO(JNIEnv*, jclass klass, jint x, jobject y, jobject z) {
1057 gJava_MyClassNatives_fooSSIOO_calls[gCurrentJni]++;
Ian Rogersdf20fe02011-07-20 20:34:16 -07001058 switch (x) {
1059 case 1:
1060 return y;
1061 case 2:
1062 return z;
1063 default:
1064 return klass;
1065 }
1066}
1067
Andreas Gampe6e498692014-08-18 16:43:12 -07001068void JniCompilerTest::CompileAndRunStaticSynchronizedIntObjectObjectMethodImpl() {
Ian Rogers00f7d0e2012-07-19 15:28:27 -07001069 SetUpForTest(true, "fooSSIOO",
Ian Rogerscdd1d2d2011-08-18 09:58:17 -07001070 "(ILjava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;",
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001071 CURRENT_JNI_WRAPPER(Java_MyClassNatives_fooSSIOO));
Carl Shapiro419ec7b2011-08-03 14:48:33 -07001072
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001073 EXPECT_EQ(0, gJava_MyClassNatives_fooSSIOO_calls[gCurrentJni]);
Andreas Gampecf4035a2014-05-28 22:43:01 -07001074 jobject result = env_->CallStaticObjectMethod(jklass_, jmethod_, 0, nullptr, nullptr);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -07001075 EXPECT_TRUE(env_->IsSameObject(jklass_, result));
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001076 EXPECT_EQ(1, gJava_MyClassNatives_fooSSIOO_calls[gCurrentJni]);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -07001077
Andreas Gampecf4035a2014-05-28 22:43:01 -07001078 result = env_->CallStaticObjectMethod(jklass_, jmethod_, 0, nullptr, jobj_);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -07001079 EXPECT_TRUE(env_->IsSameObject(jklass_, result));
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001080 EXPECT_EQ(2, gJava_MyClassNatives_fooSSIOO_calls[gCurrentJni]);
Andreas Gampecf4035a2014-05-28 22:43:01 -07001081 result = env_->CallStaticObjectMethod(jklass_, jmethod_, 1, nullptr, jobj_);
1082 EXPECT_TRUE(env_->IsSameObject(nullptr, result));
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001083 EXPECT_EQ(3, gJava_MyClassNatives_fooSSIOO_calls[gCurrentJni]);
Andreas Gampecf4035a2014-05-28 22:43:01 -07001084 result = env_->CallStaticObjectMethod(jklass_, jmethod_, 2, nullptr, jobj_);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -07001085 EXPECT_TRUE(env_->IsSameObject(jobj_, result));
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001086 EXPECT_EQ(4, gJava_MyClassNatives_fooSSIOO_calls[gCurrentJni]);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -07001087
Andreas Gampecf4035a2014-05-28 22:43:01 -07001088 result = env_->CallStaticObjectMethod(jklass_, jmethod_, 0, jobj_, nullptr);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -07001089 EXPECT_TRUE(env_->IsSameObject(jklass_, result));
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001090 EXPECT_EQ(5, gJava_MyClassNatives_fooSSIOO_calls[gCurrentJni]);
Andreas Gampecf4035a2014-05-28 22:43:01 -07001091 result = env_->CallStaticObjectMethod(jklass_, jmethod_, 1, jobj_, nullptr);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -07001092 EXPECT_TRUE(env_->IsSameObject(jobj_, result));
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001093 EXPECT_EQ(6, gJava_MyClassNatives_fooSSIOO_calls[gCurrentJni]);
Andreas Gampecf4035a2014-05-28 22:43:01 -07001094 result = env_->CallStaticObjectMethod(jklass_, jmethod_, 2, jobj_, nullptr);
1095 EXPECT_TRUE(env_->IsSameObject(nullptr, result));
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001096 EXPECT_EQ(7, gJava_MyClassNatives_fooSSIOO_calls[gCurrentJni]);
Andreas Gampe6e498692014-08-18 16:43:12 -07001097
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001098 gJava_MyClassNatives_fooSSIOO_calls[gCurrentJni] = 0;
Ian Rogersdf20fe02011-07-20 20:34:16 -07001099}
1100
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001101// TODO: Maybe. @FastNative support for returning Objects?
1102JNI_TEST_NORMAL_ONLY(CompileAndRunStaticSynchronizedIntObjectObjectMethod)
Andreas Gampe6e498692014-08-18 16:43:12 -07001103
Elliott Hughesb264f082012-04-06 17:10:10 -07001104void Java_MyClassNatives_throwException(JNIEnv* env, jobject) {
Elliott Hughesa2501992011-08-26 19:39:54 -07001105 jclass c = env->FindClass("java/lang/RuntimeException");
1106 env->ThrowNew(c, "hello");
1107}
Ian Rogers45a76cb2011-07-21 22:00:15 -07001108
Andreas Gampe6e498692014-08-18 16:43:12 -07001109void JniCompilerTest::ExceptionHandlingImpl() {
Ian Rogers00f7d0e2012-07-19 15:28:27 -07001110 {
1111 ASSERT_FALSE(runtime_->IsStarted());
1112 ScopedObjectAccess soa(Thread::Current());
1113 class_loader_ = LoadDex("MyClassNatives");
Brian Carlstrom40381fb2011-10-19 14:13:40 -07001114
Ian Rogers00f7d0e2012-07-19 15:28:27 -07001115 // all compilation needs to happen before Runtime::Start
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001116 CompileForTestWithCurrentJni(class_loader_, false, "foo", "()V");
1117 CompileForTestWithCurrentJni(class_loader_, false, "throwException", "()V");
1118 CompileForTestWithCurrentJni(class_loader_, false, "foo", "()V");
Ian Rogers00f7d0e2012-07-19 15:28:27 -07001119 }
1120 // Start runtime to avoid re-initialization in SetupForTest.
1121 Thread::Current()->TransitionFromSuspendedToRunnable();
Brian Carlstrombd86bcc2013-03-10 20:26:16 -07001122 bool started = runtime_->Start();
1123 CHECK(started);
Brian Carlstrom25c33252011-09-18 15:58:35 -07001124
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001125 gJava_MyClassNatives_foo_calls[gCurrentJni] = 0;
Elliott Hughesa2501992011-08-26 19:39:54 -07001126
Ian Rogers67375ac2011-09-14 00:55:44 -07001127 // Check a single call of a JNI method is ok
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001128 SetUpForTest(false, "foo", "()V", CURRENT_JNI_WRAPPER(Java_MyClassNatives_foo));
Ian Rogerscdd1d2d2011-08-18 09:58:17 -07001129 env_->CallNonvirtualVoidMethod(jobj_, jklass_, jmethod_);
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001130 EXPECT_EQ(1, gJava_MyClassNatives_foo_calls[gCurrentJni]);
Ian Rogers67375ac2011-09-14 00:55:44 -07001131 EXPECT_FALSE(Thread::Current()->IsExceptionPending());
Elliott Hughesa2501992011-08-26 19:39:54 -07001132
Ian Rogers67375ac2011-09-14 00:55:44 -07001133 // Get class for exception we expect to be thrown
Ian Rogers00f7d0e2012-07-19 15:28:27 -07001134 ScopedLocalRef<jclass> jlre(env_, env_->FindClass("java/lang/RuntimeException"));
1135 SetUpForTest(false, "throwException", "()V",
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001136 CURRENT_JNI_WRAPPER(Java_MyClassNatives_throwException));
Elliott Hughesb264f082012-04-06 17:10:10 -07001137 // Call Java_MyClassNatives_throwException (JNI method that throws exception)
Elliott Hughesa2501992011-08-26 19:39:54 -07001138 env_->CallNonvirtualVoidMethod(jobj_, jklass_, jmethod_);
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001139 EXPECT_EQ(1, gJava_MyClassNatives_foo_calls[gCurrentJni]);
Ian Rogers00f7d0e2012-07-19 15:28:27 -07001140 EXPECT_TRUE(env_->ExceptionCheck() == JNI_TRUE);
1141 ScopedLocalRef<jthrowable> exception(env_, env_->ExceptionOccurred());
1142 env_->ExceptionClear();
1143 EXPECT_TRUE(env_->IsInstanceOf(exception.get(), jlre.get()));
Elliott Hughesa2501992011-08-26 19:39:54 -07001144
Ian Rogers67375ac2011-09-14 00:55:44 -07001145 // Check a single call of a JNI method is ok
Ian Rogers00f7d0e2012-07-19 15:28:27 -07001146 SetUpForTest(false, "foo", "()V", reinterpret_cast<void*>(&Java_MyClassNatives_foo));
Ian Rogerscdd1d2d2011-08-18 09:58:17 -07001147 env_->CallNonvirtualVoidMethod(jobj_, jklass_, jmethod_);
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001148 EXPECT_EQ(2, gJava_MyClassNatives_foo_calls[gCurrentJni]);
Andreas Gampe6e498692014-08-18 16:43:12 -07001149
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001150 gJava_MyClassNatives_foo_calls[gCurrentJni] = 0;
Ian Rogers45a76cb2011-07-21 22:00:15 -07001151}
1152
Andreas Gampe6e498692014-08-18 16:43:12 -07001153JNI_TEST(ExceptionHandling)
1154
Elliott Hughesb264f082012-04-06 17:10:10 -07001155jint Java_MyClassNatives_nativeUpCall(JNIEnv* env, jobject thisObj, jint i) {
Shih-wei Liaoff0f9be2011-08-29 15:43:53 -07001156 if (i <= 0) {
Andreas Gampecf4035a2014-05-28 22:43:01 -07001157 // We want to check raw Object* / Array* below
Ian Rogers00f7d0e2012-07-19 15:28:27 -07001158 ScopedObjectAccess soa(env);
Ian Rogersaaa20802011-09-11 21:47:37 -07001159
1160 // Build stack trace
Sebastien Hertzee1d79a2014-02-21 15:46:30 +01001161 jobject internal = Thread::Current()->CreateInternalStackTrace<false>(soa);
Ian Rogers53b8b092014-03-13 23:45:53 -07001162 jobjectArray ste_array = Thread::InternalStackTraceToStackTraceElementArray(soa, internal);
Mathieu Chartier0795f232016-09-27 18:43:30 -07001163 ObjPtr<mirror::ObjectArray<mirror::StackTraceElement>> trace_array =
1164 soa.Decode<mirror::ObjectArray<mirror::StackTraceElement>>(ste_array);
Andreas Gampecf4035a2014-05-28 22:43:01 -07001165 EXPECT_TRUE(trace_array != nullptr);
Shih-wei Liaoff0f9be2011-08-29 15:43:53 -07001166 EXPECT_EQ(11, trace_array->GetLength());
1167
Ian Rogersaaa20802011-09-11 21:47:37 -07001168 // Check stack trace entries have expected values
Andreas Gampe277ccbd2014-11-03 21:36:10 -08001169 for (int32_t j = 0; j < trace_array->GetLength(); ++j) {
1170 EXPECT_EQ(-2, trace_array->Get(j)->GetLineNumber());
1171 mirror::StackTraceElement* ste = trace_array->Get(j);
Ian Rogersaaa20802011-09-11 21:47:37 -07001172 EXPECT_STREQ("MyClassNatives.java", ste->GetFileName()->ToModifiedUtf8().c_str());
Elliott Hughesb264f082012-04-06 17:10:10 -07001173 EXPECT_STREQ("MyClassNatives", ste->GetDeclaringClass()->ToModifiedUtf8().c_str());
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001174 EXPECT_EQ(("fooI" + CurrentJniStringSuffix()), ste->GetMethodName()->ToModifiedUtf8());
Shih-wei Liaoff0f9be2011-08-29 15:43:53 -07001175 }
Ian Rogersaaa20802011-09-11 21:47:37 -07001176
1177 // end recursion
Shih-wei Liaoff0f9be2011-08-29 15:43:53 -07001178 return 0;
1179 } else {
Elliott Hughesb264f082012-04-06 17:10:10 -07001180 jclass jklass = env->FindClass("MyClassNatives");
Andreas Gampecf4035a2014-05-28 22:43:01 -07001181 EXPECT_TRUE(jklass != nullptr);
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001182 jmethodID jmethod = env->GetMethodID(jklass,
1183 ("fooI" + CurrentJniStringSuffix()).c_str(),
1184 "(I)I");
Andreas Gampecf4035a2014-05-28 22:43:01 -07001185 EXPECT_TRUE(jmethod != nullptr);
Shih-wei Liaoff0f9be2011-08-29 15:43:53 -07001186
Ian Rogersaaa20802011-09-11 21:47:37 -07001187 // Recurse with i - 1
Shih-wei Liaoff0f9be2011-08-29 15:43:53 -07001188 jint result = env->CallNonvirtualIntMethod(thisObj, jklass, jmethod, i - 1);
Ian Rogersaaa20802011-09-11 21:47:37 -07001189
1190 // Return sum of all depths
Shih-wei Liaoff0f9be2011-08-29 15:43:53 -07001191 return i + result;
1192 }
1193}
1194
Andreas Gampe6e498692014-08-18 16:43:12 -07001195void JniCompilerTest::NativeStackTraceElementImpl() {
Ian Rogers00f7d0e2012-07-19 15:28:27 -07001196 SetUpForTest(false, "fooI", "(I)I",
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001197 CURRENT_JNI_WRAPPER(Java_MyClassNatives_nativeUpCall));
1198
1199 // Usual # local references on stack check fails because nativeUpCall calls itself recursively,
1200 // each time the # of local references will therefore go up.
1201 ScopedDisableCheckNumStackReferences disable_num_stack_check;
Shih-wei Liaoff0f9be2011-08-29 15:43:53 -07001202 jint result = env_->CallNonvirtualIntMethod(jobj_, jklass_, jmethod_, 10);
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001203
Ian Rogersaaa20802011-09-11 21:47:37 -07001204 EXPECT_EQ(10+9+8+7+6+5+4+3+2+1, result);
Shih-wei Liaoff0f9be2011-08-29 15:43:53 -07001205}
1206
Andreas Gampe6e498692014-08-18 16:43:12 -07001207JNI_TEST(NativeStackTraceElement)
1208
Elliott Hughesb264f082012-04-06 17:10:10 -07001209jobject Java_MyClassNatives_fooO(JNIEnv* env, jobject, jobject x) {
Shih-wei Liao558788e2011-09-01 02:39:11 -07001210 return env->NewGlobalRef(x);
1211}
1212
Andreas Gampe6e498692014-08-18 16:43:12 -07001213void JniCompilerTest::ReturnGlobalRefImpl() {
Ian Rogers00f7d0e2012-07-19 15:28:27 -07001214 SetUpForTest(false, "fooO", "(Ljava/lang/Object;)Ljava/lang/Object;",
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001215 CURRENT_JNI_WRAPPER(Java_MyClassNatives_fooO));
Shih-wei Liao558788e2011-09-01 02:39:11 -07001216 jobject result = env_->CallNonvirtualObjectMethod(jobj_, jklass_, jmethod_, jobj_);
1217 EXPECT_EQ(JNILocalRefType, env_->GetObjectRefType(result));
1218 EXPECT_TRUE(env_->IsSameObject(result, jobj_));
1219}
1220
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001221// TODO: Maybe. @FastNative support for returning objects?
1222JNI_TEST_NORMAL_ONLY(ReturnGlobalRef)
Andreas Gampe6e498692014-08-18 16:43:12 -07001223
Ian Rogersdc51b792011-09-22 20:41:37 -07001224jint local_ref_test(JNIEnv* env, jobject thisObj, jint x) {
1225 // Add 10 local references
Ian Rogers00f7d0e2012-07-19 15:28:27 -07001226 ScopedObjectAccess soa(env);
Ian Rogers5a7a74a2011-09-26 16:32:29 -07001227 for (int i = 0; i < 10; i++) {
Mathieu Chartier0795f232016-09-27 18:43:30 -07001228 soa.AddLocalReference<jobject>(soa.Decode<mirror::Object>(thisObj));
Ian Rogersdc51b792011-09-22 20:41:37 -07001229 }
1230 return x+1;
1231}
1232
Andreas Gampe6e498692014-08-18 16:43:12 -07001233void JniCompilerTest::LocalReferenceTableClearingTestImpl() {
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001234 SetUpForTest(false, "fooI", "(I)I", CURRENT_JNI_WRAPPER(local_ref_test));
Ian Rogersdc51b792011-09-22 20:41:37 -07001235 // 1000 invocations of a method that adds 10 local references
Elliott Hughesb25c3f62012-03-26 16:35:06 -07001236 for (int i = 0; i < 1000; i++) {
Ian Rogersdc51b792011-09-22 20:41:37 -07001237 jint result = env_->CallIntMethod(jobj_, jmethod_, i);
1238 EXPECT_TRUE(result == i + 1);
1239 }
1240}
1241
Andreas Gampe6e498692014-08-18 16:43:12 -07001242JNI_TEST(LocalReferenceTableClearingTest)
1243
Ian Rogersb9231c82011-09-05 22:13:19 -07001244void my_arraycopy(JNIEnv* env, jclass klass, jobject src, jint src_pos, jobject dst, jint dst_pos, jint length) {
1245 EXPECT_TRUE(env->IsSameObject(JniCompilerTest::jklass_, klass));
1246 EXPECT_TRUE(env->IsSameObject(JniCompilerTest::jklass_, dst));
Ian Rogers82f3e092011-09-05 22:54:45 -07001247 EXPECT_TRUE(env->IsSameObject(JniCompilerTest::jobj_, src));
Ian Rogersb9231c82011-09-05 22:13:19 -07001248 EXPECT_EQ(1234, src_pos);
1249 EXPECT_EQ(5678, dst_pos);
1250 EXPECT_EQ(9876, length);
1251}
1252
Andreas Gampe6e498692014-08-18 16:43:12 -07001253void JniCompilerTest::JavaLangSystemArrayCopyImpl() {
Ian Rogers00f7d0e2012-07-19 15:28:27 -07001254 SetUpForTest(true, "arraycopy", "(Ljava/lang/Object;ILjava/lang/Object;II)V",
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001255 CURRENT_JNI_WRAPPER(my_arraycopy));
Ian Rogers82f3e092011-09-05 22:54:45 -07001256 env_->CallStaticVoidMethod(jklass_, jmethod_, jobj_, 1234, jklass_, 5678, 9876);
Ian Rogersb9231c82011-09-05 22:13:19 -07001257}
1258
Andreas Gampe6e498692014-08-18 16:43:12 -07001259JNI_TEST(JavaLangSystemArrayCopy)
1260
Ian Rogers67375ac2011-09-14 00:55:44 -07001261jboolean my_casi(JNIEnv* env, jobject unsafe, jobject obj, jlong offset, jint expected, jint newval) {
1262 EXPECT_TRUE(env->IsSameObject(JniCompilerTest::jobj_, unsafe));
1263 EXPECT_TRUE(env->IsSameObject(JniCompilerTest::jobj_, obj));
Ian Rogers0f678472014-03-10 16:18:37 -07001264 EXPECT_EQ(INT64_C(0x12345678ABCDEF88), offset);
Ian Rogers67375ac2011-09-14 00:55:44 -07001265 EXPECT_EQ(static_cast<jint>(0xCAFEF00D), expected);
1266 EXPECT_EQ(static_cast<jint>(0xEBADF00D), newval);
1267 return JNI_TRUE;
1268}
1269
Andreas Gampe6e498692014-08-18 16:43:12 -07001270void JniCompilerTest::CompareAndSwapIntImpl() {
Ian Rogers00f7d0e2012-07-19 15:28:27 -07001271 SetUpForTest(false, "compareAndSwapInt", "(Ljava/lang/Object;JII)Z",
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001272 CURRENT_JNI_WRAPPER(my_casi));
Ian Rogers0f678472014-03-10 16:18:37 -07001273 jboolean result = env_->CallBooleanMethod(jobj_, jmethod_, jobj_, INT64_C(0x12345678ABCDEF88),
1274 0xCAFEF00D, 0xEBADF00D);
Ian Rogers67375ac2011-09-14 00:55:44 -07001275 EXPECT_EQ(result, JNI_TRUE);
1276}
1277
Andreas Gampe6e498692014-08-18 16:43:12 -07001278JNI_TEST(CompareAndSwapInt)
1279
Ian Rogersc7792842012-03-03 15:36:20 -08001280jint my_gettext(JNIEnv* env, jclass klass, jlong val1, jobject obj1, jlong val2, jobject obj2) {
1281 EXPECT_TRUE(env->IsInstanceOf(JniCompilerTest::jobj_, klass));
1282 EXPECT_TRUE(env->IsSameObject(JniCompilerTest::jobj_, obj1));
1283 EXPECT_TRUE(env->IsSameObject(JniCompilerTest::jobj_, obj2));
1284 EXPECT_EQ(0x12345678ABCDEF88ll, val1);
1285 EXPECT_EQ(0x7FEDCBA987654321ll, val2);
1286 return 42;
1287}
1288
Andreas Gampe6e498692014-08-18 16:43:12 -07001289void JniCompilerTest::GetTextImpl() {
Ian Rogers00f7d0e2012-07-19 15:28:27 -07001290 SetUpForTest(true, "getText", "(JLjava/lang/Object;JLjava/lang/Object;)I",
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001291 CURRENT_JNI_WRAPPER(my_gettext));
Ian Rogersc7792842012-03-03 15:36:20 -08001292 jint result = env_->CallStaticIntMethod(jklass_, jmethod_, 0x12345678ABCDEF88ll, jobj_,
Ian Rogers0f678472014-03-10 16:18:37 -07001293 INT64_C(0x7FEDCBA987654321), jobj_);
Ian Rogersc7792842012-03-03 15:36:20 -08001294 EXPECT_EQ(result, 42);
1295}
1296
Andreas Gampe6e498692014-08-18 16:43:12 -07001297JNI_TEST(GetText)
1298
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001299int gJava_MyClassNatives_GetSinkProperties_calls[kJniKindCount] = {};
1300jarray Java_MyClassNatives_GetSinkProperties(JNIEnv*, jobject thisObj, jstring s) {
Vladimir Marko4e24b9d2014-07-24 17:01:58 +01001301 EXPECT_EQ(s, nullptr);
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001302 gJava_MyClassNatives_GetSinkProperties_calls[gCurrentJni]++;
1303
1304 Thread* self = Thread::Current();
Vladimir Marko4e24b9d2014-07-24 17:01:58 +01001305 ScopedObjectAccess soa(self);
Mathieu Chartier1cc62e42016-10-03 18:01:28 -07001306 EXPECT_TRUE(self->HoldsLock(soa.Decode<mirror::Object>(thisObj).Ptr()));
Vladimir Marko4e24b9d2014-07-24 17:01:58 +01001307 return nullptr;
1308}
1309
Andreas Gampe6e498692014-08-18 16:43:12 -07001310void JniCompilerTest::GetSinkPropertiesNativeImpl() {
Vladimir Marko4e24b9d2014-07-24 17:01:58 +01001311 SetUpForTest(false, "getSinkPropertiesNative", "(Ljava/lang/String;)[Ljava/lang/Object;",
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001312 CURRENT_JNI_WRAPPER(Java_MyClassNatives_GetSinkProperties));
Vladimir Marko4e24b9d2014-07-24 17:01:58 +01001313
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001314 EXPECT_EQ(0, gJava_MyClassNatives_GetSinkProperties_calls[gCurrentJni]);
Vladimir Marko4e24b9d2014-07-24 17:01:58 +01001315 jarray result = down_cast<jarray>(
1316 env_->CallNonvirtualObjectMethod(jobj_, jklass_, jmethod_, nullptr));
1317 EXPECT_EQ(nullptr, result);
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001318 EXPECT_EQ(1, gJava_MyClassNatives_GetSinkProperties_calls[gCurrentJni]);
Andreas Gampe6e498692014-08-18 16:43:12 -07001319
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001320 gJava_MyClassNatives_GetSinkProperties_calls[gCurrentJni] = 0;
Brian Carlstromfc7120c2012-08-27 13:43:25 -07001321}
1322
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001323// @FastNative doesn't support 'synchronized' keyword and
1324// never will -- locking functions aren't fast.
1325JNI_TEST_NORMAL_ONLY(GetSinkPropertiesNative)
Andreas Gampe6e498692014-08-18 16:43:12 -07001326
Elliott Hughesb264f082012-04-06 17:10:10 -07001327// This should return jclass, but we're imitating a bug pattern.
1328jobject Java_MyClassNatives_instanceMethodThatShouldReturnClass(JNIEnv* env, jobject) {
1329 return env->NewStringUTF("not a class!");
1330}
1331
1332// This should return jclass, but we're imitating a bug pattern.
1333jobject Java_MyClassNatives_staticMethodThatShouldReturnClass(JNIEnv* env, jclass) {
1334 return env->NewStringUTF("not a class!");
1335}
1336
Andreas Gampe6e498692014-08-18 16:43:12 -07001337void JniCompilerTest::UpcallReturnTypeChecking_InstanceImpl() {
Ian Rogers00f7d0e2012-07-19 15:28:27 -07001338 SetUpForTest(false, "instanceMethodThatShouldReturnClass", "()Ljava/lang/Class;",
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001339 CURRENT_JNI_WRAPPER(Java_MyClassNatives_instanceMethodThatShouldReturnClass));
Elliott Hughesb264f082012-04-06 17:10:10 -07001340
1341 CheckJniAbortCatcher check_jni_abort_catcher;
Elliott Hughes3f6635a2012-06-19 13:37:49 -07001342 // This native method is bad, and tries to return a jstring as a jclass.
1343 env_->CallObjectMethod(jobj_, jmethod_);
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001344 check_jni_abort_catcher.Check(std::string() + "attempt to return an instance " +
1345 "of java.lang.String from java.lang.Class " +
1346 "MyClassNatives.instanceMethodThatShouldReturnClass" +
1347 CurrentJniStringSuffix() + "()");
Elliott Hughes3f6635a2012-06-19 13:37:49 -07001348
1349 // Here, we just call the method incorrectly; we should catch that too.
Ian Rogers68d8b422014-07-17 11:09:10 -07001350 env_->CallObjectMethod(jobj_, jmethod_);
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001351 check_jni_abort_catcher.Check(std::string() + "attempt to return an instance " +
1352 "of java.lang.String from java.lang.Class " +
1353 "MyClassNatives.instanceMethodThatShouldReturnClass" +
1354 CurrentJniStringSuffix() + "()");
Ian Rogers68d8b422014-07-17 11:09:10 -07001355 env_->CallStaticObjectMethod(jklass_, jmethod_);
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001356 check_jni_abort_catcher.Check(std::string() + "calling non-static method " +
1357 "java.lang.Class " +
1358 "MyClassNatives.instanceMethodThatShouldReturnClass" +
1359 CurrentJniStringSuffix() + "() with CallStaticObjectMethodV");
Elliott Hughesb264f082012-04-06 17:10:10 -07001360}
1361
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001362// TODO: Maybe support returning objects for @FastNative?
1363JNI_TEST_NORMAL_ONLY(UpcallReturnTypeChecking_Instance)
Andreas Gampe6e498692014-08-18 16:43:12 -07001364
1365void JniCompilerTest::UpcallReturnTypeChecking_StaticImpl() {
Ian Rogers00f7d0e2012-07-19 15:28:27 -07001366 SetUpForTest(true, "staticMethodThatShouldReturnClass", "()Ljava/lang/Class;",
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001367 CURRENT_JNI_WRAPPER(Java_MyClassNatives_staticMethodThatShouldReturnClass));
Elliott Hughesb264f082012-04-06 17:10:10 -07001368
1369 CheckJniAbortCatcher check_jni_abort_catcher;
Elliott Hughes3f6635a2012-06-19 13:37:49 -07001370 // This native method is bad, and tries to return a jstring as a jclass.
1371 env_->CallStaticObjectMethod(jklass_, jmethod_);
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001372 check_jni_abort_catcher.Check(std::string() + "attempt to return an instance " +
1373 "of java.lang.String from java.lang.Class " +
1374 "MyClassNatives.staticMethodThatShouldReturnClass" +
1375 CurrentJniStringSuffix() + "()");
Elliott Hughes3f6635a2012-06-19 13:37:49 -07001376
1377 // Here, we just call the method incorrectly; we should catch that too.
Ian Rogers68d8b422014-07-17 11:09:10 -07001378 env_->CallStaticObjectMethod(jklass_, jmethod_);
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001379 check_jni_abort_catcher.Check(std::string() + "attempt to return an instance " +
1380 "of java.lang.String from java.lang.Class " +
1381 "MyClassNatives.staticMethodThatShouldReturnClass" +
1382 CurrentJniStringSuffix() + "()");
Ian Rogers68d8b422014-07-17 11:09:10 -07001383 env_->CallObjectMethod(jobj_, jmethod_);
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001384 check_jni_abort_catcher.Check(std::string() + "calling static method " +
1385 "java.lang.Class " +
1386 "MyClassNatives.staticMethodThatShouldReturnClass" +
1387 CurrentJniStringSuffix() + "() with CallObjectMethodV");
Elliott Hughesb264f082012-04-06 17:10:10 -07001388}
1389
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001390// TODO: Maybe support returning objects for @FastNative?
1391JNI_TEST_NORMAL_ONLY(UpcallReturnTypeChecking_Static)
Andreas Gampe6e498692014-08-18 16:43:12 -07001392
Elliott Hughesb264f082012-04-06 17:10:10 -07001393// This should take jclass, but we're imitating a bug pattern.
1394void Java_MyClassNatives_instanceMethodThatShouldTakeClass(JNIEnv*, jobject, jclass) {
1395}
1396
1397// This should take jclass, but we're imitating a bug pattern.
1398void Java_MyClassNatives_staticMethodThatShouldTakeClass(JNIEnv*, jclass, jclass) {
1399}
1400
Andreas Gampe6e498692014-08-18 16:43:12 -07001401void JniCompilerTest::UpcallArgumentTypeChecking_InstanceImpl() {
Andreas Gampe369810a2015-01-14 19:53:31 -08001402 // This will lead to error messages in the log.
1403 ScopedLogSeverity sls(LogSeverity::FATAL);
1404
Ian Rogers00f7d0e2012-07-19 15:28:27 -07001405 SetUpForTest(false, "instanceMethodThatShouldTakeClass", "(ILjava/lang/Class;)V",
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001406 CURRENT_JNI_WRAPPER(Java_MyClassNatives_instanceMethodThatShouldTakeClass));
Elliott Hughesb264f082012-04-06 17:10:10 -07001407
1408 CheckJniAbortCatcher check_jni_abort_catcher;
1409 // We deliberately pass a bad second argument here.
1410 env_->CallVoidMethod(jobj_, jmethod_, 123, env_->NewStringUTF("not a class!"));
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001411 check_jni_abort_catcher.Check(std::string() + "bad arguments passed to void " +
1412 "MyClassNatives.instanceMethodThatShouldTakeClass" +
1413 CurrentJniStringSuffix() + "(int, java.lang.Class)");
Elliott Hughesb264f082012-04-06 17:10:10 -07001414}
1415
Andreas Gampe6e498692014-08-18 16:43:12 -07001416JNI_TEST(UpcallArgumentTypeChecking_Instance)
1417
1418void JniCompilerTest::UpcallArgumentTypeChecking_StaticImpl() {
Andreas Gampe369810a2015-01-14 19:53:31 -08001419 // This will lead to error messages in the log.
1420 ScopedLogSeverity sls(LogSeverity::FATAL);
1421
Ian Rogers00f7d0e2012-07-19 15:28:27 -07001422 SetUpForTest(true, "staticMethodThatShouldTakeClass", "(ILjava/lang/Class;)V",
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001423 CURRENT_JNI_WRAPPER(Java_MyClassNatives_staticMethodThatShouldTakeClass));
Elliott Hughesb264f082012-04-06 17:10:10 -07001424
1425 CheckJniAbortCatcher check_jni_abort_catcher;
1426 // We deliberately pass a bad second argument here.
1427 env_->CallStaticVoidMethod(jklass_, jmethod_, 123, env_->NewStringUTF("not a class!"));
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001428 check_jni_abort_catcher.Check(std::string() + "bad arguments passed to void " +
1429 "MyClassNatives.staticMethodThatShouldTakeClass" +
1430 CurrentJniStringSuffix() + "(int, java.lang.Class)");
Elliott Hughesb264f082012-04-06 17:10:10 -07001431}
1432
Andreas Gampe6e498692014-08-18 16:43:12 -07001433JNI_TEST(UpcallArgumentTypeChecking_Static)
1434
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001435jfloat Java_MyClassNatives_checkFloats(JNIEnv*, jobject, jfloat f1, jfloat f2) {
Andreas Gampe7a0e5042014-03-07 13:03:19 -08001436 return f1 - f2; // non-commutative operator
1437}
1438
Andreas Gampe6e498692014-08-18 16:43:12 -07001439void JniCompilerTest::CompileAndRunFloatFloatMethodImpl() {
Andreas Gampe7a0e5042014-03-07 13:03:19 -08001440 SetUpForTest(false, "checkFloats", "(FF)F",
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001441 CURRENT_JNI_WRAPPER(Java_MyClassNatives_checkFloats));
Andreas Gampe7a0e5042014-03-07 13:03:19 -08001442
1443 jfloat result = env_->CallNonvirtualFloatMethod(jobj_, jklass_, jmethod_,
1444 99.0F, 10.0F);
Ian Rogers647b1a82014-10-10 11:02:11 -07001445 EXPECT_FLOAT_EQ(99.0F - 10.0F, result);
Andreas Gampe7a0e5042014-03-07 13:03:19 -08001446 jfloat a = 3.14159F;
1447 jfloat b = 0.69314F;
1448 result = env_->CallNonvirtualFloatMethod(jobj_, jklass_, jmethod_, a, b);
Ian Rogers647b1a82014-10-10 11:02:11 -07001449 EXPECT_FLOAT_EQ(a - b, result);
Andreas Gampe7a0e5042014-03-07 13:03:19 -08001450}
1451
Andreas Gampe6e498692014-08-18 16:43:12 -07001452JNI_TEST(CompileAndRunFloatFloatMethod)
1453
Ian Rogers6a3c1fc2014-10-31 00:33:20 -07001454void Java_MyClassNatives_checkParameterAlign(JNIEnv* env ATTRIBUTE_UNUSED,
1455 jobject thisObj ATTRIBUTE_UNUSED,
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001456 jint i1,
1457 jlong l1) {
Andreas Gampe7a0e5042014-03-07 13:03:19 -08001458 EXPECT_EQ(i1, 1234);
Ian Rogers0f678472014-03-10 16:18:37 -07001459 EXPECT_EQ(l1, INT64_C(0x12345678ABCDEF0));
Andreas Gampe7a0e5042014-03-07 13:03:19 -08001460}
1461
Andreas Gampe6e498692014-08-18 16:43:12 -07001462void JniCompilerTest::CheckParameterAlignImpl() {
Andreas Gampe7a0e5042014-03-07 13:03:19 -08001463 SetUpForTest(false, "checkParameterAlign", "(IJ)V",
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001464 CURRENT_JNI_WRAPPER(Java_MyClassNatives_checkParameterAlign));
Andreas Gampe7a0e5042014-03-07 13:03:19 -08001465
Ian Rogers0f678472014-03-10 16:18:37 -07001466 env_->CallNonvirtualVoidMethod(jobj_, jklass_, jmethod_, 1234, INT64_C(0x12345678ABCDEF0));
Andreas Gampe7a0e5042014-03-07 13:03:19 -08001467}
1468
Andreas Gampe6e498692014-08-18 16:43:12 -07001469JNI_TEST(CheckParameterAlign)
1470
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001471void Java_MyClassNatives_maxParamNumber(JNIEnv* env, jobject,
Andreas Gampe7a0e5042014-03-07 13:03:19 -08001472 jobject o0, jobject o1, jobject o2, jobject o3, jobject o4, jobject o5, jobject o6, jobject o7,
1473 jobject o8, jobject o9, jobject o10, jobject o11, jobject o12, jobject o13, jobject o14, jobject o15,
1474 jobject o16, jobject o17, jobject o18, jobject o19, jobject o20, jobject o21, jobject o22, jobject o23,
1475 jobject o24, jobject o25, jobject o26, jobject o27, jobject o28, jobject o29, jobject o30, jobject o31,
1476 jobject o32, jobject o33, jobject o34, jobject o35, jobject o36, jobject o37, jobject o38, jobject o39,
1477 jobject o40, jobject o41, jobject o42, jobject o43, jobject o44, jobject o45, jobject o46, jobject o47,
1478 jobject o48, jobject o49, jobject o50, jobject o51, jobject o52, jobject o53, jobject o54, jobject o55,
1479 jobject o56, jobject o57, jobject o58, jobject o59, jobject o60, jobject o61, jobject o62, jobject o63,
1480 jobject o64, jobject o65, jobject o66, jobject o67, jobject o68, jobject o69, jobject o70, jobject o71,
1481 jobject o72, jobject o73, jobject o74, jobject o75, jobject o76, jobject o77, jobject o78, jobject o79,
1482 jobject o80, jobject o81, jobject o82, jobject o83, jobject o84, jobject o85, jobject o86, jobject o87,
1483 jobject o88, jobject o89, jobject o90, jobject o91, jobject o92, jobject o93, jobject o94, jobject o95,
1484 jobject o96, jobject o97, jobject o98, jobject o99, jobject o100, jobject o101, jobject o102, jobject o103,
1485 jobject o104, jobject o105, jobject o106, jobject o107, jobject o108, jobject o109, jobject o110, jobject o111,
1486 jobject o112, jobject o113, jobject o114, jobject o115, jobject o116, jobject o117, jobject o118, jobject o119,
1487 jobject o120, jobject o121, jobject o122, jobject o123, jobject o124, jobject o125, jobject o126, jobject o127,
1488 jobject o128, jobject o129, jobject o130, jobject o131, jobject o132, jobject o133, jobject o134, jobject o135,
1489 jobject o136, jobject o137, jobject o138, jobject o139, jobject o140, jobject o141, jobject o142, jobject o143,
1490 jobject o144, jobject o145, jobject o146, jobject o147, jobject o148, jobject o149, jobject o150, jobject o151,
1491 jobject o152, jobject o153, jobject o154, jobject o155, jobject o156, jobject o157, jobject o158, jobject o159,
1492 jobject o160, jobject o161, jobject o162, jobject o163, jobject o164, jobject o165, jobject o166, jobject o167,
1493 jobject o168, jobject o169, jobject o170, jobject o171, jobject o172, jobject o173, jobject o174, jobject o175,
1494 jobject o176, jobject o177, jobject o178, jobject o179, jobject o180, jobject o181, jobject o182, jobject o183,
1495 jobject o184, jobject o185, jobject o186, jobject o187, jobject o188, jobject o189, jobject o190, jobject o191,
1496 jobject o192, jobject o193, jobject o194, jobject o195, jobject o196, jobject o197, jobject o198, jobject o199,
1497 jobject o200, jobject o201, jobject o202, jobject o203, jobject o204, jobject o205, jobject o206, jobject o207,
1498 jobject o208, jobject o209, jobject o210, jobject o211, jobject o212, jobject o213, jobject o214, jobject o215,
1499 jobject o216, jobject o217, jobject o218, jobject o219, jobject o220, jobject o221, jobject o222, jobject o223,
1500 jobject o224, jobject o225, jobject o226, jobject o227, jobject o228, jobject o229, jobject o230, jobject o231,
1501 jobject o232, jobject o233, jobject o234, jobject o235, jobject o236, jobject o237, jobject o238, jobject o239,
1502 jobject o240, jobject o241, jobject o242, jobject o243, jobject o244, jobject o245, jobject o246, jobject o247,
1503 jobject o248, jobject o249, jobject o250, jobject o251, jobject o252, jobject o253) {
Andreas Gampe7a0e5042014-03-07 13:03:19 -08001504 // two tests possible
1505 if (o0 == nullptr) {
1506 // 1) everything is null
1507 EXPECT_TRUE(o0 == nullptr && o1 == nullptr && o2 == nullptr && o3 == nullptr && o4 == nullptr
1508 && o5 == nullptr && o6 == nullptr && o7 == nullptr && o8 == nullptr && o9 == nullptr
1509 && o10 == nullptr && o11 == nullptr && o12 == nullptr && o13 == nullptr && o14 == nullptr
1510 && o15 == nullptr && o16 == nullptr && o17 == nullptr && o18 == nullptr && o19 == nullptr
1511 && o20 == nullptr && o21 == nullptr && o22 == nullptr && o23 == nullptr && o24 == nullptr
1512 && o25 == nullptr && o26 == nullptr && o27 == nullptr && o28 == nullptr && o29 == nullptr
1513 && o30 == nullptr && o31 == nullptr && o32 == nullptr && o33 == nullptr && o34 == nullptr
1514 && o35 == nullptr && o36 == nullptr && o37 == nullptr && o38 == nullptr && o39 == nullptr
1515 && o40 == nullptr && o41 == nullptr && o42 == nullptr && o43 == nullptr && o44 == nullptr
1516 && o45 == nullptr && o46 == nullptr && o47 == nullptr && o48 == nullptr && o49 == nullptr
1517 && o50 == nullptr && o51 == nullptr && o52 == nullptr && o53 == nullptr && o54 == nullptr
1518 && o55 == nullptr && o56 == nullptr && o57 == nullptr && o58 == nullptr && o59 == nullptr
1519 && o60 == nullptr && o61 == nullptr && o62 == nullptr && o63 == nullptr && o64 == nullptr
1520 && o65 == nullptr && o66 == nullptr && o67 == nullptr && o68 == nullptr && o69 == nullptr
1521 && o70 == nullptr && o71 == nullptr && o72 == nullptr && o73 == nullptr && o74 == nullptr
1522 && o75 == nullptr && o76 == nullptr && o77 == nullptr && o78 == nullptr && o79 == nullptr
1523 && o80 == nullptr && o81 == nullptr && o82 == nullptr && o83 == nullptr && o84 == nullptr
1524 && o85 == nullptr && o86 == nullptr && o87 == nullptr && o88 == nullptr && o89 == nullptr
1525 && o90 == nullptr && o91 == nullptr && o92 == nullptr && o93 == nullptr && o94 == nullptr
1526 && o95 == nullptr && o96 == nullptr && o97 == nullptr && o98 == nullptr && o99 == nullptr
1527 && o100 == nullptr && o101 == nullptr && o102 == nullptr && o103 == nullptr && o104 == nullptr
1528 && o105 == nullptr && o106 == nullptr && o107 == nullptr && o108 == nullptr && o109 == nullptr
1529 && o110 == nullptr && o111 == nullptr && o112 == nullptr && o113 == nullptr && o114 == nullptr
1530 && o115 == nullptr && o116 == nullptr && o117 == nullptr && o118 == nullptr && o119 == nullptr
1531 && o120 == nullptr && o121 == nullptr && o122 == nullptr && o123 == nullptr && o124 == nullptr
1532 && o125 == nullptr && o126 == nullptr && o127 == nullptr && o128 == nullptr && o129 == nullptr
1533 && o130 == nullptr && o131 == nullptr && o132 == nullptr && o133 == nullptr && o134 == nullptr
1534 && o135 == nullptr && o136 == nullptr && o137 == nullptr && o138 == nullptr && o139 == nullptr
1535 && o140 == nullptr && o141 == nullptr && o142 == nullptr && o143 == nullptr && o144 == nullptr
1536 && o145 == nullptr && o146 == nullptr && o147 == nullptr && o148 == nullptr && o149 == nullptr
1537 && o150 == nullptr && o151 == nullptr && o152 == nullptr && o153 == nullptr && o154 == nullptr
1538 && o155 == nullptr && o156 == nullptr && o157 == nullptr && o158 == nullptr && o159 == nullptr
1539 && o160 == nullptr && o161 == nullptr && o162 == nullptr && o163 == nullptr && o164 == nullptr
1540 && o165 == nullptr && o166 == nullptr && o167 == nullptr && o168 == nullptr && o169 == nullptr
1541 && o170 == nullptr && o171 == nullptr && o172 == nullptr && o173 == nullptr && o174 == nullptr
1542 && o175 == nullptr && o176 == nullptr && o177 == nullptr && o178 == nullptr && o179 == nullptr
1543 && o180 == nullptr && o181 == nullptr && o182 == nullptr && o183 == nullptr && o184 == nullptr
1544 && o185 == nullptr && o186 == nullptr && o187 == nullptr && o188 == nullptr && o189 == nullptr
1545 && o190 == nullptr && o191 == nullptr && o192 == nullptr && o193 == nullptr && o194 == nullptr
1546 && o195 == nullptr && o196 == nullptr && o197 == nullptr && o198 == nullptr && o199 == nullptr
1547 && o200 == nullptr && o201 == nullptr && o202 == nullptr && o203 == nullptr && o204 == nullptr
1548 && o205 == nullptr && o206 == nullptr && o207 == nullptr && o208 == nullptr && o209 == nullptr
1549 && o210 == nullptr && o211 == nullptr && o212 == nullptr && o213 == nullptr && o214 == nullptr
1550 && o215 == nullptr && o216 == nullptr && o217 == nullptr && o218 == nullptr && o219 == nullptr
1551 && o220 == nullptr && o221 == nullptr && o222 == nullptr && o223 == nullptr && o224 == nullptr
1552 && o225 == nullptr && o226 == nullptr && o227 == nullptr && o228 == nullptr && o229 == nullptr
1553 && o230 == nullptr && o231 == nullptr && o232 == nullptr && o233 == nullptr && o234 == nullptr
1554 && o235 == nullptr && o236 == nullptr && o237 == nullptr && o238 == nullptr && o239 == nullptr
1555 && o240 == nullptr && o241 == nullptr && o242 == nullptr && o243 == nullptr && o244 == nullptr
1556 && o245 == nullptr && o246 == nullptr && o247 == nullptr && o248 == nullptr && o249 == nullptr
1557 && o250 == nullptr && o251 == nullptr && o252 == nullptr && o253 == nullptr);
1558 } else {
1559 EXPECT_EQ(0, env->GetArrayLength(reinterpret_cast<jarray>(o0)));
1560 EXPECT_EQ(1, env->GetArrayLength(reinterpret_cast<jarray>(o1)));
1561 EXPECT_EQ(2, env->GetArrayLength(reinterpret_cast<jarray>(o2)));
1562 EXPECT_EQ(3, env->GetArrayLength(reinterpret_cast<jarray>(o3)));
1563 EXPECT_EQ(4, env->GetArrayLength(reinterpret_cast<jarray>(o4)));
1564 EXPECT_EQ(5, env->GetArrayLength(reinterpret_cast<jarray>(o5)));
1565 EXPECT_EQ(6, env->GetArrayLength(reinterpret_cast<jarray>(o6)));
1566 EXPECT_EQ(7, env->GetArrayLength(reinterpret_cast<jarray>(o7)));
1567 EXPECT_EQ(8, env->GetArrayLength(reinterpret_cast<jarray>(o8)));
1568 EXPECT_EQ(9, env->GetArrayLength(reinterpret_cast<jarray>(o9)));
1569 EXPECT_EQ(10, env->GetArrayLength(reinterpret_cast<jarray>(o10)));
1570 EXPECT_EQ(11, env->GetArrayLength(reinterpret_cast<jarray>(o11)));
1571 EXPECT_EQ(12, env->GetArrayLength(reinterpret_cast<jarray>(o12)));
1572 EXPECT_EQ(13, env->GetArrayLength(reinterpret_cast<jarray>(o13)));
1573 EXPECT_EQ(14, env->GetArrayLength(reinterpret_cast<jarray>(o14)));
1574 EXPECT_EQ(15, env->GetArrayLength(reinterpret_cast<jarray>(o15)));
1575 EXPECT_EQ(16, env->GetArrayLength(reinterpret_cast<jarray>(o16)));
1576 EXPECT_EQ(17, env->GetArrayLength(reinterpret_cast<jarray>(o17)));
1577 EXPECT_EQ(18, env->GetArrayLength(reinterpret_cast<jarray>(o18)));
1578 EXPECT_EQ(19, env->GetArrayLength(reinterpret_cast<jarray>(o19)));
1579 EXPECT_EQ(20, env->GetArrayLength(reinterpret_cast<jarray>(o20)));
1580 EXPECT_EQ(21, env->GetArrayLength(reinterpret_cast<jarray>(o21)));
1581 EXPECT_EQ(22, env->GetArrayLength(reinterpret_cast<jarray>(o22)));
1582 EXPECT_EQ(23, env->GetArrayLength(reinterpret_cast<jarray>(o23)));
1583 EXPECT_EQ(24, env->GetArrayLength(reinterpret_cast<jarray>(o24)));
1584 EXPECT_EQ(25, env->GetArrayLength(reinterpret_cast<jarray>(o25)));
1585 EXPECT_EQ(26, env->GetArrayLength(reinterpret_cast<jarray>(o26)));
1586 EXPECT_EQ(27, env->GetArrayLength(reinterpret_cast<jarray>(o27)));
1587 EXPECT_EQ(28, env->GetArrayLength(reinterpret_cast<jarray>(o28)));
1588 EXPECT_EQ(29, env->GetArrayLength(reinterpret_cast<jarray>(o29)));
1589 EXPECT_EQ(30, env->GetArrayLength(reinterpret_cast<jarray>(o30)));
1590 EXPECT_EQ(31, env->GetArrayLength(reinterpret_cast<jarray>(o31)));
1591 EXPECT_EQ(32, env->GetArrayLength(reinterpret_cast<jarray>(o32)));
1592 EXPECT_EQ(33, env->GetArrayLength(reinterpret_cast<jarray>(o33)));
1593 EXPECT_EQ(34, env->GetArrayLength(reinterpret_cast<jarray>(o34)));
1594 EXPECT_EQ(35, env->GetArrayLength(reinterpret_cast<jarray>(o35)));
1595 EXPECT_EQ(36, env->GetArrayLength(reinterpret_cast<jarray>(o36)));
1596 EXPECT_EQ(37, env->GetArrayLength(reinterpret_cast<jarray>(o37)));
1597 EXPECT_EQ(38, env->GetArrayLength(reinterpret_cast<jarray>(o38)));
1598 EXPECT_EQ(39, env->GetArrayLength(reinterpret_cast<jarray>(o39)));
1599 EXPECT_EQ(40, env->GetArrayLength(reinterpret_cast<jarray>(o40)));
1600 EXPECT_EQ(41, env->GetArrayLength(reinterpret_cast<jarray>(o41)));
1601 EXPECT_EQ(42, env->GetArrayLength(reinterpret_cast<jarray>(o42)));
1602 EXPECT_EQ(43, env->GetArrayLength(reinterpret_cast<jarray>(o43)));
1603 EXPECT_EQ(44, env->GetArrayLength(reinterpret_cast<jarray>(o44)));
1604 EXPECT_EQ(45, env->GetArrayLength(reinterpret_cast<jarray>(o45)));
1605 EXPECT_EQ(46, env->GetArrayLength(reinterpret_cast<jarray>(o46)));
1606 EXPECT_EQ(47, env->GetArrayLength(reinterpret_cast<jarray>(o47)));
1607 EXPECT_EQ(48, env->GetArrayLength(reinterpret_cast<jarray>(o48)));
1608 EXPECT_EQ(49, env->GetArrayLength(reinterpret_cast<jarray>(o49)));
1609 EXPECT_EQ(50, env->GetArrayLength(reinterpret_cast<jarray>(o50)));
1610 EXPECT_EQ(51, env->GetArrayLength(reinterpret_cast<jarray>(o51)));
1611 EXPECT_EQ(52, env->GetArrayLength(reinterpret_cast<jarray>(o52)));
1612 EXPECT_EQ(53, env->GetArrayLength(reinterpret_cast<jarray>(o53)));
1613 EXPECT_EQ(54, env->GetArrayLength(reinterpret_cast<jarray>(o54)));
1614 EXPECT_EQ(55, env->GetArrayLength(reinterpret_cast<jarray>(o55)));
1615 EXPECT_EQ(56, env->GetArrayLength(reinterpret_cast<jarray>(o56)));
1616 EXPECT_EQ(57, env->GetArrayLength(reinterpret_cast<jarray>(o57)));
1617 EXPECT_EQ(58, env->GetArrayLength(reinterpret_cast<jarray>(o58)));
1618 EXPECT_EQ(59, env->GetArrayLength(reinterpret_cast<jarray>(o59)));
1619 EXPECT_EQ(60, env->GetArrayLength(reinterpret_cast<jarray>(o60)));
1620 EXPECT_EQ(61, env->GetArrayLength(reinterpret_cast<jarray>(o61)));
1621 EXPECT_EQ(62, env->GetArrayLength(reinterpret_cast<jarray>(o62)));
1622 EXPECT_EQ(63, env->GetArrayLength(reinterpret_cast<jarray>(o63)));
1623 EXPECT_EQ(64, env->GetArrayLength(reinterpret_cast<jarray>(o64)));
1624 EXPECT_EQ(65, env->GetArrayLength(reinterpret_cast<jarray>(o65)));
1625 EXPECT_EQ(66, env->GetArrayLength(reinterpret_cast<jarray>(o66)));
1626 EXPECT_EQ(67, env->GetArrayLength(reinterpret_cast<jarray>(o67)));
1627 EXPECT_EQ(68, env->GetArrayLength(reinterpret_cast<jarray>(o68)));
1628 EXPECT_EQ(69, env->GetArrayLength(reinterpret_cast<jarray>(o69)));
1629 EXPECT_EQ(70, env->GetArrayLength(reinterpret_cast<jarray>(o70)));
1630 EXPECT_EQ(71, env->GetArrayLength(reinterpret_cast<jarray>(o71)));
1631 EXPECT_EQ(72, env->GetArrayLength(reinterpret_cast<jarray>(o72)));
1632 EXPECT_EQ(73, env->GetArrayLength(reinterpret_cast<jarray>(o73)));
1633 EXPECT_EQ(74, env->GetArrayLength(reinterpret_cast<jarray>(o74)));
1634 EXPECT_EQ(75, env->GetArrayLength(reinterpret_cast<jarray>(o75)));
1635 EXPECT_EQ(76, env->GetArrayLength(reinterpret_cast<jarray>(o76)));
1636 EXPECT_EQ(77, env->GetArrayLength(reinterpret_cast<jarray>(o77)));
1637 EXPECT_EQ(78, env->GetArrayLength(reinterpret_cast<jarray>(o78)));
1638 EXPECT_EQ(79, env->GetArrayLength(reinterpret_cast<jarray>(o79)));
1639 EXPECT_EQ(80, env->GetArrayLength(reinterpret_cast<jarray>(o80)));
1640 EXPECT_EQ(81, env->GetArrayLength(reinterpret_cast<jarray>(o81)));
1641 EXPECT_EQ(82, env->GetArrayLength(reinterpret_cast<jarray>(o82)));
1642 EXPECT_EQ(83, env->GetArrayLength(reinterpret_cast<jarray>(o83)));
1643 EXPECT_EQ(84, env->GetArrayLength(reinterpret_cast<jarray>(o84)));
1644 EXPECT_EQ(85, env->GetArrayLength(reinterpret_cast<jarray>(o85)));
1645 EXPECT_EQ(86, env->GetArrayLength(reinterpret_cast<jarray>(o86)));
1646 EXPECT_EQ(87, env->GetArrayLength(reinterpret_cast<jarray>(o87)));
1647 EXPECT_EQ(88, env->GetArrayLength(reinterpret_cast<jarray>(o88)));
1648 EXPECT_EQ(89, env->GetArrayLength(reinterpret_cast<jarray>(o89)));
1649 EXPECT_EQ(90, env->GetArrayLength(reinterpret_cast<jarray>(o90)));
1650 EXPECT_EQ(91, env->GetArrayLength(reinterpret_cast<jarray>(o91)));
1651 EXPECT_EQ(92, env->GetArrayLength(reinterpret_cast<jarray>(o92)));
1652 EXPECT_EQ(93, env->GetArrayLength(reinterpret_cast<jarray>(o93)));
1653 EXPECT_EQ(94, env->GetArrayLength(reinterpret_cast<jarray>(o94)));
1654 EXPECT_EQ(95, env->GetArrayLength(reinterpret_cast<jarray>(o95)));
1655 EXPECT_EQ(96, env->GetArrayLength(reinterpret_cast<jarray>(o96)));
1656 EXPECT_EQ(97, env->GetArrayLength(reinterpret_cast<jarray>(o97)));
1657 EXPECT_EQ(98, env->GetArrayLength(reinterpret_cast<jarray>(o98)));
1658 EXPECT_EQ(99, env->GetArrayLength(reinterpret_cast<jarray>(o99)));
1659 EXPECT_EQ(100, env->GetArrayLength(reinterpret_cast<jarray>(o100)));
1660 EXPECT_EQ(101, env->GetArrayLength(reinterpret_cast<jarray>(o101)));
1661 EXPECT_EQ(102, env->GetArrayLength(reinterpret_cast<jarray>(o102)));
1662 EXPECT_EQ(103, env->GetArrayLength(reinterpret_cast<jarray>(o103)));
1663 EXPECT_EQ(104, env->GetArrayLength(reinterpret_cast<jarray>(o104)));
1664 EXPECT_EQ(105, env->GetArrayLength(reinterpret_cast<jarray>(o105)));
1665 EXPECT_EQ(106, env->GetArrayLength(reinterpret_cast<jarray>(o106)));
1666 EXPECT_EQ(107, env->GetArrayLength(reinterpret_cast<jarray>(o107)));
1667 EXPECT_EQ(108, env->GetArrayLength(reinterpret_cast<jarray>(o108)));
1668 EXPECT_EQ(109, env->GetArrayLength(reinterpret_cast<jarray>(o109)));
1669 EXPECT_EQ(110, env->GetArrayLength(reinterpret_cast<jarray>(o110)));
1670 EXPECT_EQ(111, env->GetArrayLength(reinterpret_cast<jarray>(o111)));
1671 EXPECT_EQ(112, env->GetArrayLength(reinterpret_cast<jarray>(o112)));
1672 EXPECT_EQ(113, env->GetArrayLength(reinterpret_cast<jarray>(o113)));
1673 EXPECT_EQ(114, env->GetArrayLength(reinterpret_cast<jarray>(o114)));
1674 EXPECT_EQ(115, env->GetArrayLength(reinterpret_cast<jarray>(o115)));
1675 EXPECT_EQ(116, env->GetArrayLength(reinterpret_cast<jarray>(o116)));
1676 EXPECT_EQ(117, env->GetArrayLength(reinterpret_cast<jarray>(o117)));
1677 EXPECT_EQ(118, env->GetArrayLength(reinterpret_cast<jarray>(o118)));
1678 EXPECT_EQ(119, env->GetArrayLength(reinterpret_cast<jarray>(o119)));
1679 EXPECT_EQ(120, env->GetArrayLength(reinterpret_cast<jarray>(o120)));
1680 EXPECT_EQ(121, env->GetArrayLength(reinterpret_cast<jarray>(o121)));
1681 EXPECT_EQ(122, env->GetArrayLength(reinterpret_cast<jarray>(o122)));
1682 EXPECT_EQ(123, env->GetArrayLength(reinterpret_cast<jarray>(o123)));
1683 EXPECT_EQ(124, env->GetArrayLength(reinterpret_cast<jarray>(o124)));
1684 EXPECT_EQ(125, env->GetArrayLength(reinterpret_cast<jarray>(o125)));
1685 EXPECT_EQ(126, env->GetArrayLength(reinterpret_cast<jarray>(o126)));
1686 EXPECT_EQ(127, env->GetArrayLength(reinterpret_cast<jarray>(o127)));
1687 EXPECT_EQ(128, env->GetArrayLength(reinterpret_cast<jarray>(o128)));
1688 EXPECT_EQ(129, env->GetArrayLength(reinterpret_cast<jarray>(o129)));
1689 EXPECT_EQ(130, env->GetArrayLength(reinterpret_cast<jarray>(o130)));
1690 EXPECT_EQ(131, env->GetArrayLength(reinterpret_cast<jarray>(o131)));
1691 EXPECT_EQ(132, env->GetArrayLength(reinterpret_cast<jarray>(o132)));
1692 EXPECT_EQ(133, env->GetArrayLength(reinterpret_cast<jarray>(o133)));
1693 EXPECT_EQ(134, env->GetArrayLength(reinterpret_cast<jarray>(o134)));
1694 EXPECT_EQ(135, env->GetArrayLength(reinterpret_cast<jarray>(o135)));
1695 EXPECT_EQ(136, env->GetArrayLength(reinterpret_cast<jarray>(o136)));
1696 EXPECT_EQ(137, env->GetArrayLength(reinterpret_cast<jarray>(o137)));
1697 EXPECT_EQ(138, env->GetArrayLength(reinterpret_cast<jarray>(o138)));
1698 EXPECT_EQ(139, env->GetArrayLength(reinterpret_cast<jarray>(o139)));
1699 EXPECT_EQ(140, env->GetArrayLength(reinterpret_cast<jarray>(o140)));
1700 EXPECT_EQ(141, env->GetArrayLength(reinterpret_cast<jarray>(o141)));
1701 EXPECT_EQ(142, env->GetArrayLength(reinterpret_cast<jarray>(o142)));
1702 EXPECT_EQ(143, env->GetArrayLength(reinterpret_cast<jarray>(o143)));
1703 EXPECT_EQ(144, env->GetArrayLength(reinterpret_cast<jarray>(o144)));
1704 EXPECT_EQ(145, env->GetArrayLength(reinterpret_cast<jarray>(o145)));
1705 EXPECT_EQ(146, env->GetArrayLength(reinterpret_cast<jarray>(o146)));
1706 EXPECT_EQ(147, env->GetArrayLength(reinterpret_cast<jarray>(o147)));
1707 EXPECT_EQ(148, env->GetArrayLength(reinterpret_cast<jarray>(o148)));
1708 EXPECT_EQ(149, env->GetArrayLength(reinterpret_cast<jarray>(o149)));
1709 EXPECT_EQ(150, env->GetArrayLength(reinterpret_cast<jarray>(o150)));
1710 EXPECT_EQ(151, env->GetArrayLength(reinterpret_cast<jarray>(o151)));
1711 EXPECT_EQ(152, env->GetArrayLength(reinterpret_cast<jarray>(o152)));
1712 EXPECT_EQ(153, env->GetArrayLength(reinterpret_cast<jarray>(o153)));
1713 EXPECT_EQ(154, env->GetArrayLength(reinterpret_cast<jarray>(o154)));
1714 EXPECT_EQ(155, env->GetArrayLength(reinterpret_cast<jarray>(o155)));
1715 EXPECT_EQ(156, env->GetArrayLength(reinterpret_cast<jarray>(o156)));
1716 EXPECT_EQ(157, env->GetArrayLength(reinterpret_cast<jarray>(o157)));
1717 EXPECT_EQ(158, env->GetArrayLength(reinterpret_cast<jarray>(o158)));
1718 EXPECT_EQ(159, env->GetArrayLength(reinterpret_cast<jarray>(o159)));
1719 EXPECT_EQ(160, env->GetArrayLength(reinterpret_cast<jarray>(o160)));
1720 EXPECT_EQ(161, env->GetArrayLength(reinterpret_cast<jarray>(o161)));
1721 EXPECT_EQ(162, env->GetArrayLength(reinterpret_cast<jarray>(o162)));
1722 EXPECT_EQ(163, env->GetArrayLength(reinterpret_cast<jarray>(o163)));
1723 EXPECT_EQ(164, env->GetArrayLength(reinterpret_cast<jarray>(o164)));
1724 EXPECT_EQ(165, env->GetArrayLength(reinterpret_cast<jarray>(o165)));
1725 EXPECT_EQ(166, env->GetArrayLength(reinterpret_cast<jarray>(o166)));
1726 EXPECT_EQ(167, env->GetArrayLength(reinterpret_cast<jarray>(o167)));
1727 EXPECT_EQ(168, env->GetArrayLength(reinterpret_cast<jarray>(o168)));
1728 EXPECT_EQ(169, env->GetArrayLength(reinterpret_cast<jarray>(o169)));
1729 EXPECT_EQ(170, env->GetArrayLength(reinterpret_cast<jarray>(o170)));
1730 EXPECT_EQ(171, env->GetArrayLength(reinterpret_cast<jarray>(o171)));
1731 EXPECT_EQ(172, env->GetArrayLength(reinterpret_cast<jarray>(o172)));
1732 EXPECT_EQ(173, env->GetArrayLength(reinterpret_cast<jarray>(o173)));
1733 EXPECT_EQ(174, env->GetArrayLength(reinterpret_cast<jarray>(o174)));
1734 EXPECT_EQ(175, env->GetArrayLength(reinterpret_cast<jarray>(o175)));
1735 EXPECT_EQ(176, env->GetArrayLength(reinterpret_cast<jarray>(o176)));
1736 EXPECT_EQ(177, env->GetArrayLength(reinterpret_cast<jarray>(o177)));
1737 EXPECT_EQ(178, env->GetArrayLength(reinterpret_cast<jarray>(o178)));
1738 EXPECT_EQ(179, env->GetArrayLength(reinterpret_cast<jarray>(o179)));
1739 EXPECT_EQ(180, env->GetArrayLength(reinterpret_cast<jarray>(o180)));
1740 EXPECT_EQ(181, env->GetArrayLength(reinterpret_cast<jarray>(o181)));
1741 EXPECT_EQ(182, env->GetArrayLength(reinterpret_cast<jarray>(o182)));
1742 EXPECT_EQ(183, env->GetArrayLength(reinterpret_cast<jarray>(o183)));
1743 EXPECT_EQ(184, env->GetArrayLength(reinterpret_cast<jarray>(o184)));
1744 EXPECT_EQ(185, env->GetArrayLength(reinterpret_cast<jarray>(o185)));
1745 EXPECT_EQ(186, env->GetArrayLength(reinterpret_cast<jarray>(o186)));
1746 EXPECT_EQ(187, env->GetArrayLength(reinterpret_cast<jarray>(o187)));
1747 EXPECT_EQ(188, env->GetArrayLength(reinterpret_cast<jarray>(o188)));
1748 EXPECT_EQ(189, env->GetArrayLength(reinterpret_cast<jarray>(o189)));
1749 EXPECT_EQ(190, env->GetArrayLength(reinterpret_cast<jarray>(o190)));
1750 EXPECT_EQ(191, env->GetArrayLength(reinterpret_cast<jarray>(o191)));
1751 EXPECT_EQ(192, env->GetArrayLength(reinterpret_cast<jarray>(o192)));
1752 EXPECT_EQ(193, env->GetArrayLength(reinterpret_cast<jarray>(o193)));
1753 EXPECT_EQ(194, env->GetArrayLength(reinterpret_cast<jarray>(o194)));
1754 EXPECT_EQ(195, env->GetArrayLength(reinterpret_cast<jarray>(o195)));
1755 EXPECT_EQ(196, env->GetArrayLength(reinterpret_cast<jarray>(o196)));
1756 EXPECT_EQ(197, env->GetArrayLength(reinterpret_cast<jarray>(o197)));
1757 EXPECT_EQ(198, env->GetArrayLength(reinterpret_cast<jarray>(o198)));
1758 EXPECT_EQ(199, env->GetArrayLength(reinterpret_cast<jarray>(o199)));
1759 EXPECT_EQ(200, env->GetArrayLength(reinterpret_cast<jarray>(o200)));
1760 EXPECT_EQ(201, env->GetArrayLength(reinterpret_cast<jarray>(o201)));
1761 EXPECT_EQ(202, env->GetArrayLength(reinterpret_cast<jarray>(o202)));
1762 EXPECT_EQ(203, env->GetArrayLength(reinterpret_cast<jarray>(o203)));
1763 EXPECT_EQ(204, env->GetArrayLength(reinterpret_cast<jarray>(o204)));
1764 EXPECT_EQ(205, env->GetArrayLength(reinterpret_cast<jarray>(o205)));
1765 EXPECT_EQ(206, env->GetArrayLength(reinterpret_cast<jarray>(o206)));
1766 EXPECT_EQ(207, env->GetArrayLength(reinterpret_cast<jarray>(o207)));
1767 EXPECT_EQ(208, env->GetArrayLength(reinterpret_cast<jarray>(o208)));
1768 EXPECT_EQ(209, env->GetArrayLength(reinterpret_cast<jarray>(o209)));
1769 EXPECT_EQ(210, env->GetArrayLength(reinterpret_cast<jarray>(o210)));
1770 EXPECT_EQ(211, env->GetArrayLength(reinterpret_cast<jarray>(o211)));
1771 EXPECT_EQ(212, env->GetArrayLength(reinterpret_cast<jarray>(o212)));
1772 EXPECT_EQ(213, env->GetArrayLength(reinterpret_cast<jarray>(o213)));
1773 EXPECT_EQ(214, env->GetArrayLength(reinterpret_cast<jarray>(o214)));
1774 EXPECT_EQ(215, env->GetArrayLength(reinterpret_cast<jarray>(o215)));
1775 EXPECT_EQ(216, env->GetArrayLength(reinterpret_cast<jarray>(o216)));
1776 EXPECT_EQ(217, env->GetArrayLength(reinterpret_cast<jarray>(o217)));
1777 EXPECT_EQ(218, env->GetArrayLength(reinterpret_cast<jarray>(o218)));
1778 EXPECT_EQ(219, env->GetArrayLength(reinterpret_cast<jarray>(o219)));
1779 EXPECT_EQ(220, env->GetArrayLength(reinterpret_cast<jarray>(o220)));
1780 EXPECT_EQ(221, env->GetArrayLength(reinterpret_cast<jarray>(o221)));
1781 EXPECT_EQ(222, env->GetArrayLength(reinterpret_cast<jarray>(o222)));
1782 EXPECT_EQ(223, env->GetArrayLength(reinterpret_cast<jarray>(o223)));
1783 EXPECT_EQ(224, env->GetArrayLength(reinterpret_cast<jarray>(o224)));
1784 EXPECT_EQ(225, env->GetArrayLength(reinterpret_cast<jarray>(o225)));
1785 EXPECT_EQ(226, env->GetArrayLength(reinterpret_cast<jarray>(o226)));
1786 EXPECT_EQ(227, env->GetArrayLength(reinterpret_cast<jarray>(o227)));
1787 EXPECT_EQ(228, env->GetArrayLength(reinterpret_cast<jarray>(o228)));
1788 EXPECT_EQ(229, env->GetArrayLength(reinterpret_cast<jarray>(o229)));
1789 EXPECT_EQ(230, env->GetArrayLength(reinterpret_cast<jarray>(o230)));
1790 EXPECT_EQ(231, env->GetArrayLength(reinterpret_cast<jarray>(o231)));
1791 EXPECT_EQ(232, env->GetArrayLength(reinterpret_cast<jarray>(o232)));
1792 EXPECT_EQ(233, env->GetArrayLength(reinterpret_cast<jarray>(o233)));
1793 EXPECT_EQ(234, env->GetArrayLength(reinterpret_cast<jarray>(o234)));
1794 EXPECT_EQ(235, env->GetArrayLength(reinterpret_cast<jarray>(o235)));
1795 EXPECT_EQ(236, env->GetArrayLength(reinterpret_cast<jarray>(o236)));
1796 EXPECT_EQ(237, env->GetArrayLength(reinterpret_cast<jarray>(o237)));
1797 EXPECT_EQ(238, env->GetArrayLength(reinterpret_cast<jarray>(o238)));
1798 EXPECT_EQ(239, env->GetArrayLength(reinterpret_cast<jarray>(o239)));
1799 EXPECT_EQ(240, env->GetArrayLength(reinterpret_cast<jarray>(o240)));
1800 EXPECT_EQ(241, env->GetArrayLength(reinterpret_cast<jarray>(o241)));
1801 EXPECT_EQ(242, env->GetArrayLength(reinterpret_cast<jarray>(o242)));
1802 EXPECT_EQ(243, env->GetArrayLength(reinterpret_cast<jarray>(o243)));
1803 EXPECT_EQ(244, env->GetArrayLength(reinterpret_cast<jarray>(o244)));
1804 EXPECT_EQ(245, env->GetArrayLength(reinterpret_cast<jarray>(o245)));
1805 EXPECT_EQ(246, env->GetArrayLength(reinterpret_cast<jarray>(o246)));
1806 EXPECT_EQ(247, env->GetArrayLength(reinterpret_cast<jarray>(o247)));
1807 EXPECT_EQ(248, env->GetArrayLength(reinterpret_cast<jarray>(o248)));
1808 EXPECT_EQ(249, env->GetArrayLength(reinterpret_cast<jarray>(o249)));
1809 EXPECT_EQ(250, env->GetArrayLength(reinterpret_cast<jarray>(o250)));
1810 EXPECT_EQ(251, env->GetArrayLength(reinterpret_cast<jarray>(o251)));
1811 EXPECT_EQ(252, env->GetArrayLength(reinterpret_cast<jarray>(o252)));
1812 EXPECT_EQ(253, env->GetArrayLength(reinterpret_cast<jarray>(o253)));
1813 }
1814}
1815
1816const char* longSig =
1817 "(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1818 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1819 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1820 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1821 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1822 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1823 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1824 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1825 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1826 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1827 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1828 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1829 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1830 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1831 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1832 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1833 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1834 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1835 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1836 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1837 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1838 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1839 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1840 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1841 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1842 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1843 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1844 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1845 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1846 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1847 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1848 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1849 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1850 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1851 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1852 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1853 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1854 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1855 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1856 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1857 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1858 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1859 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1860 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1861 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1862 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1863 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1864 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1865 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1866 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1867 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)V";
1868
Andreas Gampe6e498692014-08-18 16:43:12 -07001869void JniCompilerTest::MaxParamNumberImpl() {
Andreas Gampe7a0e5042014-03-07 13:03:19 -08001870 SetUpForTest(false, "maxParamNumber", longSig,
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001871 CURRENT_JNI_WRAPPER(Java_MyClassNatives_maxParamNumber));
Andreas Gampe7a0e5042014-03-07 13:03:19 -08001872
1873 jvalue args[254];
1874
1875 // First test: test with all arguments null.
1876 for (int i = 0; i < 254; ++i) {
1877 args[i].l = nullptr;
1878 }
1879
1880 env_->CallNonvirtualVoidMethodA(jobj_, jklass_, jmethod_, args);
1881
1882 // Second test: test with int[] objects with increasing lengths
1883 for (int i = 0; i < 254; ++i) {
1884 jintArray tmp = env_->NewIntArray(i);
1885 args[i].l = tmp;
1886 EXPECT_NE(args[i].l, nullptr);
1887 }
1888
1889 env_->CallNonvirtualVoidMethodA(jobj_, jklass_, jmethod_, args);
1890}
1891
Andreas Gampe6e498692014-08-18 16:43:12 -07001892JNI_TEST(MaxParamNumber)
1893
1894void JniCompilerTest::WithoutImplementationImpl() {
Andreas Gampe369810a2015-01-14 19:53:31 -08001895 // This will lead to error messages in the log.
1896 ScopedLogSeverity sls(LogSeverity::FATAL);
1897
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001898 SetUpForTest(false, "withoutImplementation", "()V", NORMAL_JNI_ONLY_NULLPTR);
Andreas Gampead615172014-04-04 16:20:13 -07001899
1900 env_->CallVoidMethod(jobj_, jmethod_);
1901
1902 EXPECT_TRUE(Thread::Current()->IsExceptionPending());
1903 EXPECT_TRUE(env_->ExceptionCheck() == JNI_TRUE);
1904}
1905
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001906// TODO: Don't test @FastNative here since it goes through a stub lookup (unsupported) which would
1907// normally fail with an exception, but fails with an assert.
1908JNI_TEST_NORMAL_ONLY(WithoutImplementation)
Andreas Gampe6e498692014-08-18 16:43:12 -07001909
Andreas Gampe48ee3562015-04-10 19:57:29 -07001910void JniCompilerTest::WithoutImplementationRefReturnImpl() {
1911 // This will lead to error messages in the log.
1912 ScopedLogSeverity sls(LogSeverity::FATAL);
1913
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001914 SetUpForTest(false,
1915 "withoutImplementationRefReturn",
1916 "()Ljava/lang/Object;",
1917 NORMAL_JNI_ONLY_NULLPTR);
Andreas Gampe48ee3562015-04-10 19:57:29 -07001918
1919 env_->CallObjectMethod(jobj_, jmethod_);
1920
1921 EXPECT_TRUE(Thread::Current()->IsExceptionPending());
1922 EXPECT_TRUE(env_->ExceptionCheck() == JNI_TRUE);
1923}
1924
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001925// TODO: Should work for @FastNative too.
1926JNI_TEST_NORMAL_ONLY(WithoutImplementationRefReturn)
Andreas Gampe48ee3562015-04-10 19:57:29 -07001927
Ian Rogers6a3c1fc2014-10-31 00:33:20 -07001928void Java_MyClassNatives_stackArgsIntsFirst(JNIEnv*, jclass, jint i1, jint i2, jint i3,
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001929 jint i4, jint i5, jint i6, jint i7, jint i8, jint i9,
1930 jint i10, jfloat f1, jfloat f2, jfloat f3, jfloat f4,
1931 jfloat f5, jfloat f6, jfloat f7, jfloat f8, jfloat f9,
1932 jfloat f10) {
1933 EXPECT_EQ(i1, 1);
1934 EXPECT_EQ(i2, 2);
1935 EXPECT_EQ(i3, 3);
1936 EXPECT_EQ(i4, 4);
1937 EXPECT_EQ(i5, 5);
1938 EXPECT_EQ(i6, 6);
1939 EXPECT_EQ(i7, 7);
1940 EXPECT_EQ(i8, 8);
1941 EXPECT_EQ(i9, 9);
1942 EXPECT_EQ(i10, 10);
1943
Roland Levillainda4d79b2015-03-24 14:36:11 +00001944 jint i11 = bit_cast<jint, jfloat>(f1);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001945 EXPECT_EQ(i11, 11);
Roland Levillainda4d79b2015-03-24 14:36:11 +00001946 jint i12 = bit_cast<jint, jfloat>(f2);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001947 EXPECT_EQ(i12, 12);
Roland Levillainda4d79b2015-03-24 14:36:11 +00001948 jint i13 = bit_cast<jint, jfloat>(f3);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001949 EXPECT_EQ(i13, 13);
Roland Levillainda4d79b2015-03-24 14:36:11 +00001950 jint i14 = bit_cast<jint, jfloat>(f4);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001951 EXPECT_EQ(i14, 14);
Roland Levillainda4d79b2015-03-24 14:36:11 +00001952 jint i15 = bit_cast<jint, jfloat>(f5);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001953 EXPECT_EQ(i15, 15);
Roland Levillainda4d79b2015-03-24 14:36:11 +00001954 jint i16 = bit_cast<jint, jfloat>(f6);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001955 EXPECT_EQ(i16, 16);
Roland Levillainda4d79b2015-03-24 14:36:11 +00001956 jint i17 = bit_cast<jint, jfloat>(f7);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001957 EXPECT_EQ(i17, 17);
Roland Levillainda4d79b2015-03-24 14:36:11 +00001958 jint i18 = bit_cast<jint, jfloat>(f8);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001959 EXPECT_EQ(i18, 18);
Roland Levillainda4d79b2015-03-24 14:36:11 +00001960 jint i19 = bit_cast<jint, jfloat>(f9);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001961 EXPECT_EQ(i19, 19);
Roland Levillainda4d79b2015-03-24 14:36:11 +00001962 jint i20 = bit_cast<jint, jfloat>(f10);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001963 EXPECT_EQ(i20, 20);
1964}
1965
Andreas Gampe6e498692014-08-18 16:43:12 -07001966void JniCompilerTest::StackArgsIntsFirstImpl() {
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001967 SetUpForTest(true, "stackArgsIntsFirst", "(IIIIIIIIIIFFFFFFFFFF)V",
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001968 CURRENT_JNI_WRAPPER(Java_MyClassNatives_stackArgsIntsFirst));
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001969
1970 jint i1 = 1;
1971 jint i2 = 2;
1972 jint i3 = 3;
1973 jint i4 = 4;
1974 jint i5 = 5;
1975 jint i6 = 6;
1976 jint i7 = 7;
1977 jint i8 = 8;
1978 jint i9 = 9;
1979 jint i10 = 10;
1980
Roland Levillainda4d79b2015-03-24 14:36:11 +00001981 jfloat f1 = bit_cast<jfloat, jint>(11);
1982 jfloat f2 = bit_cast<jfloat, jint>(12);
1983 jfloat f3 = bit_cast<jfloat, jint>(13);
1984 jfloat f4 = bit_cast<jfloat, jint>(14);
1985 jfloat f5 = bit_cast<jfloat, jint>(15);
1986 jfloat f6 = bit_cast<jfloat, jint>(16);
1987 jfloat f7 = bit_cast<jfloat, jint>(17);
1988 jfloat f8 = bit_cast<jfloat, jint>(18);
1989 jfloat f9 = bit_cast<jfloat, jint>(19);
1990 jfloat f10 = bit_cast<jfloat, jint>(20);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001991
1992 env_->CallStaticVoidMethod(jklass_, jmethod_, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, f1, f2,
1993 f3, f4, f5, f6, f7, f8, f9, f10);
1994}
1995
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001996JNI_TEST_CRITICAL(StackArgsIntsFirst)
Andreas Gampe6e498692014-08-18 16:43:12 -07001997
Ian Rogers6a3c1fc2014-10-31 00:33:20 -07001998void Java_MyClassNatives_stackArgsFloatsFirst(JNIEnv*, jclass, jfloat f1, jfloat f2,
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001999 jfloat f3, jfloat f4, jfloat f5, jfloat f6, jfloat f7,
2000 jfloat f8, jfloat f9, jfloat f10, jint i1, jint i2,
2001 jint i3, jint i4, jint i5, jint i6, jint i7, jint i8,
2002 jint i9, jint i10) {
2003 EXPECT_EQ(i1, 1);
2004 EXPECT_EQ(i2, 2);
2005 EXPECT_EQ(i3, 3);
2006 EXPECT_EQ(i4, 4);
2007 EXPECT_EQ(i5, 5);
2008 EXPECT_EQ(i6, 6);
2009 EXPECT_EQ(i7, 7);
2010 EXPECT_EQ(i8, 8);
2011 EXPECT_EQ(i9, 9);
2012 EXPECT_EQ(i10, 10);
2013
Roland Levillainda4d79b2015-03-24 14:36:11 +00002014 jint i11 = bit_cast<jint, jfloat>(f1);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07002015 EXPECT_EQ(i11, 11);
Roland Levillainda4d79b2015-03-24 14:36:11 +00002016 jint i12 = bit_cast<jint, jfloat>(f2);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07002017 EXPECT_EQ(i12, 12);
Roland Levillainda4d79b2015-03-24 14:36:11 +00002018 jint i13 = bit_cast<jint, jfloat>(f3);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07002019 EXPECT_EQ(i13, 13);
Roland Levillainda4d79b2015-03-24 14:36:11 +00002020 jint i14 = bit_cast<jint, jfloat>(f4);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07002021 EXPECT_EQ(i14, 14);
Roland Levillainda4d79b2015-03-24 14:36:11 +00002022 jint i15 = bit_cast<jint, jfloat>(f5);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07002023 EXPECT_EQ(i15, 15);
Roland Levillainda4d79b2015-03-24 14:36:11 +00002024 jint i16 = bit_cast<jint, jfloat>(f6);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07002025 EXPECT_EQ(i16, 16);
Roland Levillainda4d79b2015-03-24 14:36:11 +00002026 jint i17 = bit_cast<jint, jfloat>(f7);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07002027 EXPECT_EQ(i17, 17);
Roland Levillainda4d79b2015-03-24 14:36:11 +00002028 jint i18 = bit_cast<jint, jfloat>(f8);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07002029 EXPECT_EQ(i18, 18);
Roland Levillainda4d79b2015-03-24 14:36:11 +00002030 jint i19 = bit_cast<jint, jfloat>(f9);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07002031 EXPECT_EQ(i19, 19);
Roland Levillainda4d79b2015-03-24 14:36:11 +00002032 jint i20 = bit_cast<jint, jfloat>(f10);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07002033 EXPECT_EQ(i20, 20);
2034}
2035
Andreas Gampe6e498692014-08-18 16:43:12 -07002036void JniCompilerTest::StackArgsFloatsFirstImpl() {
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07002037 SetUpForTest(true, "stackArgsFloatsFirst", "(FFFFFFFFFFIIIIIIIIII)V",
Igor Murashkin367f3dd2016-09-01 17:00:24 -07002038 CURRENT_JNI_WRAPPER(Java_MyClassNatives_stackArgsFloatsFirst));
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07002039
2040 jint i1 = 1;
2041 jint i2 = 2;
2042 jint i3 = 3;
2043 jint i4 = 4;
2044 jint i5 = 5;
2045 jint i6 = 6;
2046 jint i7 = 7;
2047 jint i8 = 8;
2048 jint i9 = 9;
2049 jint i10 = 10;
2050
Roland Levillainda4d79b2015-03-24 14:36:11 +00002051 jfloat f1 = bit_cast<jfloat, jint>(11);
2052 jfloat f2 = bit_cast<jfloat, jint>(12);
2053 jfloat f3 = bit_cast<jfloat, jint>(13);
2054 jfloat f4 = bit_cast<jfloat, jint>(14);
2055 jfloat f5 = bit_cast<jfloat, jint>(15);
2056 jfloat f6 = bit_cast<jfloat, jint>(16);
2057 jfloat f7 = bit_cast<jfloat, jint>(17);
2058 jfloat f8 = bit_cast<jfloat, jint>(18);
2059 jfloat f9 = bit_cast<jfloat, jint>(19);
2060 jfloat f10 = bit_cast<jfloat, jint>(20);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07002061
2062 env_->CallStaticVoidMethod(jklass_, jmethod_, f1, f2, f3, f4, f5, f6, f7, f8, f9, f10, i1, i2, i3,
2063 i4, i5, i6, i7, i8, i9, i10);
2064}
2065
Igor Murashkin367f3dd2016-09-01 17:00:24 -07002066JNI_TEST_CRITICAL(StackArgsFloatsFirst)
Andreas Gampe6e498692014-08-18 16:43:12 -07002067
Ian Rogers6a3c1fc2014-10-31 00:33:20 -07002068void Java_MyClassNatives_stackArgsMixed(JNIEnv*, jclass, jint i1, jfloat f1, jint i2,
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07002069 jfloat f2, jint i3, jfloat f3, jint i4, jfloat f4, jint i5,
2070 jfloat f5, jint i6, jfloat f6, jint i7, jfloat f7, jint i8,
2071 jfloat f8, jint i9, jfloat f9, jint i10, jfloat f10) {
2072 EXPECT_EQ(i1, 1);
2073 EXPECT_EQ(i2, 2);
2074 EXPECT_EQ(i3, 3);
2075 EXPECT_EQ(i4, 4);
2076 EXPECT_EQ(i5, 5);
2077 EXPECT_EQ(i6, 6);
2078 EXPECT_EQ(i7, 7);
2079 EXPECT_EQ(i8, 8);
2080 EXPECT_EQ(i9, 9);
2081 EXPECT_EQ(i10, 10);
2082
Roland Levillainda4d79b2015-03-24 14:36:11 +00002083 jint i11 = bit_cast<jint, jfloat>(f1);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07002084 EXPECT_EQ(i11, 11);
Roland Levillainda4d79b2015-03-24 14:36:11 +00002085 jint i12 = bit_cast<jint, jfloat>(f2);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07002086 EXPECT_EQ(i12, 12);
Roland Levillainda4d79b2015-03-24 14:36:11 +00002087 jint i13 = bit_cast<jint, jfloat>(f3);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07002088 EXPECT_EQ(i13, 13);
Roland Levillainda4d79b2015-03-24 14:36:11 +00002089 jint i14 = bit_cast<jint, jfloat>(f4);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07002090 EXPECT_EQ(i14, 14);
Roland Levillainda4d79b2015-03-24 14:36:11 +00002091 jint i15 = bit_cast<jint, jfloat>(f5);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07002092 EXPECT_EQ(i15, 15);
Roland Levillainda4d79b2015-03-24 14:36:11 +00002093 jint i16 = bit_cast<jint, jfloat>(f6);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07002094 EXPECT_EQ(i16, 16);
Roland Levillainda4d79b2015-03-24 14:36:11 +00002095 jint i17 = bit_cast<jint, jfloat>(f7);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07002096 EXPECT_EQ(i17, 17);
Roland Levillainda4d79b2015-03-24 14:36:11 +00002097 jint i18 = bit_cast<jint, jfloat>(f8);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07002098 EXPECT_EQ(i18, 18);
Roland Levillainda4d79b2015-03-24 14:36:11 +00002099 jint i19 = bit_cast<jint, jfloat>(f9);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07002100 EXPECT_EQ(i19, 19);
Roland Levillainda4d79b2015-03-24 14:36:11 +00002101 jint i20 = bit_cast<jint, jfloat>(f10);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07002102 EXPECT_EQ(i20, 20);
2103}
2104
Andreas Gampe6e498692014-08-18 16:43:12 -07002105void JniCompilerTest::StackArgsMixedImpl() {
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07002106 SetUpForTest(true, "stackArgsMixed", "(IFIFIFIFIFIFIFIFIFIF)V",
Igor Murashkin367f3dd2016-09-01 17:00:24 -07002107 CURRENT_JNI_WRAPPER(Java_MyClassNatives_stackArgsMixed));
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07002108
2109 jint i1 = 1;
2110 jint i2 = 2;
2111 jint i3 = 3;
2112 jint i4 = 4;
2113 jint i5 = 5;
2114 jint i6 = 6;
2115 jint i7 = 7;
2116 jint i8 = 8;
2117 jint i9 = 9;
2118 jint i10 = 10;
2119
Roland Levillainda4d79b2015-03-24 14:36:11 +00002120 jfloat f1 = bit_cast<jfloat, jint>(11);
2121 jfloat f2 = bit_cast<jfloat, jint>(12);
2122 jfloat f3 = bit_cast<jfloat, jint>(13);
2123 jfloat f4 = bit_cast<jfloat, jint>(14);
2124 jfloat f5 = bit_cast<jfloat, jint>(15);
2125 jfloat f6 = bit_cast<jfloat, jint>(16);
2126 jfloat f7 = bit_cast<jfloat, jint>(17);
2127 jfloat f8 = bit_cast<jfloat, jint>(18);
2128 jfloat f9 = bit_cast<jfloat, jint>(19);
2129 jfloat f10 = bit_cast<jfloat, jint>(20);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07002130
2131 env_->CallStaticVoidMethod(jklass_, jmethod_, i1, f1, i2, f2, i3, f3, i4, f4, i5, f5, i6, f6, i7,
2132 f7, i8, f8, i9, f9, i10, f10);
2133}
2134
Igor Murashkin367f3dd2016-09-01 17:00:24 -07002135JNI_TEST_CRITICAL(StackArgsMixed)
Andreas Gampe6e498692014-08-18 16:43:12 -07002136
Lazar Trsicf652d602015-06-24 16:30:21 +02002137void Java_MyClassNatives_stackArgsSignExtendedMips64(JNIEnv*, jclass, jint i1, jint i2, jint i3,
2138 jint i4, jint i5, jint i6, jint i7, jint i8) {
2139 EXPECT_EQ(i1, 1);
2140 EXPECT_EQ(i2, 2);
2141 EXPECT_EQ(i3, 3);
2142 EXPECT_EQ(i4, 4);
2143 EXPECT_EQ(i5, 5);
2144 EXPECT_EQ(i6, 6);
2145 EXPECT_EQ(i7, 7);
2146 EXPECT_EQ(i8, -8);
2147
2148#if defined(__mips__) && defined(__LP64__) && (__BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__)
2149 // Mips64 ABI requires that arguments passed through stack be sign-extended 8B slots.
2150 // First 8 arguments are passed through registers, check i7 and i8.
2151 uint32_t stack1_high = *(&i7 + 1);
2152 uint32_t stack2_high = *(&i8 + 1);
2153
2154 EXPECT_EQ(stack1_high, static_cast<uint32_t>(0));
2155 EXPECT_EQ(stack2_high, static_cast<uint32_t>(0xffffffff));
2156#else
2157 LOG(INFO) << "Skipping stackArgsSignExtendedMips64 as there is nothing to be done on "
2158 << kRuntimeISA;
2159 // Force-print to std::cout so it's also outside the logcat.
2160 std::cout << "Skipping stackArgsSignExtendedMips64 as there is nothing to be done on "
2161 << kRuntimeISA << std::endl;
2162#endif
2163}
2164
2165void JniCompilerTest::StackArgsSignExtendedMips64Impl() {
2166 SetUpForTest(true, "stackArgsSignExtendedMips64", "(IIIIIIII)V",
Igor Murashkin367f3dd2016-09-01 17:00:24 -07002167 CURRENT_JNI_WRAPPER(Java_MyClassNatives_stackArgsSignExtendedMips64));
Lazar Trsicf652d602015-06-24 16:30:21 +02002168 jint i1 = 1;
2169 jint i2 = 2;
2170 jint i3 = 3;
2171 jint i4 = 4;
2172 jint i5 = 5;
2173 jint i6 = 6;
2174 jint i7 = 7;
2175 jint i8 = -8;
2176
2177 env_->CallStaticVoidMethod(jklass_, jmethod_, i1, i2, i3, i4, i5, i6, i7, i8);
2178}
2179
Igor Murashkin367f3dd2016-09-01 17:00:24 -07002180JNI_TEST_CRITICAL(StackArgsSignExtendedMips64)
Lazar Trsicf652d602015-06-24 16:30:21 +02002181
Igor Murashkin9d4b6da2016-07-29 09:51:58 -07002182void Java_MyClassNatives_normalNative(JNIEnv*, jclass) {
2183 // Intentionally left empty.
2184}
2185
2186// Methods not annotated with anything are not considered "fast native"
2187// -- Check that the annotation lookup does not find it.
2188void JniCompilerTest::NormalNativeImpl() {
2189 SetUpForTest(/* direct */ true,
2190 "normalNative",
2191 "()V",
Igor Murashkin367f3dd2016-09-01 17:00:24 -07002192 CURRENT_JNI_WRAPPER(Java_MyClassNatives_normalNative));
Igor Murashkin9d4b6da2016-07-29 09:51:58 -07002193
2194 ScopedObjectAccess soa(Thread::Current());
2195 ArtMethod* method = soa.DecodeMethod(jmethod_);
2196 ASSERT_TRUE(method != nullptr);
2197
Igor Murashkin367f3dd2016-09-01 17:00:24 -07002198 EXPECT_FALSE(method->IsAnnotatedWithCriticalNative());
Igor Murashkin9d4b6da2016-07-29 09:51:58 -07002199 EXPECT_FALSE(method->IsAnnotatedWithFastNative());
2200}
Igor Murashkin367f3dd2016-09-01 17:00:24 -07002201
2202// TODO: just rename the java functions to the standard convention and remove duplicated tests
2203JNI_TEST_NORMAL_ONLY(NormalNative)
Igor Murashkin9d4b6da2016-07-29 09:51:58 -07002204
2205// Methods annotated with @FastNative are considered "fast native"
2206// -- Check that the annotation lookup succeeds.
2207void Java_MyClassNatives_fastNative(JNIEnv*, jclass) {
2208 // Intentionally left empty.
2209}
2210
2211void JniCompilerTest::FastNativeImpl() {
2212 SetUpForTest(/* direct */ true,
2213 "fastNative",
2214 "()V",
Igor Murashkin367f3dd2016-09-01 17:00:24 -07002215 CURRENT_JNI_WRAPPER(Java_MyClassNatives_fastNative));
Igor Murashkin9d4b6da2016-07-29 09:51:58 -07002216
2217 ScopedObjectAccess soa(Thread::Current());
2218 ArtMethod* method = soa.DecodeMethod(jmethod_);
2219 ASSERT_TRUE(method != nullptr);
2220
Igor Murashkin367f3dd2016-09-01 17:00:24 -07002221 EXPECT_FALSE(method->IsAnnotatedWithCriticalNative());
Igor Murashkin9d4b6da2016-07-29 09:51:58 -07002222 EXPECT_TRUE(method->IsAnnotatedWithFastNative());
2223}
Igor Murashkin367f3dd2016-09-01 17:00:24 -07002224
2225// TODO: just rename the java functions to the standard convention and remove duplicated tests
2226JNI_TEST_NORMAL_ONLY(FastNative)
2227
2228int gJava_myClassNatives_criticalNative_calls[kJniKindCount] = {};
2229// Methods annotated with @CriticalNative are considered "critical native"
2230// -- Check that the annotation lookup succeeds.
2231void Java_MyClassNatives_criticalNative() {
2232 gJava_myClassNatives_criticalNative_calls[gCurrentJni]++;
2233}
2234
2235void JniCompilerTest::CriticalNativeImpl() {
2236 SetUpForTest(/* direct */ true,
2237 // Important: Don't change the "current jni" yet to avoid a method name suffix.
2238 "criticalNative",
2239 "()V",
2240 // TODO: Use CURRENT_JNI_WRAPPER instead which is more generic.
2241 reinterpret_cast<void*>(&Java_MyClassNatives_criticalNative));
2242
2243 // TODO: remove this manual updating of the current JNI. Merge with the other tests.
2244 UpdateCurrentJni(JniKind::kCritical);
2245 ASSERT_TRUE(IsCurrentJniCritical());
2246
2247 ScopedObjectAccess soa(Thread::Current());
2248 ArtMethod* method = soa.DecodeMethod(jmethod_);
2249 ASSERT_TRUE(method != nullptr);
2250
2251 EXPECT_TRUE(method->IsAnnotatedWithCriticalNative());
2252 EXPECT_FALSE(method->IsAnnotatedWithFastNative());
2253
2254 EXPECT_EQ(0, gJava_myClassNatives_criticalNative_calls[gCurrentJni]);
2255 env_->CallStaticVoidMethod(jklass_, jmethod_);
2256 EXPECT_EQ(1, gJava_myClassNatives_criticalNative_calls[gCurrentJni]);
2257
2258 gJava_myClassNatives_criticalNative_calls[gCurrentJni] = 0;
2259}
2260
2261// TODO: just rename the java functions to the standard convention and remove duplicated tests
2262JNI_TEST_NORMAL_ONLY(CriticalNative)
Igor Murashkin9d4b6da2016-07-29 09:51:58 -07002263
Ian Rogersb033c752011-07-20 12:22:35 -07002264} // namespace art