blob: 62347203a9c7c8f37c9f48cf1f2011635813c6a2 [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"
Ian Rogers53b8b092014-03-13 23:45:53 -070024#include "common_compiler_test.h"
Ian Rogerse63db272014-07-15 15:36:11 -070025#include "scoped_thread_state_change.h"
Ian Rogers53b8b092014-03-13 23:45:53 -070026
27namespace art {
28
29// TODO: Convert to CommonRuntimeTest. Currently MakeExecutable is used.
30class ReflectionTest : public CommonCompilerTest {
31 protected:
32 virtual void SetUp() {
33 CommonCompilerTest::SetUp();
34
35 vm_ = Runtime::Current()->GetJavaVM();
36
37 // Turn on -verbose:jni for the JNI tests.
38 // gLogVerbosity.jni = true;
39
Mathieu Chartier2cebb242015-04-21 16:50:40 -070040 vm_->AttachCurrentThread(&env_, nullptr);
Ian Rogers53b8b092014-03-13 23:45:53 -070041
42 ScopedLocalRef<jclass> aioobe(env_,
43 env_->FindClass("java/lang/ArrayIndexOutOfBoundsException"));
Mathieu Chartier2cebb242015-04-21 16:50:40 -070044 CHECK(aioobe.get() != nullptr);
Ian Rogers53b8b092014-03-13 23:45:53 -070045 aioobe_ = reinterpret_cast<jclass>(env_->NewGlobalRef(aioobe.get()));
46
47 ScopedLocalRef<jclass> ase(env_, env_->FindClass("java/lang/ArrayStoreException"));
Mathieu Chartier2cebb242015-04-21 16:50:40 -070048 CHECK(ase.get() != nullptr);
Ian Rogers53b8b092014-03-13 23:45:53 -070049 ase_ = reinterpret_cast<jclass>(env_->NewGlobalRef(ase.get()));
50
51 ScopedLocalRef<jclass> sioobe(env_,
52 env_->FindClass("java/lang/StringIndexOutOfBoundsException"));
Mathieu Chartier2cebb242015-04-21 16:50:40 -070053 CHECK(sioobe.get() != nullptr);
Ian Rogers53b8b092014-03-13 23:45:53 -070054 sioobe_ = reinterpret_cast<jclass>(env_->NewGlobalRef(sioobe.get()));
55 }
56
57 void CleanUpJniEnv() {
Mathieu Chartier2cebb242015-04-21 16:50:40 -070058 if (aioobe_ != nullptr) {
Ian Rogers53b8b092014-03-13 23:45:53 -070059 env_->DeleteGlobalRef(aioobe_);
Mathieu Chartier2cebb242015-04-21 16:50:40 -070060 aioobe_ = nullptr;
Ian Rogers53b8b092014-03-13 23:45:53 -070061 }
Mathieu Chartier2cebb242015-04-21 16:50:40 -070062 if (ase_ != nullptr) {
Ian Rogers53b8b092014-03-13 23:45:53 -070063 env_->DeleteGlobalRef(ase_);
Mathieu Chartier2cebb242015-04-21 16:50:40 -070064 ase_ = nullptr;
Ian Rogers53b8b092014-03-13 23:45:53 -070065 }
Mathieu Chartier2cebb242015-04-21 16:50:40 -070066 if (sioobe_ != nullptr) {
Ian Rogers53b8b092014-03-13 23:45:53 -070067 env_->DeleteGlobalRef(sioobe_);
Mathieu Chartier2cebb242015-04-21 16:50:40 -070068 sioobe_ = nullptr;
Ian Rogers53b8b092014-03-13 23:45:53 -070069 }
70 }
71
72 virtual void TearDown() {
73 CleanUpJniEnv();
74 CommonCompilerTest::TearDown();
75 }
76
77 jclass GetPrimitiveClass(char descriptor) {
78 ScopedObjectAccess soa(env_);
79 mirror::Class* c = class_linker_->FindPrimitiveClass(descriptor);
80 CHECK(c != nullptr);
81 return soa.AddLocalReference<jclass>(c);
82 }
83
Mathieu Chartiere401d142015-04-22 13:56:20 -070084 void ReflectionTestMakeExecutable(ArtMethod** method,
Ian Rogers53b8b092014-03-13 23:45:53 -070085 mirror::Object** receiver,
86 bool is_static, const char* method_name,
87 const char* method_signature)
Mathieu Chartier90443472015-07-16 20:32:27 -070088 SHARED_REQUIRES(Locks::mutator_lock_) {
Ian Rogers53b8b092014-03-13 23:45:53 -070089 const char* class_name = is_static ? "StaticLeafMethods" : "NonStaticLeafMethods";
90 jobject jclass_loader(LoadDex(class_name));
91 Thread* self = Thread::Current();
Mathieu Chartiereb8167a2014-05-07 15:43:14 -070092 StackHandleScope<2> hs(self);
93 Handle<mirror::ClassLoader> class_loader(
94 hs.NewHandle(
95 ScopedObjectAccessUnchecked(self).Decode<mirror::ClassLoader*>(jclass_loader)));
Ian Rogers53b8b092014-03-13 23:45:53 -070096 if (is_static) {
97 MakeExecutable(ScopedObjectAccessUnchecked(self).Decode<mirror::ClassLoader*>(jclass_loader),
98 class_name);
99 } else {
100 MakeExecutable(nullptr, "java.lang.Class");
101 MakeExecutable(nullptr, "java.lang.Object");
102 MakeExecutable(ScopedObjectAccessUnchecked(self).Decode<mirror::ClassLoader*>(jclass_loader),
103 class_name);
104 }
105
106 mirror::Class* c = class_linker_->FindClass(self, DotToDescriptor(class_name).c_str(),
107 class_loader);
Mathieu Chartier2cebb242015-04-21 16:50:40 -0700108 CHECK(c != nullptr);
Ian Rogers53b8b092014-03-13 23:45:53 -0700109
Mathieu Chartiere401d142015-04-22 13:56:20 -0700110 *method = is_static ? c->FindDirectMethod(method_name, method_signature, sizeof(void*))
111 : c->FindVirtualMethod(method_name, method_signature, sizeof(void*));
Ian Rogers53b8b092014-03-13 23:45:53 -0700112 CHECK(method != nullptr);
113
Sebastien Hertz4e99b3d2014-06-24 14:35:40 +0200114 if (is_static) {
115 *receiver = nullptr;
116 } else {
117 // Ensure class is initialized before allocating object
Andreas Gampe277ccbd2014-11-03 21:36:10 -0800118 StackHandleScope<1> hs2(self);
119 Handle<mirror::Class> h_class(hs2.NewHandle(c));
Ian Rogers7b078e82014-09-10 14:44:24 -0700120 bool initialized = class_linker_->EnsureInitialized(self, h_class, true, true);
Sebastien Hertz4e99b3d2014-06-24 14:35:40 +0200121 CHECK(initialized);
122 *receiver = c->AllocObject(self);
123 }
Ian Rogers53b8b092014-03-13 23:45:53 -0700124
125 // Start runtime.
126 bool started = runtime_->Start();
127 CHECK(started);
128 self->TransitionFromSuspendedToRunnable();
129 }
130
131 void InvokeNopMethod(bool is_static) {
132 ScopedObjectAccess soa(env_);
Mathieu Chartiere401d142015-04-22 13:56:20 -0700133 ArtMethod* method;
Ian Rogers53b8b092014-03-13 23:45:53 -0700134 mirror::Object* receiver;
135 ReflectionTestMakeExecutable(&method, &receiver, is_static, "nop", "()V");
Jeff Hao39b6c242015-05-19 20:30:23 -0700136 ScopedLocalRef<jobject> receiver_ref(soa.Env(), soa.AddLocalReference<jobject>(receiver));
137 InvokeWithJValues(soa, receiver_ref.get(), soa.EncodeMethod(method), nullptr);
Ian Rogers53b8b092014-03-13 23:45:53 -0700138 }
139
140 void InvokeIdentityByteMethod(bool is_static) {
141 ScopedObjectAccess soa(env_);
Mathieu Chartiere401d142015-04-22 13:56:20 -0700142 ArtMethod* method;
Ian Rogers53b8b092014-03-13 23:45:53 -0700143 mirror::Object* receiver;
144 ReflectionTestMakeExecutable(&method, &receiver, is_static, "identity", "(B)B");
Jeff Hao39b6c242015-05-19 20:30:23 -0700145 ScopedLocalRef<jobject> receiver_ref(soa.Env(), soa.AddLocalReference<jobject>(receiver));
Ian Rogers53b8b092014-03-13 23:45:53 -0700146 jvalue args[1];
147
148 args[0].b = 0;
Jeff Hao39b6c242015-05-19 20:30:23 -0700149 JValue result = InvokeWithJValues(soa, receiver_ref.get(), soa.EncodeMethod(method), args);
Ian Rogers53b8b092014-03-13 23:45:53 -0700150 EXPECT_EQ(0, result.GetB());
151
152 args[0].b = -1;
Jeff Hao39b6c242015-05-19 20:30:23 -0700153 result = InvokeWithJValues(soa, receiver_ref.get(), soa.EncodeMethod(method), args);
Ian Rogers53b8b092014-03-13 23:45:53 -0700154 EXPECT_EQ(-1, result.GetB());
155
156 args[0].b = SCHAR_MAX;
Jeff Hao39b6c242015-05-19 20:30:23 -0700157 result = InvokeWithJValues(soa, receiver_ref.get(), soa.EncodeMethod(method), args);
Ian Rogers53b8b092014-03-13 23:45:53 -0700158 EXPECT_EQ(SCHAR_MAX, result.GetB());
159
Andreas Gampe58554b72015-10-20 21:08:52 -0700160 static_assert(SCHAR_MIN == -128, "SCHAR_MIN unexpected");
161 args[0].b = SCHAR_MIN;
Jeff Hao39b6c242015-05-19 20:30:23 -0700162 result = InvokeWithJValues(soa, receiver_ref.get(), soa.EncodeMethod(method), args);
Ian Rogers53b8b092014-03-13 23:45:53 -0700163 EXPECT_EQ(SCHAR_MIN, result.GetB());
164 }
165
166 void InvokeIdentityIntMethod(bool is_static) {
167 ScopedObjectAccess soa(env_);
Mathieu Chartiere401d142015-04-22 13:56:20 -0700168 ArtMethod* method;
Ian Rogers53b8b092014-03-13 23:45:53 -0700169 mirror::Object* receiver;
170 ReflectionTestMakeExecutable(&method, &receiver, is_static, "identity", "(I)I");
Jeff Hao39b6c242015-05-19 20:30:23 -0700171 ScopedLocalRef<jobject> receiver_ref(soa.Env(), soa.AddLocalReference<jobject>(receiver));
Ian Rogers53b8b092014-03-13 23:45:53 -0700172 jvalue args[1];
173
174 args[0].i = 0;
Jeff Hao39b6c242015-05-19 20:30:23 -0700175 JValue result = InvokeWithJValues(soa, receiver_ref.get(), soa.EncodeMethod(method), args);
Ian Rogers53b8b092014-03-13 23:45:53 -0700176 EXPECT_EQ(0, result.GetI());
177
178 args[0].i = -1;
Jeff Hao39b6c242015-05-19 20:30:23 -0700179 result = InvokeWithJValues(soa, receiver_ref.get(), soa.EncodeMethod(method), args);
Ian Rogers53b8b092014-03-13 23:45:53 -0700180 EXPECT_EQ(-1, result.GetI());
181
182 args[0].i = INT_MAX;
Jeff Hao39b6c242015-05-19 20:30:23 -0700183 result = InvokeWithJValues(soa, receiver_ref.get(), soa.EncodeMethod(method), args);
Ian Rogers53b8b092014-03-13 23:45:53 -0700184 EXPECT_EQ(INT_MAX, result.GetI());
185
186 args[0].i = INT_MIN;
Jeff Hao39b6c242015-05-19 20:30:23 -0700187 result = InvokeWithJValues(soa, receiver_ref.get(), soa.EncodeMethod(method), args);
Ian Rogers53b8b092014-03-13 23:45:53 -0700188 EXPECT_EQ(INT_MIN, result.GetI());
189 }
190
191 void InvokeIdentityDoubleMethod(bool is_static) {
192 ScopedObjectAccess soa(env_);
Mathieu Chartiere401d142015-04-22 13:56:20 -0700193 ArtMethod* method;
Ian Rogers53b8b092014-03-13 23:45:53 -0700194 mirror::Object* receiver;
195 ReflectionTestMakeExecutable(&method, &receiver, is_static, "identity", "(D)D");
Jeff Hao39b6c242015-05-19 20:30:23 -0700196 ScopedLocalRef<jobject> receiver_ref(soa.Env(), soa.AddLocalReference<jobject>(receiver));
Ian Rogers53b8b092014-03-13 23:45:53 -0700197 jvalue args[1];
198
199 args[0].d = 0.0;
Jeff Hao39b6c242015-05-19 20:30:23 -0700200 JValue result = InvokeWithJValues(soa, receiver_ref.get(), soa.EncodeMethod(method), args);
Ian Rogers647b1a82014-10-10 11:02:11 -0700201 EXPECT_DOUBLE_EQ(0.0, result.GetD());
Ian Rogers53b8b092014-03-13 23:45:53 -0700202
203 args[0].d = -1.0;
Jeff Hao39b6c242015-05-19 20:30:23 -0700204 result = InvokeWithJValues(soa, receiver_ref.get(), soa.EncodeMethod(method), args);
Ian Rogers647b1a82014-10-10 11:02:11 -0700205 EXPECT_DOUBLE_EQ(-1.0, result.GetD());
Ian Rogers53b8b092014-03-13 23:45:53 -0700206
207 args[0].d = DBL_MAX;
Jeff Hao39b6c242015-05-19 20:30:23 -0700208 result = InvokeWithJValues(soa, receiver_ref.get(), soa.EncodeMethod(method), args);
Ian Rogers647b1a82014-10-10 11:02:11 -0700209 EXPECT_DOUBLE_EQ(DBL_MAX, result.GetD());
Ian Rogers53b8b092014-03-13 23:45:53 -0700210
211 args[0].d = DBL_MIN;
Jeff Hao39b6c242015-05-19 20:30:23 -0700212 result = InvokeWithJValues(soa, receiver_ref.get(), soa.EncodeMethod(method), args);
Ian Rogers647b1a82014-10-10 11:02:11 -0700213 EXPECT_DOUBLE_EQ(DBL_MIN, result.GetD());
Ian Rogers53b8b092014-03-13 23:45:53 -0700214 }
215
216 void InvokeSumIntIntMethod(bool is_static) {
217 ScopedObjectAccess soa(env_);
Mathieu Chartiere401d142015-04-22 13:56:20 -0700218 ArtMethod* method;
Ian Rogers53b8b092014-03-13 23:45:53 -0700219 mirror::Object* receiver;
220 ReflectionTestMakeExecutable(&method, &receiver, is_static, "sum", "(II)I");
Jeff Hao39b6c242015-05-19 20:30:23 -0700221 ScopedLocalRef<jobject> receiver_ref(soa.Env(), soa.AddLocalReference<jobject>(receiver));
Ian Rogers53b8b092014-03-13 23:45:53 -0700222 jvalue args[2];
223
224 args[0].i = 1;
225 args[1].i = 2;
Jeff Hao39b6c242015-05-19 20:30:23 -0700226 JValue result = InvokeWithJValues(soa, receiver_ref.get(), soa.EncodeMethod(method), args);
Ian Rogers53b8b092014-03-13 23:45:53 -0700227 EXPECT_EQ(3, result.GetI());
228
229 args[0].i = -2;
230 args[1].i = 5;
Jeff Hao39b6c242015-05-19 20:30:23 -0700231 result = InvokeWithJValues(soa, receiver_ref.get(), soa.EncodeMethod(method), args);
Ian Rogers53b8b092014-03-13 23:45:53 -0700232 EXPECT_EQ(3, result.GetI());
233
234 args[0].i = INT_MAX;
235 args[1].i = INT_MIN;
Jeff Hao39b6c242015-05-19 20:30:23 -0700236 result = InvokeWithJValues(soa, receiver_ref.get(), soa.EncodeMethod(method), args);
Ian Rogers53b8b092014-03-13 23:45:53 -0700237 EXPECT_EQ(-1, result.GetI());
238
239 args[0].i = INT_MAX;
240 args[1].i = INT_MAX;
Jeff Hao39b6c242015-05-19 20:30:23 -0700241 result = InvokeWithJValues(soa, receiver_ref.get(), soa.EncodeMethod(method), args);
Ian Rogers53b8b092014-03-13 23:45:53 -0700242 EXPECT_EQ(-2, result.GetI());
243 }
244
245 void InvokeSumIntIntIntMethod(bool is_static) {
246 ScopedObjectAccess soa(env_);
Mathieu Chartiere401d142015-04-22 13:56:20 -0700247 ArtMethod* method;
Ian Rogers53b8b092014-03-13 23:45:53 -0700248 mirror::Object* receiver;
249 ReflectionTestMakeExecutable(&method, &receiver, is_static, "sum", "(III)I");
Jeff Hao39b6c242015-05-19 20:30:23 -0700250 ScopedLocalRef<jobject> receiver_ref(soa.Env(), soa.AddLocalReference<jobject>(receiver));
Ian Rogers53b8b092014-03-13 23:45:53 -0700251 jvalue args[3];
252
253 args[0].i = 0;
254 args[1].i = 0;
255 args[2].i = 0;
Jeff Hao39b6c242015-05-19 20:30:23 -0700256 JValue result = InvokeWithJValues(soa, receiver_ref.get(), soa.EncodeMethod(method), args);
Ian Rogers53b8b092014-03-13 23:45:53 -0700257 EXPECT_EQ(0, result.GetI());
258
259 args[0].i = 1;
260 args[1].i = 2;
261 args[2].i = 3;
Jeff Hao39b6c242015-05-19 20:30:23 -0700262 result = InvokeWithJValues(soa, receiver_ref.get(), soa.EncodeMethod(method), args);
Ian Rogers53b8b092014-03-13 23:45:53 -0700263 EXPECT_EQ(6, result.GetI());
264
265 args[0].i = -1;
266 args[1].i = 2;
267 args[2].i = -3;
Jeff Hao39b6c242015-05-19 20:30:23 -0700268 result = InvokeWithJValues(soa, receiver_ref.get(), soa.EncodeMethod(method), args);
Ian Rogers53b8b092014-03-13 23:45:53 -0700269 EXPECT_EQ(-2, result.GetI());
270
271 args[0].i = INT_MAX;
272 args[1].i = INT_MIN;
273 args[2].i = INT_MAX;
Jeff Hao39b6c242015-05-19 20:30:23 -0700274 result = InvokeWithJValues(soa, receiver_ref.get(), soa.EncodeMethod(method), args);
Ian Rogers53b8b092014-03-13 23:45:53 -0700275 EXPECT_EQ(2147483646, result.GetI());
276
277 args[0].i = INT_MAX;
278 args[1].i = INT_MAX;
279 args[2].i = INT_MAX;
Jeff Hao39b6c242015-05-19 20:30:23 -0700280 result = InvokeWithJValues(soa, receiver_ref.get(), soa.EncodeMethod(method), args);
Ian Rogers53b8b092014-03-13 23:45:53 -0700281 EXPECT_EQ(2147483645, result.GetI());
282 }
283
284 void InvokeSumIntIntIntIntMethod(bool is_static) {
285 ScopedObjectAccess soa(env_);
Mathieu Chartiere401d142015-04-22 13:56:20 -0700286 ArtMethod* method;
Ian Rogers53b8b092014-03-13 23:45:53 -0700287 mirror::Object* receiver;
288 ReflectionTestMakeExecutable(&method, &receiver, is_static, "sum", "(IIII)I");
Jeff Hao39b6c242015-05-19 20:30:23 -0700289 ScopedLocalRef<jobject> receiver_ref(soa.Env(), soa.AddLocalReference<jobject>(receiver));
Ian Rogers53b8b092014-03-13 23:45:53 -0700290 jvalue args[4];
291
292 args[0].i = 0;
293 args[1].i = 0;
294 args[2].i = 0;
295 args[3].i = 0;
Jeff Hao39b6c242015-05-19 20:30:23 -0700296 JValue result = InvokeWithJValues(soa, receiver_ref.get(), soa.EncodeMethod(method), args);
Ian Rogers53b8b092014-03-13 23:45:53 -0700297 EXPECT_EQ(0, result.GetI());
298
299 args[0].i = 1;
300 args[1].i = 2;
301 args[2].i = 3;
302 args[3].i = 4;
Jeff Hao39b6c242015-05-19 20:30:23 -0700303 result = InvokeWithJValues(soa, receiver_ref.get(), soa.EncodeMethod(method), args);
Ian Rogers53b8b092014-03-13 23:45:53 -0700304 EXPECT_EQ(10, result.GetI());
305
306 args[0].i = -1;
307 args[1].i = 2;
308 args[2].i = -3;
309 args[3].i = 4;
Jeff Hao39b6c242015-05-19 20:30:23 -0700310 result = InvokeWithJValues(soa, receiver_ref.get(), soa.EncodeMethod(method), args);
Ian Rogers53b8b092014-03-13 23:45:53 -0700311 EXPECT_EQ(2, result.GetI());
312
313 args[0].i = INT_MAX;
314 args[1].i = INT_MIN;
315 args[2].i = INT_MAX;
316 args[3].i = INT_MIN;
Jeff Hao39b6c242015-05-19 20:30:23 -0700317 result = InvokeWithJValues(soa, receiver_ref.get(), soa.EncodeMethod(method), args);
Ian Rogers53b8b092014-03-13 23:45:53 -0700318 EXPECT_EQ(-2, result.GetI());
319
320 args[0].i = INT_MAX;
321 args[1].i = INT_MAX;
322 args[2].i = INT_MAX;
323 args[3].i = INT_MAX;
Jeff Hao39b6c242015-05-19 20:30:23 -0700324 result = InvokeWithJValues(soa, receiver_ref.get(), soa.EncodeMethod(method), args);
Ian Rogers53b8b092014-03-13 23:45:53 -0700325 EXPECT_EQ(-4, result.GetI());
326 }
327
328 void InvokeSumIntIntIntIntIntMethod(bool is_static) {
329 ScopedObjectAccess soa(env_);
Mathieu Chartiere401d142015-04-22 13:56:20 -0700330 ArtMethod* method;
Ian Rogers53b8b092014-03-13 23:45:53 -0700331 mirror::Object* receiver;
332 ReflectionTestMakeExecutable(&method, &receiver, is_static, "sum", "(IIIII)I");
Jeff Hao39b6c242015-05-19 20:30:23 -0700333 ScopedLocalRef<jobject> receiver_ref(soa.Env(), soa.AddLocalReference<jobject>(receiver));
Ian Rogers53b8b092014-03-13 23:45:53 -0700334 jvalue args[5];
335
336 args[0].i = 0;
337 args[1].i = 0;
338 args[2].i = 0;
339 args[3].i = 0;
340 args[4].i = 0;
Jeff Hao39b6c242015-05-19 20:30:23 -0700341 JValue result = InvokeWithJValues(soa, receiver_ref.get(), soa.EncodeMethod(method), args);
Ian Rogers53b8b092014-03-13 23:45:53 -0700342 EXPECT_EQ(0, result.GetI());
343
344 args[0].i = 1;
345 args[1].i = 2;
346 args[2].i = 3;
347 args[3].i = 4;
348 args[4].i = 5;
Jeff Hao39b6c242015-05-19 20:30:23 -0700349 result = InvokeWithJValues(soa, receiver_ref.get(), soa.EncodeMethod(method), args);
Ian Rogers53b8b092014-03-13 23:45:53 -0700350 EXPECT_EQ(15, result.GetI());
351
352 args[0].i = -1;
353 args[1].i = 2;
354 args[2].i = -3;
355 args[3].i = 4;
356 args[4].i = -5;
Jeff Hao39b6c242015-05-19 20:30:23 -0700357 result = InvokeWithJValues(soa, receiver_ref.get(), soa.EncodeMethod(method), args);
Ian Rogers53b8b092014-03-13 23:45:53 -0700358 EXPECT_EQ(-3, result.GetI());
359
360 args[0].i = INT_MAX;
361 args[1].i = INT_MIN;
362 args[2].i = INT_MAX;
363 args[3].i = INT_MIN;
364 args[4].i = INT_MAX;
Jeff Hao39b6c242015-05-19 20:30:23 -0700365 result = InvokeWithJValues(soa, receiver_ref.get(), soa.EncodeMethod(method), args);
Ian Rogers53b8b092014-03-13 23:45:53 -0700366 EXPECT_EQ(2147483645, result.GetI());
367
368 args[0].i = INT_MAX;
369 args[1].i = INT_MAX;
370 args[2].i = INT_MAX;
371 args[3].i = INT_MAX;
372 args[4].i = INT_MAX;
Jeff Hao39b6c242015-05-19 20:30:23 -0700373 result = InvokeWithJValues(soa, receiver_ref.get(), soa.EncodeMethod(method), args);
Ian Rogers53b8b092014-03-13 23:45:53 -0700374 EXPECT_EQ(2147483643, result.GetI());
375 }
376
377 void InvokeSumDoubleDoubleMethod(bool is_static) {
378 ScopedObjectAccess soa(env_);
Mathieu Chartiere401d142015-04-22 13:56:20 -0700379 ArtMethod* method;
Ian Rogers53b8b092014-03-13 23:45:53 -0700380 mirror::Object* receiver;
381 ReflectionTestMakeExecutable(&method, &receiver, is_static, "sum", "(DD)D");
Jeff Hao39b6c242015-05-19 20:30:23 -0700382 ScopedLocalRef<jobject> receiver_ref(soa.Env(), soa.AddLocalReference<jobject>(receiver));
Ian Rogers53b8b092014-03-13 23:45:53 -0700383 jvalue args[2];
384
385 args[0].d = 0.0;
386 args[1].d = 0.0;
Jeff Hao39b6c242015-05-19 20:30:23 -0700387 JValue result = InvokeWithJValues(soa, receiver_ref.get(), soa.EncodeMethod(method), args);
Ian Rogers647b1a82014-10-10 11:02:11 -0700388 EXPECT_DOUBLE_EQ(0.0, result.GetD());
Ian Rogers53b8b092014-03-13 23:45:53 -0700389
390 args[0].d = 1.0;
391 args[1].d = 2.0;
Jeff Hao39b6c242015-05-19 20:30:23 -0700392 result = InvokeWithJValues(soa, receiver_ref.get(), soa.EncodeMethod(method), args);
Ian Rogers647b1a82014-10-10 11:02:11 -0700393 EXPECT_DOUBLE_EQ(3.0, result.GetD());
Ian Rogers53b8b092014-03-13 23:45:53 -0700394
395 args[0].d = 1.0;
396 args[1].d = -2.0;
Jeff Hao39b6c242015-05-19 20:30:23 -0700397 result = InvokeWithJValues(soa, receiver_ref.get(), soa.EncodeMethod(method), args);
Ian Rogers647b1a82014-10-10 11:02:11 -0700398 EXPECT_DOUBLE_EQ(-1.0, result.GetD());
Ian Rogers53b8b092014-03-13 23:45:53 -0700399
400 args[0].d = DBL_MAX;
401 args[1].d = DBL_MIN;
Jeff Hao39b6c242015-05-19 20:30:23 -0700402 result = InvokeWithJValues(soa, receiver_ref.get(), soa.EncodeMethod(method), args);
Ian Rogers647b1a82014-10-10 11:02:11 -0700403 EXPECT_DOUBLE_EQ(1.7976931348623157e308, result.GetD());
Ian Rogers53b8b092014-03-13 23:45:53 -0700404
405 args[0].d = DBL_MAX;
406 args[1].d = DBL_MAX;
Jeff Hao39b6c242015-05-19 20:30:23 -0700407 result = InvokeWithJValues(soa, receiver_ref.get(), soa.EncodeMethod(method), args);
Ian Rogers647b1a82014-10-10 11:02:11 -0700408 EXPECT_DOUBLE_EQ(INFINITY, result.GetD());
Ian Rogers53b8b092014-03-13 23:45:53 -0700409 }
410
411 void InvokeSumDoubleDoubleDoubleMethod(bool is_static) {
412 ScopedObjectAccess soa(env_);
Mathieu Chartiere401d142015-04-22 13:56:20 -0700413 ArtMethod* method;
Ian Rogers53b8b092014-03-13 23:45:53 -0700414 mirror::Object* receiver;
415 ReflectionTestMakeExecutable(&method, &receiver, is_static, "sum", "(DDD)D");
Jeff Hao39b6c242015-05-19 20:30:23 -0700416 ScopedLocalRef<jobject> receiver_ref(soa.Env(), soa.AddLocalReference<jobject>(receiver));
Ian Rogers53b8b092014-03-13 23:45:53 -0700417 jvalue args[3];
418
419 args[0].d = 0.0;
420 args[1].d = 0.0;
421 args[2].d = 0.0;
Jeff Hao39b6c242015-05-19 20:30:23 -0700422 JValue result = InvokeWithJValues(soa, receiver_ref.get(), soa.EncodeMethod(method), args);
Ian Rogers647b1a82014-10-10 11:02:11 -0700423 EXPECT_DOUBLE_EQ(0.0, result.GetD());
Ian Rogers53b8b092014-03-13 23:45:53 -0700424
425 args[0].d = 1.0;
426 args[1].d = 2.0;
427 args[2].d = 3.0;
Jeff Hao39b6c242015-05-19 20:30:23 -0700428 result = InvokeWithJValues(soa, receiver_ref.get(), soa.EncodeMethod(method), args);
Ian Rogers647b1a82014-10-10 11:02:11 -0700429 EXPECT_DOUBLE_EQ(6.0, result.GetD());
Ian Rogers53b8b092014-03-13 23:45:53 -0700430
431 args[0].d = 1.0;
432 args[1].d = -2.0;
433 args[2].d = 3.0;
Jeff Hao39b6c242015-05-19 20:30:23 -0700434 result = InvokeWithJValues(soa, receiver_ref.get(), soa.EncodeMethod(method), args);
Ian Rogers647b1a82014-10-10 11:02:11 -0700435 EXPECT_DOUBLE_EQ(2.0, result.GetD());
Ian Rogers53b8b092014-03-13 23:45:53 -0700436 }
437
438 void InvokeSumDoubleDoubleDoubleDoubleMethod(bool is_static) {
439 ScopedObjectAccess soa(env_);
Mathieu Chartiere401d142015-04-22 13:56:20 -0700440 ArtMethod* method;
Ian Rogers53b8b092014-03-13 23:45:53 -0700441 mirror::Object* receiver;
442 ReflectionTestMakeExecutable(&method, &receiver, is_static, "sum", "(DDDD)D");
Jeff Hao39b6c242015-05-19 20:30:23 -0700443 ScopedLocalRef<jobject> receiver_ref(soa.Env(), soa.AddLocalReference<jobject>(receiver));
Ian Rogers53b8b092014-03-13 23:45:53 -0700444 jvalue args[4];
445
446 args[0].d = 0.0;
447 args[1].d = 0.0;
448 args[2].d = 0.0;
449 args[3].d = 0.0;
Jeff Hao39b6c242015-05-19 20:30:23 -0700450 JValue result = InvokeWithJValues(soa, receiver_ref.get(), soa.EncodeMethod(method), args);
Ian Rogers647b1a82014-10-10 11:02:11 -0700451 EXPECT_DOUBLE_EQ(0.0, result.GetD());
Ian Rogers53b8b092014-03-13 23:45:53 -0700452
453 args[0].d = 1.0;
454 args[1].d = 2.0;
455 args[2].d = 3.0;
456 args[3].d = 4.0;
Jeff Hao39b6c242015-05-19 20:30:23 -0700457 result = InvokeWithJValues(soa, receiver_ref.get(), soa.EncodeMethod(method), args);
Ian Rogers647b1a82014-10-10 11:02:11 -0700458 EXPECT_DOUBLE_EQ(10.0, result.GetD());
Ian Rogers53b8b092014-03-13 23:45:53 -0700459
460 args[0].d = 1.0;
461 args[1].d = -2.0;
462 args[2].d = 3.0;
463 args[3].d = -4.0;
Jeff Hao39b6c242015-05-19 20:30:23 -0700464 result = InvokeWithJValues(soa, receiver_ref.get(), soa.EncodeMethod(method), args);
Ian Rogers647b1a82014-10-10 11:02:11 -0700465 EXPECT_DOUBLE_EQ(-2.0, result.GetD());
Ian Rogers53b8b092014-03-13 23:45:53 -0700466 }
467
468 void InvokeSumDoubleDoubleDoubleDoubleDoubleMethod(bool is_static) {
469 ScopedObjectAccess soa(env_);
Mathieu Chartiere401d142015-04-22 13:56:20 -0700470 ArtMethod* method;
Ian Rogers53b8b092014-03-13 23:45:53 -0700471 mirror::Object* receiver;
472 ReflectionTestMakeExecutable(&method, &receiver, is_static, "sum", "(DDDDD)D");
Jeff Hao39b6c242015-05-19 20:30:23 -0700473 ScopedLocalRef<jobject> receiver_ref(soa.Env(), soa.AddLocalReference<jobject>(receiver));
Ian Rogers53b8b092014-03-13 23:45:53 -0700474 jvalue args[5];
475
476 args[0].d = 0.0;
477 args[1].d = 0.0;
478 args[2].d = 0.0;
479 args[3].d = 0.0;
480 args[4].d = 0.0;
Jeff Hao39b6c242015-05-19 20:30:23 -0700481 JValue result = InvokeWithJValues(soa, receiver_ref.get(), soa.EncodeMethod(method), args);
Ian Rogers647b1a82014-10-10 11:02:11 -0700482 EXPECT_DOUBLE_EQ(0.0, result.GetD());
Ian Rogers53b8b092014-03-13 23:45:53 -0700483
484 args[0].d = 1.0;
485 args[1].d = 2.0;
486 args[2].d = 3.0;
487 args[3].d = 4.0;
488 args[4].d = 5.0;
Jeff Hao39b6c242015-05-19 20:30:23 -0700489 result = InvokeWithJValues(soa, receiver_ref.get(), soa.EncodeMethod(method), args);
Ian Rogers647b1a82014-10-10 11:02:11 -0700490 EXPECT_DOUBLE_EQ(15.0, result.GetD());
Ian Rogers53b8b092014-03-13 23:45:53 -0700491
492 args[0].d = 1.0;
493 args[1].d = -2.0;
494 args[2].d = 3.0;
495 args[3].d = -4.0;
496 args[4].d = 5.0;
Jeff Hao39b6c242015-05-19 20:30:23 -0700497 result = InvokeWithJValues(soa, receiver_ref.get(), soa.EncodeMethod(method), args);
Ian Rogers647b1a82014-10-10 11:02:11 -0700498 EXPECT_DOUBLE_EQ(3.0, result.GetD());
Ian Rogers53b8b092014-03-13 23:45:53 -0700499 }
500
501 JavaVMExt* vm_;
502 JNIEnv* env_;
503 jclass aioobe_;
504 jclass ase_;
505 jclass sioobe_;
506};
507
508TEST_F(ReflectionTest, StaticMainMethod) {
Roland Levillain4d027112015-07-01 15:41:14 +0100509 TEST_DISABLED_FOR_HEAP_REFERENCE_POISONING_WITH_QUICK();
Roland Levillain0d5a2812015-11-13 10:07:31 +0000510 TEST_DISABLED_FOR_READ_BARRIER_WITH_QUICK();
511 TEST_DISABLED_FOR_READ_BARRIER_WITH_OPTIMIZING_FOR_UNSUPPORTED_INSTRUCTION_SETS();
Ian Rogers53b8b092014-03-13 23:45:53 -0700512 ScopedObjectAccess soa(Thread::Current());
513 jobject jclass_loader = LoadDex("Main");
Mathieu Chartiereb8167a2014-05-07 15:43:14 -0700514 StackHandleScope<1> hs(soa.Self());
515 Handle<mirror::ClassLoader> class_loader(
516 hs.NewHandle(soa.Decode<mirror::ClassLoader*>(jclass_loader)));
Ian Rogers53b8b092014-03-13 23:45:53 -0700517 CompileDirectMethod(class_loader, "Main", "main", "([Ljava/lang/String;)V");
518
519 mirror::Class* klass = class_linker_->FindClass(soa.Self(), "LMain;", class_loader);
Mathieu Chartier2cebb242015-04-21 16:50:40 -0700520 ASSERT_TRUE(klass != nullptr);
Ian Rogers53b8b092014-03-13 23:45:53 -0700521
Mathieu Chartiere401d142015-04-22 13:56:20 -0700522 ArtMethod* method = klass->FindDirectMethod("main", "([Ljava/lang/String;)V", sizeof(void*));
Mathieu Chartier2cebb242015-04-21 16:50:40 -0700523 ASSERT_TRUE(method != nullptr);
Ian Rogers53b8b092014-03-13 23:45:53 -0700524
525 // Start runtime.
526 bool started = runtime_->Start();
527 CHECK(started);
528 soa.Self()->TransitionFromSuspendedToRunnable();
529
530 jvalue args[1];
531 args[0].l = nullptr;
532 InvokeWithJValues(soa, nullptr, soa.EncodeMethod(method), args);
533}
534
535TEST_F(ReflectionTest, StaticNopMethod) {
Ian Rogers53b8b092014-03-13 23:45:53 -0700536 InvokeNopMethod(true);
537}
538
539TEST_F(ReflectionTest, NonStaticNopMethod) {
Ian Rogers53b8b092014-03-13 23:45:53 -0700540 InvokeNopMethod(false);
541}
542
543TEST_F(ReflectionTest, StaticIdentityByteMethod) {
Ian Rogers53b8b092014-03-13 23:45:53 -0700544 InvokeIdentityByteMethod(true);
545}
546
547TEST_F(ReflectionTest, NonStaticIdentityByteMethod) {
Ian Rogers53b8b092014-03-13 23:45:53 -0700548 InvokeIdentityByteMethod(false);
549}
550
551TEST_F(ReflectionTest, StaticIdentityIntMethod) {
Ian Rogers53b8b092014-03-13 23:45:53 -0700552 InvokeIdentityIntMethod(true);
553}
554
555TEST_F(ReflectionTest, NonStaticIdentityIntMethod) {
Ian Rogers53b8b092014-03-13 23:45:53 -0700556 InvokeIdentityIntMethod(false);
557}
558
559TEST_F(ReflectionTest, StaticIdentityDoubleMethod) {
Ian Rogers53b8b092014-03-13 23:45:53 -0700560 InvokeIdentityDoubleMethod(true);
561}
562
563TEST_F(ReflectionTest, NonStaticIdentityDoubleMethod) {
Ian Rogers53b8b092014-03-13 23:45:53 -0700564 InvokeIdentityDoubleMethod(false);
565}
566
567TEST_F(ReflectionTest, StaticSumIntIntMethod) {
Ian Rogers53b8b092014-03-13 23:45:53 -0700568 InvokeSumIntIntMethod(true);
569}
570
571TEST_F(ReflectionTest, NonStaticSumIntIntMethod) {
Ian Rogers53b8b092014-03-13 23:45:53 -0700572 InvokeSumIntIntMethod(false);
573}
574
575TEST_F(ReflectionTest, StaticSumIntIntIntMethod) {
Ian Rogers53b8b092014-03-13 23:45:53 -0700576 InvokeSumIntIntIntMethod(true);
577}
578
579TEST_F(ReflectionTest, NonStaticSumIntIntIntMethod) {
Ian Rogers53b8b092014-03-13 23:45:53 -0700580 InvokeSumIntIntIntMethod(false);
581}
582
583TEST_F(ReflectionTest, StaticSumIntIntIntIntMethod) {
Ian Rogers53b8b092014-03-13 23:45:53 -0700584 InvokeSumIntIntIntIntMethod(true);
585}
586
587TEST_F(ReflectionTest, NonStaticSumIntIntIntIntMethod) {
Ian Rogers53b8b092014-03-13 23:45:53 -0700588 InvokeSumIntIntIntIntMethod(false);
589}
590
591TEST_F(ReflectionTest, StaticSumIntIntIntIntIntMethod) {
Ian Rogers53b8b092014-03-13 23:45:53 -0700592 InvokeSumIntIntIntIntIntMethod(true);
593}
594
595TEST_F(ReflectionTest, NonStaticSumIntIntIntIntIntMethod) {
Ian Rogers53b8b092014-03-13 23:45:53 -0700596 InvokeSumIntIntIntIntIntMethod(false);
597}
598
599TEST_F(ReflectionTest, StaticSumDoubleDoubleMethod) {
Ian Rogers53b8b092014-03-13 23:45:53 -0700600 InvokeSumDoubleDoubleMethod(true);
601}
602
603TEST_F(ReflectionTest, NonStaticSumDoubleDoubleMethod) {
Ian Rogers53b8b092014-03-13 23:45:53 -0700604 InvokeSumDoubleDoubleMethod(false);
605}
606
607TEST_F(ReflectionTest, StaticSumDoubleDoubleDoubleMethod) {
Ian Rogers53b8b092014-03-13 23:45:53 -0700608 InvokeSumDoubleDoubleDoubleMethod(true);
609}
610
611TEST_F(ReflectionTest, NonStaticSumDoubleDoubleDoubleMethod) {
Ian Rogers53b8b092014-03-13 23:45:53 -0700612 InvokeSumDoubleDoubleDoubleMethod(false);
613}
614
615TEST_F(ReflectionTest, StaticSumDoubleDoubleDoubleDoubleMethod) {
Ian Rogers53b8b092014-03-13 23:45:53 -0700616 InvokeSumDoubleDoubleDoubleDoubleMethod(true);
617}
618
619TEST_F(ReflectionTest, NonStaticSumDoubleDoubleDoubleDoubleMethod) {
Ian Rogers53b8b092014-03-13 23:45:53 -0700620 InvokeSumDoubleDoubleDoubleDoubleMethod(false);
621}
622
623TEST_F(ReflectionTest, StaticSumDoubleDoubleDoubleDoubleDoubleMethod) {
Ian Rogers53b8b092014-03-13 23:45:53 -0700624 InvokeSumDoubleDoubleDoubleDoubleDoubleMethod(true);
625}
626
627TEST_F(ReflectionTest, NonStaticSumDoubleDoubleDoubleDoubleDoubleMethod) {
Ian Rogers53b8b092014-03-13 23:45:53 -0700628 InvokeSumDoubleDoubleDoubleDoubleDoubleMethod(false);
629}
630
631} // namespace art