blob: 016f3c75f7c72295e69af5bce30ebbb99ce02b53 [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"
Ian Rogerse63db272014-07-15 15:36:11 -070026#include "scoped_thread_state_change.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)
Mathieu Chartier90443472015-07-16 20:32:27 -070089 SHARED_REQUIRES(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(
96 ScopedObjectAccessUnchecked(self).Decode<mirror::ClassLoader*>(jclass_loader)));
Ian Rogers53b8b092014-03-13 23:45:53 -070097 if (is_static) {
98 MakeExecutable(ScopedObjectAccessUnchecked(self).Decode<mirror::ClassLoader*>(jclass_loader),
99 class_name);
100 } else {
101 MakeExecutable(nullptr, "java.lang.Class");
102 MakeExecutable(nullptr, "java.lang.Object");
103 MakeExecutable(ScopedObjectAccessUnchecked(self).Decode<mirror::ClassLoader*>(jclass_loader),
104 class_name);
105 }
106
107 mirror::Class* c = class_linker_->FindClass(self, DotToDescriptor(class_name).c_str(),
108 class_loader);
Mathieu Chartier2cebb242015-04-21 16:50:40 -0700109 CHECK(c != nullptr);
Ian Rogers53b8b092014-03-13 23:45:53 -0700110
Andreas Gampe542451c2016-07-26 09:02:02 -0700111 *method = is_static ? c->FindDirectMethod(method_name, method_signature, kRuntimePointerSize)
112 : c->FindVirtualMethod(method_name, method_signature, kRuntimePointerSize);
Ian Rogers53b8b092014-03-13 23:45:53 -0700113 CHECK(method != nullptr);
114
Sebastien Hertz4e99b3d2014-06-24 14:35:40 +0200115 if (is_static) {
116 *receiver = nullptr;
117 } else {
118 // Ensure class is initialized before allocating object
Andreas Gampe277ccbd2014-11-03 21:36:10 -0800119 StackHandleScope<1> hs2(self);
120 Handle<mirror::Class> h_class(hs2.NewHandle(c));
Ian Rogers7b078e82014-09-10 14:44:24 -0700121 bool initialized = class_linker_->EnsureInitialized(self, h_class, true, true);
Sebastien Hertz4e99b3d2014-06-24 14:35:40 +0200122 CHECK(initialized);
123 *receiver = c->AllocObject(self);
124 }
Ian Rogers53b8b092014-03-13 23:45:53 -0700125
126 // Start runtime.
127 bool started = runtime_->Start();
128 CHECK(started);
129 self->TransitionFromSuspendedToRunnable();
130 }
131
132 void InvokeNopMethod(bool is_static) {
133 ScopedObjectAccess soa(env_);
Mathieu Chartiere401d142015-04-22 13:56:20 -0700134 ArtMethod* method;
Ian Rogers53b8b092014-03-13 23:45:53 -0700135 mirror::Object* receiver;
136 ReflectionTestMakeExecutable(&method, &receiver, is_static, "nop", "()V");
Jeff Hao39b6c242015-05-19 20:30:23 -0700137 ScopedLocalRef<jobject> receiver_ref(soa.Env(), soa.AddLocalReference<jobject>(receiver));
138 InvokeWithJValues(soa, receiver_ref.get(), soa.EncodeMethod(method), nullptr);
Ian Rogers53b8b092014-03-13 23:45:53 -0700139 }
140
141 void InvokeIdentityByteMethod(bool is_static) {
142 ScopedObjectAccess soa(env_);
Mathieu Chartiere401d142015-04-22 13:56:20 -0700143 ArtMethod* method;
Ian Rogers53b8b092014-03-13 23:45:53 -0700144 mirror::Object* receiver;
145 ReflectionTestMakeExecutable(&method, &receiver, is_static, "identity", "(B)B");
Jeff Hao39b6c242015-05-19 20:30:23 -0700146 ScopedLocalRef<jobject> receiver_ref(soa.Env(), soa.AddLocalReference<jobject>(receiver));
Ian Rogers53b8b092014-03-13 23:45:53 -0700147 jvalue args[1];
148
149 args[0].b = 0;
Jeff Hao39b6c242015-05-19 20:30:23 -0700150 JValue result = InvokeWithJValues(soa, receiver_ref.get(), soa.EncodeMethod(method), args);
Ian Rogers53b8b092014-03-13 23:45:53 -0700151 EXPECT_EQ(0, result.GetB());
152
153 args[0].b = -1;
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(-1, result.GetB());
156
157 args[0].b = SCHAR_MAX;
Jeff Hao39b6c242015-05-19 20:30:23 -0700158 result = InvokeWithJValues(soa, receiver_ref.get(), soa.EncodeMethod(method), args);
Ian Rogers53b8b092014-03-13 23:45:53 -0700159 EXPECT_EQ(SCHAR_MAX, result.GetB());
160
Andreas Gampe58554b72015-10-20 21:08:52 -0700161 static_assert(SCHAR_MIN == -128, "SCHAR_MIN unexpected");
162 args[0].b = SCHAR_MIN;
Jeff Hao39b6c242015-05-19 20:30:23 -0700163 result = InvokeWithJValues(soa, receiver_ref.get(), soa.EncodeMethod(method), args);
Ian Rogers53b8b092014-03-13 23:45:53 -0700164 EXPECT_EQ(SCHAR_MIN, result.GetB());
165 }
166
167 void InvokeIdentityIntMethod(bool is_static) {
168 ScopedObjectAccess soa(env_);
Mathieu Chartiere401d142015-04-22 13:56:20 -0700169 ArtMethod* method;
Ian Rogers53b8b092014-03-13 23:45:53 -0700170 mirror::Object* receiver;
171 ReflectionTestMakeExecutable(&method, &receiver, is_static, "identity", "(I)I");
Jeff Hao39b6c242015-05-19 20:30:23 -0700172 ScopedLocalRef<jobject> receiver_ref(soa.Env(), soa.AddLocalReference<jobject>(receiver));
Ian Rogers53b8b092014-03-13 23:45:53 -0700173 jvalue args[1];
174
175 args[0].i = 0;
Jeff Hao39b6c242015-05-19 20:30:23 -0700176 JValue result = InvokeWithJValues(soa, receiver_ref.get(), soa.EncodeMethod(method), args);
Ian Rogers53b8b092014-03-13 23:45:53 -0700177 EXPECT_EQ(0, result.GetI());
178
179 args[0].i = -1;
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(-1, result.GetI());
182
183 args[0].i = INT_MAX;
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_MAX, result.GetI());
186
187 args[0].i = INT_MIN;
Jeff Hao39b6c242015-05-19 20:30:23 -0700188 result = InvokeWithJValues(soa, receiver_ref.get(), soa.EncodeMethod(method), args);
Ian Rogers53b8b092014-03-13 23:45:53 -0700189 EXPECT_EQ(INT_MIN, result.GetI());
190 }
191
192 void InvokeIdentityDoubleMethod(bool is_static) {
193 ScopedObjectAccess soa(env_);
Mathieu Chartiere401d142015-04-22 13:56:20 -0700194 ArtMethod* method;
Ian Rogers53b8b092014-03-13 23:45:53 -0700195 mirror::Object* receiver;
196 ReflectionTestMakeExecutable(&method, &receiver, is_static, "identity", "(D)D");
Jeff Hao39b6c242015-05-19 20:30:23 -0700197 ScopedLocalRef<jobject> receiver_ref(soa.Env(), soa.AddLocalReference<jobject>(receiver));
Ian Rogers53b8b092014-03-13 23:45:53 -0700198 jvalue args[1];
199
200 args[0].d = 0.0;
Jeff Hao39b6c242015-05-19 20:30:23 -0700201 JValue result = InvokeWithJValues(soa, receiver_ref.get(), soa.EncodeMethod(method), args);
Ian Rogers647b1a82014-10-10 11:02:11 -0700202 EXPECT_DOUBLE_EQ(0.0, result.GetD());
Ian Rogers53b8b092014-03-13 23:45:53 -0700203
204 args[0].d = -1.0;
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(-1.0, result.GetD());
Ian Rogers53b8b092014-03-13 23:45:53 -0700207
208 args[0].d = DBL_MAX;
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_MAX, result.GetD());
Ian Rogers53b8b092014-03-13 23:45:53 -0700211
212 args[0].d = DBL_MIN;
Jeff Hao39b6c242015-05-19 20:30:23 -0700213 result = InvokeWithJValues(soa, receiver_ref.get(), soa.EncodeMethod(method), args);
Ian Rogers647b1a82014-10-10 11:02:11 -0700214 EXPECT_DOUBLE_EQ(DBL_MIN, result.GetD());
Ian Rogers53b8b092014-03-13 23:45:53 -0700215 }
216
217 void InvokeSumIntIntMethod(bool is_static) {
218 ScopedObjectAccess soa(env_);
Mathieu Chartiere401d142015-04-22 13:56:20 -0700219 ArtMethod* method;
Ian Rogers53b8b092014-03-13 23:45:53 -0700220 mirror::Object* receiver;
221 ReflectionTestMakeExecutable(&method, &receiver, is_static, "sum", "(II)I");
Jeff Hao39b6c242015-05-19 20:30:23 -0700222 ScopedLocalRef<jobject> receiver_ref(soa.Env(), soa.AddLocalReference<jobject>(receiver));
Ian Rogers53b8b092014-03-13 23:45:53 -0700223 jvalue args[2];
224
225 args[0].i = 1;
226 args[1].i = 2;
Jeff Hao39b6c242015-05-19 20:30:23 -0700227 JValue result = InvokeWithJValues(soa, receiver_ref.get(), soa.EncodeMethod(method), args);
Ian Rogers53b8b092014-03-13 23:45:53 -0700228 EXPECT_EQ(3, result.GetI());
229
230 args[0].i = -2;
231 args[1].i = 5;
Jeff Hao39b6c242015-05-19 20:30:23 -0700232 result = InvokeWithJValues(soa, receiver_ref.get(), soa.EncodeMethod(method), args);
Ian Rogers53b8b092014-03-13 23:45:53 -0700233 EXPECT_EQ(3, result.GetI());
234
235 args[0].i = INT_MAX;
236 args[1].i = INT_MIN;
Jeff Hao39b6c242015-05-19 20:30:23 -0700237 result = InvokeWithJValues(soa, receiver_ref.get(), soa.EncodeMethod(method), args);
Ian Rogers53b8b092014-03-13 23:45:53 -0700238 EXPECT_EQ(-1, result.GetI());
239
240 args[0].i = INT_MAX;
241 args[1].i = INT_MAX;
Jeff Hao39b6c242015-05-19 20:30:23 -0700242 result = InvokeWithJValues(soa, receiver_ref.get(), soa.EncodeMethod(method), args);
Ian Rogers53b8b092014-03-13 23:45:53 -0700243 EXPECT_EQ(-2, result.GetI());
244 }
245
246 void InvokeSumIntIntIntMethod(bool is_static) {
247 ScopedObjectAccess soa(env_);
Mathieu Chartiere401d142015-04-22 13:56:20 -0700248 ArtMethod* method;
Ian Rogers53b8b092014-03-13 23:45:53 -0700249 mirror::Object* receiver;
250 ReflectionTestMakeExecutable(&method, &receiver, is_static, "sum", "(III)I");
Jeff Hao39b6c242015-05-19 20:30:23 -0700251 ScopedLocalRef<jobject> receiver_ref(soa.Env(), soa.AddLocalReference<jobject>(receiver));
Ian Rogers53b8b092014-03-13 23:45:53 -0700252 jvalue args[3];
253
254 args[0].i = 0;
255 args[1].i = 0;
256 args[2].i = 0;
Jeff Hao39b6c242015-05-19 20:30:23 -0700257 JValue result = InvokeWithJValues(soa, receiver_ref.get(), soa.EncodeMethod(method), args);
Ian Rogers53b8b092014-03-13 23:45:53 -0700258 EXPECT_EQ(0, result.GetI());
259
260 args[0].i = 1;
261 args[1].i = 2;
262 args[2].i = 3;
Jeff Hao39b6c242015-05-19 20:30:23 -0700263 result = InvokeWithJValues(soa, receiver_ref.get(), soa.EncodeMethod(method), args);
Ian Rogers53b8b092014-03-13 23:45:53 -0700264 EXPECT_EQ(6, result.GetI());
265
266 args[0].i = -1;
267 args[1].i = 2;
268 args[2].i = -3;
Jeff Hao39b6c242015-05-19 20:30:23 -0700269 result = InvokeWithJValues(soa, receiver_ref.get(), soa.EncodeMethod(method), args);
Ian Rogers53b8b092014-03-13 23:45:53 -0700270 EXPECT_EQ(-2, result.GetI());
271
272 args[0].i = INT_MAX;
273 args[1].i = INT_MIN;
274 args[2].i = INT_MAX;
Jeff Hao39b6c242015-05-19 20:30:23 -0700275 result = InvokeWithJValues(soa, receiver_ref.get(), soa.EncodeMethod(method), args);
Ian Rogers53b8b092014-03-13 23:45:53 -0700276 EXPECT_EQ(2147483646, result.GetI());
277
278 args[0].i = INT_MAX;
279 args[1].i = INT_MAX;
280 args[2].i = INT_MAX;
Jeff Hao39b6c242015-05-19 20:30:23 -0700281 result = InvokeWithJValues(soa, receiver_ref.get(), soa.EncodeMethod(method), args);
Ian Rogers53b8b092014-03-13 23:45:53 -0700282 EXPECT_EQ(2147483645, result.GetI());
283 }
284
285 void InvokeSumIntIntIntIntMethod(bool is_static) {
286 ScopedObjectAccess soa(env_);
Mathieu Chartiere401d142015-04-22 13:56:20 -0700287 ArtMethod* method;
Ian Rogers53b8b092014-03-13 23:45:53 -0700288 mirror::Object* receiver;
289 ReflectionTestMakeExecutable(&method, &receiver, is_static, "sum", "(IIII)I");
Jeff Hao39b6c242015-05-19 20:30:23 -0700290 ScopedLocalRef<jobject> receiver_ref(soa.Env(), soa.AddLocalReference<jobject>(receiver));
Ian Rogers53b8b092014-03-13 23:45:53 -0700291 jvalue args[4];
292
293 args[0].i = 0;
294 args[1].i = 0;
295 args[2].i = 0;
296 args[3].i = 0;
Jeff Hao39b6c242015-05-19 20:30:23 -0700297 JValue result = InvokeWithJValues(soa, receiver_ref.get(), soa.EncodeMethod(method), args);
Ian Rogers53b8b092014-03-13 23:45:53 -0700298 EXPECT_EQ(0, result.GetI());
299
300 args[0].i = 1;
301 args[1].i = 2;
302 args[2].i = 3;
303 args[3].i = 4;
Jeff Hao39b6c242015-05-19 20:30:23 -0700304 result = InvokeWithJValues(soa, receiver_ref.get(), soa.EncodeMethod(method), args);
Ian Rogers53b8b092014-03-13 23:45:53 -0700305 EXPECT_EQ(10, result.GetI());
306
307 args[0].i = -1;
308 args[1].i = 2;
309 args[2].i = -3;
310 args[3].i = 4;
Jeff Hao39b6c242015-05-19 20:30:23 -0700311 result = InvokeWithJValues(soa, receiver_ref.get(), soa.EncodeMethod(method), args);
Ian Rogers53b8b092014-03-13 23:45:53 -0700312 EXPECT_EQ(2, result.GetI());
313
314 args[0].i = INT_MAX;
315 args[1].i = INT_MIN;
316 args[2].i = INT_MAX;
317 args[3].i = INT_MIN;
Jeff Hao39b6c242015-05-19 20:30:23 -0700318 result = InvokeWithJValues(soa, receiver_ref.get(), soa.EncodeMethod(method), args);
Ian Rogers53b8b092014-03-13 23:45:53 -0700319 EXPECT_EQ(-2, result.GetI());
320
321 args[0].i = INT_MAX;
322 args[1].i = INT_MAX;
323 args[2].i = INT_MAX;
324 args[3].i = INT_MAX;
Jeff Hao39b6c242015-05-19 20:30:23 -0700325 result = InvokeWithJValues(soa, receiver_ref.get(), soa.EncodeMethod(method), args);
Ian Rogers53b8b092014-03-13 23:45:53 -0700326 EXPECT_EQ(-4, result.GetI());
327 }
328
329 void InvokeSumIntIntIntIntIntMethod(bool is_static) {
330 ScopedObjectAccess soa(env_);
Mathieu Chartiere401d142015-04-22 13:56:20 -0700331 ArtMethod* method;
Ian Rogers53b8b092014-03-13 23:45:53 -0700332 mirror::Object* receiver;
333 ReflectionTestMakeExecutable(&method, &receiver, is_static, "sum", "(IIIII)I");
Jeff Hao39b6c242015-05-19 20:30:23 -0700334 ScopedLocalRef<jobject> receiver_ref(soa.Env(), soa.AddLocalReference<jobject>(receiver));
Ian Rogers53b8b092014-03-13 23:45:53 -0700335 jvalue args[5];
336
337 args[0].i = 0;
338 args[1].i = 0;
339 args[2].i = 0;
340 args[3].i = 0;
341 args[4].i = 0;
Jeff Hao39b6c242015-05-19 20:30:23 -0700342 JValue result = InvokeWithJValues(soa, receiver_ref.get(), soa.EncodeMethod(method), args);
Ian Rogers53b8b092014-03-13 23:45:53 -0700343 EXPECT_EQ(0, result.GetI());
344
345 args[0].i = 1;
346 args[1].i = 2;
347 args[2].i = 3;
348 args[3].i = 4;
349 args[4].i = 5;
Jeff Hao39b6c242015-05-19 20:30:23 -0700350 result = InvokeWithJValues(soa, receiver_ref.get(), soa.EncodeMethod(method), args);
Ian Rogers53b8b092014-03-13 23:45:53 -0700351 EXPECT_EQ(15, result.GetI());
352
353 args[0].i = -1;
354 args[1].i = 2;
355 args[2].i = -3;
356 args[3].i = 4;
357 args[4].i = -5;
Jeff Hao39b6c242015-05-19 20:30:23 -0700358 result = InvokeWithJValues(soa, receiver_ref.get(), soa.EncodeMethod(method), args);
Ian Rogers53b8b092014-03-13 23:45:53 -0700359 EXPECT_EQ(-3, result.GetI());
360
361 args[0].i = INT_MAX;
362 args[1].i = INT_MIN;
363 args[2].i = INT_MAX;
364 args[3].i = INT_MIN;
365 args[4].i = INT_MAX;
Jeff Hao39b6c242015-05-19 20:30:23 -0700366 result = InvokeWithJValues(soa, receiver_ref.get(), soa.EncodeMethod(method), args);
Ian Rogers53b8b092014-03-13 23:45:53 -0700367 EXPECT_EQ(2147483645, result.GetI());
368
369 args[0].i = INT_MAX;
370 args[1].i = INT_MAX;
371 args[2].i = INT_MAX;
372 args[3].i = INT_MAX;
373 args[4].i = INT_MAX;
Jeff Hao39b6c242015-05-19 20:30:23 -0700374 result = InvokeWithJValues(soa, receiver_ref.get(), soa.EncodeMethod(method), args);
Ian Rogers53b8b092014-03-13 23:45:53 -0700375 EXPECT_EQ(2147483643, result.GetI());
376 }
377
378 void InvokeSumDoubleDoubleMethod(bool is_static) {
379 ScopedObjectAccess soa(env_);
Mathieu Chartiere401d142015-04-22 13:56:20 -0700380 ArtMethod* method;
Ian Rogers53b8b092014-03-13 23:45:53 -0700381 mirror::Object* receiver;
382 ReflectionTestMakeExecutable(&method, &receiver, is_static, "sum", "(DD)D");
Jeff Hao39b6c242015-05-19 20:30:23 -0700383 ScopedLocalRef<jobject> receiver_ref(soa.Env(), soa.AddLocalReference<jobject>(receiver));
Ian Rogers53b8b092014-03-13 23:45:53 -0700384 jvalue args[2];
385
386 args[0].d = 0.0;
387 args[1].d = 0.0;
Jeff Hao39b6c242015-05-19 20:30:23 -0700388 JValue result = InvokeWithJValues(soa, receiver_ref.get(), soa.EncodeMethod(method), args);
Ian Rogers647b1a82014-10-10 11:02:11 -0700389 EXPECT_DOUBLE_EQ(0.0, result.GetD());
Ian Rogers53b8b092014-03-13 23:45:53 -0700390
391 args[0].d = 1.0;
392 args[1].d = 2.0;
Jeff Hao39b6c242015-05-19 20:30:23 -0700393 result = InvokeWithJValues(soa, receiver_ref.get(), soa.EncodeMethod(method), args);
Ian Rogers647b1a82014-10-10 11:02:11 -0700394 EXPECT_DOUBLE_EQ(3.0, result.GetD());
Ian Rogers53b8b092014-03-13 23:45:53 -0700395
396 args[0].d = 1.0;
397 args[1].d = -2.0;
Jeff Hao39b6c242015-05-19 20:30:23 -0700398 result = InvokeWithJValues(soa, receiver_ref.get(), soa.EncodeMethod(method), args);
Ian Rogers647b1a82014-10-10 11:02:11 -0700399 EXPECT_DOUBLE_EQ(-1.0, result.GetD());
Ian Rogers53b8b092014-03-13 23:45:53 -0700400
401 args[0].d = DBL_MAX;
402 args[1].d = DBL_MIN;
Jeff Hao39b6c242015-05-19 20:30:23 -0700403 result = InvokeWithJValues(soa, receiver_ref.get(), soa.EncodeMethod(method), args);
Ian Rogers647b1a82014-10-10 11:02:11 -0700404 EXPECT_DOUBLE_EQ(1.7976931348623157e308, result.GetD());
Ian Rogers53b8b092014-03-13 23:45:53 -0700405
406 args[0].d = DBL_MAX;
407 args[1].d = DBL_MAX;
Jeff Hao39b6c242015-05-19 20:30:23 -0700408 result = InvokeWithJValues(soa, receiver_ref.get(), soa.EncodeMethod(method), args);
Ian Rogers647b1a82014-10-10 11:02:11 -0700409 EXPECT_DOUBLE_EQ(INFINITY, result.GetD());
Ian Rogers53b8b092014-03-13 23:45:53 -0700410 }
411
412 void InvokeSumDoubleDoubleDoubleMethod(bool is_static) {
413 ScopedObjectAccess soa(env_);
Mathieu Chartiere401d142015-04-22 13:56:20 -0700414 ArtMethod* method;
Ian Rogers53b8b092014-03-13 23:45:53 -0700415 mirror::Object* receiver;
416 ReflectionTestMakeExecutable(&method, &receiver, is_static, "sum", "(DDD)D");
Jeff Hao39b6c242015-05-19 20:30:23 -0700417 ScopedLocalRef<jobject> receiver_ref(soa.Env(), soa.AddLocalReference<jobject>(receiver));
Ian Rogers53b8b092014-03-13 23:45:53 -0700418 jvalue args[3];
419
420 args[0].d = 0.0;
421 args[1].d = 0.0;
422 args[2].d = 0.0;
Jeff Hao39b6c242015-05-19 20:30:23 -0700423 JValue result = InvokeWithJValues(soa, receiver_ref.get(), soa.EncodeMethod(method), args);
Ian Rogers647b1a82014-10-10 11:02:11 -0700424 EXPECT_DOUBLE_EQ(0.0, result.GetD());
Ian Rogers53b8b092014-03-13 23:45:53 -0700425
426 args[0].d = 1.0;
427 args[1].d = 2.0;
428 args[2].d = 3.0;
Jeff Hao39b6c242015-05-19 20:30:23 -0700429 result = InvokeWithJValues(soa, receiver_ref.get(), soa.EncodeMethod(method), args);
Ian Rogers647b1a82014-10-10 11:02:11 -0700430 EXPECT_DOUBLE_EQ(6.0, result.GetD());
Ian Rogers53b8b092014-03-13 23:45:53 -0700431
432 args[0].d = 1.0;
433 args[1].d = -2.0;
434 args[2].d = 3.0;
Jeff Hao39b6c242015-05-19 20:30:23 -0700435 result = InvokeWithJValues(soa, receiver_ref.get(), soa.EncodeMethod(method), args);
Ian Rogers647b1a82014-10-10 11:02:11 -0700436 EXPECT_DOUBLE_EQ(2.0, result.GetD());
Ian Rogers53b8b092014-03-13 23:45:53 -0700437 }
438
439 void InvokeSumDoubleDoubleDoubleDoubleMethod(bool is_static) {
440 ScopedObjectAccess soa(env_);
Mathieu Chartiere401d142015-04-22 13:56:20 -0700441 ArtMethod* method;
Ian Rogers53b8b092014-03-13 23:45:53 -0700442 mirror::Object* receiver;
443 ReflectionTestMakeExecutable(&method, &receiver, is_static, "sum", "(DDDD)D");
Jeff Hao39b6c242015-05-19 20:30:23 -0700444 ScopedLocalRef<jobject> receiver_ref(soa.Env(), soa.AddLocalReference<jobject>(receiver));
Ian Rogers53b8b092014-03-13 23:45:53 -0700445 jvalue args[4];
446
447 args[0].d = 0.0;
448 args[1].d = 0.0;
449 args[2].d = 0.0;
450 args[3].d = 0.0;
Jeff Hao39b6c242015-05-19 20:30:23 -0700451 JValue result = InvokeWithJValues(soa, receiver_ref.get(), soa.EncodeMethod(method), args);
Ian Rogers647b1a82014-10-10 11:02:11 -0700452 EXPECT_DOUBLE_EQ(0.0, result.GetD());
Ian Rogers53b8b092014-03-13 23:45:53 -0700453
454 args[0].d = 1.0;
455 args[1].d = 2.0;
456 args[2].d = 3.0;
457 args[3].d = 4.0;
Jeff Hao39b6c242015-05-19 20:30:23 -0700458 result = InvokeWithJValues(soa, receiver_ref.get(), soa.EncodeMethod(method), args);
Ian Rogers647b1a82014-10-10 11:02:11 -0700459 EXPECT_DOUBLE_EQ(10.0, result.GetD());
Ian Rogers53b8b092014-03-13 23:45:53 -0700460
461 args[0].d = 1.0;
462 args[1].d = -2.0;
463 args[2].d = 3.0;
464 args[3].d = -4.0;
Jeff Hao39b6c242015-05-19 20:30:23 -0700465 result = InvokeWithJValues(soa, receiver_ref.get(), soa.EncodeMethod(method), args);
Ian Rogers647b1a82014-10-10 11:02:11 -0700466 EXPECT_DOUBLE_EQ(-2.0, result.GetD());
Ian Rogers53b8b092014-03-13 23:45:53 -0700467 }
468
469 void InvokeSumDoubleDoubleDoubleDoubleDoubleMethod(bool is_static) {
470 ScopedObjectAccess soa(env_);
Mathieu Chartiere401d142015-04-22 13:56:20 -0700471 ArtMethod* method;
Ian Rogers53b8b092014-03-13 23:45:53 -0700472 mirror::Object* receiver;
473 ReflectionTestMakeExecutable(&method, &receiver, is_static, "sum", "(DDDDD)D");
Jeff Hao39b6c242015-05-19 20:30:23 -0700474 ScopedLocalRef<jobject> receiver_ref(soa.Env(), soa.AddLocalReference<jobject>(receiver));
Ian Rogers53b8b092014-03-13 23:45:53 -0700475 jvalue args[5];
476
477 args[0].d = 0.0;
478 args[1].d = 0.0;
479 args[2].d = 0.0;
480 args[3].d = 0.0;
481 args[4].d = 0.0;
Jeff Hao39b6c242015-05-19 20:30:23 -0700482 JValue result = InvokeWithJValues(soa, receiver_ref.get(), soa.EncodeMethod(method), args);
Ian Rogers647b1a82014-10-10 11:02:11 -0700483 EXPECT_DOUBLE_EQ(0.0, result.GetD());
Ian Rogers53b8b092014-03-13 23:45:53 -0700484
485 args[0].d = 1.0;
486 args[1].d = 2.0;
487 args[2].d = 3.0;
488 args[3].d = 4.0;
489 args[4].d = 5.0;
Jeff Hao39b6c242015-05-19 20:30:23 -0700490 result = InvokeWithJValues(soa, receiver_ref.get(), soa.EncodeMethod(method), args);
Ian Rogers647b1a82014-10-10 11:02:11 -0700491 EXPECT_DOUBLE_EQ(15.0, result.GetD());
Ian Rogers53b8b092014-03-13 23:45:53 -0700492
493 args[0].d = 1.0;
494 args[1].d = -2.0;
495 args[2].d = 3.0;
496 args[3].d = -4.0;
497 args[4].d = 5.0;
Jeff Hao39b6c242015-05-19 20:30:23 -0700498 result = InvokeWithJValues(soa, receiver_ref.get(), soa.EncodeMethod(method), args);
Ian Rogers647b1a82014-10-10 11:02:11 -0700499 EXPECT_DOUBLE_EQ(3.0, result.GetD());
Ian Rogers53b8b092014-03-13 23:45:53 -0700500 }
501
502 JavaVMExt* vm_;
503 JNIEnv* env_;
504 jclass aioobe_;
505 jclass ase_;
506 jclass sioobe_;
507};
508
509TEST_F(ReflectionTest, StaticMainMethod) {
Roland Levillain0d5a2812015-11-13 10:07:31 +0000510 TEST_DISABLED_FOR_READ_BARRIER_WITH_OPTIMIZING_FOR_UNSUPPORTED_INSTRUCTION_SETS();
Ian Rogers53b8b092014-03-13 23:45:53 -0700511 ScopedObjectAccess soa(Thread::Current());
512 jobject jclass_loader = LoadDex("Main");
Mathieu Chartiereb8167a2014-05-07 15:43:14 -0700513 StackHandleScope<1> hs(soa.Self());
514 Handle<mirror::ClassLoader> class_loader(
515 hs.NewHandle(soa.Decode<mirror::ClassLoader*>(jclass_loader)));
Ian Rogers53b8b092014-03-13 23:45:53 -0700516 CompileDirectMethod(class_loader, "Main", "main", "([Ljava/lang/String;)V");
517
518 mirror::Class* klass = class_linker_->FindClass(soa.Self(), "LMain;", class_loader);
Mathieu Chartier2cebb242015-04-21 16:50:40 -0700519 ASSERT_TRUE(klass != nullptr);
Ian Rogers53b8b092014-03-13 23:45:53 -0700520
Andreas Gampe542451c2016-07-26 09:02:02 -0700521 ArtMethod* method = klass->FindDirectMethod("main",
522 "([Ljava/lang/String;)V",
523 kRuntimePointerSize);
Mathieu Chartier2cebb242015-04-21 16:50:40 -0700524 ASSERT_TRUE(method != nullptr);
Ian Rogers53b8b092014-03-13 23:45:53 -0700525
526 // Start runtime.
527 bool started = runtime_->Start();
528 CHECK(started);
529 soa.Self()->TransitionFromSuspendedToRunnable();
530
531 jvalue args[1];
532 args[0].l = nullptr;
533 InvokeWithJValues(soa, nullptr, soa.EncodeMethod(method), args);
534}
535
536TEST_F(ReflectionTest, StaticNopMethod) {
Ian Rogers53b8b092014-03-13 23:45:53 -0700537 InvokeNopMethod(true);
538}
539
540TEST_F(ReflectionTest, NonStaticNopMethod) {
Ian Rogers53b8b092014-03-13 23:45:53 -0700541 InvokeNopMethod(false);
542}
543
544TEST_F(ReflectionTest, StaticIdentityByteMethod) {
Ian Rogers53b8b092014-03-13 23:45:53 -0700545 InvokeIdentityByteMethod(true);
546}
547
548TEST_F(ReflectionTest, NonStaticIdentityByteMethod) {
Ian Rogers53b8b092014-03-13 23:45:53 -0700549 InvokeIdentityByteMethod(false);
550}
551
552TEST_F(ReflectionTest, StaticIdentityIntMethod) {
Ian Rogers53b8b092014-03-13 23:45:53 -0700553 InvokeIdentityIntMethod(true);
554}
555
556TEST_F(ReflectionTest, NonStaticIdentityIntMethod) {
Ian Rogers53b8b092014-03-13 23:45:53 -0700557 InvokeIdentityIntMethod(false);
558}
559
560TEST_F(ReflectionTest, StaticIdentityDoubleMethod) {
Ian Rogers53b8b092014-03-13 23:45:53 -0700561 InvokeIdentityDoubleMethod(true);
562}
563
564TEST_F(ReflectionTest, NonStaticIdentityDoubleMethod) {
Ian Rogers53b8b092014-03-13 23:45:53 -0700565 InvokeIdentityDoubleMethod(false);
566}
567
568TEST_F(ReflectionTest, StaticSumIntIntMethod) {
Ian Rogers53b8b092014-03-13 23:45:53 -0700569 InvokeSumIntIntMethod(true);
570}
571
572TEST_F(ReflectionTest, NonStaticSumIntIntMethod) {
Ian Rogers53b8b092014-03-13 23:45:53 -0700573 InvokeSumIntIntMethod(false);
574}
575
576TEST_F(ReflectionTest, StaticSumIntIntIntMethod) {
Ian Rogers53b8b092014-03-13 23:45:53 -0700577 InvokeSumIntIntIntMethod(true);
578}
579
580TEST_F(ReflectionTest, NonStaticSumIntIntIntMethod) {
Ian Rogers53b8b092014-03-13 23:45:53 -0700581 InvokeSumIntIntIntMethod(false);
582}
583
584TEST_F(ReflectionTest, StaticSumIntIntIntIntMethod) {
Ian Rogers53b8b092014-03-13 23:45:53 -0700585 InvokeSumIntIntIntIntMethod(true);
586}
587
588TEST_F(ReflectionTest, NonStaticSumIntIntIntIntMethod) {
Ian Rogers53b8b092014-03-13 23:45:53 -0700589 InvokeSumIntIntIntIntMethod(false);
590}
591
592TEST_F(ReflectionTest, StaticSumIntIntIntIntIntMethod) {
Ian Rogers53b8b092014-03-13 23:45:53 -0700593 InvokeSumIntIntIntIntIntMethod(true);
594}
595
596TEST_F(ReflectionTest, NonStaticSumIntIntIntIntIntMethod) {
Ian Rogers53b8b092014-03-13 23:45:53 -0700597 InvokeSumIntIntIntIntIntMethod(false);
598}
599
600TEST_F(ReflectionTest, StaticSumDoubleDoubleMethod) {
Ian Rogers53b8b092014-03-13 23:45:53 -0700601 InvokeSumDoubleDoubleMethod(true);
602}
603
604TEST_F(ReflectionTest, NonStaticSumDoubleDoubleMethod) {
Ian Rogers53b8b092014-03-13 23:45:53 -0700605 InvokeSumDoubleDoubleMethod(false);
606}
607
608TEST_F(ReflectionTest, StaticSumDoubleDoubleDoubleMethod) {
Ian Rogers53b8b092014-03-13 23:45:53 -0700609 InvokeSumDoubleDoubleDoubleMethod(true);
610}
611
612TEST_F(ReflectionTest, NonStaticSumDoubleDoubleDoubleMethod) {
Ian Rogers53b8b092014-03-13 23:45:53 -0700613 InvokeSumDoubleDoubleDoubleMethod(false);
614}
615
616TEST_F(ReflectionTest, StaticSumDoubleDoubleDoubleDoubleMethod) {
Ian Rogers53b8b092014-03-13 23:45:53 -0700617 InvokeSumDoubleDoubleDoubleDoubleMethod(true);
618}
619
620TEST_F(ReflectionTest, NonStaticSumDoubleDoubleDoubleDoubleMethod) {
Ian Rogers53b8b092014-03-13 23:45:53 -0700621 InvokeSumDoubleDoubleDoubleDoubleMethod(false);
622}
623
624TEST_F(ReflectionTest, StaticSumDoubleDoubleDoubleDoubleDoubleMethod) {
Ian Rogers53b8b092014-03-13 23:45:53 -0700625 InvokeSumDoubleDoubleDoubleDoubleDoubleMethod(true);
626}
627
628TEST_F(ReflectionTest, NonStaticSumDoubleDoubleDoubleDoubleDoubleMethod) {
Ian Rogers53b8b092014-03-13 23:45:53 -0700629 InvokeSumDoubleDoubleDoubleDoubleDoubleMethod(false);
630}
631
632} // namespace art