blob: 8a7685578ed0bcb4037d1cc6b07498eacfd99996 [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 Rogers53b8b092014-03-13 23:45:53 -070021
Mathieu Chartiere401d142015-04-22 13:56:20 -070022#include "art_method-inl.h"
Andreas Gampe542451c2016-07-26 09:02:02 -070023#include "base/enums.h"
Ian Rogers53b8b092014-03-13 23:45:53 -070024#include "common_compiler_test.h"
David Sehrb2ec9f52018-02-21 13:20:31 -080025#include "dex/descriptors_names.h"
Vladimir Markoa3ad0cd2018-05-04 10:06:38 +010026#include "jni/java_vm_ext.h"
27#include "jni/jni_internal.h"
Andreas Gampe70f5fd02018-10-24 19:58:37 -070028#include "mirror/class-alloc-inl.h"
Andreas Gampe373a9b52017-10-18 09:01:57 -070029#include "nativehelper/scoped_local_ref.h"
Mathieu Chartier0795f232016-09-27 18:43:30 -070030#include "scoped_thread_state_change-inl.h"
Ian Rogers53b8b092014-03-13 23:45:53 -070031
32namespace art {
33
Vladimir Marko2b076df2019-02-20 11:27:52 +000034// TODO: Convert to CommonRuntimeTest. Currently CompileDirectMethod is used in one test.
Ian Rogers53b8b092014-03-13 23:45:53 -070035class ReflectionTest : public CommonCompilerTest {
36 protected:
Andreas Gampefa6a1b02018-09-07 08:11:55 -070037 void SetUp() override {
Ian Rogers53b8b092014-03-13 23:45:53 -070038 CommonCompilerTest::SetUp();
39
40 vm_ = Runtime::Current()->GetJavaVM();
41
42 // Turn on -verbose:jni for the JNI tests.
43 // gLogVerbosity.jni = true;
44
Mathieu Chartier2cebb242015-04-21 16:50:40 -070045 vm_->AttachCurrentThread(&env_, nullptr);
Ian Rogers53b8b092014-03-13 23:45:53 -070046
47 ScopedLocalRef<jclass> aioobe(env_,
48 env_->FindClass("java/lang/ArrayIndexOutOfBoundsException"));
Mathieu Chartier2cebb242015-04-21 16:50:40 -070049 CHECK(aioobe.get() != nullptr);
Ian Rogers53b8b092014-03-13 23:45:53 -070050 aioobe_ = reinterpret_cast<jclass>(env_->NewGlobalRef(aioobe.get()));
51
52 ScopedLocalRef<jclass> ase(env_, env_->FindClass("java/lang/ArrayStoreException"));
Mathieu Chartier2cebb242015-04-21 16:50:40 -070053 CHECK(ase.get() != nullptr);
Ian Rogers53b8b092014-03-13 23:45:53 -070054 ase_ = reinterpret_cast<jclass>(env_->NewGlobalRef(ase.get()));
55
56 ScopedLocalRef<jclass> sioobe(env_,
57 env_->FindClass("java/lang/StringIndexOutOfBoundsException"));
Mathieu Chartier2cebb242015-04-21 16:50:40 -070058 CHECK(sioobe.get() != nullptr);
Ian Rogers53b8b092014-03-13 23:45:53 -070059 sioobe_ = reinterpret_cast<jclass>(env_->NewGlobalRef(sioobe.get()));
60 }
61
62 void CleanUpJniEnv() {
Mathieu Chartier2cebb242015-04-21 16:50:40 -070063 if (aioobe_ != nullptr) {
Ian Rogers53b8b092014-03-13 23:45:53 -070064 env_->DeleteGlobalRef(aioobe_);
Mathieu Chartier2cebb242015-04-21 16:50:40 -070065 aioobe_ = nullptr;
Ian Rogers53b8b092014-03-13 23:45:53 -070066 }
Mathieu Chartier2cebb242015-04-21 16:50:40 -070067 if (ase_ != nullptr) {
Ian Rogers53b8b092014-03-13 23:45:53 -070068 env_->DeleteGlobalRef(ase_);
Mathieu Chartier2cebb242015-04-21 16:50:40 -070069 ase_ = nullptr;
Ian Rogers53b8b092014-03-13 23:45:53 -070070 }
Mathieu Chartier2cebb242015-04-21 16:50:40 -070071 if (sioobe_ != nullptr) {
Ian Rogers53b8b092014-03-13 23:45:53 -070072 env_->DeleteGlobalRef(sioobe_);
Mathieu Chartier2cebb242015-04-21 16:50:40 -070073 sioobe_ = nullptr;
Ian Rogers53b8b092014-03-13 23:45:53 -070074 }
75 }
76
Andreas Gampefa6a1b02018-09-07 08:11:55 -070077 void TearDown() override {
Ian Rogers53b8b092014-03-13 23:45:53 -070078 CleanUpJniEnv();
79 CommonCompilerTest::TearDown();
80 }
81
82 jclass GetPrimitiveClass(char descriptor) {
83 ScopedObjectAccess soa(env_);
Vladimir Markoa8bba7d2018-05-30 15:18:48 +010084 ObjPtr<mirror::Class> c = class_linker_->FindPrimitiveClass(descriptor);
Ian Rogers53b8b092014-03-13 23:45:53 -070085 CHECK(c != nullptr);
86 return soa.AddLocalReference<jclass>(c);
87 }
88
Vladimir Marko2b076df2019-02-20 11:27:52 +000089 void ReflectionTestMakeInterpreted(ArtMethod** method,
90 ObjPtr<mirror::Object>* receiver,
91 bool is_static,
92 const char* method_name,
93 const char* method_signature)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -070094 REQUIRES_SHARED(Locks::mutator_lock_) {
Ian Rogers53b8b092014-03-13 23:45:53 -070095 const char* class_name = is_static ? "StaticLeafMethods" : "NonStaticLeafMethods";
96 jobject jclass_loader(LoadDex(class_name));
97 Thread* self = Thread::Current();
Mathieu Chartier28bd2e42016-10-04 13:54:57 -070098 StackHandleScope<3> hs(self);
Mathieu Chartiereb8167a2014-05-07 15:43:14 -070099 Handle<mirror::ClassLoader> class_loader(
100 hs.NewHandle(
Mathieu Chartier0795f232016-09-27 18:43:30 -0700101 ScopedObjectAccessUnchecked(self).Decode<mirror::ClassLoader>(jclass_loader)));
102 if (!is_static) {
Vladimir Marko2b076df2019-02-20 11:27:52 +0000103 MakeInterpreted(class_linker_->FindSystemClass(self, "Ljava/lang/Class;"));
104 MakeInterpreted(class_linker_->FindSystemClass(self, "Ljava/lang/Object;"));
Ian Rogers53b8b092014-03-13 23:45:53 -0700105 }
106
Mathieu Chartier28bd2e42016-10-04 13:54:57 -0700107 ObjPtr<mirror::Class> c = class_linker_->FindClass(self,
108 DotToDescriptor(class_name).c_str(),
109 class_loader);
Mathieu Chartier2cebb242015-04-21 16:50:40 -0700110 CHECK(c != nullptr);
Vladimir Marko2b076df2019-02-20 11:27:52 +0000111 MakeInterpreted(c);
Ian Rogers53b8b092014-03-13 23:45:53 -0700112
Vladimir Markoba118822017-06-12 15:41:56 +0100113 *method = c->FindClassMethod(method_name, method_signature, kRuntimePointerSize);
114 CHECK(*method != nullptr);
115 CHECK_EQ(is_static, (*method)->IsStatic());
Ian Rogers53b8b092014-03-13 23:45:53 -0700116
Sebastien Hertz4e99b3d2014-06-24 14:35:40 +0200117 if (is_static) {
118 *receiver = nullptr;
119 } else {
120 // Ensure class is initialized before allocating object
Mathieu Chartier28bd2e42016-10-04 13:54:57 -0700121 {
122 StackHandleScope<1> hs2(self);
123 HandleWrapperObjPtr<mirror::Class> h_class(hs2.NewHandleWrapper(&c));
124 bool initialized = class_linker_->EnsureInitialized(self, h_class, true, true);
125 CHECK(initialized);
126 }
Sebastien Hertz4e99b3d2014-06-24 14:35:40 +0200127 *receiver = c->AllocObject(self);
128 }
Ian Rogers53b8b092014-03-13 23:45:53 -0700129
130 // Start runtime.
Mathieu Chartier28bd2e42016-10-04 13:54:57 -0700131 HandleWrapperObjPtr<mirror::Object> h(hs.NewHandleWrapper(receiver));
Ian Rogers53b8b092014-03-13 23:45:53 -0700132 bool started = runtime_->Start();
133 CHECK(started);
134 self->TransitionFromSuspendedToRunnable();
135 }
136
137 void InvokeNopMethod(bool is_static) {
138 ScopedObjectAccess soa(env_);
Mathieu Chartiere401d142015-04-22 13:56:20 -0700139 ArtMethod* method;
Mathieu Chartier28bd2e42016-10-04 13:54:57 -0700140 ObjPtr<mirror::Object> receiver;
Vladimir Marko2b076df2019-02-20 11:27:52 +0000141 ReflectionTestMakeInterpreted(&method, &receiver, is_static, "nop", "()V");
Jeff Hao39b6c242015-05-19 20:30:23 -0700142 ScopedLocalRef<jobject> receiver_ref(soa.Env(), soa.AddLocalReference<jobject>(receiver));
Andreas Gampe13b27842016-11-07 16:48:23 -0800143 InvokeWithJValues(soa, receiver_ref.get(), jni::EncodeArtMethod(method), nullptr);
Ian Rogers53b8b092014-03-13 23:45:53 -0700144 }
145
146 void InvokeIdentityByteMethod(bool is_static) {
147 ScopedObjectAccess soa(env_);
Mathieu Chartiere401d142015-04-22 13:56:20 -0700148 ArtMethod* method;
Mathieu Chartier28bd2e42016-10-04 13:54:57 -0700149 ObjPtr<mirror::Object> receiver;
Vladimir Marko2b076df2019-02-20 11:27:52 +0000150 ReflectionTestMakeInterpreted(&method, &receiver, is_static, "identity", "(B)B");
Jeff Hao39b6c242015-05-19 20:30:23 -0700151 ScopedLocalRef<jobject> receiver_ref(soa.Env(), soa.AddLocalReference<jobject>(receiver));
Ian Rogers53b8b092014-03-13 23:45:53 -0700152 jvalue args[1];
153
154 args[0].b = 0;
Andreas Gampe13b27842016-11-07 16:48:23 -0800155 JValue result = InvokeWithJValues(soa, receiver_ref.get(), jni::EncodeArtMethod(method), args);
Ian Rogers53b8b092014-03-13 23:45:53 -0700156 EXPECT_EQ(0, result.GetB());
157
158 args[0].b = -1;
Andreas Gampe13b27842016-11-07 16:48:23 -0800159 result = InvokeWithJValues(soa, receiver_ref.get(), jni::EncodeArtMethod(method), args);
Ian Rogers53b8b092014-03-13 23:45:53 -0700160 EXPECT_EQ(-1, result.GetB());
161
162 args[0].b = SCHAR_MAX;
Andreas Gampe13b27842016-11-07 16:48:23 -0800163 result = InvokeWithJValues(soa, receiver_ref.get(), jni::EncodeArtMethod(method), args);
Ian Rogers53b8b092014-03-13 23:45:53 -0700164 EXPECT_EQ(SCHAR_MAX, result.GetB());
165
Andreas Gampe58554b72015-10-20 21:08:52 -0700166 static_assert(SCHAR_MIN == -128, "SCHAR_MIN unexpected");
167 args[0].b = SCHAR_MIN;
Andreas Gampe13b27842016-11-07 16:48:23 -0800168 result = InvokeWithJValues(soa, receiver_ref.get(), jni::EncodeArtMethod(method), args);
Ian Rogers53b8b092014-03-13 23:45:53 -0700169 EXPECT_EQ(SCHAR_MIN, result.GetB());
170 }
171
172 void InvokeIdentityIntMethod(bool is_static) {
173 ScopedObjectAccess soa(env_);
Mathieu Chartiere401d142015-04-22 13:56:20 -0700174 ArtMethod* method;
Mathieu Chartier28bd2e42016-10-04 13:54:57 -0700175 ObjPtr<mirror::Object> receiver;
Vladimir Marko2b076df2019-02-20 11:27:52 +0000176 ReflectionTestMakeInterpreted(&method, &receiver, is_static, "identity", "(I)I");
Jeff Hao39b6c242015-05-19 20:30:23 -0700177 ScopedLocalRef<jobject> receiver_ref(soa.Env(), soa.AddLocalReference<jobject>(receiver));
Ian Rogers53b8b092014-03-13 23:45:53 -0700178 jvalue args[1];
179
180 args[0].i = 0;
Andreas Gampe13b27842016-11-07 16:48:23 -0800181 JValue result = InvokeWithJValues(soa, receiver_ref.get(), jni::EncodeArtMethod(method), args);
Ian Rogers53b8b092014-03-13 23:45:53 -0700182 EXPECT_EQ(0, result.GetI());
183
184 args[0].i = -1;
Andreas Gampe13b27842016-11-07 16:48:23 -0800185 result = InvokeWithJValues(soa, receiver_ref.get(), jni::EncodeArtMethod(method), args);
Ian Rogers53b8b092014-03-13 23:45:53 -0700186 EXPECT_EQ(-1, result.GetI());
187
188 args[0].i = INT_MAX;
Andreas Gampe13b27842016-11-07 16:48:23 -0800189 result = InvokeWithJValues(soa, receiver_ref.get(), jni::EncodeArtMethod(method), args);
Ian Rogers53b8b092014-03-13 23:45:53 -0700190 EXPECT_EQ(INT_MAX, result.GetI());
191
192 args[0].i = INT_MIN;
Andreas Gampe13b27842016-11-07 16:48:23 -0800193 result = InvokeWithJValues(soa, receiver_ref.get(), jni::EncodeArtMethod(method), args);
Ian Rogers53b8b092014-03-13 23:45:53 -0700194 EXPECT_EQ(INT_MIN, result.GetI());
195 }
196
197 void InvokeIdentityDoubleMethod(bool is_static) {
198 ScopedObjectAccess soa(env_);
Mathieu Chartiere401d142015-04-22 13:56:20 -0700199 ArtMethod* method;
Mathieu Chartier28bd2e42016-10-04 13:54:57 -0700200 ObjPtr<mirror::Object> receiver;
Vladimir Marko2b076df2019-02-20 11:27:52 +0000201 ReflectionTestMakeInterpreted(&method, &receiver, is_static, "identity", "(D)D");
Jeff Hao39b6c242015-05-19 20:30:23 -0700202 ScopedLocalRef<jobject> receiver_ref(soa.Env(), soa.AddLocalReference<jobject>(receiver));
Ian Rogers53b8b092014-03-13 23:45:53 -0700203 jvalue args[1];
204
205 args[0].d = 0.0;
Andreas Gampe13b27842016-11-07 16:48:23 -0800206 JValue result = InvokeWithJValues(soa, receiver_ref.get(), jni::EncodeArtMethod(method), args);
Ian Rogers647b1a82014-10-10 11:02:11 -0700207 EXPECT_DOUBLE_EQ(0.0, result.GetD());
Ian Rogers53b8b092014-03-13 23:45:53 -0700208
209 args[0].d = -1.0;
Andreas Gampe13b27842016-11-07 16:48:23 -0800210 result = InvokeWithJValues(soa, receiver_ref.get(), jni::EncodeArtMethod(method), args);
Ian Rogers647b1a82014-10-10 11:02:11 -0700211 EXPECT_DOUBLE_EQ(-1.0, result.GetD());
Ian Rogers53b8b092014-03-13 23:45:53 -0700212
213 args[0].d = DBL_MAX;
Andreas Gampe13b27842016-11-07 16:48:23 -0800214 result = InvokeWithJValues(soa, receiver_ref.get(), jni::EncodeArtMethod(method), args);
Ian Rogers647b1a82014-10-10 11:02:11 -0700215 EXPECT_DOUBLE_EQ(DBL_MAX, result.GetD());
Ian Rogers53b8b092014-03-13 23:45:53 -0700216
217 args[0].d = DBL_MIN;
Andreas Gampe13b27842016-11-07 16:48:23 -0800218 result = InvokeWithJValues(soa, receiver_ref.get(), jni::EncodeArtMethod(method), args);
Ian Rogers647b1a82014-10-10 11:02:11 -0700219 EXPECT_DOUBLE_EQ(DBL_MIN, result.GetD());
Ian Rogers53b8b092014-03-13 23:45:53 -0700220 }
221
222 void InvokeSumIntIntMethod(bool is_static) {
223 ScopedObjectAccess soa(env_);
Mathieu Chartiere401d142015-04-22 13:56:20 -0700224 ArtMethod* method;
Mathieu Chartier28bd2e42016-10-04 13:54:57 -0700225 ObjPtr<mirror::Object> receiver;
Vladimir Marko2b076df2019-02-20 11:27:52 +0000226 ReflectionTestMakeInterpreted(&method, &receiver, is_static, "sum", "(II)I");
Jeff Hao39b6c242015-05-19 20:30:23 -0700227 ScopedLocalRef<jobject> receiver_ref(soa.Env(), soa.AddLocalReference<jobject>(receiver));
Ian Rogers53b8b092014-03-13 23:45:53 -0700228 jvalue args[2];
229
230 args[0].i = 1;
231 args[1].i = 2;
Andreas Gampe13b27842016-11-07 16:48:23 -0800232 JValue result = InvokeWithJValues(soa, receiver_ref.get(), jni::EncodeArtMethod(method), args);
Ian Rogers53b8b092014-03-13 23:45:53 -0700233 EXPECT_EQ(3, result.GetI());
234
235 args[0].i = -2;
236 args[1].i = 5;
Andreas Gampe13b27842016-11-07 16:48:23 -0800237 result = InvokeWithJValues(soa, receiver_ref.get(), jni::EncodeArtMethod(method), args);
Ian Rogers53b8b092014-03-13 23:45:53 -0700238 EXPECT_EQ(3, result.GetI());
239
240 args[0].i = INT_MAX;
241 args[1].i = INT_MIN;
Andreas Gampe13b27842016-11-07 16:48:23 -0800242 result = InvokeWithJValues(soa, receiver_ref.get(), jni::EncodeArtMethod(method), args);
Ian Rogers53b8b092014-03-13 23:45:53 -0700243 EXPECT_EQ(-1, result.GetI());
244
245 args[0].i = INT_MAX;
246 args[1].i = INT_MAX;
Andreas Gampe13b27842016-11-07 16:48:23 -0800247 result = InvokeWithJValues(soa, receiver_ref.get(), jni::EncodeArtMethod(method), args);
Ian Rogers53b8b092014-03-13 23:45:53 -0700248 EXPECT_EQ(-2, result.GetI());
249 }
250
251 void InvokeSumIntIntIntMethod(bool is_static) {
252 ScopedObjectAccess soa(env_);
Mathieu Chartiere401d142015-04-22 13:56:20 -0700253 ArtMethod* method;
Mathieu Chartier28bd2e42016-10-04 13:54:57 -0700254 ObjPtr<mirror::Object> receiver;
Vladimir Marko2b076df2019-02-20 11:27:52 +0000255 ReflectionTestMakeInterpreted(&method, &receiver, is_static, "sum", "(III)I");
Jeff Hao39b6c242015-05-19 20:30:23 -0700256 ScopedLocalRef<jobject> receiver_ref(soa.Env(), soa.AddLocalReference<jobject>(receiver));
Ian Rogers53b8b092014-03-13 23:45:53 -0700257 jvalue args[3];
258
259 args[0].i = 0;
260 args[1].i = 0;
261 args[2].i = 0;
Andreas Gampe13b27842016-11-07 16:48:23 -0800262 JValue result = InvokeWithJValues(soa, receiver_ref.get(), jni::EncodeArtMethod(method), args);
Ian Rogers53b8b092014-03-13 23:45:53 -0700263 EXPECT_EQ(0, result.GetI());
264
265 args[0].i = 1;
266 args[1].i = 2;
267 args[2].i = 3;
Andreas Gampe13b27842016-11-07 16:48:23 -0800268 result = InvokeWithJValues(soa, receiver_ref.get(), jni::EncodeArtMethod(method), args);
Ian Rogers53b8b092014-03-13 23:45:53 -0700269 EXPECT_EQ(6, result.GetI());
270
271 args[0].i = -1;
272 args[1].i = 2;
273 args[2].i = -3;
Andreas Gampe13b27842016-11-07 16:48:23 -0800274 result = InvokeWithJValues(soa, receiver_ref.get(), jni::EncodeArtMethod(method), args);
Ian Rogers53b8b092014-03-13 23:45:53 -0700275 EXPECT_EQ(-2, result.GetI());
276
277 args[0].i = INT_MAX;
278 args[1].i = INT_MIN;
279 args[2].i = INT_MAX;
Andreas Gampe13b27842016-11-07 16:48:23 -0800280 result = InvokeWithJValues(soa, receiver_ref.get(), jni::EncodeArtMethod(method), args);
Ian Rogers53b8b092014-03-13 23:45:53 -0700281 EXPECT_EQ(2147483646, result.GetI());
282
283 args[0].i = INT_MAX;
284 args[1].i = INT_MAX;
285 args[2].i = INT_MAX;
Andreas Gampe13b27842016-11-07 16:48:23 -0800286 result = InvokeWithJValues(soa, receiver_ref.get(), jni::EncodeArtMethod(method), args);
Ian Rogers53b8b092014-03-13 23:45:53 -0700287 EXPECT_EQ(2147483645, result.GetI());
288 }
289
290 void InvokeSumIntIntIntIntMethod(bool is_static) {
291 ScopedObjectAccess soa(env_);
Mathieu Chartiere401d142015-04-22 13:56:20 -0700292 ArtMethod* method;
Mathieu Chartier28bd2e42016-10-04 13:54:57 -0700293 ObjPtr<mirror::Object> receiver;
Vladimir Marko2b076df2019-02-20 11:27:52 +0000294 ReflectionTestMakeInterpreted(&method, &receiver, is_static, "sum", "(IIII)I");
Jeff Hao39b6c242015-05-19 20:30:23 -0700295 ScopedLocalRef<jobject> receiver_ref(soa.Env(), soa.AddLocalReference<jobject>(receiver));
Ian Rogers53b8b092014-03-13 23:45:53 -0700296 jvalue args[4];
297
298 args[0].i = 0;
299 args[1].i = 0;
300 args[2].i = 0;
301 args[3].i = 0;
Andreas Gampe13b27842016-11-07 16:48:23 -0800302 JValue result = InvokeWithJValues(soa, receiver_ref.get(), jni::EncodeArtMethod(method), args);
Ian Rogers53b8b092014-03-13 23:45:53 -0700303 EXPECT_EQ(0, result.GetI());
304
305 args[0].i = 1;
306 args[1].i = 2;
307 args[2].i = 3;
308 args[3].i = 4;
Andreas Gampe13b27842016-11-07 16:48:23 -0800309 result = InvokeWithJValues(soa, receiver_ref.get(), jni::EncodeArtMethod(method), args);
Ian Rogers53b8b092014-03-13 23:45:53 -0700310 EXPECT_EQ(10, result.GetI());
311
312 args[0].i = -1;
313 args[1].i = 2;
314 args[2].i = -3;
315 args[3].i = 4;
Andreas Gampe13b27842016-11-07 16:48:23 -0800316 result = InvokeWithJValues(soa, receiver_ref.get(), jni::EncodeArtMethod(method), args);
Ian Rogers53b8b092014-03-13 23:45:53 -0700317 EXPECT_EQ(2, result.GetI());
318
319 args[0].i = INT_MAX;
320 args[1].i = INT_MIN;
321 args[2].i = INT_MAX;
322 args[3].i = INT_MIN;
Andreas Gampe13b27842016-11-07 16:48:23 -0800323 result = InvokeWithJValues(soa, receiver_ref.get(), jni::EncodeArtMethod(method), args);
Ian Rogers53b8b092014-03-13 23:45:53 -0700324 EXPECT_EQ(-2, result.GetI());
325
326 args[0].i = INT_MAX;
327 args[1].i = INT_MAX;
328 args[2].i = INT_MAX;
329 args[3].i = INT_MAX;
Andreas Gampe13b27842016-11-07 16:48:23 -0800330 result = InvokeWithJValues(soa, receiver_ref.get(), jni::EncodeArtMethod(method), args);
Ian Rogers53b8b092014-03-13 23:45:53 -0700331 EXPECT_EQ(-4, result.GetI());
332 }
333
334 void InvokeSumIntIntIntIntIntMethod(bool is_static) {
335 ScopedObjectAccess soa(env_);
Mathieu Chartiere401d142015-04-22 13:56:20 -0700336 ArtMethod* method;
Mathieu Chartier28bd2e42016-10-04 13:54:57 -0700337 ObjPtr<mirror::Object> receiver;
Vladimir Marko2b076df2019-02-20 11:27:52 +0000338 ReflectionTestMakeInterpreted(&method, &receiver, is_static, "sum", "(IIIII)I");
Jeff Hao39b6c242015-05-19 20:30:23 -0700339 ScopedLocalRef<jobject> receiver_ref(soa.Env(), soa.AddLocalReference<jobject>(receiver));
Ian Rogers53b8b092014-03-13 23:45:53 -0700340 jvalue args[5];
341
342 args[0].i = 0;
343 args[1].i = 0;
344 args[2].i = 0;
345 args[3].i = 0;
346 args[4].i = 0;
Andreas Gampe13b27842016-11-07 16:48:23 -0800347 JValue result = InvokeWithJValues(soa, receiver_ref.get(), jni::EncodeArtMethod(method), args);
Ian Rogers53b8b092014-03-13 23:45:53 -0700348 EXPECT_EQ(0, result.GetI());
349
350 args[0].i = 1;
351 args[1].i = 2;
352 args[2].i = 3;
353 args[3].i = 4;
354 args[4].i = 5;
Andreas Gampe13b27842016-11-07 16:48:23 -0800355 result = InvokeWithJValues(soa, receiver_ref.get(), jni::EncodeArtMethod(method), args);
Ian Rogers53b8b092014-03-13 23:45:53 -0700356 EXPECT_EQ(15, result.GetI());
357
358 args[0].i = -1;
359 args[1].i = 2;
360 args[2].i = -3;
361 args[3].i = 4;
362 args[4].i = -5;
Andreas Gampe13b27842016-11-07 16:48:23 -0800363 result = InvokeWithJValues(soa, receiver_ref.get(), jni::EncodeArtMethod(method), args);
Ian Rogers53b8b092014-03-13 23:45:53 -0700364 EXPECT_EQ(-3, result.GetI());
365
366 args[0].i = INT_MAX;
367 args[1].i = INT_MIN;
368 args[2].i = INT_MAX;
369 args[3].i = INT_MIN;
370 args[4].i = INT_MAX;
Andreas Gampe13b27842016-11-07 16:48:23 -0800371 result = InvokeWithJValues(soa, receiver_ref.get(), jni::EncodeArtMethod(method), args);
Ian Rogers53b8b092014-03-13 23:45:53 -0700372 EXPECT_EQ(2147483645, result.GetI());
373
374 args[0].i = INT_MAX;
375 args[1].i = INT_MAX;
376 args[2].i = INT_MAX;
377 args[3].i = INT_MAX;
378 args[4].i = INT_MAX;
Andreas Gampe13b27842016-11-07 16:48:23 -0800379 result = InvokeWithJValues(soa, receiver_ref.get(), jni::EncodeArtMethod(method), args);
Ian Rogers53b8b092014-03-13 23:45:53 -0700380 EXPECT_EQ(2147483643, result.GetI());
381 }
382
383 void InvokeSumDoubleDoubleMethod(bool is_static) {
384 ScopedObjectAccess soa(env_);
Mathieu Chartiere401d142015-04-22 13:56:20 -0700385 ArtMethod* method;
Mathieu Chartier28bd2e42016-10-04 13:54:57 -0700386 ObjPtr<mirror::Object> receiver;
Vladimir Marko2b076df2019-02-20 11:27:52 +0000387 ReflectionTestMakeInterpreted(&method, &receiver, is_static, "sum", "(DD)D");
Jeff Hao39b6c242015-05-19 20:30:23 -0700388 ScopedLocalRef<jobject> receiver_ref(soa.Env(), soa.AddLocalReference<jobject>(receiver));
Ian Rogers53b8b092014-03-13 23:45:53 -0700389 jvalue args[2];
390
391 args[0].d = 0.0;
392 args[1].d = 0.0;
Andreas Gampe13b27842016-11-07 16:48:23 -0800393 JValue result = InvokeWithJValues(soa, receiver_ref.get(), jni::EncodeArtMethod(method), args);
Ian Rogers647b1a82014-10-10 11:02:11 -0700394 EXPECT_DOUBLE_EQ(0.0, result.GetD());
Ian Rogers53b8b092014-03-13 23:45:53 -0700395
396 args[0].d = 1.0;
397 args[1].d = 2.0;
Andreas Gampe13b27842016-11-07 16:48:23 -0800398 result = InvokeWithJValues(soa, receiver_ref.get(), jni::EncodeArtMethod(method), args);
Ian Rogers647b1a82014-10-10 11:02:11 -0700399 EXPECT_DOUBLE_EQ(3.0, result.GetD());
Ian Rogers53b8b092014-03-13 23:45:53 -0700400
401 args[0].d = 1.0;
402 args[1].d = -2.0;
Andreas Gampe13b27842016-11-07 16:48:23 -0800403 result = InvokeWithJValues(soa, receiver_ref.get(), jni::EncodeArtMethod(method), args);
Ian Rogers647b1a82014-10-10 11:02:11 -0700404 EXPECT_DOUBLE_EQ(-1.0, result.GetD());
Ian Rogers53b8b092014-03-13 23:45:53 -0700405
406 args[0].d = DBL_MAX;
407 args[1].d = DBL_MIN;
Andreas Gampe13b27842016-11-07 16:48:23 -0800408 result = InvokeWithJValues(soa, receiver_ref.get(), jni::EncodeArtMethod(method), args);
Ian Rogers647b1a82014-10-10 11:02:11 -0700409 EXPECT_DOUBLE_EQ(1.7976931348623157e308, result.GetD());
Ian Rogers53b8b092014-03-13 23:45:53 -0700410
411 args[0].d = DBL_MAX;
412 args[1].d = DBL_MAX;
Andreas Gampe13b27842016-11-07 16:48:23 -0800413 result = InvokeWithJValues(soa, receiver_ref.get(), jni::EncodeArtMethod(method), args);
Ian Rogers647b1a82014-10-10 11:02:11 -0700414 EXPECT_DOUBLE_EQ(INFINITY, result.GetD());
Ian Rogers53b8b092014-03-13 23:45:53 -0700415 }
416
417 void InvokeSumDoubleDoubleDoubleMethod(bool is_static) {
418 ScopedObjectAccess soa(env_);
Mathieu Chartiere401d142015-04-22 13:56:20 -0700419 ArtMethod* method;
Mathieu Chartier28bd2e42016-10-04 13:54:57 -0700420 ObjPtr<mirror::Object> receiver;
Vladimir Marko2b076df2019-02-20 11:27:52 +0000421 ReflectionTestMakeInterpreted(&method, &receiver, is_static, "sum", "(DDD)D");
Jeff Hao39b6c242015-05-19 20:30:23 -0700422 ScopedLocalRef<jobject> receiver_ref(soa.Env(), soa.AddLocalReference<jobject>(receiver));
Ian Rogers53b8b092014-03-13 23:45:53 -0700423 jvalue args[3];
424
425 args[0].d = 0.0;
426 args[1].d = 0.0;
427 args[2].d = 0.0;
Andreas Gampe13b27842016-11-07 16:48:23 -0800428 JValue result = InvokeWithJValues(soa, receiver_ref.get(), jni::EncodeArtMethod(method), args);
Ian Rogers647b1a82014-10-10 11:02:11 -0700429 EXPECT_DOUBLE_EQ(0.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;
Andreas Gampe13b27842016-11-07 16:48:23 -0800434 result = InvokeWithJValues(soa, receiver_ref.get(), jni::EncodeArtMethod(method), args);
Ian Rogers647b1a82014-10-10 11:02:11 -0700435 EXPECT_DOUBLE_EQ(6.0, result.GetD());
Ian Rogers53b8b092014-03-13 23:45:53 -0700436
437 args[0].d = 1.0;
438 args[1].d = -2.0;
439 args[2].d = 3.0;
Andreas Gampe13b27842016-11-07 16:48:23 -0800440 result = InvokeWithJValues(soa, receiver_ref.get(), jni::EncodeArtMethod(method), args);
Ian Rogers647b1a82014-10-10 11:02:11 -0700441 EXPECT_DOUBLE_EQ(2.0, result.GetD());
Ian Rogers53b8b092014-03-13 23:45:53 -0700442 }
443
444 void InvokeSumDoubleDoubleDoubleDoubleMethod(bool is_static) {
445 ScopedObjectAccess soa(env_);
Mathieu Chartiere401d142015-04-22 13:56:20 -0700446 ArtMethod* method;
Mathieu Chartier28bd2e42016-10-04 13:54:57 -0700447 ObjPtr<mirror::Object> receiver;
Vladimir Marko2b076df2019-02-20 11:27:52 +0000448 ReflectionTestMakeInterpreted(&method, &receiver, is_static, "sum", "(DDDD)D");
Jeff Hao39b6c242015-05-19 20:30:23 -0700449 ScopedLocalRef<jobject> receiver_ref(soa.Env(), soa.AddLocalReference<jobject>(receiver));
Ian Rogers53b8b092014-03-13 23:45:53 -0700450 jvalue args[4];
451
452 args[0].d = 0.0;
453 args[1].d = 0.0;
454 args[2].d = 0.0;
455 args[3].d = 0.0;
Andreas Gampe13b27842016-11-07 16:48:23 -0800456 JValue result = InvokeWithJValues(soa, receiver_ref.get(), jni::EncodeArtMethod(method), args);
Ian Rogers647b1a82014-10-10 11:02:11 -0700457 EXPECT_DOUBLE_EQ(0.0, result.GetD());
Ian Rogers53b8b092014-03-13 23:45:53 -0700458
459 args[0].d = 1.0;
460 args[1].d = 2.0;
461 args[2].d = 3.0;
462 args[3].d = 4.0;
Andreas Gampe13b27842016-11-07 16:48:23 -0800463 result = InvokeWithJValues(soa, receiver_ref.get(), jni::EncodeArtMethod(method), args);
Ian Rogers647b1a82014-10-10 11:02:11 -0700464 EXPECT_DOUBLE_EQ(10.0, result.GetD());
Ian Rogers53b8b092014-03-13 23:45:53 -0700465
466 args[0].d = 1.0;
467 args[1].d = -2.0;
468 args[2].d = 3.0;
469 args[3].d = -4.0;
Andreas Gampe13b27842016-11-07 16:48:23 -0800470 result = InvokeWithJValues(soa, receiver_ref.get(), jni::EncodeArtMethod(method), args);
Ian Rogers647b1a82014-10-10 11:02:11 -0700471 EXPECT_DOUBLE_EQ(-2.0, result.GetD());
Ian Rogers53b8b092014-03-13 23:45:53 -0700472 }
473
474 void InvokeSumDoubleDoubleDoubleDoubleDoubleMethod(bool is_static) {
475 ScopedObjectAccess soa(env_);
Mathieu Chartiere401d142015-04-22 13:56:20 -0700476 ArtMethod* method;
Mathieu Chartier28bd2e42016-10-04 13:54:57 -0700477 ObjPtr<mirror::Object> receiver;
Vladimir Marko2b076df2019-02-20 11:27:52 +0000478 ReflectionTestMakeInterpreted(&method, &receiver, is_static, "sum", "(DDDDD)D");
Jeff Hao39b6c242015-05-19 20:30:23 -0700479 ScopedLocalRef<jobject> receiver_ref(soa.Env(), soa.AddLocalReference<jobject>(receiver));
Ian Rogers53b8b092014-03-13 23:45:53 -0700480 jvalue args[5];
481
482 args[0].d = 0.0;
483 args[1].d = 0.0;
484 args[2].d = 0.0;
485 args[3].d = 0.0;
486 args[4].d = 0.0;
Andreas Gampe13b27842016-11-07 16:48:23 -0800487 JValue result = InvokeWithJValues(soa, receiver_ref.get(), jni::EncodeArtMethod(method), args);
Ian Rogers647b1a82014-10-10 11:02:11 -0700488 EXPECT_DOUBLE_EQ(0.0, result.GetD());
Ian Rogers53b8b092014-03-13 23:45:53 -0700489
490 args[0].d = 1.0;
491 args[1].d = 2.0;
492 args[2].d = 3.0;
493 args[3].d = 4.0;
494 args[4].d = 5.0;
Andreas Gampe13b27842016-11-07 16:48:23 -0800495 result = InvokeWithJValues(soa, receiver_ref.get(), jni::EncodeArtMethod(method), args);
Ian Rogers647b1a82014-10-10 11:02:11 -0700496 EXPECT_DOUBLE_EQ(15.0, result.GetD());
Ian Rogers53b8b092014-03-13 23:45:53 -0700497
498 args[0].d = 1.0;
499 args[1].d = -2.0;
500 args[2].d = 3.0;
501 args[3].d = -4.0;
502 args[4].d = 5.0;
Andreas Gampe13b27842016-11-07 16:48:23 -0800503 result = InvokeWithJValues(soa, receiver_ref.get(), jni::EncodeArtMethod(method), args);
Ian Rogers647b1a82014-10-10 11:02:11 -0700504 EXPECT_DOUBLE_EQ(3.0, result.GetD());
Ian Rogers53b8b092014-03-13 23:45:53 -0700505 }
506
507 JavaVMExt* vm_;
508 JNIEnv* env_;
509 jclass aioobe_;
510 jclass ase_;
511 jclass sioobe_;
512};
513
514TEST_F(ReflectionTest, StaticMainMethod) {
Ian Rogers53b8b092014-03-13 23:45:53 -0700515 ScopedObjectAccess soa(Thread::Current());
516 jobject jclass_loader = LoadDex("Main");
Mathieu Chartiereb8167a2014-05-07 15:43:14 -0700517 StackHandleScope<1> hs(soa.Self());
518 Handle<mirror::ClassLoader> class_loader(
Mathieu Chartier0795f232016-09-27 18:43:30 -0700519 hs.NewHandle(soa.Decode<mirror::ClassLoader>(jclass_loader)));
Ian Rogers53b8b092014-03-13 23:45:53 -0700520 CompileDirectMethod(class_loader, "Main", "main", "([Ljava/lang/String;)V");
521
Vladimir Markoa8bba7d2018-05-30 15:18:48 +0100522 ObjPtr<mirror::Class> klass = class_linker_->FindClass(soa.Self(), "LMain;", class_loader);
Mathieu Chartier2cebb242015-04-21 16:50:40 -0700523 ASSERT_TRUE(klass != nullptr);
Ian Rogers53b8b092014-03-13 23:45:53 -0700524
Vladimir Markoba118822017-06-12 15:41:56 +0100525 ArtMethod* method = klass->FindClassMethod("main",
526 "([Ljava/lang/String;)V",
527 kRuntimePointerSize);
Mathieu Chartier2cebb242015-04-21 16:50:40 -0700528 ASSERT_TRUE(method != nullptr);
Vladimir Markoba118822017-06-12 15:41:56 +0100529 ASSERT_TRUE(method->IsStatic());
Ian Rogers53b8b092014-03-13 23:45:53 -0700530
531 // Start runtime.
532 bool started = runtime_->Start();
533 CHECK(started);
534 soa.Self()->TransitionFromSuspendedToRunnable();
535
536 jvalue args[1];
537 args[0].l = nullptr;
Andreas Gampe13b27842016-11-07 16:48:23 -0800538 InvokeWithJValues(soa, nullptr, jni::EncodeArtMethod(method), args);
Ian Rogers53b8b092014-03-13 23:45:53 -0700539}
540
541TEST_F(ReflectionTest, StaticNopMethod) {
Ian Rogers53b8b092014-03-13 23:45:53 -0700542 InvokeNopMethod(true);
543}
544
545TEST_F(ReflectionTest, NonStaticNopMethod) {
Ian Rogers53b8b092014-03-13 23:45:53 -0700546 InvokeNopMethod(false);
547}
548
549TEST_F(ReflectionTest, StaticIdentityByteMethod) {
Ian Rogers53b8b092014-03-13 23:45:53 -0700550 InvokeIdentityByteMethod(true);
551}
552
553TEST_F(ReflectionTest, NonStaticIdentityByteMethod) {
Ian Rogers53b8b092014-03-13 23:45:53 -0700554 InvokeIdentityByteMethod(false);
555}
556
557TEST_F(ReflectionTest, StaticIdentityIntMethod) {
Ian Rogers53b8b092014-03-13 23:45:53 -0700558 InvokeIdentityIntMethod(true);
559}
560
561TEST_F(ReflectionTest, NonStaticIdentityIntMethod) {
Ian Rogers53b8b092014-03-13 23:45:53 -0700562 InvokeIdentityIntMethod(false);
563}
564
565TEST_F(ReflectionTest, StaticIdentityDoubleMethod) {
Ian Rogers53b8b092014-03-13 23:45:53 -0700566 InvokeIdentityDoubleMethod(true);
567}
568
569TEST_F(ReflectionTest, NonStaticIdentityDoubleMethod) {
Ian Rogers53b8b092014-03-13 23:45:53 -0700570 InvokeIdentityDoubleMethod(false);
571}
572
573TEST_F(ReflectionTest, StaticSumIntIntMethod) {
Ian Rogers53b8b092014-03-13 23:45:53 -0700574 InvokeSumIntIntMethod(true);
575}
576
577TEST_F(ReflectionTest, NonStaticSumIntIntMethod) {
Ian Rogers53b8b092014-03-13 23:45:53 -0700578 InvokeSumIntIntMethod(false);
579}
580
581TEST_F(ReflectionTest, StaticSumIntIntIntMethod) {
Ian Rogers53b8b092014-03-13 23:45:53 -0700582 InvokeSumIntIntIntMethod(true);
583}
584
585TEST_F(ReflectionTest, NonStaticSumIntIntIntMethod) {
Ian Rogers53b8b092014-03-13 23:45:53 -0700586 InvokeSumIntIntIntMethod(false);
587}
588
589TEST_F(ReflectionTest, StaticSumIntIntIntIntMethod) {
Ian Rogers53b8b092014-03-13 23:45:53 -0700590 InvokeSumIntIntIntIntMethod(true);
591}
592
593TEST_F(ReflectionTest, NonStaticSumIntIntIntIntMethod) {
Ian Rogers53b8b092014-03-13 23:45:53 -0700594 InvokeSumIntIntIntIntMethod(false);
595}
596
597TEST_F(ReflectionTest, StaticSumIntIntIntIntIntMethod) {
Ian Rogers53b8b092014-03-13 23:45:53 -0700598 InvokeSumIntIntIntIntIntMethod(true);
599}
600
601TEST_F(ReflectionTest, NonStaticSumIntIntIntIntIntMethod) {
Ian Rogers53b8b092014-03-13 23:45:53 -0700602 InvokeSumIntIntIntIntIntMethod(false);
603}
604
605TEST_F(ReflectionTest, StaticSumDoubleDoubleMethod) {
Ian Rogers53b8b092014-03-13 23:45:53 -0700606 InvokeSumDoubleDoubleMethod(true);
607}
608
609TEST_F(ReflectionTest, NonStaticSumDoubleDoubleMethod) {
Ian Rogers53b8b092014-03-13 23:45:53 -0700610 InvokeSumDoubleDoubleMethod(false);
611}
612
613TEST_F(ReflectionTest, StaticSumDoubleDoubleDoubleMethod) {
Ian Rogers53b8b092014-03-13 23:45:53 -0700614 InvokeSumDoubleDoubleDoubleMethod(true);
615}
616
617TEST_F(ReflectionTest, NonStaticSumDoubleDoubleDoubleMethod) {
Ian Rogers53b8b092014-03-13 23:45:53 -0700618 InvokeSumDoubleDoubleDoubleMethod(false);
619}
620
621TEST_F(ReflectionTest, StaticSumDoubleDoubleDoubleDoubleMethod) {
Ian Rogers53b8b092014-03-13 23:45:53 -0700622 InvokeSumDoubleDoubleDoubleDoubleMethod(true);
623}
624
625TEST_F(ReflectionTest, NonStaticSumDoubleDoubleDoubleDoubleMethod) {
Ian Rogers53b8b092014-03-13 23:45:53 -0700626 InvokeSumDoubleDoubleDoubleDoubleMethod(false);
627}
628
629TEST_F(ReflectionTest, StaticSumDoubleDoubleDoubleDoubleDoubleMethod) {
Ian Rogers53b8b092014-03-13 23:45:53 -0700630 InvokeSumDoubleDoubleDoubleDoubleDoubleMethod(true);
631}
632
633TEST_F(ReflectionTest, NonStaticSumDoubleDoubleDoubleDoubleDoubleMethod) {
Ian Rogers53b8b092014-03-13 23:45:53 -0700634 InvokeSumDoubleDoubleDoubleDoubleDoubleMethod(false);
635}
636
637} // namespace art