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