Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
PojavLauncherTeam
GitHub Repository: PojavLauncherTeam/openj9
Path: blob/master/runtime/j9vm/j7vmi.c
5985 views
1
/*******************************************************************************
2
* Copyright (c) 2002, 2022 IBM Corp. and others
3
*
4
* This program and the accompanying materials are made available under
5
* the terms of the Eclipse Public License 2.0 which accompanies this
6
* distribution and is available at https://www.eclipse.org/legal/epl-2.0/
7
* or the Apache License, Version 2.0 which accompanies this distribution and
8
* is available at https://www.apache.org/licenses/LICENSE-2.0.
9
*
10
* This Source Code may also be made available under the following
11
* Secondary Licenses when the conditions for such availability set
12
* forth in the Eclipse Public License, v. 2.0 are satisfied: GNU
13
* General Public License, version 2 with the GNU Classpath
14
* Exception [1] and GNU General Public License, version 2 with the
15
* OpenJDK Assembly Exception [2].
16
*
17
* [1] https://www.gnu.org/software/classpath/license.html
18
* [2] http://openjdk.java.net/legal/assembly-exception.html
19
*
20
* SPDX-License-Identifier: EPL-2.0 OR Apache-2.0 OR GPL-2.0 WITH Classpath-exception-2.0 OR LicenseRef-GPL-2.0 WITH Assembly-exception
21
*******************************************************************************/
22
23
/**
24
* @brief This file contains implementations of the public JVM interface (JVM_ functions)
25
* which simply forward to a concrete implementation located either in the JCL library
26
* or proxy forwarder.
27
*/
28
29
#include <stdlib.h>
30
#include <assert.h>
31
32
33
#include "j9consts.h"
34
#include "jclprots.h"
35
#include "j9protos.h"
36
#include "j9.h"
37
#include "omrgcconsts.h"
38
#include "j9modifiers_api.h"
39
#include "j9vm_internal.h"
40
#include "j9vmconstantpool.h"
41
#include "rommeth.h"
42
#include "sunvmi_api.h"
43
#include "util_api.h"
44
/* TODO need to determine why j9vmnls.h is not sufficient */
45
#include "j9jclnls.h"
46
#include "ut_j9scar.h"
47
#include "j9vmnls.h"
48
49
extern void initializeVMI(void);
50
51
#define POK_BOOLEAN 4
52
#define POK_CHAR 5
53
#define POK_FLOAT 6
54
#define POK_DOUBLE 7
55
#define POK_BYTE 8
56
#define POK_SHORT 9
57
#define POK_INT 10
58
#define POK_LONG 11
59
60
static J9ThreadEnv*
61
getJ9ThreadEnv(JNIEnv* env)
62
{
63
JavaVM* jniVM;
64
static J9ThreadEnv* threadEnv;
65
66
if (NULL != threadEnv) {
67
return threadEnv;
68
}
69
70
/* Get the thread functions */
71
(*env)->GetJavaVM(env, &jniVM);
72
(*jniVM)->GetEnv(jniVM, (void**)&threadEnv, J9THREAD_VERSION_1_1);
73
return threadEnv;
74
}
75
76
77
/**
78
* Copies the contents of <code>array1</code> starting at offset <code>start1</code>
79
* into <code>array2</code> starting at offset <code>start2</code> for
80
* <code>length</code> elements.
81
*
82
* @param array1 the array to copy out of
83
* @param start1 the starting index in array1
84
* @param array2 the array to copy into
85
* @param start2 the starting index in array2
86
* @param length the number of elements in the array to copy
87
*/
88
void JNICALL
89
JVM_ArrayCopy(JNIEnv *env, jclass ignored, jobject src, jint src_pos, jobject dst, jint dst_pos, jint length)
90
{
91
J9VMThread *currentThread;
92
J9JavaVM *vm;
93
J9InternalVMFunctions *vmFuncs;
94
95
Assert_SC_notNull(env);
96
97
currentThread = (J9VMThread *) env;
98
vm = currentThread->javaVM;
99
vmFuncs = vm->internalVMFunctions;
100
101
vmFuncs->internalEnterVMFromJNI(currentThread);
102
103
if ((NULL == src) || (NULL == dst)) {
104
vmFuncs->setCurrentException(currentThread, J9VMCONSTANTPOOL_JAVALANGNULLPOINTEREXCEPTION, NULL);
105
} else {
106
j9object_t srcArray = J9_JNI_UNWRAP_REFERENCE(src);
107
j9object_t dstArray = J9_JNI_UNWRAP_REFERENCE(dst);
108
109
J9ArrayClass *srcArrayClass = (J9ArrayClass *) J9OBJECT_CLAZZ(currentThread, srcArray);
110
J9ArrayClass *dstArrayClass = (J9ArrayClass *) J9OBJECT_CLAZZ(currentThread, dstArray);
111
112
if (J9CLASS_IS_ARRAY(srcArrayClass) && J9CLASS_IS_ARRAY(dstArrayClass)) {
113
if ((src_pos < 0) || (dst_pos < 0) || (length < 0)
114
|| (((jint) J9INDEXABLEOBJECT_SIZE(currentThread, srcArray)) < (src_pos + length))
115
|| (((jint) J9INDEXABLEOBJECT_SIZE(currentThread, dstArray)) < (dst_pos + length))) {
116
vmFuncs->setCurrentException(currentThread, J9VMCONSTANTPOOL_JAVALANGARRAYINDEXOUTOFBOUNDSEXCEPTION, NULL);
117
} else {
118
J9Class *srcTypeOfArray = srcArrayClass->componentType;
119
J9Class *dstTypeOfArray = dstArrayClass->componentType;
120
121
int i = 0;
122
if (J9ROMCLASS_IS_PRIMITIVE_TYPE(srcTypeOfArray->romClass) && J9ROMCLASS_IS_PRIMITIVE_TYPE(dstTypeOfArray->romClass)) {
123
if (srcTypeOfArray == dstTypeOfArray) {
124
if (vm->longReflectClass == srcTypeOfArray) {
125
if ((srcArray == dstArray) && (((src_pos < dst_pos) && (src_pos + length > dst_pos)))) {
126
for (i = length - 1; i >= 0; i--) {
127
J9JAVAARRAYOFLONG_STORE(currentThread, dstArray, i + dst_pos, J9JAVAARRAYOFLONG_LOAD(currentThread, srcArray, i + src_pos));
128
}
129
} else {
130
for (i = 0; i < length; i++) {
131
J9JAVAARRAYOFLONG_STORE(currentThread, dstArray, i + dst_pos, J9JAVAARRAYOFLONG_LOAD(currentThread, srcArray, i + src_pos));
132
}
133
}
134
} else if (vm->booleanReflectClass == srcTypeOfArray) {
135
if ((srcArray == dstArray) && (((src_pos < dst_pos) && (src_pos + length > dst_pos)))) {
136
for (i = length - 1; i >= 0; i--) {
137
J9JAVAARRAYOFBOOLEAN_STORE(currentThread, dstArray, i + dst_pos, J9JAVAARRAYOFBOOLEAN_LOAD(currentThread, srcArray, i + src_pos));
138
}
139
} else {
140
for (i = 0; i < length; i++) {
141
J9JAVAARRAYOFBOOLEAN_STORE(currentThread, dstArray, i + dst_pos, J9JAVAARRAYOFBOOLEAN_LOAD(currentThread, srcArray, i + src_pos));
142
}
143
}
144
} else if (vm->byteReflectClass == srcTypeOfArray) {
145
if ((srcArray == dstArray) && (((src_pos < dst_pos) && (src_pos + length > dst_pos)))) {
146
for (i = length - 1; i >= 0; i--) {
147
J9JAVAARRAYOFBYTE_STORE(currentThread, dstArray, i + dst_pos, J9JAVAARRAYOFBYTE_LOAD(currentThread, srcArray, i + src_pos));
148
}
149
} else {
150
for (i = 0; i < length; i++) {
151
J9JAVAARRAYOFBYTE_STORE(currentThread, dstArray, i + dst_pos, J9JAVAARRAYOFBYTE_LOAD(currentThread, srcArray, i + src_pos));
152
}
153
}
154
} else if (vm->charReflectClass == srcTypeOfArray) {
155
if ((srcArray == dstArray) && (((src_pos < dst_pos) && (src_pos + length > dst_pos)))) {
156
for (i = length - 1; i >= 0; i--) {
157
J9JAVAARRAYOFCHAR_STORE(currentThread, dstArray, i + dst_pos, J9JAVAARRAYOFCHAR_LOAD(currentThread, srcArray, i + src_pos));
158
}
159
} else {
160
for (i = 0; i < length; i++) {
161
J9JAVAARRAYOFCHAR_STORE(currentThread, dstArray, i + dst_pos, J9JAVAARRAYOFCHAR_LOAD(currentThread, srcArray, i + src_pos));
162
}
163
}
164
} else if (vm->shortReflectClass == srcTypeOfArray) {
165
if ((srcArray == dstArray) && (((src_pos < dst_pos) && (src_pos + length > dst_pos)))) {
166
for (i = length - 1; i >= 0; i--) {
167
J9JAVAARRAYOFSHORT_STORE(currentThread, dstArray, i + dst_pos, J9JAVAARRAYOFSHORT_LOAD(currentThread, srcArray, i + src_pos));
168
}
169
} else {
170
for (i = 0; i < length; i++) {
171
J9JAVAARRAYOFSHORT_STORE(currentThread, dstArray, i + dst_pos, J9JAVAARRAYOFSHORT_LOAD(currentThread, srcArray, i + src_pos));
172
}
173
}
174
} else if (vm->intReflectClass == srcTypeOfArray) {
175
if ((srcArray == dstArray) && (((src_pos < dst_pos) && (src_pos + length > dst_pos)))) {
176
for (i = length - 1; i >= 0; i--) {
177
J9JAVAARRAYOFINT_STORE(currentThread, dstArray, i + dst_pos, J9JAVAARRAYOFINT_LOAD(currentThread, srcArray, i + src_pos));
178
}
179
} else {
180
for (i = 0; i < length; i++) {
181
J9JAVAARRAYOFINT_STORE(currentThread, dstArray, i + dst_pos, J9JAVAARRAYOFINT_LOAD(currentThread, srcArray, i + src_pos));
182
}
183
}
184
} else if (vm->floatReflectClass == srcTypeOfArray) {
185
if ((srcArray == dstArray) && (((src_pos < dst_pos) && (src_pos + length > dst_pos)))) {
186
for (i = length - 1; i >= 0; i--) {
187
J9JAVAARRAYOFFLOAT_STORE(currentThread, dstArray, i + dst_pos, J9JAVAARRAYOFFLOAT_LOAD(currentThread, srcArray, i + src_pos));
188
}
189
} else {
190
for (i = 0; i < length; i++) {
191
J9JAVAARRAYOFFLOAT_STORE(currentThread, dstArray, i + dst_pos, J9JAVAARRAYOFFLOAT_LOAD(currentThread, srcArray, i + src_pos));
192
}
193
}
194
} else if (vm->doubleReflectClass == srcTypeOfArray) {
195
if ((srcArray == dstArray) && (((src_pos < dst_pos) && (src_pos + length > dst_pos)))) {
196
for (i = length - 1; i >= 0; i--) {
197
J9JAVAARRAYOFDOUBLE_STORE(currentThread, dstArray, i + dst_pos, J9JAVAARRAYOFDOUBLE_LOAD(currentThread, srcArray, i + src_pos));
198
}
199
} else {
200
for (i = 0; i < length; i++) {
201
J9JAVAARRAYOFDOUBLE_STORE(currentThread, dstArray, i + dst_pos, J9JAVAARRAYOFDOUBLE_LOAD(currentThread, srcArray, i + src_pos));
202
}
203
}
204
} else {
205
vmFuncs->setCurrentException(currentThread, J9VMCONSTANTPOOL_JAVALANGILLEGALARGUMENTEXCEPTION, NULL);
206
}
207
} else {
208
vmFuncs->setCurrentException(currentThread, J9VMCONSTANTPOOL_JAVALANGARRAYSTOREEXCEPTION, NULL);
209
}
210
} else if (!J9ROMCLASS_IS_PRIMITIVE_TYPE(srcTypeOfArray->romClass) && !J9ROMCLASS_IS_PRIMITIVE_TYPE(dstTypeOfArray->romClass)) {
211
if (srcArray == dstArray) {
212
if ((((src_pos < dst_pos) && (src_pos + length > dst_pos)))) {
213
for (i = length - 1; i >= 0; i--) {
214
J9JAVAARRAYOFOBJECT_STORE(currentThread, dstArray, i + dst_pos, J9JAVAARRAYOFOBJECT_LOAD(currentThread, srcArray, i + src_pos));
215
}
216
} else {
217
for (i = 0; i < length; i++) {
218
J9JAVAARRAYOFOBJECT_STORE(currentThread, dstArray, i + dst_pos, J9JAVAARRAYOFOBJECT_LOAD(currentThread, srcArray, i + src_pos));
219
}
220
}
221
} else {
222
j9object_t srcObject = NULL;
223
J9Class *srcObjectClass = NULL;
224
for (i = 0; i < length; i++) {
225
srcObject = J9JAVAARRAYOFOBJECT_LOAD(currentThread, srcArray, i + src_pos);
226
if (NULL == srcObject) {
227
J9JAVAARRAYOFOBJECT_STORE(currentThread, dstArray, i + dst_pos, srcObject);
228
} else {
229
srcObjectClass = J9OBJECT_CLAZZ(currentThread, srcObject);
230
231
if (isSameOrSuperClassOf (dstTypeOfArray, srcObjectClass)) {
232
J9JAVAARRAYOFOBJECT_STORE(currentThread, dstArray, i + dst_pos, srcObject);
233
} else {
234
vmFuncs->setCurrentException(currentThread, J9VMCONSTANTPOOL_JAVALANGARRAYSTOREEXCEPTION, NULL);
235
break;
236
}
237
}
238
}
239
}
240
} else {
241
vmFuncs->setCurrentException(currentThread, J9VMCONSTANTPOOL_JAVALANGARRAYSTOREEXCEPTION, NULL);
242
}
243
}
244
} else {
245
vmFuncs->setCurrentException(currentThread, J9VMCONSTANTPOOL_JAVALANGARRAYSTOREEXCEPTION, NULL);
246
}
247
}
248
vmFuncs->internalExitVMToJNI(currentThread);
249
}
250
251
252
253
jobject JNICALL
254
JVM_AssertionStatusDirectives(jint arg0, jint arg1)
255
{
256
assert(!"JVM_AssertionStatusDirectives() stubbed!");
257
return NULL;
258
}
259
260
261
262
jobject JNICALL
263
JVM_Clone(jint arg0, jint arg1)
264
{
265
assert(!"JVM_Clone() stubbed!");
266
return NULL;
267
}
268
269
270
271
jobject JNICALL
272
JVM_CompileClass(jint arg0, jint arg1, jint arg2)
273
{
274
assert(!"JVM_CompileClass() stubbed!");
275
return NULL;
276
}
277
278
279
280
jobject JNICALL
281
JVM_CompileClasses(jint arg0, jint arg1, jint arg2)
282
{
283
assert(!"JVM_CompileClasses() stubbed!");
284
return NULL;
285
}
286
287
288
289
jobject JNICALL
290
JVM_CompilerCommand(jint arg0, jint arg1, jint arg2)
291
{
292
assert(!"JVM_CompilerCommand() stubbed!");
293
return NULL;
294
}
295
296
297
298
jobject JNICALL
299
JVM_CountStackFrames(jint arg0, jint arg1)
300
{
301
assert(!"JVM_CountStackFrames() stubbed!");
302
return NULL;
303
}
304
305
306
307
jobject JNICALL
308
JVM_CurrentThread(JNIEnv* env, jclass java_lang_Thread)
309
{
310
J9VMThread* vmThread = (J9VMThread*)env;
311
if (NULL == vmThread->threadObject) {
312
return NULL;
313
} else {
314
return (jobject)(&vmThread->threadObject);
315
}
316
}
317
318
319
320
jboolean JNICALL
321
JVM_DesiredAssertionStatus(JNIEnv* env, jobject arg1, jobject arg2)
322
{
323
return JNI_FALSE;
324
}
325
326
327
328
jobject JNICALL
329
JVM_DisableCompiler(jint arg0, jint arg1)
330
{
331
assert(!"JVM_DisableCompiler() stubbed!");
332
return NULL;
333
}
334
335
static jclass
336
java_lang_J9VMInternals(JNIEnv* env)
337
{
338
static jclass cached = NULL;
339
jclass localRef = NULL;
340
341
if (NULL != cached) {
342
return cached;
343
}
344
345
localRef = (*env)->FindClass(env, "java/lang/J9VMInternals");
346
assert(localRef != NULL);
347
348
cached = (*env)->NewGlobalRef(env, localRef);
349
if (cached == NULL) {
350
return NULL;
351
}
352
353
(*env)->DeleteLocalRef(env,localRef);
354
assert(localRef != NULL);
355
return cached;
356
}
357
358
static jmethodID
359
java_lang_J9VMInternals_doPrivileged(JNIEnv* env)
360
{
361
static jmethodID cached = NULL;
362
if (NULL != cached) {
363
return cached;
364
}
365
366
cached = (*env)->GetStaticMethodID(env, java_lang_J9VMInternals(env), "doPrivileged", "(Ljava/security/PrivilegedAction;)Ljava/lang/Object;" );
367
assert(cached != NULL);
368
return cached;
369
}
370
371
static jmethodID
372
java_lang_J9VMInternals_doPrivilegedWithException(JNIEnv* env)
373
{
374
static jmethodID cached = NULL;
375
if (NULL != cached) {
376
return cached;
377
}
378
379
cached = (*env)->GetStaticMethodID(env, java_lang_J9VMInternals(env), "doPrivileged", "(Ljava/security/PrivilegedExceptionAction;)Ljava/lang/Object;" );
380
assert(cached != NULL);
381
return cached;
382
}
383
384
385
jobject JNICALL
386
JVM_DoPrivileged(JNIEnv* env, jobject java_security_AccessController, jobject action, jboolean unknown, jboolean isExceptionAction)
387
{
388
PORT_ACCESS_FROM_ENV(env);
389
#if 0
390
j9tty_printf(
391
PORTLIB,
392
"JVM_DoPrivileged(env=0x%p, accessController=0x%p, action=0x%p, arg3=0x%p, arg4=0x%p\n",
393
env, java_security_AccessController, action, arg3, arg4);
394
#endif
395
396
jmethodID methodID =
397
(JNI_TRUE == isExceptionAction)
398
? java_lang_J9VMInternals_doPrivilegedWithException(env)
399
: java_lang_J9VMInternals_doPrivileged(env);
400
401
return (*env)->CallStaticObjectMethod(
402
env,
403
java_lang_J9VMInternals(env),
404
methodID,
405
action);
406
}
407
408
409
410
jobject JNICALL
411
JVM_EnableCompiler(jint arg0, jint arg1)
412
{
413
assert(!"JVM_EnableCompiler() stubbed!");
414
return NULL;
415
}
416
417
void JNICALL
418
JVM_FillInStackTrace(JNIEnv* env, jobject throwable)
419
{
420
J9VMThread* currentThread = (J9VMThread*) env;
421
J9JavaVM* javaVM = currentThread->javaVM;
422
J9InternalVMFunctions* vmfns = javaVM->internalVMFunctions;
423
j9object_t unwrappedThrowable = NULL;
424
425
vmfns->internalEnterVMFromJNI(currentThread);
426
unwrappedThrowable = J9_JNI_UNWRAP_REFERENCE(throwable);
427
if ((0 == (javaVM->runtimeFlags & J9_RUNTIME_OMIT_STACK_TRACES)) &&
428
/* If the disableWritableStackTrace field is true, do not create the stack trace. */
429
!J9VMJAVALANGTHROWABLE_DISABLEWRITABLESTACKTRACE(currentThread, unwrappedThrowable))
430
{
431
UDATA flags = J9_STACKWALK_CACHE_PCS | J9_STACKWALK_WALK_TRANSLATE_PC | J9_STACKWALK_VISIBLE_ONLY | J9_STACKWALK_INCLUDE_NATIVES | J9_STACKWALK_SKIP_INLINES;
432
J9StackWalkState* walkState = currentThread->stackWalkState;
433
j9object_t result = (j9object_t) J9VMJAVALANGTHROWABLE_WALKBACK(currentThread, unwrappedThrowable);
434
UDATA rc = 0;
435
UDATA i = 0;
436
UDATA framesWalked = 0;
437
438
/* Do not hide exception frames if fillInStackTrace is called on an exception which already has a stack trace. In the out of memory case,
439
* there is a bit indicating that we should explicitly override this behaviour, since we've precached the stack trace array. */
440
if ((NULL == result) || (J9_PRIVATE_FLAGS_FILL_EXISTING_TRACE == (currentThread->privateFlags & J9_PRIVATE_FLAGS_FILL_EXISTING_TRACE))) {
441
flags |= J9_STACKWALK_HIDE_EXCEPTION_FRAMES;
442
walkState->restartException = unwrappedThrowable;
443
}
444
/* If -XX:+ShowHiddenFrames option has not been set, skip hidden method frames */
445
if (J9_ARE_NO_BITS_SET(javaVM->runtimeFlags, J9_RUNTIME_SHOW_HIDDEN_FRAMES)) {
446
flags |= J9_STACKWALK_SKIP_HIDDEN_FRAMES;
447
}
448
walkState->skipCount = 1; /* skip the INL frame -- TODO revisit this */
449
#if JAVA_SPEC_VERSION >= 15
450
{
451
J9Class *receiverClass = J9OBJECT_CLAZZ(currentThread, unwrappedThrowable);
452
if (J9VMJAVALANGNULLPOINTEREXCEPTION_OR_NULL(javaVM) == receiverClass) {
453
walkState->skipCount = 2; /* skip the INL & NullPointerException.fillInStackTrace() frames */
454
}
455
}
456
#endif /* JAVA_SPEC_VERSION >= 15 */
457
walkState->walkThread = currentThread;
458
walkState->flags = flags;
459
460
rc = javaVM->walkStackFrames(currentThread, walkState);
461
462
if (J9_STACKWALK_RC_NONE != rc) {
463
/* Avoid infinite recursion if already throwing OOM. */
464
if (J9_PRIVATE_FLAGS_OUT_OF_MEMORY == (currentThread->privateFlags & J9_PRIVATE_FLAGS_OUT_OF_MEMORY)) {
465
goto setThrowableSlots;
466
}
467
vmfns->setNativeOutOfMemoryError(currentThread, J9NLS_JCL_FAILED_TO_CREATE_STACK_TRACE); /* TODO replace with local NLS message */
468
goto done;
469
}
470
framesWalked = walkState->framesWalked;
471
472
/* If there is no stack trace in the exception, or we are not in the out of memory case, allocate a new stack trace. */
473
if ((NULL == result) || (0 == (currentThread->privateFlags & J9_PRIVATE_FLAGS_FILL_EXISTING_TRACE))) {
474
#ifdef J9VM_ENV_DATA64
475
J9Class* arrayClass = javaVM->longArrayClass;
476
#else
477
J9Class* arrayClass = javaVM->intArrayClass;
478
#endif
479
result = javaVM->memoryManagerFunctions->J9AllocateIndexableObject(currentThread, arrayClass, (U_32)framesWalked, J9_GC_ALLOCATE_OBJECT_NON_INSTRUMENTABLE);
480
if (NULL == result) {
481
vmfns->setHeapOutOfMemoryError(currentThread);
482
goto done;
483
}
484
/* Reload after allocation */
485
unwrappedThrowable = J9_JNI_UNWRAP_REFERENCE(throwable);
486
} else {
487
UDATA maxSize = J9INDEXABLEOBJECT_SIZE(currentThread, result);
488
if (framesWalked > maxSize) {
489
framesWalked = maxSize;
490
}
491
}
492
493
for (i = 0; i < framesWalked; ++i) {
494
J9JAVAARRAYOFUDATA_STORE(currentThread, result, i, walkState->cache[i]);
495
}
496
497
vmfns->freeStackWalkCaches(currentThread, walkState);
498
499
setThrowableSlots:
500
J9VMJAVALANGTHROWABLE_SET_WALKBACK(currentThread, unwrappedThrowable, result);
501
J9VMJAVALANGTHROWABLE_SET_STACKTRACE(currentThread, unwrappedThrowable, NULL);
502
}
503
done:
504
vmfns->internalExitVMToJNI(currentThread);
505
}
506
507
/**
508
* Find the specified class in given class loader
509
*
510
* @param env
511
* @param className null-terminated class name string.
512
* @param init initialize the class when set
513
* @param classLoader classloader of the class
514
* @param throwError set to true in order to throw errors
515
* @return Assumed to be a jclass.
516
*
517
* Note: this call is implemented from info provided via CMVC 154874.
518
*/
519
jobject JNICALL
520
JVM_FindClassFromClassLoader(JNIEnv* env, char* className, jboolean init, jobject classLoader, jboolean throwError)
521
{
522
ENSURE_VMI();
523
return g_VMI->JVM_FindClassFromClassLoader(env, className, init, classLoader, throwError);
524
}
525
526
527
528
/**
529
* Find the specified class using boot class loader
530
*
531
* @param env
532
* @param className null-terminated class name string.
533
* @return jclass or NULL on error.
534
*
535
* Note: this call is implemented from info provided via CMVC 156938.
536
*/
537
jobject JNICALL
538
JVM_FindClassFromBootLoader(JNIEnv* env, char* className)
539
{
540
return JVM_FindClassFromClassLoader(env, className, JNI_TRUE, NULL, JNI_FALSE);
541
}
542
543
544
jobject JNICALL
545
JVM_FindLoadedClass(JNIEnv* env, jobject classLoader, jobject className)
546
{
547
J9VMThread* currentThread = (J9VMThread*) env;
548
J9JavaVM* vm = currentThread->javaVM;
549
J9ClassLoader* vmClassLoader;
550
J9Class* loadedClass = NULL;
551
552
vm->internalVMFunctions->internalEnterVMFromJNI(currentThread);
553
554
if (NULL == className) {
555
goto done;
556
}
557
558
vmClassLoader = J9VMJAVALANGCLASSLOADER_VMREF(currentThread, J9_JNI_UNWRAP_REFERENCE(classLoader));
559
if (NULL == vmClassLoader) {
560
goto done;
561
}
562
563
loadedClass = vm->internalVMFunctions->internalFindClassString(
564
currentThread,
565
NULL,
566
J9_JNI_UNWRAP_REFERENCE(className),
567
vmClassLoader,
568
J9_FINDCLASS_FLAG_EXISTING_ONLY,
569
CLASSNAME_INVALID);
570
done:
571
vm->internalVMFunctions->internalExitVMToJNI(currentThread);
572
573
if (NULL == loadedClass) {
574
return NULL;
575
}
576
577
return (jobject)(&loadedClass->classObject);
578
}
579
580
581
582
jobject JNICALL
583
JVM_FindPrimitiveClass(JNIEnv* env, char* name)
584
{
585
J9JavaVM* vm = ((J9VMThread*)env)->javaVM;
586
587
/* code inspired by reflecthelp.c */
588
if (0 == strcmp(name,"int")) {
589
return (jobject)(&vm->intReflectClass->classObject);
590
}
591
if (0 == strcmp(name,"boolean")) {
592
return (jobject)(&vm->booleanReflectClass->classObject);
593
}
594
if (0 == strcmp(name,"long")) {
595
return (jobject)(&vm->longReflectClass->classObject);
596
}
597
if (0 == strcmp(name,"double")) {
598
return (jobject)(&vm->doubleReflectClass->classObject);
599
}
600
if (0 == strcmp(name,"float")) {
601
return (jobject)(&vm->floatReflectClass->classObject);
602
}
603
if (0 == strcmp(name,"char")) {
604
return (jobject)(&vm->charReflectClass->classObject);
605
}
606
if (0 == strcmp(name,"byte")) {
607
return (jobject)(&vm->byteReflectClass->classObject);
608
}
609
if (0 == strcmp(name,"short")) {
610
return (jobject)(&vm->shortReflectClass->classObject);
611
}
612
if (0 == strcmp(name,"void")) {
613
return (jobject)(&vm->voidReflectClass->classObject);
614
}
615
616
assert(!"JVM_FindPrimitiveClass() stubbed!");
617
return NULL;
618
}
619
620
621
622
/**
623
* Get the Array element at the index
624
* This function may lock, gc or throw exception.
625
* @param array The array
626
* @param index The index
627
* @return the element at the index
628
*/
629
jobject JNICALL
630
JVM_GetArrayElement(JNIEnv *env, jobject array, jint index)
631
{
632
J9VMThread *currentThread;
633
J9JavaVM *vm;
634
J9InternalVMFunctions *vmFuncs;
635
jobject elementJNIRef = NULL;
636
637
Assert_SC_notNull(env);
638
639
currentThread = (J9VMThread *) env;
640
vm = currentThread->javaVM;
641
vmFuncs = vm->internalVMFunctions;
642
643
vmFuncs->internalEnterVMFromJNI(currentThread);
644
645
if (NULL == array) {
646
vmFuncs->setCurrentException(currentThread, J9VMCONSTANTPOOL_JAVALANGNULLPOINTEREXCEPTION, NULL);
647
} else {
648
j9object_t j9array = J9_JNI_UNWRAP_REFERENCE(array);
649
J9ArrayClass *arrayClass = (J9ArrayClass *) J9OBJECT_CLAZZ(currentThread, j9array);
650
J9Class *typeOfArray = arrayClass->componentType;
651
652
if (J9CLASS_IS_ARRAY(arrayClass)) {
653
if ((index < 0) || (((jint) J9INDEXABLEOBJECT_SIZE(currentThread, j9array)) <= index)) {
654
vmFuncs->setCurrentException(currentThread, J9VMCONSTANTPOOL_JAVALANGARRAYINDEXOUTOFBOUNDSEXCEPTION, NULL);
655
} else {
656
if (J9ROMCLASS_IS_PRIMITIVE_TYPE(typeOfArray->romClass)) {
657
j9object_t primitiveElement = NULL;
658
J9MemoryManagerFunctions *memManagerFuncs = vm->memoryManagerFunctions;
659
BOOLEAN illegalArgSeen = FALSE;
660
661
if (vm->longReflectClass == typeOfArray) {
662
primitiveElement = memManagerFuncs->J9AllocateObject(currentThread, J9VMJAVALANGLONG_OR_NULL(vm), J9_GC_ALLOCATE_OBJECT_NON_INSTRUMENTABLE);
663
if (NULL != primitiveElement) {
664
jlong val = J9JAVAARRAYOFLONG_LOAD(currentThread, j9array, index);
665
J9VMJAVALANGLONG_SET_VALUE(currentThread, primitiveElement, val);
666
elementJNIRef = vmFuncs->j9jni_createLocalRef((JNIEnv *)currentThread, primitiveElement);
667
}
668
} else if (vm->booleanReflectClass == typeOfArray) {
669
primitiveElement = memManagerFuncs->J9AllocateObject(currentThread, J9VMJAVALANGBOOLEAN_OR_NULL(vm), J9_GC_ALLOCATE_OBJECT_NON_INSTRUMENTABLE);
670
if (NULL != primitiveElement) {
671
jboolean val = J9JAVAARRAYOFBOOLEAN_LOAD(currentThread, j9array, index);
672
J9VMJAVALANGBOOLEAN_SET_VALUE(currentThread, primitiveElement, val);
673
elementJNIRef = vmFuncs->j9jni_createLocalRef((JNIEnv *) currentThread, primitiveElement);
674
}
675
} else if (vm->byteReflectClass == typeOfArray) {
676
primitiveElement = memManagerFuncs->J9AllocateObject(currentThread, J9VMJAVALANGBYTE_OR_NULL(vm), J9_GC_ALLOCATE_OBJECT_NON_INSTRUMENTABLE);
677
if (NULL != primitiveElement) {
678
jbyte val = J9JAVAARRAYOFBYTE_LOAD(currentThread, j9array, index);
679
J9VMJAVALANGBYTE_SET_VALUE(currentThread, primitiveElement, val);
680
elementJNIRef = vmFuncs->j9jni_createLocalRef((JNIEnv *) currentThread, primitiveElement);
681
}
682
} else if (vm->charReflectClass == typeOfArray) {
683
primitiveElement = memManagerFuncs->J9AllocateObject(currentThread, J9VMJAVALANGCHARACTER_OR_NULL(vm), J9_GC_ALLOCATE_OBJECT_NON_INSTRUMENTABLE);
684
if (NULL != primitiveElement) {
685
jchar val = J9JAVAARRAYOFCHAR_LOAD(currentThread, j9array, index);
686
J9VMJAVALANGCHARACTER_SET_VALUE(currentThread, primitiveElement, val);
687
elementJNIRef = vmFuncs->j9jni_createLocalRef((JNIEnv *) currentThread, primitiveElement);
688
}
689
} else if (vm->shortReflectClass == typeOfArray) {
690
primitiveElement = memManagerFuncs->J9AllocateObject(currentThread, J9VMJAVALANGSHORT_OR_NULL(vm), J9_GC_ALLOCATE_OBJECT_NON_INSTRUMENTABLE);
691
if (NULL != primitiveElement) {
692
jshort val = J9JAVAARRAYOFSHORT_LOAD(currentThread, j9array, index);
693
J9VMJAVALANGSHORT_SET_VALUE(currentThread, primitiveElement, val);
694
elementJNIRef = vmFuncs->j9jni_createLocalRef((JNIEnv *) currentThread, primitiveElement);
695
}
696
} else if (vm->intReflectClass == typeOfArray) {
697
primitiveElement = memManagerFuncs->J9AllocateObject(currentThread, J9VMJAVALANGINTEGER_OR_NULL(vm), J9_GC_ALLOCATE_OBJECT_NON_INSTRUMENTABLE);
698
if (NULL != primitiveElement) {
699
jint val = J9JAVAARRAYOFINT_LOAD(currentThread, j9array, index);
700
J9VMJAVALANGINTEGER_SET_VALUE(currentThread, primitiveElement, val);
701
elementJNIRef = vmFuncs->j9jni_createLocalRef((JNIEnv *) currentThread, primitiveElement);
702
}
703
} else if (vm->floatReflectClass == typeOfArray) {
704
primitiveElement = memManagerFuncs->J9AllocateObject(currentThread, J9VMJAVALANGFLOAT_OR_NULL(vm), J9_GC_ALLOCATE_OBJECT_NON_INSTRUMENTABLE);
705
if (NULL != primitiveElement) {
706
U_32 val = J9JAVAARRAYOFFLOAT_LOAD(currentThread, j9array, index);
707
J9VMJAVALANGFLOAT_SET_VALUE(currentThread, primitiveElement, val);
708
elementJNIRef = vmFuncs->j9jni_createLocalRef((JNIEnv *) currentThread, primitiveElement);
709
}
710
} else if (vm->doubleReflectClass == typeOfArray) {
711
primitiveElement = memManagerFuncs->J9AllocateObject(currentThread, J9VMJAVALANGDOUBLE_OR_NULL(vm), J9_GC_ALLOCATE_OBJECT_NON_INSTRUMENTABLE);
712
if (NULL != primitiveElement) {
713
U_64 val = J9JAVAARRAYOFDOUBLE_LOAD(currentThread, j9array, index);
714
J9VMJAVALANGDOUBLE_SET_VALUE(currentThread, primitiveElement, val);
715
elementJNIRef = vmFuncs->j9jni_createLocalRef((JNIEnv *) currentThread, primitiveElement);
716
}
717
} else {
718
vmFuncs->setCurrentException(currentThread, J9VMCONSTANTPOOL_JAVALANGILLEGALARGUMENTEXCEPTION, NULL);
719
illegalArgSeen = TRUE;
720
}
721
if (!illegalArgSeen) {
722
if (NULL == primitiveElement) {
723
vmFuncs->setHeapOutOfMemoryError(currentThread);
724
} else if (NULL == elementJNIRef) {
725
vmFuncs->setNativeOutOfMemoryError(currentThread, J9NLS_VM_NATIVE_OOM);
726
}
727
}
728
} else {
729
j9object_t j9arrayElement = J9JAVAARRAYOFOBJECT_LOAD(currentThread, j9array, index);
730
elementJNIRef = vmFuncs->j9jni_createLocalRef((JNIEnv *)currentThread, j9arrayElement);
731
732
if ((NULL == elementJNIRef) && (NULL != j9arrayElement)) {
733
vmFuncs->setNativeOutOfMemoryError(currentThread, J9NLS_VM_NATIVE_OOM);
734
}
735
}
736
}
737
} else {
738
vmFuncs->setCurrentException(currentThread, J9VMCONSTANTPOOL_JAVALANGILLEGALARGUMENTEXCEPTION, NULL);
739
}
740
}
741
vmFuncs->internalExitVMToJNI(currentThread);
742
743
return elementJNIRef;
744
}
745
746
747
/**
748
* Get the array length.
749
* This function may lock, gc or throw exception.
750
* @param array The array
751
* @return the array length
752
*/
753
jint JNICALL
754
JVM_GetArrayLength(JNIEnv *env, jobject array)
755
{
756
J9VMThread *currentThread;
757
J9JavaVM *vm;
758
J9InternalVMFunctions *vmFuncs;
759
jsize arrayLength = 0;
760
761
Assert_SC_notNull(env);
762
763
currentThread = (J9VMThread*) env;
764
vm = currentThread->javaVM;
765
vmFuncs = vm->internalVMFunctions;
766
767
vmFuncs->internalEnterVMFromJNI(currentThread);
768
769
if (NULL == array) {
770
vmFuncs->setCurrentException(currentThread, J9VMCONSTANTPOOL_JAVALANGNULLPOINTEREXCEPTION, NULL);
771
} else {
772
J9Class *ramClass;
773
j9object_t j9array;
774
775
j9array = J9_JNI_UNWRAP_REFERENCE(array);
776
ramClass = J9OBJECT_CLAZZ(currentThread, j9array);
777
778
if (J9CLASS_IS_ARRAY(ramClass)) {
779
arrayLength = J9INDEXABLEOBJECT_SIZE(currentThread, j9array);
780
} else {
781
vmFuncs->setCurrentException(currentThread, J9VMCONSTANTPOOL_JAVALANGILLEGALARGUMENTEXCEPTION, NULL);
782
}
783
}
784
785
vmFuncs->internalExitVMToJNI(currentThread);
786
787
return arrayLength;
788
}
789
790
J9Class*
791
java_lang_Class_vmRef(JNIEnv* env, jobject clazz)
792
{
793
J9VMThread* currentThread = (J9VMThread*) env;
794
J9JavaVM* vm = currentThread->javaVM;
795
J9Class* ramClass;
796
797
vm->internalVMFunctions->internalEnterVMFromJNI(currentThread);
798
ramClass = J9VMJAVALANGCLASS_VMREF(currentThread, J9_JNI_UNWRAP_REFERENCE(clazz) );
799
vm->internalVMFunctions->internalExitVMToJNI(currentThread);
800
801
return ramClass;
802
}
803
804
/**
805
* Helper function to convert a J9UTF8* to a null-terminated C string.
806
*/
807
static char*
808
utf8_to_cstring(JNIEnv* env, J9UTF8* utf)
809
{
810
PORT_ACCESS_FROM_ENV(env);
811
char* cstring = (char*)j9mem_allocate_memory(J9UTF8_LENGTH(utf) + 1, OMRMEM_CATEGORY_VM);
812
if (NULL != cstring) {
813
memcpy(cstring, J9UTF8_DATA(utf), J9UTF8_LENGTH(utf));
814
cstring[J9UTF8_LENGTH(utf)] = 0;
815
}
816
return cstring;
817
}
818
819
/**
820
* Helper function to convert a J9UTF8* to a java/lang/String.
821
*/
822
static jobject
823
utf8_to_java_lang_String(JNIEnv* env, J9UTF8* utf)
824
{
825
PORT_ACCESS_FROM_ENV(env);
826
char* cstring = utf8_to_cstring(env, utf);
827
jobject jlString = (*env)->NewStringUTF(env, cstring);
828
if (NULL != cstring) {
829
j9mem_free_memory(cstring);
830
}
831
return jlString;
832
}
833
834
835
jobject JNICALL
836
JVM_GetClassDeclaredConstructors(JNIEnv* env, jclass clazz, jboolean unknown)
837
{
838
J9Class* ramClass;
839
J9ROMClass* romClass;
840
jclass jlrConstructor;
841
jobjectArray result;
842
char* eyecatcher = "<init>";
843
U_16 initLength = 6;
844
jsize size = 0;
845
PORT_ACCESS_FROM_ENV(env);
846
847
ramClass = java_lang_Class_vmRef(env, clazz);
848
romClass = ramClass->romClass;
849
850
/* Primitives/Arrays don't have fields. */
851
if (J9ROMCLASS_IS_PRIMITIVE_OR_ARRAY(romClass) || J9ROMCLASS_IS_INTERFACE(romClass)) {
852
size = 0;
853
} else {
854
U_32 romMethodCount = romClass->romMethodCount;
855
J9Method * method = ramClass->ramMethods;
856
857
while (romMethodCount-- != 0) {
858
J9ROMMethod * romMethod = J9_ROM_METHOD_FROM_RAM_METHOD(method++);
859
J9UTF8 * nameUTF = J9ROMMETHOD_NAME(romMethod);
860
861
if (J9UTF8_DATA_EQUALS(J9UTF8_DATA(nameUTF), J9UTF8_LENGTH(nameUTF), eyecatcher, 6)) {
862
size++;
863
}
864
}
865
}
866
867
/* Look up the field class */
868
jlrConstructor = (*env)->FindClass(env, "java/lang/reflect/Constructor");
869
if (NULL == jlrConstructor) {
870
return NULL;
871
}
872
873
/* Create the result array */
874
result = (*env)->NewObjectArray(env, size, jlrConstructor, NULL);
875
if (NULL == result) {
876
return NULL;
877
}
878
879
/* Now walk and fill in the contents */
880
if (size != 0) {
881
U_32 romMethodCount = romClass->romMethodCount;
882
J9Method* method = ramClass->ramMethods;
883
jsize index = 0;
884
885
while (romMethodCount-- != 0) {
886
J9ROMMethod * romMethod = J9_ROM_METHOD_FROM_RAM_METHOD(method++);
887
J9UTF8 * nameUTF = J9ROMMETHOD_NAME(romMethod);
888
889
if (J9UTF8_DATA_EQUALS(J9UTF8_DATA(nameUTF), J9UTF8_LENGTH(nameUTF), eyecatcher, 6)) {
890
J9UTF8 * signatureUTF = J9ROMMETHOD_SIGNATURE(romMethod);
891
char* name = utf8_to_cstring(env, nameUTF);
892
char* signature = utf8_to_cstring(env, signatureUTF);
893
jmethodID methodID = (*env)->GetMethodID(env, clazz, name, signature);
894
jobject reflectedMethod;
895
896
assert(methodID != NULL);
897
if (NULL != name) {
898
j9mem_free_memory(name);
899
}
900
if (NULL != signature) {
901
j9mem_free_memory(signature);
902
}
903
904
reflectedMethod = (*env)->ToReflectedMethod(env, clazz, methodID, JNI_FALSE);
905
assert(reflectedMethod != NULL);
906
(*env)->SetObjectArrayElement(env, result, index++, reflectedMethod);
907
}
908
}
909
}
910
911
return result;
912
}
913
914
915
916
jobject JNICALL
917
JVM_GetClassDeclaredFields(JNIEnv* env, jobject clazz, jint arg2)
918
{
919
J9Class* ramClass;
920
J9ROMClass* romClass;
921
jclass jlrField;
922
jsize size;
923
jobjectArray result;
924
J9ROMFieldShape *field;
925
J9ROMFieldWalkState walkState;
926
jsize index = 0;
927
PORT_ACCESS_FROM_ENV(env);
928
929
ramClass = java_lang_Class_vmRef(env, clazz);
930
romClass = ramClass->romClass;
931
932
/* Primitives/Arrays don't have fields. */
933
if (J9ROMCLASS_IS_PRIMITIVE_OR_ARRAY(romClass)) {
934
size = 0;
935
} else {
936
size = romClass->romFieldCount;
937
}
938
939
/* Look up the field class */
940
jlrField = (*env)->FindClass(env, "java/lang/reflect/Field");
941
if (NULL == jlrField) {
942
return NULL;
943
}
944
945
/* Create the result array */
946
result = (*env)->NewObjectArray(env, size, jlrField, NULL);
947
if (NULL == result) {
948
return NULL;
949
}
950
951
/* Iterate through the fields */
952
field = romFieldsStartDo( romClass, &walkState );
953
while( field != NULL ) {
954
U_32 modifiers = field->modifiers;
955
jfieldID fieldID;
956
jobject reflectedField;
957
jboolean isStatic;
958
J9UTF8* nameUTF = J9ROMFIELDSHAPE_NAME(field);
959
J9UTF8* signatureUTF = J9ROMFIELDSHAPE_SIGNATURE(field);
960
char* name = utf8_to_cstring(env, nameUTF);
961
char* signature = utf8_to_cstring(env, signatureUTF);
962
963
if(modifiers & J9AccStatic) {
964
fieldID = (*env)->GetStaticFieldID(env, clazz, name, signature);
965
isStatic = JNI_TRUE;
966
} else {
967
fieldID = (*env)->GetFieldID(env, clazz, name, signature);
968
isStatic = JNI_FALSE;
969
}
970
971
if (NULL != name) {
972
j9mem_free_memory(name);
973
}
974
if (NULL != signature) {
975
j9mem_free_memory(signature);
976
}
977
978
assert(fieldID != NULL);
979
reflectedField = (*env)->ToReflectedField(env, clazz, fieldID, isStatic);
980
assert(reflectedField != NULL);
981
(*env)->SetObjectArrayElement(env, result, index++, reflectedField);
982
field = romFieldsNextDo( &walkState );
983
}
984
985
return result;
986
}
987
988
989
990
jobject JNICALL
991
JVM_GetClassDeclaredMethods(JNIEnv* env, jobject clazz, jboolean unknown)
992
{
993
J9Class* ramClass;
994
J9ROMClass* romClass;
995
jclass jlrMethod;
996
jobjectArray result;
997
char* eyecatcher = "<init>";
998
U_16 initLength = 6;
999
jsize size = 0;
1000
PORT_ACCESS_FROM_ENV(env);
1001
1002
ramClass = java_lang_Class_vmRef(env, clazz);
1003
romClass = ramClass->romClass;
1004
1005
/* Primitives/Arrays don't have fields. */
1006
if (J9ROMCLASS_IS_PRIMITIVE_OR_ARRAY(romClass) || J9ROMCLASS_IS_INTERFACE(romClass)) {
1007
size = 0;
1008
} else {
1009
U_32 romMethodCount = romClass->romMethodCount;
1010
J9Method * method = ramClass->ramMethods;
1011
1012
while (romMethodCount-- != 0) {
1013
J9ROMMethod * romMethod = J9_ROM_METHOD_FROM_RAM_METHOD(method++);
1014
J9UTF8 * nameUTF = J9ROMMETHOD_NAME(romMethod);
1015
1016
if (!J9UTF8_DATA_EQUALS(J9UTF8_DATA(nameUTF), J9UTF8_LENGTH(nameUTF), eyecatcher, 6)) {
1017
size++;
1018
}
1019
}
1020
}
1021
1022
/* Look up the field class */
1023
jlrMethod = (*env)->FindClass(env, "java/lang/reflect/Method");
1024
if (NULL == jlrMethod) {
1025
return NULL;
1026
}
1027
1028
/* Create the result array */
1029
result = (*env)->NewObjectArray(env, size, jlrMethod, NULL);
1030
if (NULL == result) {
1031
return NULL;
1032
}
1033
1034
/* Now walk and fill in the contents */
1035
if (size != 0) {
1036
U_32 romMethodCount = romClass->romMethodCount;
1037
J9Method* method = ramClass->ramMethods;
1038
jsize index = 0;
1039
1040
while (romMethodCount-- != 0) {
1041
J9ROMMethod * romMethod = J9_ROM_METHOD_FROM_RAM_METHOD(method++);
1042
J9UTF8 * nameUTF = J9ROMMETHOD_NAME(romMethod);
1043
1044
if (!J9UTF8_DATA_EQUALS(J9UTF8_DATA(nameUTF), J9UTF8_LENGTH(nameUTF), eyecatcher, 6)) {
1045
J9UTF8 * signatureUTF = J9ROMMETHOD_SIGNATURE(romMethod);
1046
char* name = utf8_to_cstring(env, nameUTF);
1047
char* signature = utf8_to_cstring(env, signatureUTF);
1048
U_32 modifiers = romMethod->modifiers;
1049
jmethodID methodID;
1050
jobject reflectedMethod;
1051
jboolean isStatic;
1052
1053
if(modifiers & J9AccStatic) {
1054
methodID = (*env)->GetStaticMethodID(env, clazz, name, signature);
1055
isStatic = JNI_TRUE;
1056
} else {
1057
methodID = (*env)->GetMethodID(env, clazz, name, signature);
1058
isStatic = JNI_FALSE;
1059
}
1060
1061
1062
assert(methodID != NULL);
1063
if (NULL != name) {
1064
j9mem_free_memory(name);
1065
}
1066
if (NULL != signature) {
1067
j9mem_free_memory(signature);
1068
}
1069
1070
reflectedMethod = (*env)->ToReflectedMethod(env, clazz, methodID, isStatic);
1071
assert(reflectedMethod != NULL);
1072
(*env)->SetObjectArrayElement(env, result, index++, reflectedMethod);
1073
}
1074
}
1075
}
1076
1077
return result;
1078
}
1079
1080
1081
1082
jobject JNICALL
1083
JVM_GetClassInterfaces(jint arg0, jint arg1)
1084
{
1085
assert(!"JVM_GetClassInterfaces() stubbed!");
1086
return NULL;
1087
}
1088
1089
1090
1091
jint JNICALL
1092
JVM_GetClassModifiers(JNIEnv* env, jclass clazz)
1093
{
1094
J9Class* ramClass = java_lang_Class_vmRef(env, clazz);
1095
J9ROMClass* romClass = ramClass->romClass;
1096
1097
if (J9ROMCLASS_IS_ARRAY(romClass)) {
1098
J9ArrayClass* arrayClass = (J9ArrayClass*)ramClass;
1099
jint result = 0;
1100
J9ROMClass *leafRomClass = arrayClass->leafComponentType->romClass;
1101
if (J9_ARE_ALL_BITS_SET(leafRomClass->extraModifiers, J9AccClassInnerClass)) {
1102
result = leafRomClass->memberAccessFlags;
1103
} else {
1104
result = leafRomClass->modifiers;
1105
}
1106
1107
result |= (J9AccAbstract | J9AccFinal);
1108
return result;
1109
} else {
1110
if (J9_ARE_ALL_BITS_SET(romClass->extraModifiers, J9AccClassInnerClass)) {
1111
return romClass->memberAccessFlags;
1112
} else {
1113
return romClass->modifiers;
1114
}
1115
}
1116
}
1117
1118
1119
1120
jobject JNICALL
1121
JVM_GetClassSigners(jint arg0, jint arg1)
1122
{
1123
assert(!"JVM_GetClassSigners() stubbed!");
1124
return NULL;
1125
}
1126
1127
1128
1129
jobject JNICALL
1130
JVM_GetComponentType(JNIEnv* env, jclass clazz)
1131
{
1132
J9Class* ramClass = java_lang_Class_vmRef(env, clazz);
1133
J9ROMClass* romClass = ramClass->romClass;
1134
1135
if (J9ROMCLASS_IS_ARRAY(romClass)) {
1136
J9ArrayClass* arrayClass = (J9ArrayClass*)ramClass;
1137
return (jobject)&(arrayClass->leafComponentType->classObject);
1138
}
1139
return NULL;
1140
}
1141
1142
1143
1144
jobject JNICALL
1145
JVM_GetDeclaredClasses(jint arg0, jint arg1)
1146
{
1147
assert(!"JVM_GetDeclaredClasses() stubbed!");
1148
return NULL;
1149
}
1150
1151
1152
1153
jobject JNICALL
1154
JVM_GetDeclaringClass(jint arg0, jint arg1)
1155
{
1156
assert(!"JVM_GetDeclaringClass() stubbed!");
1157
return NULL;
1158
}
1159
1160
1161
1162
jobject JNICALL
1163
JVM_GetInheritedAccessControlContext(jint arg0, jint arg1)
1164
{
1165
assert(!"JVM_GetInheritedAccessControlContext() stubbed!");
1166
return NULL;
1167
}
1168
1169
1170
1171
/**
1172
* Get the primitive array element at index.
1173
* This function may lock, gc or throw exception.
1174
* @param array The array
1175
* @param index The index
1176
* @param wCode the native symbol code
1177
* @return a union of primitive value
1178
*/
1179
jvalue JNICALL
1180
JVM_GetPrimitiveArrayElement(JNIEnv *env, jobject array, jint index, jint wCode)
1181
{
1182
J9VMThread *currentThread;
1183
J9JavaVM *vm;
1184
J9InternalVMFunctions *vmFuncs;
1185
jvalue value;
1186
1187
Assert_SC_notNull(env);
1188
1189
currentThread = (J9VMThread *) env;
1190
vm = currentThread->javaVM;
1191
vmFuncs = vm->internalVMFunctions;
1192
value.j = 0;
1193
1194
vmFuncs->internalEnterVMFromJNI(currentThread);
1195
1196
if (NULL == array) {
1197
vmFuncs->setCurrentException(currentThread, J9VMCONSTANTPOOL_JAVALANGNULLPOINTEREXCEPTION, NULL);
1198
} else {
1199
j9object_t j9array = J9_JNI_UNWRAP_REFERENCE(array);
1200
J9ArrayClass *arrayClass = (J9ArrayClass *) J9OBJECT_CLAZZ(currentThread, j9array);
1201
J9Class *typeOfArray = (J9Class *) arrayClass->componentType;
1202
1203
if (J9CLASS_IS_ARRAY(arrayClass) && J9ROMCLASS_IS_PRIMITIVE_TYPE(typeOfArray->romClass)) {
1204
if ((index < 0) || (((jint) J9INDEXABLEOBJECT_SIZE(currentThread, j9array)) <= index)) {
1205
vmFuncs->setCurrentException(currentThread, J9VMCONSTANTPOOL_JAVALANGARRAYINDEXOUTOFBOUNDSEXCEPTION, NULL);
1206
} else {
1207
BOOLEAN invalidArgument = FALSE;
1208
1209
if (vm->booleanReflectClass == typeOfArray) {
1210
if (POK_BOOLEAN == wCode) {
1211
value.z = J9JAVAARRAYOFBOOLEAN_LOAD(currentThread, j9array, index);
1212
} else {
1213
invalidArgument = TRUE;
1214
}
1215
} else if (vm->charReflectClass == typeOfArray) {
1216
switch (wCode) {
1217
case POK_CHAR:
1218
value.c = J9JAVAARRAYOFCHAR_LOAD(currentThread, j9array, index);
1219
break;
1220
case POK_FLOAT:
1221
value.f = (jfloat) J9JAVAARRAYOFCHAR_LOAD(currentThread, j9array, index);
1222
break;
1223
case POK_DOUBLE:
1224
value.d = (jdouble) J9JAVAARRAYOFCHAR_LOAD(currentThread, j9array, index);
1225
break;
1226
case POK_INT:
1227
value.i = J9JAVAARRAYOFCHAR_LOAD(currentThread, j9array, index);
1228
break;
1229
case POK_LONG:
1230
value.j = J9JAVAARRAYOFCHAR_LOAD(currentThread, j9array, index);
1231
break;
1232
default:
1233
invalidArgument = TRUE;
1234
break;
1235
}
1236
} else if (vm->floatReflectClass == typeOfArray) {
1237
jfloat val = 0;
1238
switch (wCode) {
1239
case POK_FLOAT:
1240
*(U_32 *) &value.f = J9JAVAARRAYOFFLOAT_LOAD(currentThread, j9array, index);
1241
break;
1242
case POK_DOUBLE:
1243
*(U_32 *) &val = J9JAVAARRAYOFFLOAT_LOAD(currentThread, j9array, index);
1244
value.d = (jdouble) val;
1245
break;
1246
default:
1247
invalidArgument = TRUE;
1248
break;
1249
}
1250
} else if (vm->doubleReflectClass == typeOfArray) {
1251
if (POK_DOUBLE == wCode) {
1252
*(U_64 *) &value.d = J9JAVAARRAYOFDOUBLE_LOAD(currentThread, j9array, index);
1253
} else {
1254
invalidArgument = TRUE;
1255
}
1256
} else if (vm->byteReflectClass == typeOfArray) {
1257
switch (wCode) {
1258
case POK_FLOAT:
1259
value.f = (jfloat) J9JAVAARRAYOFBYTE_LOAD(currentThread, j9array, index);
1260
break;
1261
case POK_DOUBLE:
1262
value.d = (jdouble) J9JAVAARRAYOFBYTE_LOAD(currentThread, j9array, index);
1263
break;
1264
case POK_BYTE:
1265
value.b = J9JAVAARRAYOFBYTE_LOAD(currentThread, j9array, index);
1266
break;
1267
case POK_SHORT:
1268
value.s = J9JAVAARRAYOFBYTE_LOAD(currentThread, j9array, index);
1269
break;
1270
case POK_INT:
1271
value.i = J9JAVAARRAYOFBYTE_LOAD(currentThread, j9array, index);
1272
break;
1273
case POK_LONG:
1274
value.j = J9JAVAARRAYOFBYTE_LOAD(currentThread, j9array, index);
1275
break;
1276
default:
1277
invalidArgument = TRUE;
1278
break;
1279
}
1280
} else if (vm->shortReflectClass == typeOfArray) {
1281
switch (wCode) {
1282
case POK_FLOAT:
1283
value.f = (jfloat) J9JAVAARRAYOFSHORT_LOAD(currentThread, j9array, index);
1284
break;
1285
case POK_DOUBLE:
1286
value.d = (jdouble) J9JAVAARRAYOFSHORT_LOAD(currentThread, j9array, index);
1287
break;
1288
case POK_SHORT:
1289
value.s = J9JAVAARRAYOFSHORT_LOAD(currentThread, j9array, index);
1290
break;
1291
case POK_INT:
1292
value.i = J9JAVAARRAYOFSHORT_LOAD(currentThread, j9array, index);
1293
break;
1294
case POK_LONG:
1295
value.j = J9JAVAARRAYOFSHORT_LOAD(currentThread, j9array, index);
1296
break;
1297
default:
1298
invalidArgument = TRUE;
1299
break;
1300
}
1301
} else if (vm->intReflectClass == typeOfArray) {
1302
switch (wCode) {
1303
case POK_FLOAT:
1304
value.f = (jfloat) J9JAVAARRAYOFINT_LOAD(currentThread, j9array, index);
1305
break;
1306
case POK_DOUBLE:
1307
value.d = (jdouble) J9JAVAARRAYOFINT_LOAD(currentThread, j9array, index);
1308
break;
1309
case POK_INT:
1310
value.i = J9JAVAARRAYOFINT_LOAD(currentThread, j9array, index);
1311
break;
1312
case POK_LONG:
1313
value.j = J9JAVAARRAYOFINT_LOAD(currentThread, j9array, index);
1314
break;
1315
default:
1316
invalidArgument = TRUE;
1317
break;
1318
}
1319
} else if (vm->longReflectClass == typeOfArray) {
1320
switch (wCode) {
1321
case POK_FLOAT:
1322
value.f = (jfloat) J9JAVAARRAYOFLONG_LOAD(currentThread, j9array, index);
1323
break;
1324
case POK_DOUBLE:
1325
value.d = (jdouble) J9JAVAARRAYOFLONG_LOAD(currentThread, j9array, index);
1326
break;
1327
case POK_LONG:
1328
value.j = J9JAVAARRAYOFLONG_LOAD(currentThread, j9array, index);
1329
break;
1330
default:
1331
invalidArgument = TRUE;
1332
break;
1333
}
1334
} else {
1335
invalidArgument = TRUE;
1336
}
1337
if (invalidArgument) {
1338
vmFuncs->setCurrentException(currentThread, J9VMCONSTANTPOOL_JAVALANGILLEGALARGUMENTEXCEPTION, NULL);
1339
}
1340
}
1341
} else {
1342
vmFuncs->setCurrentException(currentThread, J9VMCONSTANTPOOL_JAVALANGILLEGALARGUMENTEXCEPTION, NULL);
1343
}
1344
}
1345
vmFuncs->internalExitVMToJNI(currentThread);
1346
1347
return value;
1348
}
1349
1350
1351
1352
jobject JNICALL
1353
JVM_GetProtectionDomain(jint arg0, jint arg1)
1354
{
1355
assert(!"JVM_GetProtectionDomain() stubbed!");
1356
return NULL;
1357
}
1358
1359
jobject JNICALL
1360
JVM_GetStackAccessControlContext(JNIEnv* env, jclass java_security_AccessController)
1361
{
1362
return NULL;
1363
}
1364
1365
jint JNICALL
1366
JVM_GetStackTraceDepth(JNIEnv* env, jobject throwable)
1367
{
1368
J9VMThread* currentThread = (J9VMThread*) env;
1369
J9JavaVM * vm = currentThread->javaVM;
1370
J9InternalVMFunctions * vmfns = vm->internalVMFunctions;
1371
jint numberOfFrames;
1372
UDATA pruneConstructors = 0;
1373
1374
vmfns->internalEnterVMFromJNI(currentThread);
1375
numberOfFrames = (jint)vmfns->iterateStackTrace(currentThread, (j9object_t*)throwable, NULL, NULL, pruneConstructors);
1376
vmfns->internalExitVMToJNI(currentThread);
1377
1378
return numberOfFrames;
1379
}
1380
1381
1382
static jclass
1383
java_lang_StackTraceElement(JNIEnv* env)
1384
{
1385
static jclass cached = NULL;
1386
jclass localRef = NULL;
1387
1388
if (NULL != cached) {
1389
return cached;
1390
}
1391
1392
localRef = (*env)->FindClass(env, "java/lang/StackTraceElement");
1393
assert(localRef != NULL);
1394
1395
cached = (*env)->NewGlobalRef(env, localRef);
1396
if (cached == NULL) {
1397
return NULL;
1398
}
1399
1400
(*env)->DeleteLocalRef(env,localRef);
1401
assert(localRef != NULL);
1402
return cached;
1403
}
1404
1405
static jmethodID
1406
java_lang_StackTraceElement_init(JNIEnv* env)
1407
{
1408
static jmethodID cached = NULL;
1409
if (NULL != cached) {
1410
return cached;
1411
}
1412
1413
cached = (*env)->GetMethodID(env, java_lang_StackTraceElement(env), "<init>", "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;I)V" );
1414
assert(cached != NULL);
1415
return cached;
1416
}
1417
1418
1419
typedef struct GetStackTraceElementUserData {
1420
J9ROMClass * romClass;
1421
J9ROMMethod * romMethod;
1422
J9UTF8 * fileName;
1423
UDATA lineNumber;
1424
J9ClassLoader* classLoader;
1425
UDATA seekFrameIndex;
1426
UDATA currentFrameIndex;
1427
BOOLEAN found;
1428
} GetStackTraceElementUserData;
1429
1430
/* Return TRUE to keep iterating, FALSE to halt the walk. */
1431
static UDATA
1432
getStackTraceElementIterator(J9VMThread * vmThread, void * voidUserData, UDATA bytecodeOffset, J9ROMClass * romClass, J9ROMMethod * romMethod, J9UTF8 * fileName, UDATA lineNumber, J9ClassLoader* classLoader, J9Class* ramClass)
1433
{
1434
GetStackTraceElementUserData * userData = voidUserData;
1435
1436
if (userData->seekFrameIndex == userData->currentFrameIndex) {
1437
/* We are done, remember the current state and return */
1438
userData->romClass = romClass;
1439
userData->romMethod = romMethod;
1440
userData->fileName = fileName;
1441
userData->lineNumber = lineNumber;
1442
userData->classLoader = classLoader;
1443
userData->found = TRUE;
1444
return FALSE;
1445
}
1446
1447
userData->currentFrameIndex++;
1448
return TRUE;
1449
}
1450
1451
jobject JNICALL
1452
JVM_GetStackTraceElement(JNIEnv* env, jobject throwable, jint index)
1453
{
1454
J9VMThread* currentThread = (J9VMThread*) env;
1455
J9JavaVM * vm = currentThread->javaVM;
1456
J9InternalVMFunctions * vmfns = vm->internalVMFunctions;
1457
jobject stackTraceElement;
1458
UDATA pruneConstructors = 0;
1459
GetStackTraceElementUserData userData;
1460
jobject declaringClass = NULL;
1461
jobject methodName = NULL;
1462
jobject fileName = NULL;
1463
jint lineNumber = -1;
1464
1465
memset(&userData,0, sizeof(userData));
1466
userData.seekFrameIndex = index;
1467
1468
vmfns->internalEnterVMFromJNI(currentThread);
1469
vmfns->iterateStackTrace(currentThread, (j9object_t*)throwable, getStackTraceElementIterator, &userData, pruneConstructors);
1470
vmfns->internalExitVMToJNI(currentThread);
1471
1472
/* Bail if we couldn't find the frame */
1473
if (TRUE != userData.found) {
1474
return NULL;
1475
}
1476
1477
/* Convert to Java format */
1478
declaringClass = utf8_to_java_lang_String(env, J9ROMCLASS_CLASSNAME(userData.romClass));
1479
methodName = utf8_to_java_lang_String(env, J9ROMMETHOD_NAME(userData.romMethod));
1480
fileName = utf8_to_java_lang_String(env, userData.fileName);
1481
lineNumber = (jint)userData.lineNumber;
1482
1483
stackTraceElement = (*env)->NewObject(
1484
env,
1485
java_lang_StackTraceElement(env),
1486
java_lang_StackTraceElement_init(env),
1487
declaringClass,
1488
methodName,
1489
fileName,
1490
lineNumber);
1491
1492
assert(NULL != stackTraceElement);
1493
return stackTraceElement;
1494
}
1495
1496
1497
1498
jobject JNICALL
1499
JVM_HoldsLock(jint arg0, jint arg1, jint arg2)
1500
{
1501
assert(!"JVM_HoldsLock() stubbed!");
1502
return NULL;
1503
}
1504
1505
1506
1507
/**
1508
* Get hashCode of the object. This function may lock, gc or throw exception.
1509
* @return hashCode, if obj is not NULL.
1510
* @return 0, if obj is NULL.
1511
*/
1512
jint JNICALL
1513
JVM_IHashCode(JNIEnv *env, jobject obj)
1514
{
1515
jint result = 0;
1516
1517
if (obj != NULL) {
1518
J9VMThread * currentThread = (J9VMThread *) env;
1519
J9JavaVM * vm = currentThread->javaVM;
1520
J9InternalVMFunctions * vmFuncs = vm->internalVMFunctions;
1521
1522
vmFuncs->internalEnterVMFromJNI(currentThread);
1523
result = vm->memoryManagerFunctions->j9gc_objaccess_getObjectHashCode(vm, J9_JNI_UNWRAP_REFERENCE(obj));
1524
vmFuncs->internalExitVMToJNI(currentThread);
1525
}
1526
1527
return result;
1528
}
1529
1530
1531
1532
jobject JNICALL
1533
JVM_InitProperties(JNIEnv* env, jobject properties)
1534
{
1535
/* This JVM method is invoked by JCL native Java_java_lang_System_initProperties
1536
* only for initialization of platform encoding.
1537
* This is only required by Java 11 raw builds.
1538
* This method is not invoked by other Java levels.
1539
*/
1540
#if JAVA_SPEC_VERSION < 11
1541
assert(!"JVM_InitProperties should not be called!");
1542
#endif /* JAVA_SPEC_VERSION < 11 */
1543
return properties;
1544
}
1545
1546
1547
1548
/**
1549
* Returns a canonical representation for the string object. If the string is already in the pool, just return
1550
* the string. If not, add the string to the pool and return the string.
1551
* This function may lock, gc or throw exception.
1552
* @param str The string object.
1553
* @return NULL if str is NULL
1554
* @return The interned string
1555
*/
1556
jstring JNICALL
1557
JVM_InternString(JNIEnv *env, jstring str)
1558
{
1559
if (str != NULL) {
1560
J9VMThread* currentThread = (J9VMThread*) env;
1561
J9JavaVM* javaVM = currentThread->javaVM;
1562
J9InternalVMFunctions* vmfns = javaVM->internalVMFunctions;
1563
j9object_t stringObject;
1564
1565
vmfns->internalEnterVMFromJNI(currentThread);
1566
stringObject = J9_JNI_UNWRAP_REFERENCE(str);
1567
stringObject = javaVM->memoryManagerFunctions->j9gc_internString(currentThread, stringObject);
1568
str = vmfns->j9jni_createLocalRef(env, stringObject);
1569
vmfns->internalExitVMToJNI(currentThread);
1570
}
1571
1572
return str;
1573
}
1574
1575
1576
1577
jobject JNICALL
1578
JVM_Interrupt(jint arg0, jint arg1)
1579
{
1580
assert(!"JVM_Interrupt() stubbed!");
1581
return NULL;
1582
}
1583
1584
1585
1586
jboolean JNICALL
1587
JVM_IsArrayClass(JNIEnv* env, jclass clazz)
1588
{
1589
J9Class * ramClass = java_lang_Class_vmRef(env, clazz);
1590
if (J9ROMCLASS_IS_ARRAY(ramClass->romClass)) {
1591
return JNI_TRUE;
1592
} else {
1593
return JNI_FALSE;
1594
}
1595
}
1596
1597
1598
1599
jboolean JNICALL
1600
JVM_IsInterface(JNIEnv* env, jclass clazz)
1601
{
1602
J9Class * ramClass = java_lang_Class_vmRef(env, clazz);
1603
if (J9ROMCLASS_IS_INTERFACE(ramClass->romClass)) {
1604
return JNI_TRUE;
1605
} else {
1606
return JNI_FALSE;
1607
}
1608
}
1609
1610
1611
1612
jboolean JNICALL
1613
JVM_IsInterrupted(JNIEnv* env, jobject thread, jboolean unknown)
1614
{
1615
J9VMThread *currentThread = (J9VMThread *)env;
1616
J9VMThread *targetThread;
1617
J9JavaVM* vm = currentThread->javaVM;
1618
J9ThreadEnv* threadEnv = getJ9ThreadEnv(env);
1619
UDATA rcClear;
1620
1621
vm->internalVMFunctions->internalEnterVMFromJNI(currentThread);
1622
targetThread = J9VMJAVALANGTHREAD_THREADREF(currentThread, J9_JNI_UNWRAP_REFERENCE(thread) );
1623
vm->internalVMFunctions->internalExitVMToJNI(currentThread);
1624
1625
assert(targetThread == currentThread);
1626
1627
if (NULL != vm->sidecarClearInterruptFunction) {
1628
vm->sidecarClearInterruptFunction(currentThread);
1629
}
1630
1631
rcClear = threadEnv->clear_interrupted();
1632
if (0 != rcClear) {
1633
return JNI_TRUE;
1634
} else {
1635
return JNI_FALSE;
1636
}
1637
}
1638
1639
1640
1641
jboolean JNICALL
1642
JVM_IsPrimitiveClass(JNIEnv* env, jclass clazz)
1643
{
1644
J9Class * ramClass = java_lang_Class_vmRef(env, clazz);
1645
if (J9ROMCLASS_IS_PRIMITIVE_TYPE(ramClass->romClass)) {
1646
return JNI_TRUE;
1647
} else {
1648
return JNI_FALSE;
1649
}
1650
}
1651
1652
1653
/**
1654
* Check whether the jni version is supported.
1655
* This function may not lock, gc or throw exception.
1656
* @param version
1657
* @return true if version is JNI_VERSION_1_1, JNI_VERSION_1_2, JNI_VERSION_1_4, JNI_VERSION_1_6, or
1658
* JNI_VERSION_1_8, JNI_VERSION_9, JNI_VERSION_10; false if not.
1659
* @careful
1660
*/
1661
jboolean JNICALL
1662
JVM_IsSupportedJNIVersion(jint version)
1663
{
1664
switch(version) {
1665
case JNI_VERSION_1_1:
1666
case JNI_VERSION_1_2:
1667
case JNI_VERSION_1_4:
1668
case JNI_VERSION_1_6:
1669
case JNI_VERSION_1_8:
1670
#if JAVA_SPEC_VERSION >= 9
1671
case JNI_VERSION_9:
1672
#endif /* JAVA_SPEC_VERSION >= 9 */
1673
#if JAVA_SPEC_VERSION >= 10
1674
case JNI_VERSION_10:
1675
#endif /* JAVA_SPEC_VERSION >= 10 */
1676
return JNI_TRUE;
1677
1678
default:
1679
return JNI_FALSE;
1680
}
1681
}
1682
1683
1684
1685
jboolean JNICALL
1686
JVM_IsThreadAlive(JNIEnv* jniEnv, jobject targetThread)
1687
{
1688
J9VMThread* currentThread = (J9VMThread*) jniEnv;
1689
J9JavaVM* vm = currentThread->javaVM;
1690
J9VMThread* vmThread;
1691
1692
vm->internalVMFunctions->internalEnterVMFromJNI(currentThread);
1693
vmThread = J9VMJAVALANGTHREAD_THREADREF(currentThread, J9_JNI_UNWRAP_REFERENCE(targetThread) );
1694
vm->internalVMFunctions->internalExitVMToJNI(currentThread);
1695
1696
/* Assume that a non-null threadRef indicates the thread is alive */
1697
return (NULL == vmThread) ? JNI_FALSE : JNI_TRUE;
1698
}
1699
1700
1701
1702
jobject JNICALL
1703
JVM_NewArray(JNIEnv* jniEnv, jclass componentType, jint dimension)
1704
{
1705
J9VMThread* currentThread = (J9VMThread*) jniEnv;
1706
J9JavaVM* vm = currentThread->javaVM;
1707
J9MemoryManagerFunctions * mmfns = vm->memoryManagerFunctions;
1708
J9Class* ramClass = java_lang_Class_vmRef(jniEnv, componentType);
1709
J9ROMClass* romClass = ramClass->romClass;
1710
j9object_t newArray;
1711
jobject arrayRef;
1712
1713
vm->internalVMFunctions->internalEnterVMFromJNI(currentThread);
1714
if (ramClass->arrayClass == NULL) {
1715
vm->internalVMFunctions->setCurrentException(currentThread, J9VMCONSTANTPOOL_JAVALANGILLEGALARGUMENTEXCEPTION, NULL);
1716
return NULL;
1717
}
1718
1719
newArray = vm->memoryManagerFunctions->J9AllocateIndexableObject(
1720
currentThread, ramClass->arrayClass, dimension, J9_GC_ALLOCATE_OBJECT_NON_INSTRUMENTABLE);
1721
1722
if (NULL == newArray) {
1723
vm->internalVMFunctions->setHeapOutOfMemoryError(currentThread);
1724
return NULL;
1725
}
1726
1727
arrayRef = vm->internalVMFunctions->j9jni_createLocalRef(jniEnv, newArray);
1728
vm->internalVMFunctions->internalExitVMToJNI(currentThread);
1729
return arrayRef;
1730
}
1731
1732
1733
static J9Class *
1734
fetchArrayClass(struct J9VMThread *vmThread, J9Class *elementTypeClass)
1735
{
1736
/* Quick check before grabbing the mutex */
1737
J9Class *resultClass = elementTypeClass->arrayClass;
1738
if (NULL == resultClass) {
1739
/* Allocate an array class */
1740
J9ROMArrayClass* arrayOfObjectsROMClass = (J9ROMArrayClass*)J9ROMIMAGEHEADER_FIRSTCLASS(vmThread->javaVM->arrayROMClasses);
1741
1742
resultClass = vmThread->javaVM->internalVMFunctions->internalCreateArrayClass(vmThread, arrayOfObjectsROMClass, elementTypeClass);
1743
}
1744
return resultClass;
1745
}
1746
1747
1748
/**
1749
* Allocate a multi-dimension array with class specified
1750
* This function may lock, gc or throw exception.
1751
* @param eltClass The class of the element
1752
* @param dim The dimension
1753
* @return The newly allocated array
1754
*/
1755
jobject JNICALL
1756
JVM_NewMultiArray(JNIEnv *env, jclass eltClass, jintArray dim)
1757
{
1758
/* Maximum array dimensions, according to the spec for the array bytecodes, is 255 */
1759
#define MAX_DIMENSIONS 255
1760
J9VMThread *currentThread = (J9VMThread *) env;
1761
J9InternalVMFunctions * vmFuncs = currentThread->javaVM->internalVMFunctions;
1762
jobject result = NULL;
1763
1764
vmFuncs->internalEnterVMFromJNI(currentThread);
1765
1766
if (NULL == dim) {
1767
vmFuncs->setCurrentException(currentThread, J9VMCONSTANTPOOL_JAVALANGNULLPOINTEREXCEPTION, NULL);
1768
} else {
1769
j9object_t dimensionsArrayObject = J9_JNI_UNWRAP_REFERENCE(dim);
1770
UDATA dimensions = J9INDEXABLEOBJECT_SIZE(currentThread, dimensionsArrayObject);
1771
1772
dimensionsArrayObject = NULL; /* must be refetched after GC points below */
1773
if (dimensions > MAX_DIMENSIONS) {
1774
/* the spec says to throw this exception if the number of dimensions in greater than the count we support (and a NULL message appears to be the behaviour of the reference implementation) */
1775
vmFuncs->setCurrentException(currentThread, J9VMCONSTANTPOOL_JAVALANGILLEGALARGUMENTEXCEPTION, NULL);
1776
} else {
1777
j9object_t componentTypeClassObject = J9_JNI_UNWRAP_REFERENCE(eltClass);
1778
1779
if (NULL != componentTypeClassObject) {
1780
J9Class *componentTypeClass = J9VM_J9CLASS_FROM_HEAPCLASS(currentThread, componentTypeClassObject);
1781
1782
/* create an array class with the desired arity */
1783
UDATA count = dimensions;
1784
J9Class *componentArrayClass = componentTypeClass;
1785
BOOLEAN exceptionIsPending = FALSE;
1786
1787
while ((count > 0) && (!exceptionIsPending)) {
1788
componentArrayClass = fetchArrayClass(currentThread, componentArrayClass);
1789
exceptionIsPending = (NULL != currentThread->currentException);
1790
count -= 1;
1791
}
1792
1793
if (!exceptionIsPending) {
1794
/* make a copy of the dimensions array in non-object memory */
1795
I_32 onStackDimensions[MAX_DIMENSIONS];
1796
j9object_t directObject = NULL;
1797
UDATA i = 0;
1798
1799
memset(onStackDimensions, 0, sizeof(onStackDimensions));
1800
dimensionsArrayObject = J9_JNI_UNWRAP_REFERENCE(dim);
1801
for (i = 0; i < dimensions; i++) {
1802
onStackDimensions[i] = J9JAVAARRAYOFINT_LOAD(currentThread, dimensionsArrayObject, i);
1803
}
1804
1805
directObject = vmFuncs->helperMultiANewArray(currentThread, (J9ArrayClass *)componentArrayClass, (UDATA)dimensions, onStackDimensions, J9_GC_ALLOCATE_OBJECT_NON_INSTRUMENTABLE);
1806
if (NULL != directObject) {
1807
result = vmFuncs->j9jni_createLocalRef(env, directObject);
1808
}
1809
}
1810
}
1811
}
1812
}
1813
1814
vmFuncs->internalExitVMToJNI(currentThread);
1815
return result;
1816
}
1817
1818
1819
1820
1821
jobject JNICALL
1822
JVM_ResolveClass(jint arg0, jint arg1)
1823
{
1824
assert(!"JVM_ResolveClass() stubbed!");
1825
return NULL;
1826
}
1827
1828
1829
1830
jobject JNICALL
1831
JVM_ResumeThread(jint arg0, jint arg1)
1832
{
1833
assert(!"JVM_ResumeThread() stubbed!");
1834
return NULL;
1835
}
1836
1837
1838
1839
/**
1840
* Set the val to the array at the index.
1841
* This function may lock, gc or throw exception.
1842
* @param array The array
1843
* @param index The index
1844
* @param value The set value
1845
*/
1846
void JNICALL
1847
JVM_SetArrayElement(JNIEnv *env, jobject array, jint index, jobject value)
1848
{
1849
J9VMThread *currentThread;
1850
J9JavaVM *vm;
1851
J9InternalVMFunctions *vmFuncs;
1852
1853
Assert_SC_notNull(env);
1854
1855
currentThread = (J9VMThread *) env;
1856
vm = currentThread->javaVM;
1857
vmFuncs = vm->internalVMFunctions;
1858
1859
vmFuncs->internalEnterVMFromJNI(currentThread);
1860
1861
if (NULL == array) {
1862
vmFuncs->setCurrentException(currentThread, J9VMCONSTANTPOOL_JAVALANGNULLPOINTEREXCEPTION, NULL);
1863
} else {
1864
j9object_t j9array = J9_JNI_UNWRAP_REFERENCE(array);
1865
J9ArrayClass *arrayClass = (J9ArrayClass *) J9OBJECT_CLAZZ(currentThread, j9array);
1866
J9Class *typeOfArray = arrayClass->componentType;
1867
1868
if (J9CLASS_IS_ARRAY(arrayClass)) {
1869
if ((index < 0) || (((jint) J9INDEXABLEOBJECT_SIZE(currentThread, j9array)) <= index)) {
1870
vmFuncs->setCurrentException(currentThread, J9VMCONSTANTPOOL_JAVALANGARRAYINDEXOUTOFBOUNDSEXCEPTION, NULL);
1871
} else {
1872
if (J9ROMCLASS_IS_PRIMITIVE_TYPE(typeOfArray->romClass)) {
1873
if (NULL == value) {
1874
vmFuncs->setCurrentException(currentThread, J9VMCONSTANTPOOL_JAVALANGNULLPOINTEREXCEPTION, NULL);
1875
} else {
1876
J9Class *booleanWrapperClass = J9VMJAVALANGBOOLEAN_OR_NULL(vm);
1877
J9Class *byteWrapperClass = J9VMJAVALANGBYTE_OR_NULL(vm);
1878
J9Class *shortWrapperClass = J9VMJAVALANGSHORT_OR_NULL(vm);
1879
J9Class *charWrapperClass = J9VMJAVALANGCHARACTER_OR_NULL(vm);
1880
J9Class *intWrapperClass = J9VMJAVALANGINTEGER_OR_NULL(vm);
1881
J9Class *floatWrapperClass = J9VMJAVALANGFLOAT_OR_NULL(vm);
1882
J9Class *doubleWrapperClass = J9VMJAVALANGDOUBLE_OR_NULL(vm);
1883
J9Class *longWrapperClass = J9VMJAVALANGLONG_OR_NULL(vm);
1884
1885
BOOLEAN invalidArgument = FALSE;
1886
j9object_t j9value = J9_JNI_UNWRAP_REFERENCE(value);
1887
J9Class *valueClass = J9OBJECT_CLAZZ(currentThread, j9value);
1888
1889
if (vm->longReflectClass == typeOfArray) {
1890
jlong val = 0;
1891
if (longWrapperClass == valueClass) {
1892
val = J9VMJAVALANGLONG_VALUE(currentThread, j9value);
1893
} else if (intWrapperClass == valueClass) {
1894
val = (jlong) J9VMJAVALANGINTEGER_VALUE(currentThread, j9value);
1895
} else if (shortWrapperClass == valueClass) {
1896
val = (jlong) J9VMJAVALANGSHORT_VALUE(currentThread, j9value);
1897
} else if (charWrapperClass == valueClass) {
1898
val = (jlong) J9VMJAVALANGCHARACTER_VALUE(currentThread, j9value);
1899
} else if (byteWrapperClass == valueClass) {
1900
val = (jlong) J9VMJAVALANGBYTE_VALUE(currentThread, j9value);
1901
} else {
1902
invalidArgument = TRUE;
1903
}
1904
if (!invalidArgument) {
1905
J9JAVAARRAYOFLONG_STORE(currentThread, j9array, index, val);
1906
}
1907
} else if (vm->booleanReflectClass == typeOfArray) {
1908
if (booleanWrapperClass == valueClass) {
1909
J9JAVAARRAYOFBOOLEAN_STORE(currentThread, j9array, index, J9VMJAVALANGBOOLEAN_VALUE(currentThread, j9value));
1910
} else {
1911
invalidArgument = TRUE;
1912
}
1913
} else if (vm->byteReflectClass == typeOfArray) {
1914
if (byteWrapperClass == valueClass) {
1915
J9JAVAARRAYOFBYTE_STORE(currentThread, j9array, index, J9VMJAVALANGBYTE_VALUE(currentThread, j9value));
1916
} else {
1917
invalidArgument = TRUE;
1918
}
1919
} else if (vm->charReflectClass == typeOfArray) {
1920
if (charWrapperClass == valueClass) {
1921
J9JAVAARRAYOFCHAR_STORE(currentThread, j9array, index, J9VMJAVALANGCHARACTER_VALUE(currentThread, j9value));
1922
} else {
1923
invalidArgument = TRUE;
1924
}
1925
} else if (vm->shortReflectClass == typeOfArray) {
1926
jshort val = 0;
1927
if (shortWrapperClass == valueClass) {
1928
val = J9VMJAVALANGSHORT_VALUE(currentThread, j9value);
1929
} else if (byteWrapperClass == valueClass) {
1930
val = (jshort) J9VMJAVALANGBYTE_VALUE(currentThread, j9value);
1931
} else {
1932
invalidArgument = TRUE;
1933
}
1934
if (!invalidArgument) {
1935
J9JAVAARRAYOFSHORT_STORE(currentThread, j9array, index, val);
1936
}
1937
} else if (vm->intReflectClass == typeOfArray) {
1938
jint val = 0;
1939
if (intWrapperClass == valueClass) {
1940
val = J9VMJAVALANGINTEGER_VALUE(currentThread, j9value);
1941
} else if (shortWrapperClass == valueClass) {
1942
val = (jint) J9VMJAVALANGSHORT_VALUE(currentThread, j9value);
1943
} else if (charWrapperClass == valueClass) {
1944
val = (jint) J9VMJAVALANGCHARACTER_VALUE(currentThread, j9value);
1945
} else if (byteWrapperClass == valueClass) {
1946
val = (jint) J9VMJAVALANGBYTE_VALUE(currentThread, j9value);
1947
} else {
1948
invalidArgument = TRUE;
1949
}
1950
if (!invalidArgument) {
1951
J9JAVAARRAYOFINT_STORE(currentThread, j9array, index, val);
1952
}
1953
} else if (vm->floatReflectClass == typeOfArray) {
1954
jfloat val = 0;
1955
if (floatWrapperClass == valueClass) {
1956
*(U_32 *) &val = J9VMJAVALANGFLOAT_VALUE(currentThread, j9value);
1957
} else if (longWrapperClass == valueClass) {
1958
val = (jfloat) J9VMJAVALANGLONG_VALUE(currentThread, j9value);
1959
} else if (intWrapperClass == valueClass) {
1960
val = (jfloat) ((I_32) J9VMJAVALANGINTEGER_VALUE(currentThread, j9value));
1961
} else if (shortWrapperClass == valueClass) {
1962
val = (jfloat) ((I_32) J9VMJAVALANGSHORT_VALUE(currentThread, j9value));
1963
} else if (charWrapperClass == valueClass) {
1964
val = (jfloat) J9VMJAVALANGCHARACTER_VALUE(currentThread, j9value);
1965
} else if (byteWrapperClass == valueClass) {
1966
val = (jfloat) ((I_32) J9VMJAVALANGBYTE_VALUE(currentThread, j9value));
1967
} else {
1968
invalidArgument = TRUE;
1969
}
1970
if (!invalidArgument) {
1971
J9JAVAARRAYOFFLOAT_STORE(currentThread, j9array, index, *(U_32 *) &val);
1972
}
1973
} else if (vm->doubleReflectClass == typeOfArray) {
1974
jdouble val = 0;
1975
if (doubleWrapperClass == valueClass){
1976
*(U_64 *) &val = J9VMJAVALANGDOUBLE_VALUE(currentThread, j9value);
1977
} else if (floatWrapperClass == valueClass) {
1978
jfloat floatNumber;
1979
*(U_32 *) &floatNumber = J9VMJAVALANGFLOAT_VALUE(currentThread, j9value);
1980
val = (jdouble) floatNumber;
1981
} else if (longWrapperClass == valueClass) {
1982
val = (jdouble) J9VMJAVALANGLONG_VALUE(currentThread, j9value);
1983
} else if (intWrapperClass == valueClass) {
1984
val = (jdouble) ((I_32) J9VMJAVALANGINTEGER_VALUE(currentThread, j9value));
1985
} else if (shortWrapperClass == valueClass) {
1986
val = (jdouble) ((I_32) J9VMJAVALANGSHORT_VALUE(currentThread, j9value));
1987
} else if (charWrapperClass == valueClass) {
1988
val = (jdouble) J9VMJAVALANGCHARACTER_VALUE(currentThread, j9value);
1989
} else if (byteWrapperClass == valueClass) {
1990
val = (jdouble) ((I_32) J9VMJAVALANGBYTE_VALUE(currentThread, j9value));
1991
} else {
1992
invalidArgument = TRUE;
1993
}
1994
if (!invalidArgument) {
1995
J9JAVAARRAYOFDOUBLE_STORE(currentThread, j9array, index, *(U_64 *) &val);
1996
}
1997
} else {
1998
invalidArgument = TRUE;
1999
}
2000
if (invalidArgument) {
2001
vmFuncs->setCurrentException(currentThread, J9VMCONSTANTPOOL_JAVALANGILLEGALARGUMENTEXCEPTION, NULL);
2002
}
2003
}
2004
} else {
2005
if (NULL == value) {
2006
J9JAVAARRAYOFOBJECT_STORE(currentThread, j9array, index, value);
2007
} else {
2008
j9object_t j9value = J9_JNI_UNWRAP_REFERENCE(value);
2009
J9Class *valueClass = J9OBJECT_CLAZZ(currentThread, j9value);
2010
2011
if (isSameOrSuperClassOf ((J9Class*) arrayClass->componentType, valueClass)) {
2012
J9JAVAARRAYOFOBJECT_STORE(currentThread, j9array, index, j9value);
2013
} else {
2014
vmFuncs->setCurrentException(currentThread, J9VMCONSTANTPOOL_JAVALANGILLEGALARGUMENTEXCEPTION, NULL);
2015
}
2016
}
2017
}
2018
}
2019
} else {
2020
vmFuncs->setCurrentException(currentThread, J9VMCONSTANTPOOL_JAVALANGILLEGALARGUMENTEXCEPTION, NULL);
2021
}
2022
}
2023
vmFuncs->internalExitVMToJNI(currentThread);
2024
2025
return;
2026
}
2027
2028
2029
2030
jobject JNICALL
2031
JVM_SetClassSigners(jint arg0, jint arg1, jint arg2)
2032
{
2033
assert(!"JVM_SetClassSigners() stubbed!");
2034
return NULL;
2035
}
2036
2037
2038
2039
/**
2040
* Set the value to the primitive array at the index.
2041
* This function may lock, gc or throw exception.
2042
* @param array The array
2043
* @param index The index
2044
* @param value The set value
2045
* @param vCode The primitive symbol type code
2046
*/
2047
void JNICALL
2048
JVM_SetPrimitiveArrayElement(JNIEnv *env, jobject array, jint index, jvalue value, unsigned char vCode)
2049
{
2050
J9VMThread *currentThread;
2051
J9JavaVM *vm;
2052
J9InternalVMFunctions *vmFuncs;
2053
2054
Assert_SC_notNull(env);
2055
2056
currentThread = (J9VMThread *) env;
2057
vm = currentThread->javaVM;
2058
vmFuncs = vm->internalVMFunctions;
2059
2060
vmFuncs->internalEnterVMFromJNI(currentThread);
2061
2062
if (NULL == array) {
2063
vmFuncs->setCurrentException(currentThread, J9VMCONSTANTPOOL_JAVALANGNULLPOINTEREXCEPTION, NULL);
2064
} else {
2065
j9object_t j9array = J9_JNI_UNWRAP_REFERENCE(array);
2066
J9ArrayClass *arrayClass = (J9ArrayClass *)J9OBJECT_CLAZZ(currentThread, j9array);
2067
J9Class *typeOfArray = arrayClass->componentType;
2068
2069
if (J9CLASS_IS_ARRAY(arrayClass) && J9ROMCLASS_IS_PRIMITIVE_TYPE(typeOfArray->romClass)) {
2070
if ((index < 0) || (((jint) J9INDEXABLEOBJECT_SIZE(currentThread, j9array)) <= index)) {
2071
vmFuncs->setCurrentException(currentThread, J9VMCONSTANTPOOL_JAVALANGARRAYINDEXOUTOFBOUNDSEXCEPTION, NULL);
2072
} else {
2073
BOOLEAN invalidArgument = FALSE;
2074
2075
if (vm->intReflectClass == typeOfArray) {
2076
switch (vCode) {
2077
case POK_CHAR:
2078
J9JAVAARRAYOFINT_STORE(currentThread, j9array, index, value.c);
2079
break;
2080
case POK_BYTE:
2081
J9JAVAARRAYOFINT_STORE(currentThread, j9array, index, value.b);
2082
break;
2083
case POK_SHORT:
2084
J9JAVAARRAYOFINT_STORE(currentThread, j9array, index, value.s);
2085
break;
2086
case POK_INT:
2087
J9JAVAARRAYOFINT_STORE(currentThread, j9array, index, value.i);
2088
break;
2089
default:
2090
invalidArgument = TRUE;
2091
break;
2092
}
2093
} else if (vm->longReflectClass == typeOfArray) {
2094
switch (vCode) {
2095
case POK_CHAR:
2096
J9JAVAARRAYOFLONG_STORE(currentThread, j9array, index, value.c);
2097
break;
2098
case POK_BYTE:
2099
J9JAVAARRAYOFLONG_STORE(currentThread, j9array, index, value.b);
2100
break;
2101
case POK_SHORT:
2102
J9JAVAARRAYOFLONG_STORE(currentThread, j9array, index, value.s);
2103
break;
2104
case POK_INT:
2105
J9JAVAARRAYOFLONG_STORE(currentThread, j9array, index, value.i);
2106
break;
2107
case POK_LONG:
2108
J9JAVAARRAYOFLONG_STORE(currentThread, j9array, index, value.j);
2109
break;
2110
default:
2111
invalidArgument = TRUE;
2112
break;
2113
}
2114
} else if (vm->byteReflectClass == typeOfArray) {
2115
if (POK_BYTE == vCode) {
2116
J9JAVAARRAYOFBYTE_STORE(currentThread, j9array, index, value.b);
2117
} else {
2118
invalidArgument = TRUE;
2119
}
2120
} else if (vm->doubleReflectClass == typeOfArray) {
2121
jdouble val = 0;
2122
switch(vCode) {
2123
case POK_CHAR:
2124
val = (jdouble) value.c;
2125
break;
2126
case POK_FLOAT:
2127
val = (jdouble) value.f;
2128
break;
2129
case POK_DOUBLE:
2130
val = value.d;
2131
break;
2132
case POK_BYTE:
2133
val = (jdouble) value.b;
2134
break;
2135
case POK_SHORT:
2136
val = (jdouble) value.s;
2137
break;
2138
case POK_INT:
2139
val = (jdouble) value.i;
2140
break;
2141
case POK_LONG:
2142
val = (jdouble) value.j;
2143
break;
2144
default:
2145
invalidArgument = TRUE;
2146
break;
2147
}
2148
if (!invalidArgument) {
2149
J9JAVAARRAYOFDOUBLE_STORE(currentThread, j9array, index, *(U_64 *) &val);
2150
}
2151
} else if (vm->floatReflectClass == typeOfArray) {
2152
jfloat val = 0;
2153
switch (vCode) {
2154
case POK_CHAR:
2155
val = (jfloat) value.c;
2156
break;
2157
case POK_FLOAT:
2158
val = value.f;
2159
break;
2160
case POK_BYTE:
2161
val = (jfloat) value.b;
2162
break;
2163
case POK_SHORT:
2164
val = (jfloat) value.s;
2165
break;
2166
case POK_INT:
2167
val = (jfloat) value.i;
2168
break;
2169
case POK_LONG:
2170
val = (jfloat) value.j;
2171
break;
2172
default:
2173
invalidArgument = TRUE;
2174
break;
2175
}
2176
if (!invalidArgument) {
2177
J9JAVAARRAYOFFLOAT_STORE(currentThread, j9array, index, *(U_32 *) &val);
2178
}
2179
} else if (vm->shortReflectClass == typeOfArray) {
2180
switch (vCode) {
2181
case POK_BYTE:
2182
J9JAVAARRAYOFSHORT_STORE(currentThread, j9array, index, value.b);
2183
break;
2184
case POK_SHORT:
2185
J9JAVAARRAYOFSHORT_STORE(currentThread, j9array, index, value.s);
2186
break;
2187
default:
2188
invalidArgument = TRUE;
2189
break;
2190
}
2191
} else if (vm->charReflectClass == typeOfArray) {
2192
if (POK_CHAR == vCode) {
2193
J9JAVAARRAYOFCHAR_STORE(currentThread, j9array, index, value.c);
2194
} else {
2195
invalidArgument = TRUE;
2196
}
2197
} else if ((vm->booleanReflectClass == typeOfArray) && (4 == vCode)) {
2198
J9JAVAARRAYOFBOOLEAN_STORE(currentThread, j9array, index, value.z);
2199
} else {
2200
invalidArgument = TRUE;
2201
}
2202
if (invalidArgument) {
2203
vmFuncs->setCurrentException(currentThread, J9VMCONSTANTPOOL_JAVALANGILLEGALARGUMENTEXCEPTION, NULL);
2204
}
2205
}
2206
} else {
2207
vmFuncs->setCurrentException(currentThread, J9VMCONSTANTPOOL_JAVALANGILLEGALARGUMENTEXCEPTION, NULL);
2208
}
2209
}
2210
vmFuncs->internalExitVMToJNI(currentThread);
2211
2212
return;
2213
}
2214
2215
2216
2217
jobject JNICALL
2218
JVM_SetProtectionDomain(jint arg0, jint arg1, jint arg2)
2219
{
2220
assert(!"JVM_SetProtectionDomain() stubbed!");
2221
return NULL;
2222
}
2223
2224
2225
void JNICALL
2226
JVM_SetThreadPriority(JNIEnv* env, jobject thread, jint priority)
2227
{
2228
J9VMThread *currentThread = (J9VMThread *)env;
2229
J9JavaVM* vm = currentThread->javaVM;
2230
const UDATA *prioMap = currentThread->javaVM->java2J9ThreadPriorityMap;
2231
J9VMThread *vmThread;
2232
2233
if (currentThread->javaVM->runtimeFlags & J9_RUNTIME_NO_PRIORITIES) {
2234
return;
2235
}
2236
2237
assert(prioMap != NULL);
2238
assert(priority >= 0);
2239
assert(priority <
2240
sizeof(currentThread->javaVM->java2J9ThreadPriorityMap)/sizeof(currentThread->javaVM->java2J9ThreadPriorityMap[0]));
2241
2242
vm = currentThread->javaVM;
2243
vm->internalVMFunctions->internalEnterVMFromJNI(currentThread);
2244
vmThread = J9VMJAVALANGTHREAD_THREADREF(currentThread, J9_JNI_UNWRAP_REFERENCE(thread) );
2245
vm->internalVMFunctions->internalExitVMToJNI(currentThread);
2246
2247
if ( (NULL != vmThread) && (NULL != vmThread->osThread)) {
2248
J9ThreadEnv* threadEnv = getJ9ThreadEnv(env);
2249
threadEnv->set_priority(vmThread->osThread, prioMap[priority]);
2250
}
2251
}
2252
2253
2254
2255
void JNICALL
2256
JVM_StartThread(JNIEnv* jniEnv, jobject newThread)
2257
{
2258
J9VMThread* currentThread = (J9VMThread*)jniEnv;
2259
J9JavaVM* javaVM = currentThread->javaVM;
2260
UDATA priority, isDaemon, privateFlags;
2261
j9object_t newThreadObject;
2262
UDATA result;
2263
2264
javaVM->internalVMFunctions->internalEnterVMFromJNI(currentThread);
2265
2266
newThreadObject = J9_JNI_UNWRAP_REFERENCE(newThread);
2267
2268
if (0 != (javaVM->runtimeFlags & J9RuntimeFlagNoPriorities)) {
2269
priority = J9THREAD_PRIORITY_NORMAL;
2270
} else {
2271
priority = J9VMJAVALANGTHREAD_PRIORITY(currentThread, newThreadObject);
2272
}
2273
2274
isDaemon = J9VMJAVALANGTHREAD_ISDAEMON(currentThread, newThreadObject);
2275
if (isDaemon) {
2276
privateFlags = J9_PRIVATE_FLAGS_DAEMON_THREAD;
2277
} else {
2278
privateFlags = 0;
2279
}
2280
2281
result = javaVM->internalVMFunctions->startJavaThread(
2282
currentThread,
2283
newThreadObject,
2284
J9_PRIVATE_FLAGS_DAEMON_THREAD | J9_PRIVATE_FLAGS_NO_EXCEPTION_IN_START_JAVA_THREAD,
2285
javaVM->defaultOSStackSize,
2286
priority,
2287
(omrthread_entrypoint_t)javaVM->internalVMFunctions->javaThreadProc,
2288
javaVM,
2289
NULL);
2290
2291
javaVM->internalVMFunctions->internalExitVMToJNI(currentThread);
2292
2293
if (result != J9_THREAD_START_NO_ERROR) {
2294
assert(!"JVM_StartThread() failed!");
2295
}
2296
2297
return;
2298
}
2299
2300
2301
2302
jobject JNICALL
2303
JVM_StopThread(jint arg0, jint arg1, jint arg2)
2304
{
2305
assert(!"JVM_StopThread() stubbed!");
2306
return NULL;
2307
}
2308
2309
2310
2311
jobject JNICALL
2312
JVM_SuspendThread(jint arg0, jint arg1)
2313
{
2314
assert(!"JVM_SuspendThread() stubbed!");
2315
return NULL;
2316
}
2317
2318
2319
/* NOTE this is required by JDK15+ jdk.internal.loader.NativeLibraries.unload().
2320
*/
2321
#if JAVA_SPEC_VERSION >= 15
2322
void JNICALL JVM_UnloadLibrary(void *handle)
2323
#else /* JAVA_SPEC_VERSION >= 15 */
2324
jobject JNICALL JVM_UnloadLibrary(jint arg0)
2325
#endif /* JAVA_SPEC_VERSION >= 15 */
2326
{
2327
#if JAVA_SPEC_VERSION >= 15
2328
Trc_SC_UnloadLibrary_Entry(handle);
2329
#if defined(WIN32)
2330
FreeLibrary((HMODULE)handle);
2331
#elif defined(J9UNIX) || defined(J9ZOS390) /* defined(WIN32) */
2332
dlclose(handle);
2333
#else /* defined(WIN32) */
2334
#error "Please implement J7vmi.c:JVM_UnloadLibrary(void *handle)"
2335
#endif /* defined(WIN32) */
2336
#else /* JAVA_SPEC_VERSION >= 15 */
2337
assert(!"JVM_UnloadLibrary() stubbed!");
2338
return NULL;
2339
#endif /* JAVA_SPEC_VERSION >= 15 */
2340
}
2341
2342
2343
2344
jobject JNICALL
2345
JVM_Yield(jint arg0, jint arg1)
2346
{
2347
assert(!"JVM_Yield() stubbed!");
2348
return NULL;
2349
}
2350
2351
2352
/**
2353
* CMVC 150207 : Used by libnet.so on linux x86.
2354
*/
2355
jint JNICALL
2356
JVM_SetSockOpt(jint fd, int level, int optname, const char *optval, int optlen)
2357
{
2358
jint retVal;
2359
2360
#if defined(WIN32)
2361
retVal = setsockopt(fd, level, optname, optval, optlen);
2362
#elif defined(J9ZTPF)
2363
retVal = setsockopt(fd, level, optname, (char *)optval, (socklen_t)optlen);
2364
#else
2365
retVal = setsockopt(fd, level, optname, optval, (socklen_t)optlen);
2366
#endif
2367
2368
return retVal;
2369
}
2370
2371
2372
jint JNICALL
2373
JVM_GetSockOpt(jint fd, int level, int optname, char *optval, int *optlen)
2374
{
2375
jint retVal;
2376
2377
#if defined(WIN32)
2378
retVal = getsockopt(fd, level, optname, optval, optlen);
2379
#elif defined(J9ZTPF)
2380
retVal = getsockopt(fd, level, optname, (char *)optval, (socklen_t *)optlen);
2381
#else
2382
retVal = getsockopt(fd, level, optname, optval, (socklen_t *)optlen);
2383
#endif
2384
2385
return retVal;
2386
}
2387
2388
/**
2389
* CMVC 150207 : Used by libnet.so on linux x86.
2390
*/
2391
jint JNICALL
2392
JVM_SocketShutdown(jint fd, jint howto)
2393
{
2394
jint retVal = JNI_FALSE;
2395
2396
#if defined(J9UNIX)
2397
retVal = shutdown(fd, howto);
2398
#elif defined(WIN32) /* defined(J9UNIX) */
2399
retVal = closesocket(fd);
2400
#else /* defined(J9UNIX) */
2401
assert(!"JVM_SocketShutdown() stubbed!");
2402
#endif /* defined(J9UNIX) */
2403
2404
return retVal;
2405
}
2406
2407
2408
/**
2409
* CMVC 150207 : Used by libnet.so on linux x86.
2410
*/
2411
jint JNICALL
2412
JVM_GetSockName(jint fd, struct sockaddr *him, int *len)
2413
{
2414
jint retVal;
2415
2416
#if defined(WIN32)
2417
retVal = getsockname(fd, him, len);
2418
#else
2419
retVal = getsockname(fd, him, (socklen_t *)len);
2420
#endif
2421
2422
return retVal;
2423
}
2424
2425
/**
2426
* CMVC 150207 : Used by libnet.so on linux x86.
2427
*/
2428
int JNICALL
2429
JVM_GetHostName(char* name, int namelen)
2430
{
2431
jint retVal;
2432
2433
retVal = gethostname(name, namelen);
2434
2435
return retVal;
2436
}
2437
2438
2439
/*
2440
* com.sun.tools.attach.VirtualMachine support
2441
*
2442
* Initialize the agent properties with the properties maintained in the VM.
2443
* The following properties are set by the reference implementation:
2444
* sun.java.command = name of the main class
2445
* sun.jvm.flags = vm arguments passed to the launcher
2446
* sun.jvm.args =
2447
*/
2448
/*
2449
* Notes:
2450
* Redirector has an implementation of JVM_InitAgentProperties.
2451
* This method is still kept within the actual jvm dll in case that a launcher uses this jvm dll directly without going through the redirector.
2452
* If this method need to be modified, the changes have to be synchronized for both versions.
2453
*/
2454
jobject JNICALL
2455
JVM_InitAgentProperties(JNIEnv *env, jobject agent_props)
2456
{
2457
/* CMVC 150259 : Assert in JDWP Agent
2458
* Simply returning the non-null properties instance is
2459
* sufficient to make the agent happy. */
2460
return agent_props;
2461
}
2462
2463
2464
/**
2465
* Extend boot classpath
2466
*
2467
* @param env
2468
* @param pathSegment path to add to the bootclasspath
2469
* @return void
2470
*
2471
* Append specified path segment to the boot classpath
2472
*/
2473
2474
void JNICALL
2475
JVM_ExtendBootClassPath(JNIEnv* env, const char * pathSegment)
2476
{
2477
ENSURE_VMI();
2478
2479
g_VMI->JVM_ExtendBootClassPath(env, pathSegment);
2480
}
2481
2482
/**
2483
* Throw java.lang.OutOfMemoryError
2484
*/
2485
void
2486
throwNativeOOMError(JNIEnv *env, U_32 moduleName, U_32 messageNumber)
2487
{
2488
J9VMThread *currentThread = (J9VMThread *)env;
2489
J9JavaVM *vm = currentThread->javaVM;
2490
J9InternalVMFunctions *vmFuncs = vm->internalVMFunctions;
2491
vmFuncs->internalEnterVMFromJNI(currentThread);
2492
vmFuncs->setNativeOutOfMemoryError(currentThread, moduleName, messageNumber);
2493
vmFuncs->internalExitVMToJNI(currentThread);
2494
}
2495
2496
2497
/**
2498
* Throw java.lang.NullPointerException with the message provided
2499
*/
2500
void
2501
throwNewNullPointerException(JNIEnv *env, char *message)
2502
{
2503
jclass exceptionClass = (*env)->FindClass(env, "java/lang/NullPointerException");
2504
if (exceptionClass == 0) {
2505
/* Just return if we can't load the exception class. */
2506
return;
2507
}
2508
(*env)->ThrowNew(env, exceptionClass, message);
2509
}
2510
2511
/**
2512
* Throw java.lang.IndexOutOfBoundsException
2513
*/
2514
void
2515
throwNewIndexOutOfBoundsException(JNIEnv *env, char *message)
2516
{
2517
jclass exceptionClass = (*env)->FindClass(env, "java/lang/IndexOutOfBoundsException");
2518
if (exceptionClass == 0) {
2519
/* Just return if we can't load the exception class. */
2520
return;
2521
}
2522
(*env)->ThrowNew(env, exceptionClass, message);
2523
}
2524
2525
2526
/**
2527
* Throw java.lang.InternalError
2528
*/
2529
void
2530
throwNewInternalError(JNIEnv *env, char *message)
2531
{
2532
jclass exceptionClass = (*env)->FindClass(env, "java/lang/InternalError");
2533
if (exceptionClass == 0) {
2534
/* Just return if we can't load the exception class. */
2535
return;
2536
}
2537
(*env)->ThrowNew(env, exceptionClass, message);
2538
}
2539
2540
2541
/* Callers of this function must have already ensured that classLoaderObject has been initialized */
2542
2543
jclass
2544
jvmDefineClassHelper(JNIEnv *env, jobject classLoaderObject,
2545
jstring className, jbyte * classBytes, jint offset, jint length, jobject protectionDomain, UDATA options)
2546
{
2547
/* Try a couple of GC passes (1 doesn't sem to be enough), but don't try forever */
2548
#define MAX_RETRY_COUNT 2
2549
2550
J9VMThread *currentThread = (J9VMThread *)env;
2551
J9JavaVM *vm = currentThread->javaVM;
2552
J9InternalVMFunctions *vmFuncs = vm->internalVMFunctions;
2553
J9TranslationBufferSet *dynFuncs = NULL;
2554
J9ClassLoader *classLoader = NULL;
2555
UDATA retried = FALSE;
2556
UDATA utf8Length = 0;
2557
char utf8NameStackBuffer[J9VM_PACKAGE_NAME_BUFFER_LENGTH];
2558
U_8 *utf8Name = NULL;
2559
J9Class *clazz = NULL;
2560
jclass result = NULL;
2561
J9ThreadEnv* threadEnv = getJ9ThreadEnv(env);
2562
J9ROMClass *loadedClass = NULL;
2563
U_8 *tempClassBytes = NULL;
2564
I_32 tempLength = 0;
2565
J9TranslationLocalBuffer localBuffer = {J9_CP_INDEX_NONE, LOAD_LOCATION_UNKNOWN, NULL};
2566
PORT_ACCESS_FROM_JAVAVM(vm);
2567
2568
if (vm->dynamicLoadBuffers == NULL) {
2569
throwNewInternalError(env, "Dynamic loader is unavailable");
2570
return NULL;
2571
}
2572
dynFuncs = vm->dynamicLoadBuffers;
2573
2574
if (classBytes == NULL) {
2575
throwNewNullPointerException(env, NULL);
2576
return NULL;
2577
}
2578
2579
vmFuncs->internalEnterVMFromJNI(currentThread);
2580
2581
if (NULL != className) {
2582
j9object_t classNameObject = J9_JNI_UNWRAP_REFERENCE(className);
2583
utf8Name = (U_8*)vmFuncs->copyStringToUTF8WithMemAlloc(currentThread, classNameObject, J9_STR_NULL_TERMINATE_RESULT, "", 0, utf8NameStackBuffer, J9VM_PACKAGE_NAME_BUFFER_LENGTH, &utf8Length);
2584
if (NULL == utf8Name) {
2585
vmFuncs->setNativeOutOfMemoryError(currentThread, 0, 0);
2586
goto done;
2587
}
2588
2589
if (CLASSNAME_INVALID == vmFuncs->verifyQualifiedName(currentThread, utf8Name, utf8Length, CLASSNAME_VALID_NON_ARRARY)) {
2590
vmFuncs->setCurrentException(currentThread, J9VMCONSTANTPOOL_JAVALANGNOCLASSDEFFOUNDERROR, (UDATA *)*(j9object_t*)className);
2591
goto done;
2592
}
2593
}
2594
2595
classLoader = J9VMJAVALANGCLASSLOADER_VMREF(currentThread, J9_JNI_UNWRAP_REFERENCE(classLoaderObject));
2596
2597
retry:
2598
2599
threadEnv->monitor_enter(vm->classTableMutex);
2600
2601
if (vmFuncs->hashClassTableAt(classLoader, utf8Name, utf8Length) != NULL) {
2602
/* Bad, we have already defined this class - fail */
2603
threadEnv->monitor_exit(vm->classTableMutex);
2604
vmFuncs->setCurrentExceptionNLSWithArgs(currentThread, J9NLS_JCL_DUPLICATE_CLASS_DEFINITION, J9VMCONSTANTPOOL_JAVALANGLINKAGEERROR, utf8Length, utf8Name);
2605
goto done;
2606
}
2607
2608
tempClassBytes = (U_8 *) classBytes;
2609
tempLength = length;
2610
2611
/* Check for romClass cookie, it indicates that we are defining a class out of a JXE not from class bytes */
2612
2613
loadedClass = vmFuncs->romClassLoadFromCookie(currentThread, (U_8*)utf8Name, utf8Length, (U_8*)classBytes, (UDATA) length);
2614
2615
if (NULL != loadedClass) {
2616
/* An existing ROMClass is found in the shared class cache.
2617
* If -Xshareclasses:enableBCI is present, need to give VM a chance to trigger ClassFileLoadHook event.
2618
*/
2619
if ((NULL == vm->sharedClassConfig) || (0 == vm->sharedClassConfig->isBCIEnabled(vm))) {
2620
clazz = vm->internalVMFunctions->internalCreateRAMClassFromROMClass(currentThread,
2621
classLoader,
2622
loadedClass,
2623
0,
2624
NULL,
2625
protectionDomain ? *(j9object_t*)protectionDomain : NULL,
2626
NULL,
2627
J9_CP_INDEX_NONE,
2628
LOAD_LOCATION_UNKNOWN,
2629
NULL,
2630
NULL);
2631
/* Done if a class was found or and exception is pending, otherwise try to define the bytes */
2632
if ((clazz != NULL) || (currentThread->currentException != NULL)) {
2633
goto done;
2634
} else {
2635
loadedClass = NULL;
2636
}
2637
} else {
2638
tempClassBytes = J9ROMCLASS_INTERMEDIATECLASSDATA(loadedClass);
2639
tempLength = loadedClass->intermediateClassDataLength;
2640
options |= J9_FINDCLASS_FLAG_SHRC_ROMCLASS_EXISTS;
2641
}
2642
}
2643
2644
/* The defineClass helper requires you hold the class table mutex and releases it for you */
2645
2646
clazz = dynFuncs->internalDefineClassFunction(currentThread,
2647
utf8Name, utf8Length,
2648
tempClassBytes, (UDATA) tempLength, NULL,
2649
classLoader,
2650
protectionDomain ? *(j9object_t*)protectionDomain : NULL,
2651
options | J9_FINDCLASS_FLAG_THROW_ON_FAIL | J9_FINDCLASS_FLAG_NO_CHECK_FOR_EXISTING_CLASS,
2652
loadedClass,
2653
NULL,
2654
&localBuffer);
2655
2656
/* If OutOfMemory, try a GC to free up some memory */
2657
2658
if (currentThread->privateFlags & J9_PRIVATE_FLAGS_CLOAD_NO_MEM) {
2659
if (!retried) {
2660
/*Trc_VM_internalFindClass_gcAndRetry(vmThread);*/
2661
currentThread->javaVM->memoryManagerFunctions->j9gc_modron_global_collect_with_overrides(currentThread, J9MMCONSTANT_EXPLICIT_GC_NATIVE_OUT_OF_MEMORY);
2662
retried = TRUE;
2663
goto retry;
2664
}
2665
vmFuncs->setNativeOutOfMemoryError(currentThread, 0, 0);
2666
}
2667
2668
done:
2669
if ((clazz == NULL) && (currentThread->currentException == NULL)) {
2670
/* should not get here -- throw the default exception just in case */
2671
vmFuncs->setCurrentException(currentThread, J9VMCONSTANTPOOL_JAVALANGCLASSFORMATERROR, NULL);
2672
}
2673
2674
result = vmFuncs->j9jni_createLocalRef(env, J9VM_J9CLASS_TO_HEAPCLASS(clazz));
2675
2676
vmFuncs->internalExitVMToJNI(currentThread);
2677
2678
if ((U_8*)utf8NameStackBuffer != utf8Name) {
2679
j9mem_free_memory(utf8Name);
2680
}
2681
2682
return result;
2683
}
2684
2685
2686
jobject JNICALL
2687
JVM_Bind(jint arg0, jint arg1, jint arg2)
2688
{
2689
assert(!"JVM_Bind() stubbed!");
2690
return NULL;
2691
}
2692
2693
#if JAVA_SPEC_VERSION < 17
2694
2695
jobject JNICALL
2696
JVM_DTraceActivate(jint arg0, jint arg1, jint arg2, jint arg3, jint arg4)
2697
{
2698
assert(!"JVM_DTraceActivate() stubbed!");
2699
return NULL;
2700
}
2701
2702
jobject JNICALL
2703
JVM_DTraceDispose(jint arg0, jint arg1, jint arg2)
2704
{
2705
assert(!"JVM_DTraceDispose() stubbed!");
2706
return NULL;
2707
}
2708
2709
jobject JNICALL
2710
JVM_DTraceGetVersion(jint arg0)
2711
{
2712
assert(!"JVM_DTraceGetVersion() stubbed!");
2713
return NULL;
2714
}
2715
2716
jobject JNICALL
2717
JVM_DTraceIsProbeEnabled(jint arg0, jint arg1)
2718
{
2719
assert(!"JVM_DTraceIsProbeEnabled() stubbed!");
2720
return NULL;
2721
}
2722
2723
jobject JNICALL
2724
JVM_DTraceIsSupported(jint arg0)
2725
{
2726
assert(!"JVM_DTraceIsSupported() stubbed!");
2727
return NULL;
2728
}
2729
2730
#endif /* JAVA_SPEC_VERSION < 17 */
2731
2732
jobject JNICALL
2733
JVM_DefineClass(jint arg0, jint arg1, jint arg2, jint arg3, jint arg4, jint arg5)
2734
{
2735
assert(!"JVM_DefineClass() stubbed!");
2736
return NULL;
2737
}
2738
2739
jobject JNICALL
2740
JVM_DefineClassWithSourceCond(jint arg0, jint arg1, jint arg2, jint arg3, jint arg4, jint arg5, jint arg6, jint arg7)
2741
{
2742
assert(!"JVM_DefineClassWithSourceCond() stubbed!");
2743
return NULL;
2744
}
2745
2746
jobject JNICALL
2747
JVM_EnqueueOperation(jint arg0, jint arg1, jint arg2, jint arg3, jint arg4)
2748
{
2749
assert(!"A HotSpot VM Attach API is attempting to connect to an OpenJ9 VM. This is not supported.");
2750
return NULL;
2751
}
2752
2753
jobject JNICALL
2754
JVM_Exit(jint arg0)
2755
{
2756
assert(!"JVM_Exit() stubbed!");
2757
return NULL;
2758
}
2759
2760
jobject JNICALL
2761
JVM_GetCPFieldNameUTF(jint arg0, jint arg1, jint arg2)
2762
{
2763
assert(!"JVM_GetCPFieldNameUTF() stubbed!");
2764
return NULL;
2765
}
2766
2767
jobject JNICALL
2768
JVM_GetClassConstructor(jint arg0, jint arg1, jint arg2, jint arg3)
2769
{
2770
assert(!"JVM_GetClassConstructor() stubbed!");
2771
return NULL;
2772
}
2773
2774
jobject JNICALL
2775
JVM_GetClassConstructors(jint arg0, jint arg1, jint arg2)
2776
{
2777
assert(!"JVM_GetClassConstructors() stubbed!");
2778
return NULL;
2779
}
2780
2781
jobject JNICALL
2782
JVM_GetClassField(jint arg0, jint arg1, jint arg2, jint arg3)
2783
{
2784
assert(!"JVM_GetClassField() stubbed!");
2785
return NULL;
2786
}
2787
2788
jobject JNICALL
2789
JVM_GetClassFields(jint arg0, jint arg1, jint arg2)
2790
{
2791
assert(!"JVM_GetClassFields() stubbed!");
2792
return NULL;
2793
}
2794
2795
jobject JNICALL
2796
JVM_GetClassMethod(jint arg0, jint arg1, jint arg2, jint arg3, jint arg4)
2797
{
2798
assert(!"JVM_GetClassMethod() stubbed!");
2799
return NULL;
2800
}
2801
2802
jobject JNICALL
2803
JVM_GetClassMethods(jint arg0, jint arg1, jint arg2)
2804
{
2805
assert(!"JVM_GetClassMethods() stubbed!");
2806
return NULL;
2807
}
2808
2809
jobject JNICALL
2810
JVM_GetField(jint arg0, jint arg1, jint arg2)
2811
{
2812
assert(!"JVM_GetField() stubbed!");
2813
return NULL;
2814
}
2815
2816
jobject JNICALL
2817
JVM_GetFieldAnnotations(jint arg0, jint arg1)
2818
{
2819
assert(!"JVM_GetFieldAnnotations() stubbed!");
2820
return NULL;
2821
}
2822
2823
jobject JNICALL
2824
JVM_GetMethodAnnotations(jint arg0, jint arg1)
2825
{
2826
assert(!"JVM_GetMethodAnnotations() stubbed!");
2827
return NULL;
2828
}
2829
2830
jobject JNICALL
2831
JVM_GetMethodDefaultAnnotationValue(jint arg0, jint arg1)
2832
{
2833
assert(!"JVM_GetMethodDefaultAnnotationValue() stubbed!");
2834
return NULL;
2835
}
2836
2837
jobject JNICALL
2838
JVM_GetMethodParameterAnnotations(jint arg0, jint arg1)
2839
{
2840
assert(!"JVM_GetMethodParameterAnnotations() stubbed!");
2841
return NULL;
2842
}
2843
2844
jobject JNICALL
2845
JVM_GetPrimitiveField(jint arg0, jint arg1, jint arg2, jint arg3)
2846
{
2847
assert(!"JVM_GetPrimitiveField() stubbed!");
2848
return NULL;
2849
}
2850
2851
jobject JNICALL
2852
JVM_InitializeCompiler(jint arg0, jint arg1)
2853
{
2854
assert(!"JVM_InitializeCompiler() stubbed!");
2855
return NULL;
2856
}
2857
2858
jobject JNICALL
2859
JVM_IsSilentCompiler(jint arg0, jint arg1)
2860
{
2861
assert(!"JVM_IsSilentCompiler() stubbed!");
2862
return NULL;
2863
}
2864
2865
jobject JNICALL
2866
JVM_LoadClass0(jint arg0, jint arg1, jint arg2, jint arg3)
2867
{
2868
assert(!"JVM_LoadClass0() stubbed!");
2869
return NULL;
2870
}
2871
2872
jobject JNICALL
2873
JVM_NewInstance(jint arg0, jint arg1)
2874
{
2875
assert(!"JVM_NewInstance() stubbed!");
2876
return NULL;
2877
}
2878
2879
jobject JNICALL
2880
JVM_PrintStackTrace(jint arg0, jint arg1, jint arg2)
2881
{
2882
assert(!"JVM_PrintStackTrace() stubbed!");
2883
return NULL;
2884
}
2885
2886
jobject JNICALL
2887
JVM_SetField(jint arg0, jint arg1, jint arg2, jint arg3)
2888
{
2889
assert(!"JVM_SetField() stubbed!");
2890
return NULL;
2891
}
2892
2893
jobject JNICALL
2894
JVM_SetPrimitiveField(jint arg0, jint arg1, jint arg2, jint arg3, jint arg4, jint arg5)
2895
{
2896
assert(!"JVM_SetPrimitiveField() stubbed!");
2897
return NULL;
2898
}
2899
2900
void JNICALL
2901
JVM_SetNativeThreadName(jint arg0, jobject arg1, jstring arg2)
2902
{
2903
assert(!"JVM_SetNativeThreadName() stubbed!");
2904
}
2905
2906