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