blob: 189ed03fb055bc7add2e0fd6a1dc77ff997bcea9 [file] [log] [blame]
Ian Rogers53b8b092014-03-13 23:45:53 -07001/*
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 */
16
17#include "reflection.h"
18
Brian Carlstrom8edba0b2014-03-14 16:11:43 -070019#include <float.h>
Ian Rogers88e46a32014-03-14 14:37:59 -070020#include <limits.h>
Ian Rogerse63db272014-07-15 15:36:11 -070021#include "ScopedLocalRef.h"
Ian Rogers53b8b092014-03-13 23:45:53 -070022
Mathieu Chartiere401d142015-04-22 13:56:20 -070023#include "art_method-inl.h"
Andreas Gampe542451c2016-07-26 09:02:02 -070024#include "base/enums.h"
Ian Rogers53b8b092014-03-13 23:45:53 -070025#include "common_compiler_test.h"
Mathieu Chartier0795f232016-09-27 18:43:30 -070026#include "scoped_thread_state_change-inl.h"
Ian Rogers53b8b092014-03-13 23:45:53 -070027
28namespace art {
29
30// TODO: Convert to CommonRuntimeTest. Currently MakeExecutable is used.
31class ReflectionTest : public CommonCompilerTest {
32 protected:
33 virtual void SetUp() {
34 CommonCompilerTest::SetUp();
35
36 vm_ = Runtime::Current()->GetJavaVM();
37
38 // Turn on -verbose:jni for the JNI tests.
39 // gLogVerbosity.jni = true;
40
Mathieu Chartier2cebb242015-04-21 16:50:40 -070041 vm_->AttachCurrentThread(&env_, nullptr);
Ian Rogers53b8b092014-03-13 23:45:53 -070042
43 ScopedLocalRef<jclass> aioobe(env_,
44 env_->FindClass("java/lang/ArrayIndexOutOfBoundsException"));
Mathieu Chartier2cebb242015-04-21 16:50:40 -070045 CHECK(aioobe.get() != nullptr);
Ian Rogers53b8b092014-03-13 23:45:53 -070046 aioobe_ = reinterpret_cast<jclass>(env_->NewGlobalRef(aioobe.get()));
47
48 ScopedLocalRef<jclass> ase(env_, env_->FindClass("java/lang/ArrayStoreException"));
Mathieu Chartier2cebb242015-04-21 16:50:40 -070049 CHECK(ase.get() != nullptr);
Ian Rogers53b8b092014-03-13 23:45:53 -070050 ase_ = reinterpret_cast<jclass>(env_->NewGlobalRef(ase.get()));
51
52 ScopedLocalRef<jclass> sioobe(env_,
53 env_->FindClass("java/lang/StringIndexOutOfBoundsException"));
Mathieu Chartier2cebb242015-04-21 16:50:40 -070054 CHECK(sioobe.get() != nullptr);
Ian Rogers53b8b092014-03-13 23:45:53 -070055 sioobe_ = reinterpret_cast<jclass>(env_->NewGlobalRef(sioobe.get()));
56 }
57
58 void CleanUpJniEnv() {
Mathieu Chartier2cebb242015-04-21 16:50:40 -070059 if (aioobe_ != nullptr) {
Ian Rogers53b8b092014-03-13 23:45:53 -070060 env_->DeleteGlobalRef(aioobe_);
Mathieu Chartier2cebb242015-04-21 16:50:40 -070061 aioobe_ = nullptr;
Ian Rogers53b8b092014-03-13 23:45:53 -070062 }
Mathieu Chartier2cebb242015-04-21 16:50:40 -070063 if (ase_ != nullptr) {
Ian Rogers53b8b092014-03-13 23:45:53 -070064 env_->DeleteGlobalRef(ase_);
Mathieu Chartier2cebb242015-04-21 16:50:40 -070065 ase_ = nullptr;
Ian Rogers53b8b092014-03-13 23:45:53 -070066 }
Mathieu Chartier2cebb242015-04-21 16:50:40 -070067 if (sioobe_ != nullptr) {
Ian Rogers53b8b092014-03-13 23:45:53 -070068 env_->DeleteGlobalRef(sioobe_);
Mathieu Chartier2cebb242015-04-21 16:50:40 -070069 sioobe_ = nullptr;
Ian Rogers53b8b092014-03-13 23:45:53 -070070 }
71 }
72
73 virtual void TearDown() {
74 CleanUpJniEnv();
75 CommonCompilerTest::TearDown();
76 }
77
78 jclass GetPrimitiveClass(char descriptor) {
79 ScopedObjectAccess soa(env_);
80 mirror::Class* c = class_linker_->FindPrimitiveClass(descriptor);
81 CHECK(c != nullptr);
82 return soa.AddLocalReference<jclass>(c);
83 }
84
Mathieu Chartiere401d142015-04-22 13:56:20 -070085 void ReflectionTestMakeExecutable(ArtMethod** method,
Ian Rogers53b8b092014-03-13 23:45:53 -070086 mirror::Object** receiver,
87 bool is_static, const char* method_name,
88 const char* method_signature)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -070089 REQUIRES_SHARED(Locks::mutator_lock_) {
Ian Rogers53b8b092014-03-13 23:45:53 -070090 const char* class_name = is_static ? "StaticLeafMethods" : "NonStaticLeafMethods";
91 jobject jclass_loader(LoadDex(class_name));
92 Thread* self = Thread::Current();
Mathieu Chartiereb8167a2014-05-07 15:43:14 -070093 StackHandleScope<2> hs(self);
94 Handle<mirror::ClassLoader> class_loader(
95 hs.NewHandle(
Mathieu Chartier0795f232016-09-27 18:43:30 -070096 ScopedObjectAccessUnchecked(self).Decode<mirror::ClassLoader>(jclass_loader)));
97 if (!is_static) {
Ian Rogers53b8b092014-03-13 23:45:53 -070098 MakeExecutable(nullptr, "java.lang.Class");
99 MakeExecutable(nullptr, "java.lang.Object");
Ian Rogers53b8b092014-03-13 23:45:53 -0700100 }
Mathieu Chartier0795f232016-09-27 18:43:30 -0700101 MakeExecutable(class_loader.Get(), class_name);
Ian Rogers53b8b092014-03-13 23:45:53 -0700102
103 mirror::Class* c = class_linker_->FindClass(self, DotToDescriptor(class_name).c_str(),
104 class_loader);
Mathieu Chartier2cebb242015-04-21 16:50:40 -0700105 CHECK(c != nullptr);
Ian Rogers53b8b092014-03-13 23:45:53 -0700106
Andreas Gampe542451c2016-07-26 09:02:02 -0700107 *method = is_static ? c->FindDirectMethod(method_name, method_signature, kRuntimePointerSize)
108 : c->FindVirtualMethod(method_name, method_signature, kRuntimePointerSize);
Ian Rogers53b8b092014-03-13 23:45:53 -0700109 CHECK(method != nullptr);
110
Sebastien Hertz4e99b3d2014-06-24 14:35:40 +0200111 if (is_static) {
112 *receiver = nullptr;
113 } else {
114 // Ensure class is initialized before allocating object
Andreas Gampe277ccbd2014-11-03 21:36:10 -0800115 StackHandleScope<1> hs2(self);
116 Handle<mirror::Class> h_class(hs2.NewHandle(c));
Ian Rogers7b078e82014-09-10 14:44:24 -0700117 bool initialized = class_linker_->EnsureInitialized(self, h_class, true, true);
Sebastien Hertz4e99b3d2014-06-24 14:35:40 +0200118 CHECK(initialized);
119 *receiver = c->AllocObject(self);
120 }
Ian Rogers53b8b092014-03-13 23:45:53 -0700121
122 // Start runtime.
123 bool started = runtime_->Start();
124 CHECK(started);
125 self->TransitionFromSuspendedToRunnable();
126 }
127
128 void InvokeNopMethod(bool is_static) {
129 ScopedObjectAccess soa(env_);
Mathieu Chartiere401d142015-04-22 13:56:20 -0700130 ArtMethod* method;
Ian Rogers53b8b092014-03-13 23:45:53 -0700131 mirror::Object* receiver;
132 ReflectionTestMakeExecutable(&method, &receiver, is_static, "nop", "()V");
Jeff Hao39b6c242015-05-19 20:30:23 -0700133 ScopedLocalRef<jobject> receiver_ref(soa.Env(), soa.AddLocalReference<jobject>(receiver));
134 InvokeWithJValues(soa, receiver_ref.get(), soa.EncodeMethod(method), nullptr);
Ian Rogers53b8b092014-03-13 23:45:53 -0700135 }
136
137 void InvokeIdentityByteMethod(bool is_static) {
138 ScopedObjectAccess soa(env_);
Mathieu Chartiere401d142015-04-22 13:56:20 -0700139 ArtMethod* method;
Ian Rogers53b8b092014-03-13 23:45:53 -0700140 mirror::Object* receiver;
141 ReflectionTestMakeExecutable(&method, &receiver, is_static, "identity", "(B)B");
Jeff Hao39b6c242015-05-19 20:30:23 -0700142 ScopedLocalRef<jobject> receiver_ref(soa.Env(), soa.AddLocalReference<jobject>(receiver));
Ian Rogers53b8b092014-03-13 23:45:53 -0700143 jvalue args[1];
144
145 args[0].b = 0;
Jeff Hao39b6c242015-05-19 20:30:23 -0700146 JValue result = InvokeWithJValues(soa, receiver_ref.get(), soa.EncodeMethod(method), args);
Ian Rogers53b8b092014-03-13 23:45:53 -0700147 EXPECT_EQ(0, result.GetB());
148
149 args[0].b = -1;
Jeff Hao39b6c242015-05-19 20:30:23 -0700150 result = InvokeWithJValues(soa, receiver_ref.get(), soa.EncodeMethod(method), args);
Ian Rogers53b8b092014-03-13 23:45:53 -0700151 EXPECT_EQ(-1, result.GetB());
152
153 args[0].b = SCHAR_MAX;
Jeff Hao39b6c242015-05-19 20:30:23 -0700154 result = InvokeWithJValues(soa, receiver_ref.get(), soa.EncodeMethod(method), args);
Ian Rogers53b8b092014-03-13 23:45:53 -0700155 EXPECT_EQ(SCHAR_MAX, result.GetB());
156
Andreas Gampe58554b72015-10-20 21:08:52 -0700157 static_assert(SCHAR_MIN == -128, "SCHAR_MIN unexpected");
158 args[0].b = SCHAR_MIN;
Jeff Hao39b6c242015-05-19 20:30:23 -0700159 result = InvokeWithJValues(soa, receiver_ref.get(), soa.EncodeMethod(method), args);
Ian Rogers53b8b092014-03-13 23:45:53 -0700160 EXPECT_EQ(SCHAR_MIN, result.GetB());
161 }
162
163 void InvokeIdentityIntMethod(bool is_static) {
164 ScopedObjectAccess soa(env_);
Mathieu Chartiere401d142015-04-22 13:56:20 -0700165 ArtMethod* method;
Ian Rogers53b8b092014-03-13 23:45:53 -0700166 mirror::Object* receiver;
167 ReflectionTestMakeExecutable(&method, &receiver, is_static, "identity", "(I)I");
Jeff Hao39b6c242015-05-19 20:30:23 -0700168 ScopedLocalRef<jobject> receiver_ref(soa.Env(), soa.AddLocalReference<jobject>(receiver));
Ian Rogers53b8b092014-03-13 23:45:53 -0700169 jvalue args[1];
170
171 args[0].i = 0;
Jeff Hao39b6c242015-05-19 20:30:23 -0700172 JValue result = InvokeWithJValues(soa, receiver_ref.get(), soa.EncodeMethod(method), args);
Ian Rogers53b8b092014-03-13 23:45:53 -0700173 EXPECT_EQ(0, result.GetI());
174
175 args[0].i = -1;
Jeff Hao39b6c242015-05-19 20:30:23 -0700176 result = InvokeWithJValues(soa, receiver_ref.get(), soa.EncodeMethod(method), args);
Ian Rogers53b8b092014-03-13 23:45:53 -0700177 EXPECT_EQ(-1, result.GetI());
178
179 args[0].i = INT_MAX;
Jeff Hao39b6c242015-05-19 20:30:23 -0700180 result = InvokeWithJValues(soa, receiver_ref.get(), soa.EncodeMethod(method), args);
Ian Rogers53b8b092014-03-13 23:45:53 -0700181 EXPECT_EQ(INT_MAX, result.GetI());
182
183 args[0].i = INT_MIN;
Jeff Hao39b6c242015-05-19 20:30:23 -0700184 result = InvokeWithJValues(soa, receiver_ref.get(), soa.EncodeMethod(method), args);
Ian Rogers53b8b092014-03-13 23:45:53 -0700185 EXPECT_EQ(INT_MIN, result.GetI());
186 }
187
188 void InvokeIdentityDoubleMethod(bool is_static) {
189 ScopedObjectAccess soa(env_);
Mathieu Chartiere401d142015-04-22 13:56:20 -0700190 ArtMethod* method;
Ian Rogers53b8b092014-03-13 23:45:53 -0700191 mirror::Object* receiver;
192 ReflectionTestMakeExecutable(&method, &receiver, is_static, "identity", "(D)D");
Jeff Hao39b6c242015-05-19 20:30:23 -0700193 ScopedLocalRef<jobject> receiver_ref(soa.Env(), soa.AddLocalReference<jobject>(receiver));
Ian Rogers53b8b092014-03-13 23:45:53 -0700194 jvalue args[1];
195
196 args[0].d = 0.0;
Jeff Hao39b6c242015-05-19 20:30:23 -0700197 JValue result = InvokeWithJValues(soa, receiver_ref.get(), soa.EncodeMethod(method), args);
Ian Rogers647b1a82014-10-10 11:02:11 -0700198 EXPECT_DOUBLE_EQ(0.0, result.GetD());
Ian Rogers53b8b092014-03-13 23:45:53 -0700199
200 args[0].d = -1.0;
Jeff Hao39b6c242015-05-19 20:30:23 -0700201 result = InvokeWithJValues(soa, receiver_ref.get(), soa.EncodeMethod(method), args);
Ian Rogers647b1a82014-10-10 11:02:11 -0700202 EXPECT_DOUBLE_EQ(-1.0, result.GetD());
Ian Rogers53b8b092014-03-13 23:45:53 -0700203
204 args[0].d = DBL_MAX;
Jeff Hao39b6c242015-05-19 20:30:23 -0700205 result = InvokeWithJValues(soa, receiver_ref.get(), soa.EncodeMethod(method), args);
Ian Rogers647b1a82014-10-10 11:02:11 -0700206 EXPECT_DOUBLE_EQ(DBL_MAX, result.GetD());
Ian Rogers53b8b092014-03-13 23:45:53 -0700207
208 args[0].d = DBL_MIN;
Jeff Hao39b6c242015-05-19 20:30:23 -0700209 result = InvokeWithJValues(soa, receiver_ref.get(), soa.EncodeMethod(method), args);
Ian Rogers647b1a82014-10-10 11:02:11 -0700210 EXPECT_DOUBLE_EQ(DBL_MIN, result.GetD());
Ian Rogers53b8b092014-03-13 23:45:53 -0700211 }
212
213 void InvokeSumIntIntMethod(bool is_static) {
214 ScopedObjectAccess soa(env_);
Mathieu Chartiere401d142015-04-22 13:56:20 -0700215 ArtMethod* method;
Ian Rogers53b8b092014-03-13 23:45:53 -0700216 mirror::Object* receiver;
217 ReflectionTestMakeExecutable(&method, &receiver, is_static, "sum", "(II)I");
Jeff Hao39b6c242015-05-19 20:30:23 -0700218 ScopedLocalRef<jobject> receiver_ref(soa.Env(), soa.AddLocalReference<jobject>(receiver));
Ian Rogers53b8b092014-03-13 23:45:53 -0700219 jvalue args[2];
220
221 args[0].i = 1;
222 args[1].i = 2;
Jeff Hao39b6c242015-05-19 20:30:23 -0700223 JValue result = InvokeWithJValues(soa, receiver_ref.get(), soa.EncodeMethod(method), args);
Ian Rogers53b8b092014-03-13 23:45:53 -0700224 EXPECT_EQ(3, result.GetI());
225
226 args[0].i = -2;
227 args[1].i = 5;
Jeff Hao39b6c242015-05-19 20:30:23 -0700228 result = InvokeWithJValues(soa, receiver_ref.get(), soa.EncodeMethod(method), args);
Ian Rogers53b8b092014-03-13 23:45:53 -0700229 EXPECT_EQ(3, result.GetI());
230
231 args[0].i = INT_MAX;
232 args[1].i = INT_MIN;
Jeff Hao39b6c242015-05-19 20:30:23 -0700233 result = InvokeWithJValues(soa, receiver_ref.get(), soa.EncodeMethod(method), args);
Ian Rogers53b8b092014-03-13 23:45:53 -0700234 EXPECT_EQ(-1, result.GetI());
235
236 args[0].i = INT_MAX;
237 args[1].i = INT_MAX;
Jeff Hao39b6c242015-05-19 20:30:23 -0700238 result = InvokeWithJValues(soa, receiver_ref.get(), soa.EncodeMethod(method), args);
Ian Rogers53b8b092014-03-13 23:45:53 -0700239 EXPECT_EQ(-2, result.GetI());
240 }
241
242 void InvokeSumIntIntIntMethod(bool is_static) {
243 ScopedObjectAccess soa(env_);
Mathieu Chartiere401d142015-04-22 13:56:20 -0700244 ArtMethod* method;
Ian Rogers53b8b092014-03-13 23:45:53 -0700245 mirror::Object* receiver;
246 ReflectionTestMakeExecutable(&method, &receiver, is_static, "sum", "(III)I");
Jeff Hao39b6c242015-05-19 20:30:23 -0700247 ScopedLocalRef<jobject> receiver_ref(soa.Env(), soa.AddLocalReference<jobject>(receiver));
Ian Rogers53b8b092014-03-13 23:45:53 -0700248 jvalue args[3];
249
250 args[0].i = 0;
251 args[1].i = 0;
252 args[2].i = 0;
Jeff Hao39b6c242015-05-19 20:30:23 -0700253 JValue result = InvokeWithJValues(soa, receiver_ref.get(), soa.EncodeMethod(method), args);
Ian Rogers53b8b092014-03-13 23:45:53 -0700254 EXPECT_EQ(0, result.GetI());
255
256 args[0].i = 1;
257 args[1].i = 2;
258 args[2].i = 3;
Jeff Hao39b6c242015-05-19 20:30:23 -0700259 result = InvokeWithJValues(soa, receiver_ref.get(), soa.EncodeMethod(method), args);
Ian Rogers53b8b092014-03-13 23:45:53 -0700260 EXPECT_EQ(6, result.GetI());
261
262 args[0].i = -1;
263 args[1].i = 2;
264 args[2].i = -3;
Jeff Hao39b6c242015-05-19 20:30:23 -0700265 result = InvokeWithJValues(soa, receiver_ref.get(), soa.EncodeMethod(method), args);
Ian Rogers53b8b092014-03-13 23:45:53 -0700266 EXPECT_EQ(-2, result.GetI());
267
268 args[0].i = INT_MAX;
269 args[1].i = INT_MIN;
270 args[2].i = INT_MAX;
Jeff Hao39b6c242015-05-19 20:30:23 -0700271 result = InvokeWithJValues(soa, receiver_ref.get(), soa.EncodeMethod(method), args);
Ian Rogers53b8b092014-03-13 23:45:53 -0700272 EXPECT_EQ(2147483646, result.GetI());
273
274 args[0].i = INT_MAX;
275 args[1].i = INT_MAX;
276 args[2].i = INT_MAX;
Jeff Hao39b6c242015-05-19 20:30:23 -0700277 result = InvokeWithJValues(soa, receiver_ref.get(), soa.EncodeMethod(method), args);
Ian Rogers53b8b092014-03-13 23:45:53 -0700278 EXPECT_EQ(2147483645, result.GetI());
279 }
280
281 void InvokeSumIntIntIntIntMethod(bool is_static) {
282 ScopedObjectAccess soa(env_);
Mathieu Chartiere401d142015-04-22 13:56:20 -0700283 ArtMethod* method;
Ian Rogers53b8b092014-03-13 23:45:53 -0700284 mirror::Object* receiver;
285 ReflectionTestMakeExecutable(&method, &receiver, is_static, "sum", "(IIII)I");
Jeff Hao39b6c242015-05-19 20:30:23 -0700286 ScopedLocalRef<jobject> receiver_ref(soa.Env(), soa.AddLocalReference<jobject>(receiver));
Ian Rogers53b8b092014-03-13 23:45:53 -0700287 jvalue args[4];
288
289 args[0].i = 0;
290 args[1].i = 0;
291 args[2].i = 0;
292 args[3].i = 0;
Jeff Hao39b6c242015-05-19 20:30:23 -0700293 JValue result = InvokeWithJValues(soa, receiver_ref.get(), soa.EncodeMethod(method), args);
Ian Rogers53b8b092014-03-13 23:45:53 -0700294 EXPECT_EQ(0, result.GetI());
295
296 args[0].i = 1;
297 args[1].i = 2;
298 args[2].i = 3;
299 args[3].i = 4;
Jeff Hao39b6c242015-05-19 20:30:23 -0700300 result = InvokeWithJValues(soa, receiver_ref.get(), soa.EncodeMethod(method), args);
Ian Rogers53b8b092014-03-13 23:45:53 -0700301 EXPECT_EQ(10, result.GetI());
302
303 args[0].i = -1;
304 args[1].i = 2;
305 args[2].i = -3;
306 args[3].i = 4;
Jeff Hao39b6c242015-05-19 20:30:23 -0700307 result = InvokeWithJValues(soa, receiver_ref.get(), soa.EncodeMethod(method), args);
Ian Rogers53b8b092014-03-13 23:45:53 -0700308 EXPECT_EQ(2, result.GetI());
309
310 args[0].i = INT_MAX;
311 args[1].i = INT_MIN;
312 args[2].i = INT_MAX;
313 args[3].i = INT_MIN;
Jeff Hao39b6c242015-05-19 20:30:23 -0700314 result = InvokeWithJValues(soa, receiver_ref.get(), soa.EncodeMethod(method), args);
Ian Rogers53b8b092014-03-13 23:45:53 -0700315 EXPECT_EQ(-2, result.GetI());
316
317 args[0].i = INT_MAX;
318 args[1].i = INT_MAX;
319 args[2].i = INT_MAX;
320 args[3].i = INT_MAX;
Jeff Hao39b6c242015-05-19 20:30:23 -0700321 result = InvokeWithJValues(soa, receiver_ref.get(), soa.EncodeMethod(method), args);
Ian Rogers53b8b092014-03-13 23:45:53 -0700322 EXPECT_EQ(-4, result.GetI());
323 }
324
325 void InvokeSumIntIntIntIntIntMethod(bool is_static) {
326 ScopedObjectAccess soa(env_);
Mathieu Chartiere401d142015-04-22 13:56:20 -0700327 ArtMethod* method;
Ian Rogers53b8b092014-03-13 23:45:53 -0700328 mirror::Object* receiver;
329 ReflectionTestMakeExecutable(&method, &receiver, is_static, "sum", "(IIIII)I");
Jeff Hao39b6c242015-05-19 20:30:23 -0700330 ScopedLocalRef<jobject> receiver_ref(soa.Env(), soa.AddLocalReference<jobject>(receiver));
Ian Rogers53b8b092014-03-13 23:45:53 -0700331 jvalue args[5];
332
333 args[0].i = 0;
334 args[1].i = 0;
335 args[2].i = 0;
336 args[3].i = 0;
337 args[4].i = 0;
Jeff Hao39b6c242015-05-19 20:30:23 -0700338 JValue result = InvokeWithJValues(soa, receiver_ref.get(), soa.EncodeMethod(method), args);
Ian Rogers53b8b092014-03-13 23:45:53 -0700339 EXPECT_EQ(0, result.GetI());
340
341 args[0].i = 1;
342 args[1].i = 2;
343 args[2].i = 3;
344 args[3].i = 4;
345 args[4].i = 5;
Jeff Hao39b6c242015-05-19 20:30:23 -0700346 result = InvokeWithJValues(soa, receiver_ref.get(), soa.EncodeMethod(method), args);
Ian Rogers53b8b092014-03-13 23:45:53 -0700347 EXPECT_EQ(15, result.GetI());
348
349 args[0].i = -1;
350 args[1].i = 2;
351 args[2].i = -3;
352 args[3].i = 4;
353 args[4].i = -5;
Jeff Hao39b6c242015-05-19 20:30:23 -0700354 result = InvokeWithJValues(soa, receiver_ref.get(), soa.EncodeMethod(method), args);
Ian Rogers53b8b092014-03-13 23:45:53 -0700355 EXPECT_EQ(-3, result.GetI());
356
357 args[0].i = INT_MAX;
358 args[1].i = INT_MIN;
359 args[2].i = INT_MAX;
360 args[3].i = INT_MIN;
361 args[4].i = INT_MAX;
Jeff Hao39b6c242015-05-19 20:30:23 -0700362 result = InvokeWithJValues(soa, receiver_ref.get(), soa.EncodeMethod(method), args);
Ian Rogers53b8b092014-03-13 23:45:53 -0700363 EXPECT_EQ(2147483645, result.GetI());
364
365 args[0].i = INT_MAX;
366 args[1].i = INT_MAX;
367 args[2].i = INT_MAX;
368 args[3].i = INT_MAX;
369 args[4].i = INT_MAX;
Jeff Hao39b6c242015-05-19 20:30:23 -0700370 result = InvokeWithJValues(soa, receiver_ref.get(), soa.EncodeMethod(method), args);
Ian Rogers53b8b092014-03-13 23:45:53 -0700371 EXPECT_EQ(2147483643, result.GetI());
372 }
373
374 void InvokeSumDoubleDoubleMethod(bool is_static) {
375 ScopedObjectAccess soa(env_);
Mathieu Chartiere401d142015-04-22 13:56:20 -0700376 ArtMethod* method;
Ian Rogers53b8b092014-03-13 23:45:53 -0700377 mirror::Object* receiver;
378 ReflectionTestMakeExecutable(&method, &receiver, is_static, "sum", "(DD)D");
Jeff Hao39b6c242015-05-19 20:30:23 -0700379 ScopedLocalRef<jobject> receiver_ref(soa.Env(), soa.AddLocalReference<jobject>(receiver));
Ian Rogers53b8b092014-03-13 23:45:53 -0700380 jvalue args[2];
381
382 args[0].d = 0.0;
383 args[1].d = 0.0;
Jeff Hao39b6c242015-05-19 20:30:23 -0700384 JValue result = InvokeWithJValues(soa, receiver_ref.get(), soa.EncodeMethod(method), args);
Ian Rogers647b1a82014-10-10 11:02:11 -0700385 EXPECT_DOUBLE_EQ(0.0, result.GetD());
Ian Rogers53b8b092014-03-13 23:45:53 -0700386
387 args[0].d = 1.0;
388 args[1].d = 2.0;
Jeff Hao39b6c242015-05-19 20:30:23 -0700389 result = InvokeWithJValues(soa, receiver_ref.get(), soa.EncodeMethod(method), args);
Ian Rogers647b1a82014-10-10 11:02:11 -0700390 EXPECT_DOUBLE_EQ(3.0, result.GetD());
Ian Rogers53b8b092014-03-13 23:45:53 -0700391
392 args[0].d = 1.0;
393 args[1].d = -2.0;
Jeff Hao39b6c242015-05-19 20:30:23 -0700394 result = InvokeWithJValues(soa, receiver_ref.get(), soa.EncodeMethod(method), args);
Ian Rogers647b1a82014-10-10 11:02:11 -0700395 EXPECT_DOUBLE_EQ(-1.0, result.GetD());
Ian Rogers53b8b092014-03-13 23:45:53 -0700396
397 args[0].d = DBL_MAX;
398 args[1].d = DBL_MIN;
Jeff Hao39b6c242015-05-19 20:30:23 -0700399 result = InvokeWithJValues(soa, receiver_ref.get(), soa.EncodeMethod(method), args);
Ian Rogers647b1a82014-10-10 11:02:11 -0700400 EXPECT_DOUBLE_EQ(1.7976931348623157e308, result.GetD());
Ian Rogers53b8b092014-03-13 23:45:53 -0700401
402 args[0].d = DBL_MAX;
403 args[1].d = DBL_MAX;
Jeff Hao39b6c242015-05-19 20:30:23 -0700404 result = InvokeWithJValues(soa, receiver_ref.get(), soa.EncodeMethod(method), args);
Ian Rogers647b1a82014-10-10 11:02:11 -0700405 EXPECT_DOUBLE_EQ(INFINITY, result.GetD());
Ian Rogers53b8b092014-03-13 23:45:53 -0700406 }
407
408 void InvokeSumDoubleDoubleDoubleMethod(bool is_static) {
409 ScopedObjectAccess soa(env_);
Mathieu Chartiere401d142015-04-22 13:56:20 -0700410 ArtMethod* method;
Ian Rogers53b8b092014-03-13 23:45:53 -0700411 mirror::Object* receiver;
412 ReflectionTestMakeExecutable(&method, &receiver, is_static, "sum", "(DDD)D");
Jeff Hao39b6c242015-05-19 20:30:23 -0700413 ScopedLocalRef<jobject> receiver_ref(soa.Env(), soa.AddLocalReference<jobject>(receiver));
Ian Rogers53b8b092014-03-13 23:45:53 -0700414 jvalue args[3];
415
416 args[0].d = 0.0;
417 args[1].d = 0.0;
418 args[2].d = 0.0;
Jeff Hao39b6c242015-05-19 20:30:23 -0700419 JValue result = InvokeWithJValues(soa, receiver_ref.get(), soa.EncodeMethod(method), args);
Ian Rogers647b1a82014-10-10 11:02:11 -0700420 EXPECT_DOUBLE_EQ(0.0, result.GetD());
Ian Rogers53b8b092014-03-13 23:45:53 -0700421
422 args[0].d = 1.0;
423 args[1].d = 2.0;
424 args[2].d = 3.0;
Jeff Hao39b6c242015-05-19 20:30:23 -0700425 result = InvokeWithJValues(soa, receiver_ref.get(), soa.EncodeMethod(method), args);
Ian Rogers647b1a82014-10-10 11:02:11 -0700426 EXPECT_DOUBLE_EQ(6.0, result.GetD());
Ian Rogers53b8b092014-03-13 23:45:53 -0700427
428 args[0].d = 1.0;
429 args[1].d = -2.0;
430 args[2].d = 3.0;
Jeff Hao39b6c242015-05-19 20:30:23 -0700431 result = InvokeWithJValues(soa, receiver_ref.get(), soa.EncodeMethod(method), args);
Ian Rogers647b1a82014-10-10 11:02:11 -0700432 EXPECT_DOUBLE_EQ(2.0, result.GetD());
Ian Rogers53b8b092014-03-13 23:45:53 -0700433 }
434
435 void InvokeSumDoubleDoubleDoubleDoubleMethod(bool is_static) {
436 ScopedObjectAccess soa(env_);
Mathieu Chartiere401d142015-04-22 13:56:20 -0700437 ArtMethod* method;
Ian Rogers53b8b092014-03-13 23:45:53 -0700438 mirror::Object* receiver;
439 ReflectionTestMakeExecutable(&method, &receiver, is_static, "sum", "(DDDD)D");
Jeff Hao39b6c242015-05-19 20:30:23 -0700440 ScopedLocalRef<jobject> receiver_ref(soa.Env(), soa.AddLocalReference<jobject>(receiver));
Ian Rogers53b8b092014-03-13 23:45:53 -0700441 jvalue args[4];
442
443 args[0].d = 0.0;
444 args[1].d = 0.0;
445 args[2].d = 0.0;
446 args[3].d = 0.0;
Jeff Hao39b6c242015-05-19 20:30:23 -0700447 JValue result = InvokeWithJValues(soa, receiver_ref.get(), soa.EncodeMethod(method), args);
Ian Rogers647b1a82014-10-10 11:02:11 -0700448 EXPECT_DOUBLE_EQ(0.0, result.GetD());
Ian Rogers53b8b092014-03-13 23:45:53 -0700449
450 args[0].d = 1.0;
451 args[1].d = 2.0;
452 args[2].d = 3.0;
453 args[3].d = 4.0;
Jeff Hao39b6c242015-05-19 20:30:23 -0700454 result = InvokeWithJValues(soa, receiver_ref.get(), soa.EncodeMethod(method), args);
Ian Rogers647b1a82014-10-10 11:02:11 -0700455 EXPECT_DOUBLE_EQ(10.0, result.GetD());
Ian Rogers53b8b092014-03-13 23:45:53 -0700456
457 args[0].d = 1.0;
458 args[1].d = -2.0;
459 args[2].d = 3.0;
460 args[3].d = -4.0;
Jeff Hao39b6c242015-05-19 20:30:23 -0700461 result = InvokeWithJValues(soa, receiver_ref.get(), soa.EncodeMethod(method), args);
Ian Rogers647b1a82014-10-10 11:02:11 -0700462 EXPECT_DOUBLE_EQ(-2.0, result.GetD());
Ian Rogers53b8b092014-03-13 23:45:53 -0700463 }
464
465 void InvokeSumDoubleDoubleDoubleDoubleDoubleMethod(bool is_static) {
466 ScopedObjectAccess soa(env_);
Mathieu Chartiere401d142015-04-22 13:56:20 -0700467 ArtMethod* method;
Ian Rogers53b8b092014-03-13 23:45:53 -0700468 mirror::Object* receiver;
469 ReflectionTestMakeExecutable(&method, &receiver, is_static, "sum", "(DDDDD)D");
Jeff Hao39b6c242015-05-19 20:30:23 -0700470 ScopedLocalRef<jobject> receiver_ref(soa.Env(), soa.AddLocalReference<jobject>(receiver));
Ian Rogers53b8b092014-03-13 23:45:53 -0700471 jvalue args[5];
472
473 args[0].d = 0.0;
474 args[1].d = 0.0;
475 args[2].d = 0.0;
476 args[3].d = 0.0;
477 args[4].d = 0.0;
Jeff Hao39b6c242015-05-19 20:30:23 -0700478 JValue result = InvokeWithJValues(soa, receiver_ref.get(), soa.EncodeMethod(method), args);
Ian Rogers647b1a82014-10-10 11:02:11 -0700479 EXPECT_DOUBLE_EQ(0.0, result.GetD());
Ian Rogers53b8b092014-03-13 23:45:53 -0700480
481 args[0].d = 1.0;
482 args[1].d = 2.0;
483 args[2].d = 3.0;
484 args[3].d = 4.0;
485 args[4].d = 5.0;
Jeff Hao39b6c242015-05-19 20:30:23 -0700486 result = InvokeWithJValues(soa, receiver_ref.get(), soa.EncodeMethod(method), args);
Ian Rogers647b1a82014-10-10 11:02:11 -0700487 EXPECT_DOUBLE_EQ(15.0, result.GetD());
Ian Rogers53b8b092014-03-13 23:45:53 -0700488
489 args[0].d = 1.0;
490 args[1].d = -2.0;
491 args[2].d = 3.0;
492 args[3].d = -4.0;
493 args[4].d = 5.0;
Jeff Hao39b6c242015-05-19 20:30:23 -0700494 result = InvokeWithJValues(soa, receiver_ref.get(), soa.EncodeMethod(method), args);
Ian Rogers647b1a82014-10-10 11:02:11 -0700495 EXPECT_DOUBLE_EQ(3.0, result.GetD());
Ian Rogers53b8b092014-03-13 23:45:53 -0700496 }
497
498 JavaVMExt* vm_;
499 JNIEnv* env_;
500 jclass aioobe_;
501 jclass ase_;
502 jclass sioobe_;
503};
504
505TEST_F(ReflectionTest, StaticMainMethod) {
Roland Levillain0d5a2812015-11-13 10:07:31 +0000506 TEST_DISABLED_FOR_READ_BARRIER_WITH_OPTIMIZING_FOR_UNSUPPORTED_INSTRUCTION_SETS();
Ian Rogers53b8b092014-03-13 23:45:53 -0700507 ScopedObjectAccess soa(Thread::Current());
508 jobject jclass_loader = LoadDex("Main");
Mathieu Chartiereb8167a2014-05-07 15:43:14 -0700509 StackHandleScope<1> hs(soa.Self());
510 Handle<mirror::ClassLoader> class_loader(
Mathieu Chartier0795f232016-09-27 18:43:30 -0700511 hs.NewHandle(soa.Decode<mirror::ClassLoader>(jclass_loader)));
Ian Rogers53b8b092014-03-13 23:45:53 -0700512 CompileDirectMethod(class_loader, "Main", "main", "([Ljava/lang/String;)V");
513
514 mirror::Class* klass = class_linker_->FindClass(soa.Self(), "LMain;", class_loader);
Mathieu Chartier2cebb242015-04-21 16:50:40 -0700515 ASSERT_TRUE(klass != nullptr);
Ian Rogers53b8b092014-03-13 23:45:53 -0700516
Andreas Gampe542451c2016-07-26 09:02:02 -0700517 ArtMethod* method = klass->FindDirectMethod("main",
518 "([Ljava/lang/String;)V",
519 kRuntimePointerSize);
Mathieu Chartier2cebb242015-04-21 16:50:40 -0700520 ASSERT_TRUE(method != nullptr);
Ian Rogers53b8b092014-03-13 23:45:53 -0700521
522 // Start runtime.
523 bool started = runtime_->Start();
524 CHECK(started);
525 soa.Self()->TransitionFromSuspendedToRunnable();
526
527 jvalue args[1];
528 args[0].l = nullptr;
529 InvokeWithJValues(soa, nullptr, soa.EncodeMethod(method), args);
530}
531
532TEST_F(ReflectionTest, StaticNopMethod) {
Ian Rogers53b8b092014-03-13 23:45:53 -0700533 InvokeNopMethod(true);
534}
535
536TEST_F(ReflectionTest, NonStaticNopMethod) {
Ian Rogers53b8b092014-03-13 23:45:53 -0700537 InvokeNopMethod(false);
538}
539
540TEST_F(ReflectionTest, StaticIdentityByteMethod) {
Ian Rogers53b8b092014-03-13 23:45:53 -0700541 InvokeIdentityByteMethod(true);
542}
543
544TEST_F(ReflectionTest, NonStaticIdentityByteMethod) {
Ian Rogers53b8b092014-03-13 23:45:53 -0700545 InvokeIdentityByteMethod(false);
546}
547
548TEST_F(ReflectionTest, StaticIdentityIntMethod) {
Ian Rogers53b8b092014-03-13 23:45:53 -0700549 InvokeIdentityIntMethod(true);
550}
551
552TEST_F(ReflectionTest, NonStaticIdentityIntMethod) {
Ian Rogers53b8b092014-03-13 23:45:53 -0700553 InvokeIdentityIntMethod(false);
554}
555
556TEST_F(ReflectionTest, StaticIdentityDoubleMethod) {
Ian Rogers53b8b092014-03-13 23:45:53 -0700557 InvokeIdentityDoubleMethod(true);
558}
559
560TEST_F(ReflectionTest, NonStaticIdentityDoubleMethod) {
Ian Rogers53b8b092014-03-13 23:45:53 -0700561 InvokeIdentityDoubleMethod(false);
562}
563
564TEST_F(ReflectionTest, StaticSumIntIntMethod) {
Ian Rogers53b8b092014-03-13 23:45:53 -0700565 InvokeSumIntIntMethod(true);
566}
567
568TEST_F(ReflectionTest, NonStaticSumIntIntMethod) {
Ian Rogers53b8b092014-03-13 23:45:53 -0700569 InvokeSumIntIntMethod(false);
570}
571
572TEST_F(ReflectionTest, StaticSumIntIntIntMethod) {
Ian Rogers53b8b092014-03-13 23:45:53 -0700573 InvokeSumIntIntIntMethod(true);
574}
575
576TEST_F(ReflectionTest, NonStaticSumIntIntIntMethod) {
Ian Rogers53b8b092014-03-13 23:45:53 -0700577 InvokeSumIntIntIntMethod(false);
578}
579
580TEST_F(ReflectionTest, StaticSumIntIntIntIntMethod) {
Ian Rogers53b8b092014-03-13 23:45:53 -0700581 InvokeSumIntIntIntIntMethod(true);
582}
583
584TEST_F(ReflectionTest, NonStaticSumIntIntIntIntMethod) {
Ian Rogers53b8b092014-03-13 23:45:53 -0700585 InvokeSumIntIntIntIntMethod(false);
586}
587
588TEST_F(ReflectionTest, StaticSumIntIntIntIntIntMethod) {
Ian Rogers53b8b092014-03-13 23:45:53 -0700589 InvokeSumIntIntIntIntIntMethod(true);
590}
591
592TEST_F(ReflectionTest, NonStaticSumIntIntIntIntIntMethod) {
Ian Rogers53b8b092014-03-13 23:45:53 -0700593 InvokeSumIntIntIntIntIntMethod(false);
594}
595
596TEST_F(ReflectionTest, StaticSumDoubleDoubleMethod) {
Ian Rogers53b8b092014-03-13 23:45:53 -0700597 InvokeSumDoubleDoubleMethod(true);
598}
599
600TEST_F(ReflectionTest, NonStaticSumDoubleDoubleMethod) {
Ian Rogers53b8b092014-03-13 23:45:53 -0700601 InvokeSumDoubleDoubleMethod(false);
602}
603
604TEST_F(ReflectionTest, StaticSumDoubleDoubleDoubleMethod) {
Ian Rogers53b8b092014-03-13 23:45:53 -0700605 InvokeSumDoubleDoubleDoubleMethod(true);
606}
607
608TEST_F(ReflectionTest, NonStaticSumDoubleDoubleDoubleMethod) {
Ian Rogers53b8b092014-03-13 23:45:53 -0700609 InvokeSumDoubleDoubleDoubleMethod(false);
610}
611
612TEST_F(ReflectionTest, StaticSumDoubleDoubleDoubleDoubleMethod) {
Ian Rogers53b8b092014-03-13 23:45:53 -0700613 InvokeSumDoubleDoubleDoubleDoubleMethod(true);
614}
615
616TEST_F(ReflectionTest, NonStaticSumDoubleDoubleDoubleDoubleMethod) {
Ian Rogers53b8b092014-03-13 23:45:53 -0700617 InvokeSumDoubleDoubleDoubleDoubleMethod(false);
618}
619
620TEST_F(ReflectionTest, StaticSumDoubleDoubleDoubleDoubleDoubleMethod) {
Ian Rogers53b8b092014-03-13 23:45:53 -0700621 InvokeSumDoubleDoubleDoubleDoubleDoubleMethod(true);
622}
623
624TEST_F(ReflectionTest, NonStaticSumDoubleDoubleDoubleDoubleDoubleMethod) {
Ian Rogers53b8b092014-03-13 23:45:53 -0700625 InvokeSumDoubleDoubleDoubleDoubleDoubleMethod(false);
626}
627
628} // namespace art