5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation.
8 *
9 * This code is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
12 * version 2 for more details (a copy is included in the LICENSE file that
13 * accompanied this code).
14 *
15 * You should have received a copy of the GNU General Public License version
16 * 2 along with this work; if not, write to the Free Software Foundation,
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18 *
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20 * or visit www.oracle.com if you need additional information or have any
21 * questions.
22 *
23 */
24
25 #include "cds/cdsConfig.hpp"
26 #include "cds/classListParser.hpp"
27 #include "cds/classListWriter.hpp"
28 #include "cds/dynamicArchive.hpp"
29 #include "cds/heapShared.hpp"
30 #include "cds/lambdaFormInvokers.hpp"
31 #include "classfile/classFileStream.hpp"
32 #include "classfile/classLoader.inline.hpp"
33 #include "classfile/classLoaderData.hpp"
34 #include "classfile/classLoaderData.inline.hpp"
35 #include "classfile/classLoadInfo.hpp"
36 #include "classfile/javaAssertions.hpp"
37 #include "classfile/javaClasses.inline.hpp"
38 #include "classfile/moduleEntry.hpp"
39 #include "classfile/modules.hpp"
40 #include "classfile/packageEntry.hpp"
41 #include "classfile/stringTable.hpp"
42 #include "classfile/symbolTable.hpp"
43 #include "classfile/systemDictionary.hpp"
44 #include "classfile/vmClasses.hpp"
67 #include "prims/jvm_misc.hpp"
68 #include "prims/jvmtiExport.hpp"
69 #include "prims/jvmtiThreadState.inline.hpp"
70 #include "prims/stackwalk.hpp"
71 #include "runtime/arguments.hpp"
72 #include "runtime/atomic.hpp"
73 #include "runtime/continuation.hpp"
74 #include "runtime/globals_extension.hpp"
75 #include "runtime/handles.inline.hpp"
76 #include "runtime/init.hpp"
77 #include "runtime/interfaceSupport.inline.hpp"
78 #include "runtime/deoptimization.hpp"
79 #include "runtime/handshake.hpp"
80 #include "runtime/java.hpp"
81 #include "runtime/javaCalls.hpp"
82 #include "runtime/javaThread.hpp"
83 #include "runtime/jfieldIDWorkaround.hpp"
84 #include "runtime/jniHandles.inline.hpp"
85 #include "runtime/os.inline.hpp"
86 #include "runtime/osThread.hpp"
87 #include "runtime/perfData.hpp"
88 #include "runtime/reflection.hpp"
89 #include "runtime/synchronizer.hpp"
90 #include "runtime/threadIdentifier.hpp"
91 #include "runtime/threadSMR.hpp"
92 #include "runtime/vframe.inline.hpp"
93 #include "runtime/vmOperations.hpp"
94 #include "runtime/vm_version.hpp"
95 #include "services/attachListener.hpp"
96 #include "services/management.hpp"
97 #include "services/threadService.hpp"
98 #include "utilities/checkedCast.hpp"
99 #include "utilities/copy.hpp"
100 #include "utilities/defaultStream.hpp"
101 #include "utilities/dtrace.hpp"
102 #include "utilities/events.hpp"
103 #include "utilities/macros.hpp"
104 #include "utilities/utf8.hpp"
105 #include "utilities/zipLibrary.hpp"
106 #if INCLUDE_CDS
107 #include "classfile/systemDictionaryShared.hpp"
210 }
211 }
212 }
213 if (caller != nullptr) {
214 if (to_class != caller) {
215 const char * from = caller->external_name();
216 const char * to = to_class->external_name();
217 // print in a single call to reduce interleaving between threads
218 if (source_file != nullptr) {
219 log_debug(class, resolve)("%s %s %s:%d (%s)", from, to, source_file, line_number, trace);
220 } else {
221 log_debug(class, resolve)("%s %s (%s)", from, to, trace);
222 }
223 }
224 }
225 }
226
227 // java.lang.System //////////////////////////////////////////////////////////////////////
228
229
230 JVM_LEAF(jlong, JVM_CurrentTimeMillis(JNIEnv *env, jclass ignored))
231 return os::javaTimeMillis();
232 JVM_END
233
234 JVM_LEAF(jlong, JVM_NanoTime(JNIEnv *env, jclass ignored))
235 return os::javaTimeNanos();
236 JVM_END
237
238 // The function below is actually exposed by jdk.internal.misc.VM and not
239 // java.lang.System, but we choose to keep it here so that it stays next
240 // to JVM_CurrentTimeMillis and JVM_NanoTime
241
242 const jlong MAX_DIFF_SECS = CONST64(0x0100000000); // 2^32
243 const jlong MIN_DIFF_SECS = -MAX_DIFF_SECS; // -2^32
244
245 JVM_LEAF(jlong, JVM_GetNanoTimeAdjustment(JNIEnv *env, jclass ignored, jlong offset_secs))
246 jlong seconds;
247 jlong nanos;
248
249 os::javaTimeSystemUTC(seconds, nanos);
250
251 // We're going to verify that the result can fit in a long.
252 // For that we need the difference in seconds between 'seconds'
253 // and 'offset_secs' to be such that:
254 // |seconds - offset_secs| < (2^63/10^9)
255 // We're going to approximate 10^9 ~< 2^30 (1000^3 ~< 1024^3)
256 // which makes |seconds - offset_secs| < 2^33
257 // and we will prefer +/- 2^32 as the maximum acceptable diff
258 // as 2^32 has a more natural feel than 2^33...
259 //
260 // So if |seconds - offset_secs| >= 2^32 - we return a special
261 // sentinel value (-1) which the caller should take as an
262 // exception value indicating that the offset given to us is
263 // too far from range of the current time - leading to too big
264 // a nano adjustment. The caller is expected to recover by
265 // computing a more accurate offset and calling this method
266 // again. (For the record 2^32 secs is ~136 years, so that
267 // should rarely happen)
268 //
269 jlong diff = seconds - offset_secs;
270 if (diff >= MAX_DIFF_SECS || diff <= MIN_DIFF_SECS) {
271 return -1; // sentinel value: the offset is too far off the target
272 }
273
274 // return the adjustment. If you compute a time by adding
275 // this number of nanoseconds along with the number of seconds
276 // in the offset you should get the current UTC time.
277 return (diff * (jlong)1000000000) + nanos;
278 JVM_END
279
280 JVM_ENTRY(void, JVM_ArrayCopy(JNIEnv *env, jclass ignored, jobject src, jint src_pos,
281 jobject dst, jint dst_pos, jint length))
282 // Check if we have null pointers
283 if (src == nullptr || dst == nullptr) {
284 THROW(vmSymbols::java_lang_NullPointerException());
285 }
286 arrayOop s = arrayOop(JNIHandles::resolve_non_null(src));
287 arrayOop d = arrayOop(JNIHandles::resolve_non_null(dst));
288 assert(oopDesc::is_oop(s), "JVM_ArrayCopy: src not an oop");
289 assert(oopDesc::is_oop(d), "JVM_ArrayCopy: dst not an oop");
290 // Do copy
291 s->klass()->copy_array(s, src_pos, d, dst_pos, length, thread);
292 JVM_END
293
294
295 static void set_property(Handle props, const char* key, const char* value, TRAPS) {
296 JavaValue r(T_OBJECT);
297 // public synchronized Object put(Object key, Object value);
298 HandleMark hm(THREAD);
299 Handle key_str = java_lang_String::create_from_platform_dependent_str(key, CHECK);
300 Handle value_str = java_lang_String::create_from_platform_dependent_str((value != nullptr ? value : ""), CHECK);
301 JavaCalls::call_virtual(&r,
302 props,
303 vmClasses::Properties_klass(),
304 vmSymbols::put_name(),
305 vmSymbols::object_object_object_signature(),
306 key_str,
307 value_str,
308 THREAD);
309 }
310
311
312 #define PUTPROP(props, name, value) set_property((props), (name), (value), CHECK_(properties));
313
314 /*
315 * Return all of the system properties in a Java String array with alternating
316 * names and values from the jvm SystemProperty.
317 * Which includes some internal and all commandline -D defined properties.
318 */
319 JVM_ENTRY(jobjectArray, JVM_GetProperties(JNIEnv *env))
320 ResourceMark rm(THREAD);
321 HandleMark hm(THREAD);
322 int ndx = 0;
323 int fixedCount = 2;
324
325 SystemProperty* p = Arguments::system_properties();
326 int count = Arguments::PropertyList_count(p);
327
328 // Allocate result String array
329 InstanceKlass* ik = vmClasses::String_klass();
330 objArrayOop r = oopFactory::new_objArray(ik, (count + fixedCount) * 2, CHECK_NULL);
331 objArrayHandle result_h(THREAD, r);
332
333 while (p != nullptr) {
334 const char * key = p->key();
335 if (strcmp(key, "sun.nio.MaxDirectMemorySize") != 0) {
336 const char * value = p->value();
337 Handle key_str = java_lang_String::create_from_platform_dependent_str(key, CHECK_NULL);
338 Handle value_str = java_lang_String::create_from_platform_dependent_str((value != nullptr ? value : ""), CHECK_NULL);
339 result_h->obj_at_put(ndx * 2, key_str());
387 Handle key_str = java_lang_String::create_from_platform_dependent_str("sun.management.compiler", CHECK_NULL);
388 Handle value_str = java_lang_String::create_from_platform_dependent_str(compiler_name, CHECK_NULL);
389 result_h->obj_at_put(ndx * 2, key_str());
390 result_h->obj_at_put(ndx * 2 + 1, value_str());
391 ndx++;
392 }
393 }
394
395 return (jobjectArray) JNIHandles::make_local(THREAD, result_h());
396 JVM_END
397
398
399 /*
400 * Return the temporary directory that the VM uses for the attach
401 * and perf data files.
402 *
403 * It is important that this directory is well-known and the
404 * same for all VM instances. It cannot be affected by configuration
405 * variables such as java.io.tmpdir.
406 */
407 JVM_ENTRY(jstring, JVM_GetTemporaryDirectory(JNIEnv *env))
408 HandleMark hm(THREAD);
409 const char* temp_dir = os::get_temp_directory();
410 Handle h = java_lang_String::create_from_platform_dependent_str(temp_dir, CHECK_NULL);
411 return (jstring) JNIHandles::make_local(THREAD, h());
412 JVM_END
413
414
415 // java.lang.Runtime /////////////////////////////////////////////////////////////////////////
416
417 extern volatile jint vm_created;
418
419 JVM_ENTRY_NO_ENV(void, JVM_BeforeHalt())
420 EventShutdown event;
421 if (event.should_commit()) {
422 event.set_reason("Shutdown requested from Java");
423 event.commit();
424 }
425 JVM_END
426
427
428 JVM_ENTRY_NO_ENV(void, JVM_Halt(jint code))
429 before_exit(thread, true);
430 vm_exit(code);
431 JVM_END
432
433
434 JVM_ENTRY_NO_ENV(void, JVM_GC(void))
435 if (!DisableExplicitGC) {
436 EventSystemGC event;
437 event.set_invokedConcurrent(ExplicitGCInvokesConcurrent);
438 Universe::heap()->collect(GCCause::_java_lang_system_gc);
439 event.commit();
440 }
441 JVM_END
442
443
444 JVM_LEAF(jlong, JVM_MaxObjectInspectionAge(void))
445 return Universe::heap()->millis_since_last_whole_heap_examined();
446 JVM_END
447
448
449 static inline jlong convert_size_t_to_jlong(size_t val) {
450 // In the 64-bit vm, a size_t can overflow a jlong (which is signed).
451 NOT_LP64 (return (jlong)val;)
452 LP64_ONLY(return (jlong)MIN2(val, (size_t)max_jlong);)
453 }
454
455 JVM_ENTRY_NO_ENV(jlong, JVM_TotalMemory(void))
456 size_t n = Universe::heap()->capacity();
457 return convert_size_t_to_jlong(n);
458 JVM_END
459
460
461 JVM_ENTRY_NO_ENV(jlong, JVM_FreeMemory(void))
462 size_t n = Universe::heap()->unused();
463 return convert_size_t_to_jlong(n);
464 JVM_END
465
466
467 JVM_ENTRY_NO_ENV(jlong, JVM_MaxMemory(void))
468 size_t n = Universe::heap()->max_capacity();
469 return convert_size_t_to_jlong(n);
470 JVM_END
471
472
473 JVM_ENTRY_NO_ENV(jint, JVM_ActiveProcessorCount(void))
474 return os::active_processor_count();
475 JVM_END
476
477 JVM_LEAF(jboolean, JVM_IsUseContainerSupport(void))
478 #ifdef LINUX
479 if (UseContainerSupport) {
480 return JNI_TRUE;
481 }
482 #endif
483 return JNI_FALSE;
484 JVM_END
485
486 JVM_LEAF(jboolean, JVM_IsContainerized(void))
487 #ifdef LINUX
488 if (OSContainer::is_containerized()) {
489 return JNI_TRUE;
490 }
491 #endif
492 return JNI_FALSE;
493 JVM_END
494
495 // java.lang.Throwable //////////////////////////////////////////////////////
496
497 JVM_ENTRY(void, JVM_FillInStackTrace(JNIEnv *env, jobject receiver))
498 Handle exception(thread, JNIHandles::resolve_non_null(receiver));
499 java_lang_Throwable::fill_in_stack_trace(exception);
500 JVM_END
501
502 // java.lang.NullPointerException ///////////////////////////////////////////
503
504 JVM_ENTRY(jstring, JVM_GetExtendedNPEMessage(JNIEnv *env, jthrowable throwable))
505 if (!ShowCodeDetailsInExceptionMessages) return nullptr;
506
507 oop exc = JNIHandles::resolve_non_null(throwable);
508
509 Method* method;
510 int bci;
511 if (!java_lang_Throwable::get_top_method_and_bci(exc, &method, &bci)) {
512 return nullptr;
513 }
514 if (method->is_native()) {
515 return nullptr;
516 }
517
518 stringStream ss;
519 bool ok = BytecodeUtils::get_NPE_message_at(&ss, method, bci);
520 if (ok) {
521 oop result = java_lang_String::create_oop_from_str(ss.base(), CHECK_NULL);
522 return (jstring) JNIHandles::make_local(THREAD, result);
523 } else {
524 return nullptr;
525 }
526 JVM_END
527
528 // java.lang.StackTraceElement //////////////////////////////////////////////
529
530
531 JVM_ENTRY(void, JVM_InitStackTraceElementArray(JNIEnv *env, jobjectArray elements, jobject backtrace, jint depth))
532 Handle backtraceh(THREAD, JNIHandles::resolve(backtrace));
533 objArrayOop st = objArrayOop(JNIHandles::resolve(elements));
534 objArrayHandle stack_trace(THREAD, st);
535 // Fill in the allocated stack trace
536 java_lang_Throwable::get_stack_trace_elements(depth, backtraceh, stack_trace, CHECK);
537 JVM_END
538
539
540 JVM_ENTRY(void, JVM_InitStackTraceElement(JNIEnv* env, jobject element, jobject stackFrameInfo))
541 Handle stack_frame_info(THREAD, JNIHandles::resolve_non_null(stackFrameInfo));
542 Handle stack_trace_element(THREAD, JNIHandles::resolve_non_null(element));
543 java_lang_StackFrameInfo::to_stack_trace_element(stack_frame_info, stack_trace_element, CHECK);
544 JVM_END
545
546
547 // java.lang.StackWalker //////////////////////////////////////////////////////
548 JVM_ENTRY(void, JVM_ExpandStackFrameInfo(JNIEnv *env, jobject obj))
549 Handle stack_frame_info(THREAD, JNIHandles::resolve_non_null(obj));
550
551 bool have_name = (java_lang_StackFrameInfo::name(stack_frame_info()) != nullptr);
552 bool have_type = (java_lang_StackFrameInfo::type(stack_frame_info()) != nullptr);
553 Method* method = java_lang_StackFrameInfo::get_method(stack_frame_info());
554 if (!have_name) {
555 oop name = StringTable::intern(method->name(), CHECK);
556 java_lang_StackFrameInfo::set_name(stack_frame_info(), name);
557 }
558 if (!have_type) {
559 Handle type = java_lang_String::create_from_symbol(method->signature(), CHECK);
560 java_lang_StackFrameInfo::set_type(stack_frame_info(), type());
561 }
562 JVM_END
563
564 JVM_ENTRY(jobject, JVM_CallStackWalk(JNIEnv *env, jobject stackStream, jint mode,
565 jint skip_frames, jobject contScope, jobject cont,
566 jint buffer_size, jint start_index, jobjectArray frames))
567 if (!thread->has_last_Java_frame()) {
568 THROW_MSG_(vmSymbols::java_lang_InternalError(), "doStackWalk: no stack trace", nullptr);
569 }
570
571 Handle stackStream_h(THREAD, JNIHandles::resolve_non_null(stackStream));
572 Handle contScope_h(THREAD, JNIHandles::resolve(contScope));
573 Handle cont_h(THREAD, JNIHandles::resolve(cont));
574 // frames array is a ClassFrameInfo[] array when only getting caller reference,
575 // and a StackFrameInfo[] array (or derivative) otherwise. It should never
576 // be null.
577 objArrayOop fa = objArrayOop(JNIHandles::resolve_non_null(frames));
578 objArrayHandle frames_array_h(THREAD, fa);
579
580 if (frames_array_h->length() < buffer_size) {
581 THROW_MSG_(vmSymbols::java_lang_IllegalArgumentException(), "not enough space in buffers", nullptr);
582 }
583
584 oop result = StackWalk::walk(stackStream_h, mode, skip_frames, contScope_h, cont_h,
585 buffer_size, start_index, frames_array_h, CHECK_NULL);
586 return JNIHandles::make_local(THREAD, result);
587 JVM_END
588
589
590 JVM_ENTRY(jint, JVM_MoreStackWalk(JNIEnv *env, jobject stackStream, jint mode, jlong anchor,
591 jint last_batch_count, jint buffer_size, jint start_index,
592 jobjectArray frames))
593 // frames array is a ClassFrameInfo[] array when only getting caller reference,
594 // and a StackFrameInfo[] array (or derivative) otherwise. It should never
595 // be null.
596 objArrayOop fa = objArrayOop(JNIHandles::resolve_non_null(frames));
597 objArrayHandle frames_array_h(THREAD, fa);
598
599 if (frames_array_h->length() < buffer_size) {
600 THROW_MSG_0(vmSymbols::java_lang_IllegalArgumentException(), "not enough space in buffers");
601 }
602
603 Handle stackStream_h(THREAD, JNIHandles::resolve_non_null(stackStream));
604 return StackWalk::fetchNextBatch(stackStream_h, mode, anchor, last_batch_count, buffer_size,
605 start_index, frames_array_h, THREAD);
606 JVM_END
607
608 JVM_ENTRY(void, JVM_SetStackWalkContinuation(JNIEnv *env, jobject stackStream, jlong anchor, jobjectArray frames, jobject cont))
609 objArrayOop fa = objArrayOop(JNIHandles::resolve_non_null(frames));
610 objArrayHandle frames_array_h(THREAD, fa);
611 Handle stackStream_h(THREAD, JNIHandles::resolve_non_null(stackStream));
612 Handle cont_h(THREAD, JNIHandles::resolve_non_null(cont));
613
614 StackWalk::setContinuation(stackStream_h, anchor, frames_array_h, cont_h, THREAD);
615 JVM_END
616
617 // java.lang.Object ///////////////////////////////////////////////
618
619
620 JVM_ENTRY(jint, JVM_IHashCode(JNIEnv* env, jobject handle))
621 // as implemented in the classic virtual machine; return 0 if object is null
622 return handle == nullptr ? 0 :
623 checked_cast<jint>(ObjectSynchronizer::FastHashCode (THREAD, JNIHandles::resolve_non_null(handle)));
624 JVM_END
625
626
627 JVM_ENTRY(void, JVM_MonitorWait(JNIEnv* env, jobject handle, jlong ms))
628 Handle obj(THREAD, JNIHandles::resolve_non_null(handle));
629 ObjectSynchronizer::wait(obj, ms, CHECK);
630 JVM_END
631
632
633 JVM_ENTRY(void, JVM_MonitorNotify(JNIEnv* env, jobject handle))
634 Handle obj(THREAD, JNIHandles::resolve_non_null(handle));
635 ObjectSynchronizer::notify(obj, CHECK);
636 JVM_END
637
638
639 JVM_ENTRY(void, JVM_MonitorNotifyAll(JNIEnv* env, jobject handle))
640 Handle obj(THREAD, JNIHandles::resolve_non_null(handle));
641 ObjectSynchronizer::notifyall(obj, CHECK);
642 JVM_END
643
644
645 JVM_ENTRY(jobject, JVM_Clone(JNIEnv* env, jobject handle))
646 Handle obj(THREAD, JNIHandles::resolve_non_null(handle));
647 Klass* klass = obj->klass();
648 JvmtiVMObjectAllocEventCollector oam;
649
650 #ifdef ASSERT
651 // Just checking that the cloneable flag is set correct
652 if (obj->is_array()) {
653 guarantee(klass->is_cloneable(), "all arrays are cloneable");
654 } else {
655 guarantee(obj->is_instance(), "should be instanceOop");
656 bool cloneable = klass->is_subtype_of(vmClasses::Cloneable_klass());
657 guarantee(cloneable == klass->is_cloneable(), "incorrect cloneable flag");
658 }
659 #endif
660
661 // Check if class of obj supports the Cloneable interface.
662 // All arrays are considered to be cloneable (See JLS 20.1.5).
663 // All j.l.r.Reference classes are considered non-cloneable.
664 if (!klass->is_cloneable() ||
665 (klass->is_instance_klass() &&
678 } else {
679 new_obj_oop = Universe::heap()->obj_allocate(klass, size, CHECK_NULL);
680 }
681
682 HeapAccess<>::clone(obj(), new_obj_oop, size);
683
684 Handle new_obj(THREAD, new_obj_oop);
685 // Caution: this involves a java upcall, so the clone should be
686 // "gc-robust" by this stage.
687 if (klass->has_finalizer()) {
688 assert(obj->is_instance(), "should be instanceOop");
689 new_obj_oop = InstanceKlass::register_finalizer(instanceOop(new_obj()), CHECK_NULL);
690 new_obj = Handle(THREAD, new_obj_oop);
691 }
692
693 return JNIHandles::make_local(THREAD, new_obj());
694 JVM_END
695
696 // java.lang.ref.Finalizer ////////////////////////////////////////////////////
697
698 JVM_ENTRY(void, JVM_ReportFinalizationComplete(JNIEnv * env, jobject finalizee))
699 MANAGEMENT_ONLY(FinalizerService::on_complete(JNIHandles::resolve_non_null(finalizee), THREAD);)
700 JVM_END
701
702 JVM_LEAF(jboolean, JVM_IsFinalizationEnabled(JNIEnv * env))
703 return InstanceKlass::is_finalization_enabled();
704 JVM_END
705
706 // jdk.internal.vm.Continuation /////////////////////////////////////////////////////
707
708 JVM_ENTRY(void, JVM_RegisterContinuationMethods(JNIEnv *env, jclass cls))
709 CONT_RegisterNativeMethods(env, cls);
710 JVM_END
711
712 // java.io.File ///////////////////////////////////////////////////////////////
713
714 JVM_LEAF(char*, JVM_NativePath(char* path))
715 return os::native_path(path);
716 JVM_END
717
718
719 // Misc. class handling ///////////////////////////////////////////////////////////
720
721
722 JVM_ENTRY(jclass, JVM_GetCallerClass(JNIEnv* env))
723 // Getting the class of the caller frame.
724 //
725 // The call stack at this point looks something like this:
726 //
727 // [0] [ @CallerSensitive public jdk.internal.reflect.Reflection.getCallerClass ]
728 // [1] [ @CallerSensitive API.method ]
729 // [.] [ (skipped intermediate frames) ]
730 // [n] [ caller ]
731 vframeStream vfst(thread);
732 // Cf. LibraryCallKit::inline_native_Reflection_getCallerClass
733 for (int n = 0; !vfst.at_end(); vfst.security_next(), n++) {
734 Method* m = vfst.method();
735 assert(m != nullptr, "sanity");
736 switch (n) {
737 case 0:
738 // This must only be called from Reflection.getCallerClass
739 if (m->intrinsic_id() != vmIntrinsics::_getCallerClass) {
740 THROW_MSG_NULL(vmSymbols::java_lang_InternalError(), "JVM_GetCallerClass must only be called from Reflection.getCallerClass");
741 }
742 // fall-through
743 case 1:
744 // Frame 0 and 1 must be caller sensitive.
745 if (!m->caller_sensitive()) {
746 THROW_MSG_NULL(vmSymbols::java_lang_InternalError(), err_msg("CallerSensitive annotation expected at frame %d", n));
747 }
748 break;
749 default:
750 if (!m->is_ignored_by_security_stack_walk()) {
751 // We have reached the desired frame; return the holder class.
752 return (jclass) JNIHandles::make_local(THREAD, m->method_holder()->java_mirror());
753 }
754 break;
755 }
756 }
757 return nullptr;
758 JVM_END
759
760
761 JVM_ENTRY(jclass, JVM_FindPrimitiveClass(JNIEnv* env, const char* utf))
762 oop mirror = nullptr;
763 BasicType t = name2type(utf);
764 if (t != T_ILLEGAL && !is_reference_type(t)) {
765 mirror = Universe::java_mirror(t);
766 }
767 if (mirror == nullptr) {
768 THROW_MSG_NULL(vmSymbols::java_lang_ClassNotFoundException(), (char*) utf);
769 } else {
770 return (jclass) JNIHandles::make_local(THREAD, mirror);
771 }
772 JVM_END
773
774
775 // Returns a class loaded by the bootstrap class loader; or null
776 // if not found. ClassNotFoundException is not thrown.
777 // FindClassFromBootLoader is exported to the launcher for windows.
778 JVM_ENTRY(jclass, JVM_FindClassFromBootLoader(JNIEnv* env,
779 const char* name))
780 // Java libraries should ensure that name is never null or illegal.
781 if (name == nullptr || (int)strlen(name) > Symbol::max_length()) {
782 // It's impossible to create this class; the name cannot fit
783 // into the constant pool.
784 return nullptr;
785 }
786 assert(UTF8::is_legal_utf8((const unsigned char*)name, strlen(name), false), "illegal UTF name");
787
788 TempNewSymbol h_name = SymbolTable::new_symbol(name);
789 Klass* k = SystemDictionary::resolve_or_null(h_name, CHECK_NULL);
790 if (k == nullptr) {
791 return nullptr;
792 }
793
794 if (log_is_enabled(Debug, class, resolve)) {
795 trace_class_resolution(k);
796 }
797 return (jclass) JNIHandles::make_local(THREAD, k->java_mirror());
798 JVM_END
799
800 // Find a class with this name in this loader, using the caller's protection domain.
801 JVM_ENTRY(jclass, JVM_FindClassFromCaller(JNIEnv* env, const char* name,
802 jboolean init, jobject loader,
803 jclass caller))
804 TempNewSymbol h_name =
805 SystemDictionary::class_name_symbol(name, vmSymbols::java_lang_ClassNotFoundException(),
806 CHECK_NULL);
807
808 oop loader_oop = JNIHandles::resolve(loader);
809 oop from_class = JNIHandles::resolve(caller);
810 Handle h_loader(THREAD, loader_oop);
811
812 jclass result = find_class_from_class_loader(env, h_name, init, h_loader,
813 false, THREAD);
814
815 if (log_is_enabled(Debug, class, resolve) && result != nullptr) {
816 trace_class_resolution(java_lang_Class::as_Klass(JNIHandles::resolve_non_null(result)));
817 }
818 return result;
819 JVM_END
820
821 // Currently only called from the old verifier.
822 JVM_ENTRY(jclass, JVM_FindClassFromClass(JNIEnv *env, const char *name,
823 jboolean init, jclass from))
824 TempNewSymbol h_name =
825 SystemDictionary::class_name_symbol(name, vmSymbols::java_lang_ClassNotFoundException(),
826 CHECK_NULL);
827 oop from_class_oop = JNIHandles::resolve(from);
828 Klass* from_class = (from_class_oop == nullptr)
829 ? (Klass*)nullptr
830 : java_lang_Class::as_Klass(from_class_oop);
831 oop class_loader = nullptr;
832 if (from_class != nullptr) {
833 class_loader = from_class->class_loader();
834 }
835 Handle h_loader(THREAD, class_loader);
836 jclass result = find_class_from_class_loader(env, h_name, init, h_loader, true, thread);
837
838 if (log_is_enabled(Debug, class, resolve) && result != nullptr) {
839 // this function is generally only used for class loading during verification.
840 ResourceMark rm;
841 oop from_mirror = JNIHandles::resolve_non_null(from);
842 Klass* from_class = java_lang_Class::as_Klass(from_mirror);
843 const char * from_name = from_class->external_name();
1002 ik->external_name(),
1003 host_class->external_name(),
1004 ik->is_hidden() ? "is hidden" : "is not hidden");
1005 }
1006 }
1007
1008 if ((!is_hidden || is_nestmate) && !Reflection::is_same_class_package(lookup_k, ik)) {
1009 // non-hidden class or nestmate class must be in the same package as the Lookup class
1010 THROW_MSG_NULL(vmSymbols::java_lang_IllegalArgumentException(), "Lookup class and defined class are in different packages");
1011 }
1012
1013 if (init) {
1014 ik->initialize(CHECK_NULL);
1015 } else {
1016 ik->link_class(CHECK_NULL);
1017 }
1018
1019 return (jclass) JNIHandles::make_local(THREAD, ik->java_mirror());
1020 }
1021
1022 JVM_ENTRY(jclass, JVM_DefineClass(JNIEnv *env, const char *name, jobject loader, const jbyte *buf, jsize len, jobject pd))
1023 return jvm_define_class_common(name, loader, buf, len, pd, nullptr, THREAD);
1024 JVM_END
1025
1026 /*
1027 * Define a class with the specified lookup class.
1028 * lookup: Lookup class
1029 * name: the name of the class
1030 * buf: class bytes
1031 * len: length of class bytes
1032 * pd: protection domain
1033 * init: initialize the class
1034 * flags: properties of the class
1035 * classData: private static pre-initialized field
1036 */
1037 JVM_ENTRY(jclass, JVM_LookupDefineClass(JNIEnv *env, jclass lookup, const char *name, const jbyte *buf,
1038 jsize len, jobject pd, jboolean initialize, int flags, jobject classData))
1039
1040 if (lookup == nullptr) {
1041 THROW_MSG_NULL(vmSymbols::java_lang_IllegalArgumentException(), "Lookup class is null");
1042 }
1043
1044 assert(buf != nullptr, "buf must not be null");
1045
1046 return jvm_lookup_define_class(lookup, name, buf, len, pd, initialize, flags, classData, THREAD);
1047 JVM_END
1048
1049 JVM_ENTRY(jclass, JVM_DefineClassWithSource(JNIEnv *env, const char *name, jobject loader, const jbyte *buf, jsize len, jobject pd, const char *source))
1050
1051 return jvm_define_class_common(name, loader, buf, len, pd, source, THREAD);
1052 JVM_END
1053
1054 JVM_ENTRY(jclass, JVM_FindLoadedClass(JNIEnv *env, jobject loader, jstring name))
1055 ResourceMark rm(THREAD);
1056
1057 Handle h_name (THREAD, JNIHandles::resolve_non_null(name));
1058 char* str = java_lang_String::as_utf8_string(h_name());
1059
1060 // Sanity check, don't expect null
1061 if (str == nullptr) return nullptr;
1062
1063 // Internalize the string, converting '.' to '/' in string.
1064 char* p = (char*)str;
1065 while (*p != '\0') {
1066 if (*p == '.') {
1067 *p = '/';
1068 }
1069 p++;
1070 }
1071
1072 const int str_len = (int)(p - str);
1073 if (str_len > Symbol::max_length()) {
1074 // It's impossible to create this class; the name cannot fit
1078 TempNewSymbol klass_name = SymbolTable::new_symbol(str, str_len);
1079
1080 // Security Note:
1081 // The Java level wrapper will perform the necessary security check allowing
1082 // us to pass the null as the initiating class loader.
1083 Handle h_loader(THREAD, JNIHandles::resolve(loader));
1084 Klass* k = SystemDictionary::find_instance_or_array_klass(THREAD, klass_name, h_loader);
1085 #if INCLUDE_CDS
1086 if (k == nullptr) {
1087 // If the class is not already loaded, try to see if it's in the shared
1088 // archive for the current classloader (h_loader).
1089 k = SystemDictionaryShared::find_or_load_shared_class(klass_name, h_loader, CHECK_NULL);
1090 }
1091 #endif
1092 return (k == nullptr) ? nullptr :
1093 (jclass) JNIHandles::make_local(THREAD, k->java_mirror());
1094 JVM_END
1095
1096 // Module support //////////////////////////////////////////////////////////////////////////////
1097
1098 JVM_ENTRY(void, JVM_DefineModule(JNIEnv *env, jobject module, jboolean is_open, jstring version,
1099 jstring location, jobjectArray packages))
1100 Handle h_module (THREAD, JNIHandles::resolve(module));
1101 Modules::define_module(h_module, is_open, version, location, packages, CHECK);
1102 JVM_END
1103
1104 JVM_ENTRY(void, JVM_SetBootLoaderUnnamedModule(JNIEnv *env, jobject module))
1105 Handle h_module (THREAD, JNIHandles::resolve(module));
1106 Modules::set_bootloader_unnamed_module(h_module, CHECK);
1107 JVM_END
1108
1109 JVM_ENTRY(void, JVM_AddModuleExports(JNIEnv *env, jobject from_module, jstring package, jobject to_module))
1110 Handle h_from_module (THREAD, JNIHandles::resolve(from_module));
1111 Handle h_to_module (THREAD, JNIHandles::resolve(to_module));
1112 Modules::add_module_exports_qualified(h_from_module, package, h_to_module, CHECK);
1113 JVM_END
1114
1115 JVM_ENTRY(void, JVM_AddModuleExportsToAllUnnamed(JNIEnv *env, jobject from_module, jstring package))
1116 Handle h_from_module (THREAD, JNIHandles::resolve(from_module));
1117 Modules::add_module_exports_to_all_unnamed(h_from_module, package, CHECK);
1118 JVM_END
1119
1120 JVM_ENTRY(void, JVM_AddModuleExportsToAll(JNIEnv *env, jobject from_module, jstring package))
1121 Handle h_from_module (THREAD, JNIHandles::resolve(from_module));
1122 Modules::add_module_exports(h_from_module, package, Handle(), CHECK);
1123 JVM_END
1124
1125 JVM_ENTRY (void, JVM_AddReadsModule(JNIEnv *env, jobject from_module, jobject source_module))
1126 Handle h_from_module (THREAD, JNIHandles::resolve(from_module));
1127 Handle h_source_module (THREAD, JNIHandles::resolve(source_module));
1128 Modules::add_reads_module(h_from_module, h_source_module, CHECK);
1129 JVM_END
1130
1131 JVM_ENTRY(void, JVM_DefineArchivedModules(JNIEnv *env, jobject platform_loader, jobject system_loader))
1132 Handle h_platform_loader (THREAD, JNIHandles::resolve(platform_loader));
1133 Handle h_system_loader (THREAD, JNIHandles::resolve(system_loader));
1134 Modules::define_archived_modules(h_platform_loader, h_system_loader, CHECK);
1135 JVM_END
1136
1137 // Reflection support //////////////////////////////////////////////////////////////////////////////
1138
1139 JVM_ENTRY(jstring, JVM_InitClassName(JNIEnv *env, jclass cls))
1140 assert (cls != nullptr, "illegal class");
1141 JvmtiVMObjectAllocEventCollector oam;
1142 ResourceMark rm(THREAD);
1143 HandleMark hm(THREAD);
1144 Handle java_class(THREAD, JNIHandles::resolve(cls));
1145 oop result = java_lang_Class::name(java_class, CHECK_NULL);
1146 return (jstring) JNIHandles::make_local(THREAD, result);
1147 JVM_END
1148
1149
1150 JVM_ENTRY(jobjectArray, JVM_GetClassInterfaces(JNIEnv *env, jclass cls))
1151 JvmtiVMObjectAllocEventCollector oam;
1152 oop mirror = JNIHandles::resolve_non_null(cls);
1153
1154 // Special handling for primitive objects
1155 if (java_lang_Class::is_primitive(mirror)) {
1156 // Primitive objects does not have any interfaces
1157 objArrayOop r = oopFactory::new_objArray(vmClasses::Class_klass(), 0, CHECK_NULL);
1158 return (jobjectArray) JNIHandles::make_local(THREAD, r);
1159 }
1160
1161 Klass* klass = java_lang_Class::as_Klass(mirror);
1162 // Figure size of result array
1163 int size;
1164 if (klass->is_instance_klass()) {
1165 size = InstanceKlass::cast(klass)->local_interfaces()->length();
1166 } else {
1167 assert(klass->is_objArray_klass() || klass->is_typeArray_klass(), "Illegal mirror klass");
1168 size = 2;
1169 }
1170
1171 // Allocate result array
1172 objArrayOop r = oopFactory::new_objArray(vmClasses::Class_klass(), size, CHECK_NULL);
1173 objArrayHandle result (THREAD, r);
1174 // Fill in result
1175 if (klass->is_instance_klass()) {
1176 // Regular instance klass, fill in all local interfaces
1177 for (int index = 0; index < size; index++) {
1178 Klass* k = InstanceKlass::cast(klass)->local_interfaces()->at(index);
1179 result->obj_at_put(index, k->java_mirror());
1180 }
1181 } else {
1182 // All arrays implement java.lang.Cloneable and java.io.Serializable
1183 result->obj_at_put(0, vmClasses::Cloneable_klass()->java_mirror());
1184 result->obj_at_put(1, vmClasses::Serializable_klass()->java_mirror());
1185 }
1186 return (jobjectArray) JNIHandles::make_local(THREAD, result());
1187 JVM_END
1188
1189
1190 JVM_ENTRY(jboolean, JVM_IsHiddenClass(JNIEnv *env, jclass cls))
1191 oop mirror = JNIHandles::resolve_non_null(cls);
1192 if (java_lang_Class::is_primitive(mirror)) {
1193 return JNI_FALSE;
1194 }
1195 Klass* k = java_lang_Class::as_Klass(mirror);
1196 return k->is_hidden();
1197 JVM_END
1198
1199
1200 class ScopedValueBindingsResolver {
1201 public:
1202 InstanceKlass* Carrier_klass;
1203 ScopedValueBindingsResolver(JavaThread* THREAD) {
1204 Klass *k = SystemDictionary::resolve_or_fail(vmSymbols::java_lang_ScopedValue_Carrier(), true, THREAD);
1205 Carrier_klass = InstanceKlass::cast(k);
1206 }
1207 };
1208
1209 JVM_ENTRY(jobject, JVM_FindScopedValueBindings(JNIEnv *env, jclass cls))
1210 ResourceMark rm(THREAD);
1211 GrowableArray<Handle>* local_array = new GrowableArray<Handle>(12);
1212 JvmtiVMObjectAllocEventCollector oam;
1213
1214 static ScopedValueBindingsResolver resolver(THREAD);
1215
1216 // Iterate through Java frames
1217 vframeStream vfst(thread);
1218 for(; !vfst.at_end(); vfst.next()) {
1219 int loc = -1;
1220 // get method of frame
1221 Method* method = vfst.method();
1222
1223 Symbol *name = method->name();
1224
1225 InstanceKlass* holder = method->method_holder();
1226 if (name == vmSymbols::runWith_method_name()) {
1227 if (holder == vmClasses::Thread_klass()
1228 || holder == resolver.Carrier_klass) {
1229 loc = 1;
1230 }
1231 }
1232
1233 if (loc != -1) {
1234 javaVFrame *frame = vfst.asJavaVFrame();
1235 StackValueCollection* locals = frame->locals();
1236 StackValue* head_sv = locals->at(loc); // java/lang/ScopedValue$Snapshot
1237 Handle result = head_sv->get_obj();
1238 assert(!head_sv->obj_is_scalar_replaced(), "found scalar-replaced object");
1239 if (result() != nullptr) {
1240 return JNIHandles::make_local(THREAD, result());
1241 }
1242 }
1243 }
1244
1245 return nullptr;
1246 JVM_END
1247
1248 JVM_ENTRY(jobjectArray, JVM_GetDeclaredClasses(JNIEnv *env, jclass ofClass))
1249 JvmtiVMObjectAllocEventCollector oam;
1250 // ofClass is a reference to a java_lang_Class object. The mirror object
1251 // of an InstanceKlass
1252 oop ofMirror = JNIHandles::resolve_non_null(ofClass);
1253 if (java_lang_Class::is_primitive(ofMirror) ||
1254 ! java_lang_Class::as_Klass(ofMirror)->is_instance_klass()) {
1255 oop result = oopFactory::new_objArray(vmClasses::Class_klass(), 0, CHECK_NULL);
1256 return (jobjectArray)JNIHandles::make_local(THREAD, result);
1257 }
1258
1259 InstanceKlass* k = InstanceKlass::cast(java_lang_Class::as_Klass(ofMirror));
1260 InnerClassesIterator iter(k);
1261
1262 if (iter.length() == 0) {
1263 // Neither an inner nor outer class
1264 oop result = oopFactory::new_objArray(vmClasses::Class_klass(), 0, CHECK_NULL);
1265 return (jobjectArray)JNIHandles::make_local(THREAD, result);
1266 }
1267
1268 // find inner class info
1294 result->obj_at_put(members, inner_klass->java_mirror());
1295 members++;
1296 }
1297 }
1298 }
1299 }
1300
1301 if (members != length) {
1302 // Return array of right length
1303 objArrayOop res = oopFactory::new_objArray(vmClasses::Class_klass(), members, CHECK_NULL);
1304 for(int i = 0; i < members; i++) {
1305 res->obj_at_put(i, result->obj_at(i));
1306 }
1307 return (jobjectArray)JNIHandles::make_local(THREAD, res);
1308 }
1309
1310 return (jobjectArray)JNIHandles::make_local(THREAD, result());
1311 JVM_END
1312
1313
1314 JVM_ENTRY(jclass, JVM_GetDeclaringClass(JNIEnv *env, jclass ofClass))
1315 {
1316 // ofClass is a reference to a java_lang_Class object.
1317 oop ofMirror = JNIHandles::resolve_non_null(ofClass);
1318 if (java_lang_Class::is_primitive(ofMirror)) {
1319 return nullptr;
1320 }
1321 Klass* klass = java_lang_Class::as_Klass(ofMirror);
1322 if (!klass->is_instance_klass()) {
1323 return nullptr;
1324 }
1325
1326 bool inner_is_member = false;
1327 Klass* outer_klass
1328 = InstanceKlass::cast(klass)->compute_enclosing_class(&inner_is_member, CHECK_NULL);
1329 if (outer_klass == nullptr) return nullptr; // already a top-level class
1330 if (!inner_is_member) return nullptr; // a hidden class (inside a method)
1331 return (jclass) JNIHandles::make_local(THREAD, outer_klass->java_mirror());
1332 }
1333 JVM_END
1334
1335 JVM_ENTRY(jstring, JVM_GetSimpleBinaryName(JNIEnv *env, jclass cls))
1336 {
1337 oop mirror = JNIHandles::resolve_non_null(cls);
1338 if (java_lang_Class::is_primitive(mirror)) {
1339 return nullptr;
1340 }
1341 Klass* klass = java_lang_Class::as_Klass(mirror);
1342 if (!klass->is_instance_klass()) {
1343 return nullptr;
1344 }
1345 InstanceKlass* k = InstanceKlass::cast(klass);
1346 int ooff = 0, noff = 0;
1347 if (k->find_inner_classes_attr(&ooff, &noff, THREAD)) {
1348 if (noff != 0) {
1349 constantPoolHandle i_cp(thread, k->constants());
1350 Symbol* name = i_cp->symbol_at(noff);
1351 Handle str = java_lang_String::create_from_symbol(name, CHECK_NULL);
1352 return (jstring) JNIHandles::make_local(THREAD, str());
1353 }
1354 }
1355 return nullptr;
1356 }
1357 JVM_END
1358
1359 JVM_ENTRY(jstring, JVM_GetClassSignature(JNIEnv *env, jclass cls))
1360 assert (cls != nullptr, "illegal class");
1361 JvmtiVMObjectAllocEventCollector oam;
1362 ResourceMark rm(THREAD);
1363 oop mirror = JNIHandles::resolve_non_null(cls);
1364 // Return null for arrays and primitives
1365 if (!java_lang_Class::is_primitive(mirror)) {
1366 Klass* k = java_lang_Class::as_Klass(mirror);
1367 if (k->is_instance_klass()) {
1368 Symbol* sym = InstanceKlass::cast(k)->generic_signature();
1369 if (sym == nullptr) return nullptr;
1370 Handle str = java_lang_String::create_from_symbol(sym, CHECK_NULL);
1371 return (jstring) JNIHandles::make_local(THREAD, str());
1372 }
1373 }
1374 return nullptr;
1375 JVM_END
1376
1377
1378 JVM_ENTRY(jbyteArray, JVM_GetClassAnnotations(JNIEnv *env, jclass cls))
1379 assert (cls != nullptr, "illegal class");
1380 oop mirror = JNIHandles::resolve_non_null(cls);
1381 // Return null for arrays and primitives
1382 if (!java_lang_Class::is_primitive(mirror)) {
1383 Klass* k = java_lang_Class::as_Klass(mirror);
1384 if (k->is_instance_klass()) {
1385 typeArrayOop a = Annotations::make_java_array(InstanceKlass::cast(k)->class_annotations(), CHECK_NULL);
1386 return (jbyteArray) JNIHandles::make_local(THREAD, a);
1387 }
1388 }
1389 return nullptr;
1390 JVM_END
1391
1392
1393 static bool jvm_get_field_common(jobject field, fieldDescriptor& fd) {
1394 // some of this code was adapted from from jni_FromReflectedField
1395
1396 oop reflected = JNIHandles::resolve_non_null(field);
1397 oop mirror = java_lang_reflect_Field::clazz(reflected);
1398 Klass* k = java_lang_Class::as_Klass(mirror);
1427 int slot = 0;
1428
1429 if (reflected->klass() == vmClasses::reflect_Constructor_klass()) {
1430 mirror = java_lang_reflect_Constructor::clazz(reflected);
1431 slot = java_lang_reflect_Constructor::slot(reflected);
1432 } else {
1433 assert(reflected->klass() == vmClasses::reflect_Method_klass(),
1434 "wrong type");
1435 mirror = java_lang_reflect_Method::clazz(reflected);
1436 slot = java_lang_reflect_Method::slot(reflected);
1437 }
1438 Klass* k = java_lang_Class::as_Klass(mirror);
1439
1440 Method* m = InstanceKlass::cast(k)->method_with_idnum(slot);
1441 assert(m != nullptr, "cannot find method");
1442 return m; // caller has to deal with null in product mode
1443 }
1444
1445 /* Type use annotations support (JDK 1.8) */
1446
1447 JVM_ENTRY(jbyteArray, JVM_GetClassTypeAnnotations(JNIEnv *env, jclass cls))
1448 assert (cls != nullptr, "illegal class");
1449 ResourceMark rm(THREAD);
1450 // Return null for arrays and primitives
1451 if (!java_lang_Class::is_primitive(JNIHandles::resolve(cls))) {
1452 Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve(cls));
1453 if (k->is_instance_klass()) {
1454 AnnotationArray* type_annotations = InstanceKlass::cast(k)->class_type_annotations();
1455 if (type_annotations != nullptr) {
1456 typeArrayOop a = Annotations::make_java_array(type_annotations, CHECK_NULL);
1457 return (jbyteArray) JNIHandles::make_local(THREAD, a);
1458 }
1459 }
1460 }
1461 return nullptr;
1462 JVM_END
1463
1464 JVM_ENTRY(jbyteArray, JVM_GetMethodTypeAnnotations(JNIEnv *env, jobject method))
1465 assert (method != nullptr, "illegal method");
1466 // method is a handle to a java.lang.reflect.Method object
1467 Method* m = jvm_get_method_common(method);
1468 if (m == nullptr) {
1469 return nullptr;
1470 }
1471
1472 AnnotationArray* type_annotations = m->type_annotations();
1473 if (type_annotations != nullptr) {
1474 typeArrayOop a = Annotations::make_java_array(type_annotations, CHECK_NULL);
1475 return (jbyteArray) JNIHandles::make_local(THREAD, a);
1476 }
1477
1478 return nullptr;
1479 JVM_END
1480
1481 JVM_ENTRY(jbyteArray, JVM_GetFieldTypeAnnotations(JNIEnv *env, jobject field))
1482 assert (field != nullptr, "illegal field");
1483 fieldDescriptor fd;
1484 bool gotFd = jvm_get_field_common(field, fd);
1485 if (!gotFd) {
1486 return nullptr;
1487 }
1488
1489 return (jbyteArray) JNIHandles::make_local(THREAD, Annotations::make_java_array(fd.type_annotations(), THREAD));
1490 JVM_END
1491
1492 static void bounds_check(const constantPoolHandle& cp, jint index, TRAPS) {
1493 if (!cp->is_within_bounds(index)) {
1494 THROW_MSG(vmSymbols::java_lang_IllegalArgumentException(), "Constant pool index out of bounds");
1495 }
1496 }
1497
1498 JVM_ENTRY(jobjectArray, JVM_GetMethodParameters(JNIEnv *env, jobject method))
1499 {
1500 // method is a handle to a java.lang.reflect.Method object
1501 Method* method_ptr = jvm_get_method_common(method);
1502 methodHandle mh (THREAD, method_ptr);
1503 Handle reflected_method (THREAD, JNIHandles::resolve_non_null(method));
1504 const int num_params = mh->method_parameters_length();
1505
1506 if (num_params < 0) {
1507 // A -1 return value from method_parameters_length means there is no
1508 // parameter data. Return null to indicate this to the reflection
1509 // API.
1510 assert(num_params == -1, "num_params should be -1 if it is less than zero");
1511 return (jobjectArray)nullptr;
1512 } else {
1513 // Otherwise, we return something up to reflection, even if it is
1514 // a zero-length array. Why? Because in some cases this can
1515 // trigger a MalformedParametersException.
1516
1517 // make sure all the symbols are properly formatted
1518 for (int i = 0; i < num_params; i++) {
1531 objArrayOop result_oop = oopFactory::new_objArray(vmClasses::reflect_Parameter_klass(), num_params, CHECK_NULL);
1532 objArrayHandle result (THREAD, result_oop);
1533
1534 for (int i = 0; i < num_params; i++) {
1535 MethodParametersElement* params = mh->method_parameters_start();
1536 // For a 0 index, give a null symbol
1537 Symbol* sym = 0 != params[i].name_cp_index ?
1538 mh->constants()->symbol_at(params[i].name_cp_index) : nullptr;
1539 int flags = params[i].flags;
1540 oop param = Reflection::new_parameter(reflected_method, i, sym,
1541 flags, CHECK_NULL);
1542 result->obj_at_put(i, param);
1543 }
1544 return (jobjectArray)JNIHandles::make_local(THREAD, result());
1545 }
1546 }
1547 JVM_END
1548
1549 // New (JDK 1.4) reflection implementation /////////////////////////////////////
1550
1551 JVM_ENTRY(jobjectArray, JVM_GetClassDeclaredFields(JNIEnv *env, jclass ofClass, jboolean publicOnly))
1552 {
1553 JvmtiVMObjectAllocEventCollector oam;
1554
1555 oop ofMirror = JNIHandles::resolve_non_null(ofClass);
1556 // Exclude primitive types and array types
1557 if (java_lang_Class::is_primitive(ofMirror) ||
1558 java_lang_Class::as_Klass(ofMirror)->is_array_klass()) {
1559 // Return empty array
1560 oop res = oopFactory::new_objArray(vmClasses::reflect_Field_klass(), 0, CHECK_NULL);
1561 return (jobjectArray) JNIHandles::make_local(THREAD, res);
1562 }
1563
1564 InstanceKlass* k = InstanceKlass::cast(java_lang_Class::as_Klass(ofMirror));
1565 constantPoolHandle cp(THREAD, k->constants());
1566
1567 // Ensure class is linked
1568 k->link_class(CHECK_NULL);
1569
1570 // Allocate result
1571 int num_fields;
1582 objArrayOop r = oopFactory::new_objArray(vmClasses::reflect_Field_klass(), num_fields, CHECK_NULL);
1583 objArrayHandle result (THREAD, r);
1584
1585 int out_idx = 0;
1586 fieldDescriptor fd;
1587 for (JavaFieldStream fs(k); !fs.done(); fs.next()) {
1588 if (!publicOnly || fs.access_flags().is_public()) {
1589 fd.reinitialize(k, fs.index());
1590 oop field = Reflection::new_field(&fd, CHECK_NULL);
1591 result->obj_at_put(out_idx, field);
1592 ++out_idx;
1593 }
1594 }
1595 assert(out_idx == num_fields, "just checking");
1596 return (jobjectArray) JNIHandles::make_local(THREAD, result());
1597 }
1598 JVM_END
1599
1600 // A class is a record if and only if it is final and a direct subclass of
1601 // java.lang.Record and has a Record attribute; otherwise, it is not a record.
1602 JVM_ENTRY(jboolean, JVM_IsRecord(JNIEnv *env, jclass cls))
1603 {
1604 Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(cls));
1605 if (k != nullptr && k->is_instance_klass()) {
1606 InstanceKlass* ik = InstanceKlass::cast(k);
1607 return ik->is_record();
1608 } else {
1609 return false;
1610 }
1611 }
1612 JVM_END
1613
1614 // Returns an array containing the components of the Record attribute,
1615 // or null if the attribute is not present.
1616 //
1617 // Note that this function returns the components of the Record attribute
1618 // even if the class is not a record.
1619 JVM_ENTRY(jobjectArray, JVM_GetRecordComponents(JNIEnv* env, jclass ofClass))
1620 {
1621 Klass* c = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(ofClass));
1622 assert(c->is_instance_klass(), "must be");
1623 InstanceKlass* ik = InstanceKlass::cast(c);
1624
1625 Array<RecordComponent*>* components = ik->record_components();
1626 if (components != nullptr) {
1627 JvmtiVMObjectAllocEventCollector oam;
1628 constantPoolHandle cp(THREAD, ik->constants());
1629 int length = components->length();
1630 assert(length >= 0, "unexpected record_components length");
1631 objArrayOop record_components =
1632 oopFactory::new_objArray(vmClasses::RecordComponent_klass(), length, CHECK_NULL);
1633 objArrayHandle components_h (THREAD, record_components);
1634
1635 for (int x = 0; x < length; x++) {
1636 RecordComponent* component = components->at(x);
1637 assert(component != nullptr, "unexpected null record component");
1638 oop component_oop = java_lang_reflect_RecordComponent::create(ik, component, CHECK_NULL);
1639 components_h->obj_at_put(x, component_oop);
1706 for (int i = 0; i < num_methods; i++) {
1707 methodHandle method(THREAD, k->method_with_idnum(idnums->at(i)));
1708 if (method.is_null()) {
1709 // Method may have been deleted and seems this API can handle null
1710 // Otherwise should probably put a method that throws NSME
1711 result->obj_at_put(i, nullptr);
1712 } else {
1713 oop m;
1714 if (want_constructor) {
1715 m = Reflection::new_constructor(method, CHECK_NULL);
1716 } else {
1717 m = Reflection::new_method(method, false, CHECK_NULL);
1718 }
1719 result->obj_at_put(i, m);
1720 }
1721 }
1722
1723 return (jobjectArray) JNIHandles::make_local(THREAD, result());
1724 }
1725
1726 JVM_ENTRY(jobjectArray, JVM_GetClassDeclaredMethods(JNIEnv *env, jclass ofClass, jboolean publicOnly))
1727 {
1728 return get_class_declared_methods_helper(env, ofClass, publicOnly,
1729 /*want_constructor*/ false,
1730 vmClasses::reflect_Method_klass(), THREAD);
1731 }
1732 JVM_END
1733
1734 JVM_ENTRY(jobjectArray, JVM_GetClassDeclaredConstructors(JNIEnv *env, jclass ofClass, jboolean publicOnly))
1735 {
1736 return get_class_declared_methods_helper(env, ofClass, publicOnly,
1737 /*want_constructor*/ true,
1738 vmClasses::reflect_Constructor_klass(), THREAD);
1739 }
1740 JVM_END
1741
1742 JVM_ENTRY(jint, JVM_GetClassAccessFlags(JNIEnv *env, jclass cls))
1743 {
1744 oop mirror = JNIHandles::resolve_non_null(cls);
1745 if (java_lang_Class::is_primitive(mirror)) {
1746 // Primitive type
1747 return JVM_ACC_ABSTRACT | JVM_ACC_FINAL | JVM_ACC_PUBLIC;
1748 }
1749
1750 Klass* k = java_lang_Class::as_Klass(mirror);
1751 return k->access_flags().as_class_flags();
1752 }
1753 JVM_END
1754
1755 JVM_ENTRY(jboolean, JVM_AreNestMates(JNIEnv *env, jclass current, jclass member))
1756 {
1757 Klass* c = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(current));
1758 assert(c->is_instance_klass(), "must be");
1759 InstanceKlass* ck = InstanceKlass::cast(c);
1760 Klass* m = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(member));
1761 assert(m->is_instance_klass(), "must be");
1762 InstanceKlass* mk = InstanceKlass::cast(m);
1763 return ck->has_nestmate_access_to(mk, THREAD);
1764 }
1765 JVM_END
1766
1767 JVM_ENTRY(jclass, JVM_GetNestHost(JNIEnv* env, jclass current))
1768 {
1769 // current is not a primitive or array class
1770 Klass* c = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(current));
1771 assert(c->is_instance_klass(), "must be");
1772 InstanceKlass* ck = InstanceKlass::cast(c);
1773 InstanceKlass* host = ck->nest_host(THREAD);
1774 return (jclass) (host == nullptr ? nullptr :
1775 JNIHandles::make_local(THREAD, host->java_mirror()));
1776 }
1777 JVM_END
1778
1779 JVM_ENTRY(jobjectArray, JVM_GetNestMembers(JNIEnv* env, jclass current))
1780 {
1781 // current is not a primitive or array class
1782 ResourceMark rm(THREAD);
1783 Klass* c = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(current));
1784 assert(c->is_instance_klass(), "must be");
1785 InstanceKlass* ck = InstanceKlass::cast(c);
1786 InstanceKlass* host = ck->nest_host(THREAD);
1787
1788 log_trace(class, nestmates)("Calling GetNestMembers for type %s with nest-host %s",
1789 ck->external_name(), host->external_name());
1790 {
1791 JvmtiVMObjectAllocEventCollector oam;
1792 Array<u2>* members = host->nest_members();
1793 int length = members == nullptr ? 0 : members->length();
1794
1795 log_trace(class, nestmates)(" - host has %d listed nest members", length);
1796
1797 // nest host is first in the array so make it one bigger
1798 objArrayOop r = oopFactory::new_objArray(vmClasses::Class_klass(),
1799 length + 1, CHECK_NULL);
1839 log_trace(class, nestmates)(" - compacting array from length %d to %d",
1840 length + 1, count + 1);
1841
1842 objArrayOop r2 = oopFactory::new_objArray(vmClasses::Class_klass(),
1843 count + 1, CHECK_NULL);
1844 objArrayHandle result2(THREAD, r2);
1845 for (int i = 0; i < count + 1; i++) {
1846 result2->obj_at_put(i, result->obj_at(i));
1847 }
1848 return (jobjectArray)JNIHandles::make_local(THREAD, result2());
1849 }
1850 }
1851 else {
1852 assert(host == ck || ck->is_hidden(), "must be singleton nest or dynamic nestmate");
1853 }
1854 return (jobjectArray)JNIHandles::make_local(THREAD, result());
1855 }
1856 }
1857 JVM_END
1858
1859 JVM_ENTRY(jobjectArray, JVM_GetPermittedSubclasses(JNIEnv* env, jclass current))
1860 {
1861 oop mirror = JNIHandles::resolve_non_null(current);
1862 assert(!java_lang_Class::is_primitive(mirror), "should not be");
1863 Klass* c = java_lang_Class::as_Klass(mirror);
1864 assert(c->is_instance_klass(), "must be");
1865 InstanceKlass* ik = InstanceKlass::cast(c);
1866 ResourceMark rm(THREAD);
1867 log_trace(class, sealed)("Calling GetPermittedSubclasses for %s type %s",
1868 ik->is_sealed() ? "sealed" : "non-sealed", ik->external_name());
1869 if (ik->is_sealed()) {
1870 JvmtiVMObjectAllocEventCollector oam;
1871 Array<u2>* subclasses = ik->permitted_subclasses();
1872 int length = subclasses->length();
1873
1874 log_trace(class, sealed)(" - sealed class has %d permitted subclasses", length);
1875
1876 objArrayOop r = oopFactory::new_objArray(vmClasses::Class_klass(),
1877 length, CHECK_NULL);
1878 objArrayHandle result(THREAD, r);
1879 int count = 0;
1902 }
1903 if (count < length) {
1904 // we had invalid entries so we need to compact the array
1905 objArrayOop r2 = oopFactory::new_objArray(vmClasses::Class_klass(),
1906 count, CHECK_NULL);
1907 objArrayHandle result2(THREAD, r2);
1908 for (int i = 0; i < count; i++) {
1909 result2->obj_at_put(i, result->obj_at(i));
1910 }
1911 return (jobjectArray)JNIHandles::make_local(THREAD, result2());
1912 }
1913 return (jobjectArray)JNIHandles::make_local(THREAD, result());
1914 } else {
1915 return nullptr;
1916 }
1917 }
1918 JVM_END
1919
1920 // Constant pool access //////////////////////////////////////////////////////////
1921
1922 JVM_ENTRY(jobject, JVM_GetClassConstantPool(JNIEnv *env, jclass cls))
1923 {
1924 JvmtiVMObjectAllocEventCollector oam;
1925 oop mirror = JNIHandles::resolve_non_null(cls);
1926 // Return null for primitives and arrays
1927 if (!java_lang_Class::is_primitive(mirror)) {
1928 Klass* k = java_lang_Class::as_Klass(mirror);
1929 if (k->is_instance_klass()) {
1930 InstanceKlass* k_h = InstanceKlass::cast(k);
1931 Handle jcp = reflect_ConstantPool::create(CHECK_NULL);
1932 reflect_ConstantPool::set_cp(jcp(), k_h->constants());
1933 return JNIHandles::make_local(THREAD, jcp());
1934 }
1935 }
1936 return nullptr;
1937 }
1938 JVM_END
1939
1940
1941 JVM_ENTRY(jint, JVM_ConstantPoolGetSize(JNIEnv *env, jobject obj, jobject unused))
1942 {
1943 constantPoolHandle cp = constantPoolHandle(THREAD, reflect_ConstantPool::get_cp(JNIHandles::resolve_non_null(obj)));
1944 return cp->length();
1945 }
1946 JVM_END
1947
1948
1949 JVM_ENTRY(jclass, JVM_ConstantPoolGetClassAt(JNIEnv *env, jobject obj, jobject unused, jint index))
1950 {
1951 constantPoolHandle cp = constantPoolHandle(THREAD, reflect_ConstantPool::get_cp(JNIHandles::resolve_non_null(obj)));
1952 bounds_check(cp, index, CHECK_NULL);
1953 constantTag tag = cp->tag_at(index);
1954 if (!tag.is_klass() && !tag.is_unresolved_klass()) {
1955 THROW_MSG_NULL(vmSymbols::java_lang_IllegalArgumentException(), "Wrong type at constant pool index");
1956 }
1957 Klass* k = cp->klass_at(index, CHECK_NULL);
1958 return (jclass) JNIHandles::make_local(THREAD, k->java_mirror());
1959 }
1960 JVM_END
1961
1962 JVM_ENTRY(jclass, JVM_ConstantPoolGetClassAtIfLoaded(JNIEnv *env, jobject obj, jobject unused, jint index))
1963 {
1964 constantPoolHandle cp = constantPoolHandle(THREAD, reflect_ConstantPool::get_cp(JNIHandles::resolve_non_null(obj)));
1965 bounds_check(cp, index, CHECK_NULL);
1966 constantTag tag = cp->tag_at(index);
1967 if (!tag.is_klass() && !tag.is_unresolved_klass()) {
1968 THROW_MSG_NULL(vmSymbols::java_lang_IllegalArgumentException(), "Wrong type at constant pool index");
1969 }
1970 Klass* k = ConstantPool::klass_at_if_loaded(cp, index);
1971 if (k == nullptr) return nullptr;
1972 return (jclass) JNIHandles::make_local(THREAD, k->java_mirror());
1973 }
1974 JVM_END
1975
1976 static jobject get_method_at_helper(const constantPoolHandle& cp, jint index, bool force_resolution, TRAPS) {
1977 constantTag tag = cp->tag_at(index);
1978 if (!tag.is_method() && !tag.is_interface_method()) {
1979 THROW_MSG_NULL(vmSymbols::java_lang_IllegalArgumentException(), "Wrong type at constant pool index");
1980 }
1981 int klass_ref = cp->uncached_klass_ref_index_at(index);
1982 Klass* k_o;
1986 k_o = ConstantPool::klass_at_if_loaded(cp, klass_ref);
1987 if (k_o == nullptr) return nullptr;
1988 }
1989 InstanceKlass* k = InstanceKlass::cast(k_o);
1990 Symbol* name = cp->uncached_name_ref_at(index);
1991 Symbol* sig = cp->uncached_signature_ref_at(index);
1992 methodHandle m (THREAD, k->find_method(name, sig));
1993 if (m.is_null()) {
1994 THROW_MSG_NULL(vmSymbols::java_lang_RuntimeException(), "Unable to look up method in target class");
1995 }
1996 oop method;
1997 if (m->is_object_initializer()) {
1998 method = Reflection::new_constructor(m, CHECK_NULL);
1999 } else {
2000 // new_method accepts <clinit> as Method here
2001 method = Reflection::new_method(m, true, CHECK_NULL);
2002 }
2003 return JNIHandles::make_local(THREAD, method);
2004 }
2005
2006 JVM_ENTRY(jobject, JVM_ConstantPoolGetMethodAt(JNIEnv *env, jobject obj, jobject unused, jint index))
2007 {
2008 JvmtiVMObjectAllocEventCollector oam;
2009 constantPoolHandle cp = constantPoolHandle(THREAD, reflect_ConstantPool::get_cp(JNIHandles::resolve_non_null(obj)));
2010 bounds_check(cp, index, CHECK_NULL);
2011 jobject res = get_method_at_helper(cp, index, true, CHECK_NULL);
2012 return res;
2013 }
2014 JVM_END
2015
2016 JVM_ENTRY(jobject, JVM_ConstantPoolGetMethodAtIfLoaded(JNIEnv *env, jobject obj, jobject unused, jint index))
2017 {
2018 JvmtiVMObjectAllocEventCollector oam;
2019 constantPoolHandle cp = constantPoolHandle(THREAD, reflect_ConstantPool::get_cp(JNIHandles::resolve_non_null(obj)));
2020 bounds_check(cp, index, CHECK_NULL);
2021 jobject res = get_method_at_helper(cp, index, false, CHECK_NULL);
2022 return res;
2023 }
2024 JVM_END
2025
2026 static jobject get_field_at_helper(constantPoolHandle cp, jint index, bool force_resolution, TRAPS) {
2027 constantTag tag = cp->tag_at(index);
2028 if (!tag.is_field()) {
2029 THROW_MSG_NULL(vmSymbols::java_lang_IllegalArgumentException(), "Wrong type at constant pool index");
2030 }
2031 int klass_ref = cp->uncached_klass_ref_index_at(index);
2032 Klass* k_o;
2033 if (force_resolution) {
2034 k_o = cp->klass_at(klass_ref, CHECK_NULL);
2035 } else {
2036 k_o = ConstantPool::klass_at_if_loaded(cp, klass_ref);
2037 if (k_o == nullptr) return nullptr;
2038 }
2039 InstanceKlass* k = InstanceKlass::cast(k_o);
2040 Symbol* name = cp->uncached_name_ref_at(index);
2041 Symbol* sig = cp->uncached_signature_ref_at(index);
2042 fieldDescriptor fd;
2043 Klass* target_klass = k->find_field(name, sig, &fd);
2044 if (target_klass == nullptr) {
2045 THROW_MSG_NULL(vmSymbols::java_lang_RuntimeException(), "Unable to look up field in target class");
2046 }
2047 oop field = Reflection::new_field(&fd, CHECK_NULL);
2048 return JNIHandles::make_local(THREAD, field);
2049 }
2050
2051 JVM_ENTRY(jobject, JVM_ConstantPoolGetFieldAt(JNIEnv *env, jobject obj, jobject unusedl, jint index))
2052 {
2053 JvmtiVMObjectAllocEventCollector oam;
2054 constantPoolHandle cp = constantPoolHandle(THREAD, reflect_ConstantPool::get_cp(JNIHandles::resolve_non_null(obj)));
2055 bounds_check(cp, index, CHECK_NULL);
2056 jobject res = get_field_at_helper(cp, index, true, CHECK_NULL);
2057 return res;
2058 }
2059 JVM_END
2060
2061 JVM_ENTRY(jobject, JVM_ConstantPoolGetFieldAtIfLoaded(JNIEnv *env, jobject obj, jobject unused, jint index))
2062 {
2063 JvmtiVMObjectAllocEventCollector oam;
2064 constantPoolHandle cp = constantPoolHandle(THREAD, reflect_ConstantPool::get_cp(JNIHandles::resolve_non_null(obj)));
2065 bounds_check(cp, index, CHECK_NULL);
2066 jobject res = get_field_at_helper(cp, index, false, CHECK_NULL);
2067 return res;
2068 }
2069 JVM_END
2070
2071 JVM_ENTRY(jobjectArray, JVM_ConstantPoolGetMemberRefInfoAt(JNIEnv *env, jobject obj, jobject unused, jint index))
2072 {
2073 JvmtiVMObjectAllocEventCollector oam;
2074 constantPoolHandle cp = constantPoolHandle(THREAD, reflect_ConstantPool::get_cp(JNIHandles::resolve_non_null(obj)));
2075 bounds_check(cp, index, CHECK_NULL);
2076 constantTag tag = cp->tag_at(index);
2077 if (!tag.is_field_or_method()) {
2078 THROW_MSG_NULL(vmSymbols::java_lang_IllegalArgumentException(), "Wrong type at constant pool index");
2079 }
2080 int klass_ref = cp->uncached_klass_ref_index_at(index);
2081 Symbol* klass_name = cp->klass_name_at(klass_ref);
2082 Symbol* member_name = cp->uncached_name_ref_at(index);
2083 Symbol* member_sig = cp->uncached_signature_ref_at(index);
2084 objArrayOop dest_o = oopFactory::new_objArray(vmClasses::String_klass(), 3, CHECK_NULL);
2085 objArrayHandle dest(THREAD, dest_o);
2086 Handle str = java_lang_String::create_from_symbol(klass_name, CHECK_NULL);
2087 dest->obj_at_put(0, str());
2088 str = java_lang_String::create_from_symbol(member_name, CHECK_NULL);
2089 dest->obj_at_put(1, str());
2090 str = java_lang_String::create_from_symbol(member_sig, CHECK_NULL);
2091 dest->obj_at_put(2, str());
2092 return (jobjectArray) JNIHandles::make_local(THREAD, dest());
2093 }
2094 JVM_END
2095
2096 JVM_ENTRY(jint, JVM_ConstantPoolGetClassRefIndexAt(JNIEnv *env, jobject obj, jobject unused, jint index))
2097 {
2098 JvmtiVMObjectAllocEventCollector oam;
2099 constantPoolHandle cp(THREAD, reflect_ConstantPool::get_cp(JNIHandles::resolve_non_null(obj)));
2100 bounds_check(cp, index, CHECK_0);
2101 constantTag tag = cp->tag_at(index);
2102 if (!tag.is_field_or_method()) {
2103 THROW_MSG_0(vmSymbols::java_lang_IllegalArgumentException(), "Wrong type at constant pool index");
2104 }
2105 return (jint) cp->uncached_klass_ref_index_at(index);
2106 }
2107 JVM_END
2108
2109 JVM_ENTRY(jint, JVM_ConstantPoolGetNameAndTypeRefIndexAt(JNIEnv *env, jobject obj, jobject unused, jint index))
2110 {
2111 JvmtiVMObjectAllocEventCollector oam;
2112 constantPoolHandle cp(THREAD, reflect_ConstantPool::get_cp(JNIHandles::resolve_non_null(obj)));
2113 bounds_check(cp, index, CHECK_0);
2114 constantTag tag = cp->tag_at(index);
2115 if (!tag.is_invoke_dynamic() && !tag.is_field_or_method()) {
2116 THROW_MSG_0(vmSymbols::java_lang_IllegalArgumentException(), "Wrong type at constant pool index");
2117 }
2118 return (jint) cp->uncached_name_and_type_ref_index_at(index);
2119 }
2120 JVM_END
2121
2122 JVM_ENTRY(jobjectArray, JVM_ConstantPoolGetNameAndTypeRefInfoAt(JNIEnv *env, jobject obj, jobject unused, jint index))
2123 {
2124 JvmtiVMObjectAllocEventCollector oam;
2125 constantPoolHandle cp(THREAD, reflect_ConstantPool::get_cp(JNIHandles::resolve_non_null(obj)));
2126 bounds_check(cp, index, CHECK_NULL);
2127 constantTag tag = cp->tag_at(index);
2128 if (!tag.is_name_and_type()) {
2129 THROW_MSG_NULL(vmSymbols::java_lang_IllegalArgumentException(), "Wrong type at constant pool index");
2130 }
2131 Symbol* member_name = cp->symbol_at(cp->name_ref_index_at(index));
2132 Symbol* member_sig = cp->symbol_at(cp->signature_ref_index_at(index));
2133 objArrayOop dest_o = oopFactory::new_objArray(vmClasses::String_klass(), 2, CHECK_NULL);
2134 objArrayHandle dest(THREAD, dest_o);
2135 Handle str = java_lang_String::create_from_symbol(member_name, CHECK_NULL);
2136 dest->obj_at_put(0, str());
2137 str = java_lang_String::create_from_symbol(member_sig, CHECK_NULL);
2138 dest->obj_at_put(1, str());
2139 return (jobjectArray) JNIHandles::make_local(THREAD, dest());
2140 }
2141 JVM_END
2142
2143 JVM_ENTRY(jint, JVM_ConstantPoolGetIntAt(JNIEnv *env, jobject obj, jobject unused, jint index))
2144 {
2145 constantPoolHandle cp = constantPoolHandle(THREAD, reflect_ConstantPool::get_cp(JNIHandles::resolve_non_null(obj)));
2146 bounds_check(cp, index, CHECK_0);
2147 constantTag tag = cp->tag_at(index);
2148 if (!tag.is_int()) {
2149 THROW_MSG_0(vmSymbols::java_lang_IllegalArgumentException(), "Wrong type at constant pool index");
2150 }
2151 return cp->int_at(index);
2152 }
2153 JVM_END
2154
2155 JVM_ENTRY(jlong, JVM_ConstantPoolGetLongAt(JNIEnv *env, jobject obj, jobject unused, jint index))
2156 {
2157 constantPoolHandle cp = constantPoolHandle(THREAD, reflect_ConstantPool::get_cp(JNIHandles::resolve_non_null(obj)));
2158 bounds_check(cp, index, CHECK_(0L));
2159 constantTag tag = cp->tag_at(index);
2160 if (!tag.is_long()) {
2161 THROW_MSG_0(vmSymbols::java_lang_IllegalArgumentException(), "Wrong type at constant pool index");
2162 }
2163 return cp->long_at(index);
2164 }
2165 JVM_END
2166
2167 JVM_ENTRY(jfloat, JVM_ConstantPoolGetFloatAt(JNIEnv *env, jobject obj, jobject unused, jint index))
2168 {
2169 constantPoolHandle cp = constantPoolHandle(THREAD, reflect_ConstantPool::get_cp(JNIHandles::resolve_non_null(obj)));
2170 bounds_check(cp, index, CHECK_(0.0f));
2171 constantTag tag = cp->tag_at(index);
2172 if (!tag.is_float()) {
2173 THROW_MSG_0(vmSymbols::java_lang_IllegalArgumentException(), "Wrong type at constant pool index");
2174 }
2175 return cp->float_at(index);
2176 }
2177 JVM_END
2178
2179 JVM_ENTRY(jdouble, JVM_ConstantPoolGetDoubleAt(JNIEnv *env, jobject obj, jobject unused, jint index))
2180 {
2181 constantPoolHandle cp = constantPoolHandle(THREAD, reflect_ConstantPool::get_cp(JNIHandles::resolve_non_null(obj)));
2182 bounds_check(cp, index, CHECK_(0.0));
2183 constantTag tag = cp->tag_at(index);
2184 if (!tag.is_double()) {
2185 THROW_MSG_0(vmSymbols::java_lang_IllegalArgumentException(), "Wrong type at constant pool index");
2186 }
2187 return cp->double_at(index);
2188 }
2189 JVM_END
2190
2191 JVM_ENTRY(jstring, JVM_ConstantPoolGetStringAt(JNIEnv *env, jobject obj, jobject unused, jint index))
2192 {
2193 constantPoolHandle cp = constantPoolHandle(THREAD, reflect_ConstantPool::get_cp(JNIHandles::resolve_non_null(obj)));
2194 bounds_check(cp, index, CHECK_NULL);
2195 constantTag tag = cp->tag_at(index);
2196 if (!tag.is_string()) {
2197 THROW_MSG_NULL(vmSymbols::java_lang_IllegalArgumentException(), "Wrong type at constant pool index");
2198 }
2199 oop str = cp->string_at(index, CHECK_NULL);
2200 return (jstring) JNIHandles::make_local(THREAD, str);
2201 }
2202 JVM_END
2203
2204 JVM_ENTRY(jstring, JVM_ConstantPoolGetUTF8At(JNIEnv *env, jobject obj, jobject unused, jint index))
2205 {
2206 JvmtiVMObjectAllocEventCollector oam;
2207 constantPoolHandle cp = constantPoolHandle(THREAD, reflect_ConstantPool::get_cp(JNIHandles::resolve_non_null(obj)));
2208 bounds_check(cp, index, CHECK_NULL);
2209 constantTag tag = cp->tag_at(index);
2210 if (!tag.is_symbol()) {
2211 THROW_MSG_NULL(vmSymbols::java_lang_IllegalArgumentException(), "Wrong type at constant pool index");
2212 }
2213 Symbol* sym = cp->symbol_at(index);
2214 Handle str = java_lang_String::create_from_symbol(sym, CHECK_NULL);
2215 return (jstring) JNIHandles::make_local(THREAD, str());
2216 }
2217 JVM_END
2218
2219 JVM_ENTRY(jbyte, JVM_ConstantPoolGetTagAt(JNIEnv *env, jobject obj, jobject unused, jint index))
2220 {
2221 constantPoolHandle cp = constantPoolHandle(THREAD, reflect_ConstantPool::get_cp(JNIHandles::resolve_non_null(obj)));
2222 bounds_check(cp, index, CHECK_0);
2223 constantTag tag = cp->tag_at(index);
2224 jbyte result = tag.value();
2225 // If returned tag values are not from the JVM spec, e.g. tags from 100 to 105,
2226 // they are changed to the corresponding tags from the JVM spec, so that java code in
2227 // sun.reflect.ConstantPool will return only tags from the JVM spec, not internal ones.
2228 if (tag.is_klass_or_reference()) {
2229 result = JVM_CONSTANT_Class;
2230 } else if (tag.is_string_index()) {
2231 result = JVM_CONSTANT_String;
2232 } else if (tag.is_method_type_in_error()) {
2233 result = JVM_CONSTANT_MethodType;
2234 } else if (tag.is_method_handle_in_error()) {
2235 result = JVM_CONSTANT_MethodHandle;
2236 } else if (tag.is_dynamic_constant_in_error()) {
2237 result = JVM_CONSTANT_Dynamic;
2238 }
2239 return result;
2240 }
2241 JVM_END
2242
2243 // Assertion support. //////////////////////////////////////////////////////////
2244
2245 JVM_ENTRY(jboolean, JVM_DesiredAssertionStatus(JNIEnv *env, jclass unused, jclass cls))
2246 assert(cls != nullptr, "bad class");
2247
2248 oop r = JNIHandles::resolve(cls);
2249 assert(! java_lang_Class::is_primitive(r), "primitive classes not allowed");
2250 if (java_lang_Class::is_primitive(r)) return false;
2251
2252 Klass* k = java_lang_Class::as_Klass(r);
2253 assert(k->is_instance_klass(), "must be an instance klass");
2254 if (!k->is_instance_klass()) return false;
2255
2256 ResourceMark rm(THREAD);
2257 const char* name = k->name()->as_C_string();
2258 bool system_class = k->class_loader() == nullptr;
2259 return JavaAssertions::enabled(name, system_class);
2260
2261 JVM_END
2262
2263
2264 // Return a new AssertionStatusDirectives object with the fields filled in with
2265 // command-line assertion arguments (i.e., -ea, -da).
2266 JVM_ENTRY(jobject, JVM_AssertionStatusDirectives(JNIEnv *env, jclass unused))
2267 JvmtiVMObjectAllocEventCollector oam;
2268 oop asd = JavaAssertions::createAssertionStatusDirectives(CHECK_NULL);
2269 return JNIHandles::make_local(THREAD, asd);
2270 JVM_END
2271
2272 // Verification ////////////////////////////////////////////////////////////////////////////////
2273
2274 // Reflection for the verifier /////////////////////////////////////////////////////////////////
2275
2276 // RedefineClasses support: bug 6214132 caused verification to fail.
2277 // All functions from this section should call the jvmtiThreadSate function:
2278 // Klass* class_to_verify_considering_redefinition(Klass* klass).
2279 // The function returns a Klass* of the _scratch_class if the verifier
2280 // was invoked in the middle of the class redefinition.
2281 // Otherwise it returns its argument value which is the _the_class Klass*.
2282 // Please, refer to the description in the jvmtiThreadState.hpp.
2283
2284 JVM_ENTRY(jboolean, JVM_IsInterface(JNIEnv *env, jclass cls))
2285 oop mirror = JNIHandles::resolve_non_null(cls);
2286 if (java_lang_Class::is_primitive(mirror)) {
2287 return JNI_FALSE;
2288 }
2289 Klass* k = java_lang_Class::as_Klass(mirror);
2290 // This isn't necessary since answer is the same since redefinition
2291 // has already checked this matches for the scratch class.
2292 // k = JvmtiThreadState::class_to_verify_considering_redefinition(k, thread);
2293 jboolean result = k->is_interface();
2294 assert(!result || k->is_instance_klass(),
2295 "all interfaces are instance types");
2296 return result;
2297 JVM_END
2298
2299
2300 JVM_ENTRY(const char*, JVM_GetClassNameUTF(JNIEnv *env, jclass cls))
2301 Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(cls));
2302 k = JvmtiThreadState::class_to_verify_considering_redefinition(k, thread);
2303 return k->name()->as_utf8();
2304 JVM_END
2305
2306
2307 JVM_ENTRY(void, JVM_GetClassCPTypes(JNIEnv *env, jclass cls, unsigned char *types))
2308 Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(cls));
2309 k = JvmtiThreadState::class_to_verify_considering_redefinition(k, thread);
2310 // types will have length zero if this is not an InstanceKlass
2311 // (length is determined by call to JVM_GetClassCPEntriesCount)
2312 if (k->is_instance_klass()) {
2313 ConstantPool* cp = InstanceKlass::cast(k)->constants();
2314 for (int index = cp->length() - 1; index >= 0; index--) {
2315 constantTag tag = cp->tag_at(index);
2316 types[index] = (tag.is_unresolved_klass()) ? (unsigned char) JVM_CONSTANT_Class : tag.value();
2317 }
2318 }
2319 JVM_END
2320
2321
2322 JVM_ENTRY(jint, JVM_GetClassCPEntriesCount(JNIEnv *env, jclass cls))
2323 Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(cls));
2324 k = JvmtiThreadState::class_to_verify_considering_redefinition(k, thread);
2325 return (!k->is_instance_klass()) ? 0 : InstanceKlass::cast(k)->constants()->length();
2326 JVM_END
2327
2328
2329 JVM_ENTRY(jint, JVM_GetClassFieldsCount(JNIEnv *env, jclass cls))
2330 Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(cls));
2331 k = JvmtiThreadState::class_to_verify_considering_redefinition(k, thread);
2332 return (!k->is_instance_klass()) ? 0 : InstanceKlass::cast(k)->java_fields_count();
2333 JVM_END
2334
2335
2336 JVM_ENTRY(jint, JVM_GetClassMethodsCount(JNIEnv *env, jclass cls))
2337 Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(cls));
2338 k = JvmtiThreadState::class_to_verify_considering_redefinition(k, thread);
2339 return (!k->is_instance_klass()) ? 0 : InstanceKlass::cast(k)->methods()->length();
2340 JVM_END
2341
2342
2343 // The following methods, used for the verifier, are never called with
2344 // array klasses, so a direct cast to InstanceKlass is safe.
2345 // Typically, these methods are called in a loop with bounds determined
2346 // by the results of JVM_GetClass{Fields,Methods}Count, which return
2347 // zero for arrays.
2348 JVM_ENTRY(void, JVM_GetMethodIxExceptionIndexes(JNIEnv *env, jclass cls, jint method_index, unsigned short *exceptions))
2349 Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(cls));
2350 k = JvmtiThreadState::class_to_verify_considering_redefinition(k, thread);
2351 Method* method = InstanceKlass::cast(k)->methods()->at(method_index);
2352 int length = method->checked_exceptions_length();
2353 if (length > 0) {
2354 CheckedExceptionElement* table= method->checked_exceptions_start();
2355 for (int i = 0; i < length; i++) {
2356 exceptions[i] = table[i].class_cp_index;
2357 }
2358 }
2359 JVM_END
2360
2361
2362 JVM_ENTRY(jint, JVM_GetMethodIxExceptionsCount(JNIEnv *env, jclass cls, jint method_index))
2363 Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(cls));
2364 k = JvmtiThreadState::class_to_verify_considering_redefinition(k, thread);
2365 Method* method = InstanceKlass::cast(k)->methods()->at(method_index);
2366 return method->checked_exceptions_length();
2367 JVM_END
2368
2369
2370 JVM_ENTRY(void, JVM_GetMethodIxByteCode(JNIEnv *env, jclass cls, jint method_index, unsigned char *code))
2371 Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(cls));
2372 k = JvmtiThreadState::class_to_verify_considering_redefinition(k, thread);
2373 Method* method = InstanceKlass::cast(k)->methods()->at(method_index);
2374 memcpy(code, method->code_base(), method->code_size());
2375 JVM_END
2376
2377
2378 JVM_ENTRY(jint, JVM_GetMethodIxByteCodeLength(JNIEnv *env, jclass cls, jint method_index))
2379 Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(cls));
2380 k = JvmtiThreadState::class_to_verify_considering_redefinition(k, thread);
2381 Method* method = InstanceKlass::cast(k)->methods()->at(method_index);
2382 return method->code_size();
2383 JVM_END
2384
2385
2386 JVM_ENTRY(void, JVM_GetMethodIxExceptionTableEntry(JNIEnv *env, jclass cls, jint method_index, jint entry_index, JVM_ExceptionTableEntryType *entry))
2387 Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(cls));
2388 k = JvmtiThreadState::class_to_verify_considering_redefinition(k, thread);
2389 Method* method = InstanceKlass::cast(k)->methods()->at(method_index);
2390 ExceptionTable extable(method);
2391 entry->start_pc = extable.start_pc(entry_index);
2392 entry->end_pc = extable.end_pc(entry_index);
2393 entry->handler_pc = extable.handler_pc(entry_index);
2394 entry->catchType = extable.catch_type_index(entry_index);
2395 JVM_END
2396
2397
2398 JVM_ENTRY(jint, JVM_GetMethodIxExceptionTableLength(JNIEnv *env, jclass cls, int method_index))
2399 Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(cls));
2400 k = JvmtiThreadState::class_to_verify_considering_redefinition(k, thread);
2401 Method* method = InstanceKlass::cast(k)->methods()->at(method_index);
2402 return method->exception_table_length();
2403 JVM_END
2404
2405
2406 JVM_ENTRY(jint, JVM_GetMethodIxModifiers(JNIEnv *env, jclass cls, int method_index))
2407 Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(cls));
2408 k = JvmtiThreadState::class_to_verify_considering_redefinition(k, thread);
2409 Method* method = InstanceKlass::cast(k)->methods()->at(method_index);
2410 return method->access_flags().as_method_flags();
2411 JVM_END
2412
2413
2414 JVM_ENTRY(jint, JVM_GetFieldIxModifiers(JNIEnv *env, jclass cls, int field_index))
2415 Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(cls));
2416 k = JvmtiThreadState::class_to_verify_considering_redefinition(k, thread);
2417 return InstanceKlass::cast(k)->field_access_flags(field_index);
2418 JVM_END
2419
2420
2421 JVM_ENTRY(jint, JVM_GetMethodIxLocalsCount(JNIEnv *env, jclass cls, int method_index))
2422 Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(cls));
2423 k = JvmtiThreadState::class_to_verify_considering_redefinition(k, thread);
2424 Method* method = InstanceKlass::cast(k)->methods()->at(method_index);
2425 return method->max_locals();
2426 JVM_END
2427
2428
2429 JVM_ENTRY(jint, JVM_GetMethodIxArgsSize(JNIEnv *env, jclass cls, int method_index))
2430 Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(cls));
2431 k = JvmtiThreadState::class_to_verify_considering_redefinition(k, thread);
2432 Method* method = InstanceKlass::cast(k)->methods()->at(method_index);
2433 return method->size_of_parameters();
2434 JVM_END
2435
2436
2437 JVM_ENTRY(jint, JVM_GetMethodIxMaxStack(JNIEnv *env, jclass cls, int method_index))
2438 Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(cls));
2439 k = JvmtiThreadState::class_to_verify_considering_redefinition(k, thread);
2440 Method* method = InstanceKlass::cast(k)->methods()->at(method_index);
2441 return method->verifier_max_stack();
2442 JVM_END
2443
2444
2445 JVM_ENTRY(jboolean, JVM_IsConstructorIx(JNIEnv *env, jclass cls, int method_index))
2446 ResourceMark rm(THREAD);
2447 Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(cls));
2448 k = JvmtiThreadState::class_to_verify_considering_redefinition(k, thread);
2449 Method* method = InstanceKlass::cast(k)->methods()->at(method_index);
2450 return method->name() == vmSymbols::object_initializer_name();
2451 JVM_END
2452
2453
2454 JVM_ENTRY(jboolean, JVM_IsVMGeneratedMethodIx(JNIEnv *env, jclass cls, int method_index))
2455 ResourceMark rm(THREAD);
2456 Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(cls));
2457 k = JvmtiThreadState::class_to_verify_considering_redefinition(k, thread);
2458 Method* method = InstanceKlass::cast(k)->methods()->at(method_index);
2459 return method->is_overpass();
2460 JVM_END
2461
2462 JVM_ENTRY(const char*, JVM_GetMethodIxNameUTF(JNIEnv *env, jclass cls, jint method_index))
2463 Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(cls));
2464 k = JvmtiThreadState::class_to_verify_considering_redefinition(k, thread);
2465 Method* method = InstanceKlass::cast(k)->methods()->at(method_index);
2466 return method->name()->as_utf8();
2467 JVM_END
2468
2469
2470 JVM_ENTRY(const char*, JVM_GetMethodIxSignatureUTF(JNIEnv *env, jclass cls, jint method_index))
2471 Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(cls));
2472 k = JvmtiThreadState::class_to_verify_considering_redefinition(k, thread);
2473 Method* method = InstanceKlass::cast(k)->methods()->at(method_index);
2474 return method->signature()->as_utf8();
2475 JVM_END
2476
2477 /**
2478 * All of these JVM_GetCP-xxx methods are used by the old verifier to
2479 * read entries in the constant pool. Since the old verifier always
2480 * works on a copy of the code, it will not see any rewriting that
2481 * may possibly occur in the middle of verification. So it is important
2482 * that nothing it calls tries to use the cpCache instead of the raw
2483 * constant pool, so we must use cp->uncached_x methods when appropriate.
2484 */
2485 JVM_ENTRY(const char*, JVM_GetCPFieldNameUTF(JNIEnv *env, jclass cls, jint cp_index))
2486 Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(cls));
2487 k = JvmtiThreadState::class_to_verify_considering_redefinition(k, thread);
2488 ConstantPool* cp = InstanceKlass::cast(k)->constants();
2489 switch (cp->tag_at(cp_index).value()) {
2490 case JVM_CONSTANT_Fieldref:
2491 return cp->uncached_name_ref_at(cp_index)->as_utf8();
2492 default:
2493 fatal("JVM_GetCPFieldNameUTF: illegal constant");
2494 }
2495 ShouldNotReachHere();
2496 return nullptr;
2497 JVM_END
2498
2499
2500 JVM_ENTRY(const char*, JVM_GetCPMethodNameUTF(JNIEnv *env, jclass cls, jint cp_index))
2501 Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(cls));
2502 k = JvmtiThreadState::class_to_verify_considering_redefinition(k, thread);
2503 ConstantPool* cp = InstanceKlass::cast(k)->constants();
2504 switch (cp->tag_at(cp_index).value()) {
2505 case JVM_CONSTANT_InterfaceMethodref:
2506 case JVM_CONSTANT_Methodref:
2507 return cp->uncached_name_ref_at(cp_index)->as_utf8();
2508 default:
2509 fatal("JVM_GetCPMethodNameUTF: illegal constant");
2510 }
2511 ShouldNotReachHere();
2512 return nullptr;
2513 JVM_END
2514
2515
2516 JVM_ENTRY(const char*, JVM_GetCPMethodSignatureUTF(JNIEnv *env, jclass cls, jint cp_index))
2517 Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(cls));
2518 k = JvmtiThreadState::class_to_verify_considering_redefinition(k, thread);
2519 ConstantPool* cp = InstanceKlass::cast(k)->constants();
2520 switch (cp->tag_at(cp_index).value()) {
2521 case JVM_CONSTANT_InterfaceMethodref:
2522 case JVM_CONSTANT_Methodref:
2523 return cp->uncached_signature_ref_at(cp_index)->as_utf8();
2524 default:
2525 fatal("JVM_GetCPMethodSignatureUTF: illegal constant");
2526 }
2527 ShouldNotReachHere();
2528 return nullptr;
2529 JVM_END
2530
2531
2532 JVM_ENTRY(const char*, JVM_GetCPFieldSignatureUTF(JNIEnv *env, jclass cls, jint cp_index))
2533 Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(cls));
2534 k = JvmtiThreadState::class_to_verify_considering_redefinition(k, thread);
2535 ConstantPool* cp = InstanceKlass::cast(k)->constants();
2536 switch (cp->tag_at(cp_index).value()) {
2537 case JVM_CONSTANT_Fieldref:
2538 return cp->uncached_signature_ref_at(cp_index)->as_utf8();
2539 default:
2540 fatal("JVM_GetCPFieldSignatureUTF: illegal constant");
2541 }
2542 ShouldNotReachHere();
2543 return nullptr;
2544 JVM_END
2545
2546
2547 JVM_ENTRY(const char*, JVM_GetCPClassNameUTF(JNIEnv *env, jclass cls, jint cp_index))
2548 Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(cls));
2549 k = JvmtiThreadState::class_to_verify_considering_redefinition(k, thread);
2550 ConstantPool* cp = InstanceKlass::cast(k)->constants();
2551 Symbol* classname = cp->klass_name_at(cp_index);
2552 return classname->as_utf8();
2553 JVM_END
2554
2555
2556 JVM_ENTRY(const char*, JVM_GetCPFieldClassNameUTF(JNIEnv *env, jclass cls, jint cp_index))
2557 Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(cls));
2558 k = JvmtiThreadState::class_to_verify_considering_redefinition(k, thread);
2559 ConstantPool* cp = InstanceKlass::cast(k)->constants();
2560 switch (cp->tag_at(cp_index).value()) {
2561 case JVM_CONSTANT_Fieldref: {
2562 int class_index = cp->uncached_klass_ref_index_at(cp_index);
2563 Symbol* classname = cp->klass_name_at(class_index);
2564 return classname->as_utf8();
2565 }
2566 default:
2567 fatal("JVM_GetCPFieldClassNameUTF: illegal constant");
2568 }
2569 ShouldNotReachHere();
2570 return nullptr;
2571 JVM_END
2572
2573
2574 JVM_ENTRY(const char*, JVM_GetCPMethodClassNameUTF(JNIEnv *env, jclass cls, jint cp_index))
2575 Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(cls));
2576 k = JvmtiThreadState::class_to_verify_considering_redefinition(k, thread);
2577 ConstantPool* cp = InstanceKlass::cast(k)->constants();
2578 switch (cp->tag_at(cp_index).value()) {
2579 case JVM_CONSTANT_Methodref:
2580 case JVM_CONSTANT_InterfaceMethodref: {
2581 int class_index = cp->uncached_klass_ref_index_at(cp_index);
2582 Symbol* classname = cp->klass_name_at(class_index);
2583 return classname->as_utf8();
2584 }
2585 default:
2586 fatal("JVM_GetCPMethodClassNameUTF: illegal constant");
2587 }
2588 ShouldNotReachHere();
2589 return nullptr;
2590 JVM_END
2591
2592
2593 JVM_ENTRY(jint, JVM_GetCPFieldModifiers(JNIEnv *env, jclass cls, int cp_index, jclass called_cls))
2594 Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(cls));
2595 Klass* k_called = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(called_cls));
2596 k = JvmtiThreadState::class_to_verify_considering_redefinition(k, thread);
2597 k_called = JvmtiThreadState::class_to_verify_considering_redefinition(k_called, thread);
2598 ConstantPool* cp = InstanceKlass::cast(k)->constants();
2599 ConstantPool* cp_called = InstanceKlass::cast(k_called)->constants();
2600 switch (cp->tag_at(cp_index).value()) {
2601 case JVM_CONSTANT_Fieldref: {
2602 Symbol* name = cp->uncached_name_ref_at(cp_index);
2603 Symbol* signature = cp->uncached_signature_ref_at(cp_index);
2604 InstanceKlass* ik = InstanceKlass::cast(k_called);
2605 for (JavaFieldStream fs(ik); !fs.done(); fs.next()) {
2606 if (fs.name() == name && fs.signature() == signature) {
2607 return fs.access_flags().as_field_flags();
2608 }
2609 }
2610 return -1;
2611 }
2612 default:
2613 fatal("JVM_GetCPFieldModifiers: illegal constant");
2614 }
2615 ShouldNotReachHere();
2616 return 0;
2617 JVM_END
2618
2619
2620 JVM_ENTRY(jint, JVM_GetCPMethodModifiers(JNIEnv *env, jclass cls, int cp_index, jclass called_cls))
2621 Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(cls));
2622 Klass* k_called = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(called_cls));
2623 k = JvmtiThreadState::class_to_verify_considering_redefinition(k, thread);
2624 k_called = JvmtiThreadState::class_to_verify_considering_redefinition(k_called, thread);
2625 ConstantPool* cp = InstanceKlass::cast(k)->constants();
2626 switch (cp->tag_at(cp_index).value()) {
2627 case JVM_CONSTANT_Methodref:
2628 case JVM_CONSTANT_InterfaceMethodref: {
2629 Symbol* name = cp->uncached_name_ref_at(cp_index);
2630 Symbol* signature = cp->uncached_signature_ref_at(cp_index);
2631 Array<Method*>* methods = InstanceKlass::cast(k_called)->methods();
2632 int methods_count = methods->length();
2633 for (int i = 0; i < methods_count; i++) {
2634 Method* method = methods->at(i);
2635 if (method->name() == name && method->signature() == signature) {
2636 return method->access_flags().as_method_flags();
2637 }
2638 }
2639 return -1;
2640 }
2641 default:
2642 fatal("JVM_GetCPMethodModifiers: illegal constant");
2643 }
2644 ShouldNotReachHere();
2645 return 0;
2646 JVM_END
2647
2648
2649 // Misc //////////////////////////////////////////////////////////////////////////////////////////////
2650
2651 JVM_LEAF(void, JVM_ReleaseUTF(const char *utf))
2652 // So long as UTF8::convert_to_utf8 returns resource strings, we don't have to do anything
2653 JVM_END
2654
2655
2656 JVM_ENTRY(jboolean, JVM_IsSameClassPackage(JNIEnv *env, jclass class1, jclass class2))
2657 oop class1_mirror = JNIHandles::resolve_non_null(class1);
2658 oop class2_mirror = JNIHandles::resolve_non_null(class2);
2659 Klass* klass1 = java_lang_Class::as_Klass(class1_mirror);
2660 Klass* klass2 = java_lang_Class::as_Klass(class2_mirror);
2661 return (jboolean) Reflection::is_same_class_package(klass1, klass2);
2662 JVM_END
2663
2664 // Printing support //////////////////////////////////////////////////
2665 extern "C" {
2666
2667 ATTRIBUTE_PRINTF(3, 0)
2668 int jio_vsnprintf(char *str, size_t count, const char *fmt, va_list args) {
2669 // Reject count values that are negative signed values converted to
2670 // unsigned; see bug 4399518, 4417214
2671 if ((intptr_t)count <= 0) return -1;
2672
2673 int result = os::vsnprintf(str, count, fmt, args);
2674 if (result > 0 && (size_t)result >= count) {
2675 result = -1;
2676 }
2735 // In most of the JVM thread support functions we need to access the
2736 // thread through a ThreadsListHandle to prevent it from exiting and
2737 // being reclaimed while we try to operate on it. The exceptions to this
2738 // rule are when operating on the current thread, or if the monitor of
2739 // the target java.lang.Thread is locked at the Java level - in both
2740 // cases the target cannot exit.
2741
2742 static void thread_entry(JavaThread* thread, TRAPS) {
2743 HandleMark hm(THREAD);
2744 Handle obj(THREAD, thread->threadObj());
2745 JavaValue result(T_VOID);
2746 JavaCalls::call_virtual(&result,
2747 obj,
2748 vmClasses::Thread_klass(),
2749 vmSymbols::run_method_name(),
2750 vmSymbols::void_method_signature(),
2751 THREAD);
2752 }
2753
2754
2755 JVM_ENTRY(void, JVM_StartThread(JNIEnv* env, jobject jthread))
2756 #if INCLUDE_CDS
2757 if (CDSConfig::allow_only_single_java_thread()) {
2758 // During java -Xshare:dump, if we allow multiple Java threads to
2759 // execute in parallel, symbols and classes may be loaded in
2760 // random orders which will make the resulting CDS archive
2761 // non-deterministic.
2762 //
2763 // Lucikly, during java -Xshare:dump, it's important to run only
2764 // the code in the main Java thread (which is NOT started here) that
2765 // creates the module graph, etc. It's safe to not start the other
2766 // threads which are launched by class static initializers
2767 // (ReferenceHandler, FinalizerThread and CleanerImpl).
2768 if (log_is_enabled(Info, cds)) {
2769 ResourceMark rm;
2770 oop t = JNIHandles::resolve_non_null(jthread);
2771 log_info(cds)("JVM_StartThread() ignored: %s", t->klass()->external_name());
2772 }
2773 return;
2774 }
2775 #endif
2832 log_warning(os, thread)("Failed to start the native thread for java.lang.Thread \"%s\"",
2833 JavaThread::name_for(JNIHandles::resolve_non_null(jthread)));
2834 // No one should hold a reference to the 'native_thread'.
2835 native_thread->smr_delete();
2836 if (JvmtiExport::should_post_resource_exhausted()) {
2837 JvmtiExport::post_resource_exhausted(
2838 JVMTI_RESOURCE_EXHAUSTED_OOM_ERROR | JVMTI_RESOURCE_EXHAUSTED_THREADS,
2839 os::native_thread_creation_failed_msg());
2840 }
2841 THROW_MSG(vmSymbols::java_lang_OutOfMemoryError(),
2842 os::native_thread_creation_failed_msg());
2843 }
2844
2845 JFR_ONLY(Jfr::on_java_thread_start(thread, native_thread);)
2846
2847 Thread::start(native_thread);
2848
2849 JVM_END
2850
2851
2852 JVM_ENTRY(void, JVM_SetThreadPriority(JNIEnv* env, jobject jthread, jint prio))
2853 ThreadsListHandle tlh(thread);
2854 oop java_thread = nullptr;
2855 JavaThread* receiver = nullptr;
2856 bool is_alive = tlh.cv_internal_thread_to_JavaThread(jthread, &receiver, &java_thread);
2857 java_lang_Thread::set_priority(java_thread, (ThreadPriority)prio);
2858
2859 if (is_alive) {
2860 // jthread refers to a live JavaThread.
2861 Thread::set_priority(receiver, (ThreadPriority)prio);
2862 }
2863 // Implied else: If the JavaThread hasn't started yet, then the
2864 // priority set in the java.lang.Thread object above will be pushed
2865 // down when it does start.
2866 JVM_END
2867
2868
2869 JVM_LEAF(void, JVM_Yield(JNIEnv *env, jclass threadClass))
2870 HOTSPOT_THREAD_YIELD();
2871 os::naked_yield();
2872 JVM_END
2873
2874 JVM_ENTRY(void, JVM_SleepNanos(JNIEnv* env, jclass threadClass, jlong nanos))
2875 if (nanos < 0) {
2876 THROW_MSG(vmSymbols::java_lang_IllegalArgumentException(), "nanosecond timeout value out of range");
2877 }
2878
2879 if (thread->is_interrupted(true) && !HAS_PENDING_EXCEPTION) {
2880 THROW_MSG(vmSymbols::java_lang_InterruptedException(), "sleep interrupted");
2881 }
2882
2883 // Save current thread state and restore it at the end of this block.
2884 // And set new thread state to SLEEPING.
2885 JavaThreadSleepState jtss(thread);
2886
2887 HOTSPOT_THREAD_SLEEP_BEGIN(nanos / NANOSECS_PER_MILLISEC);
2888
2889 if (nanos == 0) {
2890 os::naked_yield();
2891 } else {
2892 ThreadState old_state = thread->osthread()->get_state();
2893 thread->osthread()->set_state(SLEEPING);
2894 if (!thread->sleep_nanos(nanos)) { // interrupted
2895 // An asynchronous exception could have been thrown on
2896 // us while we were sleeping. We do not overwrite those.
2897 if (!HAS_PENDING_EXCEPTION) {
2898 HOTSPOT_THREAD_SLEEP_END(1);
2899
2900 // TODO-FIXME: THROW_MSG returns which means we will not call set_state()
2901 // to properly restore the thread state. That's likely wrong.
2902 THROW_MSG(vmSymbols::java_lang_InterruptedException(), "sleep interrupted");
2903 }
2904 }
2905 thread->osthread()->set_state(old_state);
2906 }
2907 HOTSPOT_THREAD_SLEEP_END(0);
2908 JVM_END
2909
2910 JVM_ENTRY(jobject, JVM_CurrentCarrierThread(JNIEnv* env, jclass threadClass))
2911 oop jthread = thread->threadObj();
2912 assert(jthread != nullptr, "no current carrier thread!");
2913 return JNIHandles::make_local(THREAD, jthread);
2914 JVM_END
2915
2916 JVM_ENTRY(jobject, JVM_CurrentThread(JNIEnv* env, jclass threadClass))
2917 oop theThread = thread->vthread();
2918 assert(theThread != (oop)nullptr, "no current thread!");
2919 return JNIHandles::make_local(THREAD, theThread);
2920 JVM_END
2921
2922 JVM_ENTRY(void, JVM_SetCurrentThread(JNIEnv* env, jobject thisThread,
2923 jobject theThread))
2924 oop threadObj = JNIHandles::resolve(theThread);
2925 thread->set_vthread(threadObj);
2926
2927 // Set _monitor_owner_id of new current Thread
2928 thread->set_monitor_owner_id(java_lang_Thread::thread_id(threadObj));
2929
2930 JFR_ONLY(Jfr::on_set_current_thread(thread, threadObj);)
2931 JVM_END
2932
2933 JVM_ENTRY(jlong, JVM_GetNextThreadIdOffset(JNIEnv* env, jclass threadClass))
2934 return ThreadIdentifier::unsafe_offset();
2935 JVM_END
2936
2937 JVM_ENTRY(void, JVM_Interrupt(JNIEnv* env, jobject jthread))
2938 ThreadsListHandle tlh(thread);
2939 JavaThread* receiver = nullptr;
2940 bool is_alive = tlh.cv_internal_thread_to_JavaThread(jthread, &receiver, nullptr);
2941 if (is_alive) {
2942 // jthread refers to a live JavaThread.
2943 receiver->interrupt();
2944 }
2945 JVM_END
2946
2947 // Return true iff the current thread has locked the object passed in
2948
2949 JVM_ENTRY(jboolean, JVM_HoldsLock(JNIEnv* env, jclass threadClass, jobject obj))
2950 if (obj == nullptr) {
2951 THROW_(vmSymbols::java_lang_NullPointerException(), JNI_FALSE);
2952 }
2953 Handle h_obj(THREAD, JNIHandles::resolve(obj));
2954 return ObjectSynchronizer::current_thread_holds_lock(thread, h_obj);
2955 JVM_END
2956
2957 JVM_ENTRY(jobject, JVM_GetStackTrace(JNIEnv *env, jobject jthread))
2958 oop trace = java_lang_Thread::async_get_stack_trace(JNIHandles::resolve(jthread), THREAD);
2959 return JNIHandles::make_local(THREAD, trace);
2960 JVM_END
2961
2962 JVM_ENTRY(void, JVM_SetNativeThreadName(JNIEnv* env, jobject jthread, jstring name))
2963 // We don't use a ThreadsListHandle here because the current thread
2964 // must be alive.
2965 oop java_thread = JNIHandles::resolve_non_null(jthread);
2966 JavaThread* thr = java_lang_Thread::thread(java_thread);
2967 if (thread == thr && !thr->has_attached_via_jni()) {
2968 // Thread naming is only supported for the current thread and
2969 // we don't set the name of an attached thread to avoid stepping
2970 // on other programs.
2971 ResourceMark rm(thread);
2972 const char *thread_name = java_lang_String::as_utf8_string(JNIHandles::resolve_non_null(name));
2973 os::set_native_thread_name(thread_name);
2974 }
2975 JVM_END
2976
2977 JVM_ENTRY(jobject, JVM_ScopedValueCache(JNIEnv* env, jclass threadClass))
2978 oop theCache = thread->scopedValueCache();
2979 return JNIHandles::make_local(THREAD, theCache);
2980 JVM_END
2981
2982 JVM_ENTRY(void, JVM_SetScopedValueCache(JNIEnv* env, jclass threadClass,
2983 jobject theCache))
2984 arrayOop objs = arrayOop(JNIHandles::resolve(theCache));
2985 thread->set_scopedValueCache(objs);
2986 JVM_END
2987
2988
2989 // java.lang.Package ////////////////////////////////////////////////////////////////
2990
2991
2992 JVM_ENTRY(jstring, JVM_GetSystemPackage(JNIEnv *env, jstring name))
2993 ResourceMark rm(THREAD);
2994 JvmtiVMObjectAllocEventCollector oam;
2995 char* str = java_lang_String::as_utf8_string(JNIHandles::resolve_non_null(name));
2996 oop result = ClassLoader::get_system_package(str, CHECK_NULL);
2997 return (jstring) JNIHandles::make_local(THREAD, result);
2998 JVM_END
2999
3000
3001 JVM_ENTRY(jobjectArray, JVM_GetSystemPackages(JNIEnv *env))
3002 JvmtiVMObjectAllocEventCollector oam;
3003 objArrayOop result = ClassLoader::get_system_packages(CHECK_NULL);
3004 return (jobjectArray) JNIHandles::make_local(THREAD, result);
3005 JVM_END
3006
3007
3008 // java.lang.ref.Reference ///////////////////////////////////////////////////////////////
3009
3010
3011 JVM_ENTRY(jobject, JVM_GetAndClearReferencePendingList(JNIEnv* env))
3012 MonitorLocker ml(Heap_lock);
3013 oop ref = Universe::reference_pending_list();
3014 if (ref != nullptr) {
3015 Universe::clear_reference_pending_list();
3016 }
3017 return JNIHandles::make_local(THREAD, ref);
3018 JVM_END
3019
3020 JVM_ENTRY(jboolean, JVM_HasReferencePendingList(JNIEnv* env))
3021 MonitorLocker ml(Heap_lock);
3022 return Universe::has_reference_pending_list();
3023 JVM_END
3024
3025 JVM_ENTRY(void, JVM_WaitForReferencePendingList(JNIEnv* env))
3026 MonitorLocker ml(Heap_lock);
3027 while (!Universe::has_reference_pending_list()) {
3028 ml.wait();
3029 }
3030 JVM_END
3031
3032 JVM_ENTRY(jboolean, JVM_ReferenceRefersTo(JNIEnv* env, jobject ref, jobject o))
3033 oop ref_oop = JNIHandles::resolve_non_null(ref);
3034 // PhantomReference has it's own implementation of refersTo().
3035 // See: JVM_PhantomReferenceRefersTo
3036 assert(!java_lang_ref_Reference::is_phantom(ref_oop), "precondition");
3037 oop referent = java_lang_ref_Reference::weak_referent_no_keepalive(ref_oop);
3038 return referent == JNIHandles::resolve(o);
3039 JVM_END
3040
3041 JVM_ENTRY(void, JVM_ReferenceClear(JNIEnv* env, jobject ref))
3042 oop ref_oop = JNIHandles::resolve_non_null(ref);
3043 // FinalReference has it's own implementation of clear().
3044 assert(!java_lang_ref_Reference::is_final(ref_oop), "precondition");
3045 if (java_lang_ref_Reference::unknown_referent_no_keepalive(ref_oop) == nullptr) {
3046 // If the referent has already been cleared then done.
3047 // However, if the referent is dead but has not yet been cleared by
3048 // concurrent reference processing, it should NOT be cleared here.
3049 // Instead, clearing should be left to the GC. Clearing it here could
3050 // detectably lose an expected notification, which is impossible with
3051 // STW reference processing. The clearing in enqueue() doesn't have
3052 // this problem, since the enqueue covers the notification, but it's not
3053 // worth the effort to handle that case specially.
3054 return;
3055 }
3056 java_lang_ref_Reference::clear_referent(ref_oop);
3057 JVM_END
3058
3059
3060 // java.lang.ref.PhantomReference //////////////////////////////////////////////////
3061
3062
3063 JVM_ENTRY(jboolean, JVM_PhantomReferenceRefersTo(JNIEnv* env, jobject ref, jobject o))
3064 oop ref_oop = JNIHandles::resolve_non_null(ref);
3065 oop referent = java_lang_ref_Reference::phantom_referent_no_keepalive(ref_oop);
3066 return referent == JNIHandles::resolve(o);
3067 JVM_END
3068
3069
3070 // ObjectInputStream ///////////////////////////////////////////////////////////////
3071
3072 // Return the first user-defined class loader up the execution stack, or null
3073 // if only code from the bootstrap or platform class loader is on the stack.
3074
3075 JVM_ENTRY(jobject, JVM_LatestUserDefinedLoader(JNIEnv *env))
3076 for (vframeStream vfst(thread); !vfst.at_end(); vfst.next()) {
3077 InstanceKlass* ik = vfst.method()->method_holder();
3078 oop loader = ik->class_loader();
3079 if (loader != nullptr && !SystemDictionary::is_platform_class_loader(loader)) {
3080 return JNIHandles::make_local(THREAD, loader);
3081 }
3082 }
3083 return nullptr;
3084 JVM_END
3085
3086
3087 // Array ///////////////////////////////////////////////////////////////////////////////////////////
3088
3089
3090 // resolve array handle and check arguments
3091 static inline arrayOop check_array(JNIEnv *env, jobject arr, bool type_array_only, TRAPS) {
3092 if (arr == nullptr) {
3093 THROW_NULL(vmSymbols::java_lang_NullPointerException());
3094 }
3095 oop a = JNIHandles::resolve_non_null(arr);
3096 if (!a->is_array()) {
3097 THROW_MSG_NULL(vmSymbols::java_lang_IllegalArgumentException(), "Argument is not an array");
3098 } else if (type_array_only && !a->is_typeArray()) {
3099 THROW_MSG_NULL(vmSymbols::java_lang_IllegalArgumentException(), "Argument is not an array of primitive type");
3100 }
3101 return arrayOop(a);
3102 }
3103
3104
3105 JVM_ENTRY(jint, JVM_GetArrayLength(JNIEnv *env, jobject arr))
3106 arrayOop a = check_array(env, arr, false, CHECK_0);
3107 return a->length();
3108 JVM_END
3109
3110
3111 JVM_ENTRY(jobject, JVM_GetArrayElement(JNIEnv *env, jobject arr, jint index))
3112 JvmtiVMObjectAllocEventCollector oam;
3113 arrayOop a = check_array(env, arr, false, CHECK_NULL);
3114 jvalue value;
3115 BasicType type = Reflection::array_get(&value, a, index, CHECK_NULL);
3116 oop box = Reflection::box(&value, type, CHECK_NULL);
3117 return JNIHandles::make_local(THREAD, box);
3118 JVM_END
3119
3120
3121 JVM_ENTRY(jvalue, JVM_GetPrimitiveArrayElement(JNIEnv *env, jobject arr, jint index, jint wCode))
3122 jvalue value;
3123 value.i = 0; // to initialize value before getting used in CHECK
3124 arrayOop a = check_array(env, arr, true, CHECK_(value));
3125 assert(a->is_typeArray(), "just checking");
3126 BasicType type = Reflection::array_get(&value, a, index, CHECK_(value));
3127 BasicType wide_type = (BasicType) wCode;
3128 if (type != wide_type) {
3129 Reflection::widen(&value, type, wide_type, CHECK_(value));
3130 }
3131 return value;
3132 JVM_END
3133
3134
3135 JVM_ENTRY(void, JVM_SetArrayElement(JNIEnv *env, jobject arr, jint index, jobject val))
3136 arrayOop a = check_array(env, arr, false, CHECK);
3137 oop box = JNIHandles::resolve(val);
3138 jvalue value;
3139 value.i = 0; // to initialize value before getting used in CHECK
3140 BasicType value_type;
3141 if (a->is_objArray()) {
3142 // Make sure we do no unbox e.g. java/lang/Integer instances when storing into an object array
3143 value_type = Reflection::unbox_for_regular_object(box, &value);
3144 } else {
3145 value_type = Reflection::unbox_for_primitive(box, &value, CHECK);
3146 }
3147 Reflection::array_set(&value, a, index, value_type, CHECK);
3148 JVM_END
3149
3150
3151 JVM_ENTRY(void, JVM_SetPrimitiveArrayElement(JNIEnv *env, jobject arr, jint index, jvalue v, unsigned char vCode))
3152 arrayOop a = check_array(env, arr, true, CHECK);
3153 assert(a->is_typeArray(), "just checking");
3154 BasicType value_type = (BasicType) vCode;
3155 Reflection::array_set(&v, a, index, value_type, CHECK);
3156 JVM_END
3157
3158
3159 JVM_ENTRY(jobject, JVM_NewArray(JNIEnv *env, jclass eltClass, jint length))
3160 JvmtiVMObjectAllocEventCollector oam;
3161 oop element_mirror = JNIHandles::resolve(eltClass);
3162 oop result = Reflection::reflect_new_array(element_mirror, length, CHECK_NULL);
3163 return JNIHandles::make_local(THREAD, result);
3164 JVM_END
3165
3166
3167 JVM_ENTRY(jobject, JVM_NewMultiArray(JNIEnv *env, jclass eltClass, jintArray dim))
3168 JvmtiVMObjectAllocEventCollector oam;
3169 arrayOop dim_array = check_array(env, dim, true, CHECK_NULL);
3170 oop element_mirror = JNIHandles::resolve(eltClass);
3171 assert(dim_array->is_typeArray(), "just checking");
3172 oop result = Reflection::reflect_new_multi_array(element_mirror, typeArrayOop(dim_array), CHECK_NULL);
3173 return JNIHandles::make_local(THREAD, result);
3174 JVM_END
3175
3176
3177 // Library support ///////////////////////////////////////////////////////////////////////////
3178
3179 JVM_LEAF(void*, JVM_LoadZipLibrary())
3180 return ZipLibrary::handle();
3181 JVM_END
3182
3183 JVM_ENTRY_NO_ENV(void*, JVM_LoadLibrary(const char* name, jboolean throwException))
3184 //%note jvm_ct
3185 char ebuf[1024];
3186 void *load_result;
3187 {
3188 ThreadToNativeFromVM ttnfvm(thread);
3189 load_result = os::dll_load(name, ebuf, sizeof ebuf);
3190 }
3191 if (load_result == nullptr) {
3192 if (throwException) {
3193 char msg[1024];
3194 jio_snprintf(msg, sizeof msg, "%s: %s", name, ebuf);
3195 // Since 'ebuf' may contain a string encoded using
3196 // platform encoding scheme, we need to pass
3197 // Exceptions::unsafe_to_utf8 to the new_exception method
3198 // as the last argument. See bug 6367357.
3199 Handle h_exception =
3200 Exceptions::new_exception(thread,
3201 vmSymbols::java_lang_UnsatisfiedLinkError(),
3202 msg, Exceptions::unsafe_to_utf8);
3203
3204 THROW_HANDLE_NULL(h_exception);
3205 } else {
3206 log_info(library)("Failed to load library %s", name);
3207 return load_result;
3208 }
3209 }
3210 log_info(library)("Loaded library %s, handle " INTPTR_FORMAT, name, p2i(load_result));
3211 return load_result;
3212 JVM_END
3213
3214
3215 JVM_LEAF(void, JVM_UnloadLibrary(void* handle))
3216 os::dll_unload(handle);
3217 log_info(library)("Unloaded library with handle " INTPTR_FORMAT, p2i(handle));
3218 JVM_END
3219
3220
3221 JVM_LEAF(void*, JVM_FindLibraryEntry(void* handle, const char* name))
3222 void* find_result = os::dll_lookup(handle, name);
3223 log_info(library)("%s %s in library with handle " INTPTR_FORMAT,
3224 find_result != nullptr ? "Found" : "Failed to find",
3225 name, p2i(handle));
3226 return find_result;
3227 JVM_END
3228
3229
3230 // JNI version ///////////////////////////////////////////////////////////////////////////////
3231
3232 JVM_LEAF(jboolean, JVM_IsSupportedJNIVersion(jint version))
3233 return Threads::is_supported_jni_version_including_1_1(version);
3234 JVM_END
3235
3236
3237 JVM_LEAF(jboolean, JVM_IsPreviewEnabled(void))
3238 return Arguments::enable_preview() ? JNI_TRUE : JNI_FALSE;
3239 JVM_END
3240
3241 JVM_LEAF(jboolean, JVM_IsContinuationsSupported(void))
3242 return VMContinuations ? JNI_TRUE : JNI_FALSE;
3243 JVM_END
3244
3245 JVM_LEAF(jboolean, JVM_IsForeignLinkerSupported(void))
3246 return ForeignGlobals::is_foreign_linker_supported() ? JNI_TRUE : JNI_FALSE;
3247 JVM_END
3248
3249 JVM_LEAF(jboolean, JVM_IsStaticallyLinked(void))
3250 return is_vm_statically_linked() ? JNI_TRUE : JNI_FALSE;
3251 JVM_END
3252
3253 // String support ///////////////////////////////////////////////////////////////////////////
3254
3255 JVM_ENTRY(jstring, JVM_InternString(JNIEnv *env, jstring str))
3256 JvmtiVMObjectAllocEventCollector oam;
3257 if (str == nullptr) return nullptr;
3258 oop string = JNIHandles::resolve_non_null(str);
3259 oop result = StringTable::intern(string, CHECK_NULL);
3260 return (jstring) JNIHandles::make_local(THREAD, result);
3261 JVM_END
3262
3263
3264 // VM Raw monitor support //////////////////////////////////////////////////////////////////////
3265
3266 // VM Raw monitors (not to be confused with JvmtiRawMonitors) are a simple mutual exclusion
3267 // lock (not actually monitors: no wait/notify) that is exported by the VM for use by JDK
3268 // library code. They may be used by JavaThreads and non-JavaThreads and do not participate
3269 // in the safepoint protocol, thread suspension, thread interruption, or most things of that
3270 // nature, except JavaThreads will be blocked by VM_Exit::block_if_vm_exited if the VM has
3271 // shutdown. JavaThreads will be "in native" when using this API from JDK code.
3272
3273
3274 JNIEXPORT void* JNICALL JVM_RawMonitorCreate(void) {
3275 VM_Exit::block_if_vm_exited();
3295 ((PlatformMutex*) mon)->unlock();
3296 }
3297
3298
3299 // Shared JNI/JVM entry points //////////////////////////////////////////////////////////////
3300
3301 jclass find_class_from_class_loader(JNIEnv* env, Symbol* name, jboolean init,
3302 Handle loader, jboolean throwError, TRAPS) {
3303 Klass* klass = SystemDictionary::resolve_or_fail(name, loader, throwError != 0, CHECK_NULL);
3304
3305 // Check if we should initialize the class
3306 if (init && klass->is_instance_klass()) {
3307 klass->initialize(CHECK_NULL);
3308 }
3309 return (jclass) JNIHandles::make_local(THREAD, klass->java_mirror());
3310 }
3311
3312
3313 // Method ///////////////////////////////////////////////////////////////////////////////////////////
3314
3315 JVM_ENTRY(jobject, JVM_InvokeMethod(JNIEnv *env, jobject method, jobject obj, jobjectArray args0))
3316 Handle method_handle;
3317 if (thread->stack_overflow_state()->stack_available((address) &method_handle) >= JVMInvokeMethodSlack) {
3318 method_handle = Handle(THREAD, JNIHandles::resolve(method));
3319 Handle receiver(THREAD, JNIHandles::resolve(obj));
3320 objArrayHandle args(THREAD, objArrayOop(JNIHandles::resolve(args0)));
3321 oop result = Reflection::invoke_method(method_handle(), receiver, args, CHECK_NULL);
3322 jobject res = JNIHandles::make_local(THREAD, result);
3323 if (JvmtiExport::should_post_vm_object_alloc()) {
3324 oop ret_type = java_lang_reflect_Method::return_type(method_handle());
3325 assert(ret_type != nullptr, "sanity check: ret_type oop must not be null!");
3326 if (java_lang_Class::is_primitive(ret_type)) {
3327 // Only for primitive type vm allocates memory for java object.
3328 // See box() method.
3329 JvmtiExport::post_vm_object_alloc(thread, result);
3330 }
3331 }
3332 return res;
3333 } else {
3334 THROW_NULL(vmSymbols::java_lang_StackOverflowError());
3335 }
3336 JVM_END
3337
3338
3339 JVM_ENTRY(jobject, JVM_NewInstanceFromConstructor(JNIEnv *env, jobject c, jobjectArray args0))
3340 oop constructor_mirror = JNIHandles::resolve(c);
3341 objArrayHandle args(THREAD, objArrayOop(JNIHandles::resolve(args0)));
3342 oop result = Reflection::invoke_constructor(constructor_mirror, args, CHECK_NULL);
3343 jobject res = JNIHandles::make_local(THREAD, result);
3344 if (JvmtiExport::should_post_vm_object_alloc()) {
3345 JvmtiExport::post_vm_object_alloc(thread, result);
3346 }
3347 return res;
3348 JVM_END
3349
3350 JVM_ENTRY(void, JVM_InitializeFromArchive(JNIEnv* env, jclass cls))
3351 Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve(cls));
3352 assert(k->is_klass(), "just checking");
3353 HeapShared::initialize_from_archived_subgraph(THREAD, k);
3354 JVM_END
3355
3356 JVM_ENTRY(void, JVM_RegisterLambdaProxyClassForArchiving(JNIEnv* env,
3357 jclass caller,
3358 jstring interfaceMethodName,
3359 jobject factoryType,
3360 jobject interfaceMethodType,
3361 jobject implementationMember,
3362 jobject dynamicMethodType,
3363 jclass lambdaProxyClass))
3364 #if INCLUDE_CDS
3365 if (!CDSConfig::is_dumping_archive()) {
3366 return;
3367 }
3368
3369 Klass* caller_k = java_lang_Class::as_Klass(JNIHandles::resolve(caller));
3370 InstanceKlass* caller_ik = InstanceKlass::cast(caller_k);
3371 if (caller_ik->is_hidden()) {
3372 // Hidden classes not of type lambda proxy classes are currently not being archived.
3373 // If the caller_ik is of one of the above types, the corresponding lambda proxy class won't be
3374 // registered for archiving.
3375 return;
3376 }
3384 interface_method_name = java_lang_String::as_symbol(JNIHandles::resolve_non_null(interfaceMethodName));
3385 }
3386 Handle factory_type_oop(THREAD, JNIHandles::resolve_non_null(factoryType));
3387 Symbol* factory_type = java_lang_invoke_MethodType::as_signature(factory_type_oop(), true);
3388
3389 Handle interface_method_type_oop(THREAD, JNIHandles::resolve_non_null(interfaceMethodType));
3390 Symbol* interface_method_type = java_lang_invoke_MethodType::as_signature(interface_method_type_oop(), true);
3391
3392 Handle implementation_member_oop(THREAD, JNIHandles::resolve_non_null(implementationMember));
3393 assert(java_lang_invoke_MemberName::is_method(implementation_member_oop()), "must be");
3394 Method* m = java_lang_invoke_MemberName::vmtarget(implementation_member_oop());
3395
3396 Handle dynamic_method_type_oop(THREAD, JNIHandles::resolve_non_null(dynamicMethodType));
3397 Symbol* dynamic_method_type = java_lang_invoke_MethodType::as_signature(dynamic_method_type_oop(), true);
3398
3399 SystemDictionaryShared::add_lambda_proxy_class(caller_ik, lambda_ik, interface_method_name, factory_type,
3400 interface_method_type, m, dynamic_method_type, THREAD);
3401 #endif // INCLUDE_CDS
3402 JVM_END
3403
3404 JVM_ENTRY(jclass, JVM_LookupLambdaProxyClassFromArchive(JNIEnv* env,
3405 jclass caller,
3406 jstring interfaceMethodName,
3407 jobject factoryType,
3408 jobject interfaceMethodType,
3409 jobject implementationMember,
3410 jobject dynamicMethodType))
3411 #if INCLUDE_CDS
3412
3413 if (interfaceMethodName == nullptr || factoryType == nullptr || interfaceMethodType == nullptr ||
3414 implementationMember == nullptr || dynamicMethodType == nullptr) {
3415 THROW_(vmSymbols::java_lang_NullPointerException(), nullptr);
3416 }
3417
3418 Klass* caller_k = java_lang_Class::as_Klass(JNIHandles::resolve(caller));
3419 InstanceKlass* caller_ik = InstanceKlass::cast(caller_k);
3420 if (!caller_ik->is_shared()) {
3421 // there won't be a shared lambda class if the caller_ik is not in the shared archive.
3422 return nullptr;
3423 }
3424
3432 Handle implementation_member_oop(THREAD, JNIHandles::resolve_non_null(implementationMember));
3433 assert(java_lang_invoke_MemberName::is_method(implementation_member_oop()), "must be");
3434 Method* m = java_lang_invoke_MemberName::vmtarget(implementation_member_oop());
3435
3436 Handle dynamic_method_type_oop(THREAD, JNIHandles::resolve_non_null(dynamicMethodType));
3437 Symbol* dynamic_method_type = java_lang_invoke_MethodType::as_signature(dynamic_method_type_oop(), true);
3438
3439 InstanceKlass* lambda_ik = SystemDictionaryShared::get_shared_lambda_proxy_class(caller_ik, interface_method_name, factory_type,
3440 interface_method_type, m, dynamic_method_type);
3441 jclass jcls = nullptr;
3442 if (lambda_ik != nullptr) {
3443 InstanceKlass* loaded_lambda = SystemDictionaryShared::prepare_shared_lambda_proxy_class(lambda_ik, caller_ik, THREAD);
3444 jcls = loaded_lambda == nullptr ? nullptr : (jclass) JNIHandles::make_local(THREAD, loaded_lambda->java_mirror());
3445 }
3446 return jcls;
3447 #else
3448 return nullptr;
3449 #endif // INCLUDE_CDS
3450 JVM_END
3451
3452 JVM_ENTRY_NO_ENV(jlong, JVM_GetRandomSeedForDumping())
3453 if (CDSConfig::is_dumping_static_archive()) {
3454 // We do this so that the default CDS archive can be deterministic.
3455 const char* release = VM_Version::vm_release();
3456 const char* dbg_level = VM_Version::jdk_debug_level();
3457 const char* version = VM_Version::internal_vm_info_string();
3458 jlong seed = (jlong)(java_lang_String::hash_code((const jbyte*)release, (int)strlen(release)) ^
3459 java_lang_String::hash_code((const jbyte*)dbg_level, (int)strlen(dbg_level)) ^
3460 java_lang_String::hash_code((const jbyte*)version, (int)strlen(version)));
3461 seed += (jlong)VM_Version::vm_major_version();
3462 seed += (jlong)VM_Version::vm_minor_version();
3463 seed += (jlong)VM_Version::vm_security_version();
3464 seed += (jlong)VM_Version::vm_patch_version();
3465 if (seed == 0) { // don't let this ever be zero.
3466 seed = 0x87654321;
3467 }
3468 log_debug(cds)("JVM_GetRandomSeedForDumping() = " JLONG_FORMAT, seed);
3469 return seed;
3470 } else {
3471 return 0;
3472 }
3473 JVM_END
3474
3475 JVM_ENTRY_NO_ENV(jint, JVM_GetCDSConfigStatus())
3476 return CDSConfig::get_status();
3477 JVM_END
3478
3479 JVM_ENTRY(void, JVM_LogLambdaFormInvoker(JNIEnv *env, jstring line))
3480 #if INCLUDE_CDS
3481 assert(CDSConfig::is_logging_lambda_form_invokers(), "sanity");
3482 if (line != nullptr) {
3483 ResourceMark rm(THREAD);
3484 Handle h_line (THREAD, JNIHandles::resolve_non_null(line));
3485 char* c_line = java_lang_String::as_utf8_string(h_line());
3486 if (CDSConfig::is_dumping_dynamic_archive()) {
3487 // Note: LambdaFormInvokers::append take same format which is not
3488 // same as below the print format. The line does not include LAMBDA_FORM_TAG.
3489 LambdaFormInvokers::append(os::strdup((const char*)c_line, mtInternal));
3490 }
3491 if (ClassListWriter::is_enabled()) {
3492 ClassListWriter w;
3493 w.stream()->print_cr("%s %s", ClassListParser::lambda_form_tag(), c_line);
3494 }
3495 }
3496 #endif // INCLUDE_CDS
3497 JVM_END
3498
3499 JVM_ENTRY(void, JVM_DumpClassListToFile(JNIEnv *env, jstring listFileName))
3500 #if INCLUDE_CDS
3501 ResourceMark rm(THREAD);
3502 Handle file_handle(THREAD, JNIHandles::resolve_non_null(listFileName));
3503 char* file_name = java_lang_String::as_utf8_string(file_handle());
3504 MetaspaceShared::dump_loaded_classes(file_name, THREAD);
3505 #endif // INCLUDE_CDS
3506 JVM_END
3507
3508 JVM_ENTRY(void, JVM_DumpDynamicArchive(JNIEnv *env, jstring archiveName))
3509 #if INCLUDE_CDS
3510 ResourceMark rm(THREAD);
3511 Handle file_handle(THREAD, JNIHandles::resolve_non_null(archiveName));
3512 char* archive_name = java_lang_String::as_utf8_string(file_handle());
3513 DynamicArchive::dump_for_jcmd(archive_name, CHECK);
3514 #endif // INCLUDE_CDS
3515 JVM_END
3516
3517 // Returns an array of all live Thread objects (VM internal JavaThreads,
3518 // jvmti agent threads, and JNI attaching threads are skipped)
3519 // See CR 6404306 regarding JNI attaching threads
3520 JVM_ENTRY(jobjectArray, JVM_GetAllThreads(JNIEnv *env, jclass dummy))
3521 ResourceMark rm(THREAD);
3522 ThreadsListEnumerator tle(THREAD, false, false);
3523 JvmtiVMObjectAllocEventCollector oam;
3524
3525 int num_threads = tle.num_threads();
3526 objArrayOop r = oopFactory::new_objArray(vmClasses::Thread_klass(), num_threads, CHECK_NULL);
3527 objArrayHandle threads_ah(THREAD, r);
3528
3529 for (int i = 0; i < num_threads; i++) {
3530 Handle h = tle.get_threadObj(i);
3531 threads_ah->obj_at_put(i, h());
3532 }
3533
3534 return (jobjectArray) JNIHandles::make_local(THREAD, threads_ah());
3535 JVM_END
3536
3537
3538 // Support for java.lang.Thread.getStackTrace() and getAllStackTraces() methods
3539 // Return StackTraceElement[][], each element is the stack trace of a thread in
3540 // the corresponding entry in the given threads array
3541 JVM_ENTRY(jobjectArray, JVM_DumpThreads(JNIEnv *env, jclass threadClass, jobjectArray threads))
3542 JvmtiVMObjectAllocEventCollector oam;
3543
3544 // Check if threads is null
3545 if (threads == nullptr) {
3546 THROW_NULL(vmSymbols::java_lang_NullPointerException());
3547 }
3548
3549 objArrayOop a = objArrayOop(JNIHandles::resolve_non_null(threads));
3550 objArrayHandle ah(THREAD, a);
3551 int num_threads = ah->length();
3552 // check if threads is non-empty array
3553 if (num_threads == 0) {
3554 THROW_NULL(vmSymbols::java_lang_IllegalArgumentException());
3555 }
3556
3557 // check if threads is not an array of objects of Thread class
3558 Klass* k = ObjArrayKlass::cast(ah->klass())->element_klass();
3559 if (k != vmClasses::Thread_klass()) {
3560 THROW_NULL(vmSymbols::java_lang_IllegalArgumentException());
3561 }
3562
3563 ResourceMark rm(THREAD);
3564
3565 GrowableArray<instanceHandle>* thread_handle_array = new GrowableArray<instanceHandle>(num_threads);
3566 for (int i = 0; i < num_threads; i++) {
3567 oop thread_obj = ah->obj_at(i);
3568 instanceHandle h(THREAD, (instanceOop) thread_obj);
3569 thread_handle_array->append(h);
3570 }
3571
3572 // The JavaThread references in thread_handle_array are validated
3573 // in VM_ThreadDump::doit().
3574 Handle stacktraces = ThreadService::dump_stack_traces(thread_handle_array, num_threads, CHECK_NULL);
3575 return (jobjectArray)JNIHandles::make_local(THREAD, stacktraces());
3576
3577 JVM_END
3578
3579 // JVM monitoring and management support
3580 JVM_LEAF(void*, JVM_GetManagement(jint version))
3581 return Management::get_jmm_interface(version);
3582 JVM_END
3583
3584 // com.sun.tools.attach.VirtualMachine agent properties support
3585 //
3586 // Initialize the agent properties with the properties maintained in the VM
3587 JVM_ENTRY(jobject, JVM_InitAgentProperties(JNIEnv *env, jobject properties))
3588 ResourceMark rm;
3589
3590 Handle props(THREAD, JNIHandles::resolve_non_null(properties));
3591
3592 PUTPROP(props, "sun.java.command", Arguments::java_command());
3593 PUTPROP(props, "sun.jvm.flags", Arguments::jvm_flags());
3594 PUTPROP(props, "sun.jvm.args", Arguments::jvm_args());
3595 return properties;
3596 JVM_END
3597
3598 JVM_ENTRY(jobjectArray, JVM_GetEnclosingMethodInfo(JNIEnv *env, jclass ofClass))
3599 {
3600 JvmtiVMObjectAllocEventCollector oam;
3601
3602 if (ofClass == nullptr) {
3603 return nullptr;
3604 }
3605 Handle mirror(THREAD, JNIHandles::resolve_non_null(ofClass));
3606 // Special handling for primitive objects
3607 if (java_lang_Class::is_primitive(mirror())) {
3608 return nullptr;
3609 }
3610 Klass* k = java_lang_Class::as_Klass(mirror());
3611 if (!k->is_instance_klass()) {
3612 return nullptr;
3613 }
3614 InstanceKlass* ik = InstanceKlass::cast(k);
3615 int encl_method_class_idx = ik->enclosing_method_class_index();
3616 if (encl_method_class_idx == 0) {
3617 return nullptr;
3618 }
3621 Klass* enc_k = ik->constants()->klass_at(encl_method_class_idx, CHECK_NULL);
3622 dest->obj_at_put(0, enc_k->java_mirror());
3623 int encl_method_method_idx = ik->enclosing_method_method_index();
3624 if (encl_method_method_idx != 0) {
3625 Symbol* sym = ik->constants()->symbol_at(
3626 extract_low_short_from_int(
3627 ik->constants()->name_and_type_at(encl_method_method_idx)));
3628 Handle str = java_lang_String::create_from_symbol(sym, CHECK_NULL);
3629 dest->obj_at_put(1, str());
3630 sym = ik->constants()->symbol_at(
3631 extract_high_short_from_int(
3632 ik->constants()->name_and_type_at(encl_method_method_idx)));
3633 str = java_lang_String::create_from_symbol(sym, CHECK_NULL);
3634 dest->obj_at_put(2, str());
3635 }
3636 return (jobjectArray) JNIHandles::make_local(THREAD, dest());
3637 }
3638 JVM_END
3639
3640 // Returns an array of java.lang.String objects containing the input arguments to the VM.
3641 JVM_ENTRY(jobjectArray, JVM_GetVmArguments(JNIEnv *env))
3642 ResourceMark rm(THREAD);
3643
3644 if (Arguments::num_jvm_args() == 0 && Arguments::num_jvm_flags() == 0) {
3645 return nullptr;
3646 }
3647
3648 char** vm_flags = Arguments::jvm_flags_array();
3649 char** vm_args = Arguments::jvm_args_array();
3650 int num_flags = Arguments::num_jvm_flags();
3651 int num_args = Arguments::num_jvm_args();
3652
3653 InstanceKlass* ik = vmClasses::String_klass();
3654 objArrayOop r = oopFactory::new_objArray(ik, num_args + num_flags, CHECK_NULL);
3655 objArrayHandle result_h(THREAD, r);
3656
3657 int index = 0;
3658 for (int j = 0; j < num_flags; j++, index++) {
3659 Handle h = java_lang_String::create_from_platform_dependent_str(vm_flags[j], CHECK_NULL);
3660 result_h->obj_at_put(index, h());
3661 }
3662 for (int i = 0; i < num_args; i++, index++) {
3663 Handle h = java_lang_String::create_from_platform_dependent_str(vm_args[i], CHECK_NULL);
3664 result_h->obj_at_put(index, h());
3665 }
3666 return (jobjectArray) JNIHandles::make_local(THREAD, result_h());
3667 JVM_END
3668
3669 JVM_LEAF(jint, JVM_FindSignal(const char *name))
3670 return os::get_signal_number(name);
3671 JVM_END
3672
3673 JVM_ENTRY(void, JVM_VirtualThreadStart(JNIEnv* env, jobject vthread))
3674 #if INCLUDE_JVMTI
3675 if (!DoJVMTIVirtualThreadTransitions) {
3676 assert(!JvmtiExport::can_support_virtual_threads(), "sanity check");
3677 return;
3678 }
3679 if (JvmtiVTMSTransitionDisabler::VTMS_notify_jvmti_events()) {
3680 JvmtiVTMSTransitionDisabler::VTMS_vthread_start(vthread);
3681 } else {
3682 // set VTMS transition bit value in JavaThread and java.lang.VirtualThread object
3683 JvmtiVTMSTransitionDisabler::set_is_in_VTMS_transition(thread, vthread, false);
3684 }
3685 #endif
3686 JVM_END
3687
3688 JVM_ENTRY(void, JVM_VirtualThreadEnd(JNIEnv* env, jobject vthread))
3689 #if INCLUDE_JVMTI
3690 if (!DoJVMTIVirtualThreadTransitions) {
3691 assert(!JvmtiExport::can_support_virtual_threads(), "sanity check");
3692 return;
3693 }
3694 if (JvmtiVTMSTransitionDisabler::VTMS_notify_jvmti_events()) {
3695 JvmtiVTMSTransitionDisabler::VTMS_vthread_end(vthread);
3696 } else {
3697 // set VTMS transition bit value in JavaThread and java.lang.VirtualThread object
3698 JvmtiVTMSTransitionDisabler::set_is_in_VTMS_transition(thread, vthread, true);
3699 }
3700 #endif
3701 JVM_END
3702
3703 // If notifications are disabled then just update the VTMS transition bit and return.
3704 // Otherwise, the bit is updated in the given jvmtiVTMSTransitionDisabler function call.
3705 JVM_ENTRY(void, JVM_VirtualThreadMount(JNIEnv* env, jobject vthread, jboolean hide))
3706 #if INCLUDE_JVMTI
3707 if (!DoJVMTIVirtualThreadTransitions) {
3708 assert(!JvmtiExport::can_support_virtual_threads(), "sanity check");
3709 return;
3710 }
3711 if (JvmtiVTMSTransitionDisabler::VTMS_notify_jvmti_events()) {
3712 JvmtiVTMSTransitionDisabler::VTMS_vthread_mount(vthread, hide);
3713 } else {
3714 // set VTMS transition bit value in JavaThread and java.lang.VirtualThread object
3715 JvmtiVTMSTransitionDisabler::set_is_in_VTMS_transition(thread, vthread, hide);
3716 }
3717 #endif
3718 JVM_END
3719
3720 // If notifications are disabled then just update the VTMS transition bit and return.
3721 // Otherwise, the bit is updated in the given jvmtiVTMSTransitionDisabler function call below.
3722 JVM_ENTRY(void, JVM_VirtualThreadUnmount(JNIEnv* env, jobject vthread, jboolean hide))
3723 #if INCLUDE_JVMTI
3724 if (!DoJVMTIVirtualThreadTransitions) {
3725 assert(!JvmtiExport::can_support_virtual_threads(), "sanity check");
3726 return;
3727 }
3728 if (JvmtiVTMSTransitionDisabler::VTMS_notify_jvmti_events()) {
3729 JvmtiVTMSTransitionDisabler::VTMS_vthread_unmount(vthread, hide);
3730 } else {
3731 // set VTMS transition bit value in JavaThread and java.lang.VirtualThread object
3732 JvmtiVTMSTransitionDisabler::set_is_in_VTMS_transition(thread, vthread, hide);
3733 }
3734 #endif
3735 JVM_END
3736
3737 // Notification from VirtualThread about disabling JVMTI Suspend in a sync critical section.
3738 // Needed to avoid deadlocks with JVMTI suspend mechanism.
3739 JVM_ENTRY(void, JVM_VirtualThreadDisableSuspend(JNIEnv* env, jclass clazz, jboolean enter))
3740 #if INCLUDE_JVMTI
3741 if (!DoJVMTIVirtualThreadTransitions) {
3742 assert(!JvmtiExport::can_support_virtual_threads(), "sanity check");
3769 OopHandle& list_head = ObjectMonitor::vthread_cxq_head();
3770 oop vthread_head = nullptr;
3771 while (true) {
3772 if (list_head.peek() != nullptr) {
3773 for (;;) {
3774 oop head = list_head.resolve();
3775 if (list_head.cmpxchg(head, nullptr) == head) {
3776 return JNIHandles::make_local(THREAD, head);
3777 }
3778 }
3779 }
3780 ThreadBlockInVM tbivm(THREAD);
3781 parkEvent->park();
3782 }
3783 JVM_END
3784 /*
3785 * Return the current class's class file version. The low order 16 bits of the
3786 * returned jint contain the class's major version. The high order 16 bits
3787 * contain the class's minor version.
3788 */
3789 JVM_ENTRY(jint, JVM_GetClassFileVersion(JNIEnv* env, jclass current))
3790 oop mirror = JNIHandles::resolve_non_null(current);
3791 if (java_lang_Class::is_primitive(mirror)) {
3792 // return latest major version and minor version of 0.
3793 return JVM_CLASSFILE_MAJOR_VERSION;
3794 }
3795 assert(!java_lang_Class::as_Klass(mirror)->is_array_klass(), "unexpected array class");
3796
3797 Klass* c = java_lang_Class::as_Klass(mirror);
3798 assert(c->is_instance_klass(), "must be");
3799 InstanceKlass* ik = InstanceKlass::cast(c);
3800 return (ik->minor_version() << 16) | ik->major_version();
3801 JVM_END
3802
3803 /*
3804 * Ensure that code doing a stackwalk and using javaVFrame::locals() to
3805 * get the value will see a materialized value and not a scalar-replaced
3806 * null value.
3807 */
3808 JVM_ENTRY(void, JVM_EnsureMaterializedForStackWalk_func(JNIEnv* env, jobject vthread, jobject value))
3809 JVM_EnsureMaterializedForStackWalk(env, value);
3810 JVM_END
3811
3812 /*
3813 * Return JNI_TRUE if warnings are printed when agents are dynamically loaded.
3814 */
3815 JVM_LEAF(jboolean, JVM_PrintWarningAtDynamicAgentLoad(void))
3816 return (EnableDynamicAgentLoading && !FLAG_IS_CMDLINE(EnableDynamicAgentLoading)) ? JNI_TRUE : JNI_FALSE;
3817 JVM_END
|
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation.
8 *
9 * This code is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
12 * version 2 for more details (a copy is included in the LICENSE file that
13 * accompanied this code).
14 *
15 * You should have received a copy of the GNU General Public License version
16 * 2 along with this work; if not, write to the Free Software Foundation,
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18 *
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20 * or visit www.oracle.com if you need additional information or have any
21 * questions.
22 *
23 */
24
25 #include "cds/aotConstantPoolResolver.hpp"
26 #include "cds/cdsConfig.hpp"
27 #include "cds/classListParser.hpp"
28 #include "cds/classListWriter.hpp"
29 #include "cds/dynamicArchive.hpp"
30 #include "cds/heapShared.hpp"
31 #include "cds/lambdaFormInvokers.hpp"
32 #include "classfile/classFileStream.hpp"
33 #include "classfile/classLoader.inline.hpp"
34 #include "classfile/classLoaderData.hpp"
35 #include "classfile/classLoaderData.inline.hpp"
36 #include "classfile/classLoadInfo.hpp"
37 #include "classfile/javaAssertions.hpp"
38 #include "classfile/javaClasses.inline.hpp"
39 #include "classfile/moduleEntry.hpp"
40 #include "classfile/modules.hpp"
41 #include "classfile/packageEntry.hpp"
42 #include "classfile/stringTable.hpp"
43 #include "classfile/symbolTable.hpp"
44 #include "classfile/systemDictionary.hpp"
45 #include "classfile/vmClasses.hpp"
68 #include "prims/jvm_misc.hpp"
69 #include "prims/jvmtiExport.hpp"
70 #include "prims/jvmtiThreadState.inline.hpp"
71 #include "prims/stackwalk.hpp"
72 #include "runtime/arguments.hpp"
73 #include "runtime/atomic.hpp"
74 #include "runtime/continuation.hpp"
75 #include "runtime/globals_extension.hpp"
76 #include "runtime/handles.inline.hpp"
77 #include "runtime/init.hpp"
78 #include "runtime/interfaceSupport.inline.hpp"
79 #include "runtime/deoptimization.hpp"
80 #include "runtime/handshake.hpp"
81 #include "runtime/java.hpp"
82 #include "runtime/javaCalls.hpp"
83 #include "runtime/javaThread.hpp"
84 #include "runtime/jfieldIDWorkaround.hpp"
85 #include "runtime/jniHandles.inline.hpp"
86 #include "runtime/os.inline.hpp"
87 #include "runtime/osThread.hpp"
88 #include "runtime/perfData.inline.hpp"
89 #include "runtime/reflection.hpp"
90 #include "runtime/synchronizer.hpp"
91 #include "runtime/threadIdentifier.hpp"
92 #include "runtime/threadSMR.hpp"
93 #include "runtime/vframe.inline.hpp"
94 #include "runtime/vmOperations.hpp"
95 #include "runtime/vm_version.hpp"
96 #include "services/attachListener.hpp"
97 #include "services/management.hpp"
98 #include "services/threadService.hpp"
99 #include "utilities/checkedCast.hpp"
100 #include "utilities/copy.hpp"
101 #include "utilities/defaultStream.hpp"
102 #include "utilities/dtrace.hpp"
103 #include "utilities/events.hpp"
104 #include "utilities/macros.hpp"
105 #include "utilities/utf8.hpp"
106 #include "utilities/zipLibrary.hpp"
107 #if INCLUDE_CDS
108 #include "classfile/systemDictionaryShared.hpp"
211 }
212 }
213 }
214 if (caller != nullptr) {
215 if (to_class != caller) {
216 const char * from = caller->external_name();
217 const char * to = to_class->external_name();
218 // print in a single call to reduce interleaving between threads
219 if (source_file != nullptr) {
220 log_debug(class, resolve)("%s %s %s:%d (%s)", from, to, source_file, line_number, trace);
221 } else {
222 log_debug(class, resolve)("%s %s (%s)", from, to, trace);
223 }
224 }
225 }
226 }
227
228 // java.lang.System //////////////////////////////////////////////////////////////////////
229
230
231 JVM_LEAF_PROF(jboolean, JVM_AOTIsTraining, JVM_AOTIsTraining(JNIEnv *env))
232 #if INCLUDE_CDS
233 return MetaspaceShared::is_recording_preimage_static_archive();
234 #else
235 return JNI_FALSE;
236 #endif // INCLUDE_CDS
237 JVM_END
238
239 JVM_ENTRY_PROF(void, JVM_AOTEndTraining, JVM_AOTEndTraining(JNIEnv *env))
240 #if INCLUDE_CDS
241 if (MetaspaceShared::is_recording_preimage_static_archive()) {
242 MetaspaceShared::preload_and_dump(THREAD);
243 }
244 #endif // INCLUDE_CDS
245 JVM_END
246
247 JVM_LEAF_PROF(jlong, JVM_CurrentTimeMillis, JVM_CurrentTimeMillis(JNIEnv *env, jclass ignored))
248 return os::javaTimeMillis();
249 JVM_END
250
251 JVM_LEAF_PROF(jlong, JVM_NanoTime, JVM_NanoTime(JNIEnv *env, jclass ignored))
252 return os::javaTimeNanos();
253 JVM_END
254
255 // The function below is actually exposed by jdk.internal.misc.VM and not
256 // java.lang.System, but we choose to keep it here so that it stays next
257 // to JVM_CurrentTimeMillis and JVM_NanoTime
258
259 const jlong MAX_DIFF_SECS = CONST64(0x0100000000); // 2^32
260 const jlong MIN_DIFF_SECS = -MAX_DIFF_SECS; // -2^32
261
262 JVM_LEAF_PROF(jlong, JVM_GetNanoTimeAdjustment, JVM_GetNanoTimeAdjustment(JNIEnv *env, jclass ignored, jlong offset_secs))
263 jlong seconds;
264 jlong nanos;
265
266 os::javaTimeSystemUTC(seconds, nanos);
267
268 // We're going to verify that the result can fit in a long.
269 // For that we need the difference in seconds between 'seconds'
270 // and 'offset_secs' to be such that:
271 // |seconds - offset_secs| < (2^63/10^9)
272 // We're going to approximate 10^9 ~< 2^30 (1000^3 ~< 1024^3)
273 // which makes |seconds - offset_secs| < 2^33
274 // and we will prefer +/- 2^32 as the maximum acceptable diff
275 // as 2^32 has a more natural feel than 2^33...
276 //
277 // So if |seconds - offset_secs| >= 2^32 - we return a special
278 // sentinel value (-1) which the caller should take as an
279 // exception value indicating that the offset given to us is
280 // too far from range of the current time - leading to too big
281 // a nano adjustment. The caller is expected to recover by
282 // computing a more accurate offset and calling this method
283 // again. (For the record 2^32 secs is ~136 years, so that
284 // should rarely happen)
285 //
286 jlong diff = seconds - offset_secs;
287 if (diff >= MAX_DIFF_SECS || diff <= MIN_DIFF_SECS) {
288 return -1; // sentinel value: the offset is too far off the target
289 }
290
291 // return the adjustment. If you compute a time by adding
292 // this number of nanoseconds along with the number of seconds
293 // in the offset you should get the current UTC time.
294 return (diff * (jlong)1000000000) + nanos;
295 JVM_END
296
297 JVM_ENTRY_PROF(void, JVM_ArrayCopy, JVM_ArrayCopy(JNIEnv *env, jclass ignored, jobject src, jint src_pos,
298 jobject dst, jint dst_pos, jint length))
299 // Check if we have null pointers
300 if (src == nullptr || dst == nullptr) {
301 THROW(vmSymbols::java_lang_NullPointerException());
302 }
303 arrayOop s = arrayOop(JNIHandles::resolve_non_null(src));
304 arrayOop d = arrayOop(JNIHandles::resolve_non_null(dst));
305 assert(oopDesc::is_oop(s), "JVM_ArrayCopy: src not an oop");
306 assert(oopDesc::is_oop(d), "JVM_ArrayCopy: dst not an oop");
307 // Do copy
308 s->klass()->copy_array(s, src_pos, d, dst_pos, length, thread);
309 JVM_END
310
311
312 static void set_property(Handle props, const char* key, const char* value, TRAPS) {
313 JavaValue r(T_OBJECT);
314 // public synchronized Object put(Object key, Object value);
315 HandleMark hm(THREAD);
316 Handle key_str = java_lang_String::create_from_platform_dependent_str(key, CHECK);
317 Handle value_str = java_lang_String::create_from_platform_dependent_str((value != nullptr ? value : ""), CHECK);
318 JavaCalls::call_virtual(&r,
319 props,
320 vmClasses::Properties_klass(),
321 vmSymbols::put_name(),
322 vmSymbols::object_object_object_signature(),
323 key_str,
324 value_str,
325 THREAD);
326 }
327
328
329 #define PUTPROP(props, name, value) set_property((props), (name), (value), CHECK_(properties));
330
331 /*
332 * Return all of the system properties in a Java String array with alternating
333 * names and values from the jvm SystemProperty.
334 * Which includes some internal and all commandline -D defined properties.
335 */
336 JVM_ENTRY_PROF(jobjectArray, JVM_GetProperties, JVM_GetProperties(JNIEnv *env))
337 ResourceMark rm(THREAD);
338 HandleMark hm(THREAD);
339 int ndx = 0;
340 int fixedCount = 2;
341
342 SystemProperty* p = Arguments::system_properties();
343 int count = Arguments::PropertyList_count(p);
344
345 // Allocate result String array
346 InstanceKlass* ik = vmClasses::String_klass();
347 objArrayOop r = oopFactory::new_objArray(ik, (count + fixedCount) * 2, CHECK_NULL);
348 objArrayHandle result_h(THREAD, r);
349
350 while (p != nullptr) {
351 const char * key = p->key();
352 if (strcmp(key, "sun.nio.MaxDirectMemorySize") != 0) {
353 const char * value = p->value();
354 Handle key_str = java_lang_String::create_from_platform_dependent_str(key, CHECK_NULL);
355 Handle value_str = java_lang_String::create_from_platform_dependent_str((value != nullptr ? value : ""), CHECK_NULL);
356 result_h->obj_at_put(ndx * 2, key_str());
404 Handle key_str = java_lang_String::create_from_platform_dependent_str("sun.management.compiler", CHECK_NULL);
405 Handle value_str = java_lang_String::create_from_platform_dependent_str(compiler_name, CHECK_NULL);
406 result_h->obj_at_put(ndx * 2, key_str());
407 result_h->obj_at_put(ndx * 2 + 1, value_str());
408 ndx++;
409 }
410 }
411
412 return (jobjectArray) JNIHandles::make_local(THREAD, result_h());
413 JVM_END
414
415
416 /*
417 * Return the temporary directory that the VM uses for the attach
418 * and perf data files.
419 *
420 * It is important that this directory is well-known and the
421 * same for all VM instances. It cannot be affected by configuration
422 * variables such as java.io.tmpdir.
423 */
424 JVM_ENTRY_PROF(jstring, JVM_GetTemporaryDirectory, JVM_GetTemporaryDirectory(JNIEnv *env))
425 HandleMark hm(THREAD);
426 const char* temp_dir = os::get_temp_directory();
427 Handle h = java_lang_String::create_from_platform_dependent_str(temp_dir, CHECK_NULL);
428 return (jstring) JNIHandles::make_local(THREAD, h());
429 JVM_END
430
431
432 // java.lang.Runtime /////////////////////////////////////////////////////////////////////////
433
434 extern volatile jint vm_created;
435
436 JVM_ENTRY_NO_ENV_PROF(void, JVM_BeforeHalt, JVM_BeforeHalt())
437 EventShutdown event;
438 if (event.should_commit()) {
439 event.set_reason("Shutdown requested from Java");
440 event.commit();
441 }
442 JVM_END
443
444
445 JVM_ENTRY_NO_ENV_PROF(void, JVM_Halt, JVM_Halt(jint code))
446 before_exit(thread, true);
447 vm_exit(code);
448 JVM_END
449
450
451 JVM_ENTRY_NO_ENV_PROF(void, JVM_GC, JVM_GC(void))
452 if (!DisableExplicitGC) {
453 EventSystemGC event;
454 event.set_invokedConcurrent(ExplicitGCInvokesConcurrent);
455 Universe::heap()->collect(GCCause::_java_lang_system_gc);
456 event.commit();
457 }
458 JVM_END
459
460
461 JVM_LEAF_PROF(jlong, JVM_MaxObjectInspectionAge, JVM_MaxObjectInspectionAge(void))
462 return Universe::heap()->millis_since_last_whole_heap_examined();
463 JVM_END
464
465
466 static inline jlong convert_size_t_to_jlong(size_t val) {
467 // In the 64-bit vm, a size_t can overflow a jlong (which is signed).
468 NOT_LP64 (return (jlong)val;)
469 LP64_ONLY(return (jlong)MIN2(val, (size_t)max_jlong);)
470 }
471
472 JVM_ENTRY_NO_ENV_PROF(jlong, JVM_TotalMemory, JVM_TotalMemory(void))
473 size_t n = Universe::heap()->capacity();
474 return convert_size_t_to_jlong(n);
475 JVM_END
476
477
478 JVM_ENTRY_NO_ENV_PROF(jlong, JVM_FreeMemory, JVM_FreeMemory(void))
479 size_t n = Universe::heap()->unused();
480 return convert_size_t_to_jlong(n);
481 JVM_END
482
483
484 JVM_ENTRY_NO_ENV_PROF(jlong, JVM_MaxMemory, JVM_MaxMemory(void))
485 size_t n = Universe::heap()->max_capacity();
486 return convert_size_t_to_jlong(n);
487 JVM_END
488
489
490 JVM_ENTRY_NO_ENV_PROF(jint, JVM_ActiveProcessorCount, JVM_ActiveProcessorCount(void))
491 return os::active_processor_count();
492 JVM_END
493
494 JVM_LEAF_PROF(jboolean, JVM_IsUseContainerSupport, JVM_IsUseContainerSupport(void))
495 #ifdef LINUX
496 if (UseContainerSupport) {
497 return JNI_TRUE;
498 }
499 #endif
500 return JNI_FALSE;
501 JVM_END
502
503 JVM_LEAF(jboolean, JVM_IsContainerized(void))
504 #ifdef LINUX
505 if (OSContainer::is_containerized()) {
506 return JNI_TRUE;
507 }
508 #endif
509 return JNI_FALSE;
510 JVM_END
511
512 // java.lang.Throwable //////////////////////////////////////////////////////
513
514 JVM_ENTRY_PROF(void, JVM_FillInStackTrace, JVM_FillInStackTrace(JNIEnv *env, jobject receiver))
515 Handle exception(thread, JNIHandles::resolve_non_null(receiver));
516 java_lang_Throwable::fill_in_stack_trace(exception);
517 JVM_END
518
519 // java.lang.NullPointerException ///////////////////////////////////////////
520
521 JVM_ENTRY_PROF(jstring, JVM_GetExtendedNPEMessage, JVM_GetExtendedNPEMessage(JNIEnv *env, jthrowable throwable))
522 if (!ShowCodeDetailsInExceptionMessages) return nullptr;
523
524 oop exc = JNIHandles::resolve_non_null(throwable);
525
526 Method* method;
527 int bci;
528 if (!java_lang_Throwable::get_top_method_and_bci(exc, &method, &bci)) {
529 return nullptr;
530 }
531 if (method->is_native()) {
532 return nullptr;
533 }
534
535 stringStream ss;
536 bool ok = BytecodeUtils::get_NPE_message_at(&ss, method, bci);
537 if (ok) {
538 oop result = java_lang_String::create_oop_from_str(ss.base(), CHECK_NULL);
539 return (jstring) JNIHandles::make_local(THREAD, result);
540 } else {
541 return nullptr;
542 }
543 JVM_END
544
545 // java.lang.StackTraceElement //////////////////////////////////////////////
546
547
548 JVM_ENTRY_PROF(void, JVM_InitStackTraceElementArray, JVM_InitStackTraceElementArray(JNIEnv *env, jobjectArray elements, jobject backtrace, jint depth))
549 Handle backtraceh(THREAD, JNIHandles::resolve(backtrace));
550 objArrayOop st = objArrayOop(JNIHandles::resolve(elements));
551 objArrayHandle stack_trace(THREAD, st);
552 // Fill in the allocated stack trace
553 java_lang_Throwable::get_stack_trace_elements(depth, backtraceh, stack_trace, CHECK);
554 JVM_END
555
556
557 JVM_ENTRY_PROF(void, JVM_InitStackTraceElement, JVM_InitStackTraceElement(JNIEnv* env, jobject element, jobject stackFrameInfo))
558 Handle stack_frame_info(THREAD, JNIHandles::resolve_non_null(stackFrameInfo));
559 Handle stack_trace_element(THREAD, JNIHandles::resolve_non_null(element));
560 java_lang_StackFrameInfo::to_stack_trace_element(stack_frame_info, stack_trace_element, CHECK);
561 JVM_END
562
563
564 // java.lang.StackWalker //////////////////////////////////////////////////////
565 JVM_ENTRY_PROF(void, JVM_ExpandStackFrameInfo, JVM_ExpandStackFrameInfo(JNIEnv *env, jobject obj))
566 Handle stack_frame_info(THREAD, JNIHandles::resolve_non_null(obj));
567
568 bool have_name = (java_lang_StackFrameInfo::name(stack_frame_info()) != nullptr);
569 bool have_type = (java_lang_StackFrameInfo::type(stack_frame_info()) != nullptr);
570 Method* method = java_lang_StackFrameInfo::get_method(stack_frame_info());
571 if (!have_name) {
572 oop name = StringTable::intern(method->name(), CHECK);
573 java_lang_StackFrameInfo::set_name(stack_frame_info(), name);
574 }
575 if (!have_type) {
576 Handle type = java_lang_String::create_from_symbol(method->signature(), CHECK);
577 java_lang_StackFrameInfo::set_type(stack_frame_info(), type());
578 }
579 JVM_END
580
581 JVM_ENTRY_PROF(jobject, JVM_CallStackWalk, JVM_CallStackWalk(JNIEnv *env, jobject stackStream, jint mode,
582 jint skip_frames, jobject contScope, jobject cont,
583 jint buffer_size, jint start_index, jobjectArray frames))
584 if (!thread->has_last_Java_frame()) {
585 THROW_MSG_(vmSymbols::java_lang_InternalError(), "doStackWalk: no stack trace", nullptr);
586 }
587
588 Handle stackStream_h(THREAD, JNIHandles::resolve_non_null(stackStream));
589 Handle contScope_h(THREAD, JNIHandles::resolve(contScope));
590 Handle cont_h(THREAD, JNIHandles::resolve(cont));
591 // frames array is a ClassFrameInfo[] array when only getting caller reference,
592 // and a StackFrameInfo[] array (or derivative) otherwise. It should never
593 // be null.
594 objArrayOop fa = objArrayOop(JNIHandles::resolve_non_null(frames));
595 objArrayHandle frames_array_h(THREAD, fa);
596
597 if (frames_array_h->length() < buffer_size) {
598 THROW_MSG_(vmSymbols::java_lang_IllegalArgumentException(), "not enough space in buffers", nullptr);
599 }
600
601 oop result = StackWalk::walk(stackStream_h, mode, skip_frames, contScope_h, cont_h,
602 buffer_size, start_index, frames_array_h, CHECK_NULL);
603 return JNIHandles::make_local(THREAD, result);
604 JVM_END
605
606
607 JVM_ENTRY_PROF(jint, JVM_MoreStackWalk, JVM_MoreStackWalk(JNIEnv *env, jobject stackStream, jint mode, jlong anchor,
608 jint last_batch_count, jint buffer_size, jint start_index,
609 jobjectArray frames))
610 // frames array is a ClassFrameInfo[] array when only getting caller reference,
611 // and a StackFrameInfo[] array (or derivative) otherwise. It should never
612 // be null.
613 objArrayOop fa = objArrayOop(JNIHandles::resolve_non_null(frames));
614 objArrayHandle frames_array_h(THREAD, fa);
615
616 if (frames_array_h->length() < buffer_size) {
617 THROW_MSG_0(vmSymbols::java_lang_IllegalArgumentException(), "not enough space in buffers");
618 }
619
620 Handle stackStream_h(THREAD, JNIHandles::resolve_non_null(stackStream));
621 return StackWalk::fetchNextBatch(stackStream_h, mode, anchor, last_batch_count, buffer_size,
622 start_index, frames_array_h, THREAD);
623 JVM_END
624
625 JVM_ENTRY_PROF(void, JVM_SetStackWalkContinuation, JVM_SetStackWalkContinuation(JNIEnv *env, jobject stackStream, jlong anchor, jobjectArray frames, jobject cont))
626 objArrayOop fa = objArrayOop(JNIHandles::resolve_non_null(frames));
627 objArrayHandle frames_array_h(THREAD, fa);
628 Handle stackStream_h(THREAD, JNIHandles::resolve_non_null(stackStream));
629 Handle cont_h(THREAD, JNIHandles::resolve_non_null(cont));
630
631 StackWalk::setContinuation(stackStream_h, anchor, frames_array_h, cont_h, THREAD);
632 JVM_END
633
634 // java.lang.Object ///////////////////////////////////////////////
635
636
637 JVM_ENTRY_PROF(jint, JVM_IHashCode, JVM_IHashCode(JNIEnv* env, jobject handle))
638 // as implemented in the classic virtual machine; return 0 if object is null
639 return handle == nullptr ? 0 :
640 checked_cast<jint>(ObjectSynchronizer::FastHashCode (THREAD, JNIHandles::resolve_non_null(handle)));
641 JVM_END
642
643
644 JVM_ENTRY_PROF(void, JVM_MonitorWait, JVM_MonitorWait(JNIEnv* env, jobject handle, jlong ms))
645 Handle obj(THREAD, JNIHandles::resolve_non_null(handle));
646 ObjectSynchronizer::wait(obj, ms, CHECK);
647 JVM_END
648
649
650 JVM_ENTRY_PROF(void, JVM_MonitorNotify, JVM_MonitorNotify(JNIEnv* env, jobject handle))
651 Handle obj(THREAD, JNIHandles::resolve_non_null(handle));
652 ObjectSynchronizer::notify(obj, CHECK);
653 JVM_END
654
655
656 JVM_ENTRY_PROF(void, JVM_MonitorNotifyAll, JVM_MonitorNotifyAll(JNIEnv* env, jobject handle))
657 Handle obj(THREAD, JNIHandles::resolve_non_null(handle));
658 ObjectSynchronizer::notifyall(obj, CHECK);
659 JVM_END
660
661
662 JVM_ENTRY_PROF(jobject, JVM_Clone, JVM_Clone(JNIEnv* env, jobject handle))
663 Handle obj(THREAD, JNIHandles::resolve_non_null(handle));
664 Klass* klass = obj->klass();
665 JvmtiVMObjectAllocEventCollector oam;
666
667 #ifdef ASSERT
668 // Just checking that the cloneable flag is set correct
669 if (obj->is_array()) {
670 guarantee(klass->is_cloneable(), "all arrays are cloneable");
671 } else {
672 guarantee(obj->is_instance(), "should be instanceOop");
673 bool cloneable = klass->is_subtype_of(vmClasses::Cloneable_klass());
674 guarantee(cloneable == klass->is_cloneable(), "incorrect cloneable flag");
675 }
676 #endif
677
678 // Check if class of obj supports the Cloneable interface.
679 // All arrays are considered to be cloneable (See JLS 20.1.5).
680 // All j.l.r.Reference classes are considered non-cloneable.
681 if (!klass->is_cloneable() ||
682 (klass->is_instance_klass() &&
695 } else {
696 new_obj_oop = Universe::heap()->obj_allocate(klass, size, CHECK_NULL);
697 }
698
699 HeapAccess<>::clone(obj(), new_obj_oop, size);
700
701 Handle new_obj(THREAD, new_obj_oop);
702 // Caution: this involves a java upcall, so the clone should be
703 // "gc-robust" by this stage.
704 if (klass->has_finalizer()) {
705 assert(obj->is_instance(), "should be instanceOop");
706 new_obj_oop = InstanceKlass::register_finalizer(instanceOop(new_obj()), CHECK_NULL);
707 new_obj = Handle(THREAD, new_obj_oop);
708 }
709
710 return JNIHandles::make_local(THREAD, new_obj());
711 JVM_END
712
713 // java.lang.ref.Finalizer ////////////////////////////////////////////////////
714
715 JVM_ENTRY_PROF(void, JVM_ReportFinalizationComplete, JVM_ReportFinalizationComplete(JNIEnv * env, jobject finalizee))
716 MANAGEMENT_ONLY(FinalizerService::on_complete(JNIHandles::resolve_non_null(finalizee), THREAD);)
717 JVM_END
718
719 JVM_LEAF_PROF(jboolean, JVM_IsFinalizationEnabled, JVM_IsFinalizationEnabled(JNIEnv * env))
720 return InstanceKlass::is_finalization_enabled();
721 JVM_END
722
723 // jdk.internal.vm.Continuation /////////////////////////////////////////////////////
724
725 JVM_ENTRY_PROF(void, JVM_RegisterContinuationMethods, JVM_RegisterContinuationMethods(JNIEnv *env, jclass cls))
726 CONT_RegisterNativeMethods(env, cls);
727 JVM_END
728
729 // java.io.File ///////////////////////////////////////////////////////////////
730
731 JVM_LEAF_PROF(char*, JVM_NativePath, JVM_NativePath(char* path))
732 return os::native_path(path);
733 JVM_END
734
735
736 // Misc. class handling ///////////////////////////////////////////////////////////
737
738
739 JVM_ENTRY_PROF(jclass, JVM_GetCallerClass, JVM_GetCallerClass(JNIEnv* env))
740 // Getting the class of the caller frame.
741 //
742 // The call stack at this point looks something like this:
743 //
744 // [0] [ @CallerSensitive public jdk.internal.reflect.Reflection.getCallerClass ]
745 // [1] [ @CallerSensitive API.method ]
746 // [.] [ (skipped intermediate frames) ]
747 // [n] [ caller ]
748 vframeStream vfst(thread);
749 // Cf. LibraryCallKit::inline_native_Reflection_getCallerClass
750 for (int n = 0; !vfst.at_end(); vfst.security_next(), n++) {
751 Method* m = vfst.method();
752 assert(m != nullptr, "sanity");
753 switch (n) {
754 case 0:
755 // This must only be called from Reflection.getCallerClass
756 if (m->intrinsic_id() != vmIntrinsics::_getCallerClass) {
757 THROW_MSG_NULL(vmSymbols::java_lang_InternalError(), "JVM_GetCallerClass must only be called from Reflection.getCallerClass");
758 }
759 // fall-through
760 case 1:
761 // Frame 0 and 1 must be caller sensitive.
762 if (!m->caller_sensitive()) {
763 THROW_MSG_NULL(vmSymbols::java_lang_InternalError(), err_msg("CallerSensitive annotation expected at frame %d", n));
764 }
765 break;
766 default:
767 if (!m->is_ignored_by_security_stack_walk()) {
768 // We have reached the desired frame; return the holder class.
769 return (jclass) JNIHandles::make_local(THREAD, m->method_holder()->java_mirror());
770 }
771 break;
772 }
773 }
774 return nullptr;
775 JVM_END
776
777
778 JVM_ENTRY_PROF(jclass, JVM_FindPrimitiveClass, JVM_FindPrimitiveClass(JNIEnv* env, const char* utf))
779 oop mirror = nullptr;
780 BasicType t = name2type(utf);
781 if (t != T_ILLEGAL && !is_reference_type(t)) {
782 mirror = Universe::java_mirror(t);
783 }
784 if (mirror == nullptr) {
785 THROW_MSG_NULL(vmSymbols::java_lang_ClassNotFoundException(), (char*) utf);
786 } else {
787 return (jclass) JNIHandles::make_local(THREAD, mirror);
788 }
789 JVM_END
790
791
792 // Returns a class loaded by the bootstrap class loader; or null
793 // if not found. ClassNotFoundException is not thrown.
794 // FindClassFromBootLoader is exported to the launcher for windows.
795 JVM_ENTRY_PROF(jclass, JVM_FindClassFromBootLoader, JVM_FindClassFromBootLoader(JNIEnv* env, const char* name))
796 // Java libraries should ensure that name is never null or illegal.
797 if (name == nullptr || (int)strlen(name) > Symbol::max_length()) {
798 // It's impossible to create this class; the name cannot fit
799 // into the constant pool.
800 return nullptr;
801 }
802 assert(UTF8::is_legal_utf8((const unsigned char*)name, strlen(name), false), "illegal UTF name");
803
804 TempNewSymbol h_name = SymbolTable::new_symbol(name);
805 Klass* k = SystemDictionary::resolve_or_null(h_name, CHECK_NULL);
806 if (k == nullptr) {
807 return nullptr;
808 }
809
810 if (log_is_enabled(Debug, class, resolve)) {
811 trace_class_resolution(k);
812 }
813 return (jclass) JNIHandles::make_local(THREAD, k->java_mirror());
814 JVM_END
815
816 // Find a class with this name in this loader, using the caller's protection domain.
817 JVM_ENTRY_PROF(jclass, JVM_FindClassFromCaller, JVM_FindClassFromCaller(JNIEnv* env, const char* name,
818 jboolean init, jobject loader,
819 jclass caller))
820 TempNewSymbol h_name =
821 SystemDictionary::class_name_symbol(name, vmSymbols::java_lang_ClassNotFoundException(),
822 CHECK_NULL);
823
824 oop loader_oop = JNIHandles::resolve(loader);
825 oop from_class = JNIHandles::resolve(caller);
826 Handle h_loader(THREAD, loader_oop);
827
828 jclass result = find_class_from_class_loader(env, h_name, init, h_loader,
829 false, THREAD);
830
831 if (log_is_enabled(Debug, class, resolve) && result != nullptr) {
832 trace_class_resolution(java_lang_Class::as_Klass(JNIHandles::resolve_non_null(result)));
833 }
834 return result;
835 JVM_END
836
837 // Currently only called from the old verifier.
838 JVM_ENTRY_PROF(jclass, JVM_FindClassFromClass, JVM_FindClassFromClass(JNIEnv *env, const char *name,
839 jboolean init, jclass from))
840 TempNewSymbol h_name =
841 SystemDictionary::class_name_symbol(name, vmSymbols::java_lang_ClassNotFoundException(),
842 CHECK_NULL);
843 oop from_class_oop = JNIHandles::resolve(from);
844 Klass* from_class = (from_class_oop == nullptr)
845 ? (Klass*)nullptr
846 : java_lang_Class::as_Klass(from_class_oop);
847 oop class_loader = nullptr;
848 if (from_class != nullptr) {
849 class_loader = from_class->class_loader();
850 }
851 Handle h_loader(THREAD, class_loader);
852 jclass result = find_class_from_class_loader(env, h_name, init, h_loader, true, thread);
853
854 if (log_is_enabled(Debug, class, resolve) && result != nullptr) {
855 // this function is generally only used for class loading during verification.
856 ResourceMark rm;
857 oop from_mirror = JNIHandles::resolve_non_null(from);
858 Klass* from_class = java_lang_Class::as_Klass(from_mirror);
859 const char * from_name = from_class->external_name();
1018 ik->external_name(),
1019 host_class->external_name(),
1020 ik->is_hidden() ? "is hidden" : "is not hidden");
1021 }
1022 }
1023
1024 if ((!is_hidden || is_nestmate) && !Reflection::is_same_class_package(lookup_k, ik)) {
1025 // non-hidden class or nestmate class must be in the same package as the Lookup class
1026 THROW_MSG_NULL(vmSymbols::java_lang_IllegalArgumentException(), "Lookup class and defined class are in different packages");
1027 }
1028
1029 if (init) {
1030 ik->initialize(CHECK_NULL);
1031 } else {
1032 ik->link_class(CHECK_NULL);
1033 }
1034
1035 return (jclass) JNIHandles::make_local(THREAD, ik->java_mirror());
1036 }
1037
1038 JVM_ENTRY_PROF(jclass, JVM_DefineClass, JVM_DefineClass(JNIEnv *env, const char *name, jobject loader, const jbyte *buf, jsize len, jobject pd))
1039 return jvm_define_class_common(name, loader, buf, len, pd, nullptr, THREAD);
1040 JVM_END
1041
1042 /*
1043 * Define a class with the specified lookup class.
1044 * lookup: Lookup class
1045 * name: the name of the class
1046 * buf: class bytes
1047 * len: length of class bytes
1048 * pd: protection domain
1049 * init: initialize the class
1050 * flags: properties of the class
1051 * classData: private static pre-initialized field
1052 */
1053 JVM_ENTRY_PROF(jclass, JVM_LookupDefineClass, JVM_LookupDefineClass(JNIEnv *env, jclass lookup, const char *name, const jbyte *buf,
1054 jsize len, jobject pd, jboolean initialize, int flags, jobject classData))
1055
1056 if (lookup == nullptr) {
1057 THROW_MSG_NULL(vmSymbols::java_lang_IllegalArgumentException(), "Lookup class is null");
1058 }
1059
1060 assert(buf != nullptr, "buf must not be null");
1061
1062 return jvm_lookup_define_class(lookup, name, buf, len, pd, initialize, flags, classData, THREAD);
1063 JVM_END
1064
1065 JVM_ENTRY_PROF(jclass, JVM_DefineClassWithSource, JVM_DefineClassWithSource(JNIEnv *env, const char *name, jobject loader, const jbyte *buf, jsize len, jobject pd, const char *source))
1066 return jvm_define_class_common(name, loader, buf, len, pd, source, THREAD);
1067 JVM_END
1068
1069 JVM_ENTRY_PROF(jclass, JVM_FindLoadedClass, JVM_FindLoadedClass(JNIEnv *env, jobject loader, jstring name))
1070 ResourceMark rm(THREAD);
1071
1072 Handle h_name (THREAD, JNIHandles::resolve_non_null(name));
1073 char* str = java_lang_String::as_utf8_string(h_name());
1074
1075 // Sanity check, don't expect null
1076 if (str == nullptr) return nullptr;
1077
1078 // Internalize the string, converting '.' to '/' in string.
1079 char* p = (char*)str;
1080 while (*p != '\0') {
1081 if (*p == '.') {
1082 *p = '/';
1083 }
1084 p++;
1085 }
1086
1087 const int str_len = (int)(p - str);
1088 if (str_len > Symbol::max_length()) {
1089 // It's impossible to create this class; the name cannot fit
1093 TempNewSymbol klass_name = SymbolTable::new_symbol(str, str_len);
1094
1095 // Security Note:
1096 // The Java level wrapper will perform the necessary security check allowing
1097 // us to pass the null as the initiating class loader.
1098 Handle h_loader(THREAD, JNIHandles::resolve(loader));
1099 Klass* k = SystemDictionary::find_instance_or_array_klass(THREAD, klass_name, h_loader);
1100 #if INCLUDE_CDS
1101 if (k == nullptr) {
1102 // If the class is not already loaded, try to see if it's in the shared
1103 // archive for the current classloader (h_loader).
1104 k = SystemDictionaryShared::find_or_load_shared_class(klass_name, h_loader, CHECK_NULL);
1105 }
1106 #endif
1107 return (k == nullptr) ? nullptr :
1108 (jclass) JNIHandles::make_local(THREAD, k->java_mirror());
1109 JVM_END
1110
1111 // Module support //////////////////////////////////////////////////////////////////////////////
1112
1113 JVM_ENTRY_PROF(void, JVM_DefineModule, JVM_DefineModule(JNIEnv *env, jobject module, jboolean is_open, jstring version,
1114 jstring location, jobjectArray packages))
1115 Handle h_module (THREAD, JNIHandles::resolve(module));
1116 Modules::define_module(h_module, is_open, version, location, packages, CHECK);
1117 JVM_END
1118
1119 JVM_ENTRY_PROF(void, JVM_SetBootLoaderUnnamedModule, JVM_SetBootLoaderUnnamedModule(JNIEnv *env, jobject module))
1120 Handle h_module (THREAD, JNIHandles::resolve(module));
1121 Modules::set_bootloader_unnamed_module(h_module, CHECK);
1122 JVM_END
1123
1124 JVM_ENTRY_PROF(void, JVM_AddModuleExports, JVM_AddModuleExports(JNIEnv *env, jobject from_module, jstring package, jobject to_module))
1125 Handle h_from_module (THREAD, JNIHandles::resolve(from_module));
1126 Handle h_to_module (THREAD, JNIHandles::resolve(to_module));
1127 Modules::add_module_exports_qualified(h_from_module, package, h_to_module, CHECK);
1128 JVM_END
1129
1130 JVM_ENTRY_PROF(void, JVM_AddModuleExportsToAllUnnamed, JVM_AddModuleExportsToAllUnnamed(JNIEnv *env, jobject from_module, jstring package))
1131 Handle h_from_module (THREAD, JNIHandles::resolve(from_module));
1132 Modules::add_module_exports_to_all_unnamed(h_from_module, package, CHECK);
1133 JVM_END
1134
1135 JVM_ENTRY_PROF(void, JVM_AddModuleExportsToAll, JVM_AddModuleExportsToAll(JNIEnv *env, jobject from_module, jstring package))
1136 Handle h_from_module (THREAD, JNIHandles::resolve(from_module));
1137 Modules::add_module_exports(h_from_module, package, Handle(), CHECK);
1138 JVM_END
1139
1140 JVM_ENTRY_PROF(void, JVM_AddReadsModule, JVM_AddReadsModule(JNIEnv *env, jobject from_module, jobject source_module))
1141 Handle h_from_module (THREAD, JNIHandles::resolve(from_module));
1142 Handle h_source_module (THREAD, JNIHandles::resolve(source_module));
1143 Modules::add_reads_module(h_from_module, h_source_module, CHECK);
1144 JVM_END
1145
1146 JVM_ENTRY_PROF(void, JVM_DefineArchivedModules, JVM_DefineArchivedModules(JNIEnv *env, jobject platform_loader, jobject system_loader))
1147 Handle h_platform_loader (THREAD, JNIHandles::resolve(platform_loader));
1148 Handle h_system_loader (THREAD, JNIHandles::resolve(system_loader));
1149 Modules::define_archived_modules(h_platform_loader, h_system_loader, CHECK);
1150 JVM_END
1151
1152 // Reflection support //////////////////////////////////////////////////////////////////////////////
1153
1154 JVM_ENTRY_PROF(jstring, JVM_InitClassName, JVM_InitClassName(JNIEnv *env, jclass cls))
1155 assert (cls != nullptr, "illegal class");
1156 JvmtiVMObjectAllocEventCollector oam;
1157 ResourceMark rm(THREAD);
1158 HandleMark hm(THREAD);
1159 Handle java_class(THREAD, JNIHandles::resolve(cls));
1160 oop result = java_lang_Class::name(java_class, CHECK_NULL);
1161 return (jstring) JNIHandles::make_local(THREAD, result);
1162 JVM_END
1163
1164
1165 JVM_ENTRY_PROF(jobjectArray, JVM_GetClassInterfaces, JVM_GetClassInterfaces(JNIEnv *env, jclass cls))
1166 JvmtiVMObjectAllocEventCollector oam;
1167 oop mirror = JNIHandles::resolve_non_null(cls);
1168
1169 // Special handling for primitive objects
1170 if (java_lang_Class::is_primitive(mirror)) {
1171 // Primitive objects does not have any interfaces
1172 objArrayOop r = oopFactory::new_objArray(vmClasses::Class_klass(), 0, CHECK_NULL);
1173 return (jobjectArray) JNIHandles::make_local(THREAD, r);
1174 }
1175
1176 Klass* klass = java_lang_Class::as_Klass(mirror);
1177 // Figure size of result array
1178 int size;
1179 if (klass->is_instance_klass()) {
1180 size = InstanceKlass::cast(klass)->local_interfaces()->length();
1181 } else {
1182 assert(klass->is_objArray_klass() || klass->is_typeArray_klass(), "Illegal mirror klass");
1183 size = 2;
1184 }
1185
1186 // Allocate result array
1187 objArrayOop r = oopFactory::new_objArray(vmClasses::Class_klass(), size, CHECK_NULL);
1188 objArrayHandle result (THREAD, r);
1189 // Fill in result
1190 if (klass->is_instance_klass()) {
1191 // Regular instance klass, fill in all local interfaces
1192 for (int index = 0; index < size; index++) {
1193 Klass* k = InstanceKlass::cast(klass)->local_interfaces()->at(index);
1194 result->obj_at_put(index, k->java_mirror());
1195 }
1196 } else {
1197 // All arrays implement java.lang.Cloneable and java.io.Serializable
1198 result->obj_at_put(0, vmClasses::Cloneable_klass()->java_mirror());
1199 result->obj_at_put(1, vmClasses::Serializable_klass()->java_mirror());
1200 }
1201 return (jobjectArray) JNIHandles::make_local(THREAD, result());
1202 JVM_END
1203
1204
1205 JVM_ENTRY_PROF(jboolean, JVM_IsHiddenClass, JVM_IsHiddenClass(JNIEnv *env, jclass cls))
1206 oop mirror = JNIHandles::resolve_non_null(cls);
1207 if (java_lang_Class::is_primitive(mirror)) {
1208 return JNI_FALSE;
1209 }
1210 Klass* k = java_lang_Class::as_Klass(mirror);
1211 return k->is_hidden();
1212 JVM_END
1213
1214 class ScopedValueBindingsResolver {
1215 public:
1216 InstanceKlass* Carrier_klass;
1217 ScopedValueBindingsResolver(JavaThread* THREAD) {
1218 Klass *k = SystemDictionary::resolve_or_fail(vmSymbols::java_lang_ScopedValue_Carrier(), true, THREAD);
1219 Carrier_klass = InstanceKlass::cast(k);
1220 }
1221 };
1222
1223 JVM_ENTRY_PROF(jobject, JVM_FindScopedValueBindings, JVM_FindScopedValueBindings(JNIEnv *env, jclass cls))
1224 ResourceMark rm(THREAD);
1225 GrowableArray<Handle>* local_array = new GrowableArray<Handle>(12);
1226 JvmtiVMObjectAllocEventCollector oam;
1227
1228 static ScopedValueBindingsResolver resolver(THREAD);
1229
1230 // Iterate through Java frames
1231 vframeStream vfst(thread);
1232 for(; !vfst.at_end(); vfst.next()) {
1233 int loc = -1;
1234 // get method of frame
1235 Method* method = vfst.method();
1236
1237 Symbol *name = method->name();
1238
1239 InstanceKlass* holder = method->method_holder();
1240 if (name == vmSymbols::runWith_method_name()) {
1241 if (holder == vmClasses::Thread_klass()
1242 || holder == resolver.Carrier_klass) {
1243 loc = 1;
1244 }
1245 }
1246
1247 if (loc != -1) {
1248 javaVFrame *frame = vfst.asJavaVFrame();
1249 StackValueCollection* locals = frame->locals();
1250 StackValue* head_sv = locals->at(loc); // java/lang/ScopedValue$Snapshot
1251 Handle result = head_sv->get_obj();
1252 assert(!head_sv->obj_is_scalar_replaced(), "found scalar-replaced object");
1253 if (result() != nullptr) {
1254 return JNIHandles::make_local(THREAD, result());
1255 }
1256 }
1257 }
1258
1259 return nullptr;
1260 JVM_END
1261
1262
1263 JVM_ENTRY_PROF(jobjectArray, JVM_GetDeclaredClasses, JVM_GetDeclaredClasses(JNIEnv *env, jclass ofClass))
1264 JvmtiVMObjectAllocEventCollector oam;
1265 // ofClass is a reference to a java_lang_Class object. The mirror object
1266 // of an InstanceKlass
1267 oop ofMirror = JNIHandles::resolve_non_null(ofClass);
1268 if (java_lang_Class::is_primitive(ofMirror) ||
1269 ! java_lang_Class::as_Klass(ofMirror)->is_instance_klass()) {
1270 oop result = oopFactory::new_objArray(vmClasses::Class_klass(), 0, CHECK_NULL);
1271 return (jobjectArray)JNIHandles::make_local(THREAD, result);
1272 }
1273
1274 InstanceKlass* k = InstanceKlass::cast(java_lang_Class::as_Klass(ofMirror));
1275 InnerClassesIterator iter(k);
1276
1277 if (iter.length() == 0) {
1278 // Neither an inner nor outer class
1279 oop result = oopFactory::new_objArray(vmClasses::Class_klass(), 0, CHECK_NULL);
1280 return (jobjectArray)JNIHandles::make_local(THREAD, result);
1281 }
1282
1283 // find inner class info
1309 result->obj_at_put(members, inner_klass->java_mirror());
1310 members++;
1311 }
1312 }
1313 }
1314 }
1315
1316 if (members != length) {
1317 // Return array of right length
1318 objArrayOop res = oopFactory::new_objArray(vmClasses::Class_klass(), members, CHECK_NULL);
1319 for(int i = 0; i < members; i++) {
1320 res->obj_at_put(i, result->obj_at(i));
1321 }
1322 return (jobjectArray)JNIHandles::make_local(THREAD, res);
1323 }
1324
1325 return (jobjectArray)JNIHandles::make_local(THREAD, result());
1326 JVM_END
1327
1328
1329 JVM_ENTRY_PROF(jclass, JVM_GetDeclaringClass, JVM_GetDeclaringClass(JNIEnv *env, jclass ofClass))
1330 {
1331 // ofClass is a reference to a java_lang_Class object.
1332 oop ofMirror = JNIHandles::resolve_non_null(ofClass);
1333 if (java_lang_Class::is_primitive(ofMirror)) {
1334 return nullptr;
1335 }
1336 Klass* klass = java_lang_Class::as_Klass(ofMirror);
1337 if (!klass->is_instance_klass()) {
1338 return nullptr;
1339 }
1340
1341 bool inner_is_member = false;
1342 Klass* outer_klass
1343 = InstanceKlass::cast(klass)->compute_enclosing_class(&inner_is_member, CHECK_NULL);
1344 if (outer_klass == nullptr) return nullptr; // already a top-level class
1345 if (!inner_is_member) return nullptr; // a hidden class (inside a method)
1346 return (jclass) JNIHandles::make_local(THREAD, outer_klass->java_mirror());
1347 }
1348 JVM_END
1349
1350 JVM_ENTRY_PROF(jstring, JVM_GetSimpleBinaryName, JVM_GetSimpleBinaryName(JNIEnv *env, jclass cls))
1351 {
1352 oop mirror = JNIHandles::resolve_non_null(cls);
1353 if (java_lang_Class::is_primitive(mirror)) {
1354 return nullptr;
1355 }
1356 Klass* klass = java_lang_Class::as_Klass(mirror);
1357 if (!klass->is_instance_klass()) {
1358 return nullptr;
1359 }
1360 InstanceKlass* k = InstanceKlass::cast(klass);
1361 int ooff = 0, noff = 0;
1362 if (k->find_inner_classes_attr(&ooff, &noff, THREAD)) {
1363 if (noff != 0) {
1364 constantPoolHandle i_cp(thread, k->constants());
1365 Symbol* name = i_cp->symbol_at(noff);
1366 Handle str = java_lang_String::create_from_symbol(name, CHECK_NULL);
1367 return (jstring) JNIHandles::make_local(THREAD, str());
1368 }
1369 }
1370 return nullptr;
1371 }
1372 JVM_END
1373
1374 JVM_ENTRY_PROF(jstring, JVM_GetClassSignature, JVM_GetClassSignature(JNIEnv *env, jclass cls))
1375 assert (cls != nullptr, "illegal class");
1376 JvmtiVMObjectAllocEventCollector oam;
1377 ResourceMark rm(THREAD);
1378 oop mirror = JNIHandles::resolve_non_null(cls);
1379 // Return null for arrays and primitives
1380 if (!java_lang_Class::is_primitive(mirror)) {
1381 Klass* k = java_lang_Class::as_Klass(mirror);
1382 if (k->is_instance_klass()) {
1383 Symbol* sym = InstanceKlass::cast(k)->generic_signature();
1384 if (sym == nullptr) return nullptr;
1385 Handle str = java_lang_String::create_from_symbol(sym, CHECK_NULL);
1386 return (jstring) JNIHandles::make_local(THREAD, str());
1387 }
1388 }
1389 return nullptr;
1390 JVM_END
1391
1392
1393 JVM_ENTRY_PROF(jbyteArray, JVM_GetClassAnnotations, JVM_GetClassAnnotations(JNIEnv *env, jclass cls))
1394 assert (cls != nullptr, "illegal class");
1395 oop mirror = JNIHandles::resolve_non_null(cls);
1396 // Return null for arrays and primitives
1397 if (!java_lang_Class::is_primitive(mirror)) {
1398 Klass* k = java_lang_Class::as_Klass(mirror);
1399 if (k->is_instance_klass()) {
1400 typeArrayOop a = Annotations::make_java_array(InstanceKlass::cast(k)->class_annotations(), CHECK_NULL);
1401 return (jbyteArray) JNIHandles::make_local(THREAD, a);
1402 }
1403 }
1404 return nullptr;
1405 JVM_END
1406
1407
1408 static bool jvm_get_field_common(jobject field, fieldDescriptor& fd) {
1409 // some of this code was adapted from from jni_FromReflectedField
1410
1411 oop reflected = JNIHandles::resolve_non_null(field);
1412 oop mirror = java_lang_reflect_Field::clazz(reflected);
1413 Klass* k = java_lang_Class::as_Klass(mirror);
1442 int slot = 0;
1443
1444 if (reflected->klass() == vmClasses::reflect_Constructor_klass()) {
1445 mirror = java_lang_reflect_Constructor::clazz(reflected);
1446 slot = java_lang_reflect_Constructor::slot(reflected);
1447 } else {
1448 assert(reflected->klass() == vmClasses::reflect_Method_klass(),
1449 "wrong type");
1450 mirror = java_lang_reflect_Method::clazz(reflected);
1451 slot = java_lang_reflect_Method::slot(reflected);
1452 }
1453 Klass* k = java_lang_Class::as_Klass(mirror);
1454
1455 Method* m = InstanceKlass::cast(k)->method_with_idnum(slot);
1456 assert(m != nullptr, "cannot find method");
1457 return m; // caller has to deal with null in product mode
1458 }
1459
1460 /* Type use annotations support (JDK 1.8) */
1461
1462 JVM_ENTRY_PROF(jbyteArray, JVM_GetClassTypeAnnotations, JVM_GetClassTypeAnnotations(JNIEnv *env, jclass cls))
1463 assert (cls != nullptr, "illegal class");
1464 ResourceMark rm(THREAD);
1465 // Return null for arrays and primitives
1466 if (!java_lang_Class::is_primitive(JNIHandles::resolve(cls))) {
1467 Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve(cls));
1468 if (k->is_instance_klass()) {
1469 AnnotationArray* type_annotations = InstanceKlass::cast(k)->class_type_annotations();
1470 if (type_annotations != nullptr) {
1471 typeArrayOop a = Annotations::make_java_array(type_annotations, CHECK_NULL);
1472 return (jbyteArray) JNIHandles::make_local(THREAD, a);
1473 }
1474 }
1475 }
1476 return nullptr;
1477 JVM_END
1478
1479 JVM_ENTRY_PROF(jbyteArray, JVM_GetMethodTypeAnnotations, JVM_GetMethodTypeAnnotations(JNIEnv *env, jobject method))
1480 assert (method != nullptr, "illegal method");
1481 // method is a handle to a java.lang.reflect.Method object
1482 Method* m = jvm_get_method_common(method);
1483 if (m == nullptr) {
1484 return nullptr;
1485 }
1486
1487 AnnotationArray* type_annotations = m->type_annotations();
1488 if (type_annotations != nullptr) {
1489 typeArrayOop a = Annotations::make_java_array(type_annotations, CHECK_NULL);
1490 return (jbyteArray) JNIHandles::make_local(THREAD, a);
1491 }
1492
1493 return nullptr;
1494 JVM_END
1495
1496 JVM_ENTRY_PROF(jbyteArray, JVM_GetFieldTypeAnnotations, JVM_GetFieldTypeAnnotations(JNIEnv *env, jobject field))
1497 assert (field != nullptr, "illegal field");
1498 fieldDescriptor fd;
1499 bool gotFd = jvm_get_field_common(field, fd);
1500 if (!gotFd) {
1501 return nullptr;
1502 }
1503
1504 return (jbyteArray) JNIHandles::make_local(THREAD, Annotations::make_java_array(fd.type_annotations(), THREAD));
1505 JVM_END
1506
1507 static void bounds_check(const constantPoolHandle& cp, jint index, TRAPS) {
1508 if (!cp->is_within_bounds(index)) {
1509 THROW_MSG(vmSymbols::java_lang_IllegalArgumentException(), "Constant pool index out of bounds");
1510 }
1511 }
1512
1513 JVM_ENTRY_PROF(jobjectArray, JVM_GetMethodParameters, JVM_GetMethodParameters(JNIEnv *env, jobject method))
1514 {
1515 // method is a handle to a java.lang.reflect.Method object
1516 Method* method_ptr = jvm_get_method_common(method);
1517 methodHandle mh (THREAD, method_ptr);
1518 Handle reflected_method (THREAD, JNIHandles::resolve_non_null(method));
1519 const int num_params = mh->method_parameters_length();
1520
1521 if (num_params < 0) {
1522 // A -1 return value from method_parameters_length means there is no
1523 // parameter data. Return null to indicate this to the reflection
1524 // API.
1525 assert(num_params == -1, "num_params should be -1 if it is less than zero");
1526 return (jobjectArray)nullptr;
1527 } else {
1528 // Otherwise, we return something up to reflection, even if it is
1529 // a zero-length array. Why? Because in some cases this can
1530 // trigger a MalformedParametersException.
1531
1532 // make sure all the symbols are properly formatted
1533 for (int i = 0; i < num_params; i++) {
1546 objArrayOop result_oop = oopFactory::new_objArray(vmClasses::reflect_Parameter_klass(), num_params, CHECK_NULL);
1547 objArrayHandle result (THREAD, result_oop);
1548
1549 for (int i = 0; i < num_params; i++) {
1550 MethodParametersElement* params = mh->method_parameters_start();
1551 // For a 0 index, give a null symbol
1552 Symbol* sym = 0 != params[i].name_cp_index ?
1553 mh->constants()->symbol_at(params[i].name_cp_index) : nullptr;
1554 int flags = params[i].flags;
1555 oop param = Reflection::new_parameter(reflected_method, i, sym,
1556 flags, CHECK_NULL);
1557 result->obj_at_put(i, param);
1558 }
1559 return (jobjectArray)JNIHandles::make_local(THREAD, result());
1560 }
1561 }
1562 JVM_END
1563
1564 // New (JDK 1.4) reflection implementation /////////////////////////////////////
1565
1566 JVM_ENTRY_PROF(jobjectArray, JVM_GetClassDeclaredFields, JVM_GetClassDeclaredFields(JNIEnv *env, jclass ofClass, jboolean publicOnly))
1567 {
1568 JvmtiVMObjectAllocEventCollector oam;
1569
1570 oop ofMirror = JNIHandles::resolve_non_null(ofClass);
1571 // Exclude primitive types and array types
1572 if (java_lang_Class::is_primitive(ofMirror) ||
1573 java_lang_Class::as_Klass(ofMirror)->is_array_klass()) {
1574 // Return empty array
1575 oop res = oopFactory::new_objArray(vmClasses::reflect_Field_klass(), 0, CHECK_NULL);
1576 return (jobjectArray) JNIHandles::make_local(THREAD, res);
1577 }
1578
1579 InstanceKlass* k = InstanceKlass::cast(java_lang_Class::as_Klass(ofMirror));
1580 constantPoolHandle cp(THREAD, k->constants());
1581
1582 // Ensure class is linked
1583 k->link_class(CHECK_NULL);
1584
1585 // Allocate result
1586 int num_fields;
1597 objArrayOop r = oopFactory::new_objArray(vmClasses::reflect_Field_klass(), num_fields, CHECK_NULL);
1598 objArrayHandle result (THREAD, r);
1599
1600 int out_idx = 0;
1601 fieldDescriptor fd;
1602 for (JavaFieldStream fs(k); !fs.done(); fs.next()) {
1603 if (!publicOnly || fs.access_flags().is_public()) {
1604 fd.reinitialize(k, fs.index());
1605 oop field = Reflection::new_field(&fd, CHECK_NULL);
1606 result->obj_at_put(out_idx, field);
1607 ++out_idx;
1608 }
1609 }
1610 assert(out_idx == num_fields, "just checking");
1611 return (jobjectArray) JNIHandles::make_local(THREAD, result());
1612 }
1613 JVM_END
1614
1615 // A class is a record if and only if it is final and a direct subclass of
1616 // java.lang.Record and has a Record attribute; otherwise, it is not a record.
1617 JVM_ENTRY_PROF(jboolean, JVM_IsRecord, JVM_IsRecord(JNIEnv *env, jclass cls))
1618 {
1619 Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(cls));
1620 if (k != nullptr && k->is_instance_klass()) {
1621 InstanceKlass* ik = InstanceKlass::cast(k);
1622 return ik->is_record();
1623 } else {
1624 return false;
1625 }
1626 }
1627 JVM_END
1628
1629 // Returns an array containing the components of the Record attribute,
1630 // or null if the attribute is not present.
1631 //
1632 // Note that this function returns the components of the Record attribute
1633 // even if the class is not a record.
1634 JVM_ENTRY_PROF(jobjectArray, JVM_GetRecordComponents, JVM_GetRecordComponents(JNIEnv* env, jclass ofClass))
1635 {
1636 Klass* c = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(ofClass));
1637 assert(c->is_instance_klass(), "must be");
1638 InstanceKlass* ik = InstanceKlass::cast(c);
1639
1640 Array<RecordComponent*>* components = ik->record_components();
1641 if (components != nullptr) {
1642 JvmtiVMObjectAllocEventCollector oam;
1643 constantPoolHandle cp(THREAD, ik->constants());
1644 int length = components->length();
1645 assert(length >= 0, "unexpected record_components length");
1646 objArrayOop record_components =
1647 oopFactory::new_objArray(vmClasses::RecordComponent_klass(), length, CHECK_NULL);
1648 objArrayHandle components_h (THREAD, record_components);
1649
1650 for (int x = 0; x < length; x++) {
1651 RecordComponent* component = components->at(x);
1652 assert(component != nullptr, "unexpected null record component");
1653 oop component_oop = java_lang_reflect_RecordComponent::create(ik, component, CHECK_NULL);
1654 components_h->obj_at_put(x, component_oop);
1721 for (int i = 0; i < num_methods; i++) {
1722 methodHandle method(THREAD, k->method_with_idnum(idnums->at(i)));
1723 if (method.is_null()) {
1724 // Method may have been deleted and seems this API can handle null
1725 // Otherwise should probably put a method that throws NSME
1726 result->obj_at_put(i, nullptr);
1727 } else {
1728 oop m;
1729 if (want_constructor) {
1730 m = Reflection::new_constructor(method, CHECK_NULL);
1731 } else {
1732 m = Reflection::new_method(method, false, CHECK_NULL);
1733 }
1734 result->obj_at_put(i, m);
1735 }
1736 }
1737
1738 return (jobjectArray) JNIHandles::make_local(THREAD, result());
1739 }
1740
1741 JVM_ENTRY_PROF(jobjectArray, JVM_GetClassDeclaredMethods, JVM_GetClassDeclaredMethods(JNIEnv *env, jclass ofClass, jboolean publicOnly))
1742 {
1743 return get_class_declared_methods_helper(env, ofClass, publicOnly,
1744 /*want_constructor*/ false,
1745 vmClasses::reflect_Method_klass(), THREAD);
1746 }
1747 JVM_END
1748
1749 JVM_ENTRY_PROF(jobjectArray, JVM_GetClassDeclaredConstructors, JVM_GetClassDeclaredConstructors(JNIEnv *env, jclass ofClass, jboolean publicOnly))
1750 {
1751 return get_class_declared_methods_helper(env, ofClass, publicOnly,
1752 /*want_constructor*/ true,
1753 vmClasses::reflect_Constructor_klass(), THREAD);
1754 }
1755 JVM_END
1756
1757 JVM_ENTRY_PROF(jint, JVM_GetClassAccessFlags, JVM_GetClassAccessFlags(JNIEnv *env, jclass cls))
1758 {
1759 oop mirror = JNIHandles::resolve_non_null(cls);
1760 if (java_lang_Class::is_primitive(mirror)) {
1761 // Primitive type
1762 return JVM_ACC_ABSTRACT | JVM_ACC_FINAL | JVM_ACC_PUBLIC;
1763 }
1764
1765 Klass* k = java_lang_Class::as_Klass(mirror);
1766 return k->access_flags().as_class_flags();
1767 }
1768 JVM_END
1769
1770 JVM_ENTRY_PROF(jboolean, JVM_AreNestMates, JVM_AreNestMates(JNIEnv *env, jclass current, jclass member))
1771 {
1772 Klass* c = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(current));
1773 assert(c->is_instance_klass(), "must be");
1774 InstanceKlass* ck = InstanceKlass::cast(c);
1775 Klass* m = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(member));
1776 assert(m->is_instance_klass(), "must be");
1777 InstanceKlass* mk = InstanceKlass::cast(m);
1778 return ck->has_nestmate_access_to(mk, THREAD);
1779 }
1780 JVM_END
1781
1782 JVM_ENTRY_PROF(jclass, JVM_GetNestHost, JVM_GetNestHost(JNIEnv* env, jclass current))
1783 {
1784 // current is not a primitive or array class
1785 Klass* c = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(current));
1786 assert(c->is_instance_klass(), "must be");
1787 InstanceKlass* ck = InstanceKlass::cast(c);
1788 InstanceKlass* host = ck->nest_host(THREAD);
1789 return (jclass) (host == nullptr ? nullptr :
1790 JNIHandles::make_local(THREAD, host->java_mirror()));
1791 }
1792 JVM_END
1793
1794 JVM_ENTRY_PROF(jobjectArray, JVM_GetNestMembers, JVM_GetNestMembers(JNIEnv* env, jclass current))
1795 {
1796 // current is not a primitive or array class
1797 ResourceMark rm(THREAD);
1798 Klass* c = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(current));
1799 assert(c->is_instance_klass(), "must be");
1800 InstanceKlass* ck = InstanceKlass::cast(c);
1801 InstanceKlass* host = ck->nest_host(THREAD);
1802
1803 log_trace(class, nestmates)("Calling GetNestMembers for type %s with nest-host %s",
1804 ck->external_name(), host->external_name());
1805 {
1806 JvmtiVMObjectAllocEventCollector oam;
1807 Array<u2>* members = host->nest_members();
1808 int length = members == nullptr ? 0 : members->length();
1809
1810 log_trace(class, nestmates)(" - host has %d listed nest members", length);
1811
1812 // nest host is first in the array so make it one bigger
1813 objArrayOop r = oopFactory::new_objArray(vmClasses::Class_klass(),
1814 length + 1, CHECK_NULL);
1854 log_trace(class, nestmates)(" - compacting array from length %d to %d",
1855 length + 1, count + 1);
1856
1857 objArrayOop r2 = oopFactory::new_objArray(vmClasses::Class_klass(),
1858 count + 1, CHECK_NULL);
1859 objArrayHandle result2(THREAD, r2);
1860 for (int i = 0; i < count + 1; i++) {
1861 result2->obj_at_put(i, result->obj_at(i));
1862 }
1863 return (jobjectArray)JNIHandles::make_local(THREAD, result2());
1864 }
1865 }
1866 else {
1867 assert(host == ck || ck->is_hidden(), "must be singleton nest or dynamic nestmate");
1868 }
1869 return (jobjectArray)JNIHandles::make_local(THREAD, result());
1870 }
1871 }
1872 JVM_END
1873
1874 JVM_ENTRY_PROF(jobjectArray, JVM_GetPermittedSubclasses, JVM_GetPermittedSubclasses(JNIEnv* env, jclass current))
1875 {
1876 oop mirror = JNIHandles::resolve_non_null(current);
1877 assert(!java_lang_Class::is_primitive(mirror), "should not be");
1878 Klass* c = java_lang_Class::as_Klass(mirror);
1879 assert(c->is_instance_klass(), "must be");
1880 InstanceKlass* ik = InstanceKlass::cast(c);
1881 ResourceMark rm(THREAD);
1882 log_trace(class, sealed)("Calling GetPermittedSubclasses for %s type %s",
1883 ik->is_sealed() ? "sealed" : "non-sealed", ik->external_name());
1884 if (ik->is_sealed()) {
1885 JvmtiVMObjectAllocEventCollector oam;
1886 Array<u2>* subclasses = ik->permitted_subclasses();
1887 int length = subclasses->length();
1888
1889 log_trace(class, sealed)(" - sealed class has %d permitted subclasses", length);
1890
1891 objArrayOop r = oopFactory::new_objArray(vmClasses::Class_klass(),
1892 length, CHECK_NULL);
1893 objArrayHandle result(THREAD, r);
1894 int count = 0;
1917 }
1918 if (count < length) {
1919 // we had invalid entries so we need to compact the array
1920 objArrayOop r2 = oopFactory::new_objArray(vmClasses::Class_klass(),
1921 count, CHECK_NULL);
1922 objArrayHandle result2(THREAD, r2);
1923 for (int i = 0; i < count; i++) {
1924 result2->obj_at_put(i, result->obj_at(i));
1925 }
1926 return (jobjectArray)JNIHandles::make_local(THREAD, result2());
1927 }
1928 return (jobjectArray)JNIHandles::make_local(THREAD, result());
1929 } else {
1930 return nullptr;
1931 }
1932 }
1933 JVM_END
1934
1935 // Constant pool access //////////////////////////////////////////////////////////
1936
1937 JVM_ENTRY_PROF(jobject, JVM_GetClassConstantPool, JVM_GetClassConstantPool(JNIEnv *env, jclass cls))
1938 {
1939 JvmtiVMObjectAllocEventCollector oam;
1940 oop mirror = JNIHandles::resolve_non_null(cls);
1941 // Return null for primitives and arrays
1942 if (!java_lang_Class::is_primitive(mirror)) {
1943 Klass* k = java_lang_Class::as_Klass(mirror);
1944 if (k->is_instance_klass()) {
1945 InstanceKlass* k_h = InstanceKlass::cast(k);
1946 Handle jcp = reflect_ConstantPool::create(CHECK_NULL);
1947 reflect_ConstantPool::set_cp(jcp(), k_h->constants());
1948 return JNIHandles::make_local(THREAD, jcp());
1949 }
1950 }
1951 return nullptr;
1952 }
1953 JVM_END
1954
1955
1956 JVM_ENTRY_PROF(jint, JVM_ConstantPoolGetSize, JVM_ConstantPoolGetSize(JNIEnv *env, jobject obj, jobject unused))
1957 {
1958 constantPoolHandle cp = constantPoolHandle(THREAD, reflect_ConstantPool::get_cp(JNIHandles::resolve_non_null(obj)));
1959 return cp->length();
1960 }
1961 JVM_END
1962
1963
1964 JVM_ENTRY_PROF(jclass, JVM_ConstantPoolGetClassAt, JVM_ConstantPoolGetClassAt(JNIEnv *env, jobject obj, jobject unused, jint index))
1965 {
1966 constantPoolHandle cp = constantPoolHandle(THREAD, reflect_ConstantPool::get_cp(JNIHandles::resolve_non_null(obj)));
1967 bounds_check(cp, index, CHECK_NULL);
1968 constantTag tag = cp->tag_at(index);
1969 if (!tag.is_klass() && !tag.is_unresolved_klass()) {
1970 THROW_MSG_NULL(vmSymbols::java_lang_IllegalArgumentException(), "Wrong type at constant pool index");
1971 }
1972 Klass* k = cp->klass_at(index, CHECK_NULL);
1973 return (jclass) JNIHandles::make_local(THREAD, k->java_mirror());
1974 }
1975 JVM_END
1976
1977 JVM_ENTRY_PROF(jclass, JVM_ConstantPoolGetClassAtIfLoaded, JVM_ConstantPoolGetClassAtIfLoaded(JNIEnv *env, jobject obj, jobject unused, jint index))
1978 {
1979 constantPoolHandle cp = constantPoolHandle(THREAD, reflect_ConstantPool::get_cp(JNIHandles::resolve_non_null(obj)));
1980 bounds_check(cp, index, CHECK_NULL);
1981 constantTag tag = cp->tag_at(index);
1982 if (!tag.is_klass() && !tag.is_unresolved_klass()) {
1983 THROW_MSG_NULL(vmSymbols::java_lang_IllegalArgumentException(), "Wrong type at constant pool index");
1984 }
1985 Klass* k = ConstantPool::klass_at_if_loaded(cp, index);
1986 if (k == nullptr) return nullptr;
1987 return (jclass) JNIHandles::make_local(THREAD, k->java_mirror());
1988 }
1989 JVM_END
1990
1991 static jobject get_method_at_helper(const constantPoolHandle& cp, jint index, bool force_resolution, TRAPS) {
1992 constantTag tag = cp->tag_at(index);
1993 if (!tag.is_method() && !tag.is_interface_method()) {
1994 THROW_MSG_NULL(vmSymbols::java_lang_IllegalArgumentException(), "Wrong type at constant pool index");
1995 }
1996 int klass_ref = cp->uncached_klass_ref_index_at(index);
1997 Klass* k_o;
2001 k_o = ConstantPool::klass_at_if_loaded(cp, klass_ref);
2002 if (k_o == nullptr) return nullptr;
2003 }
2004 InstanceKlass* k = InstanceKlass::cast(k_o);
2005 Symbol* name = cp->uncached_name_ref_at(index);
2006 Symbol* sig = cp->uncached_signature_ref_at(index);
2007 methodHandle m (THREAD, k->find_method(name, sig));
2008 if (m.is_null()) {
2009 THROW_MSG_NULL(vmSymbols::java_lang_RuntimeException(), "Unable to look up method in target class");
2010 }
2011 oop method;
2012 if (m->is_object_initializer()) {
2013 method = Reflection::new_constructor(m, CHECK_NULL);
2014 } else {
2015 // new_method accepts <clinit> as Method here
2016 method = Reflection::new_method(m, true, CHECK_NULL);
2017 }
2018 return JNIHandles::make_local(THREAD, method);
2019 }
2020
2021 JVM_ENTRY_PROF(jobject, JVM_ConstantPoolGetMethodAt, JVM_ConstantPoolGetMethodAt(JNIEnv *env, jobject obj, jobject unused, jint index))
2022 {
2023 JvmtiVMObjectAllocEventCollector oam;
2024 constantPoolHandle cp = constantPoolHandle(THREAD, reflect_ConstantPool::get_cp(JNIHandles::resolve_non_null(obj)));
2025 bounds_check(cp, index, CHECK_NULL);
2026 jobject res = get_method_at_helper(cp, index, true, CHECK_NULL);
2027 return res;
2028 }
2029 JVM_END
2030
2031 JVM_ENTRY_PROF(jobject, JVM_ConstantPoolGetMethodAtIfLoaded, JVM_ConstantPoolGetMethodAtIfLoaded(JNIEnv *env, jobject obj, jobject unused, jint index))
2032 {
2033 JvmtiVMObjectAllocEventCollector oam;
2034 constantPoolHandle cp = constantPoolHandle(THREAD, reflect_ConstantPool::get_cp(JNIHandles::resolve_non_null(obj)));
2035 bounds_check(cp, index, CHECK_NULL);
2036 jobject res = get_method_at_helper(cp, index, false, CHECK_NULL);
2037 return res;
2038 }
2039 JVM_END
2040
2041 static jobject get_field_at_helper(constantPoolHandle cp, jint index, bool force_resolution, TRAPS) {
2042 constantTag tag = cp->tag_at(index);
2043 if (!tag.is_field()) {
2044 THROW_MSG_NULL(vmSymbols::java_lang_IllegalArgumentException(), "Wrong type at constant pool index");
2045 }
2046 int klass_ref = cp->uncached_klass_ref_index_at(index);
2047 Klass* k_o;
2048 if (force_resolution) {
2049 k_o = cp->klass_at(klass_ref, CHECK_NULL);
2050 } else {
2051 k_o = ConstantPool::klass_at_if_loaded(cp, klass_ref);
2052 if (k_o == nullptr) return nullptr;
2053 }
2054 InstanceKlass* k = InstanceKlass::cast(k_o);
2055 Symbol* name = cp->uncached_name_ref_at(index);
2056 Symbol* sig = cp->uncached_signature_ref_at(index);
2057 fieldDescriptor fd;
2058 Klass* target_klass = k->find_field(name, sig, &fd);
2059 if (target_klass == nullptr) {
2060 THROW_MSG_NULL(vmSymbols::java_lang_RuntimeException(), "Unable to look up field in target class");
2061 }
2062 oop field = Reflection::new_field(&fd, CHECK_NULL);
2063 return JNIHandles::make_local(THREAD, field);
2064 }
2065
2066 JVM_ENTRY_PROF(jobject, JVM_ConstantPoolGetFieldAt, JVM_ConstantPoolGetFieldAt(JNIEnv *env, jobject obj, jobject unusedl, jint index))
2067 {
2068 JvmtiVMObjectAllocEventCollector oam;
2069 constantPoolHandle cp = constantPoolHandle(THREAD, reflect_ConstantPool::get_cp(JNIHandles::resolve_non_null(obj)));
2070 bounds_check(cp, index, CHECK_NULL);
2071 jobject res = get_field_at_helper(cp, index, true, CHECK_NULL);
2072 return res;
2073 }
2074 JVM_END
2075
2076 JVM_ENTRY_PROF(jobject, JVM_ConstantPoolGetFieldAtIfLoaded, JVM_ConstantPoolGetFieldAtIfLoaded(JNIEnv *env, jobject obj, jobject unused, jint index))
2077 {
2078 JvmtiVMObjectAllocEventCollector oam;
2079 constantPoolHandle cp = constantPoolHandle(THREAD, reflect_ConstantPool::get_cp(JNIHandles::resolve_non_null(obj)));
2080 bounds_check(cp, index, CHECK_NULL);
2081 jobject res = get_field_at_helper(cp, index, false, CHECK_NULL);
2082 return res;
2083 }
2084 JVM_END
2085
2086 JVM_ENTRY_PROF(jobjectArray, JVM_ConstantPoolGetMemberRefInfoAt, JVM_ConstantPoolGetMemberRefInfoAt(JNIEnv *env, jobject obj, jobject unused, jint index))
2087 {
2088 JvmtiVMObjectAllocEventCollector oam;
2089 constantPoolHandle cp = constantPoolHandle(THREAD, reflect_ConstantPool::get_cp(JNIHandles::resolve_non_null(obj)));
2090 bounds_check(cp, index, CHECK_NULL);
2091 constantTag tag = cp->tag_at(index);
2092 if (!tag.is_field_or_method()) {
2093 THROW_MSG_NULL(vmSymbols::java_lang_IllegalArgumentException(), "Wrong type at constant pool index");
2094 }
2095 int klass_ref = cp->uncached_klass_ref_index_at(index);
2096 Symbol* klass_name = cp->klass_name_at(klass_ref);
2097 Symbol* member_name = cp->uncached_name_ref_at(index);
2098 Symbol* member_sig = cp->uncached_signature_ref_at(index);
2099 objArrayOop dest_o = oopFactory::new_objArray(vmClasses::String_klass(), 3, CHECK_NULL);
2100 objArrayHandle dest(THREAD, dest_o);
2101 Handle str = java_lang_String::create_from_symbol(klass_name, CHECK_NULL);
2102 dest->obj_at_put(0, str());
2103 str = java_lang_String::create_from_symbol(member_name, CHECK_NULL);
2104 dest->obj_at_put(1, str());
2105 str = java_lang_String::create_from_symbol(member_sig, CHECK_NULL);
2106 dest->obj_at_put(2, str());
2107 return (jobjectArray) JNIHandles::make_local(THREAD, dest());
2108 }
2109 JVM_END
2110
2111 JVM_ENTRY_PROF(jint, JVM_ConstantPoolGetClassRefIndexAt, JVM_ConstantPoolGetClassRefIndexAt(JNIEnv *env, jobject obj, jobject unused, jint index))
2112 {
2113 JvmtiVMObjectAllocEventCollector oam;
2114 constantPoolHandle cp(THREAD, reflect_ConstantPool::get_cp(JNIHandles::resolve_non_null(obj)));
2115 bounds_check(cp, index, CHECK_0);
2116 constantTag tag = cp->tag_at(index);
2117 if (!tag.is_field_or_method()) {
2118 THROW_MSG_0(vmSymbols::java_lang_IllegalArgumentException(), "Wrong type at constant pool index");
2119 }
2120 return (jint) cp->uncached_klass_ref_index_at(index);
2121 }
2122 JVM_END
2123
2124 JVM_ENTRY_PROF(jint, JVM_ConstantPoolGetNameAndTypeRefIndexAt, JVM_ConstantPoolGetNameAndTypeRefIndexAt(JNIEnv *env, jobject obj, jobject unused, jint index))
2125 {
2126 JvmtiVMObjectAllocEventCollector oam;
2127 constantPoolHandle cp(THREAD, reflect_ConstantPool::get_cp(JNIHandles::resolve_non_null(obj)));
2128 bounds_check(cp, index, CHECK_0);
2129 constantTag tag = cp->tag_at(index);
2130 if (!tag.is_invoke_dynamic() && !tag.is_field_or_method()) {
2131 THROW_MSG_0(vmSymbols::java_lang_IllegalArgumentException(), "Wrong type at constant pool index");
2132 }
2133 return (jint) cp->uncached_name_and_type_ref_index_at(index);
2134 }
2135 JVM_END
2136
2137 JVM_ENTRY_PROF(jobjectArray, JVM_ConstantPoolGetNameAndTypeRefInfoAt, JVM_ConstantPoolGetNameAndTypeRefInfoAt(JNIEnv *env, jobject obj, jobject unused, jint index))
2138 {
2139 JvmtiVMObjectAllocEventCollector oam;
2140 constantPoolHandle cp(THREAD, reflect_ConstantPool::get_cp(JNIHandles::resolve_non_null(obj)));
2141 bounds_check(cp, index, CHECK_NULL);
2142 constantTag tag = cp->tag_at(index);
2143 if (!tag.is_name_and_type()) {
2144 THROW_MSG_NULL(vmSymbols::java_lang_IllegalArgumentException(), "Wrong type at constant pool index");
2145 }
2146 Symbol* member_name = cp->symbol_at(cp->name_ref_index_at(index));
2147 Symbol* member_sig = cp->symbol_at(cp->signature_ref_index_at(index));
2148 objArrayOop dest_o = oopFactory::new_objArray(vmClasses::String_klass(), 2, CHECK_NULL);
2149 objArrayHandle dest(THREAD, dest_o);
2150 Handle str = java_lang_String::create_from_symbol(member_name, CHECK_NULL);
2151 dest->obj_at_put(0, str());
2152 str = java_lang_String::create_from_symbol(member_sig, CHECK_NULL);
2153 dest->obj_at_put(1, str());
2154 return (jobjectArray) JNIHandles::make_local(THREAD, dest());
2155 }
2156 JVM_END
2157
2158 JVM_ENTRY_PROF(jint, JVM_ConstantPoolGetIntAt, JVM_ConstantPoolGetIntAt(JNIEnv *env, jobject obj, jobject unused, jint index))
2159 {
2160 constantPoolHandle cp = constantPoolHandle(THREAD, reflect_ConstantPool::get_cp(JNIHandles::resolve_non_null(obj)));
2161 bounds_check(cp, index, CHECK_0);
2162 constantTag tag = cp->tag_at(index);
2163 if (!tag.is_int()) {
2164 THROW_MSG_0(vmSymbols::java_lang_IllegalArgumentException(), "Wrong type at constant pool index");
2165 }
2166 return cp->int_at(index);
2167 }
2168 JVM_END
2169
2170 JVM_ENTRY_PROF(jlong, JVM_ConstantPoolGetLongAt, JVM_ConstantPoolGetLongAt(JNIEnv *env, jobject obj, jobject unused, jint index))
2171 {
2172 constantPoolHandle cp = constantPoolHandle(THREAD, reflect_ConstantPool::get_cp(JNIHandles::resolve_non_null(obj)));
2173 bounds_check(cp, index, CHECK_(0L));
2174 constantTag tag = cp->tag_at(index);
2175 if (!tag.is_long()) {
2176 THROW_MSG_0(vmSymbols::java_lang_IllegalArgumentException(), "Wrong type at constant pool index");
2177 }
2178 return cp->long_at(index);
2179 }
2180 JVM_END
2181
2182 JVM_ENTRY_PROF(jfloat, JVM_ConstantPoolGetFloatAt, JVM_ConstantPoolGetFloatAt(JNIEnv *env, jobject obj, jobject unused, jint index))
2183 {
2184 constantPoolHandle cp = constantPoolHandle(THREAD, reflect_ConstantPool::get_cp(JNIHandles::resolve_non_null(obj)));
2185 bounds_check(cp, index, CHECK_(0.0f));
2186 constantTag tag = cp->tag_at(index);
2187 if (!tag.is_float()) {
2188 THROW_MSG_0(vmSymbols::java_lang_IllegalArgumentException(), "Wrong type at constant pool index");
2189 }
2190 return cp->float_at(index);
2191 }
2192 JVM_END
2193
2194 JVM_ENTRY_PROF(jdouble, JVM_ConstantPoolGetDoubleAt, JVM_ConstantPoolGetDoubleAt(JNIEnv *env, jobject obj, jobject unused, jint index))
2195 {
2196 constantPoolHandle cp = constantPoolHandle(THREAD, reflect_ConstantPool::get_cp(JNIHandles::resolve_non_null(obj)));
2197 bounds_check(cp, index, CHECK_(0.0));
2198 constantTag tag = cp->tag_at(index);
2199 if (!tag.is_double()) {
2200 THROW_MSG_0(vmSymbols::java_lang_IllegalArgumentException(), "Wrong type at constant pool index");
2201 }
2202 return cp->double_at(index);
2203 }
2204 JVM_END
2205
2206 JVM_ENTRY_PROF(jstring, JVM_ConstantPoolGetStringAt, JVM_ConstantPoolGetStringAt(JNIEnv *env, jobject obj, jobject unused, jint index))
2207 {
2208 constantPoolHandle cp = constantPoolHandle(THREAD, reflect_ConstantPool::get_cp(JNIHandles::resolve_non_null(obj)));
2209 bounds_check(cp, index, CHECK_NULL);
2210 constantTag tag = cp->tag_at(index);
2211 if (!tag.is_string()) {
2212 THROW_MSG_NULL(vmSymbols::java_lang_IllegalArgumentException(), "Wrong type at constant pool index");
2213 }
2214 oop str = cp->string_at(index, CHECK_NULL);
2215 return (jstring) JNIHandles::make_local(THREAD, str);
2216 }
2217 JVM_END
2218
2219 JVM_ENTRY_PROF(jstring, JVM_ConstantPoolGetUTF8At, JVM_ConstantPoolGetUTF8At(JNIEnv *env, jobject obj, jobject unused, jint index))
2220 {
2221 JvmtiVMObjectAllocEventCollector oam;
2222 constantPoolHandle cp = constantPoolHandle(THREAD, reflect_ConstantPool::get_cp(JNIHandles::resolve_non_null(obj)));
2223 bounds_check(cp, index, CHECK_NULL);
2224 constantTag tag = cp->tag_at(index);
2225 if (!tag.is_symbol()) {
2226 THROW_MSG_NULL(vmSymbols::java_lang_IllegalArgumentException(), "Wrong type at constant pool index");
2227 }
2228 Symbol* sym = cp->symbol_at(index);
2229 Handle str = java_lang_String::create_from_symbol(sym, CHECK_NULL);
2230 return (jstring) JNIHandles::make_local(THREAD, str());
2231 }
2232 JVM_END
2233
2234 JVM_ENTRY_PROF(jbyte, JVM_ConstantPoolGetTagAt, JVM_ConstantPoolGetTagAt(JNIEnv *env, jobject obj, jobject unused, jint index))
2235 {
2236 constantPoolHandle cp = constantPoolHandle(THREAD, reflect_ConstantPool::get_cp(JNIHandles::resolve_non_null(obj)));
2237 bounds_check(cp, index, CHECK_0);
2238 constantTag tag = cp->tag_at(index);
2239 jbyte result = tag.value();
2240 // If returned tag values are not from the JVM spec, e.g. tags from 100 to 105,
2241 // they are changed to the corresponding tags from the JVM spec, so that java code in
2242 // sun.reflect.ConstantPool will return only tags from the JVM spec, not internal ones.
2243 if (tag.is_klass_or_reference()) {
2244 result = JVM_CONSTANT_Class;
2245 } else if (tag.is_string_index()) {
2246 result = JVM_CONSTANT_String;
2247 } else if (tag.is_method_type_in_error()) {
2248 result = JVM_CONSTANT_MethodType;
2249 } else if (tag.is_method_handle_in_error()) {
2250 result = JVM_CONSTANT_MethodHandle;
2251 } else if (tag.is_dynamic_constant_in_error()) {
2252 result = JVM_CONSTANT_Dynamic;
2253 }
2254 return result;
2255 }
2256 JVM_END
2257
2258 // Assertion support. //////////////////////////////////////////////////////////
2259
2260 JVM_ENTRY_PROF(jboolean, JVM_DesiredAssertionStatus, JVM_DesiredAssertionStatus(JNIEnv *env, jclass unused, jclass cls))
2261 assert(cls != nullptr, "bad class");
2262
2263 oop r = JNIHandles::resolve(cls);
2264 assert(! java_lang_Class::is_primitive(r), "primitive classes not allowed");
2265 if (java_lang_Class::is_primitive(r)) return false;
2266
2267 Klass* k = java_lang_Class::as_Klass(r);
2268 assert(k->is_instance_klass(), "must be an instance klass");
2269 if (!k->is_instance_klass()) return false;
2270
2271 ResourceMark rm(THREAD);
2272 const char* name = k->name()->as_C_string();
2273 bool system_class = k->class_loader() == nullptr;
2274 return JavaAssertions::enabled(name, system_class);
2275
2276 JVM_END
2277
2278
2279 // Return a new AssertionStatusDirectives object with the fields filled in with
2280 // command-line assertion arguments (i.e., -ea, -da).
2281 JVM_ENTRY_PROF(jobject, JVM_AssertionStatusDirectives, JVM_AssertionStatusDirectives(JNIEnv *env, jclass unused))
2282 JvmtiVMObjectAllocEventCollector oam;
2283 oop asd = JavaAssertions::createAssertionStatusDirectives(CHECK_NULL);
2284 return JNIHandles::make_local(THREAD, asd);
2285 JVM_END
2286
2287 // Verification ////////////////////////////////////////////////////////////////////////////////
2288
2289 // Reflection for the verifier /////////////////////////////////////////////////////////////////
2290
2291 // RedefineClasses support: bug 6214132 caused verification to fail.
2292 // All functions from this section should call the jvmtiThreadSate function:
2293 // Klass* class_to_verify_considering_redefinition(Klass* klass).
2294 // The function returns a Klass* of the _scratch_class if the verifier
2295 // was invoked in the middle of the class redefinition.
2296 // Otherwise it returns its argument value which is the _the_class Klass*.
2297 // Please, refer to the description in the jvmtiThreadState.hpp.
2298
2299 JVM_ENTRY_PROF(jboolean, JVM_IsInterface, JVM_IsInterface(JNIEnv *env, jclass cls))
2300 oop mirror = JNIHandles::resolve_non_null(cls);
2301 if (java_lang_Class::is_primitive(mirror)) {
2302 return JNI_FALSE;
2303 }
2304 Klass* k = java_lang_Class::as_Klass(mirror);
2305 // This isn't necessary since answer is the same since redefinition
2306 // has already checked this matches for the scratch class.
2307 // k = JvmtiThreadState::class_to_verify_considering_redefinition(k, thread);
2308 jboolean result = k->is_interface();
2309 assert(!result || k->is_instance_klass(),
2310 "all interfaces are instance types");
2311 return result;
2312 JVM_END
2313
2314
2315 JVM_ENTRY_PROF(const char*, JVM_GetClassNameUTF, JVM_GetClassNameUTF(JNIEnv *env, jclass cls))
2316 Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(cls));
2317 k = JvmtiThreadState::class_to_verify_considering_redefinition(k, thread);
2318 return k->name()->as_utf8();
2319 JVM_END
2320
2321
2322 JVM_ENTRY_PROF(void, JVM_GetClassCPTypes, JVM_GetClassCPTypes(JNIEnv *env, jclass cls, unsigned char *types))
2323 Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(cls));
2324 k = JvmtiThreadState::class_to_verify_considering_redefinition(k, thread);
2325 // types will have length zero if this is not an InstanceKlass
2326 // (length is determined by call to JVM_GetClassCPEntriesCount)
2327 if (k->is_instance_klass()) {
2328 ConstantPool* cp = InstanceKlass::cast(k)->constants();
2329 for (int index = cp->length() - 1; index >= 0; index--) {
2330 constantTag tag = cp->tag_at(index);
2331 types[index] = (tag.is_unresolved_klass()) ? (unsigned char) JVM_CONSTANT_Class : tag.value();
2332 }
2333 }
2334 JVM_END
2335
2336
2337 JVM_ENTRY_PROF(jint, JVM_GetClassCPEntriesCount, JVM_GetClassCPEntriesCount(JNIEnv *env, jclass cls))
2338 Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(cls));
2339 k = JvmtiThreadState::class_to_verify_considering_redefinition(k, thread);
2340 return (!k->is_instance_klass()) ? 0 : InstanceKlass::cast(k)->constants()->length();
2341 JVM_END
2342
2343
2344 JVM_ENTRY_PROF(jint, JVM_GetClassFieldsCount, JVM_GetClassFieldsCount(JNIEnv *env, jclass cls))
2345 Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(cls));
2346 k = JvmtiThreadState::class_to_verify_considering_redefinition(k, thread);
2347 return (!k->is_instance_klass()) ? 0 : InstanceKlass::cast(k)->java_fields_count();
2348 JVM_END
2349
2350
2351 JVM_ENTRY_PROF(jint, JVM_GetClassMethodsCount, JVM_GetClassMethodsCount(JNIEnv *env, jclass cls))
2352 Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(cls));
2353 k = JvmtiThreadState::class_to_verify_considering_redefinition(k, thread);
2354 return (!k->is_instance_klass()) ? 0 : InstanceKlass::cast(k)->methods()->length();
2355 JVM_END
2356
2357
2358 // The following methods, used for the verifier, are never called with
2359 // array klasses, so a direct cast to InstanceKlass is safe.
2360 // Typically, these methods are called in a loop with bounds determined
2361 // by the results of JVM_GetClass{Fields,Methods}Count, which return
2362 // zero for arrays.
2363 JVM_ENTRY_PROF(void, JVM_GetMethodIxExceptionIndexes, JVM_GetMethodIxExceptionIndexes(JNIEnv *env, jclass cls, jint method_index, unsigned short *exceptions))
2364 Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(cls));
2365 k = JvmtiThreadState::class_to_verify_considering_redefinition(k, thread);
2366 Method* method = InstanceKlass::cast(k)->methods()->at(method_index);
2367 int length = method->checked_exceptions_length();
2368 if (length > 0) {
2369 CheckedExceptionElement* table= method->checked_exceptions_start();
2370 for (int i = 0; i < length; i++) {
2371 exceptions[i] = table[i].class_cp_index;
2372 }
2373 }
2374 JVM_END
2375
2376
2377 JVM_ENTRY_PROF(jint, JVM_GetMethodIxExceptionsCount, JVM_GetMethodIxExceptionsCount(JNIEnv *env, jclass cls, jint method_index))
2378 Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(cls));
2379 k = JvmtiThreadState::class_to_verify_considering_redefinition(k, thread);
2380 Method* method = InstanceKlass::cast(k)->methods()->at(method_index);
2381 return method->checked_exceptions_length();
2382 JVM_END
2383
2384
2385 JVM_ENTRY_PROF(void, JVM_GetMethodIxByteCode, JVM_GetMethodIxByteCode(JNIEnv *env, jclass cls, jint method_index, unsigned char *code))
2386 Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(cls));
2387 k = JvmtiThreadState::class_to_verify_considering_redefinition(k, thread);
2388 Method* method = InstanceKlass::cast(k)->methods()->at(method_index);
2389 memcpy(code, method->code_base(), method->code_size());
2390 JVM_END
2391
2392
2393 JVM_ENTRY_PROF(jint, JVM_GetMethodIxByteCodeLength, JVM_GetMethodIxByteCodeLength(JNIEnv *env, jclass cls, jint method_index))
2394 Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(cls));
2395 k = JvmtiThreadState::class_to_verify_considering_redefinition(k, thread);
2396 Method* method = InstanceKlass::cast(k)->methods()->at(method_index);
2397 return method->code_size();
2398 JVM_END
2399
2400
2401 JVM_ENTRY_PROF(void, JVM_GetMethodIxExceptionTableEntry, JVM_GetMethodIxExceptionTableEntry(JNIEnv *env, jclass cls, jint method_index, jint entry_index, JVM_ExceptionTableEntryType *entry))
2402 Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(cls));
2403 k = JvmtiThreadState::class_to_verify_considering_redefinition(k, thread);
2404 Method* method = InstanceKlass::cast(k)->methods()->at(method_index);
2405 ExceptionTable extable(method);
2406 entry->start_pc = extable.start_pc(entry_index);
2407 entry->end_pc = extable.end_pc(entry_index);
2408 entry->handler_pc = extable.handler_pc(entry_index);
2409 entry->catchType = extable.catch_type_index(entry_index);
2410 JVM_END
2411
2412
2413 JVM_ENTRY_PROF(jint, JVM_GetMethodIxExceptionTableLength, JVM_GetMethodIxExceptionTableLength(JNIEnv *env, jclass cls, int method_index))
2414 Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(cls));
2415 k = JvmtiThreadState::class_to_verify_considering_redefinition(k, thread);
2416 Method* method = InstanceKlass::cast(k)->methods()->at(method_index);
2417 return method->exception_table_length();
2418 JVM_END
2419
2420
2421 JVM_ENTRY_PROF(jint, JVM_GetMethodIxModifiers, JVM_GetMethodIxModifiers(JNIEnv *env, jclass cls, int method_index))
2422 Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(cls));
2423 k = JvmtiThreadState::class_to_verify_considering_redefinition(k, thread);
2424 Method* method = InstanceKlass::cast(k)->methods()->at(method_index);
2425 return method->access_flags().as_method_flags();
2426 JVM_END
2427
2428
2429 JVM_ENTRY_PROF(jint, JVM_GetFieldIxModifiers, JVM_GetFieldIxModifiers(JNIEnv *env, jclass cls, int field_index))
2430 Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(cls));
2431 k = JvmtiThreadState::class_to_verify_considering_redefinition(k, thread);
2432 return InstanceKlass::cast(k)->field_access_flags(field_index);
2433 JVM_END
2434
2435
2436 JVM_ENTRY_PROF(jint, JVM_GetMethodIxLocalsCount, JVM_GetMethodIxLocalsCount(JNIEnv *env, jclass cls, int method_index))
2437 Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(cls));
2438 k = JvmtiThreadState::class_to_verify_considering_redefinition(k, thread);
2439 Method* method = InstanceKlass::cast(k)->methods()->at(method_index);
2440 return method->max_locals();
2441 JVM_END
2442
2443
2444 JVM_ENTRY_PROF(jint, JVM_GetMethodIxArgsSize, JVM_GetMethodIxArgsSize(JNIEnv *env, jclass cls, int method_index))
2445 Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(cls));
2446 k = JvmtiThreadState::class_to_verify_considering_redefinition(k, thread);
2447 Method* method = InstanceKlass::cast(k)->methods()->at(method_index);
2448 return method->size_of_parameters();
2449 JVM_END
2450
2451
2452 JVM_ENTRY_PROF(jint, JVM_GetMethodIxMaxStack, JVM_GetMethodIxMaxStack(JNIEnv *env, jclass cls, int method_index))
2453 Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(cls));
2454 k = JvmtiThreadState::class_to_verify_considering_redefinition(k, thread);
2455 Method* method = InstanceKlass::cast(k)->methods()->at(method_index);
2456 return method->verifier_max_stack();
2457 JVM_END
2458
2459
2460 JVM_ENTRY_PROF(jboolean, JVM_IsConstructorIx, JVM_IsConstructorIx(JNIEnv *env, jclass cls, int method_index))
2461 ResourceMark rm(THREAD);
2462 Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(cls));
2463 k = JvmtiThreadState::class_to_verify_considering_redefinition(k, thread);
2464 Method* method = InstanceKlass::cast(k)->methods()->at(method_index);
2465 return method->name() == vmSymbols::object_initializer_name();
2466 JVM_END
2467
2468
2469 JVM_ENTRY_PROF(jboolean, JVM_IsVMGeneratedMethodIx, JVM_IsVMGeneratedMethodIx(JNIEnv *env, jclass cls, int method_index))
2470 ResourceMark rm(THREAD);
2471 Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(cls));
2472 k = JvmtiThreadState::class_to_verify_considering_redefinition(k, thread);
2473 Method* method = InstanceKlass::cast(k)->methods()->at(method_index);
2474 return method->is_overpass();
2475 JVM_END
2476
2477 JVM_ENTRY_PROF(const char*, JVM_GetMethodIxNameUTF, JVM_GetMethodIxNameUTF(JNIEnv *env, jclass cls, jint method_index))
2478 Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(cls));
2479 k = JvmtiThreadState::class_to_verify_considering_redefinition(k, thread);
2480 Method* method = InstanceKlass::cast(k)->methods()->at(method_index);
2481 return method->name()->as_utf8();
2482 JVM_END
2483
2484
2485 JVM_ENTRY_PROF(const char*, JVM_GetMethodIxSignatureUTF, JVM_GetMethodIxSignatureUTF(JNIEnv *env, jclass cls, jint method_index))
2486 Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(cls));
2487 k = JvmtiThreadState::class_to_verify_considering_redefinition(k, thread);
2488 Method* method = InstanceKlass::cast(k)->methods()->at(method_index);
2489 return method->signature()->as_utf8();
2490 JVM_END
2491
2492 /**
2493 * All of these JVM_GetCP-xxx methods are used by the old verifier to
2494 * read entries in the constant pool. Since the old verifier always
2495 * works on a copy of the code, it will not see any rewriting that
2496 * may possibly occur in the middle of verification. So it is important
2497 * that nothing it calls tries to use the cpCache instead of the raw
2498 * constant pool, so we must use cp->uncached_x methods when appropriate.
2499 */
2500 JVM_ENTRY_PROF(const char*, JVM_GetCPFieldNameUTF, JVM_GetCPFieldNameUTF(JNIEnv *env, jclass cls, jint cp_index))
2501 Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(cls));
2502 k = JvmtiThreadState::class_to_verify_considering_redefinition(k, thread);
2503 ConstantPool* cp = InstanceKlass::cast(k)->constants();
2504 switch (cp->tag_at(cp_index).value()) {
2505 case JVM_CONSTANT_Fieldref:
2506 return cp->uncached_name_ref_at(cp_index)->as_utf8();
2507 default:
2508 fatal("JVM_GetCPFieldNameUTF: illegal constant");
2509 }
2510 ShouldNotReachHere();
2511 return nullptr;
2512 JVM_END
2513
2514
2515 JVM_ENTRY_PROF(const char*, JVM_GetCPMethodNameUTF, JVM_GetCPMethodNameUTF(JNIEnv *env, jclass cls, jint cp_index))
2516 Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(cls));
2517 k = JvmtiThreadState::class_to_verify_considering_redefinition(k, thread);
2518 ConstantPool* cp = InstanceKlass::cast(k)->constants();
2519 switch (cp->tag_at(cp_index).value()) {
2520 case JVM_CONSTANT_InterfaceMethodref:
2521 case JVM_CONSTANT_Methodref:
2522 return cp->uncached_name_ref_at(cp_index)->as_utf8();
2523 default:
2524 fatal("JVM_GetCPMethodNameUTF: illegal constant");
2525 }
2526 ShouldNotReachHere();
2527 return nullptr;
2528 JVM_END
2529
2530
2531 JVM_ENTRY_PROF(const char*, JVM_GetCPMethodSignatureUTF, JVM_GetCPMethodSignatureUTF(JNIEnv *env, jclass cls, jint cp_index))
2532 Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(cls));
2533 k = JvmtiThreadState::class_to_verify_considering_redefinition(k, thread);
2534 ConstantPool* cp = InstanceKlass::cast(k)->constants();
2535 switch (cp->tag_at(cp_index).value()) {
2536 case JVM_CONSTANT_InterfaceMethodref:
2537 case JVM_CONSTANT_Methodref:
2538 return cp->uncached_signature_ref_at(cp_index)->as_utf8();
2539 default:
2540 fatal("JVM_GetCPMethodSignatureUTF: illegal constant");
2541 }
2542 ShouldNotReachHere();
2543 return nullptr;
2544 JVM_END
2545
2546
2547 JVM_ENTRY_PROF(const char*, JVM_GetCPFieldSignatureUTF, JVM_GetCPFieldSignatureUTF(JNIEnv *env, jclass cls, jint cp_index))
2548 Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(cls));
2549 k = JvmtiThreadState::class_to_verify_considering_redefinition(k, thread);
2550 ConstantPool* cp = InstanceKlass::cast(k)->constants();
2551 switch (cp->tag_at(cp_index).value()) {
2552 case JVM_CONSTANT_Fieldref:
2553 return cp->uncached_signature_ref_at(cp_index)->as_utf8();
2554 default:
2555 fatal("JVM_GetCPFieldSignatureUTF: illegal constant");
2556 }
2557 ShouldNotReachHere();
2558 return nullptr;
2559 JVM_END
2560
2561
2562 JVM_ENTRY_PROF(const char*, JVM_GetCPClassNameUTF, JVM_GetCPClassNameUTF(JNIEnv *env, jclass cls, jint cp_index))
2563 Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(cls));
2564 k = JvmtiThreadState::class_to_verify_considering_redefinition(k, thread);
2565 ConstantPool* cp = InstanceKlass::cast(k)->constants();
2566 Symbol* classname = cp->klass_name_at(cp_index);
2567 return classname->as_utf8();
2568 JVM_END
2569
2570
2571 JVM_ENTRY_PROF(const char*, JVM_GetCPFieldClassNameUTF, JVM_GetCPFieldClassNameUTF(JNIEnv *env, jclass cls, jint cp_index))
2572 Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(cls));
2573 k = JvmtiThreadState::class_to_verify_considering_redefinition(k, thread);
2574 ConstantPool* cp = InstanceKlass::cast(k)->constants();
2575 switch (cp->tag_at(cp_index).value()) {
2576 case JVM_CONSTANT_Fieldref: {
2577 int class_index = cp->uncached_klass_ref_index_at(cp_index);
2578 Symbol* classname = cp->klass_name_at(class_index);
2579 return classname->as_utf8();
2580 }
2581 default:
2582 fatal("JVM_GetCPFieldClassNameUTF: illegal constant");
2583 }
2584 ShouldNotReachHere();
2585 return nullptr;
2586 JVM_END
2587
2588
2589 JVM_ENTRY_PROF(const char*, JVM_GetCPMethodClassNameUTF, JVM_GetCPMethodClassNameUTF(JNIEnv *env, jclass cls, jint cp_index))
2590 Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(cls));
2591 k = JvmtiThreadState::class_to_verify_considering_redefinition(k, thread);
2592 ConstantPool* cp = InstanceKlass::cast(k)->constants();
2593 switch (cp->tag_at(cp_index).value()) {
2594 case JVM_CONSTANT_Methodref:
2595 case JVM_CONSTANT_InterfaceMethodref: {
2596 int class_index = cp->uncached_klass_ref_index_at(cp_index);
2597 Symbol* classname = cp->klass_name_at(class_index);
2598 return classname->as_utf8();
2599 }
2600 default:
2601 fatal("JVM_GetCPMethodClassNameUTF: illegal constant");
2602 }
2603 ShouldNotReachHere();
2604 return nullptr;
2605 JVM_END
2606
2607
2608 JVM_ENTRY_PROF(jint, JVM_GetCPFieldModifiers, JVM_GetCPFieldModifiers(JNIEnv *env, jclass cls, int cp_index, jclass called_cls))
2609 Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(cls));
2610 Klass* k_called = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(called_cls));
2611 k = JvmtiThreadState::class_to_verify_considering_redefinition(k, thread);
2612 k_called = JvmtiThreadState::class_to_verify_considering_redefinition(k_called, thread);
2613 ConstantPool* cp = InstanceKlass::cast(k)->constants();
2614 ConstantPool* cp_called = InstanceKlass::cast(k_called)->constants();
2615 switch (cp->tag_at(cp_index).value()) {
2616 case JVM_CONSTANT_Fieldref: {
2617 Symbol* name = cp->uncached_name_ref_at(cp_index);
2618 Symbol* signature = cp->uncached_signature_ref_at(cp_index);
2619 InstanceKlass* ik = InstanceKlass::cast(k_called);
2620 for (JavaFieldStream fs(ik); !fs.done(); fs.next()) {
2621 if (fs.name() == name && fs.signature() == signature) {
2622 return fs.access_flags().as_field_flags();
2623 }
2624 }
2625 return -1;
2626 }
2627 default:
2628 fatal("JVM_GetCPFieldModifiers: illegal constant");
2629 }
2630 ShouldNotReachHere();
2631 return 0;
2632 JVM_END
2633
2634
2635 JVM_ENTRY_PROF(jint, JVM_GetCPMethodModifiers, JVM_GetCPMethodModifiers(JNIEnv *env, jclass cls, int cp_index, jclass called_cls))
2636 Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(cls));
2637 Klass* k_called = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(called_cls));
2638 k = JvmtiThreadState::class_to_verify_considering_redefinition(k, thread);
2639 k_called = JvmtiThreadState::class_to_verify_considering_redefinition(k_called, thread);
2640 ConstantPool* cp = InstanceKlass::cast(k)->constants();
2641 switch (cp->tag_at(cp_index).value()) {
2642 case JVM_CONSTANT_Methodref:
2643 case JVM_CONSTANT_InterfaceMethodref: {
2644 Symbol* name = cp->uncached_name_ref_at(cp_index);
2645 Symbol* signature = cp->uncached_signature_ref_at(cp_index);
2646 Array<Method*>* methods = InstanceKlass::cast(k_called)->methods();
2647 int methods_count = methods->length();
2648 for (int i = 0; i < methods_count; i++) {
2649 Method* method = methods->at(i);
2650 if (method->name() == name && method->signature() == signature) {
2651 return method->access_flags().as_method_flags();
2652 }
2653 }
2654 return -1;
2655 }
2656 default:
2657 fatal("JVM_GetCPMethodModifiers: illegal constant");
2658 }
2659 ShouldNotReachHere();
2660 return 0;
2661 JVM_END
2662
2663
2664 // Misc //////////////////////////////////////////////////////////////////////////////////////////////
2665
2666 JVM_LEAF_PROF(void, JVM_ReleaseUTF, JVM_ReleaseUTF(const char *utf))
2667 // So long as UTF8::convert_to_utf8 returns resource strings, we don't have to do anything
2668 JVM_END
2669
2670
2671 JVM_ENTRY_PROF(jboolean, JVM_IsSameClassPackage, JVM_IsSameClassPackage(JNIEnv *env, jclass class1, jclass class2))
2672 oop class1_mirror = JNIHandles::resolve_non_null(class1);
2673 oop class2_mirror = JNIHandles::resolve_non_null(class2);
2674 Klass* klass1 = java_lang_Class::as_Klass(class1_mirror);
2675 Klass* klass2 = java_lang_Class::as_Klass(class2_mirror);
2676 return (jboolean) Reflection::is_same_class_package(klass1, klass2);
2677 JVM_END
2678
2679 // Printing support //////////////////////////////////////////////////
2680 extern "C" {
2681
2682 ATTRIBUTE_PRINTF(3, 0)
2683 int jio_vsnprintf(char *str, size_t count, const char *fmt, va_list args) {
2684 // Reject count values that are negative signed values converted to
2685 // unsigned; see bug 4399518, 4417214
2686 if ((intptr_t)count <= 0) return -1;
2687
2688 int result = os::vsnprintf(str, count, fmt, args);
2689 if (result > 0 && (size_t)result >= count) {
2690 result = -1;
2691 }
2750 // In most of the JVM thread support functions we need to access the
2751 // thread through a ThreadsListHandle to prevent it from exiting and
2752 // being reclaimed while we try to operate on it. The exceptions to this
2753 // rule are when operating on the current thread, or if the monitor of
2754 // the target java.lang.Thread is locked at the Java level - in both
2755 // cases the target cannot exit.
2756
2757 static void thread_entry(JavaThread* thread, TRAPS) {
2758 HandleMark hm(THREAD);
2759 Handle obj(THREAD, thread->threadObj());
2760 JavaValue result(T_VOID);
2761 JavaCalls::call_virtual(&result,
2762 obj,
2763 vmClasses::Thread_klass(),
2764 vmSymbols::run_method_name(),
2765 vmSymbols::void_method_signature(),
2766 THREAD);
2767 }
2768
2769
2770 JVM_ENTRY_PROF(void, JVM_StartThread, JVM_StartThread(JNIEnv* env, jobject jthread))
2771 #if INCLUDE_CDS
2772 if (CDSConfig::allow_only_single_java_thread()) {
2773 // During java -Xshare:dump, if we allow multiple Java threads to
2774 // execute in parallel, symbols and classes may be loaded in
2775 // random orders which will make the resulting CDS archive
2776 // non-deterministic.
2777 //
2778 // Lucikly, during java -Xshare:dump, it's important to run only
2779 // the code in the main Java thread (which is NOT started here) that
2780 // creates the module graph, etc. It's safe to not start the other
2781 // threads which are launched by class static initializers
2782 // (ReferenceHandler, FinalizerThread and CleanerImpl).
2783 if (log_is_enabled(Info, cds)) {
2784 ResourceMark rm;
2785 oop t = JNIHandles::resolve_non_null(jthread);
2786 log_info(cds)("JVM_StartThread() ignored: %s", t->klass()->external_name());
2787 }
2788 return;
2789 }
2790 #endif
2847 log_warning(os, thread)("Failed to start the native thread for java.lang.Thread \"%s\"",
2848 JavaThread::name_for(JNIHandles::resolve_non_null(jthread)));
2849 // No one should hold a reference to the 'native_thread'.
2850 native_thread->smr_delete();
2851 if (JvmtiExport::should_post_resource_exhausted()) {
2852 JvmtiExport::post_resource_exhausted(
2853 JVMTI_RESOURCE_EXHAUSTED_OOM_ERROR | JVMTI_RESOURCE_EXHAUSTED_THREADS,
2854 os::native_thread_creation_failed_msg());
2855 }
2856 THROW_MSG(vmSymbols::java_lang_OutOfMemoryError(),
2857 os::native_thread_creation_failed_msg());
2858 }
2859
2860 JFR_ONLY(Jfr::on_java_thread_start(thread, native_thread);)
2861
2862 Thread::start(native_thread);
2863
2864 JVM_END
2865
2866
2867 JVM_ENTRY_PROF(void, JVM_SetThreadPriority, JVM_SetThreadPriority(JNIEnv* env, jobject jthread, jint prio))
2868 ThreadsListHandle tlh(thread);
2869 oop java_thread = nullptr;
2870 JavaThread* receiver = nullptr;
2871 bool is_alive = tlh.cv_internal_thread_to_JavaThread(jthread, &receiver, &java_thread);
2872 java_lang_Thread::set_priority(java_thread, (ThreadPriority)prio);
2873
2874 if (is_alive) {
2875 // jthread refers to a live JavaThread.
2876 Thread::set_priority(receiver, (ThreadPriority)prio);
2877 }
2878 // Implied else: If the JavaThread hasn't started yet, then the
2879 // priority set in the java.lang.Thread object above will be pushed
2880 // down when it does start.
2881 JVM_END
2882
2883
2884 JVM_LEAF_PROF(void, JVM_Yield, JVM_Yield(JNIEnv *env, jclass threadClass))
2885 HOTSPOT_THREAD_YIELD();
2886 os::naked_yield();
2887 JVM_END
2888
2889 JVM_ENTRY_PROF(void, JVM_SleepNanos, JVM_SleepNanos(JNIEnv* env, jclass threadClass, jlong nanos))
2890 if (nanos < 0) {
2891 THROW_MSG(vmSymbols::java_lang_IllegalArgumentException(), "nanosecond timeout value out of range");
2892 }
2893
2894 if (thread->is_interrupted(true) && !HAS_PENDING_EXCEPTION) {
2895 THROW_MSG(vmSymbols::java_lang_InterruptedException(), "sleep interrupted");
2896 }
2897
2898 // Save current thread state and restore it at the end of this block.
2899 // And set new thread state to SLEEPING.
2900 JavaThreadSleepState jtss(thread);
2901
2902 HOTSPOT_THREAD_SLEEP_BEGIN(nanos / NANOSECS_PER_MILLISEC);
2903
2904 if (nanos == 0) {
2905 os::naked_yield();
2906 } else {
2907 ThreadState old_state = thread->osthread()->get_state();
2908 thread->osthread()->set_state(SLEEPING);
2909 if (!thread->sleep_nanos(nanos)) { // interrupted
2910 // An asynchronous exception could have been thrown on
2911 // us while we were sleeping. We do not overwrite those.
2912 if (!HAS_PENDING_EXCEPTION) {
2913 HOTSPOT_THREAD_SLEEP_END(1);
2914
2915 // TODO-FIXME: THROW_MSG returns which means we will not call set_state()
2916 // to properly restore the thread state. That's likely wrong.
2917 THROW_MSG(vmSymbols::java_lang_InterruptedException(), "sleep interrupted");
2918 }
2919 }
2920 thread->osthread()->set_state(old_state);
2921 }
2922 HOTSPOT_THREAD_SLEEP_END(0);
2923 JVM_END
2924
2925 JVM_ENTRY_PROF(jobject, JVM_CurrentCarrierThread, JVM_CurrentCarrierThread(JNIEnv* env, jclass threadClass))
2926 oop jthread = thread->threadObj();
2927 assert(jthread != nullptr, "no current carrier thread!");
2928 return JNIHandles::make_local(THREAD, jthread);
2929 JVM_END
2930
2931 JVM_ENTRY_PROF(jobject, JVM_CurrentThread, JVM_CurrentThread(JNIEnv* env, jclass threadClass))
2932 oop theThread = thread->vthread();
2933 assert(theThread != (oop)nullptr, "no current thread!");
2934 return JNIHandles::make_local(THREAD, theThread);
2935 JVM_END
2936
2937 JVM_ENTRY_PROF(void, JVM_SetCurrentThread, JVM_SetCurrentThread(JNIEnv* env, jobject thisThread,
2938 jobject theThread))
2939 oop threadObj = JNIHandles::resolve(theThread);
2940 thread->set_vthread(threadObj);
2941
2942 // Set _monitor_owner_id of new current Thread
2943 thread->set_monitor_owner_id(java_lang_Thread::thread_id(threadObj));
2944
2945 JFR_ONLY(Jfr::on_set_current_thread(thread, threadObj);)
2946 JVM_END
2947
2948 JVM_ENTRY_PROF(jlong, JVM_GetNextThreadIdOffset, JVM_GetNextThreadIdOffset(JNIEnv* env, jclass threadClass))
2949 return ThreadIdentifier::unsafe_offset();
2950 JVM_END
2951
2952 JVM_ENTRY_PROF(void, JVM_Interrupt, JVM_Interrupt(JNIEnv* env, jobject jthread))
2953 ThreadsListHandle tlh(thread);
2954 JavaThread* receiver = nullptr;
2955 bool is_alive = tlh.cv_internal_thread_to_JavaThread(jthread, &receiver, nullptr);
2956 if (is_alive) {
2957 // jthread refers to a live JavaThread.
2958 receiver->interrupt();
2959 }
2960 JVM_END
2961
2962 // Return true iff the current thread has locked the object passed in
2963
2964 JVM_ENTRY_PROF(jboolean, JVM_HoldsLock, JVM_HoldsLock(JNIEnv* env, jclass threadClass, jobject obj))
2965 if (obj == nullptr) {
2966 THROW_(vmSymbols::java_lang_NullPointerException(), JNI_FALSE);
2967 }
2968 Handle h_obj(THREAD, JNIHandles::resolve(obj));
2969 return ObjectSynchronizer::current_thread_holds_lock(thread, h_obj);
2970 JVM_END
2971
2972 JVM_ENTRY_PROF(jobject, JVM_GetStackTrace, JVM_GetStackTrace(JNIEnv *env, jobject jthread))
2973 oop trace = java_lang_Thread::async_get_stack_trace(JNIHandles::resolve(jthread), THREAD);
2974 return JNIHandles::make_local(THREAD, trace);
2975 JVM_END
2976
2977
2978 JVM_ENTRY_PROF(void, JVM_SetNativeThreadName, JVM_SetNativeThreadName(JNIEnv* env, jobject jthread, jstring name))
2979 // We don't use a ThreadsListHandle here because the current thread
2980 // must be alive.
2981 oop java_thread = JNIHandles::resolve_non_null(jthread);
2982 JavaThread* thr = java_lang_Thread::thread(java_thread);
2983 if (thread == thr && !thr->has_attached_via_jni()) {
2984 // Thread naming is only supported for the current thread and
2985 // we don't set the name of an attached thread to avoid stepping
2986 // on other programs.
2987 ResourceMark rm(thread);
2988 const char *thread_name = java_lang_String::as_utf8_string(JNIHandles::resolve_non_null(name));
2989 os::set_native_thread_name(thread_name);
2990 }
2991 JVM_END
2992
2993 JVM_ENTRY_PROF(jobject, JVM_ScopedValueCache, JVM_ScopedValueCache(JNIEnv* env, jclass threadClass))
2994 oop theCache = thread->scopedValueCache();
2995 return JNIHandles::make_local(THREAD, theCache);
2996 JVM_END
2997
2998 JVM_ENTRY_PROF(void, JVM_SetScopedValueCache, JVM_SetScopedValueCache(JNIEnv* env, jclass threadClass,
2999 jobject theCache))
3000 arrayOop objs = arrayOop(JNIHandles::resolve(theCache));
3001 thread->set_scopedValueCache(objs);
3002 JVM_END
3003
3004 // java.lang.Package ////////////////////////////////////////////////////////////////
3005
3006
3007 JVM_ENTRY_PROF(jstring, JVM_GetSystemPackage, JVM_GetSystemPackage(JNIEnv *env, jstring name))
3008 ResourceMark rm(THREAD);
3009 JvmtiVMObjectAllocEventCollector oam;
3010 char* str = java_lang_String::as_utf8_string(JNIHandles::resolve_non_null(name));
3011 oop result = ClassLoader::get_system_package(str, CHECK_NULL);
3012 return (jstring) JNIHandles::make_local(THREAD, result);
3013 JVM_END
3014
3015
3016 JVM_ENTRY_PROF(jobjectArray, JVM_GetSystemPackages, JVM_GetSystemPackages(JNIEnv *env))
3017 JvmtiVMObjectAllocEventCollector oam;
3018 objArrayOop result = ClassLoader::get_system_packages(CHECK_NULL);
3019 return (jobjectArray) JNIHandles::make_local(THREAD, result);
3020 JVM_END
3021
3022
3023 // java.lang.ref.Reference ///////////////////////////////////////////////////////////////
3024
3025
3026 JVM_ENTRY_PROF(jobject, JVM_GetAndClearReferencePendingList, JVM_GetAndClearReferencePendingList(JNIEnv* env))
3027 MonitorLocker ml(Heap_lock);
3028 oop ref = Universe::reference_pending_list();
3029 if (ref != nullptr) {
3030 Universe::clear_reference_pending_list();
3031 }
3032 return JNIHandles::make_local(THREAD, ref);
3033 JVM_END
3034
3035 JVM_ENTRY_PROF(jboolean, JVM_HasReferencePendingList, JVM_HasReferencePendingList(JNIEnv* env))
3036 MonitorLocker ml(Heap_lock);
3037 return Universe::has_reference_pending_list();
3038 JVM_END
3039
3040 JVM_ENTRY_PROF(void, JVM_WaitForReferencePendingList, JVM_WaitForReferencePendingList(JNIEnv* env))
3041 MonitorLocker ml(Heap_lock);
3042 while (!Universe::has_reference_pending_list()) {
3043 ml.wait();
3044 }
3045 JVM_END
3046
3047 JVM_ENTRY_PROF(jboolean, JVM_ReferenceRefersTo, JVM_ReferenceRefersTo(JNIEnv* env, jobject ref, jobject o))
3048 oop ref_oop = JNIHandles::resolve_non_null(ref);
3049 // PhantomReference has it's own implementation of refersTo().
3050 // See: JVM_PhantomReferenceRefersTo
3051 assert(!java_lang_ref_Reference::is_phantom(ref_oop), "precondition");
3052 oop referent = java_lang_ref_Reference::weak_referent_no_keepalive(ref_oop);
3053 return referent == JNIHandles::resolve(o);
3054 JVM_END
3055
3056 JVM_ENTRY_PROF(void, JVM_ReferenceClear, JVM_ReferenceClear(JNIEnv* env, jobject ref))
3057 oop ref_oop = JNIHandles::resolve_non_null(ref);
3058 // FinalReference has it's own implementation of clear().
3059 assert(!java_lang_ref_Reference::is_final(ref_oop), "precondition");
3060 if (java_lang_ref_Reference::unknown_referent_no_keepalive(ref_oop) == nullptr) {
3061 // If the referent has already been cleared then done.
3062 // However, if the referent is dead but has not yet been cleared by
3063 // concurrent reference processing, it should NOT be cleared here.
3064 // Instead, clearing should be left to the GC. Clearing it here could
3065 // detectably lose an expected notification, which is impossible with
3066 // STW reference processing. The clearing in enqueue() doesn't have
3067 // this problem, since the enqueue covers the notification, but it's not
3068 // worth the effort to handle that case specially.
3069 return;
3070 }
3071 java_lang_ref_Reference::clear_referent(ref_oop);
3072 JVM_END
3073
3074
3075 // java.lang.ref.PhantomReference //////////////////////////////////////////////////
3076
3077
3078 JVM_ENTRY_PROF(jboolean, JVM_PhantomReferenceRefersTo, JVM_PhantomReferenceRefersTo(JNIEnv* env, jobject ref, jobject o))
3079 oop ref_oop = JNIHandles::resolve_non_null(ref);
3080 oop referent = java_lang_ref_Reference::phantom_referent_no_keepalive(ref_oop);
3081 return referent == JNIHandles::resolve(o);
3082 JVM_END
3083
3084
3085 // ObjectInputStream ///////////////////////////////////////////////////////////////
3086
3087 // Return the first user-defined class loader up the execution stack, or null
3088 // if only code from the bootstrap or platform class loader is on the stack.
3089
3090 JVM_ENTRY_PROF(jobject, JVM_LatestUserDefinedLoader, JVM_LatestUserDefinedLoader(JNIEnv *env))
3091 for (vframeStream vfst(thread); !vfst.at_end(); vfst.next()) {
3092 InstanceKlass* ik = vfst.method()->method_holder();
3093 oop loader = ik->class_loader();
3094 if (loader != nullptr && !SystemDictionary::is_platform_class_loader(loader)) {
3095 return JNIHandles::make_local(THREAD, loader);
3096 }
3097 }
3098 return nullptr;
3099 JVM_END
3100
3101
3102 // Array ///////////////////////////////////////////////////////////////////////////////////////////
3103
3104
3105 // resolve array handle and check arguments
3106 static inline arrayOop check_array(JNIEnv *env, jobject arr, bool type_array_only, TRAPS) {
3107 if (arr == nullptr) {
3108 THROW_NULL(vmSymbols::java_lang_NullPointerException());
3109 }
3110 oop a = JNIHandles::resolve_non_null(arr);
3111 if (!a->is_array()) {
3112 THROW_MSG_NULL(vmSymbols::java_lang_IllegalArgumentException(), "Argument is not an array");
3113 } else if (type_array_only && !a->is_typeArray()) {
3114 THROW_MSG_NULL(vmSymbols::java_lang_IllegalArgumentException(), "Argument is not an array of primitive type");
3115 }
3116 return arrayOop(a);
3117 }
3118
3119
3120 JVM_ENTRY_PROF(jint, JVM_GetArrayLength, JVM_GetArrayLength(JNIEnv *env, jobject arr))
3121 arrayOop a = check_array(env, arr, false, CHECK_0);
3122 return a->length();
3123 JVM_END
3124
3125
3126 JVM_ENTRY_PROF(jobject, JVM_GetArrayElement, JVM_GetArrayElement(JNIEnv *env, jobject arr, jint index))
3127 JvmtiVMObjectAllocEventCollector oam;
3128 arrayOop a = check_array(env, arr, false, CHECK_NULL);
3129 jvalue value;
3130 BasicType type = Reflection::array_get(&value, a, index, CHECK_NULL);
3131 oop box = Reflection::box(&value, type, CHECK_NULL);
3132 return JNIHandles::make_local(THREAD, box);
3133 JVM_END
3134
3135
3136 JVM_ENTRY_PROF(jvalue, JVM_GetPrimitiveArrayElement, JVM_GetPrimitiveArrayElement(JNIEnv *env, jobject arr, jint index, jint wCode))
3137 jvalue value;
3138 value.i = 0; // to initialize value before getting used in CHECK
3139 arrayOop a = check_array(env, arr, true, CHECK_(value));
3140 assert(a->is_typeArray(), "just checking");
3141 BasicType type = Reflection::array_get(&value, a, index, CHECK_(value));
3142 BasicType wide_type = (BasicType) wCode;
3143 if (type != wide_type) {
3144 Reflection::widen(&value, type, wide_type, CHECK_(value));
3145 }
3146 return value;
3147 JVM_END
3148
3149
3150 JVM_ENTRY_PROF(void, JVM_SetArrayElement, JVM_SetArrayElement(JNIEnv *env, jobject arr, jint index, jobject val))
3151 arrayOop a = check_array(env, arr, false, CHECK);
3152 oop box = JNIHandles::resolve(val);
3153 jvalue value;
3154 value.i = 0; // to initialize value before getting used in CHECK
3155 BasicType value_type;
3156 if (a->is_objArray()) {
3157 // Make sure we do no unbox e.g. java/lang/Integer instances when storing into an object array
3158 value_type = Reflection::unbox_for_regular_object(box, &value);
3159 } else {
3160 value_type = Reflection::unbox_for_primitive(box, &value, CHECK);
3161 }
3162 Reflection::array_set(&value, a, index, value_type, CHECK);
3163 JVM_END
3164
3165
3166 JVM_ENTRY_PROF(void, JVM_SetPrimitiveArrayElement, JVM_SetPrimitiveArrayElement(JNIEnv *env, jobject arr, jint index, jvalue v, unsigned char vCode))
3167 arrayOop a = check_array(env, arr, true, CHECK);
3168 assert(a->is_typeArray(), "just checking");
3169 BasicType value_type = (BasicType) vCode;
3170 Reflection::array_set(&v, a, index, value_type, CHECK);
3171 JVM_END
3172
3173
3174 JVM_ENTRY_PROF(jobject, JVM_NewArray, JVM_NewArray(JNIEnv *env, jclass eltClass, jint length))
3175 JvmtiVMObjectAllocEventCollector oam;
3176 oop element_mirror = JNIHandles::resolve(eltClass);
3177 oop result = Reflection::reflect_new_array(element_mirror, length, CHECK_NULL);
3178 return JNIHandles::make_local(THREAD, result);
3179 JVM_END
3180
3181
3182 JVM_ENTRY_PROF(jobject, JVM_NewMultiArray, JVM_NewMultiArray(JNIEnv *env, jclass eltClass, jintArray dim))
3183 JvmtiVMObjectAllocEventCollector oam;
3184 arrayOop dim_array = check_array(env, dim, true, CHECK_NULL);
3185 oop element_mirror = JNIHandles::resolve(eltClass);
3186 assert(dim_array->is_typeArray(), "just checking");
3187 oop result = Reflection::reflect_new_multi_array(element_mirror, typeArrayOop(dim_array), CHECK_NULL);
3188 return JNIHandles::make_local(THREAD, result);
3189 JVM_END
3190
3191
3192 // Library support ///////////////////////////////////////////////////////////////////////////
3193
3194 JVM_LEAF_PROF(void*, JVM_LoadZipLibrary, JVM_LoadZipLibrary())
3195 return ZipLibrary::handle();
3196 JVM_END
3197
3198 JVM_ENTRY_NO_ENV_PROF(void*, JVM_LoadLibrary, JVM_LoadLibrary(const char* name, jboolean throwException))
3199 //%note jvm_ct
3200 char ebuf[1024];
3201 void *load_result;
3202 {
3203 ThreadToNativeFromVM ttnfvm(thread);
3204 load_result = os::dll_load(name, ebuf, sizeof ebuf);
3205 }
3206 if (load_result == nullptr) {
3207 if (throwException) {
3208 char msg[1024];
3209 jio_snprintf(msg, sizeof msg, "%s: %s", name, ebuf);
3210 // Since 'ebuf' may contain a string encoded using
3211 // platform encoding scheme, we need to pass
3212 // Exceptions::unsafe_to_utf8 to the new_exception method
3213 // as the last argument. See bug 6367357.
3214 Handle h_exception =
3215 Exceptions::new_exception(thread,
3216 vmSymbols::java_lang_UnsatisfiedLinkError(),
3217 msg, Exceptions::unsafe_to_utf8);
3218
3219 THROW_HANDLE_NULL(h_exception);
3220 } else {
3221 log_info(library)("Failed to load library %s", name);
3222 return load_result;
3223 }
3224 }
3225 log_info(library)("Loaded library %s, handle " INTPTR_FORMAT, name, p2i(load_result));
3226 return load_result;
3227 JVM_END
3228
3229
3230 JVM_LEAF_PROF(void, JVM_UnloadLibrary, JVM_UnloadLibrary(void* handle))
3231 os::dll_unload(handle);
3232 log_info(library)("Unloaded library with handle " INTPTR_FORMAT, p2i(handle));
3233 JVM_END
3234
3235
3236 JVM_LEAF_PROF(void*, JVM_FindLibraryEntry, JVM_FindLibraryEntry(void* handle, const char* name))
3237 void* find_result = os::dll_lookup(handle, name);
3238 log_info(library)("%s %s in library with handle " INTPTR_FORMAT,
3239 find_result != nullptr ? "Found" : "Failed to find",
3240 name, p2i(handle));
3241 return find_result;
3242 JVM_END
3243
3244
3245 // JNI version ///////////////////////////////////////////////////////////////////////////////
3246
3247 JVM_LEAF_PROF(jboolean, JVM_IsSupportedJNIVersion, JVM_IsSupportedJNIVersion(jint version))
3248 return Threads::is_supported_jni_version_including_1_1(version);
3249 JVM_END
3250
3251
3252 JVM_LEAF_PROF(jboolean, JVM_IsPreviewEnabled, JVM_IsPreviewEnabled(void))
3253 return Arguments::enable_preview() ? JNI_TRUE : JNI_FALSE;
3254 JVM_END
3255
3256 JVM_LEAF_PROF(jboolean, JVM_IsContinuationsSupported, JVM_IsContinuationsSupported(void))
3257 return VMContinuations ? JNI_TRUE : JNI_FALSE;
3258 JVM_END
3259
3260 JVM_LEAF_PROF(jboolean, JVM_IsForeignLinkerSupported, JVM_IsForeignLinkerSupported(void))
3261 return ForeignGlobals::is_foreign_linker_supported() ? JNI_TRUE : JNI_FALSE;
3262 JVM_END
3263
3264 JVM_LEAF(jboolean, JVM_IsStaticallyLinked(void))
3265 return is_vm_statically_linked() ? JNI_TRUE : JNI_FALSE;
3266 JVM_END
3267
3268 // String support ///////////////////////////////////////////////////////////////////////////
3269
3270 JVM_ENTRY_PROF(jstring, JVM_InternString, JVM_InternString(JNIEnv *env, jstring str))
3271 JvmtiVMObjectAllocEventCollector oam;
3272 if (str == nullptr) return nullptr;
3273 oop string = JNIHandles::resolve_non_null(str);
3274 oop result = StringTable::intern(string, CHECK_NULL);
3275 return (jstring) JNIHandles::make_local(THREAD, result);
3276 JVM_END
3277
3278
3279 // VM Raw monitor support //////////////////////////////////////////////////////////////////////
3280
3281 // VM Raw monitors (not to be confused with JvmtiRawMonitors) are a simple mutual exclusion
3282 // lock (not actually monitors: no wait/notify) that is exported by the VM for use by JDK
3283 // library code. They may be used by JavaThreads and non-JavaThreads and do not participate
3284 // in the safepoint protocol, thread suspension, thread interruption, or most things of that
3285 // nature, except JavaThreads will be blocked by VM_Exit::block_if_vm_exited if the VM has
3286 // shutdown. JavaThreads will be "in native" when using this API from JDK code.
3287
3288
3289 JNIEXPORT void* JNICALL JVM_RawMonitorCreate(void) {
3290 VM_Exit::block_if_vm_exited();
3310 ((PlatformMutex*) mon)->unlock();
3311 }
3312
3313
3314 // Shared JNI/JVM entry points //////////////////////////////////////////////////////////////
3315
3316 jclass find_class_from_class_loader(JNIEnv* env, Symbol* name, jboolean init,
3317 Handle loader, jboolean throwError, TRAPS) {
3318 Klass* klass = SystemDictionary::resolve_or_fail(name, loader, throwError != 0, CHECK_NULL);
3319
3320 // Check if we should initialize the class
3321 if (init && klass->is_instance_klass()) {
3322 klass->initialize(CHECK_NULL);
3323 }
3324 return (jclass) JNIHandles::make_local(THREAD, klass->java_mirror());
3325 }
3326
3327
3328 // Method ///////////////////////////////////////////////////////////////////////////////////////////
3329
3330 JVM_ENTRY_PROF(jobject, JVM_InvokeMethod, JVM_InvokeMethod(JNIEnv *env, jobject method, jobject obj, jobjectArray args0))
3331 Handle method_handle;
3332 if (thread->stack_overflow_state()->stack_available((address) &method_handle) >= JVMInvokeMethodSlack) {
3333 method_handle = Handle(THREAD, JNIHandles::resolve(method));
3334 Handle receiver(THREAD, JNIHandles::resolve(obj));
3335 objArrayHandle args(THREAD, objArrayOop(JNIHandles::resolve(args0)));
3336 oop result = Reflection::invoke_method(method_handle(), receiver, args, CHECK_NULL);
3337 jobject res = JNIHandles::make_local(THREAD, result);
3338 if (JvmtiExport::should_post_vm_object_alloc()) {
3339 oop ret_type = java_lang_reflect_Method::return_type(method_handle());
3340 assert(ret_type != nullptr, "sanity check: ret_type oop must not be null!");
3341 if (java_lang_Class::is_primitive(ret_type)) {
3342 // Only for primitive type vm allocates memory for java object.
3343 // See box() method.
3344 JvmtiExport::post_vm_object_alloc(thread, result);
3345 }
3346 }
3347 return res;
3348 } else {
3349 THROW_NULL(vmSymbols::java_lang_StackOverflowError());
3350 }
3351 JVM_END
3352
3353
3354 JVM_ENTRY_PROF(jobject, JVM_NewInstanceFromConstructor, JVM_NewInstanceFromConstructor(JNIEnv *env, jobject c, jobjectArray args0))
3355 oop constructor_mirror = JNIHandles::resolve(c);
3356 objArrayHandle args(THREAD, objArrayOop(JNIHandles::resolve(args0)));
3357 oop result = Reflection::invoke_constructor(constructor_mirror, args, CHECK_NULL);
3358 jobject res = JNIHandles::make_local(THREAD, result);
3359 if (JvmtiExport::should_post_vm_object_alloc()) {
3360 JvmtiExport::post_vm_object_alloc(thread, result);
3361 }
3362 return res;
3363 JVM_END
3364
3365 JVM_ENTRY_PROF(void, JVM_InitializeFromArchive, JVM_InitializeFromArchive(JNIEnv* env, jclass cls))
3366 Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve(cls));
3367 assert(k->is_klass(), "just checking");
3368 HeapShared::initialize_from_archived_subgraph(THREAD, k);
3369 JVM_END
3370
3371 JVM_ENTRY_PROF(void, JVM_RegisterLambdaProxyClassForArchiving, JVM_RegisterLambdaProxyClassForArchiving(JNIEnv* env,
3372 jclass caller,
3373 jstring interfaceMethodName,
3374 jobject factoryType,
3375 jobject interfaceMethodType,
3376 jobject implementationMember,
3377 jobject dynamicMethodType,
3378 jclass lambdaProxyClass))
3379 #if INCLUDE_CDS
3380 if (!CDSConfig::is_dumping_archive()) {
3381 return;
3382 }
3383
3384 Klass* caller_k = java_lang_Class::as_Klass(JNIHandles::resolve(caller));
3385 InstanceKlass* caller_ik = InstanceKlass::cast(caller_k);
3386 if (caller_ik->is_hidden()) {
3387 // Hidden classes not of type lambda proxy classes are currently not being archived.
3388 // If the caller_ik is of one of the above types, the corresponding lambda proxy class won't be
3389 // registered for archiving.
3390 return;
3391 }
3399 interface_method_name = java_lang_String::as_symbol(JNIHandles::resolve_non_null(interfaceMethodName));
3400 }
3401 Handle factory_type_oop(THREAD, JNIHandles::resolve_non_null(factoryType));
3402 Symbol* factory_type = java_lang_invoke_MethodType::as_signature(factory_type_oop(), true);
3403
3404 Handle interface_method_type_oop(THREAD, JNIHandles::resolve_non_null(interfaceMethodType));
3405 Symbol* interface_method_type = java_lang_invoke_MethodType::as_signature(interface_method_type_oop(), true);
3406
3407 Handle implementation_member_oop(THREAD, JNIHandles::resolve_non_null(implementationMember));
3408 assert(java_lang_invoke_MemberName::is_method(implementation_member_oop()), "must be");
3409 Method* m = java_lang_invoke_MemberName::vmtarget(implementation_member_oop());
3410
3411 Handle dynamic_method_type_oop(THREAD, JNIHandles::resolve_non_null(dynamicMethodType));
3412 Symbol* dynamic_method_type = java_lang_invoke_MethodType::as_signature(dynamic_method_type_oop(), true);
3413
3414 SystemDictionaryShared::add_lambda_proxy_class(caller_ik, lambda_ik, interface_method_name, factory_type,
3415 interface_method_type, m, dynamic_method_type, THREAD);
3416 #endif // INCLUDE_CDS
3417 JVM_END
3418
3419 JVM_ENTRY_PROF(jclass, JVM_LookupLambdaProxyClassFromArchive, JVM_LookupLambdaProxyClassFromArchive(JNIEnv* env,
3420 jclass caller,
3421 jstring interfaceMethodName,
3422 jobject factoryType,
3423 jobject interfaceMethodType,
3424 jobject implementationMember,
3425 jobject dynamicMethodType))
3426 #if INCLUDE_CDS
3427
3428 if (interfaceMethodName == nullptr || factoryType == nullptr || interfaceMethodType == nullptr ||
3429 implementationMember == nullptr || dynamicMethodType == nullptr) {
3430 THROW_(vmSymbols::java_lang_NullPointerException(), nullptr);
3431 }
3432
3433 Klass* caller_k = java_lang_Class::as_Klass(JNIHandles::resolve(caller));
3434 InstanceKlass* caller_ik = InstanceKlass::cast(caller_k);
3435 if (!caller_ik->is_shared()) {
3436 // there won't be a shared lambda class if the caller_ik is not in the shared archive.
3437 return nullptr;
3438 }
3439
3447 Handle implementation_member_oop(THREAD, JNIHandles::resolve_non_null(implementationMember));
3448 assert(java_lang_invoke_MemberName::is_method(implementation_member_oop()), "must be");
3449 Method* m = java_lang_invoke_MemberName::vmtarget(implementation_member_oop());
3450
3451 Handle dynamic_method_type_oop(THREAD, JNIHandles::resolve_non_null(dynamicMethodType));
3452 Symbol* dynamic_method_type = java_lang_invoke_MethodType::as_signature(dynamic_method_type_oop(), true);
3453
3454 InstanceKlass* lambda_ik = SystemDictionaryShared::get_shared_lambda_proxy_class(caller_ik, interface_method_name, factory_type,
3455 interface_method_type, m, dynamic_method_type);
3456 jclass jcls = nullptr;
3457 if (lambda_ik != nullptr) {
3458 InstanceKlass* loaded_lambda = SystemDictionaryShared::prepare_shared_lambda_proxy_class(lambda_ik, caller_ik, THREAD);
3459 jcls = loaded_lambda == nullptr ? nullptr : (jclass) JNIHandles::make_local(THREAD, loaded_lambda->java_mirror());
3460 }
3461 return jcls;
3462 #else
3463 return nullptr;
3464 #endif // INCLUDE_CDS
3465 JVM_END
3466
3467 JVM_ENTRY_NO_ENV_PROF(jlong, JVM_GetRandomSeedForDumping, JVM_GetRandomSeedForDumping())
3468 if (CDSConfig::is_dumping_static_archive()) {
3469 // We do this so that the default CDS archive can be deterministic.
3470 const char* release = VM_Version::vm_release();
3471 const char* dbg_level = VM_Version::jdk_debug_level();
3472 const char* version = VM_Version::internal_vm_info_string();
3473 jlong seed = (jlong)(java_lang_String::hash_code((const jbyte*)release, (int)strlen(release)) ^
3474 java_lang_String::hash_code((const jbyte*)dbg_level, (int)strlen(dbg_level)) ^
3475 java_lang_String::hash_code((const jbyte*)version, (int)strlen(version)));
3476 seed += (jlong)VM_Version::vm_major_version();
3477 seed += (jlong)VM_Version::vm_minor_version();
3478 seed += (jlong)VM_Version::vm_security_version();
3479 seed += (jlong)VM_Version::vm_patch_version();
3480 if (seed == 0) { // don't let this ever be zero.
3481 seed = 0x87654321;
3482 }
3483 log_debug(cds)("JVM_GetRandomSeedForDumping() = " JLONG_FORMAT, seed);
3484 return seed;
3485 } else {
3486 return 0;
3487 }
3488 JVM_END
3489
3490 JVM_ENTRY_NO_ENV_PROF(jint, JVM_GetCDSConfigStatus, JVM_GetCDSConfigStatus())
3491 return CDSConfig::get_status();
3492 JVM_END
3493
3494 JVM_ENTRY_PROF(void, JVM_LogLambdaFormInvoker, JVM_LogLambdaFormInvoker(JNIEnv *env, jstring line))
3495 #if INCLUDE_CDS
3496 assert(CDSConfig::is_logging_lambda_form_invokers(), "sanity");
3497 if (line != nullptr) {
3498 ResourceMark rm(THREAD);
3499 Handle h_line (THREAD, JNIHandles::resolve_non_null(line));
3500 char* c_line = java_lang_String::as_utf8_string(h_line());
3501 if (CDSConfig::is_dumping_dynamic_archive() || CDSConfig::is_dumping_preimage_static_archive()) {
3502 // Note: LambdaFormInvokers::append take same format which is not
3503 // same as below the print format. The line does not include LAMBDA_FORM_TAG.
3504 LambdaFormInvokers::append(os::strdup((const char*)c_line, mtInternal));
3505 }
3506 if (ClassListWriter::is_enabled()) {
3507 ClassListWriter w;
3508 w.stream()->print_cr("%s %s", ClassListParser::lambda_form_tag(), c_line);
3509 }
3510 }
3511 #endif // INCLUDE_CDS
3512 JVM_END
3513
3514 JVM_ENTRY_PROF(void, JVM_LogDynamicProxy, JVM_LogDynamicProxy(JNIEnv *env, jobject loader, jstring proxy_name, jobjectArray interfaces, jint access_flags))
3515 #if INCLUDE_CDS
3516 assert(CDSConfig::is_logging_dynamic_proxies(), "sanity");
3517
3518 ResourceMark rm(THREAD);
3519 oop proxy_name_oop = JNIHandles::resolve_non_null(proxy_name);
3520 char* proxy_name_str = java_lang_String::as_utf8_string(proxy_name_oop);
3521 oop loader_oop = JNIHandles::resolve(loader);
3522 objArrayOop interfaces_oop = objArrayOop(JNIHandles::resolve_non_null(interfaces));
3523
3524 AOTConstantPoolResolver::trace_dynamic_proxy_class(loader_oop, proxy_name_str, interfaces_oop, access_flags);
3525 #endif // INCLUDE_CDS
3526 JVM_END
3527
3528 JVM_ENTRY_PROF(void, JVM_DumpClassListToFile, JVM_DumpClassListToFile(JNIEnv *env, jstring listFileName))
3529 #if INCLUDE_CDS
3530 ResourceMark rm(THREAD);
3531 Handle file_handle(THREAD, JNIHandles::resolve_non_null(listFileName));
3532 char* file_name = java_lang_String::as_utf8_string(file_handle());
3533 MetaspaceShared::dump_loaded_classes(file_name, THREAD);
3534 #endif // INCLUDE_CDS
3535 JVM_END
3536
3537 JVM_ENTRY_PROF(void, JVM_DumpDynamicArchive, JVM_DumpDynamicArchive(JNIEnv *env, jstring archiveName))
3538 #if INCLUDE_CDS
3539 ResourceMark rm(THREAD);
3540 Handle file_handle(THREAD, JNIHandles::resolve_non_null(archiveName));
3541 char* archive_name = java_lang_String::as_utf8_string(file_handle());
3542 DynamicArchive::dump_for_jcmd(archive_name, CHECK);
3543 #endif // INCLUDE_CDS
3544 JVM_END
3545
3546 // Returns an array of all live Thread objects (VM internal JavaThreads,
3547 // jvmti agent threads, and JNI attaching threads are skipped)
3548 // See CR 6404306 regarding JNI attaching threads
3549 JVM_ENTRY_PROF(jobjectArray, JVM_GetAllThreads, JVM_GetAllThreads(JNIEnv *env, jclass dummy))
3550 ResourceMark rm(THREAD);
3551 ThreadsListEnumerator tle(THREAD, false, false);
3552 JvmtiVMObjectAllocEventCollector oam;
3553
3554 int num_threads = tle.num_threads();
3555 objArrayOop r = oopFactory::new_objArray(vmClasses::Thread_klass(), num_threads, CHECK_NULL);
3556 objArrayHandle threads_ah(THREAD, r);
3557
3558 for (int i = 0; i < num_threads; i++) {
3559 Handle h = tle.get_threadObj(i);
3560 threads_ah->obj_at_put(i, h());
3561 }
3562
3563 return (jobjectArray) JNIHandles::make_local(THREAD, threads_ah());
3564 JVM_END
3565
3566
3567 // Support for java.lang.Thread.getStackTrace() and getAllStackTraces() methods
3568 // Return StackTraceElement[][], each element is the stack trace of a thread in
3569 // the corresponding entry in the given threads array
3570 JVM_ENTRY_PROF(jobjectArray, JVM_DumpThreads, JVM_DumpThreads(JNIEnv *env, jclass threadClass, jobjectArray threads))
3571 JvmtiVMObjectAllocEventCollector oam;
3572
3573 // Check if threads is null
3574 if (threads == nullptr) {
3575 THROW_NULL(vmSymbols::java_lang_NullPointerException());
3576 }
3577
3578 objArrayOop a = objArrayOop(JNIHandles::resolve_non_null(threads));
3579 objArrayHandle ah(THREAD, a);
3580 int num_threads = ah->length();
3581 // check if threads is non-empty array
3582 if (num_threads == 0) {
3583 THROW_NULL(vmSymbols::java_lang_IllegalArgumentException());
3584 }
3585
3586 // check if threads is not an array of objects of Thread class
3587 Klass* k = ObjArrayKlass::cast(ah->klass())->element_klass();
3588 if (k != vmClasses::Thread_klass()) {
3589 THROW_NULL(vmSymbols::java_lang_IllegalArgumentException());
3590 }
3591
3592 ResourceMark rm(THREAD);
3593
3594 GrowableArray<instanceHandle>* thread_handle_array = new GrowableArray<instanceHandle>(num_threads);
3595 for (int i = 0; i < num_threads; i++) {
3596 oop thread_obj = ah->obj_at(i);
3597 instanceHandle h(THREAD, (instanceOop) thread_obj);
3598 thread_handle_array->append(h);
3599 }
3600
3601 // The JavaThread references in thread_handle_array are validated
3602 // in VM_ThreadDump::doit().
3603 Handle stacktraces = ThreadService::dump_stack_traces(thread_handle_array, num_threads, CHECK_NULL);
3604 return (jobjectArray)JNIHandles::make_local(THREAD, stacktraces());
3605
3606 JVM_END
3607
3608 // JVM monitoring and management support
3609 JVM_LEAF_PROF(void*, JVM_GetManagement, JVM_GetManagement(jint version))
3610 return Management::get_jmm_interface(version);
3611 JVM_END
3612
3613 // com.sun.tools.attach.VirtualMachine agent properties support
3614 //
3615 // Initialize the agent properties with the properties maintained in the VM
3616 JVM_ENTRY_PROF(jobject, JVM_InitAgentProperties, JVM_InitAgentProperties(JNIEnv *env, jobject properties))
3617 ResourceMark rm;
3618
3619 Handle props(THREAD, JNIHandles::resolve_non_null(properties));
3620
3621 PUTPROP(props, "sun.java.command", Arguments::java_command());
3622 PUTPROP(props, "sun.jvm.flags", Arguments::jvm_flags());
3623 PUTPROP(props, "sun.jvm.args", Arguments::jvm_args());
3624 return properties;
3625 JVM_END
3626
3627 JVM_ENTRY_PROF(jobjectArray, JVM_GetEnclosingMethodInfo, JVM_GetEnclosingMethodInfo(JNIEnv *env, jclass ofClass))
3628 {
3629 JvmtiVMObjectAllocEventCollector oam;
3630
3631 if (ofClass == nullptr) {
3632 return nullptr;
3633 }
3634 Handle mirror(THREAD, JNIHandles::resolve_non_null(ofClass));
3635 // Special handling for primitive objects
3636 if (java_lang_Class::is_primitive(mirror())) {
3637 return nullptr;
3638 }
3639 Klass* k = java_lang_Class::as_Klass(mirror());
3640 if (!k->is_instance_klass()) {
3641 return nullptr;
3642 }
3643 InstanceKlass* ik = InstanceKlass::cast(k);
3644 int encl_method_class_idx = ik->enclosing_method_class_index();
3645 if (encl_method_class_idx == 0) {
3646 return nullptr;
3647 }
3650 Klass* enc_k = ik->constants()->klass_at(encl_method_class_idx, CHECK_NULL);
3651 dest->obj_at_put(0, enc_k->java_mirror());
3652 int encl_method_method_idx = ik->enclosing_method_method_index();
3653 if (encl_method_method_idx != 0) {
3654 Symbol* sym = ik->constants()->symbol_at(
3655 extract_low_short_from_int(
3656 ik->constants()->name_and_type_at(encl_method_method_idx)));
3657 Handle str = java_lang_String::create_from_symbol(sym, CHECK_NULL);
3658 dest->obj_at_put(1, str());
3659 sym = ik->constants()->symbol_at(
3660 extract_high_short_from_int(
3661 ik->constants()->name_and_type_at(encl_method_method_idx)));
3662 str = java_lang_String::create_from_symbol(sym, CHECK_NULL);
3663 dest->obj_at_put(2, str());
3664 }
3665 return (jobjectArray) JNIHandles::make_local(THREAD, dest());
3666 }
3667 JVM_END
3668
3669 // Returns an array of java.lang.String objects containing the input arguments to the VM.
3670 JVM_ENTRY_PROF(jobjectArray, JVM_GetVmArguments, JVM_GetVmArguments(JNIEnv *env))
3671 ResourceMark rm(THREAD);
3672
3673 if (Arguments::num_jvm_args() == 0 && Arguments::num_jvm_flags() == 0) {
3674 return nullptr;
3675 }
3676
3677 char** vm_flags = Arguments::jvm_flags_array();
3678 char** vm_args = Arguments::jvm_args_array();
3679 int num_flags = Arguments::num_jvm_flags();
3680 int num_args = Arguments::num_jvm_args();
3681
3682 InstanceKlass* ik = vmClasses::String_klass();
3683 objArrayOop r = oopFactory::new_objArray(ik, num_args + num_flags, CHECK_NULL);
3684 objArrayHandle result_h(THREAD, r);
3685
3686 int index = 0;
3687 for (int j = 0; j < num_flags; j++, index++) {
3688 Handle h = java_lang_String::create_from_platform_dependent_str(vm_flags[j], CHECK_NULL);
3689 result_h->obj_at_put(index, h());
3690 }
3691 for (int i = 0; i < num_args; i++, index++) {
3692 Handle h = java_lang_String::create_from_platform_dependent_str(vm_args[i], CHECK_NULL);
3693 result_h->obj_at_put(index, h());
3694 }
3695 return (jobjectArray) JNIHandles::make_local(THREAD, result_h());
3696 JVM_END
3697
3698 JVM_LEAF_PROF(jint, JVM_FindSignal, JVM_FindSignal(const char *name))
3699 return os::get_signal_number(name);
3700 JVM_END
3701
3702 JVM_ENTRY_PROF(void, JVM_VirtualThreadStart, JVM_VirtualThreadStart(JNIEnv* env, jobject vthread))
3703 #if INCLUDE_JVMTI
3704 if (!DoJVMTIVirtualThreadTransitions) {
3705 assert(!JvmtiExport::can_support_virtual_threads(), "sanity check");
3706 return;
3707 }
3708 if (JvmtiVTMSTransitionDisabler::VTMS_notify_jvmti_events()) {
3709 JvmtiVTMSTransitionDisabler::VTMS_vthread_start(vthread);
3710 } else {
3711 // set VTMS transition bit value in JavaThread and java.lang.VirtualThread object
3712 JvmtiVTMSTransitionDisabler::set_is_in_VTMS_transition(thread, vthread, false);
3713 }
3714 #endif
3715 JVM_END
3716
3717 JVM_ENTRY_PROF(void, JVM_VirtualThreadEnd, JVM_VirtualThreadEnd(JNIEnv* env, jobject vthread))
3718 #if INCLUDE_JVMTI
3719 if (!DoJVMTIVirtualThreadTransitions) {
3720 assert(!JvmtiExport::can_support_virtual_threads(), "sanity check");
3721 return;
3722 }
3723 if (JvmtiVTMSTransitionDisabler::VTMS_notify_jvmti_events()) {
3724 JvmtiVTMSTransitionDisabler::VTMS_vthread_end(vthread);
3725 } else {
3726 // set VTMS transition bit value in JavaThread and java.lang.VirtualThread object
3727 JvmtiVTMSTransitionDisabler::set_is_in_VTMS_transition(thread, vthread, true);
3728 }
3729 #endif
3730 JVM_END
3731
3732 // If notifications are disabled then just update the VTMS transition bit and return.
3733 // Otherwise, the bit is updated in the given jvmtiVTMSTransitionDisabler function call.
3734 JVM_ENTRY_PROF(void, JVM_VirtualThreadMount, JVM_VirtualThreadMount(JNIEnv* env, jobject vthread, jboolean hide))
3735 #if INCLUDE_JVMTI
3736 if (!DoJVMTIVirtualThreadTransitions) {
3737 assert(!JvmtiExport::can_support_virtual_threads(), "sanity check");
3738 return;
3739 }
3740 if (JvmtiVTMSTransitionDisabler::VTMS_notify_jvmti_events()) {
3741 JvmtiVTMSTransitionDisabler::VTMS_vthread_mount(vthread, hide);
3742 } else {
3743 // set VTMS transition bit value in JavaThread and java.lang.VirtualThread object
3744 JvmtiVTMSTransitionDisabler::set_is_in_VTMS_transition(thread, vthread, hide);
3745 }
3746 #endif
3747 JVM_END
3748
3749 // If notifications are disabled then just update the VTMS transition bit and return.
3750 // Otherwise, the bit is updated in the given jvmtiVTMSTransitionDisabler function call below.
3751 JVM_ENTRY_PROF(void, JVM_VirtualThreadUnmount, JVM_VirtualThreadUnmount(JNIEnv* env, jobject vthread, jboolean hide))
3752 #if INCLUDE_JVMTI
3753 if (!DoJVMTIVirtualThreadTransitions) {
3754 assert(!JvmtiExport::can_support_virtual_threads(), "sanity check");
3755 return;
3756 }
3757 if (JvmtiVTMSTransitionDisabler::VTMS_notify_jvmti_events()) {
3758 JvmtiVTMSTransitionDisabler::VTMS_vthread_unmount(vthread, hide);
3759 } else {
3760 // set VTMS transition bit value in JavaThread and java.lang.VirtualThread object
3761 JvmtiVTMSTransitionDisabler::set_is_in_VTMS_transition(thread, vthread, hide);
3762 }
3763 #endif
3764 JVM_END
3765
3766 // Notification from VirtualThread about disabling JVMTI Suspend in a sync critical section.
3767 // Needed to avoid deadlocks with JVMTI suspend mechanism.
3768 JVM_ENTRY(void, JVM_VirtualThreadDisableSuspend(JNIEnv* env, jclass clazz, jboolean enter))
3769 #if INCLUDE_JVMTI
3770 if (!DoJVMTIVirtualThreadTransitions) {
3771 assert(!JvmtiExport::can_support_virtual_threads(), "sanity check");
3798 OopHandle& list_head = ObjectMonitor::vthread_cxq_head();
3799 oop vthread_head = nullptr;
3800 while (true) {
3801 if (list_head.peek() != nullptr) {
3802 for (;;) {
3803 oop head = list_head.resolve();
3804 if (list_head.cmpxchg(head, nullptr) == head) {
3805 return JNIHandles::make_local(THREAD, head);
3806 }
3807 }
3808 }
3809 ThreadBlockInVM tbivm(THREAD);
3810 parkEvent->park();
3811 }
3812 JVM_END
3813 /*
3814 * Return the current class's class file version. The low order 16 bits of the
3815 * returned jint contain the class's major version. The high order 16 bits
3816 * contain the class's minor version.
3817 */
3818 JVM_ENTRY_PROF(jint, JVM_GetClassFileVersion, JVM_GetClassFileVersion(JNIEnv* env, jclass current))
3819 oop mirror = JNIHandles::resolve_non_null(current);
3820 if (java_lang_Class::is_primitive(mirror)) {
3821 // return latest major version and minor version of 0.
3822 return JVM_CLASSFILE_MAJOR_VERSION;
3823 }
3824 assert(!java_lang_Class::as_Klass(mirror)->is_array_klass(), "unexpected array class");
3825
3826 Klass* c = java_lang_Class::as_Klass(mirror);
3827 assert(c->is_instance_klass(), "must be");
3828 InstanceKlass* ik = InstanceKlass::cast(c);
3829 return (ik->minor_version() << 16) | ik->major_version();
3830 JVM_END
3831
3832 /*
3833 * Ensure that code doing a stackwalk and using javaVFrame::locals() to
3834 * get the value will see a materialized value and not a scalar-replaced
3835 * null value.
3836 */
3837 JVM_ENTRY_PROF(void, JVM_EnsureMaterializedForStackWalk_func, JVM_EnsureMaterializedForStackWalk_func(JNIEnv* env, jobject vthread, jobject value))
3838 JVM_EnsureMaterializedForStackWalk(env, value);
3839 JVM_END
3840
3841 /*
3842 * Return JNI_TRUE if warnings are printed when agents are dynamically loaded.
3843 */
3844 JVM_LEAF_PROF(jboolean, JVM_PrintWarningAtDynamicAgentLoad, JVM_PrintWarningAtDynamicAgentLoad(void))
3845 return (EnableDynamicAgentLoading && !FLAG_IS_CMDLINE(EnableDynamicAgentLoading)) ? JNI_TRUE : JNI_FALSE;
3846 JVM_END
3847
3848 #define DO_COUNTERS(macro) \
3849 macro(JVM_CurrentTimeMillis) \
3850 macro(JVM_NanoTime) \
3851 macro(JVM_GetNanoTimeAdjustment) \
3852 macro(JVM_ArrayCopy) \
3853 macro(JVM_GetProperties) \
3854 macro(JVM_GetTemporaryDirectory) \
3855 macro(JVM_BeforeHalt) \
3856 macro(JVM_Halt) \
3857 macro(JVM_GC) \
3858 macro(JVM_MaxObjectInspectionAge) \
3859 macro(JVM_TotalMemory) \
3860 macro(JVM_FreeMemory) \
3861 macro(JVM_MaxMemory) \
3862 macro(JVM_ActiveProcessorCount) \
3863 macro(JVM_IsUseContainerSupport) \
3864 macro(JVM_FillInStackTrace) \
3865 macro(JVM_GetExtendedNPEMessage) \
3866 macro(JVM_InitStackTraceElementArray) \
3867 macro(JVM_InitStackTraceElement) \
3868 macro(JVM_ExpandStackFrameInfo) \
3869 macro(JVM_CallStackWalk) \
3870 macro(JVM_MoreStackWalk) \
3871 macro(JVM_SetStackWalkContinuation) \
3872 macro(JVM_IHashCode) \
3873 macro(JVM_MonitorWait) \
3874 macro(JVM_MonitorNotify) \
3875 macro(JVM_MonitorNotifyAll) \
3876 macro(JVM_Clone) \
3877 macro(JVM_ReportFinalizationComplete) \
3878 macro(JVM_IsFinalizationEnabled) \
3879 macro(JVM_RegisterContinuationMethods) \
3880 macro(JVM_NativePath) \
3881 macro(JVM_GetCallerClass) \
3882 macro(JVM_FindPrimitiveClass) \
3883 macro(JVM_FindClassFromBootLoader) \
3884 macro(JVM_FindClassFromCaller) \
3885 macro(JVM_FindClassFromClass) \
3886 macro(JVM_DefineClass) \
3887 macro(JVM_LookupDefineClass) \
3888 macro(JVM_DefineClassWithSource) \
3889 macro(JVM_FindLoadedClass) \
3890 macro(JVM_DefineModule) \
3891 macro(JVM_SetBootLoaderUnnamedModule) \
3892 macro(JVM_AddModuleExports) \
3893 macro(JVM_AddModuleExportsToAllUnnamed) \
3894 macro(JVM_AddModuleExportsToAll) \
3895 macro(JVM_AddReadsModule) \
3896 macro(JVM_DefineArchivedModules) \
3897 macro(JVM_InitClassName) \
3898 macro(JVM_GetClassInterfaces) \
3899 macro(JVM_IsInterface) \
3900 macro(JVM_IsHiddenClass) \
3901 macro(JVM_FindScopedValueBindings) \
3902 macro(JVM_GetDeclaredClasses) \
3903 macro(JVM_GetDeclaringClass) \
3904 macro(JVM_GetSimpleBinaryName) \
3905 macro(JVM_GetClassSignature) \
3906 macro(JVM_GetClassAnnotations) \
3907 macro(JVM_GetClassTypeAnnotations) \
3908 macro(JVM_GetMethodTypeAnnotations) \
3909 macro(JVM_GetFieldTypeAnnotations) \
3910 macro(JVM_GetMethodParameters) \
3911 macro(JVM_GetClassDeclaredFields) \
3912 macro(JVM_IsRecord) \
3913 macro(JVM_GetRecordComponents) \
3914 macro(JVM_GetClassDeclaredMethods) \
3915 macro(JVM_GetClassDeclaredConstructors) \
3916 macro(JVM_GetClassAccessFlags) \
3917 macro(JVM_AreNestMates) \
3918 macro(JVM_GetNestHost) \
3919 macro(JVM_GetNestMembers) \
3920 macro(JVM_GetPermittedSubclasses) \
3921 macro(JVM_GetClassConstantPool) \
3922 macro(JVM_ConstantPoolGetSize) \
3923 macro(JVM_ConstantPoolGetClassAt) \
3924 macro(JVM_ConstantPoolGetClassAtIfLoaded) \
3925 macro(JVM_ConstantPoolGetMethodAt) \
3926 macro(JVM_ConstantPoolGetMethodAtIfLoaded) \
3927 macro(JVM_ConstantPoolGetFieldAt) \
3928 macro(JVM_ConstantPoolGetFieldAtIfLoaded) \
3929 macro(JVM_ConstantPoolGetMemberRefInfoAt) \
3930 macro(JVM_ConstantPoolGetClassRefIndexAt) \
3931 macro(JVM_ConstantPoolGetNameAndTypeRefIndexAt) \
3932 macro(JVM_ConstantPoolGetNameAndTypeRefInfoAt) \
3933 macro(JVM_ConstantPoolGetIntAt) \
3934 macro(JVM_ConstantPoolGetLongAt) \
3935 macro(JVM_ConstantPoolGetFloatAt) \
3936 macro(JVM_ConstantPoolGetDoubleAt) \
3937 macro(JVM_ConstantPoolGetStringAt) \
3938 macro(JVM_ConstantPoolGetUTF8At) \
3939 macro(JVM_ConstantPoolGetTagAt) \
3940 macro(JVM_DesiredAssertionStatus) \
3941 macro(JVM_AssertionStatusDirectives) \
3942 macro(JVM_GetClassNameUTF) \
3943 macro(JVM_GetClassCPTypes) \
3944 macro(JVM_GetClassCPEntriesCount) \
3945 macro(JVM_GetClassFieldsCount) \
3946 macro(JVM_GetClassMethodsCount) \
3947 macro(JVM_GetMethodIxExceptionIndexes) \
3948 macro(JVM_GetMethodIxExceptionsCount) \
3949 macro(JVM_GetMethodIxByteCode) \
3950 macro(JVM_GetMethodIxByteCodeLength) \
3951 macro(JVM_GetMethodIxExceptionTableEntry) \
3952 macro(JVM_GetMethodIxExceptionTableLength) \
3953 macro(JVM_GetMethodIxModifiers) \
3954 macro(JVM_GetFieldIxModifiers) \
3955 macro(JVM_GetMethodIxLocalsCount) \
3956 macro(JVM_GetMethodIxArgsSize) \
3957 macro(JVM_GetMethodIxMaxStack) \
3958 macro(JVM_IsConstructorIx) \
3959 macro(JVM_IsVMGeneratedMethodIx) \
3960 macro(JVM_GetMethodIxNameUTF) \
3961 macro(JVM_GetMethodIxSignatureUTF) \
3962 macro(JVM_GetCPFieldNameUTF) \
3963 macro(JVM_GetCPMethodNameUTF) \
3964 macro(JVM_GetCPMethodSignatureUTF) \
3965 macro(JVM_GetCPFieldSignatureUTF) \
3966 macro(JVM_GetCPClassNameUTF) \
3967 macro(JVM_GetCPFieldClassNameUTF) \
3968 macro(JVM_GetCPMethodClassNameUTF) \
3969 macro(JVM_GetCPFieldModifiers) \
3970 macro(JVM_GetCPMethodModifiers) \
3971 macro(JVM_ReleaseUTF) \
3972 macro(JVM_IsSameClassPackage) \
3973 macro(JVM_StartThread) \
3974 macro(JVM_SetThreadPriority) \
3975 macro(JVM_Yield) \
3976 macro(JVM_SleepNanos) \
3977 macro(JVM_CurrentCarrierThread) \
3978 macro(JVM_CurrentThread) \
3979 macro(JVM_SetCurrentThread) \
3980 macro(JVM_GetNextThreadIdOffset) \
3981 macro(JVM_Interrupt) \
3982 macro(JVM_HoldsLock) \
3983 macro(JVM_GetStackTrace) \
3984 macro(JVM_SetNativeThreadName) \
3985 macro(JVM_ScopedValueCache) \
3986 macro(JVM_SetScopedValueCache) \
3987 macro(JVM_GetSystemPackage) \
3988 macro(JVM_GetSystemPackages) \
3989 macro(JVM_GetAndClearReferencePendingList) \
3990 macro(JVM_HasReferencePendingList) \
3991 macro(JVM_WaitForReferencePendingList) \
3992 macro(JVM_ReferenceRefersTo) \
3993 macro(JVM_ReferenceClear) \
3994 macro(JVM_PhantomReferenceRefersTo) \
3995 macro(JVM_LatestUserDefinedLoader) \
3996 macro(JVM_GetArrayLength) \
3997 macro(JVM_GetArrayElement) \
3998 macro(JVM_GetPrimitiveArrayElement) \
3999 macro(JVM_SetArrayElement) \
4000 macro(JVM_SetPrimitiveArrayElement) \
4001 macro(JVM_NewArray) \
4002 macro(JVM_NewMultiArray) \
4003 macro(JVM_LoadZipLibrary) \
4004 macro(JVM_LoadLibrary) \
4005 macro(JVM_UnloadLibrary) \
4006 macro(JVM_FindLibraryEntry) \
4007 macro(JVM_IsSupportedJNIVersion) \
4008 macro(JVM_IsPreviewEnabled) \
4009 macro(JVM_IsContinuationsSupported) \
4010 macro(JVM_IsForeignLinkerSupported) \
4011 macro(JVM_InternString) \
4012 macro(JVM_InvokeMethod) \
4013 macro(JVM_NewInstanceFromConstructor) \
4014 macro(JVM_InitializeFromArchive) \
4015 macro(JVM_RegisterLambdaProxyClassForArchiving) \
4016 macro(JVM_LookupLambdaProxyClassFromArchive) \
4017 macro(JVM_GetRandomSeedForDumping) \
4018 macro(JVM_LogLambdaFormInvoker) \
4019 macro(JVM_LogDynamicProxy) \
4020 macro(JVM_DumpClassListToFile) \
4021 macro(JVM_DumpDynamicArchive) \
4022 macro(JVM_GetAllThreads) \
4023 macro(JVM_DumpThreads) \
4024 macro(JVM_GetManagement) \
4025 macro(JVM_InitAgentProperties) \
4026 macro(JVM_GetEnclosingMethodInfo) \
4027 macro(JVM_GetVmArguments) \
4028 macro(JVM_FindSignal) \
4029 macro(JVM_VirtualThreadStart) \
4030 macro(JVM_VirtualThreadEnd) \
4031 macro(JVM_VirtualThreadMount) \
4032 macro(JVM_VirtualThreadUnmount) \
4033 macro(JVM_GetClassFileVersion) \
4034 macro(JVM_EnsureMaterializedForStackWalk_func) \
4035 macro(JVM_PrintWarningAtDynamicAgentLoad)
4036
4037 #define INIT_COUNTER(name) \
4038 NEWPERFTICKCOUNTERS(_perf_##name##_timer, SUN_RT, #name); \
4039 NEWPERFEVENTCOUNTER(_perf_##name##_count, SUN_RT, #name "_count"); \
4040
4041 void perf_jvm_init() {
4042 if (ProfileVMCalls && UsePerfData) {
4043 EXCEPTION_MARK;
4044
4045 DO_COUNTERS(INIT_COUNTER)
4046
4047 if (HAS_PENDING_EXCEPTION) {
4048 vm_exit_during_initialization("jvm_perf_init failed unexpectedly");
4049 }
4050 }
4051 }
4052
4053 #undef INIT_COUNTER
4054
4055 #define PRINT_COUNTER(name) {\
4056 jlong count = _perf_##name##_count->get_value(); \
4057 if (count > 0) { \
4058 st->print_cr(" %-40s = " JLONG_FORMAT_W(6) "us (elapsed) " JLONG_FORMAT_W(6) "us (thread) (" JLONG_FORMAT_W(5) " events)", \
4059 #name, \
4060 _perf_##name##_timer->elapsed_counter_value_us(), \
4061 _perf_##name##_timer->thread_counter_value_us(), count); \
4062 }}
4063
4064 void perf_jvm_print_on(outputStream* st) {
4065 if (ProfileVMCalls && UsePerfData) {
4066 DO_COUNTERS(PRINT_COUNTER)
4067 } else {
4068 st->print_cr(" JVM: no info (%s is disabled)", (UsePerfData ? "ProfileVMCalls" : "UsePerfData"));
4069 }
4070 }
4071
4072 #undef PRINT_COUNTER
|