blob: 22076bbc0540a04a1abc75537b40defa70a616b0 [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,
Mathieu Chartier28bd2e42016-10-04 13:54:57 -070086 ObjPtr<mirror::Object>* receiver,
87 bool is_static,
88 const char* method_name,
Ian Rogers53b8b092014-03-13 23:45:53 -070089 const char* method_signature)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -070090 REQUIRES_SHARED(Locks::mutator_lock_) {
Ian Rogers53b8b092014-03-13 23:45:53 -070091 const char* class_name = is_static ? "StaticLeafMethods" : "NonStaticLeafMethods";
92 jobject jclass_loader(LoadDex(class_name));
93 Thread* self = Thread::Current();
Mathieu Chartier28bd2e42016-10-04 13:54:57 -070094 StackHandleScope<3> hs(self);
Mathieu Chartiereb8167a2014-05-07 15:43:14 -070095 Handle<mirror::ClassLoader> class_loader(
96 hs.NewHandle(
Mathieu Chartier0795f232016-09-27 18:43:30 -070097 ScopedObjectAccessUnchecked(self).Decode<mirror::ClassLoader>(jclass_loader)));
98 if (!is_static) {
Ian Rogers53b8b092014-03-13 23:45:53 -070099 MakeExecutable(nullptr, "java.lang.Class");
100 MakeExecutable(nullptr, "java.lang.Object");
Ian Rogers53b8b092014-03-13 23:45:53 -0700101 }
Mathieu Chartier0795f232016-09-27 18:43:30 -0700102 MakeExecutable(class_loader.Get(), class_name);
Ian Rogers53b8b092014-03-13 23:45:53 -0700103
Mathieu Chartier28bd2e42016-10-04 13:54:57 -0700104 ObjPtr<mirror::Class> c = class_linker_->FindClass(self,
105 DotToDescriptor(class_name).c_str(),
106 class_loader);
Mathieu Chartier2cebb242015-04-21 16:50:40 -0700107 CHECK(c != nullptr);
Ian Rogers53b8b092014-03-13 23:45:53 -0700108
Andreas Gampe542451c2016-07-26 09:02:02 -0700109 *method = is_static ? c->FindDirectMethod(method_name, method_signature, kRuntimePointerSize)
110 : c->FindVirtualMethod(method_name, method_signature, kRuntimePointerSize);
Ian Rogers53b8b092014-03-13 23:45:53 -0700111 CHECK(method != nullptr);
112
Sebastien Hertz4e99b3d2014-06-24 14:35:40 +0200113 if (is_static) {
114 *receiver = nullptr;
115 } else {
116 // Ensure class is initialized before allocating object
Mathieu Chartier28bd2e42016-10-04 13:54:57 -0700117 {
118 StackHandleScope<1> hs2(self);
119 HandleWrapperObjPtr<mirror::Class> h_class(hs2.NewHandleWrapper(&c));
120 bool initialized = class_linker_->EnsureInitialized(self, h_class, true, true);
121 CHECK(initialized);
122 }
Sebastien Hertz4e99b3d2014-06-24 14:35:40 +0200123 *receiver = c->AllocObject(self);
124 }
Ian Rogers53b8b092014-03-13 23:45:53 -0700125
126 // Start runtime.
Mathieu Chartier28bd2e42016-10-04 13:54:57 -0700127 HandleWrapperObjPtr<mirror::Object> h(hs.NewHandleWrapper(receiver));
Ian Rogers53b8b092014-03-13 23:45:53 -0700128 bool started = runtime_->Start();
129 CHECK(started);
130 self->TransitionFromSuspendedToRunnable();
131 }
132
133 void InvokeNopMethod(bool is_static) {
134 ScopedObjectAccess soa(env_);
Mathieu Chartiere401d142015-04-22 13:56:20 -0700135 ArtMethod* method;
Mathieu Chartier28bd2e42016-10-04 13:54:57 -0700136 ObjPtr<mirror::Object> receiver;
Ian Rogers53b8b092014-03-13 23:45:53 -0700137 ReflectionTestMakeExecutable(&method, &receiver, is_static, "nop", "()V");
Jeff Hao39b6c242015-05-19 20:30:23 -0700138 ScopedLocalRef<jobject> receiver_ref(soa.Env(), soa.AddLocalReference<jobject>(receiver));
139 InvokeWithJValues(soa, receiver_ref.get(), soa.EncodeMethod(method), nullptr);
Ian Rogers53b8b092014-03-13 23:45:53 -0700140 }
141
142 void InvokeIdentityByteMethod(bool is_static) {
143 ScopedObjectAccess soa(env_);
Mathieu Chartiere401d142015-04-22 13:56:20 -0700144 ArtMethod* method;
Mathieu Chartier28bd2e42016-10-04 13:54:57 -0700145 ObjPtr<mirror::Object> receiver;
Ian Rogers53b8b092014-03-13 23:45:53 -0700146 ReflectionTestMakeExecutable(&method, &receiver, is_static, "identity", "(B)B");
Jeff Hao39b6c242015-05-19 20:30:23 -0700147 ScopedLocalRef<jobject> receiver_ref(soa.Env(), soa.AddLocalReference<jobject>(receiver));
Ian Rogers53b8b092014-03-13 23:45:53 -0700148 jvalue args[1];
149
150 args[0].b = 0;
Jeff Hao39b6c242015-05-19 20:30:23 -0700151 JValue result = InvokeWithJValues(soa, receiver_ref.get(), soa.EncodeMethod(method), args);
Ian Rogers53b8b092014-03-13 23:45:53 -0700152 EXPECT_EQ(0, result.GetB());
153
154 args[0].b = -1;
Jeff Hao39b6c242015-05-19 20:30:23 -0700155 result = InvokeWithJValues(soa, receiver_ref.get(), soa.EncodeMethod(method), args);
Ian Rogers53b8b092014-03-13 23:45:53 -0700156 EXPECT_EQ(-1, result.GetB());
157
158 args[0].b = SCHAR_MAX;
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_MAX, result.GetB());
161
Andreas Gampe58554b72015-10-20 21:08:52 -0700162 static_assert(SCHAR_MIN == -128, "SCHAR_MIN unexpected");
163 args[0].b = SCHAR_MIN;
Jeff Hao39b6c242015-05-19 20:30:23 -0700164 result = InvokeWithJValues(soa, receiver_ref.get(), soa.EncodeMethod(method), args);
Ian Rogers53b8b092014-03-13 23:45:53 -0700165 EXPECT_EQ(SCHAR_MIN, result.GetB());
166 }
167
168 void InvokeIdentityIntMethod(bool is_static) {
169 ScopedObjectAccess soa(env_);
Mathieu Chartiere401d142015-04-22 13:56:20 -0700170 ArtMethod* method;
Mathieu Chartier28bd2e42016-10-04 13:54:57 -0700171 ObjPtr<mirror::Object> receiver;
Ian Rogers53b8b092014-03-13 23:45:53 -0700172 ReflectionTestMakeExecutable(&method, &receiver, is_static, "identity", "(I)I");
Jeff Hao39b6c242015-05-19 20:30:23 -0700173 ScopedLocalRef<jobject> receiver_ref(soa.Env(), soa.AddLocalReference<jobject>(receiver));
Ian Rogers53b8b092014-03-13 23:45:53 -0700174 jvalue args[1];
175
176 args[0].i = 0;
Jeff Hao39b6c242015-05-19 20:30:23 -0700177 JValue result = InvokeWithJValues(soa, receiver_ref.get(), soa.EncodeMethod(method), args);
Ian Rogers53b8b092014-03-13 23:45:53 -0700178 EXPECT_EQ(0, result.GetI());
179
180 args[0].i = -1;
Jeff Hao39b6c242015-05-19 20:30:23 -0700181 result = InvokeWithJValues(soa, receiver_ref.get(), soa.EncodeMethod(method), args);
Ian Rogers53b8b092014-03-13 23:45:53 -0700182 EXPECT_EQ(-1, result.GetI());
183
184 args[0].i = INT_MAX;
Jeff Hao39b6c242015-05-19 20:30:23 -0700185 result = InvokeWithJValues(soa, receiver_ref.get(), soa.EncodeMethod(method), args);
Ian Rogers53b8b092014-03-13 23:45:53 -0700186 EXPECT_EQ(INT_MAX, result.GetI());
187
188 args[0].i = INT_MIN;
Jeff Hao39b6c242015-05-19 20:30:23 -0700189 result = InvokeWithJValues(soa, receiver_ref.get(), soa.EncodeMethod(method), args);
Ian Rogers53b8b092014-03-13 23:45:53 -0700190 EXPECT_EQ(INT_MIN, result.GetI());
191 }
192
193 void InvokeIdentityDoubleMethod(bool is_static) {
194 ScopedObjectAccess soa(env_);
Mathieu Chartiere401d142015-04-22 13:56:20 -0700195 ArtMethod* method;
Mathieu Chartier28bd2e42016-10-04 13:54:57 -0700196 ObjPtr<mirror::Object> receiver;
Ian Rogers53b8b092014-03-13 23:45:53 -0700197 ReflectionTestMakeExecutable(&method, &receiver, is_static, "identity", "(D)D");
Jeff Hao39b6c242015-05-19 20:30:23 -0700198 ScopedLocalRef<jobject> receiver_ref(soa.Env(), soa.AddLocalReference<jobject>(receiver));
Ian Rogers53b8b092014-03-13 23:45:53 -0700199 jvalue args[1];
200
201 args[0].d = 0.0;
Jeff Hao39b6c242015-05-19 20:30:23 -0700202 JValue result = InvokeWithJValues(soa, receiver_ref.get(), soa.EncodeMethod(method), args);
Ian Rogers647b1a82014-10-10 11:02:11 -0700203 EXPECT_DOUBLE_EQ(0.0, result.GetD());
Ian Rogers53b8b092014-03-13 23:45:53 -0700204
205 args[0].d = -1.0;
Jeff Hao39b6c242015-05-19 20:30:23 -0700206 result = InvokeWithJValues(soa, receiver_ref.get(), soa.EncodeMethod(method), args);
Ian Rogers647b1a82014-10-10 11:02:11 -0700207 EXPECT_DOUBLE_EQ(-1.0, result.GetD());
Ian Rogers53b8b092014-03-13 23:45:53 -0700208
209 args[0].d = DBL_MAX;
Jeff Hao39b6c242015-05-19 20:30:23 -0700210 result = InvokeWithJValues(soa, receiver_ref.get(), soa.EncodeMethod(method), args);
Ian Rogers647b1a82014-10-10 11:02:11 -0700211 EXPECT_DOUBLE_EQ(DBL_MAX, result.GetD());
Ian Rogers53b8b092014-03-13 23:45:53 -0700212
213 args[0].d = DBL_MIN;
Jeff Hao39b6c242015-05-19 20:30:23 -0700214 result = InvokeWithJValues(soa, receiver_ref.get(), soa.EncodeMethod(method), args);
Ian Rogers647b1a82014-10-10 11:02:11 -0700215 EXPECT_DOUBLE_EQ(DBL_MIN, result.GetD());
Ian Rogers53b8b092014-03-13 23:45:53 -0700216 }
217
218 void InvokeSumIntIntMethod(bool is_static) {
219 ScopedObjectAccess soa(env_);
Mathieu Chartiere401d142015-04-22 13:56:20 -0700220 ArtMethod* method;
Mathieu Chartier28bd2e42016-10-04 13:54:57 -0700221 ObjPtr<mirror::Object> receiver;
Ian Rogers53b8b092014-03-13 23:45:53 -0700222 ReflectionTestMakeExecutable(&method, &receiver, is_static, "sum", "(II)I");
Jeff Hao39b6c242015-05-19 20:30:23 -0700223 ScopedLocalRef<jobject> receiver_ref(soa.Env(), soa.AddLocalReference<jobject>(receiver));
Ian Rogers53b8b092014-03-13 23:45:53 -0700224 jvalue args[2];
225
226 args[0].i = 1;
227 args[1].i = 2;
Jeff Hao39b6c242015-05-19 20:30:23 -0700228 JValue 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 = -2;
232 args[1].i = 5;
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(3, result.GetI());
235
236 args[0].i = INT_MAX;
237 args[1].i = INT_MIN;
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(-1, result.GetI());
240
241 args[0].i = INT_MAX;
242 args[1].i = INT_MAX;
Jeff Hao39b6c242015-05-19 20:30:23 -0700243 result = InvokeWithJValues(soa, receiver_ref.get(), soa.EncodeMethod(method), args);
Ian Rogers53b8b092014-03-13 23:45:53 -0700244 EXPECT_EQ(-2, result.GetI());
245 }
246
247 void InvokeSumIntIntIntMethod(bool is_static) {
248 ScopedObjectAccess soa(env_);
Mathieu Chartiere401d142015-04-22 13:56:20 -0700249 ArtMethod* method;
Mathieu Chartier28bd2e42016-10-04 13:54:57 -0700250 ObjPtr<mirror::Object> receiver;
Ian Rogers53b8b092014-03-13 23:45:53 -0700251 ReflectionTestMakeExecutable(&method, &receiver, is_static, "sum", "(III)I");
Jeff Hao39b6c242015-05-19 20:30:23 -0700252 ScopedLocalRef<jobject> receiver_ref(soa.Env(), soa.AddLocalReference<jobject>(receiver));
Ian Rogers53b8b092014-03-13 23:45:53 -0700253 jvalue args[3];
254
255 args[0].i = 0;
256 args[1].i = 0;
257 args[2].i = 0;
Jeff Hao39b6c242015-05-19 20:30:23 -0700258 JValue result = InvokeWithJValues(soa, receiver_ref.get(), soa.EncodeMethod(method), args);
Ian Rogers53b8b092014-03-13 23:45:53 -0700259 EXPECT_EQ(0, result.GetI());
260
261 args[0].i = 1;
262 args[1].i = 2;
263 args[2].i = 3;
Jeff Hao39b6c242015-05-19 20:30:23 -0700264 result = InvokeWithJValues(soa, receiver_ref.get(), soa.EncodeMethod(method), args);
Ian Rogers53b8b092014-03-13 23:45:53 -0700265 EXPECT_EQ(6, result.GetI());
266
267 args[0].i = -1;
268 args[1].i = 2;
269 args[2].i = -3;
Jeff Hao39b6c242015-05-19 20:30:23 -0700270 result = InvokeWithJValues(soa, receiver_ref.get(), soa.EncodeMethod(method), args);
Ian Rogers53b8b092014-03-13 23:45:53 -0700271 EXPECT_EQ(-2, result.GetI());
272
273 args[0].i = INT_MAX;
274 args[1].i = INT_MIN;
275 args[2].i = INT_MAX;
Jeff Hao39b6c242015-05-19 20:30:23 -0700276 result = InvokeWithJValues(soa, receiver_ref.get(), soa.EncodeMethod(method), args);
Ian Rogers53b8b092014-03-13 23:45:53 -0700277 EXPECT_EQ(2147483646, result.GetI());
278
279 args[0].i = INT_MAX;
280 args[1].i = INT_MAX;
281 args[2].i = INT_MAX;
Jeff Hao39b6c242015-05-19 20:30:23 -0700282 result = InvokeWithJValues(soa, receiver_ref.get(), soa.EncodeMethod(method), args);
Ian Rogers53b8b092014-03-13 23:45:53 -0700283 EXPECT_EQ(2147483645, result.GetI());
284 }
285
286 void InvokeSumIntIntIntIntMethod(bool is_static) {
287 ScopedObjectAccess soa(env_);
Mathieu Chartiere401d142015-04-22 13:56:20 -0700288 ArtMethod* method;
Mathieu Chartier28bd2e42016-10-04 13:54:57 -0700289 ObjPtr<mirror::Object> receiver;
Ian Rogers53b8b092014-03-13 23:45:53 -0700290 ReflectionTestMakeExecutable(&method, &receiver, is_static, "sum", "(IIII)I");
Jeff Hao39b6c242015-05-19 20:30:23 -0700291 ScopedLocalRef<jobject> receiver_ref(soa.Env(), soa.AddLocalReference<jobject>(receiver));
Ian Rogers53b8b092014-03-13 23:45:53 -0700292 jvalue args[4];
293
294 args[0].i = 0;
295 args[1].i = 0;
296 args[2].i = 0;
297 args[3].i = 0;
Jeff Hao39b6c242015-05-19 20:30:23 -0700298 JValue result = InvokeWithJValues(soa, receiver_ref.get(), soa.EncodeMethod(method), args);
Ian Rogers53b8b092014-03-13 23:45:53 -0700299 EXPECT_EQ(0, result.GetI());
300
301 args[0].i = 1;
302 args[1].i = 2;
303 args[2].i = 3;
304 args[3].i = 4;
Jeff Hao39b6c242015-05-19 20:30:23 -0700305 result = InvokeWithJValues(soa, receiver_ref.get(), soa.EncodeMethod(method), args);
Ian Rogers53b8b092014-03-13 23:45:53 -0700306 EXPECT_EQ(10, result.GetI());
307
308 args[0].i = -1;
309 args[1].i = 2;
310 args[2].i = -3;
311 args[3].i = 4;
Jeff Hao39b6c242015-05-19 20:30:23 -0700312 result = InvokeWithJValues(soa, receiver_ref.get(), soa.EncodeMethod(method), args);
Ian Rogers53b8b092014-03-13 23:45:53 -0700313 EXPECT_EQ(2, result.GetI());
314
315 args[0].i = INT_MAX;
316 args[1].i = INT_MIN;
317 args[2].i = INT_MAX;
318 args[3].i = INT_MIN;
Jeff Hao39b6c242015-05-19 20:30:23 -0700319 result = InvokeWithJValues(soa, receiver_ref.get(), soa.EncodeMethod(method), args);
Ian Rogers53b8b092014-03-13 23:45:53 -0700320 EXPECT_EQ(-2, result.GetI());
321
322 args[0].i = INT_MAX;
323 args[1].i = INT_MAX;
324 args[2].i = INT_MAX;
325 args[3].i = INT_MAX;
Jeff Hao39b6c242015-05-19 20:30:23 -0700326 result = InvokeWithJValues(soa, receiver_ref.get(), soa.EncodeMethod(method), args);
Ian Rogers53b8b092014-03-13 23:45:53 -0700327 EXPECT_EQ(-4, result.GetI());
328 }
329
330 void InvokeSumIntIntIntIntIntMethod(bool is_static) {
331 ScopedObjectAccess soa(env_);
Mathieu Chartiere401d142015-04-22 13:56:20 -0700332 ArtMethod* method;
Mathieu Chartier28bd2e42016-10-04 13:54:57 -0700333 ObjPtr<mirror::Object> receiver;
Ian Rogers53b8b092014-03-13 23:45:53 -0700334 ReflectionTestMakeExecutable(&method, &receiver, is_static, "sum", "(IIIII)I");
Jeff Hao39b6c242015-05-19 20:30:23 -0700335 ScopedLocalRef<jobject> receiver_ref(soa.Env(), soa.AddLocalReference<jobject>(receiver));
Ian Rogers53b8b092014-03-13 23:45:53 -0700336 jvalue args[5];
337
338 args[0].i = 0;
339 args[1].i = 0;
340 args[2].i = 0;
341 args[3].i = 0;
342 args[4].i = 0;
Jeff Hao39b6c242015-05-19 20:30:23 -0700343 JValue result = InvokeWithJValues(soa, receiver_ref.get(), soa.EncodeMethod(method), args);
Ian Rogers53b8b092014-03-13 23:45:53 -0700344 EXPECT_EQ(0, result.GetI());
345
346 args[0].i = 1;
347 args[1].i = 2;
348 args[2].i = 3;
349 args[3].i = 4;
350 args[4].i = 5;
Jeff Hao39b6c242015-05-19 20:30:23 -0700351 result = InvokeWithJValues(soa, receiver_ref.get(), soa.EncodeMethod(method), args);
Ian Rogers53b8b092014-03-13 23:45:53 -0700352 EXPECT_EQ(15, result.GetI());
353
354 args[0].i = -1;
355 args[1].i = 2;
356 args[2].i = -3;
357 args[3].i = 4;
358 args[4].i = -5;
Jeff Hao39b6c242015-05-19 20:30:23 -0700359 result = InvokeWithJValues(soa, receiver_ref.get(), soa.EncodeMethod(method), args);
Ian Rogers53b8b092014-03-13 23:45:53 -0700360 EXPECT_EQ(-3, result.GetI());
361
362 args[0].i = INT_MAX;
363 args[1].i = INT_MIN;
364 args[2].i = INT_MAX;
365 args[3].i = INT_MIN;
366 args[4].i = INT_MAX;
Jeff Hao39b6c242015-05-19 20:30:23 -0700367 result = InvokeWithJValues(soa, receiver_ref.get(), soa.EncodeMethod(method), args);
Ian Rogers53b8b092014-03-13 23:45:53 -0700368 EXPECT_EQ(2147483645, result.GetI());
369
370 args[0].i = INT_MAX;
371 args[1].i = INT_MAX;
372 args[2].i = INT_MAX;
373 args[3].i = INT_MAX;
374 args[4].i = INT_MAX;
Jeff Hao39b6c242015-05-19 20:30:23 -0700375 result = InvokeWithJValues(soa, receiver_ref.get(), soa.EncodeMethod(method), args);
Ian Rogers53b8b092014-03-13 23:45:53 -0700376 EXPECT_EQ(2147483643, result.GetI());
377 }
378
379 void InvokeSumDoubleDoubleMethod(bool is_static) {
380 ScopedObjectAccess soa(env_);
Mathieu Chartiere401d142015-04-22 13:56:20 -0700381 ArtMethod* method;
Mathieu Chartier28bd2e42016-10-04 13:54:57 -0700382 ObjPtr<mirror::Object> receiver;
Ian Rogers53b8b092014-03-13 23:45:53 -0700383 ReflectionTestMakeExecutable(&method, &receiver, is_static, "sum", "(DD)D");
Jeff Hao39b6c242015-05-19 20:30:23 -0700384 ScopedLocalRef<jobject> receiver_ref(soa.Env(), soa.AddLocalReference<jobject>(receiver));
Ian Rogers53b8b092014-03-13 23:45:53 -0700385 jvalue args[2];
386
387 args[0].d = 0.0;
388 args[1].d = 0.0;
Jeff Hao39b6c242015-05-19 20:30:23 -0700389 JValue result = InvokeWithJValues(soa, receiver_ref.get(), soa.EncodeMethod(method), args);
Ian Rogers647b1a82014-10-10 11:02:11 -0700390 EXPECT_DOUBLE_EQ(0.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(3.0, result.GetD());
Ian Rogers53b8b092014-03-13 23:45:53 -0700396
397 args[0].d = 1.0;
398 args[1].d = -2.0;
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.0, result.GetD());
Ian Rogers53b8b092014-03-13 23:45:53 -0700401
402 args[0].d = DBL_MAX;
403 args[1].d = DBL_MIN;
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(1.7976931348623157e308, result.GetD());
Ian Rogers53b8b092014-03-13 23:45:53 -0700406
407 args[0].d = DBL_MAX;
408 args[1].d = DBL_MAX;
Jeff Hao39b6c242015-05-19 20:30:23 -0700409 result = InvokeWithJValues(soa, receiver_ref.get(), soa.EncodeMethod(method), args);
Ian Rogers647b1a82014-10-10 11:02:11 -0700410 EXPECT_DOUBLE_EQ(INFINITY, result.GetD());
Ian Rogers53b8b092014-03-13 23:45:53 -0700411 }
412
413 void InvokeSumDoubleDoubleDoubleMethod(bool is_static) {
414 ScopedObjectAccess soa(env_);
Mathieu Chartiere401d142015-04-22 13:56:20 -0700415 ArtMethod* method;
Mathieu Chartier28bd2e42016-10-04 13:54:57 -0700416 ObjPtr<mirror::Object> receiver;
Ian Rogers53b8b092014-03-13 23:45:53 -0700417 ReflectionTestMakeExecutable(&method, &receiver, is_static, "sum", "(DDD)D");
Jeff Hao39b6c242015-05-19 20:30:23 -0700418 ScopedLocalRef<jobject> receiver_ref(soa.Env(), soa.AddLocalReference<jobject>(receiver));
Ian Rogers53b8b092014-03-13 23:45:53 -0700419 jvalue args[3];
420
421 args[0].d = 0.0;
422 args[1].d = 0.0;
423 args[2].d = 0.0;
Jeff Hao39b6c242015-05-19 20:30:23 -0700424 JValue result = InvokeWithJValues(soa, receiver_ref.get(), soa.EncodeMethod(method), args);
Ian Rogers647b1a82014-10-10 11:02:11 -0700425 EXPECT_DOUBLE_EQ(0.0, result.GetD());
Ian Rogers53b8b092014-03-13 23:45:53 -0700426
427 args[0].d = 1.0;
428 args[1].d = 2.0;
429 args[2].d = 3.0;
Jeff Hao39b6c242015-05-19 20:30:23 -0700430 result = InvokeWithJValues(soa, receiver_ref.get(), soa.EncodeMethod(method), args);
Ian Rogers647b1a82014-10-10 11:02:11 -0700431 EXPECT_DOUBLE_EQ(6.0, result.GetD());
Ian Rogers53b8b092014-03-13 23:45:53 -0700432
433 args[0].d = 1.0;
434 args[1].d = -2.0;
435 args[2].d = 3.0;
Jeff Hao39b6c242015-05-19 20:30:23 -0700436 result = InvokeWithJValues(soa, receiver_ref.get(), soa.EncodeMethod(method), args);
Ian Rogers647b1a82014-10-10 11:02:11 -0700437 EXPECT_DOUBLE_EQ(2.0, result.GetD());
Ian Rogers53b8b092014-03-13 23:45:53 -0700438 }
439
440 void InvokeSumDoubleDoubleDoubleDoubleMethod(bool is_static) {
441 ScopedObjectAccess soa(env_);
Mathieu Chartiere401d142015-04-22 13:56:20 -0700442 ArtMethod* method;
Mathieu Chartier28bd2e42016-10-04 13:54:57 -0700443 ObjPtr<mirror::Object> receiver;
Ian Rogers53b8b092014-03-13 23:45:53 -0700444 ReflectionTestMakeExecutable(&method, &receiver, is_static, "sum", "(DDDD)D");
Jeff Hao39b6c242015-05-19 20:30:23 -0700445 ScopedLocalRef<jobject> receiver_ref(soa.Env(), soa.AddLocalReference<jobject>(receiver));
Ian Rogers53b8b092014-03-13 23:45:53 -0700446 jvalue args[4];
447
448 args[0].d = 0.0;
449 args[1].d = 0.0;
450 args[2].d = 0.0;
451 args[3].d = 0.0;
Jeff Hao39b6c242015-05-19 20:30:23 -0700452 JValue result = InvokeWithJValues(soa, receiver_ref.get(), soa.EncodeMethod(method), args);
Ian Rogers647b1a82014-10-10 11:02:11 -0700453 EXPECT_DOUBLE_EQ(0.0, result.GetD());
Ian Rogers53b8b092014-03-13 23:45:53 -0700454
455 args[0].d = 1.0;
456 args[1].d = 2.0;
457 args[2].d = 3.0;
458 args[3].d = 4.0;
Jeff Hao39b6c242015-05-19 20:30:23 -0700459 result = InvokeWithJValues(soa, receiver_ref.get(), soa.EncodeMethod(method), args);
Ian Rogers647b1a82014-10-10 11:02:11 -0700460 EXPECT_DOUBLE_EQ(10.0, result.GetD());
Ian Rogers53b8b092014-03-13 23:45:53 -0700461
462 args[0].d = 1.0;
463 args[1].d = -2.0;
464 args[2].d = 3.0;
465 args[3].d = -4.0;
Jeff Hao39b6c242015-05-19 20:30:23 -0700466 result = InvokeWithJValues(soa, receiver_ref.get(), soa.EncodeMethod(method), args);
Ian Rogers647b1a82014-10-10 11:02:11 -0700467 EXPECT_DOUBLE_EQ(-2.0, result.GetD());
Ian Rogers53b8b092014-03-13 23:45:53 -0700468 }
469
470 void InvokeSumDoubleDoubleDoubleDoubleDoubleMethod(bool is_static) {
471 ScopedObjectAccess soa(env_);
Mathieu Chartiere401d142015-04-22 13:56:20 -0700472 ArtMethod* method;
Mathieu Chartier28bd2e42016-10-04 13:54:57 -0700473 ObjPtr<mirror::Object> receiver;
Ian Rogers53b8b092014-03-13 23:45:53 -0700474 ReflectionTestMakeExecutable(&method, &receiver, is_static, "sum", "(DDDDD)D");
Jeff Hao39b6c242015-05-19 20:30:23 -0700475 ScopedLocalRef<jobject> receiver_ref(soa.Env(), soa.AddLocalReference<jobject>(receiver));
Ian Rogers53b8b092014-03-13 23:45:53 -0700476 jvalue args[5];
477
478 args[0].d = 0.0;
479 args[1].d = 0.0;
480 args[2].d = 0.0;
481 args[3].d = 0.0;
482 args[4].d = 0.0;
Jeff Hao39b6c242015-05-19 20:30:23 -0700483 JValue result = InvokeWithJValues(soa, receiver_ref.get(), soa.EncodeMethod(method), args);
Ian Rogers647b1a82014-10-10 11:02:11 -0700484 EXPECT_DOUBLE_EQ(0.0, result.GetD());
Ian Rogers53b8b092014-03-13 23:45:53 -0700485
486 args[0].d = 1.0;
487 args[1].d = 2.0;
488 args[2].d = 3.0;
489 args[3].d = 4.0;
490 args[4].d = 5.0;
Jeff Hao39b6c242015-05-19 20:30:23 -0700491 result = InvokeWithJValues(soa, receiver_ref.get(), soa.EncodeMethod(method), args);
Ian Rogers647b1a82014-10-10 11:02:11 -0700492 EXPECT_DOUBLE_EQ(15.0, result.GetD());
Ian Rogers53b8b092014-03-13 23:45:53 -0700493
494 args[0].d = 1.0;
495 args[1].d = -2.0;
496 args[2].d = 3.0;
497 args[3].d = -4.0;
498 args[4].d = 5.0;
Jeff Hao39b6c242015-05-19 20:30:23 -0700499 result = InvokeWithJValues(soa, receiver_ref.get(), soa.EncodeMethod(method), args);
Ian Rogers647b1a82014-10-10 11:02:11 -0700500 EXPECT_DOUBLE_EQ(3.0, result.GetD());
Ian Rogers53b8b092014-03-13 23:45:53 -0700501 }
502
503 JavaVMExt* vm_;
504 JNIEnv* env_;
505 jclass aioobe_;
506 jclass ase_;
507 jclass sioobe_;
508};
509
510TEST_F(ReflectionTest, StaticMainMethod) {
Roland Levillain0d5a2812015-11-13 10:07:31 +0000511 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(
Mathieu Chartier0795f232016-09-27 18:43:30 -0700516 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
Andreas Gampe542451c2016-07-26 09:02:02 -0700522 ArtMethod* method = klass->FindDirectMethod("main",
523 "([Ljava/lang/String;)V",
524 kRuntimePointerSize);
Mathieu Chartier2cebb242015-04-21 16:50:40 -0700525 ASSERT_TRUE(method != nullptr);
Ian Rogers53b8b092014-03-13 23:45:53 -0700526
527 // Start runtime.
528 bool started = runtime_->Start();
529 CHECK(started);
530 soa.Self()->TransitionFromSuspendedToRunnable();
531
532 jvalue args[1];
533 args[0].l = nullptr;
534 InvokeWithJValues(soa, nullptr, soa.EncodeMethod(method), args);
535}
536
537TEST_F(ReflectionTest, StaticNopMethod) {
Ian Rogers53b8b092014-03-13 23:45:53 -0700538 InvokeNopMethod(true);
539}
540
541TEST_F(ReflectionTest, NonStaticNopMethod) {
Ian Rogers53b8b092014-03-13 23:45:53 -0700542 InvokeNopMethod(false);
543}
544
545TEST_F(ReflectionTest, StaticIdentityByteMethod) {
Ian Rogers53b8b092014-03-13 23:45:53 -0700546 InvokeIdentityByteMethod(true);
547}
548
549TEST_F(ReflectionTest, NonStaticIdentityByteMethod) {
Ian Rogers53b8b092014-03-13 23:45:53 -0700550 InvokeIdentityByteMethod(false);
551}
552
553TEST_F(ReflectionTest, StaticIdentityIntMethod) {
Ian Rogers53b8b092014-03-13 23:45:53 -0700554 InvokeIdentityIntMethod(true);
555}
556
557TEST_F(ReflectionTest, NonStaticIdentityIntMethod) {
Ian Rogers53b8b092014-03-13 23:45:53 -0700558 InvokeIdentityIntMethod(false);
559}
560
561TEST_F(ReflectionTest, StaticIdentityDoubleMethod) {
Ian Rogers53b8b092014-03-13 23:45:53 -0700562 InvokeIdentityDoubleMethod(true);
563}
564
565TEST_F(ReflectionTest, NonStaticIdentityDoubleMethod) {
Ian Rogers53b8b092014-03-13 23:45:53 -0700566 InvokeIdentityDoubleMethod(false);
567}
568
569TEST_F(ReflectionTest, StaticSumIntIntMethod) {
Ian Rogers53b8b092014-03-13 23:45:53 -0700570 InvokeSumIntIntMethod(true);
571}
572
573TEST_F(ReflectionTest, NonStaticSumIntIntMethod) {
Ian Rogers53b8b092014-03-13 23:45:53 -0700574 InvokeSumIntIntMethod(false);
575}
576
577TEST_F(ReflectionTest, StaticSumIntIntIntMethod) {
Ian Rogers53b8b092014-03-13 23:45:53 -0700578 InvokeSumIntIntIntMethod(true);
579}
580
581TEST_F(ReflectionTest, NonStaticSumIntIntIntMethod) {
Ian Rogers53b8b092014-03-13 23:45:53 -0700582 InvokeSumIntIntIntMethod(false);
583}
584
585TEST_F(ReflectionTest, StaticSumIntIntIntIntMethod) {
Ian Rogers53b8b092014-03-13 23:45:53 -0700586 InvokeSumIntIntIntIntMethod(true);
587}
588
589TEST_F(ReflectionTest, NonStaticSumIntIntIntIntMethod) {
Ian Rogers53b8b092014-03-13 23:45:53 -0700590 InvokeSumIntIntIntIntMethod(false);
591}
592
593TEST_F(ReflectionTest, StaticSumIntIntIntIntIntMethod) {
Ian Rogers53b8b092014-03-13 23:45:53 -0700594 InvokeSumIntIntIntIntIntMethod(true);
595}
596
597TEST_F(ReflectionTest, NonStaticSumIntIntIntIntIntMethod) {
Ian Rogers53b8b092014-03-13 23:45:53 -0700598 InvokeSumIntIntIntIntIntMethod(false);
599}
600
601TEST_F(ReflectionTest, StaticSumDoubleDoubleMethod) {
Ian Rogers53b8b092014-03-13 23:45:53 -0700602 InvokeSumDoubleDoubleMethod(true);
603}
604
605TEST_F(ReflectionTest, NonStaticSumDoubleDoubleMethod) {
Ian Rogers53b8b092014-03-13 23:45:53 -0700606 InvokeSumDoubleDoubleMethod(false);
607}
608
609TEST_F(ReflectionTest, StaticSumDoubleDoubleDoubleMethod) {
Ian Rogers53b8b092014-03-13 23:45:53 -0700610 InvokeSumDoubleDoubleDoubleMethod(true);
611}
612
613TEST_F(ReflectionTest, NonStaticSumDoubleDoubleDoubleMethod) {
Ian Rogers53b8b092014-03-13 23:45:53 -0700614 InvokeSumDoubleDoubleDoubleMethod(false);
615}
616
617TEST_F(ReflectionTest, StaticSumDoubleDoubleDoubleDoubleMethod) {
Ian Rogers53b8b092014-03-13 23:45:53 -0700618 InvokeSumDoubleDoubleDoubleDoubleMethod(true);
619}
620
621TEST_F(ReflectionTest, NonStaticSumDoubleDoubleDoubleDoubleMethod) {
Ian Rogers53b8b092014-03-13 23:45:53 -0700622 InvokeSumDoubleDoubleDoubleDoubleMethod(false);
623}
624
625TEST_F(ReflectionTest, StaticSumDoubleDoubleDoubleDoubleDoubleMethod) {
Ian Rogers53b8b092014-03-13 23:45:53 -0700626 InvokeSumDoubleDoubleDoubleDoubleDoubleMethod(true);
627}
628
629TEST_F(ReflectionTest, NonStaticSumDoubleDoubleDoubleDoubleDoubleMethod) {
Ian Rogers53b8b092014-03-13 23:45:53 -0700630 InvokeSumDoubleDoubleDoubleDoubleDoubleMethod(false);
631}
632
633} // namespace art