blob: 6ce7d75da6c51200e5d55850291d97f0ce3e89e1 [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"
Pavle Batuta837e72a2016-03-16 11:31:46 +010023#include "base/bit_utils.h"
Brian Carlstrom578bbdc2011-07-21 14:07:47 -070024#include "class_linker.h"
Brian Carlstroma1ce1fe2014-02-24 23:23:58 -080025#include "common_compiler_test.h"
Igor Murashkin367f3dd2016-09-01 17:00:24 -070026#include "compiler.h"
Brian Carlstrom578bbdc2011-07-21 14:07:47 -070027#include "dex_file.h"
Elliott Hughes90a33692011-08-30 13:27:07 -070028#include "gtest/gtest.h"
Ian Rogerscdd1d2d2011-08-18 09:58:17 -070029#include "indirect_reference_table.h"
Andreas Gampec15a2f42017-04-21 12:09:39 -070030#include "java_vm_ext.h"
Ian Rogerscdd1d2d2011-08-18 09:58:17 -070031#include "jni_internal.h"
Brian Carlstromdb4d5402011-08-09 12:18:28 -070032#include "mem_map.h"
Ian Rogers4f6ad8a2013-03-18 15:27:28 -070033#include "mirror/class-inl.h"
Ian Rogers2dd0e2c2013-01-24 12:42:14 -080034#include "mirror/class_loader.h"
Ian Rogers2dd0e2c2013-01-24 12:42:14 -080035#include "mirror/object_array-inl.h"
Ian Rogers04d7aa92013-03-16 14:29:17 -070036#include "mirror/object-inl.h"
Ian Rogers2dd0e2c2013-01-24 12:42:14 -080037#include "mirror/stack_trace_element.h"
Dimitry Ivanov5edb0632016-04-29 11:14:25 -070038#include "nativeloader/native_loader.h"
Brian Carlstrom578bbdc2011-07-21 14:07:47 -070039#include "runtime.h"
Ian Rogers00f7d0e2012-07-19 15:28:27 -070040#include "ScopedLocalRef.h"
Mathieu Chartier0795f232016-09-27 18:43:30 -070041#include "scoped_thread_state_change-inl.h"
Brian Carlstrom578bbdc2011-07-21 14:07:47 -070042#include "thread.h"
Ian Rogersb033c752011-07-20 12:22:35 -070043
Elliott Hughesb264f082012-04-06 17:10:10 -070044extern "C" JNIEXPORT jint JNICALL Java_MyClassNatives_bar(JNIEnv*, jobject, jint count) {
Brian Carlstromb9cc1ca2012-01-27 00:57:42 -080045 return count + 1;
46}
47
Elliott Hughesb264f082012-04-06 17:10:10 -070048extern "C" JNIEXPORT jint JNICALL Java_MyClassNatives_sbar(JNIEnv*, jclass, jint count) {
Ian Rogers1cefdbd2012-02-29 09:34:50 -080049 return count + 1;
50}
51
Roland Levillain97c46462017-05-11 14:04:03 +010052// TODO: In the Baker read barrier configuration, add checks to ensure
53// the Marking Register's value is correct.
54
Ian Rogersb033c752011-07-20 12:22:35 -070055namespace art {
56
Igor Murashkin367f3dd2016-09-01 17:00:24 -070057enum class JniKind {
58 kNormal = Compiler::kNone, // Regular kind of un-annotated natives.
59 kFast = Compiler::kFastNative, // Native method annotated with @FastNative.
60 kCritical = Compiler::kCriticalNative, // Native method annotated with @CriticalNative.
61 kCount = Compiler::kCriticalNative + 1 // How many different types of JNIs we can have.
62};
63
64// Used to initialize array sizes that want to have different state per current jni.
65static constexpr size_t kJniKindCount = static_cast<size_t>(JniKind::kCount);
66// Do not use directly, use the helpers instead.
67uint32_t gCurrentJni = static_cast<uint32_t>(JniKind::kNormal);
68
69// Is the current native method under test @CriticalNative?
70static bool IsCurrentJniCritical() {
71 return gCurrentJni == static_cast<uint32_t>(JniKind::kCritical);
72}
73
74// Is the current native method a plain-old non-annotated native?
75static bool IsCurrentJniNormal() {
76 return gCurrentJni == static_cast<uint32_t>(JniKind::kNormal);
77}
78
79// Signifify that a different kind of JNI is about to be tested.
80static void UpdateCurrentJni(JniKind kind) {
81 gCurrentJni = static_cast<uint32_t>(kind);
82}
83
84// (Match the name suffixes of native methods in MyClassNatives.java)
85static std::string CurrentJniStringSuffix() {
86 switch (gCurrentJni) {
87 case static_cast<uint32_t>(JniKind::kNormal): {
88 return "";
89 }
90 case static_cast<uint32_t>(JniKind::kFast): {
91 return "_Fast";
92 }
93 case static_cast<uint32_t>(JniKind::kCritical): {
94 return "_Critical";
95 }
96 default:
97 LOG(FATAL) << "Invalid current JNI value: " << gCurrentJni;
98 UNREACHABLE();
99 }
100}
101
102// Dummy values passed to our JNI handlers when we enter @CriticalNative.
103// Normally @CriticalNative calling convention strips out the "JNIEnv*, jclass" parameters.
104// However to avoid duplicating every single test method we have a templated handler
105// that inserts dummy parameters (0,1) to make it compatible with a regular JNI handler.
106static JNIEnv* const kCriticalDummyJniEnv = reinterpret_cast<JNIEnv*>(0xDEADFEAD);
107static jclass const kCriticalDummyJniClass = reinterpret_cast<jclass>(0xBEAFBEEF);
108
109// Type trait. Returns true if "T" is the same type as one of the types in Args...
110//
111// Logically equal to OR(std::same_type<T, U> for all U in Args).
112template <typename T, typename ... Args>
113struct is_any_of;
114
115template <typename T, typename U, typename ... Args>
116struct is_any_of<T, U, Args ...> {
117 using value_type = bool;
118 static constexpr const bool value = std::is_same<T, U>::value || is_any_of<T, Args ...>::value;
119};
120
121template <typename T, typename U>
122struct is_any_of<T, U> {
123 using value_type = bool;
124 static constexpr const bool value = std::is_same<T, U>::value;
125};
126
127// Type traits for JNI types.
128template <typename T>
129struct jni_type_traits {
130 // True if type T ends up holding an object reference. False otherwise.
131 // (Non-JNI types will also be false).
132 static constexpr const bool is_ref =
133 is_any_of<T, jclass, jobject, jstring, jobjectArray, jintArray,
134 jcharArray, jfloatArray, jshortArray, jdoubleArray, jlongArray>::value;
135};
136
137template <typename ... Args>
138struct count_refs_helper {
139 using value_type = size_t;
140 static constexpr const size_t value = 0;
141};
142
143template <typename Arg, typename ... Args>
144struct count_refs_helper<Arg, Args ...> {
145 using value_type = size_t;
146 static constexpr size_t value =
147 (jni_type_traits<Arg>::is_ref ? 1 : 0) + count_refs_helper<Args ...>::value;
148};
149
150template <typename T, T fn>
151struct count_refs_fn_helper;
152
153template <typename R, typename ... Args, R fn(Args...)>
154struct count_refs_fn_helper<R(Args...), fn> : public count_refs_helper<Args...> {};
155
156// Given a function type 'T' figure out how many of the parameter types are a reference.
157// -- The implicit jclass and thisObject also count as 1 reference.
158//
159// Fields:
160// * value - the result counting # of refs
161// * value_type - the type of value (size_t)
162template <typename T, T fn>
163struct count_refs : public count_refs_fn_helper<T, fn> {};
164
165// Base case: No parameters = 0 refs.
166size_t count_nonnull_refs_helper() {
167 return 0;
168}
169
170// SFINAE for ref types. 1 if non-null, 0 otherwise.
171template <typename T>
172size_t count_nonnull_refs_single_helper(T arg,
173 typename std::enable_if<jni_type_traits<T>::is_ref>::type*
174 = nullptr) {
175 return ((arg == NULL) ? 0 : 1);
176}
177
178// SFINAE for non-ref-types. Always 0.
179template <typename T>
180size_t count_nonnull_refs_single_helper(T arg ATTRIBUTE_UNUSED,
181 typename std::enable_if<!jni_type_traits<T>::is_ref>::type*
182 = nullptr) {
183 return 0;
184}
185
186// Recursive case.
187template <typename T, typename ... Args>
188size_t count_nonnull_refs_helper(T arg, Args ... args) {
189 return count_nonnull_refs_single_helper(arg) + count_nonnull_refs_helper(args...);
190}
191
192// Given any list of parameters, check how many object refs there are and only count
193// them if their runtime value is non-null.
194//
195// For example given (jobject, jint, jclass) we can get (2) if both #0/#2 are non-null,
196// (1) if either #0/#2 are null but not both, and (0) if all parameters are null.
197// Primitive parameters (including JNIEnv*, if present) are ignored.
198template <typename ... Args>
199size_t count_nonnull_refs(Args ... args) {
200 return count_nonnull_refs_helper(args...);
201}
202
203template <typename T, T fn>
204struct remove_extra_parameters_helper;
205
206template <typename R, typename Arg1, typename Arg2, typename ... Args, R fn(Arg1, Arg2, Args...)>
207struct remove_extra_parameters_helper<R(Arg1, Arg2, Args...), fn> {
208 // Note: Do not use Args&& here to maintain C-style parameter types.
209 static R apply(Args... args) {
210 JNIEnv* env = kCriticalDummyJniEnv;
211 jclass kls = kCriticalDummyJniClass;
212 return fn(env, kls, args...);
213 }
214};
215
216// Given a function 'fn' create a function 'apply' which will omit the JNIEnv/jklass parameters
217//
218// i.e. if fn(JNIEnv*,jklass,a,b,c,d,e...) then apply(a,b,c,d,e,...)
219template <typename T, T fn>
220struct jni_remove_extra_parameters : public remove_extra_parameters_helper<T, fn> {};
221
Brian Carlstroma1ce1fe2014-02-24 23:23:58 -0800222class JniCompilerTest : public CommonCompilerTest {
Ian Rogersb033c752011-07-20 12:22:35 -0700223 protected:
Andreas Gampe6e498692014-08-18 16:43:12 -0700224 void SetUp() OVERRIDE {
225 CommonCompilerTest::SetUp();
226 check_generic_jni_ = false;
227 }
228
Dimitry Ivanov5edb0632016-04-29 11:14:25 -0700229 void TearDown() OVERRIDE {
230 android::ResetNativeLoader();
231 CommonCompilerTest::TearDown();
232 }
233
Andreas Gampe6e498692014-08-18 16:43:12 -0700234 void SetCheckGenericJni(bool generic) {
235 check_generic_jni_ = generic;
236 }
237
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700238 private:
239 void CompileForTest(jobject class_loader,
240 bool direct,
241 const char* method_name,
242 const char* method_sig) {
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700243 ScopedObjectAccess soa(Thread::Current());
Mathieu Chartiereb8167a2014-05-07 15:43:14 -0700244 StackHandleScope<1> hs(soa.Self());
245 Handle<mirror::ClassLoader> loader(
Mathieu Chartier0795f232016-09-27 18:43:30 -0700246 hs.NewHandle(soa.Decode<mirror::ClassLoader>(class_loader)));
Brian Carlstrom25c33252011-09-18 15:58:35 -0700247 // Compile the native method before starting the runtime
Ian Rogers98379392014-02-24 16:53:16 -0800248 mirror::Class* c = class_linker_->FindClass(soa.Self(), "LMyClassNatives;", loader);
Mathieu Chartiere401d142015-04-22 13:56:20 -0700249 const auto pointer_size = class_linker_->GetImagePointerSize();
250 ArtMethod* method = direct ? c->FindDirectMethod(method_name, method_sig, pointer_size) :
251 c->FindVirtualMethod(method_name, method_sig, pointer_size);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700252 ASSERT_TRUE(method != nullptr) << method_name << " " << method_sig;
Andreas Gampe6e498692014-08-18 16:43:12 -0700253 if (check_generic_jni_) {
Ian Rogers6f3dbba2014-10-14 17:41:57 -0700254 method->SetEntryPointFromQuickCompiledCode(class_linker_->GetRuntimeQuickGenericJniStub());
Nicolas Geoffray54accbc2014-08-13 03:40:45 +0100255 } else {
Ian Rogers6f3dbba2014-10-14 17:41:57 -0700256 const void* code = method->GetEntryPointFromQuickCompiledCode();
257 if (code == nullptr || class_linker_->IsQuickGenericJniStub(code)) {
Nicolas Geoffray54accbc2014-08-13 03:40:45 +0100258 CompileMethod(method);
259 ASSERT_TRUE(method->GetEntryPointFromQuickCompiledCode() != nullptr)
260 << method_name << " " << method_sig;
Nicolas Geoffray54accbc2014-08-13 03:40:45 +0100261 }
Brian Carlstrom25c33252011-09-18 15:58:35 -0700262 }
Brian Carlstrom25c33252011-09-18 15:58:35 -0700263 }
264
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700265 protected:
266 void CompileForTestWithCurrentJni(jobject class_loader,
267 bool direct,
268 const char* method_name_orig,
269 const char* method_sig) {
270 // Append the JNI kind to the method name, so that we automatically get the
271 // fast or critical versions of the same method.
272 std::string method_name_str = std::string(method_name_orig) + CurrentJniStringSuffix();
273 const char* method_name = method_name_str.c_str();
274
275 CompileForTest(class_loader, direct, method_name, method_sig);
276 }
277
278 void SetUpForTest(bool direct,
279 const char* method_name_orig,
280 const char* method_sig,
Andreas Gampe6e498692014-08-18 16:43:12 -0700281 void* native_fnptr) {
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700282 // Append the JNI kind to the method name, so that we automatically get the
283 // fast or critical versions of the same method.
284 std::string method_name_str = std::string(method_name_orig) + CurrentJniStringSuffix();
285 const char* method_name = method_name_str.c_str();
286
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700287 // Initialize class loader and compile method when runtime not started.
Brian Carlstrom2ce745c2013-07-17 17:44:30 -0700288 if (!runtime_->IsStarted()) {
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700289 {
290 ScopedObjectAccess soa(Thread::Current());
291 class_loader_ = LoadDex("MyClassNatives");
292 }
Andreas Gampe6e498692014-08-18 16:43:12 -0700293 CompileForTest(class_loader_, direct, method_name, method_sig);
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700294 // Start runtime.
295 Thread::Current()->TransitionFromSuspendedToRunnable();
Dimitry Ivanov5edb0632016-04-29 11:14:25 -0700296 android::InitializeNativeLoader();
Dimitry Ivanovc544f342016-05-09 16:26:13 -0700297 bool started = runtime_->Start();
Brian Carlstrombd86bcc2013-03-10 20:26:16 -0700298 CHECK(started);
Brian Carlstrom25c33252011-09-18 15:58:35 -0700299 }
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700300 // JNI operations after runtime start.
Brian Carlstrom25c33252011-09-18 15:58:35 -0700301 env_ = Thread::Current()->GetJniEnv();
Dimitry Ivanov5edb0632016-04-29 11:14:25 -0700302 library_search_path_ = env_->NewStringUTF("");
Elliott Hughesb264f082012-04-06 17:10:10 -0700303 jklass_ = env_->FindClass("MyClassNatives");
Andreas Gampecf4035a2014-05-28 22:43:01 -0700304 ASSERT_TRUE(jklass_ != nullptr) << method_name << " " << method_sig;
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700305
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700306 if (direct) {
307 jmethod_ = env_->GetStaticMethodID(jklass_, method_name, method_sig);
308 } else {
309 jmethod_ = env_->GetMethodID(jklass_, method_name, method_sig);
310 }
Andreas Gampecf4035a2014-05-28 22:43:01 -0700311 ASSERT_TRUE(jmethod_ != nullptr) << method_name << " " << method_sig;
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700312
Andreas Gampecf4035a2014-05-28 22:43:01 -0700313 if (native_fnptr != nullptr) {
Elliott Hughesb25c3f62012-03-26 16:35:06 -0700314 JNINativeMethod methods[] = { { method_name, method_sig, native_fnptr } };
Brian Carlstromfc7120c2012-08-27 13:43:25 -0700315 ASSERT_EQ(JNI_OK, env_->RegisterNatives(jklass_, methods, 1))
316 << method_name << " " << method_sig;
Ian Rogersbdb03912011-09-14 00:55:44 -0700317 } else {
318 env_->UnregisterNatives(jklass_);
Shih-wei Liao31384c52011-09-06 15:27:45 -0700319 }
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700320
321 jmethodID constructor = env_->GetMethodID(jklass_, "<init>", "()V");
322 jobj_ = env_->NewObject(jklass_, constructor);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700323 ASSERT_TRUE(jobj_ != nullptr) << method_name << " " << method_sig;
Ian Rogersb033c752011-07-20 12:22:35 -0700324 }
325
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700326 public:
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700327 // Available as statics so our JNI handlers can access these.
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700328 static jclass jklass_;
329 static jobject jobj_;
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700330 static jobject class_loader_;
331
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700332 protected:
Andreas Gampe6e498692014-08-18 16:43:12 -0700333 // We have to list the methods here so we can share them between default and generic JNI.
334 void CompileAndRunNoArgMethodImpl();
335 void CompileAndRunIntMethodThroughStubImpl();
336 void CompileAndRunStaticIntMethodThroughStubImpl();
337 void CompileAndRunIntMethodImpl();
338 void CompileAndRunIntIntMethodImpl();
339 void CompileAndRunLongLongMethodImpl();
340 void CompileAndRunDoubleDoubleMethodImpl();
341 void CompileAndRun_fooJJ_synchronizedImpl();
342 void CompileAndRunIntObjectObjectMethodImpl();
343 void CompileAndRunStaticIntIntMethodImpl();
344 void CompileAndRunStaticDoubleDoubleMethodImpl();
345 void RunStaticLogDoubleMethodImpl();
346 void RunStaticLogFloatMethodImpl();
347 void RunStaticReturnTrueImpl();
348 void RunStaticReturnFalseImpl();
349 void RunGenericStaticReturnIntImpl();
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700350 void RunGenericStaticReturnDoubleImpl();
351 void RunGenericStaticReturnLongImpl();
Andreas Gampe6e498692014-08-18 16:43:12 -0700352 void CompileAndRunStaticIntObjectObjectMethodImpl();
353 void CompileAndRunStaticSynchronizedIntObjectObjectMethodImpl();
354 void ExceptionHandlingImpl();
355 void NativeStackTraceElementImpl();
356 void ReturnGlobalRefImpl();
357 void LocalReferenceTableClearingTestImpl();
358 void JavaLangSystemArrayCopyImpl();
359 void CompareAndSwapIntImpl();
360 void GetTextImpl();
361 void GetSinkPropertiesNativeImpl();
362 void UpcallReturnTypeChecking_InstanceImpl();
363 void UpcallReturnTypeChecking_StaticImpl();
364 void UpcallArgumentTypeChecking_InstanceImpl();
365 void UpcallArgumentTypeChecking_StaticImpl();
366 void CompileAndRunFloatFloatMethodImpl();
367 void CheckParameterAlignImpl();
368 void MaxParamNumberImpl();
369 void WithoutImplementationImpl();
Andreas Gampe48ee3562015-04-10 19:57:29 -0700370 void WithoutImplementationRefReturnImpl();
Andreas Gampe6e498692014-08-18 16:43:12 -0700371 void StackArgsIntsFirstImpl();
372 void StackArgsFloatsFirstImpl();
373 void StackArgsMixedImpl();
Pavle Batuta837e72a2016-03-16 11:31:46 +0100374#if defined(__mips__) && defined(__LP64__) && (__BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__)
Lazar Trsicf652d602015-06-24 16:30:21 +0200375 void StackArgsSignExtendedMips64Impl();
Pavle Batuta837e72a2016-03-16 11:31:46 +0100376#endif
Andreas Gampe6e498692014-08-18 16:43:12 -0700377
Igor Murashkin9d4b6da2016-07-29 09:51:58 -0700378 void NormalNativeImpl();
379 void FastNativeImpl();
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700380 void CriticalNativeImpl();
Igor Murashkin9d4b6da2016-07-29 09:51:58 -0700381
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700382 JNIEnv* env_;
Dimitry Ivanov5edb0632016-04-29 11:14:25 -0700383 jstring library_search_path_;
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700384 jmethodID jmethod_;
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700385
386 private:
Andreas Gampe6e498692014-08-18 16:43:12 -0700387 bool check_generic_jni_;
Ian Rogersb033c752011-07-20 12:22:35 -0700388};
389
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700390jclass JniCompilerTest::jklass_;
391jobject JniCompilerTest::jobj_;
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700392jobject JniCompilerTest::class_loader_;
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700393
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700394// Test the normal compiler and normal generic JNI only.
395// The following features are unsupported in @FastNative:
396// 1) JNI stubs (lookup via dlsym) when methods aren't explicitly registered
Igor Murashkinaf1e2992016-10-12 17:44:50 -0700397// 2) synchronized keyword
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700398// -- TODO: We can support (1) if we remove the mutator lock assert during stub lookup.
399# define JNI_TEST_NORMAL_ONLY(TestName) \
Igor Murashkin06a04e02016-09-13 15:57:37 -0700400 TEST_F(JniCompilerTest, TestName ## NormalCompiler) { \
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 compiler"); \
403 gCurrentJni = static_cast<uint32_t>(JniKind::kNormal); \
Andreas Gampe6e498692014-08-18 16:43:12 -0700404 TestName ## Impl(); \
405 } \
Igor Murashkin06a04e02016-09-13 15:57:37 -0700406 TEST_F(JniCompilerTest, TestName ## NormalGeneric) { \
Igor Murashkina51d8b72016-10-05 14:33:30 -0700407 ScopedCheckHandleScope top_handle_scope_check; \
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700408 SCOPED_TRACE("Normal JNI with generic"); \
409 gCurrentJni = static_cast<uint32_t>(JniKind::kNormal); \
Andreas Gampe6e498692014-08-18 16:43:12 -0700410 SetCheckGenericJni(true); \
411 TestName ## Impl(); \
412 }
Andreas Gampecf4035a2014-05-28 22:43:01 -0700413
Igor Murashkin06a04e02016-09-13 15:57:37 -0700414// Test (normal, @FastNative) x (compiler, generic).
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700415#define JNI_TEST(TestName) \
416 JNI_TEST_NORMAL_ONLY(TestName) \
Igor Murashkin06a04e02016-09-13 15:57:37 -0700417 TEST_F(JniCompilerTest, TestName ## FastCompiler) { \
Igor Murashkina51d8b72016-10-05 14:33:30 -0700418 ScopedCheckHandleScope top_handle_scope_check; \
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700419 SCOPED_TRACE("@FastNative JNI with compiler"); \
420 gCurrentJni = static_cast<uint32_t>(JniKind::kFast); \
421 TestName ## Impl(); \
422 } \
Igor Murashkin06a04e02016-09-13 15:57:37 -0700423 \
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700424 TEST_F(JniCompilerTest, TestName ## FastGeneric) { \
Igor Murashkina51d8b72016-10-05 14:33:30 -0700425 ScopedCheckHandleScope top_handle_scope_check; \
Igor Murashkin06a04e02016-09-13 15:57:37 -0700426 SCOPED_TRACE("@FastNative JNI with generic"); \
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700427 gCurrentJni = static_cast<uint32_t>(JniKind::kFast); \
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700428 SetCheckGenericJni(true); \
429 TestName ## Impl(); \
430 }
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700431
Igor Murashkin06a04e02016-09-13 15:57:37 -0700432// Test (@CriticalNative) x (compiler, generic) only.
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700433#define JNI_TEST_CRITICAL_ONLY(TestName) \
Igor Murashkin06a04e02016-09-13 15:57:37 -0700434 TEST_F(JniCompilerTest, TestName ## CriticalCompiler) { \
Igor Murashkina51d8b72016-10-05 14:33:30 -0700435 ScopedCheckHandleScope top_handle_scope_check; \
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700436 SCOPED_TRACE("@CriticalNative JNI with compiler"); \
437 gCurrentJni = static_cast<uint32_t>(JniKind::kCritical); \
438 TestName ## Impl(); \
Igor Murashkin06a04e02016-09-13 15:57:37 -0700439 } \
440 TEST_F(JniCompilerTest, TestName ## CriticalGeneric) { \
Igor Murashkina51d8b72016-10-05 14:33:30 -0700441 ScopedCheckHandleScope top_handle_scope_check; \
Igor Murashkin06a04e02016-09-13 15:57:37 -0700442 SCOPED_TRACE("@CriticalNative JNI with generic"); \
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700443 gCurrentJni = static_cast<uint32_t>(JniKind::kCritical); \
Igor Murashkin294a9152016-09-28 13:23:19 -0700444 SetCheckGenericJni(true); \
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700445 TestName ## Impl(); \
446 }
Igor Murashkin06a04e02016-09-13 15:57:37 -0700447
448// Test everything: (normal, @FastNative, @CriticalNative) x (compiler, generic).
449#define JNI_TEST_CRITICAL(TestName) \
450 JNI_TEST(TestName) \
451 JNI_TEST_CRITICAL_ONLY(TestName) \
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700452
453static void expectValidThreadState() {
454 // Normal JNI always transitions to "Native". Other JNIs stay in the "Runnable" state.
455 if (IsCurrentJniNormal()) {
456 EXPECT_EQ(kNative, Thread::Current()->GetState());
457 } else {
458 EXPECT_EQ(kRunnable, Thread::Current()->GetState());
459 }
460}
461
462#define EXPECT_THREAD_STATE_FOR_CURRENT_JNI() expectValidThreadState()
463
464static void expectValidMutatorLockHeld() {
465 if (IsCurrentJniNormal()) {
466 Locks::mutator_lock_->AssertNotHeld(Thread::Current());
467 } else {
468 Locks::mutator_lock_->AssertSharedHeld(Thread::Current());
469 }
470}
471
472#define EXPECT_MUTATOR_LOCK_FOR_CURRENT_JNI() expectValidMutatorLockHeld()
473
474static void expectValidJniEnvAndObject(JNIEnv* env, jobject thisObj) {
475 if (!IsCurrentJniCritical()) {
476 EXPECT_EQ(Thread::Current()->GetJniEnv(), env);
477 ASSERT_TRUE(thisObj != nullptr);
478 EXPECT_TRUE(env->IsInstanceOf(thisObj, JniCompilerTest::jklass_));
479 } else {
480 LOG(FATAL) << "Objects are not supported for @CriticalNative, why is this being tested?";
481 UNREACHABLE();
482 }
483}
484
485// Validates the JNIEnv to be the same as the current thread's JNIEnv, and makes sure
486// that the object here is an instance of the class we registered the method with.
487//
488// Hard-fails if this somehow gets invoked for @CriticalNative since objects are unsupported.
489#define EXPECT_JNI_ENV_AND_OBJECT_FOR_CURRENT_JNI(env, thisObj) \
490 expectValidJniEnvAndObject(env, thisObj)
491
492static void expectValidJniEnvAndClass(JNIEnv* env, jclass kls) {
493 if (!IsCurrentJniCritical()) {
494 EXPECT_EQ(Thread::Current()->GetJniEnv(), env);
495 ASSERT_TRUE(kls != nullptr);
496 EXPECT_TRUE(env->IsSameObject(static_cast<jobject>(JniCompilerTest::jklass_),
497 static_cast<jobject>(kls)));
498 } else {
499 // This is pretty much vacuously true but catch any testing setup mistakes.
500 EXPECT_EQ(env, kCriticalDummyJniEnv);
501 EXPECT_EQ(kls, kCriticalDummyJniClass);
502 }
503}
504
505// Validates the JNIEnv is the same as the current thread's JNIenv, and makes sure
506// that the jclass we got in the JNI handler is the same one as the class the method was looked
507// up for.
508//
509// (Checks are skipped for @CriticalNative since the two values are dummy).
510#define EXPECT_JNI_ENV_AND_CLASS_FOR_CURRENT_JNI(env, kls) expectValidJniEnvAndClass(env, kls)
511
512// Temporarily disable the EXPECT_NUM_STACK_REFERENCES check (for a single test).
513struct ScopedDisableCheckNumStackReferences {
514 ScopedDisableCheckNumStackReferences() {
Igor Murashkin06a04e02016-09-13 15:57:37 -0700515 CHECK(sCheckNumStackReferences); // No nested support.
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700516 sCheckNumStackReferences = false;
517 }
518
519 ~ScopedDisableCheckNumStackReferences() {
520 sCheckNumStackReferences = true;
521 }
522
523 static bool sCheckNumStackReferences;
524};
525
526bool ScopedDisableCheckNumStackReferences::sCheckNumStackReferences = true;
527
Igor Murashkina51d8b72016-10-05 14:33:30 -0700528// Check that the handle scope at the start of this block is the same as the handle scope at the end of the block.
529struct ScopedCheckHandleScope {
Igor Murashkin42298112016-10-06 10:51:11 -0700530 ScopedCheckHandleScope() : handle_scope_(Thread::Current()->GetTopHandleScope()) {
Igor Murashkina51d8b72016-10-05 14:33:30 -0700531 }
532
533 ~ScopedCheckHandleScope() {
534 EXPECT_EQ(handle_scope_, Thread::Current()->GetTopHandleScope())
535 << "Top-most handle scope must be the same after all the JNI "
536 << "invocations have finished (as before they were invoked).";
537 }
538
Mathieu Chartiere8a3c572016-10-11 16:52:17 -0700539 BaseHandleScope* const handle_scope_;
Igor Murashkina51d8b72016-10-05 14:33:30 -0700540};
541
Andreas Gampe0a855762016-10-26 13:43:14 -0700542// Number of references allocated in JNI ShadowFrames on the given thread.
543static size_t NumJniShadowFrameReferences(Thread* self) REQUIRES_SHARED(Locks::mutator_lock_) {
544 return self->GetManagedStack()->NumJniShadowFrameReferences();
545}
546
547// Number of references in handle scope on the given thread.
548static size_t NumHandleReferences(Thread* self) {
549 size_t count = 0;
550 for (BaseHandleScope* cur = self->GetTopHandleScope(); cur != nullptr; cur = cur->GetLink()) {
551 count += cur->NumberOfReferences();
552 }
553 return count;
554}
555
556// Number of references allocated in handle scopes & JNI shadow frames on this thread.
557static size_t NumStackReferences(Thread* self) REQUIRES_SHARED(Locks::mutator_lock_) {
558 return NumHandleReferences(self) + NumJniShadowFrameReferences(self);
559}
560
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700561static void expectNumStackReferences(size_t val1, size_t val2) {
562 // In rare cases when JNI functions call themselves recursively,
563 // disable this test because it will have a false negative.
564 if (!IsCurrentJniCritical() && ScopedDisableCheckNumStackReferences::sCheckNumStackReferences) {
565 /* @CriticalNative doesn't build a HandleScope, so this test is meaningless then. */
566 ScopedObjectAccess soa(Thread::Current());
567
Andreas Gampe0a855762016-10-26 13:43:14 -0700568 size_t actual_num = NumStackReferences(Thread::Current());
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700569 // XX: Not too sure what's going on.
570 // Sometimes null references get placed and sometimes they don't?
571 EXPECT_TRUE(val1 == actual_num || val2 == actual_num)
572 << "expected either " << val1 << " or " << val2
573 << " number of stack references, but got: " << actual_num;
574 }
575}
576
577#define EXPECT_NUM_STACK_REFERENCES(val1, val2) expectNumStackReferences(val1, val2)
578
579template <typename T, T fn>
580struct make_jni_test_decorator;
581
582// Decorator for "static" JNI callbacks.
583template <typename R, typename ... Args, R fn(JNIEnv*, jclass, Args...)>
584struct make_jni_test_decorator<R(JNIEnv*, jclass kls, Args...), fn> {
585 static R apply(JNIEnv* env, jclass kls, Args ... args) {
586 EXPECT_THREAD_STATE_FOR_CURRENT_JNI();
587 EXPECT_MUTATOR_LOCK_FOR_CURRENT_JNI();
588 EXPECT_JNI_ENV_AND_CLASS_FOR_CURRENT_JNI(env, kls);
589 // All incoming parameters + the jclass get put into the transition's StackHandleScope.
590 EXPECT_NUM_STACK_REFERENCES(count_nonnull_refs(kls, args...),
591 (count_refs_helper<jclass, Args...>::value));
592
593 return fn(env, kls, args...);
594 }
595};
596
597// Decorator for instance JNI callbacks.
598template <typename R, typename ... Args, R fn(JNIEnv*, jobject, Args...)>
599struct make_jni_test_decorator<R(JNIEnv*, jobject, Args...), fn> {
600 static R apply(JNIEnv* env, jobject thisObj, Args ... args) {
601 EXPECT_THREAD_STATE_FOR_CURRENT_JNI();
602 EXPECT_MUTATOR_LOCK_FOR_CURRENT_JNI();
603 EXPECT_JNI_ENV_AND_OBJECT_FOR_CURRENT_JNI(env, thisObj);
604 // All incoming parameters + the implicit 'this' get put into the transition's StackHandleScope.
605 EXPECT_NUM_STACK_REFERENCES(count_nonnull_refs(thisObj, args...),
606 (count_refs_helper<jobject, Args...>::value));
607
608 return fn(env, thisObj, args...);
609 }
610};
611
612// Decorate the regular JNI callee with the extra gtest checks.
613// This way we can have common test logic for everything generic like checking if a lock is held,
614// checking handle scope state, etc.
615#define MAKE_JNI_TEST_DECORATOR(fn) make_jni_test_decorator<decltype(fn), (fn)>::apply
616
617// Convert function f(JNIEnv*,jclass,a,b,c,d...) into f2(a,b,c,d...)
618// -- This way we don't have to write out each implementation twice for @CriticalNative.
619#define JNI_CRITICAL_WRAPPER(func) jni_remove_extra_parameters<decltype(func), (func)>::apply
620// Get a function pointer whose calling convention either matches a regular native
621// or a critical native depending on which kind of jni is currently under test.
622// -- This also has the benefit of genering a compile time error if the 'func' doesn't properly
623// have JNIEnv and jclass parameters first.
624#define CURRENT_JNI_WRAPPER(func) \
625 (IsCurrentJniCritical() \
626 ? reinterpret_cast<void*>(&JNI_CRITICAL_WRAPPER(MAKE_JNI_TEST_DECORATOR(func))) \
627 : reinterpret_cast<void*>(&MAKE_JNI_TEST_DECORATOR(func)))
628
629// Do the opposite of the above. Do *not* wrap the function, instead just cast it to a void*.
630// Only for "TEST_JNI_NORMAL_ONLY" configs, and it inserts a test assert to ensure this is the case.
631#define NORMAL_JNI_ONLY_NOWRAP(func) \
632 ({ ASSERT_TRUE(IsCurrentJniNormal()); reinterpret_cast<void*>(&(func)); })
633// Same as above, but with nullptr. When we want to test the stub functionality.
634#define NORMAL_JNI_ONLY_NULLPTR \
635 ({ ASSERT_TRUE(IsCurrentJniNormal()); nullptr; })
636
637
638int gJava_MyClassNatives_foo_calls[kJniKindCount] = {};
639void Java_MyClassNatives_foo(JNIEnv*, jobject) {
640 gJava_MyClassNatives_foo_calls[gCurrentJni]++;
Ian Rogersb033c752011-07-20 12:22:35 -0700641}
642
Andreas Gampe6e498692014-08-18 16:43:12 -0700643void JniCompilerTest::CompileAndRunNoArgMethodImpl() {
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700644 SetUpForTest(false, "foo", "()V", CURRENT_JNI_WRAPPER(Java_MyClassNatives_foo));
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700645
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700646 EXPECT_EQ(0, gJava_MyClassNatives_foo_calls[gCurrentJni]);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700647 env_->CallNonvirtualVoidMethod(jobj_, jklass_, jmethod_);
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700648 EXPECT_EQ(1, gJava_MyClassNatives_foo_calls[gCurrentJni]);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700649 env_->CallNonvirtualVoidMethod(jobj_, jklass_, jmethod_);
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700650 EXPECT_EQ(2, gJava_MyClassNatives_foo_calls[gCurrentJni]);
Andreas Gampe6e498692014-08-18 16:43:12 -0700651
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700652 gJava_MyClassNatives_foo_calls[gCurrentJni] = 0;
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700653}
654
Andreas Gampe6e498692014-08-18 16:43:12 -0700655JNI_TEST(CompileAndRunNoArgMethod)
656
657void JniCompilerTest::CompileAndRunIntMethodThroughStubImpl() {
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700658 SetUpForTest(false, "bar", "(I)I", NORMAL_JNI_ONLY_NULLPTR);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700659 // calling through stub will link with &Java_MyClassNatives_bar
Shih-wei Liao31384c52011-09-06 15:27:45 -0700660
Shih-wei Liao31384c52011-09-06 15:27:45 -0700661 std::string reason;
Dmitriy Ivanovf5a30992015-11-11 14:18:55 -0800662 ASSERT_TRUE(Runtime::Current()->GetJavaVM()->
Dimitry Ivanov5edb0632016-04-29 11:14:25 -0700663 LoadNativeLibrary(env_, "", class_loader_, library_search_path_, &reason))
Ian Rogers68d8b422014-07-17 11:09:10 -0700664 << reason;
Shih-wei Liao31384c52011-09-06 15:27:45 -0700665
666 jint result = env_->CallNonvirtualIntMethod(jobj_, jklass_, jmethod_, 24);
667 EXPECT_EQ(25, result);
668}
669
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700670// TODO: Support @FastNative and @CriticalNative through stubs.
671JNI_TEST_NORMAL_ONLY(CompileAndRunIntMethodThroughStub)
Andreas Gampe6e498692014-08-18 16:43:12 -0700672
673void JniCompilerTest::CompileAndRunStaticIntMethodThroughStubImpl() {
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700674 SetUpForTest(true, "sbar", "(I)I", NORMAL_JNI_ONLY_NULLPTR);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700675 // calling through stub will link with &Java_MyClassNatives_sbar
Ian Rogers1cefdbd2012-02-29 09:34:50 -0800676
677 std::string reason;
Dmitriy Ivanovf5a30992015-11-11 14:18:55 -0800678 ASSERT_TRUE(Runtime::Current()->GetJavaVM()->
Dimitry Ivanov5edb0632016-04-29 11:14:25 -0700679 LoadNativeLibrary(env_, "", class_loader_, library_search_path_, &reason))
Ian Rogers68d8b422014-07-17 11:09:10 -0700680 << reason;
Ian Rogers1cefdbd2012-02-29 09:34:50 -0800681
682 jint result = env_->CallStaticIntMethod(jklass_, jmethod_, 42);
683 EXPECT_EQ(43, result);
684}
685
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700686// TODO: Support @FastNative and @CriticalNative through stubs.
687JNI_TEST_NORMAL_ONLY(CompileAndRunStaticIntMethodThroughStub)
Andreas Gampe6e498692014-08-18 16:43:12 -0700688
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700689int gJava_MyClassNatives_fooI_calls[kJniKindCount] = {};
690jint Java_MyClassNatives_fooI(JNIEnv*, jobject, jint x) {
691 gJava_MyClassNatives_fooI_calls[gCurrentJni]++;
Ian Rogersb033c752011-07-20 12:22:35 -0700692 return x;
693}
694
Andreas Gampe6e498692014-08-18 16:43:12 -0700695void JniCompilerTest::CompileAndRunIntMethodImpl() {
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700696 SetUpForTest(false, "fooI", "(I)I",
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700697 CURRENT_JNI_WRAPPER(Java_MyClassNatives_fooI));
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700698
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700699 EXPECT_EQ(0, gJava_MyClassNatives_fooI_calls[gCurrentJni]);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700700 jint result = env_->CallNonvirtualIntMethod(jobj_, jklass_, jmethod_, 42);
701 EXPECT_EQ(42, result);
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700702 EXPECT_EQ(1, gJava_MyClassNatives_fooI_calls[gCurrentJni]);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700703 result = env_->CallNonvirtualIntMethod(jobj_, jklass_, jmethod_, 0xCAFED00D);
704 EXPECT_EQ(static_cast<jint>(0xCAFED00D), result);
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700705 EXPECT_EQ(2, gJava_MyClassNatives_fooI_calls[gCurrentJni]);
Andreas Gampe6e498692014-08-18 16:43:12 -0700706
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700707 gJava_MyClassNatives_fooI_calls[gCurrentJni] = 0;
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700708}
709
Andreas Gampe6e498692014-08-18 16:43:12 -0700710JNI_TEST(CompileAndRunIntMethod)
711
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700712int gJava_MyClassNatives_fooII_calls[kJniKindCount] = {};
713jint Java_MyClassNatives_fooII(JNIEnv*, jobject, jint x, jint y) {
714 gJava_MyClassNatives_fooII_calls[gCurrentJni]++;
Ian Rogersb033c752011-07-20 12:22:35 -0700715 return x - y; // non-commutative operator
716}
717
Andreas Gampe6e498692014-08-18 16:43:12 -0700718void JniCompilerTest::CompileAndRunIntIntMethodImpl() {
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700719 SetUpForTest(false, "fooII", "(II)I",
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700720 CURRENT_JNI_WRAPPER(Java_MyClassNatives_fooII));
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700721
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700722 EXPECT_EQ(0, gJava_MyClassNatives_fooII_calls[gCurrentJni]);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700723 jint result = env_->CallNonvirtualIntMethod(jobj_, jklass_, jmethod_, 99, 10);
724 EXPECT_EQ(99 - 10, result);
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700725 EXPECT_EQ(1, gJava_MyClassNatives_fooII_calls[gCurrentJni]);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700726 result = env_->CallNonvirtualIntMethod(jobj_, jklass_, jmethod_, 0xCAFEBABE,
727 0xCAFED00D);
728 EXPECT_EQ(static_cast<jint>(0xCAFEBABE - 0xCAFED00D), result);
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700729 EXPECT_EQ(2, gJava_MyClassNatives_fooII_calls[gCurrentJni]);
Andreas Gampe6e498692014-08-18 16:43:12 -0700730
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700731 gJava_MyClassNatives_fooII_calls[gCurrentJni] = 0;
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700732}
733
Andreas Gampe6e498692014-08-18 16:43:12 -0700734JNI_TEST(CompileAndRunIntIntMethod)
735
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700736int gJava_MyClassNatives_fooJJ_calls[kJniKindCount] = {};
737jlong Java_MyClassNatives_fooJJ(JNIEnv*, jobject, jlong x, jlong y) {
738 gJava_MyClassNatives_fooJJ_calls[gCurrentJni]++;
Ian Rogers9b269d22011-09-04 14:06:05 -0700739 return x - y; // non-commutative operator
740}
741
Andreas Gampe6e498692014-08-18 16:43:12 -0700742void JniCompilerTest::CompileAndRunLongLongMethodImpl() {
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700743 SetUpForTest(false, "fooJJ", "(JJ)J",
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700744 CURRENT_JNI_WRAPPER(Java_MyClassNatives_fooJJ));
Ian Rogers9b269d22011-09-04 14:06:05 -0700745
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700746 EXPECT_EQ(0, gJava_MyClassNatives_fooJJ_calls[gCurrentJni]);
Ian Rogers0f678472014-03-10 16:18:37 -0700747 jlong a = INT64_C(0x1234567890ABCDEF);
748 jlong b = INT64_C(0xFEDCBA0987654321);
Ian Rogers9b269d22011-09-04 14:06:05 -0700749 jlong result = env_->CallNonvirtualLongMethod(jobj_, jklass_, jmethod_, a, b);
750 EXPECT_EQ(a - b, result);
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700751 EXPECT_EQ(1, gJava_MyClassNatives_fooJJ_calls[gCurrentJni]);
Ian Rogers9b269d22011-09-04 14:06:05 -0700752 result = env_->CallNonvirtualLongMethod(jobj_, jklass_, jmethod_, b, a);
753 EXPECT_EQ(b - a, result);
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700754 EXPECT_EQ(2, gJava_MyClassNatives_fooJJ_calls[gCurrentJni]);
Andreas Gampe6e498692014-08-18 16:43:12 -0700755
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700756 gJava_MyClassNatives_fooJJ_calls[gCurrentJni] = 0;
Ian Rogers9b269d22011-09-04 14:06:05 -0700757}
758
Andreas Gampe6e498692014-08-18 16:43:12 -0700759JNI_TEST(CompileAndRunLongLongMethod)
760
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700761int gJava_MyClassNatives_fooDD_calls[kJniKindCount] = {};
762jdouble Java_MyClassNatives_fooDD(JNIEnv*, jobject, jdouble x, jdouble y) {
763 gJava_MyClassNatives_fooDD_calls[gCurrentJni]++;
Ian Rogersb033c752011-07-20 12:22:35 -0700764 return x - y; // non-commutative operator
765}
766
Andreas Gampe6e498692014-08-18 16:43:12 -0700767void JniCompilerTest::CompileAndRunDoubleDoubleMethodImpl() {
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700768 SetUpForTest(false, "fooDD", "(DD)D",
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700769 CURRENT_JNI_WRAPPER(Java_MyClassNatives_fooDD));
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700770
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700771 EXPECT_EQ(0, gJava_MyClassNatives_fooDD_calls[gCurrentJni]);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700772 jdouble result = env_->CallNonvirtualDoubleMethod(jobj_, jklass_, jmethod_,
773 99.0, 10.0);
Ian Rogers647b1a82014-10-10 11:02:11 -0700774 EXPECT_DOUBLE_EQ(99.0 - 10.0, result);
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700775 EXPECT_EQ(1, gJava_MyClassNatives_fooDD_calls[gCurrentJni]);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700776 jdouble a = 3.14159265358979323846;
777 jdouble b = 0.69314718055994530942;
778 result = env_->CallNonvirtualDoubleMethod(jobj_, jklass_, jmethod_, a, b);
Ian Rogers647b1a82014-10-10 11:02:11 -0700779 EXPECT_DOUBLE_EQ(a - b, result);
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700780 EXPECT_EQ(2, gJava_MyClassNatives_fooDD_calls[gCurrentJni]);
Andreas Gampe6e498692014-08-18 16:43:12 -0700781
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700782 gJava_MyClassNatives_fooDD_calls[gCurrentJni] = 0;
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700783}
784
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700785int gJava_MyClassNatives_fooJJ_synchronized_calls[kJniKindCount] = {};
786jlong Java_MyClassNatives_fooJJ_synchronized(JNIEnv*, jobject, jlong x, jlong y) {
787 gJava_MyClassNatives_fooJJ_synchronized_calls[gCurrentJni]++;
Elliott Hughes3e778f72012-05-21 15:29:52 -0700788 return x | y;
789}
790
Andreas Gampe6e498692014-08-18 16:43:12 -0700791void JniCompilerTest::CompileAndRun_fooJJ_synchronizedImpl() {
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700792 SetUpForTest(false, "fooJJ_synchronized", "(JJ)J",
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700793 CURRENT_JNI_WRAPPER(Java_MyClassNatives_fooJJ_synchronized));
Elliott Hughes3e778f72012-05-21 15:29:52 -0700794
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700795 EXPECT_EQ(0, gJava_MyClassNatives_fooJJ_synchronized_calls[gCurrentJni]);
Elliott Hughes3e778f72012-05-21 15:29:52 -0700796 jlong a = 0x1000000020000000ULL;
797 jlong b = 0x00ff000000aa0000ULL;
798 jlong result = env_->CallNonvirtualLongMethod(jobj_, jklass_, jmethod_, a, b);
799 EXPECT_EQ(a | b, result);
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700800 EXPECT_EQ(1, gJava_MyClassNatives_fooJJ_synchronized_calls[gCurrentJni]);
Andreas Gampe6e498692014-08-18 16:43:12 -0700801
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700802 gJava_MyClassNatives_fooJJ_synchronized_calls[gCurrentJni] = 0;
Elliott Hughes3e778f72012-05-21 15:29:52 -0700803}
804
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700805JNI_TEST_NORMAL_ONLY(CompileAndRun_fooJJ_synchronized)
Andreas Gampe6e498692014-08-18 16:43:12 -0700806
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700807int gJava_MyClassNatives_fooIOO_calls[kJniKindCount] = {};
808jobject Java_MyClassNatives_fooIOO(JNIEnv*, jobject thisObj, jint x, jobject y,
Ian Rogersb033c752011-07-20 12:22:35 -0700809 jobject z) {
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700810 gJava_MyClassNatives_fooIOO_calls[gCurrentJni]++;
Ian Rogersb033c752011-07-20 12:22:35 -0700811 switch (x) {
812 case 1:
813 return y;
814 case 2:
815 return z;
816 default:
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700817 return thisObj;
Ian Rogersb033c752011-07-20 12:22:35 -0700818 }
819}
820
Andreas Gampe6e498692014-08-18 16:43:12 -0700821void JniCompilerTest::CompileAndRunIntObjectObjectMethodImpl() {
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700822 SetUpForTest(false, "fooIOO",
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700823 "(ILjava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;",
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700824 CURRENT_JNI_WRAPPER(Java_MyClassNatives_fooIOO));
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700825
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700826 EXPECT_EQ(0, gJava_MyClassNatives_fooIOO_calls[gCurrentJni]);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700827 jobject result = env_->CallNonvirtualObjectMethod(jobj_, jklass_, jmethod_, 0, nullptr, nullptr);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700828 EXPECT_TRUE(env_->IsSameObject(jobj_, result));
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700829 EXPECT_EQ(1, gJava_MyClassNatives_fooIOO_calls[gCurrentJni]);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700830
Andreas Gampecf4035a2014-05-28 22:43:01 -0700831 result = env_->CallNonvirtualObjectMethod(jobj_, jklass_, jmethod_, 0, nullptr, jklass_);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700832 EXPECT_TRUE(env_->IsSameObject(jobj_, result));
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700833 EXPECT_EQ(2, gJava_MyClassNatives_fooIOO_calls[gCurrentJni]);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700834 result = env_->CallNonvirtualObjectMethod(jobj_, jklass_, jmethod_, 1, nullptr, jklass_);
835 EXPECT_TRUE(env_->IsSameObject(nullptr, result));
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700836 EXPECT_EQ(3, gJava_MyClassNatives_fooIOO_calls[gCurrentJni]);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700837 result = env_->CallNonvirtualObjectMethod(jobj_, jklass_, jmethod_, 2, nullptr, jklass_);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700838 EXPECT_TRUE(env_->IsSameObject(jklass_, result));
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700839 EXPECT_EQ(4, gJava_MyClassNatives_fooIOO_calls[gCurrentJni]);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700840
Andreas Gampecf4035a2014-05-28 22:43:01 -0700841 result = env_->CallNonvirtualObjectMethod(jobj_, jklass_, jmethod_, 0, jklass_, nullptr);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700842 EXPECT_TRUE(env_->IsSameObject(jobj_, result));
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700843 EXPECT_EQ(5, gJava_MyClassNatives_fooIOO_calls[gCurrentJni]);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700844 result = env_->CallNonvirtualObjectMethod(jobj_, jklass_, jmethod_, 1, jklass_, nullptr);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700845 EXPECT_TRUE(env_->IsSameObject(jklass_, result));
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700846 EXPECT_EQ(6, gJava_MyClassNatives_fooIOO_calls[gCurrentJni]);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700847 result = env_->CallNonvirtualObjectMethod(jobj_, jklass_, jmethod_, 2, jklass_, nullptr);
848 EXPECT_TRUE(env_->IsSameObject(nullptr, result));
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700849 EXPECT_EQ(7, gJava_MyClassNatives_fooIOO_calls[gCurrentJni]);
Andreas Gampe6e498692014-08-18 16:43:12 -0700850
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700851 gJava_MyClassNatives_fooIOO_calls[gCurrentJni] = 0;
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700852}
853
Igor Murashkinaf1e2992016-10-12 17:44:50 -0700854JNI_TEST(CompileAndRunIntObjectObjectMethod)
Andreas Gampe6e498692014-08-18 16:43:12 -0700855
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700856int gJava_MyClassNatives_fooSII_calls[kJniKindCount] = {};
857jint Java_MyClassNatives_fooSII(JNIEnv* env ATTRIBUTE_UNUSED,
858 jclass klass ATTRIBUTE_UNUSED,
859 jint x,
860 jint y) {
861 gJava_MyClassNatives_fooSII_calls[gCurrentJni]++;
Shih-wei Liao82da44b2011-09-01 00:38:04 -0700862 return x + y;
863}
864
Andreas Gampe6e498692014-08-18 16:43:12 -0700865void JniCompilerTest::CompileAndRunStaticIntIntMethodImpl() {
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700866 SetUpForTest(true, "fooSII", "(II)I",
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700867 CURRENT_JNI_WRAPPER(Java_MyClassNatives_fooSII));
Shih-wei Liao82da44b2011-09-01 00:38:04 -0700868
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700869 EXPECT_EQ(0, gJava_MyClassNatives_fooSII_calls[gCurrentJni]);
Shih-wei Liao82da44b2011-09-01 00:38:04 -0700870 jint result = env_->CallStaticIntMethod(jklass_, jmethod_, 20, 30);
871 EXPECT_EQ(50, result);
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700872 EXPECT_EQ(1, gJava_MyClassNatives_fooSII_calls[gCurrentJni]);
Andreas Gampe6e498692014-08-18 16:43:12 -0700873
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700874 gJava_MyClassNatives_fooSII_calls[gCurrentJni] = 0;
Shih-wei Liao82da44b2011-09-01 00:38:04 -0700875}
876
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700877JNI_TEST_CRITICAL(CompileAndRunStaticIntIntMethod)
Andreas Gampe6e498692014-08-18 16:43:12 -0700878
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700879int gJava_MyClassNatives_fooSDD_calls[kJniKindCount] = {};
880jdouble Java_MyClassNatives_fooSDD(JNIEnv* env ATTRIBUTE_UNUSED,
881 jclass klass ATTRIBUTE_UNUSED,
882 jdouble x,
883 jdouble y) {
884 gJava_MyClassNatives_fooSDD_calls[gCurrentJni]++;
Ian Rogers7a99c112011-09-07 12:48:27 -0700885 return x - y; // non-commutative operator
886}
887
Andreas Gampe6e498692014-08-18 16:43:12 -0700888void JniCompilerTest::CompileAndRunStaticDoubleDoubleMethodImpl() {
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700889 SetUpForTest(true, "fooSDD", "(DD)D",
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700890 CURRENT_JNI_WRAPPER(Java_MyClassNatives_fooSDD));
Ian Rogers7a99c112011-09-07 12:48:27 -0700891
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700892 EXPECT_EQ(0, gJava_MyClassNatives_fooSDD_calls[gCurrentJni]);
Ian Rogers7a99c112011-09-07 12:48:27 -0700893 jdouble result = env_->CallStaticDoubleMethod(jklass_, jmethod_, 99.0, 10.0);
Ian Rogers647b1a82014-10-10 11:02:11 -0700894 EXPECT_DOUBLE_EQ(99.0 - 10.0, result);
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700895 EXPECT_EQ(1, gJava_MyClassNatives_fooSDD_calls[gCurrentJni]);
Ian Rogers7a99c112011-09-07 12:48:27 -0700896 jdouble a = 3.14159265358979323846;
897 jdouble b = 0.69314718055994530942;
898 result = env_->CallStaticDoubleMethod(jklass_, jmethod_, a, b);
Ian Rogers647b1a82014-10-10 11:02:11 -0700899 EXPECT_DOUBLE_EQ(a - b, result);
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700900 EXPECT_DOUBLE_EQ(2, gJava_MyClassNatives_fooSDD_calls[gCurrentJni]);
Andreas Gampe6e498692014-08-18 16:43:12 -0700901
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700902 gJava_MyClassNatives_fooSDD_calls[gCurrentJni] = 0;
Ian Rogers7a99c112011-09-07 12:48:27 -0700903}
904
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700905JNI_TEST_CRITICAL(CompileAndRunStaticDoubleDoubleMethod)
Andreas Gampe6e498692014-08-18 16:43:12 -0700906
Nicolas Geoffray54accbc2014-08-13 03:40:45 +0100907// The x86 generic JNI code had a bug where it assumed a floating
908// point return value would be in xmm0. We use log, to somehow ensure
909// the compiler will use the floating point stack.
910
Ian Rogers6a3c1fc2014-10-31 00:33:20 -0700911jdouble Java_MyClassNatives_logD(JNIEnv*, jclass, jdouble x) {
Nicolas Geoffray54accbc2014-08-13 03:40:45 +0100912 return log(x);
913}
914
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700915jdouble Java_MyClassNatives_logD_notNormal(JNIEnv*, jclass, jdouble x) {
916 EXPECT_DOUBLE_EQ(2.0, x);
917 return log(x);
918}
919
Andreas Gampe6e498692014-08-18 16:43:12 -0700920void JniCompilerTest::RunStaticLogDoubleMethodImpl() {
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700921 void* jni_handler;
922 if (IsCurrentJniNormal()) {
923 // This test seems a bit special, don't use a JNI wrapper here.
924 jni_handler = NORMAL_JNI_ONLY_NOWRAP(Java_MyClassNatives_logD);
925 } else {
926 jni_handler = CURRENT_JNI_WRAPPER(Java_MyClassNatives_logD_notNormal);
927 }
928 SetUpForTest(true, "logD", "(D)D", jni_handler);
Nicolas Geoffray54accbc2014-08-13 03:40:45 +0100929
930 jdouble result = env_->CallStaticDoubleMethod(jklass_, jmethod_, 2.0);
Ian Rogers647b1a82014-10-10 11:02:11 -0700931 EXPECT_DOUBLE_EQ(log(2.0), result);
Nicolas Geoffray54accbc2014-08-13 03:40:45 +0100932}
933
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700934JNI_TEST_CRITICAL(RunStaticLogDoubleMethod)
Andreas Gampe6e498692014-08-18 16:43:12 -0700935
Ian Rogers6a3c1fc2014-10-31 00:33:20 -0700936jfloat Java_MyClassNatives_logF(JNIEnv*, jclass, jfloat x) {
Nicolas Geoffray54accbc2014-08-13 03:40:45 +0100937 return logf(x);
938}
939
Andreas Gampe6e498692014-08-18 16:43:12 -0700940void JniCompilerTest::RunStaticLogFloatMethodImpl() {
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700941 void* jni_handler;
942 if (IsCurrentJniNormal()) {
943 // This test seems a bit special, don't use a JNI wrapper here.
944 jni_handler = NORMAL_JNI_ONLY_NOWRAP(Java_MyClassNatives_logF);
945 } else {
946 jni_handler = CURRENT_JNI_WRAPPER(Java_MyClassNatives_logF);
947 }
948
949 SetUpForTest(true, "logF", "(F)F", jni_handler);
Nicolas Geoffray54accbc2014-08-13 03:40:45 +0100950
951 jfloat result = env_->CallStaticFloatMethod(jklass_, jmethod_, 2.0);
Ian Rogers647b1a82014-10-10 11:02:11 -0700952 EXPECT_FLOAT_EQ(logf(2.0), result);
Nicolas Geoffray54accbc2014-08-13 03:40:45 +0100953}
954
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700955JNI_TEST_CRITICAL(RunStaticLogFloatMethod)
Andreas Gampe6e498692014-08-18 16:43:12 -0700956
Ian Rogers6a3c1fc2014-10-31 00:33:20 -0700957jboolean Java_MyClassNatives_returnTrue(JNIEnv*, jclass) {
Nicolas Geoffray54accbc2014-08-13 03:40:45 +0100958 return JNI_TRUE;
959}
960
Ian Rogers6a3c1fc2014-10-31 00:33:20 -0700961jboolean Java_MyClassNatives_returnFalse(JNIEnv*, jclass) {
Nicolas Geoffray54accbc2014-08-13 03:40:45 +0100962 return JNI_FALSE;
963}
964
Ian Rogers6a3c1fc2014-10-31 00:33:20 -0700965jint Java_MyClassNatives_returnInt(JNIEnv*, jclass) {
Nicolas Geoffray54accbc2014-08-13 03:40:45 +0100966 return 42;
967}
968
Andreas Gampe6e498692014-08-18 16:43:12 -0700969void JniCompilerTest::RunStaticReturnTrueImpl() {
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700970 SetUpForTest(true, "returnTrue", "()Z", CURRENT_JNI_WRAPPER(Java_MyClassNatives_returnTrue));
Nicolas Geoffray54accbc2014-08-13 03:40:45 +0100971
972 jboolean result = env_->CallStaticBooleanMethod(jklass_, jmethod_);
973 EXPECT_TRUE(result);
974}
975
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700976JNI_TEST_CRITICAL(RunStaticReturnTrue)
Andreas Gampe6e498692014-08-18 16:43:12 -0700977
978void JniCompilerTest::RunStaticReturnFalseImpl() {
Nicolas Geoffray54accbc2014-08-13 03:40:45 +0100979 SetUpForTest(true, "returnFalse", "()Z",
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700980 CURRENT_JNI_WRAPPER(Java_MyClassNatives_returnFalse));
Nicolas Geoffray54accbc2014-08-13 03:40:45 +0100981
982 jboolean result = env_->CallStaticBooleanMethod(jklass_, jmethod_);
983 EXPECT_FALSE(result);
984}
985
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700986JNI_TEST_CRITICAL(RunStaticReturnFalse)
Andreas Gampe6e498692014-08-18 16:43:12 -0700987
988void JniCompilerTest::RunGenericStaticReturnIntImpl() {
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700989 SetUpForTest(true, "returnInt", "()I", CURRENT_JNI_WRAPPER(Java_MyClassNatives_returnInt));
Nicolas Geoffray54accbc2014-08-13 03:40:45 +0100990
991 jint result = env_->CallStaticIntMethod(jklass_, jmethod_);
992 EXPECT_EQ(42, result);
993}
994
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700995JNI_TEST_CRITICAL(RunGenericStaticReturnInt)
Andreas Gampe6e498692014-08-18 16:43:12 -0700996
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700997int gJava_MyClassNatives_returnDouble_calls[kJniKindCount] = {};
998jdouble Java_MyClassNatives_returnDouble(JNIEnv*, jclass) {
999 gJava_MyClassNatives_returnDouble_calls[gCurrentJni]++;
1000 return 4.0;
1001}
1002
1003void JniCompilerTest::RunGenericStaticReturnDoubleImpl() {
1004 SetUpForTest(true, "returnDouble", "()D", CURRENT_JNI_WRAPPER(Java_MyClassNatives_returnDouble));
1005
1006 jdouble result = env_->CallStaticDoubleMethod(jklass_, jmethod_);
1007 EXPECT_DOUBLE_EQ(4.0, result);
1008 EXPECT_EQ(1, gJava_MyClassNatives_returnDouble_calls[gCurrentJni]);
1009
1010 gJava_MyClassNatives_returnDouble_calls[gCurrentJni] = 0;
1011}
1012
1013JNI_TEST_CRITICAL(RunGenericStaticReturnDouble)
1014
1015jlong Java_MyClassNatives_returnLong(JNIEnv*, jclass) {
1016 return 0xFEEDDEADFEEDL;
1017}
1018
1019void JniCompilerTest::RunGenericStaticReturnLongImpl() {
1020 SetUpForTest(true, "returnLong", "()J", CURRENT_JNI_WRAPPER(Java_MyClassNatives_returnLong));
1021
1022 jlong result = env_->CallStaticLongMethod(jklass_, jmethod_);
1023 EXPECT_EQ(0xFEEDDEADFEEDL, result);
1024}
1025
1026JNI_TEST_CRITICAL(RunGenericStaticReturnLong)
1027
1028int gJava_MyClassNatives_fooSIOO_calls[kJniKindCount] = {};
1029jobject Java_MyClassNatives_fooSIOO(JNIEnv*, jclass klass, jint x, jobject y, jobject z) {
1030 gJava_MyClassNatives_fooSIOO_calls[gCurrentJni]++;
Ian Rogersb033c752011-07-20 12:22:35 -07001031 switch (x) {
1032 case 1:
1033 return y;
1034 case 2:
1035 return z;
1036 default:
1037 return klass;
1038 }
1039}
1040
Andreas Gampe6e498692014-08-18 16:43:12 -07001041void JniCompilerTest::CompileAndRunStaticIntObjectObjectMethodImpl() {
Ian Rogers00f7d0e2012-07-19 15:28:27 -07001042 SetUpForTest(true, "fooSIOO",
Ian Rogerscdd1d2d2011-08-18 09:58:17 -07001043 "(ILjava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;",
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001044 CURRENT_JNI_WRAPPER(Java_MyClassNatives_fooSIOO));
Ian Rogerscdd1d2d2011-08-18 09:58:17 -07001045
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001046 EXPECT_EQ(0, gJava_MyClassNatives_fooSIOO_calls[gCurrentJni]);
Andreas Gampecf4035a2014-05-28 22:43:01 -07001047 jobject result = env_->CallStaticObjectMethod(jklass_, jmethod_, 0, nullptr, nullptr);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -07001048 EXPECT_TRUE(env_->IsSameObject(jklass_, result));
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001049 EXPECT_EQ(1, gJava_MyClassNatives_fooSIOO_calls[gCurrentJni]);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -07001050
Andreas Gampecf4035a2014-05-28 22:43:01 -07001051 result = env_->CallStaticObjectMethod(jklass_, jmethod_, 0, nullptr, jobj_);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -07001052 EXPECT_TRUE(env_->IsSameObject(jklass_, result));
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001053 EXPECT_EQ(2, gJava_MyClassNatives_fooSIOO_calls[gCurrentJni]);
Andreas Gampecf4035a2014-05-28 22:43:01 -07001054 result = env_->CallStaticObjectMethod(jklass_, jmethod_, 1, nullptr, jobj_);
1055 EXPECT_TRUE(env_->IsSameObject(nullptr, result));
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001056 EXPECT_EQ(3, gJava_MyClassNatives_fooSIOO_calls[gCurrentJni]);
Andreas Gampecf4035a2014-05-28 22:43:01 -07001057 result = env_->CallStaticObjectMethod(jklass_, jmethod_, 2, nullptr, jobj_);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -07001058 EXPECT_TRUE(env_->IsSameObject(jobj_, result));
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001059 EXPECT_EQ(4, gJava_MyClassNatives_fooSIOO_calls[gCurrentJni]);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -07001060
Andreas Gampecf4035a2014-05-28 22:43:01 -07001061 result = env_->CallStaticObjectMethod(jklass_, jmethod_, 0, jobj_, nullptr);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -07001062 EXPECT_TRUE(env_->IsSameObject(jklass_, result));
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001063 EXPECT_EQ(5, gJava_MyClassNatives_fooSIOO_calls[gCurrentJni]);
Andreas Gampecf4035a2014-05-28 22:43:01 -07001064 result = env_->CallStaticObjectMethod(jklass_, jmethod_, 1, jobj_, nullptr);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -07001065 EXPECT_TRUE(env_->IsSameObject(jobj_, result));
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001066 EXPECT_EQ(6, gJava_MyClassNatives_fooSIOO_calls[gCurrentJni]);
Andreas Gampecf4035a2014-05-28 22:43:01 -07001067 result = env_->CallStaticObjectMethod(jklass_, jmethod_, 2, jobj_, nullptr);
1068 EXPECT_TRUE(env_->IsSameObject(nullptr, result));
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001069 EXPECT_EQ(7, gJava_MyClassNatives_fooSIOO_calls[gCurrentJni]);
Andreas Gampe6e498692014-08-18 16:43:12 -07001070
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001071 gJava_MyClassNatives_fooSIOO_calls[gCurrentJni] = 0;
Ian Rogerscdd1d2d2011-08-18 09:58:17 -07001072}
1073
Igor Murashkinaf1e2992016-10-12 17:44:50 -07001074JNI_TEST(CompileAndRunStaticIntObjectObjectMethod)
Andreas Gampe6e498692014-08-18 16:43:12 -07001075
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001076int gJava_MyClassNatives_fooSSIOO_calls[kJniKindCount] = {};
1077jobject Java_MyClassNatives_fooSSIOO(JNIEnv*, jclass klass, jint x, jobject y, jobject z) {
1078 gJava_MyClassNatives_fooSSIOO_calls[gCurrentJni]++;
Ian Rogersdf20fe02011-07-20 20:34:16 -07001079 switch (x) {
1080 case 1:
1081 return y;
1082 case 2:
1083 return z;
1084 default:
1085 return klass;
1086 }
1087}
1088
Andreas Gampe6e498692014-08-18 16:43:12 -07001089void JniCompilerTest::CompileAndRunStaticSynchronizedIntObjectObjectMethodImpl() {
Ian Rogers00f7d0e2012-07-19 15:28:27 -07001090 SetUpForTest(true, "fooSSIOO",
Ian Rogerscdd1d2d2011-08-18 09:58:17 -07001091 "(ILjava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;",
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001092 CURRENT_JNI_WRAPPER(Java_MyClassNatives_fooSSIOO));
Carl Shapiro419ec7b2011-08-03 14:48:33 -07001093
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001094 EXPECT_EQ(0, gJava_MyClassNatives_fooSSIOO_calls[gCurrentJni]);
Andreas Gampecf4035a2014-05-28 22:43:01 -07001095 jobject result = env_->CallStaticObjectMethod(jklass_, jmethod_, 0, nullptr, nullptr);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -07001096 EXPECT_TRUE(env_->IsSameObject(jklass_, result));
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001097 EXPECT_EQ(1, gJava_MyClassNatives_fooSSIOO_calls[gCurrentJni]);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -07001098
Andreas Gampecf4035a2014-05-28 22:43:01 -07001099 result = env_->CallStaticObjectMethod(jklass_, jmethod_, 0, nullptr, jobj_);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -07001100 EXPECT_TRUE(env_->IsSameObject(jklass_, result));
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001101 EXPECT_EQ(2, gJava_MyClassNatives_fooSSIOO_calls[gCurrentJni]);
Andreas Gampecf4035a2014-05-28 22:43:01 -07001102 result = env_->CallStaticObjectMethod(jklass_, jmethod_, 1, nullptr, jobj_);
1103 EXPECT_TRUE(env_->IsSameObject(nullptr, result));
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001104 EXPECT_EQ(3, gJava_MyClassNatives_fooSSIOO_calls[gCurrentJni]);
Andreas Gampecf4035a2014-05-28 22:43:01 -07001105 result = env_->CallStaticObjectMethod(jklass_, jmethod_, 2, nullptr, jobj_);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -07001106 EXPECT_TRUE(env_->IsSameObject(jobj_, result));
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001107 EXPECT_EQ(4, gJava_MyClassNatives_fooSSIOO_calls[gCurrentJni]);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -07001108
Andreas Gampecf4035a2014-05-28 22:43:01 -07001109 result = env_->CallStaticObjectMethod(jklass_, jmethod_, 0, jobj_, nullptr);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -07001110 EXPECT_TRUE(env_->IsSameObject(jklass_, result));
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001111 EXPECT_EQ(5, gJava_MyClassNatives_fooSSIOO_calls[gCurrentJni]);
Andreas Gampecf4035a2014-05-28 22:43:01 -07001112 result = env_->CallStaticObjectMethod(jklass_, jmethod_, 1, jobj_, nullptr);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -07001113 EXPECT_TRUE(env_->IsSameObject(jobj_, result));
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001114 EXPECT_EQ(6, gJava_MyClassNatives_fooSSIOO_calls[gCurrentJni]);
Andreas Gampecf4035a2014-05-28 22:43:01 -07001115 result = env_->CallStaticObjectMethod(jklass_, jmethod_, 2, jobj_, nullptr);
1116 EXPECT_TRUE(env_->IsSameObject(nullptr, result));
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001117 EXPECT_EQ(7, gJava_MyClassNatives_fooSSIOO_calls[gCurrentJni]);
Andreas Gampe6e498692014-08-18 16:43:12 -07001118
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001119 gJava_MyClassNatives_fooSSIOO_calls[gCurrentJni] = 0;
Ian Rogersdf20fe02011-07-20 20:34:16 -07001120}
1121
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001122// TODO: Maybe. @FastNative support for returning Objects?
1123JNI_TEST_NORMAL_ONLY(CompileAndRunStaticSynchronizedIntObjectObjectMethod)
Andreas Gampe6e498692014-08-18 16:43:12 -07001124
Elliott Hughesb264f082012-04-06 17:10:10 -07001125void Java_MyClassNatives_throwException(JNIEnv* env, jobject) {
Elliott Hughesa2501992011-08-26 19:39:54 -07001126 jclass c = env->FindClass("java/lang/RuntimeException");
1127 env->ThrowNew(c, "hello");
1128}
Ian Rogers45a76cb2011-07-21 22:00:15 -07001129
Andreas Gampe6e498692014-08-18 16:43:12 -07001130void JniCompilerTest::ExceptionHandlingImpl() {
Ian Rogers00f7d0e2012-07-19 15:28:27 -07001131 {
1132 ASSERT_FALSE(runtime_->IsStarted());
1133 ScopedObjectAccess soa(Thread::Current());
1134 class_loader_ = LoadDex("MyClassNatives");
Brian Carlstrom40381fb2011-10-19 14:13:40 -07001135
Ian Rogers00f7d0e2012-07-19 15:28:27 -07001136 // all compilation needs to happen before Runtime::Start
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001137 CompileForTestWithCurrentJni(class_loader_, false, "foo", "()V");
1138 CompileForTestWithCurrentJni(class_loader_, false, "throwException", "()V");
1139 CompileForTestWithCurrentJni(class_loader_, false, "foo", "()V");
Ian Rogers00f7d0e2012-07-19 15:28:27 -07001140 }
1141 // Start runtime to avoid re-initialization in SetupForTest.
1142 Thread::Current()->TransitionFromSuspendedToRunnable();
Brian Carlstrombd86bcc2013-03-10 20:26:16 -07001143 bool started = runtime_->Start();
1144 CHECK(started);
Brian Carlstrom25c33252011-09-18 15:58:35 -07001145
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001146 gJava_MyClassNatives_foo_calls[gCurrentJni] = 0;
Elliott Hughesa2501992011-08-26 19:39:54 -07001147
Ian Rogers67375ac2011-09-14 00:55:44 -07001148 // Check a single call of a JNI method is ok
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001149 SetUpForTest(false, "foo", "()V", CURRENT_JNI_WRAPPER(Java_MyClassNatives_foo));
Ian Rogerscdd1d2d2011-08-18 09:58:17 -07001150 env_->CallNonvirtualVoidMethod(jobj_, jklass_, jmethod_);
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001151 EXPECT_EQ(1, gJava_MyClassNatives_foo_calls[gCurrentJni]);
Ian Rogers67375ac2011-09-14 00:55:44 -07001152 EXPECT_FALSE(Thread::Current()->IsExceptionPending());
Elliott Hughesa2501992011-08-26 19:39:54 -07001153
Ian Rogers67375ac2011-09-14 00:55:44 -07001154 // Get class for exception we expect to be thrown
Ian Rogers00f7d0e2012-07-19 15:28:27 -07001155 ScopedLocalRef<jclass> jlre(env_, env_->FindClass("java/lang/RuntimeException"));
1156 SetUpForTest(false, "throwException", "()V",
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001157 CURRENT_JNI_WRAPPER(Java_MyClassNatives_throwException));
Elliott Hughesb264f082012-04-06 17:10:10 -07001158 // Call Java_MyClassNatives_throwException (JNI method that throws exception)
Elliott Hughesa2501992011-08-26 19:39:54 -07001159 env_->CallNonvirtualVoidMethod(jobj_, jklass_, jmethod_);
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001160 EXPECT_EQ(1, gJava_MyClassNatives_foo_calls[gCurrentJni]);
Ian Rogers00f7d0e2012-07-19 15:28:27 -07001161 EXPECT_TRUE(env_->ExceptionCheck() == JNI_TRUE);
1162 ScopedLocalRef<jthrowable> exception(env_, env_->ExceptionOccurred());
1163 env_->ExceptionClear();
1164 EXPECT_TRUE(env_->IsInstanceOf(exception.get(), jlre.get()));
Elliott Hughesa2501992011-08-26 19:39:54 -07001165
Ian Rogers67375ac2011-09-14 00:55:44 -07001166 // Check a single call of a JNI method is ok
Ian Rogers00f7d0e2012-07-19 15:28:27 -07001167 SetUpForTest(false, "foo", "()V", reinterpret_cast<void*>(&Java_MyClassNatives_foo));
Ian Rogerscdd1d2d2011-08-18 09:58:17 -07001168 env_->CallNonvirtualVoidMethod(jobj_, jklass_, jmethod_);
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001169 EXPECT_EQ(2, gJava_MyClassNatives_foo_calls[gCurrentJni]);
Andreas Gampe6e498692014-08-18 16:43:12 -07001170
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001171 gJava_MyClassNatives_foo_calls[gCurrentJni] = 0;
Ian Rogers45a76cb2011-07-21 22:00:15 -07001172}
1173
Andreas Gampe6e498692014-08-18 16:43:12 -07001174JNI_TEST(ExceptionHandling)
1175
Elliott Hughesb264f082012-04-06 17:10:10 -07001176jint Java_MyClassNatives_nativeUpCall(JNIEnv* env, jobject thisObj, jint i) {
Shih-wei Liaoff0f9be2011-08-29 15:43:53 -07001177 if (i <= 0) {
Andreas Gampecf4035a2014-05-28 22:43:01 -07001178 // We want to check raw Object* / Array* below
Ian Rogers00f7d0e2012-07-19 15:28:27 -07001179 ScopedObjectAccess soa(env);
Ian Rogersaaa20802011-09-11 21:47:37 -07001180
1181 // Build stack trace
Sebastien Hertzee1d79a2014-02-21 15:46:30 +01001182 jobject internal = Thread::Current()->CreateInternalStackTrace<false>(soa);
Ian Rogers53b8b092014-03-13 23:45:53 -07001183 jobjectArray ste_array = Thread::InternalStackTraceToStackTraceElementArray(soa, internal);
Mathieu Chartier0795f232016-09-27 18:43:30 -07001184 ObjPtr<mirror::ObjectArray<mirror::StackTraceElement>> trace_array =
1185 soa.Decode<mirror::ObjectArray<mirror::StackTraceElement>>(ste_array);
Andreas Gampecf4035a2014-05-28 22:43:01 -07001186 EXPECT_TRUE(trace_array != nullptr);
Shih-wei Liaoff0f9be2011-08-29 15:43:53 -07001187 EXPECT_EQ(11, trace_array->GetLength());
1188
Ian Rogersaaa20802011-09-11 21:47:37 -07001189 // Check stack trace entries have expected values
Andreas Gampe277ccbd2014-11-03 21:36:10 -08001190 for (int32_t j = 0; j < trace_array->GetLength(); ++j) {
1191 EXPECT_EQ(-2, trace_array->Get(j)->GetLineNumber());
1192 mirror::StackTraceElement* ste = trace_array->Get(j);
Ian Rogersaaa20802011-09-11 21:47:37 -07001193 EXPECT_STREQ("MyClassNatives.java", ste->GetFileName()->ToModifiedUtf8().c_str());
Elliott Hughesb264f082012-04-06 17:10:10 -07001194 EXPECT_STREQ("MyClassNatives", ste->GetDeclaringClass()->ToModifiedUtf8().c_str());
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001195 EXPECT_EQ(("fooI" + CurrentJniStringSuffix()), ste->GetMethodName()->ToModifiedUtf8());
Shih-wei Liaoff0f9be2011-08-29 15:43:53 -07001196 }
Ian Rogersaaa20802011-09-11 21:47:37 -07001197
1198 // end recursion
Shih-wei Liaoff0f9be2011-08-29 15:43:53 -07001199 return 0;
1200 } else {
Elliott Hughesb264f082012-04-06 17:10:10 -07001201 jclass jklass = env->FindClass("MyClassNatives");
Andreas Gampecf4035a2014-05-28 22:43:01 -07001202 EXPECT_TRUE(jklass != nullptr);
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001203 jmethodID jmethod = env->GetMethodID(jklass,
1204 ("fooI" + CurrentJniStringSuffix()).c_str(),
1205 "(I)I");
Andreas Gampecf4035a2014-05-28 22:43:01 -07001206 EXPECT_TRUE(jmethod != nullptr);
Shih-wei Liaoff0f9be2011-08-29 15:43:53 -07001207
Ian Rogersaaa20802011-09-11 21:47:37 -07001208 // Recurse with i - 1
Shih-wei Liaoff0f9be2011-08-29 15:43:53 -07001209 jint result = env->CallNonvirtualIntMethod(thisObj, jklass, jmethod, i - 1);
Ian Rogersaaa20802011-09-11 21:47:37 -07001210
1211 // Return sum of all depths
Shih-wei Liaoff0f9be2011-08-29 15:43:53 -07001212 return i + result;
1213 }
1214}
1215
Andreas Gampe6e498692014-08-18 16:43:12 -07001216void JniCompilerTest::NativeStackTraceElementImpl() {
Ian Rogers00f7d0e2012-07-19 15:28:27 -07001217 SetUpForTest(false, "fooI", "(I)I",
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001218 CURRENT_JNI_WRAPPER(Java_MyClassNatives_nativeUpCall));
1219
1220 // Usual # local references on stack check fails because nativeUpCall calls itself recursively,
1221 // each time the # of local references will therefore go up.
1222 ScopedDisableCheckNumStackReferences disable_num_stack_check;
Shih-wei Liaoff0f9be2011-08-29 15:43:53 -07001223 jint result = env_->CallNonvirtualIntMethod(jobj_, jklass_, jmethod_, 10);
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001224
Ian Rogersaaa20802011-09-11 21:47:37 -07001225 EXPECT_EQ(10+9+8+7+6+5+4+3+2+1, result);
Shih-wei Liaoff0f9be2011-08-29 15:43:53 -07001226}
1227
Andreas Gampe6e498692014-08-18 16:43:12 -07001228JNI_TEST(NativeStackTraceElement)
1229
Elliott Hughesb264f082012-04-06 17:10:10 -07001230jobject Java_MyClassNatives_fooO(JNIEnv* env, jobject, jobject x) {
Shih-wei Liao558788e2011-09-01 02:39:11 -07001231 return env->NewGlobalRef(x);
1232}
1233
Andreas Gampe6e498692014-08-18 16:43:12 -07001234void JniCompilerTest::ReturnGlobalRefImpl() {
Ian Rogers00f7d0e2012-07-19 15:28:27 -07001235 SetUpForTest(false, "fooO", "(Ljava/lang/Object;)Ljava/lang/Object;",
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001236 CURRENT_JNI_WRAPPER(Java_MyClassNatives_fooO));
Shih-wei Liao558788e2011-09-01 02:39:11 -07001237 jobject result = env_->CallNonvirtualObjectMethod(jobj_, jklass_, jmethod_, jobj_);
1238 EXPECT_EQ(JNILocalRefType, env_->GetObjectRefType(result));
1239 EXPECT_TRUE(env_->IsSameObject(result, jobj_));
1240}
1241
Igor Murashkinaf1e2992016-10-12 17:44:50 -07001242JNI_TEST(ReturnGlobalRef)
Andreas Gampe6e498692014-08-18 16:43:12 -07001243
Ian Rogersdc51b792011-09-22 20:41:37 -07001244jint local_ref_test(JNIEnv* env, jobject thisObj, jint x) {
1245 // Add 10 local references
Ian Rogers00f7d0e2012-07-19 15:28:27 -07001246 ScopedObjectAccess soa(env);
Ian Rogers5a7a74a2011-09-26 16:32:29 -07001247 for (int i = 0; i < 10; i++) {
Mathieu Chartier0795f232016-09-27 18:43:30 -07001248 soa.AddLocalReference<jobject>(soa.Decode<mirror::Object>(thisObj));
Ian Rogersdc51b792011-09-22 20:41:37 -07001249 }
1250 return x+1;
1251}
1252
Andreas Gampe6e498692014-08-18 16:43:12 -07001253void JniCompilerTest::LocalReferenceTableClearingTestImpl() {
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001254 SetUpForTest(false, "fooI", "(I)I", CURRENT_JNI_WRAPPER(local_ref_test));
Ian Rogersdc51b792011-09-22 20:41:37 -07001255 // 1000 invocations of a method that adds 10 local references
Elliott Hughesb25c3f62012-03-26 16:35:06 -07001256 for (int i = 0; i < 1000; i++) {
Ian Rogersdc51b792011-09-22 20:41:37 -07001257 jint result = env_->CallIntMethod(jobj_, jmethod_, i);
1258 EXPECT_TRUE(result == i + 1);
1259 }
1260}
1261
Andreas Gampe6e498692014-08-18 16:43:12 -07001262JNI_TEST(LocalReferenceTableClearingTest)
1263
Ian Rogersb9231c82011-09-05 22:13:19 -07001264void my_arraycopy(JNIEnv* env, jclass klass, jobject src, jint src_pos, jobject dst, jint dst_pos, jint length) {
1265 EXPECT_TRUE(env->IsSameObject(JniCompilerTest::jklass_, klass));
1266 EXPECT_TRUE(env->IsSameObject(JniCompilerTest::jklass_, dst));
Ian Rogers82f3e092011-09-05 22:54:45 -07001267 EXPECT_TRUE(env->IsSameObject(JniCompilerTest::jobj_, src));
Ian Rogersb9231c82011-09-05 22:13:19 -07001268 EXPECT_EQ(1234, src_pos);
1269 EXPECT_EQ(5678, dst_pos);
1270 EXPECT_EQ(9876, length);
1271}
1272
Andreas Gampe6e498692014-08-18 16:43:12 -07001273void JniCompilerTest::JavaLangSystemArrayCopyImpl() {
Ian Rogers00f7d0e2012-07-19 15:28:27 -07001274 SetUpForTest(true, "arraycopy", "(Ljava/lang/Object;ILjava/lang/Object;II)V",
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001275 CURRENT_JNI_WRAPPER(my_arraycopy));
Ian Rogers82f3e092011-09-05 22:54:45 -07001276 env_->CallStaticVoidMethod(jklass_, jmethod_, jobj_, 1234, jklass_, 5678, 9876);
Ian Rogersb9231c82011-09-05 22:13:19 -07001277}
1278
Andreas Gampe6e498692014-08-18 16:43:12 -07001279JNI_TEST(JavaLangSystemArrayCopy)
1280
Ian Rogers67375ac2011-09-14 00:55:44 -07001281jboolean my_casi(JNIEnv* env, jobject unsafe, jobject obj, jlong offset, jint expected, jint newval) {
1282 EXPECT_TRUE(env->IsSameObject(JniCompilerTest::jobj_, unsafe));
1283 EXPECT_TRUE(env->IsSameObject(JniCompilerTest::jobj_, obj));
Ian Rogers0f678472014-03-10 16:18:37 -07001284 EXPECT_EQ(INT64_C(0x12345678ABCDEF88), offset);
Ian Rogers67375ac2011-09-14 00:55:44 -07001285 EXPECT_EQ(static_cast<jint>(0xCAFEF00D), expected);
1286 EXPECT_EQ(static_cast<jint>(0xEBADF00D), newval);
1287 return JNI_TRUE;
1288}
1289
Andreas Gampe6e498692014-08-18 16:43:12 -07001290void JniCompilerTest::CompareAndSwapIntImpl() {
Ian Rogers00f7d0e2012-07-19 15:28:27 -07001291 SetUpForTest(false, "compareAndSwapInt", "(Ljava/lang/Object;JII)Z",
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001292 CURRENT_JNI_WRAPPER(my_casi));
Ian Rogers0f678472014-03-10 16:18:37 -07001293 jboolean result = env_->CallBooleanMethod(jobj_, jmethod_, jobj_, INT64_C(0x12345678ABCDEF88),
1294 0xCAFEF00D, 0xEBADF00D);
Ian Rogers67375ac2011-09-14 00:55:44 -07001295 EXPECT_EQ(result, JNI_TRUE);
1296}
1297
Andreas Gampe6e498692014-08-18 16:43:12 -07001298JNI_TEST(CompareAndSwapInt)
1299
Ian Rogersc7792842012-03-03 15:36:20 -08001300jint my_gettext(JNIEnv* env, jclass klass, jlong val1, jobject obj1, jlong val2, jobject obj2) {
1301 EXPECT_TRUE(env->IsInstanceOf(JniCompilerTest::jobj_, klass));
1302 EXPECT_TRUE(env->IsSameObject(JniCompilerTest::jobj_, obj1));
1303 EXPECT_TRUE(env->IsSameObject(JniCompilerTest::jobj_, obj2));
1304 EXPECT_EQ(0x12345678ABCDEF88ll, val1);
1305 EXPECT_EQ(0x7FEDCBA987654321ll, val2);
1306 return 42;
1307}
1308
Andreas Gampe6e498692014-08-18 16:43:12 -07001309void JniCompilerTest::GetTextImpl() {
Ian Rogers00f7d0e2012-07-19 15:28:27 -07001310 SetUpForTest(true, "getText", "(JLjava/lang/Object;JLjava/lang/Object;)I",
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001311 CURRENT_JNI_WRAPPER(my_gettext));
Ian Rogersc7792842012-03-03 15:36:20 -08001312 jint result = env_->CallStaticIntMethod(jklass_, jmethod_, 0x12345678ABCDEF88ll, jobj_,
Ian Rogers0f678472014-03-10 16:18:37 -07001313 INT64_C(0x7FEDCBA987654321), jobj_);
Ian Rogersc7792842012-03-03 15:36:20 -08001314 EXPECT_EQ(result, 42);
1315}
1316
Andreas Gampe6e498692014-08-18 16:43:12 -07001317JNI_TEST(GetText)
1318
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001319int gJava_MyClassNatives_GetSinkProperties_calls[kJniKindCount] = {};
1320jarray Java_MyClassNatives_GetSinkProperties(JNIEnv*, jobject thisObj, jstring s) {
Vladimir Marko4e24b9d2014-07-24 17:01:58 +01001321 EXPECT_EQ(s, nullptr);
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001322 gJava_MyClassNatives_GetSinkProperties_calls[gCurrentJni]++;
1323
1324 Thread* self = Thread::Current();
Vladimir Marko4e24b9d2014-07-24 17:01:58 +01001325 ScopedObjectAccess soa(self);
Mathieu Chartier1cc62e42016-10-03 18:01:28 -07001326 EXPECT_TRUE(self->HoldsLock(soa.Decode<mirror::Object>(thisObj).Ptr()));
Vladimir Marko4e24b9d2014-07-24 17:01:58 +01001327 return nullptr;
1328}
1329
Andreas Gampe6e498692014-08-18 16:43:12 -07001330void JniCompilerTest::GetSinkPropertiesNativeImpl() {
Vladimir Marko4e24b9d2014-07-24 17:01:58 +01001331 SetUpForTest(false, "getSinkPropertiesNative", "(Ljava/lang/String;)[Ljava/lang/Object;",
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001332 CURRENT_JNI_WRAPPER(Java_MyClassNatives_GetSinkProperties));
Vladimir Marko4e24b9d2014-07-24 17:01:58 +01001333
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001334 EXPECT_EQ(0, gJava_MyClassNatives_GetSinkProperties_calls[gCurrentJni]);
Vladimir Marko4e24b9d2014-07-24 17:01:58 +01001335 jarray result = down_cast<jarray>(
1336 env_->CallNonvirtualObjectMethod(jobj_, jklass_, jmethod_, nullptr));
1337 EXPECT_EQ(nullptr, result);
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001338 EXPECT_EQ(1, gJava_MyClassNatives_GetSinkProperties_calls[gCurrentJni]);
Andreas Gampe6e498692014-08-18 16:43:12 -07001339
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001340 gJava_MyClassNatives_GetSinkProperties_calls[gCurrentJni] = 0;
Brian Carlstromfc7120c2012-08-27 13:43:25 -07001341}
1342
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001343// @FastNative doesn't support 'synchronized' keyword and
1344// never will -- locking functions aren't fast.
1345JNI_TEST_NORMAL_ONLY(GetSinkPropertiesNative)
Andreas Gampe6e498692014-08-18 16:43:12 -07001346
Elliott Hughesb264f082012-04-06 17:10:10 -07001347// This should return jclass, but we're imitating a bug pattern.
1348jobject Java_MyClassNatives_instanceMethodThatShouldReturnClass(JNIEnv* env, jobject) {
1349 return env->NewStringUTF("not a class!");
1350}
1351
1352// This should return jclass, but we're imitating a bug pattern.
1353jobject Java_MyClassNatives_staticMethodThatShouldReturnClass(JNIEnv* env, jclass) {
1354 return env->NewStringUTF("not a class!");
1355}
1356
Andreas Gampe6e498692014-08-18 16:43:12 -07001357void JniCompilerTest::UpcallReturnTypeChecking_InstanceImpl() {
Ian Rogers00f7d0e2012-07-19 15:28:27 -07001358 SetUpForTest(false, "instanceMethodThatShouldReturnClass", "()Ljava/lang/Class;",
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001359 CURRENT_JNI_WRAPPER(Java_MyClassNatives_instanceMethodThatShouldReturnClass));
Elliott Hughesb264f082012-04-06 17:10:10 -07001360
1361 CheckJniAbortCatcher check_jni_abort_catcher;
Elliott Hughes3f6635a2012-06-19 13:37:49 -07001362 // This native method is bad, and tries to return a jstring as a jclass.
1363 env_->CallObjectMethod(jobj_, jmethod_);
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001364 check_jni_abort_catcher.Check(std::string() + "attempt to return an instance " +
1365 "of java.lang.String from java.lang.Class " +
1366 "MyClassNatives.instanceMethodThatShouldReturnClass" +
1367 CurrentJniStringSuffix() + "()");
Elliott Hughes3f6635a2012-06-19 13:37:49 -07001368
1369 // Here, we just call the method incorrectly; we should catch that too.
Ian Rogers68d8b422014-07-17 11:09:10 -07001370 env_->CallObjectMethod(jobj_, jmethod_);
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001371 check_jni_abort_catcher.Check(std::string() + "attempt to return an instance " +
1372 "of java.lang.String from java.lang.Class " +
1373 "MyClassNatives.instanceMethodThatShouldReturnClass" +
1374 CurrentJniStringSuffix() + "()");
Ian Rogers68d8b422014-07-17 11:09:10 -07001375 env_->CallStaticObjectMethod(jklass_, jmethod_);
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001376 check_jni_abort_catcher.Check(std::string() + "calling non-static method " +
1377 "java.lang.Class " +
1378 "MyClassNatives.instanceMethodThatShouldReturnClass" +
1379 CurrentJniStringSuffix() + "() with CallStaticObjectMethodV");
Elliott Hughesb264f082012-04-06 17:10:10 -07001380}
1381
Igor Murashkinaf1e2992016-10-12 17:44:50 -07001382JNI_TEST(UpcallReturnTypeChecking_Instance)
Andreas Gampe6e498692014-08-18 16:43:12 -07001383
1384void JniCompilerTest::UpcallReturnTypeChecking_StaticImpl() {
Ian Rogers00f7d0e2012-07-19 15:28:27 -07001385 SetUpForTest(true, "staticMethodThatShouldReturnClass", "()Ljava/lang/Class;",
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001386 CURRENT_JNI_WRAPPER(Java_MyClassNatives_staticMethodThatShouldReturnClass));
Elliott Hughesb264f082012-04-06 17:10:10 -07001387
1388 CheckJniAbortCatcher check_jni_abort_catcher;
Elliott Hughes3f6635a2012-06-19 13:37:49 -07001389 // This native method is bad, and tries to return a jstring as a jclass.
1390 env_->CallStaticObjectMethod(jklass_, jmethod_);
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001391 check_jni_abort_catcher.Check(std::string() + "attempt to return an instance " +
1392 "of java.lang.String from java.lang.Class " +
1393 "MyClassNatives.staticMethodThatShouldReturnClass" +
1394 CurrentJniStringSuffix() + "()");
Elliott Hughes3f6635a2012-06-19 13:37:49 -07001395
1396 // Here, we just call the method incorrectly; we should catch that too.
Ian Rogers68d8b422014-07-17 11:09:10 -07001397 env_->CallStaticObjectMethod(jklass_, jmethod_);
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001398 check_jni_abort_catcher.Check(std::string() + "attempt to return an instance " +
1399 "of java.lang.String from java.lang.Class " +
1400 "MyClassNatives.staticMethodThatShouldReturnClass" +
1401 CurrentJniStringSuffix() + "()");
Ian Rogers68d8b422014-07-17 11:09:10 -07001402 env_->CallObjectMethod(jobj_, jmethod_);
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001403 check_jni_abort_catcher.Check(std::string() + "calling static method " +
1404 "java.lang.Class " +
1405 "MyClassNatives.staticMethodThatShouldReturnClass" +
1406 CurrentJniStringSuffix() + "() with CallObjectMethodV");
Elliott Hughesb264f082012-04-06 17:10:10 -07001407}
1408
Igor Murashkinaf1e2992016-10-12 17:44:50 -07001409JNI_TEST(UpcallReturnTypeChecking_Static)
Andreas Gampe6e498692014-08-18 16:43:12 -07001410
Elliott Hughesb264f082012-04-06 17:10:10 -07001411// This should take jclass, but we're imitating a bug pattern.
1412void Java_MyClassNatives_instanceMethodThatShouldTakeClass(JNIEnv*, jobject, jclass) {
1413}
1414
1415// This should take jclass, but we're imitating a bug pattern.
1416void Java_MyClassNatives_staticMethodThatShouldTakeClass(JNIEnv*, jclass, jclass) {
1417}
1418
Andreas Gampe6e498692014-08-18 16:43:12 -07001419void JniCompilerTest::UpcallArgumentTypeChecking_InstanceImpl() {
Andreas Gampe369810a2015-01-14 19:53:31 -08001420 // This will lead to error messages in the log.
1421 ScopedLogSeverity sls(LogSeverity::FATAL);
1422
Ian Rogers00f7d0e2012-07-19 15:28:27 -07001423 SetUpForTest(false, "instanceMethodThatShouldTakeClass", "(ILjava/lang/Class;)V",
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001424 CURRENT_JNI_WRAPPER(Java_MyClassNatives_instanceMethodThatShouldTakeClass));
Elliott Hughesb264f082012-04-06 17:10:10 -07001425
1426 CheckJniAbortCatcher check_jni_abort_catcher;
1427 // We deliberately pass a bad second argument here.
1428 env_->CallVoidMethod(jobj_, jmethod_, 123, env_->NewStringUTF("not a class!"));
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001429 check_jni_abort_catcher.Check(std::string() + "bad arguments passed to void " +
1430 "MyClassNatives.instanceMethodThatShouldTakeClass" +
1431 CurrentJniStringSuffix() + "(int, java.lang.Class)");
Elliott Hughesb264f082012-04-06 17:10:10 -07001432}
1433
Andreas Gampe6e498692014-08-18 16:43:12 -07001434JNI_TEST(UpcallArgumentTypeChecking_Instance)
1435
1436void JniCompilerTest::UpcallArgumentTypeChecking_StaticImpl() {
Andreas Gampe369810a2015-01-14 19:53:31 -08001437 // This will lead to error messages in the log.
1438 ScopedLogSeverity sls(LogSeverity::FATAL);
1439
Ian Rogers00f7d0e2012-07-19 15:28:27 -07001440 SetUpForTest(true, "staticMethodThatShouldTakeClass", "(ILjava/lang/Class;)V",
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001441 CURRENT_JNI_WRAPPER(Java_MyClassNatives_staticMethodThatShouldTakeClass));
Elliott Hughesb264f082012-04-06 17:10:10 -07001442
1443 CheckJniAbortCatcher check_jni_abort_catcher;
1444 // We deliberately pass a bad second argument here.
1445 env_->CallStaticVoidMethod(jklass_, jmethod_, 123, env_->NewStringUTF("not a class!"));
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001446 check_jni_abort_catcher.Check(std::string() + "bad arguments passed to void " +
1447 "MyClassNatives.staticMethodThatShouldTakeClass" +
1448 CurrentJniStringSuffix() + "(int, java.lang.Class)");
Elliott Hughesb264f082012-04-06 17:10:10 -07001449}
1450
Andreas Gampe6e498692014-08-18 16:43:12 -07001451JNI_TEST(UpcallArgumentTypeChecking_Static)
1452
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001453jfloat Java_MyClassNatives_checkFloats(JNIEnv*, jobject, jfloat f1, jfloat f2) {
Andreas Gampe7a0e5042014-03-07 13:03:19 -08001454 return f1 - f2; // non-commutative operator
1455}
1456
Andreas Gampe6e498692014-08-18 16:43:12 -07001457void JniCompilerTest::CompileAndRunFloatFloatMethodImpl() {
Andreas Gampe7a0e5042014-03-07 13:03:19 -08001458 SetUpForTest(false, "checkFloats", "(FF)F",
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001459 CURRENT_JNI_WRAPPER(Java_MyClassNatives_checkFloats));
Andreas Gampe7a0e5042014-03-07 13:03:19 -08001460
1461 jfloat result = env_->CallNonvirtualFloatMethod(jobj_, jklass_, jmethod_,
1462 99.0F, 10.0F);
Ian Rogers647b1a82014-10-10 11:02:11 -07001463 EXPECT_FLOAT_EQ(99.0F - 10.0F, result);
Andreas Gampe7a0e5042014-03-07 13:03:19 -08001464 jfloat a = 3.14159F;
1465 jfloat b = 0.69314F;
1466 result = env_->CallNonvirtualFloatMethod(jobj_, jklass_, jmethod_, a, b);
Ian Rogers647b1a82014-10-10 11:02:11 -07001467 EXPECT_FLOAT_EQ(a - b, result);
Andreas Gampe7a0e5042014-03-07 13:03:19 -08001468}
1469
Andreas Gampe6e498692014-08-18 16:43:12 -07001470JNI_TEST(CompileAndRunFloatFloatMethod)
1471
Ian Rogers6a3c1fc2014-10-31 00:33:20 -07001472void Java_MyClassNatives_checkParameterAlign(JNIEnv* env ATTRIBUTE_UNUSED,
1473 jobject thisObj ATTRIBUTE_UNUSED,
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001474 jint i1,
1475 jlong l1) {
Andreas Gampe7a0e5042014-03-07 13:03:19 -08001476 EXPECT_EQ(i1, 1234);
Ian Rogers0f678472014-03-10 16:18:37 -07001477 EXPECT_EQ(l1, INT64_C(0x12345678ABCDEF0));
Andreas Gampe7a0e5042014-03-07 13:03:19 -08001478}
1479
Andreas Gampe6e498692014-08-18 16:43:12 -07001480void JniCompilerTest::CheckParameterAlignImpl() {
Andreas Gampe7a0e5042014-03-07 13:03:19 -08001481 SetUpForTest(false, "checkParameterAlign", "(IJ)V",
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001482 CURRENT_JNI_WRAPPER(Java_MyClassNatives_checkParameterAlign));
Andreas Gampe7a0e5042014-03-07 13:03:19 -08001483
Ian Rogers0f678472014-03-10 16:18:37 -07001484 env_->CallNonvirtualVoidMethod(jobj_, jklass_, jmethod_, 1234, INT64_C(0x12345678ABCDEF0));
Andreas Gampe7a0e5042014-03-07 13:03:19 -08001485}
1486
Andreas Gampe6e498692014-08-18 16:43:12 -07001487JNI_TEST(CheckParameterAlign)
1488
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001489void Java_MyClassNatives_maxParamNumber(JNIEnv* env, jobject,
Andreas Gampe7a0e5042014-03-07 13:03:19 -08001490 jobject o0, jobject o1, jobject o2, jobject o3, jobject o4, jobject o5, jobject o6, jobject o7,
1491 jobject o8, jobject o9, jobject o10, jobject o11, jobject o12, jobject o13, jobject o14, jobject o15,
1492 jobject o16, jobject o17, jobject o18, jobject o19, jobject o20, jobject o21, jobject o22, jobject o23,
1493 jobject o24, jobject o25, jobject o26, jobject o27, jobject o28, jobject o29, jobject o30, jobject o31,
1494 jobject o32, jobject o33, jobject o34, jobject o35, jobject o36, jobject o37, jobject o38, jobject o39,
1495 jobject o40, jobject o41, jobject o42, jobject o43, jobject o44, jobject o45, jobject o46, jobject o47,
1496 jobject o48, jobject o49, jobject o50, jobject o51, jobject o52, jobject o53, jobject o54, jobject o55,
1497 jobject o56, jobject o57, jobject o58, jobject o59, jobject o60, jobject o61, jobject o62, jobject o63,
1498 jobject o64, jobject o65, jobject o66, jobject o67, jobject o68, jobject o69, jobject o70, jobject o71,
1499 jobject o72, jobject o73, jobject o74, jobject o75, jobject o76, jobject o77, jobject o78, jobject o79,
1500 jobject o80, jobject o81, jobject o82, jobject o83, jobject o84, jobject o85, jobject o86, jobject o87,
1501 jobject o88, jobject o89, jobject o90, jobject o91, jobject o92, jobject o93, jobject o94, jobject o95,
1502 jobject o96, jobject o97, jobject o98, jobject o99, jobject o100, jobject o101, jobject o102, jobject o103,
1503 jobject o104, jobject o105, jobject o106, jobject o107, jobject o108, jobject o109, jobject o110, jobject o111,
1504 jobject o112, jobject o113, jobject o114, jobject o115, jobject o116, jobject o117, jobject o118, jobject o119,
1505 jobject o120, jobject o121, jobject o122, jobject o123, jobject o124, jobject o125, jobject o126, jobject o127,
1506 jobject o128, jobject o129, jobject o130, jobject o131, jobject o132, jobject o133, jobject o134, jobject o135,
1507 jobject o136, jobject o137, jobject o138, jobject o139, jobject o140, jobject o141, jobject o142, jobject o143,
1508 jobject o144, jobject o145, jobject o146, jobject o147, jobject o148, jobject o149, jobject o150, jobject o151,
1509 jobject o152, jobject o153, jobject o154, jobject o155, jobject o156, jobject o157, jobject o158, jobject o159,
1510 jobject o160, jobject o161, jobject o162, jobject o163, jobject o164, jobject o165, jobject o166, jobject o167,
1511 jobject o168, jobject o169, jobject o170, jobject o171, jobject o172, jobject o173, jobject o174, jobject o175,
1512 jobject o176, jobject o177, jobject o178, jobject o179, jobject o180, jobject o181, jobject o182, jobject o183,
1513 jobject o184, jobject o185, jobject o186, jobject o187, jobject o188, jobject o189, jobject o190, jobject o191,
1514 jobject o192, jobject o193, jobject o194, jobject o195, jobject o196, jobject o197, jobject o198, jobject o199,
1515 jobject o200, jobject o201, jobject o202, jobject o203, jobject o204, jobject o205, jobject o206, jobject o207,
1516 jobject o208, jobject o209, jobject o210, jobject o211, jobject o212, jobject o213, jobject o214, jobject o215,
1517 jobject o216, jobject o217, jobject o218, jobject o219, jobject o220, jobject o221, jobject o222, jobject o223,
1518 jobject o224, jobject o225, jobject o226, jobject o227, jobject o228, jobject o229, jobject o230, jobject o231,
1519 jobject o232, jobject o233, jobject o234, jobject o235, jobject o236, jobject o237, jobject o238, jobject o239,
1520 jobject o240, jobject o241, jobject o242, jobject o243, jobject o244, jobject o245, jobject o246, jobject o247,
1521 jobject o248, jobject o249, jobject o250, jobject o251, jobject o252, jobject o253) {
Andreas Gampe7a0e5042014-03-07 13:03:19 -08001522 // two tests possible
1523 if (o0 == nullptr) {
1524 // 1) everything is null
1525 EXPECT_TRUE(o0 == nullptr && o1 == nullptr && o2 == nullptr && o3 == nullptr && o4 == nullptr
1526 && o5 == nullptr && o6 == nullptr && o7 == nullptr && o8 == nullptr && o9 == nullptr
1527 && o10 == nullptr && o11 == nullptr && o12 == nullptr && o13 == nullptr && o14 == nullptr
1528 && o15 == nullptr && o16 == nullptr && o17 == nullptr && o18 == nullptr && o19 == nullptr
1529 && o20 == nullptr && o21 == nullptr && o22 == nullptr && o23 == nullptr && o24 == nullptr
1530 && o25 == nullptr && o26 == nullptr && o27 == nullptr && o28 == nullptr && o29 == nullptr
1531 && o30 == nullptr && o31 == nullptr && o32 == nullptr && o33 == nullptr && o34 == nullptr
1532 && o35 == nullptr && o36 == nullptr && o37 == nullptr && o38 == nullptr && o39 == nullptr
1533 && o40 == nullptr && o41 == nullptr && o42 == nullptr && o43 == nullptr && o44 == nullptr
1534 && o45 == nullptr && o46 == nullptr && o47 == nullptr && o48 == nullptr && o49 == nullptr
1535 && o50 == nullptr && o51 == nullptr && o52 == nullptr && o53 == nullptr && o54 == nullptr
1536 && o55 == nullptr && o56 == nullptr && o57 == nullptr && o58 == nullptr && o59 == nullptr
1537 && o60 == nullptr && o61 == nullptr && o62 == nullptr && o63 == nullptr && o64 == nullptr
1538 && o65 == nullptr && o66 == nullptr && o67 == nullptr && o68 == nullptr && o69 == nullptr
1539 && o70 == nullptr && o71 == nullptr && o72 == nullptr && o73 == nullptr && o74 == nullptr
1540 && o75 == nullptr && o76 == nullptr && o77 == nullptr && o78 == nullptr && o79 == nullptr
1541 && o80 == nullptr && o81 == nullptr && o82 == nullptr && o83 == nullptr && o84 == nullptr
1542 && o85 == nullptr && o86 == nullptr && o87 == nullptr && o88 == nullptr && o89 == nullptr
1543 && o90 == nullptr && o91 == nullptr && o92 == nullptr && o93 == nullptr && o94 == nullptr
1544 && o95 == nullptr && o96 == nullptr && o97 == nullptr && o98 == nullptr && o99 == nullptr
1545 && o100 == nullptr && o101 == nullptr && o102 == nullptr && o103 == nullptr && o104 == nullptr
1546 && o105 == nullptr && o106 == nullptr && o107 == nullptr && o108 == nullptr && o109 == nullptr
1547 && o110 == nullptr && o111 == nullptr && o112 == nullptr && o113 == nullptr && o114 == nullptr
1548 && o115 == nullptr && o116 == nullptr && o117 == nullptr && o118 == nullptr && o119 == nullptr
1549 && o120 == nullptr && o121 == nullptr && o122 == nullptr && o123 == nullptr && o124 == nullptr
1550 && o125 == nullptr && o126 == nullptr && o127 == nullptr && o128 == nullptr && o129 == nullptr
1551 && o130 == nullptr && o131 == nullptr && o132 == nullptr && o133 == nullptr && o134 == nullptr
1552 && o135 == nullptr && o136 == nullptr && o137 == nullptr && o138 == nullptr && o139 == nullptr
1553 && o140 == nullptr && o141 == nullptr && o142 == nullptr && o143 == nullptr && o144 == nullptr
1554 && o145 == nullptr && o146 == nullptr && o147 == nullptr && o148 == nullptr && o149 == nullptr
1555 && o150 == nullptr && o151 == nullptr && o152 == nullptr && o153 == nullptr && o154 == nullptr
1556 && o155 == nullptr && o156 == nullptr && o157 == nullptr && o158 == nullptr && o159 == nullptr
1557 && o160 == nullptr && o161 == nullptr && o162 == nullptr && o163 == nullptr && o164 == nullptr
1558 && o165 == nullptr && o166 == nullptr && o167 == nullptr && o168 == nullptr && o169 == nullptr
1559 && o170 == nullptr && o171 == nullptr && o172 == nullptr && o173 == nullptr && o174 == nullptr
1560 && o175 == nullptr && o176 == nullptr && o177 == nullptr && o178 == nullptr && o179 == nullptr
1561 && o180 == nullptr && o181 == nullptr && o182 == nullptr && o183 == nullptr && o184 == nullptr
1562 && o185 == nullptr && o186 == nullptr && o187 == nullptr && o188 == nullptr && o189 == nullptr
1563 && o190 == nullptr && o191 == nullptr && o192 == nullptr && o193 == nullptr && o194 == nullptr
1564 && o195 == nullptr && o196 == nullptr && o197 == nullptr && o198 == nullptr && o199 == nullptr
1565 && o200 == nullptr && o201 == nullptr && o202 == nullptr && o203 == nullptr && o204 == nullptr
1566 && o205 == nullptr && o206 == nullptr && o207 == nullptr && o208 == nullptr && o209 == nullptr
1567 && o210 == nullptr && o211 == nullptr && o212 == nullptr && o213 == nullptr && o214 == nullptr
1568 && o215 == nullptr && o216 == nullptr && o217 == nullptr && o218 == nullptr && o219 == nullptr
1569 && o220 == nullptr && o221 == nullptr && o222 == nullptr && o223 == nullptr && o224 == nullptr
1570 && o225 == nullptr && o226 == nullptr && o227 == nullptr && o228 == nullptr && o229 == nullptr
1571 && o230 == nullptr && o231 == nullptr && o232 == nullptr && o233 == nullptr && o234 == nullptr
1572 && o235 == nullptr && o236 == nullptr && o237 == nullptr && o238 == nullptr && o239 == nullptr
1573 && o240 == nullptr && o241 == nullptr && o242 == nullptr && o243 == nullptr && o244 == nullptr
1574 && o245 == nullptr && o246 == nullptr && o247 == nullptr && o248 == nullptr && o249 == nullptr
1575 && o250 == nullptr && o251 == nullptr && o252 == nullptr && o253 == nullptr);
1576 } else {
1577 EXPECT_EQ(0, env->GetArrayLength(reinterpret_cast<jarray>(o0)));
1578 EXPECT_EQ(1, env->GetArrayLength(reinterpret_cast<jarray>(o1)));
1579 EXPECT_EQ(2, env->GetArrayLength(reinterpret_cast<jarray>(o2)));
1580 EXPECT_EQ(3, env->GetArrayLength(reinterpret_cast<jarray>(o3)));
1581 EXPECT_EQ(4, env->GetArrayLength(reinterpret_cast<jarray>(o4)));
1582 EXPECT_EQ(5, env->GetArrayLength(reinterpret_cast<jarray>(o5)));
1583 EXPECT_EQ(6, env->GetArrayLength(reinterpret_cast<jarray>(o6)));
1584 EXPECT_EQ(7, env->GetArrayLength(reinterpret_cast<jarray>(o7)));
1585 EXPECT_EQ(8, env->GetArrayLength(reinterpret_cast<jarray>(o8)));
1586 EXPECT_EQ(9, env->GetArrayLength(reinterpret_cast<jarray>(o9)));
1587 EXPECT_EQ(10, env->GetArrayLength(reinterpret_cast<jarray>(o10)));
1588 EXPECT_EQ(11, env->GetArrayLength(reinterpret_cast<jarray>(o11)));
1589 EXPECT_EQ(12, env->GetArrayLength(reinterpret_cast<jarray>(o12)));
1590 EXPECT_EQ(13, env->GetArrayLength(reinterpret_cast<jarray>(o13)));
1591 EXPECT_EQ(14, env->GetArrayLength(reinterpret_cast<jarray>(o14)));
1592 EXPECT_EQ(15, env->GetArrayLength(reinterpret_cast<jarray>(o15)));
1593 EXPECT_EQ(16, env->GetArrayLength(reinterpret_cast<jarray>(o16)));
1594 EXPECT_EQ(17, env->GetArrayLength(reinterpret_cast<jarray>(o17)));
1595 EXPECT_EQ(18, env->GetArrayLength(reinterpret_cast<jarray>(o18)));
1596 EXPECT_EQ(19, env->GetArrayLength(reinterpret_cast<jarray>(o19)));
1597 EXPECT_EQ(20, env->GetArrayLength(reinterpret_cast<jarray>(o20)));
1598 EXPECT_EQ(21, env->GetArrayLength(reinterpret_cast<jarray>(o21)));
1599 EXPECT_EQ(22, env->GetArrayLength(reinterpret_cast<jarray>(o22)));
1600 EXPECT_EQ(23, env->GetArrayLength(reinterpret_cast<jarray>(o23)));
1601 EXPECT_EQ(24, env->GetArrayLength(reinterpret_cast<jarray>(o24)));
1602 EXPECT_EQ(25, env->GetArrayLength(reinterpret_cast<jarray>(o25)));
1603 EXPECT_EQ(26, env->GetArrayLength(reinterpret_cast<jarray>(o26)));
1604 EXPECT_EQ(27, env->GetArrayLength(reinterpret_cast<jarray>(o27)));
1605 EXPECT_EQ(28, env->GetArrayLength(reinterpret_cast<jarray>(o28)));
1606 EXPECT_EQ(29, env->GetArrayLength(reinterpret_cast<jarray>(o29)));
1607 EXPECT_EQ(30, env->GetArrayLength(reinterpret_cast<jarray>(o30)));
1608 EXPECT_EQ(31, env->GetArrayLength(reinterpret_cast<jarray>(o31)));
1609 EXPECT_EQ(32, env->GetArrayLength(reinterpret_cast<jarray>(o32)));
1610 EXPECT_EQ(33, env->GetArrayLength(reinterpret_cast<jarray>(o33)));
1611 EXPECT_EQ(34, env->GetArrayLength(reinterpret_cast<jarray>(o34)));
1612 EXPECT_EQ(35, env->GetArrayLength(reinterpret_cast<jarray>(o35)));
1613 EXPECT_EQ(36, env->GetArrayLength(reinterpret_cast<jarray>(o36)));
1614 EXPECT_EQ(37, env->GetArrayLength(reinterpret_cast<jarray>(o37)));
1615 EXPECT_EQ(38, env->GetArrayLength(reinterpret_cast<jarray>(o38)));
1616 EXPECT_EQ(39, env->GetArrayLength(reinterpret_cast<jarray>(o39)));
1617 EXPECT_EQ(40, env->GetArrayLength(reinterpret_cast<jarray>(o40)));
1618 EXPECT_EQ(41, env->GetArrayLength(reinterpret_cast<jarray>(o41)));
1619 EXPECT_EQ(42, env->GetArrayLength(reinterpret_cast<jarray>(o42)));
1620 EXPECT_EQ(43, env->GetArrayLength(reinterpret_cast<jarray>(o43)));
1621 EXPECT_EQ(44, env->GetArrayLength(reinterpret_cast<jarray>(o44)));
1622 EXPECT_EQ(45, env->GetArrayLength(reinterpret_cast<jarray>(o45)));
1623 EXPECT_EQ(46, env->GetArrayLength(reinterpret_cast<jarray>(o46)));
1624 EXPECT_EQ(47, env->GetArrayLength(reinterpret_cast<jarray>(o47)));
1625 EXPECT_EQ(48, env->GetArrayLength(reinterpret_cast<jarray>(o48)));
1626 EXPECT_EQ(49, env->GetArrayLength(reinterpret_cast<jarray>(o49)));
1627 EXPECT_EQ(50, env->GetArrayLength(reinterpret_cast<jarray>(o50)));
1628 EXPECT_EQ(51, env->GetArrayLength(reinterpret_cast<jarray>(o51)));
1629 EXPECT_EQ(52, env->GetArrayLength(reinterpret_cast<jarray>(o52)));
1630 EXPECT_EQ(53, env->GetArrayLength(reinterpret_cast<jarray>(o53)));
1631 EXPECT_EQ(54, env->GetArrayLength(reinterpret_cast<jarray>(o54)));
1632 EXPECT_EQ(55, env->GetArrayLength(reinterpret_cast<jarray>(o55)));
1633 EXPECT_EQ(56, env->GetArrayLength(reinterpret_cast<jarray>(o56)));
1634 EXPECT_EQ(57, env->GetArrayLength(reinterpret_cast<jarray>(o57)));
1635 EXPECT_EQ(58, env->GetArrayLength(reinterpret_cast<jarray>(o58)));
1636 EXPECT_EQ(59, env->GetArrayLength(reinterpret_cast<jarray>(o59)));
1637 EXPECT_EQ(60, env->GetArrayLength(reinterpret_cast<jarray>(o60)));
1638 EXPECT_EQ(61, env->GetArrayLength(reinterpret_cast<jarray>(o61)));
1639 EXPECT_EQ(62, env->GetArrayLength(reinterpret_cast<jarray>(o62)));
1640 EXPECT_EQ(63, env->GetArrayLength(reinterpret_cast<jarray>(o63)));
1641 EXPECT_EQ(64, env->GetArrayLength(reinterpret_cast<jarray>(o64)));
1642 EXPECT_EQ(65, env->GetArrayLength(reinterpret_cast<jarray>(o65)));
1643 EXPECT_EQ(66, env->GetArrayLength(reinterpret_cast<jarray>(o66)));
1644 EXPECT_EQ(67, env->GetArrayLength(reinterpret_cast<jarray>(o67)));
1645 EXPECT_EQ(68, env->GetArrayLength(reinterpret_cast<jarray>(o68)));
1646 EXPECT_EQ(69, env->GetArrayLength(reinterpret_cast<jarray>(o69)));
1647 EXPECT_EQ(70, env->GetArrayLength(reinterpret_cast<jarray>(o70)));
1648 EXPECT_EQ(71, env->GetArrayLength(reinterpret_cast<jarray>(o71)));
1649 EXPECT_EQ(72, env->GetArrayLength(reinterpret_cast<jarray>(o72)));
1650 EXPECT_EQ(73, env->GetArrayLength(reinterpret_cast<jarray>(o73)));
1651 EXPECT_EQ(74, env->GetArrayLength(reinterpret_cast<jarray>(o74)));
1652 EXPECT_EQ(75, env->GetArrayLength(reinterpret_cast<jarray>(o75)));
1653 EXPECT_EQ(76, env->GetArrayLength(reinterpret_cast<jarray>(o76)));
1654 EXPECT_EQ(77, env->GetArrayLength(reinterpret_cast<jarray>(o77)));
1655 EXPECT_EQ(78, env->GetArrayLength(reinterpret_cast<jarray>(o78)));
1656 EXPECT_EQ(79, env->GetArrayLength(reinterpret_cast<jarray>(o79)));
1657 EXPECT_EQ(80, env->GetArrayLength(reinterpret_cast<jarray>(o80)));
1658 EXPECT_EQ(81, env->GetArrayLength(reinterpret_cast<jarray>(o81)));
1659 EXPECT_EQ(82, env->GetArrayLength(reinterpret_cast<jarray>(o82)));
1660 EXPECT_EQ(83, env->GetArrayLength(reinterpret_cast<jarray>(o83)));
1661 EXPECT_EQ(84, env->GetArrayLength(reinterpret_cast<jarray>(o84)));
1662 EXPECT_EQ(85, env->GetArrayLength(reinterpret_cast<jarray>(o85)));
1663 EXPECT_EQ(86, env->GetArrayLength(reinterpret_cast<jarray>(o86)));
1664 EXPECT_EQ(87, env->GetArrayLength(reinterpret_cast<jarray>(o87)));
1665 EXPECT_EQ(88, env->GetArrayLength(reinterpret_cast<jarray>(o88)));
1666 EXPECT_EQ(89, env->GetArrayLength(reinterpret_cast<jarray>(o89)));
1667 EXPECT_EQ(90, env->GetArrayLength(reinterpret_cast<jarray>(o90)));
1668 EXPECT_EQ(91, env->GetArrayLength(reinterpret_cast<jarray>(o91)));
1669 EXPECT_EQ(92, env->GetArrayLength(reinterpret_cast<jarray>(o92)));
1670 EXPECT_EQ(93, env->GetArrayLength(reinterpret_cast<jarray>(o93)));
1671 EXPECT_EQ(94, env->GetArrayLength(reinterpret_cast<jarray>(o94)));
1672 EXPECT_EQ(95, env->GetArrayLength(reinterpret_cast<jarray>(o95)));
1673 EXPECT_EQ(96, env->GetArrayLength(reinterpret_cast<jarray>(o96)));
1674 EXPECT_EQ(97, env->GetArrayLength(reinterpret_cast<jarray>(o97)));
1675 EXPECT_EQ(98, env->GetArrayLength(reinterpret_cast<jarray>(o98)));
1676 EXPECT_EQ(99, env->GetArrayLength(reinterpret_cast<jarray>(o99)));
1677 EXPECT_EQ(100, env->GetArrayLength(reinterpret_cast<jarray>(o100)));
1678 EXPECT_EQ(101, env->GetArrayLength(reinterpret_cast<jarray>(o101)));
1679 EXPECT_EQ(102, env->GetArrayLength(reinterpret_cast<jarray>(o102)));
1680 EXPECT_EQ(103, env->GetArrayLength(reinterpret_cast<jarray>(o103)));
1681 EXPECT_EQ(104, env->GetArrayLength(reinterpret_cast<jarray>(o104)));
1682 EXPECT_EQ(105, env->GetArrayLength(reinterpret_cast<jarray>(o105)));
1683 EXPECT_EQ(106, env->GetArrayLength(reinterpret_cast<jarray>(o106)));
1684 EXPECT_EQ(107, env->GetArrayLength(reinterpret_cast<jarray>(o107)));
1685 EXPECT_EQ(108, env->GetArrayLength(reinterpret_cast<jarray>(o108)));
1686 EXPECT_EQ(109, env->GetArrayLength(reinterpret_cast<jarray>(o109)));
1687 EXPECT_EQ(110, env->GetArrayLength(reinterpret_cast<jarray>(o110)));
1688 EXPECT_EQ(111, env->GetArrayLength(reinterpret_cast<jarray>(o111)));
1689 EXPECT_EQ(112, env->GetArrayLength(reinterpret_cast<jarray>(o112)));
1690 EXPECT_EQ(113, env->GetArrayLength(reinterpret_cast<jarray>(o113)));
1691 EXPECT_EQ(114, env->GetArrayLength(reinterpret_cast<jarray>(o114)));
1692 EXPECT_EQ(115, env->GetArrayLength(reinterpret_cast<jarray>(o115)));
1693 EXPECT_EQ(116, env->GetArrayLength(reinterpret_cast<jarray>(o116)));
1694 EXPECT_EQ(117, env->GetArrayLength(reinterpret_cast<jarray>(o117)));
1695 EXPECT_EQ(118, env->GetArrayLength(reinterpret_cast<jarray>(o118)));
1696 EXPECT_EQ(119, env->GetArrayLength(reinterpret_cast<jarray>(o119)));
1697 EXPECT_EQ(120, env->GetArrayLength(reinterpret_cast<jarray>(o120)));
1698 EXPECT_EQ(121, env->GetArrayLength(reinterpret_cast<jarray>(o121)));
1699 EXPECT_EQ(122, env->GetArrayLength(reinterpret_cast<jarray>(o122)));
1700 EXPECT_EQ(123, env->GetArrayLength(reinterpret_cast<jarray>(o123)));
1701 EXPECT_EQ(124, env->GetArrayLength(reinterpret_cast<jarray>(o124)));
1702 EXPECT_EQ(125, env->GetArrayLength(reinterpret_cast<jarray>(o125)));
1703 EXPECT_EQ(126, env->GetArrayLength(reinterpret_cast<jarray>(o126)));
1704 EXPECT_EQ(127, env->GetArrayLength(reinterpret_cast<jarray>(o127)));
1705 EXPECT_EQ(128, env->GetArrayLength(reinterpret_cast<jarray>(o128)));
1706 EXPECT_EQ(129, env->GetArrayLength(reinterpret_cast<jarray>(o129)));
1707 EXPECT_EQ(130, env->GetArrayLength(reinterpret_cast<jarray>(o130)));
1708 EXPECT_EQ(131, env->GetArrayLength(reinterpret_cast<jarray>(o131)));
1709 EXPECT_EQ(132, env->GetArrayLength(reinterpret_cast<jarray>(o132)));
1710 EXPECT_EQ(133, env->GetArrayLength(reinterpret_cast<jarray>(o133)));
1711 EXPECT_EQ(134, env->GetArrayLength(reinterpret_cast<jarray>(o134)));
1712 EXPECT_EQ(135, env->GetArrayLength(reinterpret_cast<jarray>(o135)));
1713 EXPECT_EQ(136, env->GetArrayLength(reinterpret_cast<jarray>(o136)));
1714 EXPECT_EQ(137, env->GetArrayLength(reinterpret_cast<jarray>(o137)));
1715 EXPECT_EQ(138, env->GetArrayLength(reinterpret_cast<jarray>(o138)));
1716 EXPECT_EQ(139, env->GetArrayLength(reinterpret_cast<jarray>(o139)));
1717 EXPECT_EQ(140, env->GetArrayLength(reinterpret_cast<jarray>(o140)));
1718 EXPECT_EQ(141, env->GetArrayLength(reinterpret_cast<jarray>(o141)));
1719 EXPECT_EQ(142, env->GetArrayLength(reinterpret_cast<jarray>(o142)));
1720 EXPECT_EQ(143, env->GetArrayLength(reinterpret_cast<jarray>(o143)));
1721 EXPECT_EQ(144, env->GetArrayLength(reinterpret_cast<jarray>(o144)));
1722 EXPECT_EQ(145, env->GetArrayLength(reinterpret_cast<jarray>(o145)));
1723 EXPECT_EQ(146, env->GetArrayLength(reinterpret_cast<jarray>(o146)));
1724 EXPECT_EQ(147, env->GetArrayLength(reinterpret_cast<jarray>(o147)));
1725 EXPECT_EQ(148, env->GetArrayLength(reinterpret_cast<jarray>(o148)));
1726 EXPECT_EQ(149, env->GetArrayLength(reinterpret_cast<jarray>(o149)));
1727 EXPECT_EQ(150, env->GetArrayLength(reinterpret_cast<jarray>(o150)));
1728 EXPECT_EQ(151, env->GetArrayLength(reinterpret_cast<jarray>(o151)));
1729 EXPECT_EQ(152, env->GetArrayLength(reinterpret_cast<jarray>(o152)));
1730 EXPECT_EQ(153, env->GetArrayLength(reinterpret_cast<jarray>(o153)));
1731 EXPECT_EQ(154, env->GetArrayLength(reinterpret_cast<jarray>(o154)));
1732 EXPECT_EQ(155, env->GetArrayLength(reinterpret_cast<jarray>(o155)));
1733 EXPECT_EQ(156, env->GetArrayLength(reinterpret_cast<jarray>(o156)));
1734 EXPECT_EQ(157, env->GetArrayLength(reinterpret_cast<jarray>(o157)));
1735 EXPECT_EQ(158, env->GetArrayLength(reinterpret_cast<jarray>(o158)));
1736 EXPECT_EQ(159, env->GetArrayLength(reinterpret_cast<jarray>(o159)));
1737 EXPECT_EQ(160, env->GetArrayLength(reinterpret_cast<jarray>(o160)));
1738 EXPECT_EQ(161, env->GetArrayLength(reinterpret_cast<jarray>(o161)));
1739 EXPECT_EQ(162, env->GetArrayLength(reinterpret_cast<jarray>(o162)));
1740 EXPECT_EQ(163, env->GetArrayLength(reinterpret_cast<jarray>(o163)));
1741 EXPECT_EQ(164, env->GetArrayLength(reinterpret_cast<jarray>(o164)));
1742 EXPECT_EQ(165, env->GetArrayLength(reinterpret_cast<jarray>(o165)));
1743 EXPECT_EQ(166, env->GetArrayLength(reinterpret_cast<jarray>(o166)));
1744 EXPECT_EQ(167, env->GetArrayLength(reinterpret_cast<jarray>(o167)));
1745 EXPECT_EQ(168, env->GetArrayLength(reinterpret_cast<jarray>(o168)));
1746 EXPECT_EQ(169, env->GetArrayLength(reinterpret_cast<jarray>(o169)));
1747 EXPECT_EQ(170, env->GetArrayLength(reinterpret_cast<jarray>(o170)));
1748 EXPECT_EQ(171, env->GetArrayLength(reinterpret_cast<jarray>(o171)));
1749 EXPECT_EQ(172, env->GetArrayLength(reinterpret_cast<jarray>(o172)));
1750 EXPECT_EQ(173, env->GetArrayLength(reinterpret_cast<jarray>(o173)));
1751 EXPECT_EQ(174, env->GetArrayLength(reinterpret_cast<jarray>(o174)));
1752 EXPECT_EQ(175, env->GetArrayLength(reinterpret_cast<jarray>(o175)));
1753 EXPECT_EQ(176, env->GetArrayLength(reinterpret_cast<jarray>(o176)));
1754 EXPECT_EQ(177, env->GetArrayLength(reinterpret_cast<jarray>(o177)));
1755 EXPECT_EQ(178, env->GetArrayLength(reinterpret_cast<jarray>(o178)));
1756 EXPECT_EQ(179, env->GetArrayLength(reinterpret_cast<jarray>(o179)));
1757 EXPECT_EQ(180, env->GetArrayLength(reinterpret_cast<jarray>(o180)));
1758 EXPECT_EQ(181, env->GetArrayLength(reinterpret_cast<jarray>(o181)));
1759 EXPECT_EQ(182, env->GetArrayLength(reinterpret_cast<jarray>(o182)));
1760 EXPECT_EQ(183, env->GetArrayLength(reinterpret_cast<jarray>(o183)));
1761 EXPECT_EQ(184, env->GetArrayLength(reinterpret_cast<jarray>(o184)));
1762 EXPECT_EQ(185, env->GetArrayLength(reinterpret_cast<jarray>(o185)));
1763 EXPECT_EQ(186, env->GetArrayLength(reinterpret_cast<jarray>(o186)));
1764 EXPECT_EQ(187, env->GetArrayLength(reinterpret_cast<jarray>(o187)));
1765 EXPECT_EQ(188, env->GetArrayLength(reinterpret_cast<jarray>(o188)));
1766 EXPECT_EQ(189, env->GetArrayLength(reinterpret_cast<jarray>(o189)));
1767 EXPECT_EQ(190, env->GetArrayLength(reinterpret_cast<jarray>(o190)));
1768 EXPECT_EQ(191, env->GetArrayLength(reinterpret_cast<jarray>(o191)));
1769 EXPECT_EQ(192, env->GetArrayLength(reinterpret_cast<jarray>(o192)));
1770 EXPECT_EQ(193, env->GetArrayLength(reinterpret_cast<jarray>(o193)));
1771 EXPECT_EQ(194, env->GetArrayLength(reinterpret_cast<jarray>(o194)));
1772 EXPECT_EQ(195, env->GetArrayLength(reinterpret_cast<jarray>(o195)));
1773 EXPECT_EQ(196, env->GetArrayLength(reinterpret_cast<jarray>(o196)));
1774 EXPECT_EQ(197, env->GetArrayLength(reinterpret_cast<jarray>(o197)));
1775 EXPECT_EQ(198, env->GetArrayLength(reinterpret_cast<jarray>(o198)));
1776 EXPECT_EQ(199, env->GetArrayLength(reinterpret_cast<jarray>(o199)));
1777 EXPECT_EQ(200, env->GetArrayLength(reinterpret_cast<jarray>(o200)));
1778 EXPECT_EQ(201, env->GetArrayLength(reinterpret_cast<jarray>(o201)));
1779 EXPECT_EQ(202, env->GetArrayLength(reinterpret_cast<jarray>(o202)));
1780 EXPECT_EQ(203, env->GetArrayLength(reinterpret_cast<jarray>(o203)));
1781 EXPECT_EQ(204, env->GetArrayLength(reinterpret_cast<jarray>(o204)));
1782 EXPECT_EQ(205, env->GetArrayLength(reinterpret_cast<jarray>(o205)));
1783 EXPECT_EQ(206, env->GetArrayLength(reinterpret_cast<jarray>(o206)));
1784 EXPECT_EQ(207, env->GetArrayLength(reinterpret_cast<jarray>(o207)));
1785 EXPECT_EQ(208, env->GetArrayLength(reinterpret_cast<jarray>(o208)));
1786 EXPECT_EQ(209, env->GetArrayLength(reinterpret_cast<jarray>(o209)));
1787 EXPECT_EQ(210, env->GetArrayLength(reinterpret_cast<jarray>(o210)));
1788 EXPECT_EQ(211, env->GetArrayLength(reinterpret_cast<jarray>(o211)));
1789 EXPECT_EQ(212, env->GetArrayLength(reinterpret_cast<jarray>(o212)));
1790 EXPECT_EQ(213, env->GetArrayLength(reinterpret_cast<jarray>(o213)));
1791 EXPECT_EQ(214, env->GetArrayLength(reinterpret_cast<jarray>(o214)));
1792 EXPECT_EQ(215, env->GetArrayLength(reinterpret_cast<jarray>(o215)));
1793 EXPECT_EQ(216, env->GetArrayLength(reinterpret_cast<jarray>(o216)));
1794 EXPECT_EQ(217, env->GetArrayLength(reinterpret_cast<jarray>(o217)));
1795 EXPECT_EQ(218, env->GetArrayLength(reinterpret_cast<jarray>(o218)));
1796 EXPECT_EQ(219, env->GetArrayLength(reinterpret_cast<jarray>(o219)));
1797 EXPECT_EQ(220, env->GetArrayLength(reinterpret_cast<jarray>(o220)));
1798 EXPECT_EQ(221, env->GetArrayLength(reinterpret_cast<jarray>(o221)));
1799 EXPECT_EQ(222, env->GetArrayLength(reinterpret_cast<jarray>(o222)));
1800 EXPECT_EQ(223, env->GetArrayLength(reinterpret_cast<jarray>(o223)));
1801 EXPECT_EQ(224, env->GetArrayLength(reinterpret_cast<jarray>(o224)));
1802 EXPECT_EQ(225, env->GetArrayLength(reinterpret_cast<jarray>(o225)));
1803 EXPECT_EQ(226, env->GetArrayLength(reinterpret_cast<jarray>(o226)));
1804 EXPECT_EQ(227, env->GetArrayLength(reinterpret_cast<jarray>(o227)));
1805 EXPECT_EQ(228, env->GetArrayLength(reinterpret_cast<jarray>(o228)));
1806 EXPECT_EQ(229, env->GetArrayLength(reinterpret_cast<jarray>(o229)));
1807 EXPECT_EQ(230, env->GetArrayLength(reinterpret_cast<jarray>(o230)));
1808 EXPECT_EQ(231, env->GetArrayLength(reinterpret_cast<jarray>(o231)));
1809 EXPECT_EQ(232, env->GetArrayLength(reinterpret_cast<jarray>(o232)));
1810 EXPECT_EQ(233, env->GetArrayLength(reinterpret_cast<jarray>(o233)));
1811 EXPECT_EQ(234, env->GetArrayLength(reinterpret_cast<jarray>(o234)));
1812 EXPECT_EQ(235, env->GetArrayLength(reinterpret_cast<jarray>(o235)));
1813 EXPECT_EQ(236, env->GetArrayLength(reinterpret_cast<jarray>(o236)));
1814 EXPECT_EQ(237, env->GetArrayLength(reinterpret_cast<jarray>(o237)));
1815 EXPECT_EQ(238, env->GetArrayLength(reinterpret_cast<jarray>(o238)));
1816 EXPECT_EQ(239, env->GetArrayLength(reinterpret_cast<jarray>(o239)));
1817 EXPECT_EQ(240, env->GetArrayLength(reinterpret_cast<jarray>(o240)));
1818 EXPECT_EQ(241, env->GetArrayLength(reinterpret_cast<jarray>(o241)));
1819 EXPECT_EQ(242, env->GetArrayLength(reinterpret_cast<jarray>(o242)));
1820 EXPECT_EQ(243, env->GetArrayLength(reinterpret_cast<jarray>(o243)));
1821 EXPECT_EQ(244, env->GetArrayLength(reinterpret_cast<jarray>(o244)));
1822 EXPECT_EQ(245, env->GetArrayLength(reinterpret_cast<jarray>(o245)));
1823 EXPECT_EQ(246, env->GetArrayLength(reinterpret_cast<jarray>(o246)));
1824 EXPECT_EQ(247, env->GetArrayLength(reinterpret_cast<jarray>(o247)));
1825 EXPECT_EQ(248, env->GetArrayLength(reinterpret_cast<jarray>(o248)));
1826 EXPECT_EQ(249, env->GetArrayLength(reinterpret_cast<jarray>(o249)));
1827 EXPECT_EQ(250, env->GetArrayLength(reinterpret_cast<jarray>(o250)));
1828 EXPECT_EQ(251, env->GetArrayLength(reinterpret_cast<jarray>(o251)));
1829 EXPECT_EQ(252, env->GetArrayLength(reinterpret_cast<jarray>(o252)));
1830 EXPECT_EQ(253, env->GetArrayLength(reinterpret_cast<jarray>(o253)));
1831 }
1832}
1833
1834const char* longSig =
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;Ljava/lang/Object;"
1868 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1869 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1870 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1871 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1872 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1873 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1874 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1875 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1876 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1877 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1878 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1879 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1880 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1881 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1882 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1883 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1884 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1885 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)V";
1886
Andreas Gampe6e498692014-08-18 16:43:12 -07001887void JniCompilerTest::MaxParamNumberImpl() {
Andreas Gampe7a0e5042014-03-07 13:03:19 -08001888 SetUpForTest(false, "maxParamNumber", longSig,
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001889 CURRENT_JNI_WRAPPER(Java_MyClassNatives_maxParamNumber));
Andreas Gampe7a0e5042014-03-07 13:03:19 -08001890
1891 jvalue args[254];
1892
1893 // First test: test with all arguments null.
1894 for (int i = 0; i < 254; ++i) {
1895 args[i].l = nullptr;
1896 }
1897
1898 env_->CallNonvirtualVoidMethodA(jobj_, jklass_, jmethod_, args);
1899
1900 // Second test: test with int[] objects with increasing lengths
1901 for (int i = 0; i < 254; ++i) {
1902 jintArray tmp = env_->NewIntArray(i);
1903 args[i].l = tmp;
1904 EXPECT_NE(args[i].l, nullptr);
1905 }
1906
1907 env_->CallNonvirtualVoidMethodA(jobj_, jklass_, jmethod_, args);
1908}
1909
Andreas Gampe6e498692014-08-18 16:43:12 -07001910JNI_TEST(MaxParamNumber)
1911
1912void JniCompilerTest::WithoutImplementationImpl() {
Andreas Gampe369810a2015-01-14 19:53:31 -08001913 // This will lead to error messages in the log.
1914 ScopedLogSeverity sls(LogSeverity::FATAL);
1915
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001916 SetUpForTest(false, "withoutImplementation", "()V", NORMAL_JNI_ONLY_NULLPTR);
Andreas Gampead615172014-04-04 16:20:13 -07001917
1918 env_->CallVoidMethod(jobj_, jmethod_);
1919
1920 EXPECT_TRUE(Thread::Current()->IsExceptionPending());
1921 EXPECT_TRUE(env_->ExceptionCheck() == JNI_TRUE);
1922}
1923
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001924// TODO: Don't test @FastNative here since it goes through a stub lookup (unsupported) which would
1925// normally fail with an exception, but fails with an assert.
1926JNI_TEST_NORMAL_ONLY(WithoutImplementation)
Andreas Gampe6e498692014-08-18 16:43:12 -07001927
Andreas Gampe48ee3562015-04-10 19:57:29 -07001928void JniCompilerTest::WithoutImplementationRefReturnImpl() {
1929 // This will lead to error messages in the log.
1930 ScopedLogSeverity sls(LogSeverity::FATAL);
1931
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001932 SetUpForTest(false,
1933 "withoutImplementationRefReturn",
1934 "()Ljava/lang/Object;",
1935 NORMAL_JNI_ONLY_NULLPTR);
Andreas Gampe48ee3562015-04-10 19:57:29 -07001936
1937 env_->CallObjectMethod(jobj_, jmethod_);
1938
1939 EXPECT_TRUE(Thread::Current()->IsExceptionPending());
1940 EXPECT_TRUE(env_->ExceptionCheck() == JNI_TRUE);
1941}
1942
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001943// TODO: Should work for @FastNative too.
1944JNI_TEST_NORMAL_ONLY(WithoutImplementationRefReturn)
Andreas Gampe48ee3562015-04-10 19:57:29 -07001945
Ian Rogers6a3c1fc2014-10-31 00:33:20 -07001946void Java_MyClassNatives_stackArgsIntsFirst(JNIEnv*, jclass, jint i1, jint i2, jint i3,
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001947 jint i4, jint i5, jint i6, jint i7, jint i8, jint i9,
1948 jint i10, jfloat f1, jfloat f2, jfloat f3, jfloat f4,
1949 jfloat f5, jfloat f6, jfloat f7, jfloat f8, jfloat f9,
1950 jfloat f10) {
1951 EXPECT_EQ(i1, 1);
1952 EXPECT_EQ(i2, 2);
1953 EXPECT_EQ(i3, 3);
1954 EXPECT_EQ(i4, 4);
1955 EXPECT_EQ(i5, 5);
1956 EXPECT_EQ(i6, 6);
1957 EXPECT_EQ(i7, 7);
1958 EXPECT_EQ(i8, 8);
1959 EXPECT_EQ(i9, 9);
1960 EXPECT_EQ(i10, 10);
1961
Roland Levillainda4d79b2015-03-24 14:36:11 +00001962 jint i11 = bit_cast<jint, jfloat>(f1);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001963 EXPECT_EQ(i11, 11);
Roland Levillainda4d79b2015-03-24 14:36:11 +00001964 jint i12 = bit_cast<jint, jfloat>(f2);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001965 EXPECT_EQ(i12, 12);
Roland Levillainda4d79b2015-03-24 14:36:11 +00001966 jint i13 = bit_cast<jint, jfloat>(f3);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001967 EXPECT_EQ(i13, 13);
Roland Levillainda4d79b2015-03-24 14:36:11 +00001968 jint i14 = bit_cast<jint, jfloat>(f4);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001969 EXPECT_EQ(i14, 14);
Roland Levillainda4d79b2015-03-24 14:36:11 +00001970 jint i15 = bit_cast<jint, jfloat>(f5);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001971 EXPECT_EQ(i15, 15);
Roland Levillainda4d79b2015-03-24 14:36:11 +00001972 jint i16 = bit_cast<jint, jfloat>(f6);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001973 EXPECT_EQ(i16, 16);
Roland Levillainda4d79b2015-03-24 14:36:11 +00001974 jint i17 = bit_cast<jint, jfloat>(f7);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001975 EXPECT_EQ(i17, 17);
Roland Levillainda4d79b2015-03-24 14:36:11 +00001976 jint i18 = bit_cast<jint, jfloat>(f8);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001977 EXPECT_EQ(i18, 18);
Roland Levillainda4d79b2015-03-24 14:36:11 +00001978 jint i19 = bit_cast<jint, jfloat>(f9);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001979 EXPECT_EQ(i19, 19);
Roland Levillainda4d79b2015-03-24 14:36:11 +00001980 jint i20 = bit_cast<jint, jfloat>(f10);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001981 EXPECT_EQ(i20, 20);
1982}
1983
Andreas Gampe6e498692014-08-18 16:43:12 -07001984void JniCompilerTest::StackArgsIntsFirstImpl() {
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001985 SetUpForTest(true, "stackArgsIntsFirst", "(IIIIIIIIIIFFFFFFFFFF)V",
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001986 CURRENT_JNI_WRAPPER(Java_MyClassNatives_stackArgsIntsFirst));
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001987
1988 jint i1 = 1;
1989 jint i2 = 2;
1990 jint i3 = 3;
1991 jint i4 = 4;
1992 jint i5 = 5;
1993 jint i6 = 6;
1994 jint i7 = 7;
1995 jint i8 = 8;
1996 jint i9 = 9;
1997 jint i10 = 10;
1998
Roland Levillainda4d79b2015-03-24 14:36:11 +00001999 jfloat f1 = bit_cast<jfloat, jint>(11);
2000 jfloat f2 = bit_cast<jfloat, jint>(12);
2001 jfloat f3 = bit_cast<jfloat, jint>(13);
2002 jfloat f4 = bit_cast<jfloat, jint>(14);
2003 jfloat f5 = bit_cast<jfloat, jint>(15);
2004 jfloat f6 = bit_cast<jfloat, jint>(16);
2005 jfloat f7 = bit_cast<jfloat, jint>(17);
2006 jfloat f8 = bit_cast<jfloat, jint>(18);
2007 jfloat f9 = bit_cast<jfloat, jint>(19);
2008 jfloat f10 = bit_cast<jfloat, jint>(20);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07002009
2010 env_->CallStaticVoidMethod(jklass_, jmethod_, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, f1, f2,
2011 f3, f4, f5, f6, f7, f8, f9, f10);
2012}
2013
Igor Murashkin367f3dd2016-09-01 17:00:24 -07002014JNI_TEST_CRITICAL(StackArgsIntsFirst)
Andreas Gampe6e498692014-08-18 16:43:12 -07002015
Ian Rogers6a3c1fc2014-10-31 00:33:20 -07002016void Java_MyClassNatives_stackArgsFloatsFirst(JNIEnv*, jclass, jfloat f1, jfloat f2,
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07002017 jfloat f3, jfloat f4, jfloat f5, jfloat f6, jfloat f7,
2018 jfloat f8, jfloat f9, jfloat f10, jint i1, jint i2,
2019 jint i3, jint i4, jint i5, jint i6, jint i7, jint i8,
2020 jint i9, jint i10) {
2021 EXPECT_EQ(i1, 1);
2022 EXPECT_EQ(i2, 2);
2023 EXPECT_EQ(i3, 3);
2024 EXPECT_EQ(i4, 4);
2025 EXPECT_EQ(i5, 5);
2026 EXPECT_EQ(i6, 6);
2027 EXPECT_EQ(i7, 7);
2028 EXPECT_EQ(i8, 8);
2029 EXPECT_EQ(i9, 9);
2030 EXPECT_EQ(i10, 10);
2031
Roland Levillainda4d79b2015-03-24 14:36:11 +00002032 jint i11 = bit_cast<jint, jfloat>(f1);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07002033 EXPECT_EQ(i11, 11);
Roland Levillainda4d79b2015-03-24 14:36:11 +00002034 jint i12 = bit_cast<jint, jfloat>(f2);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07002035 EXPECT_EQ(i12, 12);
Roland Levillainda4d79b2015-03-24 14:36:11 +00002036 jint i13 = bit_cast<jint, jfloat>(f3);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07002037 EXPECT_EQ(i13, 13);
Roland Levillainda4d79b2015-03-24 14:36:11 +00002038 jint i14 = bit_cast<jint, jfloat>(f4);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07002039 EXPECT_EQ(i14, 14);
Roland Levillainda4d79b2015-03-24 14:36:11 +00002040 jint i15 = bit_cast<jint, jfloat>(f5);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07002041 EXPECT_EQ(i15, 15);
Roland Levillainda4d79b2015-03-24 14:36:11 +00002042 jint i16 = bit_cast<jint, jfloat>(f6);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07002043 EXPECT_EQ(i16, 16);
Roland Levillainda4d79b2015-03-24 14:36:11 +00002044 jint i17 = bit_cast<jint, jfloat>(f7);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07002045 EXPECT_EQ(i17, 17);
Roland Levillainda4d79b2015-03-24 14:36:11 +00002046 jint i18 = bit_cast<jint, jfloat>(f8);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07002047 EXPECT_EQ(i18, 18);
Roland Levillainda4d79b2015-03-24 14:36:11 +00002048 jint i19 = bit_cast<jint, jfloat>(f9);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07002049 EXPECT_EQ(i19, 19);
Roland Levillainda4d79b2015-03-24 14:36:11 +00002050 jint i20 = bit_cast<jint, jfloat>(f10);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07002051 EXPECT_EQ(i20, 20);
2052}
2053
Andreas Gampe6e498692014-08-18 16:43:12 -07002054void JniCompilerTest::StackArgsFloatsFirstImpl() {
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07002055 SetUpForTest(true, "stackArgsFloatsFirst", "(FFFFFFFFFFIIIIIIIIII)V",
Igor Murashkin367f3dd2016-09-01 17:00:24 -07002056 CURRENT_JNI_WRAPPER(Java_MyClassNatives_stackArgsFloatsFirst));
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07002057
2058 jint i1 = 1;
2059 jint i2 = 2;
2060 jint i3 = 3;
2061 jint i4 = 4;
2062 jint i5 = 5;
2063 jint i6 = 6;
2064 jint i7 = 7;
2065 jint i8 = 8;
2066 jint i9 = 9;
2067 jint i10 = 10;
2068
Roland Levillainda4d79b2015-03-24 14:36:11 +00002069 jfloat f1 = bit_cast<jfloat, jint>(11);
2070 jfloat f2 = bit_cast<jfloat, jint>(12);
2071 jfloat f3 = bit_cast<jfloat, jint>(13);
2072 jfloat f4 = bit_cast<jfloat, jint>(14);
2073 jfloat f5 = bit_cast<jfloat, jint>(15);
2074 jfloat f6 = bit_cast<jfloat, jint>(16);
2075 jfloat f7 = bit_cast<jfloat, jint>(17);
2076 jfloat f8 = bit_cast<jfloat, jint>(18);
2077 jfloat f9 = bit_cast<jfloat, jint>(19);
2078 jfloat f10 = bit_cast<jfloat, jint>(20);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07002079
2080 env_->CallStaticVoidMethod(jklass_, jmethod_, f1, f2, f3, f4, f5, f6, f7, f8, f9, f10, i1, i2, i3,
2081 i4, i5, i6, i7, i8, i9, i10);
2082}
2083
Igor Murashkin367f3dd2016-09-01 17:00:24 -07002084JNI_TEST_CRITICAL(StackArgsFloatsFirst)
Andreas Gampe6e498692014-08-18 16:43:12 -07002085
Ian Rogers6a3c1fc2014-10-31 00:33:20 -07002086void Java_MyClassNatives_stackArgsMixed(JNIEnv*, jclass, jint i1, jfloat f1, jint i2,
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07002087 jfloat f2, jint i3, jfloat f3, jint i4, jfloat f4, jint i5,
2088 jfloat f5, jint i6, jfloat f6, jint i7, jfloat f7, jint i8,
2089 jfloat f8, jint i9, jfloat f9, jint i10, jfloat f10) {
2090 EXPECT_EQ(i1, 1);
2091 EXPECT_EQ(i2, 2);
2092 EXPECT_EQ(i3, 3);
2093 EXPECT_EQ(i4, 4);
2094 EXPECT_EQ(i5, 5);
2095 EXPECT_EQ(i6, 6);
2096 EXPECT_EQ(i7, 7);
2097 EXPECT_EQ(i8, 8);
2098 EXPECT_EQ(i9, 9);
2099 EXPECT_EQ(i10, 10);
2100
Roland Levillainda4d79b2015-03-24 14:36:11 +00002101 jint i11 = bit_cast<jint, jfloat>(f1);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07002102 EXPECT_EQ(i11, 11);
Roland Levillainda4d79b2015-03-24 14:36:11 +00002103 jint i12 = bit_cast<jint, jfloat>(f2);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07002104 EXPECT_EQ(i12, 12);
Roland Levillainda4d79b2015-03-24 14:36:11 +00002105 jint i13 = bit_cast<jint, jfloat>(f3);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07002106 EXPECT_EQ(i13, 13);
Roland Levillainda4d79b2015-03-24 14:36:11 +00002107 jint i14 = bit_cast<jint, jfloat>(f4);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07002108 EXPECT_EQ(i14, 14);
Roland Levillainda4d79b2015-03-24 14:36:11 +00002109 jint i15 = bit_cast<jint, jfloat>(f5);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07002110 EXPECT_EQ(i15, 15);
Roland Levillainda4d79b2015-03-24 14:36:11 +00002111 jint i16 = bit_cast<jint, jfloat>(f6);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07002112 EXPECT_EQ(i16, 16);
Roland Levillainda4d79b2015-03-24 14:36:11 +00002113 jint i17 = bit_cast<jint, jfloat>(f7);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07002114 EXPECT_EQ(i17, 17);
Roland Levillainda4d79b2015-03-24 14:36:11 +00002115 jint i18 = bit_cast<jint, jfloat>(f8);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07002116 EXPECT_EQ(i18, 18);
Roland Levillainda4d79b2015-03-24 14:36:11 +00002117 jint i19 = bit_cast<jint, jfloat>(f9);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07002118 EXPECT_EQ(i19, 19);
Roland Levillainda4d79b2015-03-24 14:36:11 +00002119 jint i20 = bit_cast<jint, jfloat>(f10);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07002120 EXPECT_EQ(i20, 20);
2121}
2122
Andreas Gampe6e498692014-08-18 16:43:12 -07002123void JniCompilerTest::StackArgsMixedImpl() {
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07002124 SetUpForTest(true, "stackArgsMixed", "(IFIFIFIFIFIFIFIFIFIF)V",
Igor Murashkin367f3dd2016-09-01 17:00:24 -07002125 CURRENT_JNI_WRAPPER(Java_MyClassNatives_stackArgsMixed));
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07002126
2127 jint i1 = 1;
2128 jint i2 = 2;
2129 jint i3 = 3;
2130 jint i4 = 4;
2131 jint i5 = 5;
2132 jint i6 = 6;
2133 jint i7 = 7;
2134 jint i8 = 8;
2135 jint i9 = 9;
2136 jint i10 = 10;
2137
Roland Levillainda4d79b2015-03-24 14:36:11 +00002138 jfloat f1 = bit_cast<jfloat, jint>(11);
2139 jfloat f2 = bit_cast<jfloat, jint>(12);
2140 jfloat f3 = bit_cast<jfloat, jint>(13);
2141 jfloat f4 = bit_cast<jfloat, jint>(14);
2142 jfloat f5 = bit_cast<jfloat, jint>(15);
2143 jfloat f6 = bit_cast<jfloat, jint>(16);
2144 jfloat f7 = bit_cast<jfloat, jint>(17);
2145 jfloat f8 = bit_cast<jfloat, jint>(18);
2146 jfloat f9 = bit_cast<jfloat, jint>(19);
2147 jfloat f10 = bit_cast<jfloat, jint>(20);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07002148
2149 env_->CallStaticVoidMethod(jklass_, jmethod_, i1, f1, i2, f2, i3, f3, i4, f4, i5, f5, i6, f6, i7,
2150 f7, i8, f8, i9, f9, i10, f10);
2151}
2152
Igor Murashkin367f3dd2016-09-01 17:00:24 -07002153JNI_TEST_CRITICAL(StackArgsMixed)
Andreas Gampe6e498692014-08-18 16:43:12 -07002154
Lazar Trsicf652d602015-06-24 16:30:21 +02002155#if defined(__mips__) && defined(__LP64__) && (__BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__)
Pavle Batuta837e72a2016-03-16 11:31:46 +01002156// Function will fetch the last argument passed from caller that is now on top of the stack and
2157// return it as a 8B long. That way we can test if the caller has properly sign-extended the
2158// value when placing it on the stack.
2159__attribute__((naked))
2160jlong Java_MyClassNatives_getStackArgSignExtendedMips64(
2161 JNIEnv*, jclass, // Arguments passed from caller
2162 jint, jint, jint, jint, jint, jint, // through regs a0 to a7.
2163 jint) { // The last argument will be passed on the stack.
2164 __asm__(
2165 ".set noreorder\n\t" // Just return and store 8 bytes from the top of the stack
2166 "jr $ra\n\t" // in v0 (in branch delay slot). This should be the last
2167 "ld $v0, 0($sp)\n\t"); // argument. It is a 32-bit int, but it should be sign
2168 // extended and it occupies 64-bit location.
Lazar Trsicf652d602015-06-24 16:30:21 +02002169}
2170
2171void JniCompilerTest::StackArgsSignExtendedMips64Impl() {
Pavle Batuta837e72a2016-03-16 11:31:46 +01002172 uint64_t ret;
2173 SetUpForTest(true,
2174 "getStackArgSignExtendedMips64",
2175 "(IIIIIII)J",
2176 // Don't use wrapper because this is raw assembly function.
2177 reinterpret_cast<void*>(&Java_MyClassNatives_getStackArgSignExtendedMips64));
Lazar Trsicf652d602015-06-24 16:30:21 +02002178
Pavle Batuta837e72a2016-03-16 11:31:46 +01002179 // Mips64 ABI requires that arguments passed through stack be sign-extended 8B slots.
2180 // First 8 arguments are passed through registers.
2181 // Final argument's value is 7. When sign-extended, higher stack bits should be 0.
2182 ret = env_->CallStaticLongMethod(jklass_, jmethod_, 1, 2, 3, 4, 5, 6, 7);
2183 EXPECT_EQ(High32Bits(ret), static_cast<uint32_t>(0));
2184
2185 // Final argument's value is -8. When sign-extended, higher stack bits should be 0xffffffff.
2186 ret = env_->CallStaticLongMethod(jklass_, jmethod_, 1, 2, 3, 4, 5, 6, -8);
2187 EXPECT_EQ(High32Bits(ret), static_cast<uint32_t>(0xffffffff));
Lazar Trsicf652d602015-06-24 16:30:21 +02002188}
2189
Pavle Batuta837e72a2016-03-16 11:31:46 +01002190JNI_TEST(StackArgsSignExtendedMips64)
2191#endif
Lazar Trsicf652d602015-06-24 16:30:21 +02002192
Igor Murashkin9d4b6da2016-07-29 09:51:58 -07002193void Java_MyClassNatives_normalNative(JNIEnv*, jclass) {
2194 // Intentionally left empty.
2195}
2196
2197// Methods not annotated with anything are not considered "fast native"
2198// -- Check that the annotation lookup does not find it.
2199void JniCompilerTest::NormalNativeImpl() {
2200 SetUpForTest(/* direct */ true,
2201 "normalNative",
2202 "()V",
Igor Murashkin367f3dd2016-09-01 17:00:24 -07002203 CURRENT_JNI_WRAPPER(Java_MyClassNatives_normalNative));
Igor Murashkin9d4b6da2016-07-29 09:51:58 -07002204
Andreas Gampe13b27842016-11-07 16:48:23 -08002205 ArtMethod* method = jni::DecodeArtMethod(jmethod_);
Igor Murashkin9d4b6da2016-07-29 09:51:58 -07002206 ASSERT_TRUE(method != nullptr);
2207
Igor Murashkin367f3dd2016-09-01 17:00:24 -07002208 EXPECT_FALSE(method->IsAnnotatedWithCriticalNative());
Igor Murashkin9d4b6da2016-07-29 09:51:58 -07002209 EXPECT_FALSE(method->IsAnnotatedWithFastNative());
2210}
Igor Murashkin367f3dd2016-09-01 17:00:24 -07002211
2212// TODO: just rename the java functions to the standard convention and remove duplicated tests
2213JNI_TEST_NORMAL_ONLY(NormalNative)
Igor Murashkin9d4b6da2016-07-29 09:51:58 -07002214
2215// Methods annotated with @FastNative are considered "fast native"
2216// -- Check that the annotation lookup succeeds.
2217void Java_MyClassNatives_fastNative(JNIEnv*, jclass) {
2218 // Intentionally left empty.
2219}
2220
2221void JniCompilerTest::FastNativeImpl() {
2222 SetUpForTest(/* direct */ true,
2223 "fastNative",
2224 "()V",
Igor Murashkin367f3dd2016-09-01 17:00:24 -07002225 CURRENT_JNI_WRAPPER(Java_MyClassNatives_fastNative));
Igor Murashkin9d4b6da2016-07-29 09:51:58 -07002226
Andreas Gampe13b27842016-11-07 16:48:23 -08002227 ArtMethod* method = jni::DecodeArtMethod(jmethod_);
Igor Murashkin9d4b6da2016-07-29 09:51:58 -07002228 ASSERT_TRUE(method != nullptr);
2229
Igor Murashkin367f3dd2016-09-01 17:00:24 -07002230 EXPECT_FALSE(method->IsAnnotatedWithCriticalNative());
Igor Murashkin9d4b6da2016-07-29 09:51:58 -07002231 EXPECT_TRUE(method->IsAnnotatedWithFastNative());
2232}
Igor Murashkin367f3dd2016-09-01 17:00:24 -07002233
2234// TODO: just rename the java functions to the standard convention and remove duplicated tests
2235JNI_TEST_NORMAL_ONLY(FastNative)
2236
2237int gJava_myClassNatives_criticalNative_calls[kJniKindCount] = {};
2238// Methods annotated with @CriticalNative are considered "critical native"
2239// -- Check that the annotation lookup succeeds.
2240void Java_MyClassNatives_criticalNative() {
2241 gJava_myClassNatives_criticalNative_calls[gCurrentJni]++;
2242}
2243
2244void JniCompilerTest::CriticalNativeImpl() {
2245 SetUpForTest(/* direct */ true,
2246 // Important: Don't change the "current jni" yet to avoid a method name suffix.
2247 "criticalNative",
2248 "()V",
2249 // TODO: Use CURRENT_JNI_WRAPPER instead which is more generic.
2250 reinterpret_cast<void*>(&Java_MyClassNatives_criticalNative));
2251
2252 // TODO: remove this manual updating of the current JNI. Merge with the other tests.
2253 UpdateCurrentJni(JniKind::kCritical);
2254 ASSERT_TRUE(IsCurrentJniCritical());
2255
Andreas Gampe13b27842016-11-07 16:48:23 -08002256 ArtMethod* method = jni::DecodeArtMethod(jmethod_);
Igor Murashkin367f3dd2016-09-01 17:00:24 -07002257 ASSERT_TRUE(method != nullptr);
2258
2259 EXPECT_TRUE(method->IsAnnotatedWithCriticalNative());
2260 EXPECT_FALSE(method->IsAnnotatedWithFastNative());
2261
2262 EXPECT_EQ(0, gJava_myClassNatives_criticalNative_calls[gCurrentJni]);
2263 env_->CallStaticVoidMethod(jklass_, jmethod_);
2264 EXPECT_EQ(1, gJava_myClassNatives_criticalNative_calls[gCurrentJni]);
2265
2266 gJava_myClassNatives_criticalNative_calls[gCurrentJni] = 0;
2267}
2268
2269// TODO: just rename the java functions to the standard convention and remove duplicated tests
2270JNI_TEST_NORMAL_ONLY(CriticalNative)
Igor Murashkin9d4b6da2016-07-29 09:51:58 -07002271
Ian Rogersb033c752011-07-20 12:22:35 -07002272} // namespace art