Path: blob/master/src/hotspot/share/prims/jvm.cpp
64440 views
/*1* Copyright (c) 1997, 2021, Oracle and/or its affiliates. All rights reserved.2* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.3*4* This code is free software; you can redistribute it and/or modify it5* under the terms of the GNU General Public License version 2 only, as6* published by the Free Software Foundation.7*8* This code is distributed in the hope that it will be useful, but WITHOUT9* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or10* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License11* version 2 for more details (a copy is included in the LICENSE file that12* accompanied this code).13*14* You should have received a copy of the GNU General Public License version15* 2 along with this work; if not, write to the Free Software Foundation,16* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.17*18* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA19* or visit www.oracle.com if you need additional information or have any20* questions.21*22*/2324#include "precompiled.hpp"25#include "jvm.h"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.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 "logging/log.hpp"51#include "memory/oopFactory.hpp"52#include "memory/referenceType.hpp"53#include "memory/resourceArea.hpp"54#include "memory/universe.hpp"55#include "oops/access.inline.hpp"56#include "oops/constantPool.hpp"57#include "oops/fieldStreams.inline.hpp"58#include "oops/instanceKlass.hpp"59#include "oops/klass.inline.hpp"60#include "oops/method.hpp"61#include "oops/recordComponent.hpp"62#include "oops/objArrayKlass.hpp"63#include "oops/objArrayOop.inline.hpp"64#include "oops/oop.inline.hpp"65#include "prims/jvm_misc.hpp"66#include "prims/jvmtiExport.hpp"67#include "prims/jvmtiThreadState.hpp"68#include "prims/stackwalk.hpp"69#include "runtime/arguments.hpp"70#include "runtime/atomic.hpp"71#include "runtime/globals_extension.hpp"72#include "runtime/handles.inline.hpp"73#include "runtime/init.hpp"74#include "runtime/interfaceSupport.inline.hpp"75#include "runtime/deoptimization.hpp"76#include "runtime/handshake.hpp"77#include "runtime/java.hpp"78#include "runtime/javaCalls.hpp"79#include "runtime/jfieldIDWorkaround.hpp"80#include "runtime/jniHandles.inline.hpp"81#include "runtime/os.inline.hpp"82#include "runtime/osThread.hpp"83#include "runtime/perfData.hpp"84#include "runtime/reflection.hpp"85#include "runtime/synchronizer.hpp"86#include "runtime/thread.inline.hpp"87#include "runtime/threadSMR.hpp"88#include "runtime/vframe.inline.hpp"89#include "runtime/vmOperations.hpp"90#include "runtime/vm_version.hpp"91#include "services/attachListener.hpp"92#include "services/management.hpp"93#include "services/threadService.hpp"94#include "utilities/copy.hpp"95#include "utilities/defaultStream.hpp"96#include "utilities/dtrace.hpp"97#include "utilities/events.hpp"98#include "utilities/macros.hpp"99#include "utilities/utf8.hpp"100#if INCLUDE_CDS101#include "classfile/systemDictionaryShared.hpp"102#endif103#if INCLUDE_JFR104#include "jfr/jfr.hpp"105#endif106107#include <errno.h>108109/*110NOTE about use of any ctor or function call that can trigger a safepoint/GC:111such ctors and calls MUST NOT come between an oop declaration/init and its112usage because if objects are move this may cause various memory stomps, bus113errors and segfaults. Here is a cookbook for causing so called "naked oop114failures":115116JVM_ENTRY(jobjectArray, JVM_GetClassDeclaredFields<etc> {117// Object address to be held directly in mirror & not visible to GC118oop mirror = JNIHandles::resolve_non_null(ofClass);119120// If this ctor can hit a safepoint, moving objects around, then121ComplexConstructor foo;122123// Boom! mirror may point to JUNK instead of the intended object124(some dereference of mirror)125126// Here's another call that may block for GC, making mirror stale127MutexLocker ml(some_lock);128129// And here's an initializer that can result in a stale oop130// all in one step.131oop o = call_that_can_throw_exception(TRAPS);132133134The solution is to keep the oop declaration BELOW the ctor or function135call that might cause a GC, do another resolve to reassign the oop, or136consider use of a Handle instead of an oop so there is immunity from object137motion. But note that the "QUICK" entries below do not have a handlemark138and thus can only support use of handles passed in.139*/140141static void trace_class_resolution_impl(Klass* to_class, TRAPS) {142ResourceMark rm;143int line_number = -1;144const char * source_file = NULL;145const char * trace = "explicit";146InstanceKlass* caller = NULL;147JavaThread* jthread = THREAD;148if (jthread->has_last_Java_frame()) {149vframeStream vfst(jthread);150151// scan up the stack skipping ClassLoader, AccessController and PrivilegedAction frames152TempNewSymbol access_controller = SymbolTable::new_symbol("java/security/AccessController");153Klass* access_controller_klass = SystemDictionary::resolve_or_fail(access_controller, false, CHECK);154TempNewSymbol privileged_action = SymbolTable::new_symbol("java/security/PrivilegedAction");155Klass* privileged_action_klass = SystemDictionary::resolve_or_fail(privileged_action, false, CHECK);156157Method* last_caller = NULL;158159while (!vfst.at_end()) {160Method* m = vfst.method();161if (!vfst.method()->method_holder()->is_subclass_of(vmClasses::ClassLoader_klass())&&162!vfst.method()->method_holder()->is_subclass_of(access_controller_klass) &&163!vfst.method()->method_holder()->is_subclass_of(privileged_action_klass)) {164break;165}166last_caller = m;167vfst.next();168}169// if this is called from Class.forName0 and that is called from Class.forName,170// then print the caller of Class.forName. If this is Class.loadClass, then print171// that caller, otherwise keep quiet since this should be picked up elsewhere.172bool found_it = false;173if (!vfst.at_end() &&174vfst.method()->method_holder()->name() == vmSymbols::java_lang_Class() &&175vfst.method()->name() == vmSymbols::forName0_name()) {176vfst.next();177if (!vfst.at_end() &&178vfst.method()->method_holder()->name() == vmSymbols::java_lang_Class() &&179vfst.method()->name() == vmSymbols::forName_name()) {180vfst.next();181found_it = true;182}183} else if (last_caller != NULL &&184last_caller->method_holder()->name() ==185vmSymbols::java_lang_ClassLoader() &&186last_caller->name() == vmSymbols::loadClass_name()) {187found_it = true;188} else if (!vfst.at_end()) {189if (vfst.method()->is_native()) {190// JNI call191found_it = true;192}193}194if (found_it && !vfst.at_end()) {195// found the caller196caller = vfst.method()->method_holder();197line_number = vfst.method()->line_number_from_bci(vfst.bci());198if (line_number == -1) {199// show method name if it's a native method200trace = vfst.method()->name_and_sig_as_C_string();201}202Symbol* s = caller->source_file_name();203if (s != NULL) {204source_file = s->as_C_string();205}206}207}208if (caller != NULL) {209if (to_class != caller) {210const char * from = caller->external_name();211const char * to = to_class->external_name();212// print in a single call to reduce interleaving between threads213if (source_file != NULL) {214log_debug(class, resolve)("%s %s %s:%d (%s)", from, to, source_file, line_number, trace);215} else {216log_debug(class, resolve)("%s %s (%s)", from, to, trace);217}218}219}220}221222void trace_class_resolution(Klass* to_class) {223EXCEPTION_MARK;224trace_class_resolution_impl(to_class, THREAD);225if (HAS_PENDING_EXCEPTION) {226CLEAR_PENDING_EXCEPTION;227}228}229230// java.lang.System //////////////////////////////////////////////////////////////////////231232233JVM_LEAF(jlong, JVM_CurrentTimeMillis(JNIEnv *env, jclass ignored))234return os::javaTimeMillis();235JVM_END236237JVM_LEAF(jlong, JVM_NanoTime(JNIEnv *env, jclass ignored))238return os::javaTimeNanos();239JVM_END240241// The function below is actually exposed by jdk.internal.misc.VM and not242// java.lang.System, but we choose to keep it here so that it stays next243// to JVM_CurrentTimeMillis and JVM_NanoTime244245const jlong MAX_DIFF_SECS = CONST64(0x0100000000); // 2^32246const jlong MIN_DIFF_SECS = -MAX_DIFF_SECS; // -2^32247248JVM_LEAF(jlong, JVM_GetNanoTimeAdjustment(JNIEnv *env, jclass ignored, jlong offset_secs))249jlong seconds;250jlong nanos;251252os::javaTimeSystemUTC(seconds, nanos);253254// We're going to verify that the result can fit in a long.255// For that we need the difference in seconds between 'seconds'256// and 'offset_secs' to be such that:257// |seconds - offset_secs| < (2^63/10^9)258// We're going to approximate 10^9 ~< 2^30 (1000^3 ~< 1024^3)259// which makes |seconds - offset_secs| < 2^33260// and we will prefer +/- 2^32 as the maximum acceptable diff261// as 2^32 has a more natural feel than 2^33...262//263// So if |seconds - offset_secs| >= 2^32 - we return a special264// sentinel value (-1) which the caller should take as an265// exception value indicating that the offset given to us is266// too far from range of the current time - leading to too big267// a nano adjustment. The caller is expected to recover by268// computing a more accurate offset and calling this method269// again. (For the record 2^32 secs is ~136 years, so that270// should rarely happen)271//272jlong diff = seconds - offset_secs;273if (diff >= MAX_DIFF_SECS || diff <= MIN_DIFF_SECS) {274return -1; // sentinel value: the offset is too far off the target275}276277// return the adjustment. If you compute a time by adding278// this number of nanoseconds along with the number of seconds279// in the offset you should get the current UTC time.280return (diff * (jlong)1000000000) + nanos;281JVM_END282283JVM_ENTRY(void, JVM_ArrayCopy(JNIEnv *env, jclass ignored, jobject src, jint src_pos,284jobject dst, jint dst_pos, jint length))285// Check if we have null pointers286if (src == NULL || dst == NULL) {287THROW(vmSymbols::java_lang_NullPointerException());288}289arrayOop s = arrayOop(JNIHandles::resolve_non_null(src));290arrayOop d = arrayOop(JNIHandles::resolve_non_null(dst));291assert(oopDesc::is_oop(s), "JVM_ArrayCopy: src not an oop");292assert(oopDesc::is_oop(d), "JVM_ArrayCopy: dst not an oop");293// Do copy294s->klass()->copy_array(s, src_pos, d, dst_pos, length, thread);295JVM_END296297298static void set_property(Handle props, const char* key, const char* value, TRAPS) {299JavaValue r(T_OBJECT);300// public synchronized Object put(Object key, Object value);301HandleMark hm(THREAD);302Handle key_str = java_lang_String::create_from_platform_dependent_str(key, CHECK);303Handle value_str = java_lang_String::create_from_platform_dependent_str((value != NULL ? value : ""), CHECK);304JavaCalls::call_virtual(&r,305props,306vmClasses::Properties_klass(),307vmSymbols::put_name(),308vmSymbols::object_object_object_signature(),309key_str,310value_str,311THREAD);312}313314315#define PUTPROP(props, name, value) set_property((props), (name), (value), CHECK_(properties));316317/*318* Return all of the system properties in a Java String array with alternating319* names and values from the jvm SystemProperty.320* Which includes some internal and all commandline -D defined properties.321*/322JVM_ENTRY(jobjectArray, JVM_GetProperties(JNIEnv *env))323ResourceMark rm(THREAD);324HandleMark hm(THREAD);325int ndx = 0;326int fixedCount = 2;327328SystemProperty* p = Arguments::system_properties();329int count = Arguments::PropertyList_count(p);330331// Allocate result String array332InstanceKlass* ik = vmClasses::String_klass();333objArrayOop r = oopFactory::new_objArray(ik, (count + fixedCount) * 2, CHECK_NULL);334objArrayHandle result_h(THREAD, r);335336while (p != NULL) {337const char * key = p->key();338if (strcmp(key, "sun.nio.MaxDirectMemorySize") != 0) {339const char * value = p->value();340Handle key_str = java_lang_String::create_from_platform_dependent_str(key, CHECK_NULL);341Handle value_str = java_lang_String::create_from_platform_dependent_str((value != NULL ? value : ""), CHECK_NULL);342result_h->obj_at_put(ndx * 2, key_str());343result_h->obj_at_put(ndx * 2 + 1, value_str());344ndx++;345}346p = p->next();347}348349// Convert the -XX:MaxDirectMemorySize= command line flag350// to the sun.nio.MaxDirectMemorySize property.351// Do this after setting user properties to prevent people352// from setting the value with a -D option, as requested.353// Leave empty if not supplied354if (!FLAG_IS_DEFAULT(MaxDirectMemorySize)) {355char as_chars[256];356jio_snprintf(as_chars, sizeof(as_chars), JULONG_FORMAT, MaxDirectMemorySize);357Handle key_str = java_lang_String::create_from_platform_dependent_str("sun.nio.MaxDirectMemorySize", CHECK_NULL);358Handle value_str = java_lang_String::create_from_platform_dependent_str(as_chars, CHECK_NULL);359result_h->obj_at_put(ndx * 2, key_str());360result_h->obj_at_put(ndx * 2 + 1, value_str());361ndx++;362}363364// JVM monitoring and management support365// Add the sun.management.compiler property for the compiler's name366{367#undef CSIZE368#if defined(_LP64) || defined(_WIN64)369#define CSIZE "64-Bit "370#else371#define CSIZE372#endif // 64bit373374#if COMPILER1_AND_COMPILER2375const char* compiler_name = "HotSpot " CSIZE "Tiered Compilers";376#else377#if defined(COMPILER1)378const char* compiler_name = "HotSpot " CSIZE "Client Compiler";379#elif defined(COMPILER2)380const char* compiler_name = "HotSpot " CSIZE "Server Compiler";381#elif INCLUDE_JVMCI382#error "INCLUDE_JVMCI should imply COMPILER1_OR_COMPILER2"383#else384const char* compiler_name = "";385#endif // compilers386#endif // COMPILER1_AND_COMPILER2387388if (*compiler_name != '\0' &&389(Arguments::mode() != Arguments::_int)) {390Handle key_str = java_lang_String::create_from_platform_dependent_str("sun.management.compiler", CHECK_NULL);391Handle value_str = java_lang_String::create_from_platform_dependent_str(compiler_name, CHECK_NULL);392result_h->obj_at_put(ndx * 2, key_str());393result_h->obj_at_put(ndx * 2 + 1, value_str());394ndx++;395}396}397398return (jobjectArray) JNIHandles::make_local(THREAD, result_h());399JVM_END400401402/*403* Return the temporary directory that the VM uses for the attach404* and perf data files.405*406* It is important that this directory is well-known and the407* same for all VM instances. It cannot be affected by configuration408* variables such as java.io.tmpdir.409*/410JVM_ENTRY(jstring, JVM_GetTemporaryDirectory(JNIEnv *env))411HandleMark hm(THREAD);412const char* temp_dir = os::get_temp_directory();413Handle h = java_lang_String::create_from_platform_dependent_str(temp_dir, CHECK_NULL);414return (jstring) JNIHandles::make_local(THREAD, h());415JVM_END416417418// java.lang.Runtime /////////////////////////////////////////////////////////////////////////419420extern volatile jint vm_created;421422JVM_ENTRY_NO_ENV(void, JVM_BeforeHalt())423#if INCLUDE_CDS424// Link all classes for dynamic CDS dumping before vm exit.425if (DynamicDumpSharedSpaces) {426DynamicArchive::prepare_for_dynamic_dumping_at_exit();427}428#endif429EventShutdown event;430if (event.should_commit()) {431event.set_reason("Shutdown requested from Java");432event.commit();433}434JVM_END435436437JVM_ENTRY_NO_ENV(void, JVM_Halt(jint code))438before_exit(thread, true);439vm_exit(code);440JVM_END441442443JVM_ENTRY_NO_ENV(void, JVM_GC(void))444if (!DisableExplicitGC) {445EventSystemGC event;446event.set_invokedConcurrent(ExplicitGCInvokesConcurrent);447Universe::heap()->collect(GCCause::_java_lang_system_gc);448event.commit();449}450JVM_END451452453JVM_LEAF(jlong, JVM_MaxObjectInspectionAge(void))454return Universe::heap()->millis_since_last_whole_heap_examined();455JVM_END456457458static inline jlong convert_size_t_to_jlong(size_t val) {459// In the 64-bit vm, a size_t can overflow a jlong (which is signed).460NOT_LP64 (return (jlong)val;)461LP64_ONLY(return (jlong)MIN2(val, (size_t)max_jlong);)462}463464JVM_ENTRY_NO_ENV(jlong, JVM_TotalMemory(void))465size_t n = Universe::heap()->capacity();466return convert_size_t_to_jlong(n);467JVM_END468469470JVM_ENTRY_NO_ENV(jlong, JVM_FreeMemory(void))471size_t n = Universe::heap()->unused();472return convert_size_t_to_jlong(n);473JVM_END474475476JVM_ENTRY_NO_ENV(jlong, JVM_MaxMemory(void))477size_t n = Universe::heap()->max_capacity();478return convert_size_t_to_jlong(n);479JVM_END480481482JVM_ENTRY_NO_ENV(jint, JVM_ActiveProcessorCount(void))483return os::active_processor_count();484JVM_END485486JVM_ENTRY_NO_ENV(jboolean, JVM_IsUseContainerSupport(void))487#ifdef LINUX488if (UseContainerSupport) {489return JNI_TRUE;490}491#endif492return JNI_FALSE;493JVM_END494495// java.lang.Throwable //////////////////////////////////////////////////////496497JVM_ENTRY(void, JVM_FillInStackTrace(JNIEnv *env, jobject receiver))498Handle exception(thread, JNIHandles::resolve_non_null(receiver));499java_lang_Throwable::fill_in_stack_trace(exception);500JVM_END501502// java.lang.NullPointerException ///////////////////////////////////////////503504JVM_ENTRY(jstring, JVM_GetExtendedNPEMessage(JNIEnv *env, jthrowable throwable))505if (!ShowCodeDetailsInExceptionMessages) return NULL;506507oop exc = JNIHandles::resolve_non_null(throwable);508509Method* method;510int bci;511if (!java_lang_Throwable::get_top_method_and_bci(exc, &method, &bci)) {512return NULL;513}514if (method->is_native()) {515return NULL;516}517518stringStream ss;519bool ok = BytecodeUtils::get_NPE_message_at(&ss, method, bci);520if (ok) {521oop result = java_lang_String::create_oop_from_str(ss.base(), CHECK_NULL);522return (jstring) JNIHandles::make_local(THREAD, result);523} else {524return NULL;525}526JVM_END527528// java.lang.StackTraceElement //////////////////////////////////////////////529530531JVM_ENTRY(void, JVM_InitStackTraceElementArray(JNIEnv *env, jobjectArray elements, jobject throwable))532Handle exception(THREAD, JNIHandles::resolve(throwable));533objArrayOop st = objArrayOop(JNIHandles::resolve(elements));534objArrayHandle stack_trace(THREAD, st);535// Fill in the allocated stack trace536java_lang_Throwable::get_stack_trace_elements(exception, stack_trace, CHECK);537JVM_END538539540JVM_ENTRY(void, JVM_InitStackTraceElement(JNIEnv* env, jobject element, jobject stackFrameInfo))541Handle stack_frame_info(THREAD, JNIHandles::resolve_non_null(stackFrameInfo));542Handle stack_trace_element(THREAD, JNIHandles::resolve_non_null(element));543java_lang_StackFrameInfo::to_stack_trace_element(stack_frame_info, stack_trace_element, THREAD);544JVM_END545546547// java.lang.StackWalker //////////////////////////////////////////////////////548549550JVM_ENTRY(jobject, JVM_CallStackWalk(JNIEnv *env, jobject stackStream, jlong mode,551jint skip_frames, jint frame_count, jint start_index,552jobjectArray frames))553if (!thread->has_last_Java_frame()) {554THROW_MSG_(vmSymbols::java_lang_InternalError(), "doStackWalk: no stack trace", NULL);555}556557Handle stackStream_h(THREAD, JNIHandles::resolve_non_null(stackStream));558559// frames array is a Class<?>[] array when only getting caller reference,560// and a StackFrameInfo[] array (or derivative) otherwise. It should never561// be null.562objArrayOop fa = objArrayOop(JNIHandles::resolve_non_null(frames));563objArrayHandle frames_array_h(THREAD, fa);564565int limit = start_index + frame_count;566if (frames_array_h->length() < limit) {567THROW_MSG_(vmSymbols::java_lang_IllegalArgumentException(), "not enough space in buffers", NULL);568}569570oop result = StackWalk::walk(stackStream_h, mode, skip_frames, frame_count,571start_index, frames_array_h, CHECK_NULL);572return JNIHandles::make_local(THREAD, result);573JVM_END574575576JVM_ENTRY(jint, JVM_MoreStackWalk(JNIEnv *env, jobject stackStream, jlong mode, jlong anchor,577jint frame_count, jint start_index,578jobjectArray frames))579// frames array is a Class<?>[] array when only getting caller reference,580// and a StackFrameInfo[] array (or derivative) otherwise. It should never581// be null.582objArrayOop fa = objArrayOop(JNIHandles::resolve_non_null(frames));583objArrayHandle frames_array_h(THREAD, fa);584585int limit = start_index+frame_count;586if (frames_array_h->length() < limit) {587THROW_MSG_0(vmSymbols::java_lang_IllegalArgumentException(), "not enough space in buffers");588}589590Handle stackStream_h(THREAD, JNIHandles::resolve_non_null(stackStream));591return StackWalk::fetchNextBatch(stackStream_h, mode, anchor, frame_count,592start_index, frames_array_h, THREAD);593JVM_END594595// java.lang.Object ///////////////////////////////////////////////596597598JVM_ENTRY(jint, JVM_IHashCode(JNIEnv* env, jobject handle))599// as implemented in the classic virtual machine; return 0 if object is NULL600return handle == NULL ? 0 : ObjectSynchronizer::FastHashCode (THREAD, JNIHandles::resolve_non_null(handle)) ;601JVM_END602603604JVM_ENTRY(void, JVM_MonitorWait(JNIEnv* env, jobject handle, jlong ms))605Handle obj(THREAD, JNIHandles::resolve_non_null(handle));606JavaThreadInObjectWaitState jtiows(thread, ms != 0);607if (JvmtiExport::should_post_monitor_wait()) {608JvmtiExport::post_monitor_wait(thread, obj(), ms);609610// The current thread already owns the monitor and it has not yet611// been added to the wait queue so the current thread cannot be612// made the successor. This means that the JVMTI_EVENT_MONITOR_WAIT613// event handler cannot accidentally consume an unpark() meant for614// the ParkEvent associated with this ObjectMonitor.615}616ObjectSynchronizer::wait(obj, ms, CHECK);617JVM_END618619620JVM_ENTRY(void, JVM_MonitorNotify(JNIEnv* env, jobject handle))621Handle obj(THREAD, JNIHandles::resolve_non_null(handle));622ObjectSynchronizer::notify(obj, CHECK);623JVM_END624625626JVM_ENTRY(void, JVM_MonitorNotifyAll(JNIEnv* env, jobject handle))627Handle obj(THREAD, JNIHandles::resolve_non_null(handle));628ObjectSynchronizer::notifyall(obj, CHECK);629JVM_END630631632JVM_ENTRY(jobject, JVM_Clone(JNIEnv* env, jobject handle))633Handle obj(THREAD, JNIHandles::resolve_non_null(handle));634Klass* klass = obj->klass();635JvmtiVMObjectAllocEventCollector oam;636637#ifdef ASSERT638// Just checking that the cloneable flag is set correct639if (obj->is_array()) {640guarantee(klass->is_cloneable(), "all arrays are cloneable");641} else {642guarantee(obj->is_instance(), "should be instanceOop");643bool cloneable = klass->is_subtype_of(vmClasses::Cloneable_klass());644guarantee(cloneable == klass->is_cloneable(), "incorrect cloneable flag");645}646#endif647648// Check if class of obj supports the Cloneable interface.649// All arrays are considered to be cloneable (See JLS 20.1.5).650// All j.l.r.Reference classes are considered non-cloneable.651if (!klass->is_cloneable() ||652(klass->is_instance_klass() &&653InstanceKlass::cast(klass)->reference_type() != REF_NONE)) {654ResourceMark rm(THREAD);655THROW_MSG_0(vmSymbols::java_lang_CloneNotSupportedException(), klass->external_name());656}657658// Make shallow object copy659const int size = obj->size();660oop new_obj_oop = NULL;661if (obj->is_array()) {662const int length = ((arrayOop)obj())->length();663new_obj_oop = Universe::heap()->array_allocate(klass, size, length,664/* do_zero */ true, CHECK_NULL);665} else {666new_obj_oop = Universe::heap()->obj_allocate(klass, size, CHECK_NULL);667}668669HeapAccess<>::clone(obj(), new_obj_oop, size);670671Handle new_obj(THREAD, new_obj_oop);672// Caution: this involves a java upcall, so the clone should be673// "gc-robust" by this stage.674if (klass->has_finalizer()) {675assert(obj->is_instance(), "should be instanceOop");676new_obj_oop = InstanceKlass::register_finalizer(instanceOop(new_obj()), CHECK_NULL);677new_obj = Handle(THREAD, new_obj_oop);678}679680return JNIHandles::make_local(THREAD, new_obj());681JVM_END682683// java.io.File ///////////////////////////////////////////////////////////////684685JVM_LEAF(char*, JVM_NativePath(char* path))686return os::native_path(path);687JVM_END688689690// Misc. class handling ///////////////////////////////////////////////////////////691692693JVM_ENTRY(jclass, JVM_GetCallerClass(JNIEnv* env))694// Getting the class of the caller frame.695//696// The call stack at this point looks something like this:697//698// [0] [ @CallerSensitive public sun.reflect.Reflection.getCallerClass ]699// [1] [ @CallerSensitive API.method ]700// [.] [ (skipped intermediate frames) ]701// [n] [ caller ]702vframeStream vfst(thread);703// Cf. LibraryCallKit::inline_native_Reflection_getCallerClass704for (int n = 0; !vfst.at_end(); vfst.security_next(), n++) {705Method* m = vfst.method();706assert(m != NULL, "sanity");707switch (n) {708case 0:709// This must only be called from Reflection.getCallerClass710if (m->intrinsic_id() != vmIntrinsics::_getCallerClass) {711THROW_MSG_NULL(vmSymbols::java_lang_InternalError(), "JVM_GetCallerClass must only be called from Reflection.getCallerClass");712}713// fall-through714case 1:715// Frame 0 and 1 must be caller sensitive.716if (!m->caller_sensitive()) {717THROW_MSG_NULL(vmSymbols::java_lang_InternalError(), err_msg("CallerSensitive annotation expected at frame %d", n));718}719break;720default:721if (!m->is_ignored_by_security_stack_walk()) {722// We have reached the desired frame; return the holder class.723return (jclass) JNIHandles::make_local(THREAD, m->method_holder()->java_mirror());724}725break;726}727}728return NULL;729JVM_END730731732JVM_ENTRY(jclass, JVM_FindPrimitiveClass(JNIEnv* env, const char* utf))733oop mirror = NULL;734BasicType t = name2type(utf);735if (t != T_ILLEGAL && !is_reference_type(t)) {736mirror = Universe::java_mirror(t);737}738if (mirror == NULL) {739THROW_MSG_0(vmSymbols::java_lang_ClassNotFoundException(), (char*) utf);740} else {741return (jclass) JNIHandles::make_local(THREAD, mirror);742}743JVM_END744745746// Returns a class loaded by the bootstrap class loader; or null747// if not found. ClassNotFoundException is not thrown.748// FindClassFromBootLoader is exported to the launcher for windows.749JVM_ENTRY(jclass, JVM_FindClassFromBootLoader(JNIEnv* env,750const char* name))751// Java libraries should ensure that name is never null or illegal.752if (name == NULL || (int)strlen(name) > Symbol::max_length()) {753// It's impossible to create this class; the name cannot fit754// into the constant pool.755return NULL;756}757assert(UTF8::is_legal_utf8((const unsigned char*)name, (int)strlen(name), false), "illegal UTF name");758759TempNewSymbol h_name = SymbolTable::new_symbol(name);760Klass* k = SystemDictionary::resolve_or_null(h_name, CHECK_NULL);761if (k == NULL) {762return NULL;763}764765if (log_is_enabled(Debug, class, resolve)) {766trace_class_resolution(k);767}768return (jclass) JNIHandles::make_local(THREAD, k->java_mirror());769JVM_END770771// Find a class with this name in this loader, using the caller's protection domain.772JVM_ENTRY(jclass, JVM_FindClassFromCaller(JNIEnv* env, const char* name,773jboolean init, jobject loader,774jclass caller))775TempNewSymbol h_name =776SystemDictionary::class_name_symbol(name, vmSymbols::java_lang_ClassNotFoundException(),777CHECK_NULL);778779oop loader_oop = JNIHandles::resolve(loader);780oop from_class = JNIHandles::resolve(caller);781oop protection_domain = NULL;782// If loader is null, shouldn't call ClassLoader.checkPackageAccess; otherwise get783// NPE. Put it in another way, the bootstrap class loader has all permission and784// thus no checkPackageAccess equivalence in the VM class loader.785// The caller is also passed as NULL by the java code if there is no security786// manager to avoid the performance cost of getting the calling class.787if (from_class != NULL && loader_oop != NULL) {788protection_domain = java_lang_Class::as_Klass(from_class)->protection_domain();789}790791Handle h_loader(THREAD, loader_oop);792Handle h_prot(THREAD, protection_domain);793jclass result = find_class_from_class_loader(env, h_name, init, h_loader,794h_prot, false, THREAD);795796if (log_is_enabled(Debug, class, resolve) && result != NULL) {797trace_class_resolution(java_lang_Class::as_Klass(JNIHandles::resolve_non_null(result)));798}799return result;800JVM_END801802// Currently only called from the old verifier.803JVM_ENTRY(jclass, JVM_FindClassFromClass(JNIEnv *env, const char *name,804jboolean init, jclass from))805TempNewSymbol h_name =806SystemDictionary::class_name_symbol(name, vmSymbols::java_lang_ClassNotFoundException(),807CHECK_NULL);808oop from_class_oop = JNIHandles::resolve(from);809Klass* from_class = (from_class_oop == NULL)810? (Klass*)NULL811: java_lang_Class::as_Klass(from_class_oop);812oop class_loader = NULL;813oop protection_domain = NULL;814if (from_class != NULL) {815class_loader = from_class->class_loader();816protection_domain = from_class->protection_domain();817}818Handle h_loader(THREAD, class_loader);819Handle h_prot (THREAD, protection_domain);820jclass result = find_class_from_class_loader(env, h_name, init, h_loader,821h_prot, true, thread);822823if (log_is_enabled(Debug, class, resolve) && result != NULL) {824// this function is generally only used for class loading during verification.825ResourceMark rm;826oop from_mirror = JNIHandles::resolve_non_null(from);827Klass* from_class = java_lang_Class::as_Klass(from_mirror);828const char * from_name = from_class->external_name();829830oop mirror = JNIHandles::resolve_non_null(result);831Klass* to_class = java_lang_Class::as_Klass(mirror);832const char * to = to_class->external_name();833log_debug(class, resolve)("%s %s (verification)", from_name, to);834}835836return result;837JVM_END838839// common code for JVM_DefineClass() and JVM_DefineClassWithSource()840static jclass jvm_define_class_common(const char *name,841jobject loader, const jbyte *buf,842jsize len, jobject pd, const char *source,843TRAPS) {844if (source == NULL) source = "__JVM_DefineClass__";845846JavaThread* jt = THREAD;847848PerfClassTraceTime vmtimer(ClassLoader::perf_define_appclass_time(),849ClassLoader::perf_define_appclass_selftime(),850ClassLoader::perf_define_appclasses(),851jt->get_thread_stat()->perf_recursion_counts_addr(),852jt->get_thread_stat()->perf_timers_addr(),853PerfClassTraceTime::DEFINE_CLASS);854855if (UsePerfData) {856ClassLoader::perf_app_classfile_bytes_read()->inc(len);857}858859// Class resolution will get the class name from the .class stream if the name is null.860TempNewSymbol class_name = name == NULL ? NULL :861SystemDictionary::class_name_symbol(name, vmSymbols::java_lang_NoClassDefFoundError(),862CHECK_NULL);863864ResourceMark rm(THREAD);865ClassFileStream st((u1*)buf, len, source, ClassFileStream::verify);866Handle class_loader (THREAD, JNIHandles::resolve(loader));867Handle protection_domain (THREAD, JNIHandles::resolve(pd));868ClassLoadInfo cl_info(protection_domain);869Klass* k = SystemDictionary::resolve_from_stream(&st, class_name,870class_loader,871cl_info,872CHECK_NULL);873874if (log_is_enabled(Debug, class, resolve)) {875trace_class_resolution(k);876}877878return (jclass) JNIHandles::make_local(THREAD, k->java_mirror());879}880881enum {882NESTMATE = java_lang_invoke_MemberName::MN_NESTMATE_CLASS,883HIDDEN_CLASS = java_lang_invoke_MemberName::MN_HIDDEN_CLASS,884STRONG_LOADER_LINK = java_lang_invoke_MemberName::MN_STRONG_LOADER_LINK,885ACCESS_VM_ANNOTATIONS = java_lang_invoke_MemberName::MN_ACCESS_VM_ANNOTATIONS886};887888/*889* Define a class with the specified flags that indicates if it's a nestmate,890* hidden, or strongly referenced from class loader.891*/892static jclass jvm_lookup_define_class(jclass lookup, const char *name,893const jbyte *buf, jsize len, jobject pd,894jboolean init, int flags, jobject classData, TRAPS) {895ResourceMark rm(THREAD);896897Klass* lookup_k = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(lookup));898// Lookup class must be a non-null instance899if (lookup_k == NULL) {900THROW_MSG_0(vmSymbols::java_lang_IllegalArgumentException(), "Lookup class is null");901}902assert(lookup_k->is_instance_klass(), "Lookup class must be an instance klass");903904Handle class_loader (THREAD, lookup_k->class_loader());905906bool is_nestmate = (flags & NESTMATE) == NESTMATE;907bool is_hidden = (flags & HIDDEN_CLASS) == HIDDEN_CLASS;908bool is_strong = (flags & STRONG_LOADER_LINK) == STRONG_LOADER_LINK;909bool vm_annotations = (flags & ACCESS_VM_ANNOTATIONS) == ACCESS_VM_ANNOTATIONS;910911InstanceKlass* host_class = NULL;912if (is_nestmate) {913host_class = InstanceKlass::cast(lookup_k)->nest_host(CHECK_NULL);914}915916log_info(class, nestmates)("LookupDefineClass: %s - %s%s, %s, %s, %s",917name,918is_nestmate ? "with dynamic nest-host " : "non-nestmate",919is_nestmate ? host_class->external_name() : "",920is_hidden ? "hidden" : "not hidden",921is_strong ? "strong" : "weak",922vm_annotations ? "with vm annotations" : "without vm annotation");923924if (!is_hidden) {925// classData is only applicable for hidden classes926if (classData != NULL) {927THROW_MSG_0(vmSymbols::java_lang_IllegalArgumentException(), "classData is only applicable for hidden classes");928}929if (is_nestmate) {930THROW_MSG_0(vmSymbols::java_lang_IllegalArgumentException(), "dynamic nestmate is only applicable for hidden classes");931}932if (!is_strong) {933THROW_MSG_0(vmSymbols::java_lang_IllegalArgumentException(), "an ordinary class must be strongly referenced by its defining loader");934}935if (vm_annotations) {936THROW_MSG_0(vmSymbols::java_lang_IllegalArgumentException(), "vm annotations only allowed for hidden classes");937}938if (flags != STRONG_LOADER_LINK) {939THROW_MSG_0(vmSymbols::java_lang_IllegalArgumentException(),940err_msg("invalid flag 0x%x", flags));941}942}943944// Class resolution will get the class name from the .class stream if the name is null.945TempNewSymbol class_name = name == NULL ? NULL :946SystemDictionary::class_name_symbol(name, vmSymbols::java_lang_NoClassDefFoundError(),947CHECK_NULL);948949Handle protection_domain (THREAD, JNIHandles::resolve(pd));950const char* source = is_nestmate ? host_class->external_name() : "__JVM_LookupDefineClass__";951ClassFileStream st((u1*)buf, len, source, ClassFileStream::verify);952953InstanceKlass* ik = NULL;954if (!is_hidden) {955ClassLoadInfo cl_info(protection_domain);956ik = SystemDictionary::resolve_from_stream(&st, class_name,957class_loader,958cl_info,959CHECK_NULL);960961if (log_is_enabled(Debug, class, resolve)) {962trace_class_resolution(ik);963}964} else { // hidden965Handle classData_h(THREAD, JNIHandles::resolve(classData));966ClassLoadInfo cl_info(protection_domain,967host_class,968classData_h,969is_hidden,970is_strong,971vm_annotations);972ik = SystemDictionary::resolve_from_stream(&st, class_name,973class_loader,974cl_info,975CHECK_NULL);976977// The hidden class loader data has been artificially been kept alive to978// this point. The mirror and any instances of this class have to keep979// it alive afterwards.980ik->class_loader_data()->dec_keep_alive();981982if (is_nestmate && log_is_enabled(Debug, class, nestmates)) {983ModuleEntry* module = ik->module();984const char * module_name = module->is_named() ? module->name()->as_C_string() : UNNAMED_MODULE;985log_debug(class, nestmates)("Dynamic nestmate: %s/%s, nest_host %s, %s",986module_name,987ik->external_name(),988host_class->external_name(),989ik->is_hidden() ? "is hidden" : "is not hidden");990}991}992assert(Reflection::is_same_class_package(lookup_k, ik),993"lookup class and defined class are in different packages");994995if (init) {996ik->initialize(CHECK_NULL);997} else {998ik->link_class(CHECK_NULL);999}10001001return (jclass) JNIHandles::make_local(THREAD, ik->java_mirror());1002}10031004JVM_ENTRY(jclass, JVM_DefineClass(JNIEnv *env, const char *name, jobject loader, const jbyte *buf, jsize len, jobject pd))1005return jvm_define_class_common(name, loader, buf, len, pd, NULL, THREAD);1006JVM_END10071008/*1009* Define a class with the specified lookup class.1010* lookup: Lookup class1011* name: the name of the class1012* buf: class bytes1013* len: length of class bytes1014* pd: protection domain1015* init: initialize the class1016* flags: properties of the class1017* classData: private static pre-initialized field1018*/1019JVM_ENTRY(jclass, JVM_LookupDefineClass(JNIEnv *env, jclass lookup, const char *name, const jbyte *buf,1020jsize len, jobject pd, jboolean initialize, int flags, jobject classData))10211022if (lookup == NULL) {1023THROW_MSG_0(vmSymbols::java_lang_IllegalArgumentException(), "Lookup class is null");1024}10251026assert(buf != NULL, "buf must not be NULL");10271028return jvm_lookup_define_class(lookup, name, buf, len, pd, initialize, flags, classData, THREAD);1029JVM_END10301031JVM_ENTRY(jclass, JVM_DefineClassWithSource(JNIEnv *env, const char *name, jobject loader, const jbyte *buf, jsize len, jobject pd, const char *source))10321033return jvm_define_class_common(name, loader, buf, len, pd, source, THREAD);1034JVM_END10351036JVM_ENTRY(jclass, JVM_FindLoadedClass(JNIEnv *env, jobject loader, jstring name))1037ResourceMark rm(THREAD);10381039Handle h_name (THREAD, JNIHandles::resolve_non_null(name));1040char* str = java_lang_String::as_utf8_string(h_name());10411042// Sanity check, don't expect null1043if (str == NULL) return NULL;10441045// Internalize the string, converting '.' to '/' in string.1046char* p = (char*)str;1047while (*p != '\0') {1048if (*p == '.') {1049*p = '/';1050}1051p++;1052}10531054const int str_len = (int)(p - str);1055if (str_len > Symbol::max_length()) {1056// It's impossible to create this class; the name cannot fit1057// into the constant pool.1058return NULL;1059}1060TempNewSymbol klass_name = SymbolTable::new_symbol(str, str_len);10611062// Security Note:1063// The Java level wrapper will perform the necessary security check allowing1064// us to pass the NULL as the initiating class loader.1065Handle h_loader(THREAD, JNIHandles::resolve(loader));1066Klass* k = SystemDictionary::find_instance_or_array_klass(klass_name,1067h_loader,1068Handle());1069#if INCLUDE_CDS1070if (k == NULL) {1071// If the class is not already loaded, try to see if it's in the shared1072// archive for the current classloader (h_loader).1073k = SystemDictionaryShared::find_or_load_shared_class(klass_name, h_loader, CHECK_NULL);1074}1075#endif1076return (k == NULL) ? NULL :1077(jclass) JNIHandles::make_local(THREAD, k->java_mirror());1078JVM_END10791080// Module support //////////////////////////////////////////////////////////////////////////////10811082JVM_ENTRY(void, JVM_DefineModule(JNIEnv *env, jobject module, jboolean is_open, jstring version,1083jstring location, jobjectArray packages))1084Handle h_module (THREAD, JNIHandles::resolve(module));1085Modules::define_module(h_module, is_open, version, location, packages, CHECK);1086JVM_END10871088JVM_ENTRY(void, JVM_SetBootLoaderUnnamedModule(JNIEnv *env, jobject module))1089Handle h_module (THREAD, JNIHandles::resolve(module));1090Modules::set_bootloader_unnamed_module(h_module, CHECK);1091JVM_END10921093JVM_ENTRY(void, JVM_AddModuleExports(JNIEnv *env, jobject from_module, jstring package, jobject to_module))1094Handle h_from_module (THREAD, JNIHandles::resolve(from_module));1095Handle h_to_module (THREAD, JNIHandles::resolve(to_module));1096Modules::add_module_exports_qualified(h_from_module, package, h_to_module, CHECK);1097JVM_END10981099JVM_ENTRY(void, JVM_AddModuleExportsToAllUnnamed(JNIEnv *env, jobject from_module, jstring package))1100Handle h_from_module (THREAD, JNIHandles::resolve(from_module));1101Modules::add_module_exports_to_all_unnamed(h_from_module, package, CHECK);1102JVM_END11031104JVM_ENTRY(void, JVM_AddModuleExportsToAll(JNIEnv *env, jobject from_module, jstring package))1105Handle h_from_module (THREAD, JNIHandles::resolve(from_module));1106Modules::add_module_exports(h_from_module, package, Handle(), CHECK);1107JVM_END11081109JVM_ENTRY (void, JVM_AddReadsModule(JNIEnv *env, jobject from_module, jobject source_module))1110Handle h_from_module (THREAD, JNIHandles::resolve(from_module));1111Handle h_source_module (THREAD, JNIHandles::resolve(source_module));1112Modules::add_reads_module(h_from_module, h_source_module, CHECK);1113JVM_END11141115JVM_ENTRY(void, JVM_DefineArchivedModules(JNIEnv *env, jobject platform_loader, jobject system_loader))1116Handle h_platform_loader (THREAD, JNIHandles::resolve(platform_loader));1117Handle h_system_loader (THREAD, JNIHandles::resolve(system_loader));1118Modules::define_archived_modules(h_platform_loader, h_system_loader, CHECK);1119JVM_END11201121// Reflection support //////////////////////////////////////////////////////////////////////////////11221123JVM_ENTRY(jstring, JVM_InitClassName(JNIEnv *env, jclass cls))1124assert (cls != NULL, "illegal class");1125JvmtiVMObjectAllocEventCollector oam;1126ResourceMark rm(THREAD);1127HandleMark hm(THREAD);1128Handle java_class(THREAD, JNIHandles::resolve(cls));1129oop result = java_lang_Class::name(java_class, CHECK_NULL);1130return (jstring) JNIHandles::make_local(THREAD, result);1131JVM_END113211331134JVM_ENTRY(jobjectArray, JVM_GetClassInterfaces(JNIEnv *env, jclass cls))1135JvmtiVMObjectAllocEventCollector oam;1136oop mirror = JNIHandles::resolve_non_null(cls);11371138// Special handling for primitive objects1139if (java_lang_Class::is_primitive(mirror)) {1140// Primitive objects does not have any interfaces1141objArrayOop r = oopFactory::new_objArray(vmClasses::Class_klass(), 0, CHECK_NULL);1142return (jobjectArray) JNIHandles::make_local(THREAD, r);1143}11441145Klass* klass = java_lang_Class::as_Klass(mirror);1146// Figure size of result array1147int size;1148if (klass->is_instance_klass()) {1149size = InstanceKlass::cast(klass)->local_interfaces()->length();1150} else {1151assert(klass->is_objArray_klass() || klass->is_typeArray_klass(), "Illegal mirror klass");1152size = 2;1153}11541155// Allocate result array1156objArrayOop r = oopFactory::new_objArray(vmClasses::Class_klass(), size, CHECK_NULL);1157objArrayHandle result (THREAD, r);1158// Fill in result1159if (klass->is_instance_klass()) {1160// Regular instance klass, fill in all local interfaces1161for (int index = 0; index < size; index++) {1162Klass* k = InstanceKlass::cast(klass)->local_interfaces()->at(index);1163result->obj_at_put(index, k->java_mirror());1164}1165} else {1166// All arrays implement java.lang.Cloneable and java.io.Serializable1167result->obj_at_put(0, vmClasses::Cloneable_klass()->java_mirror());1168result->obj_at_put(1, vmClasses::Serializable_klass()->java_mirror());1169}1170return (jobjectArray) JNIHandles::make_local(THREAD, result());1171JVM_END117211731174JVM_ENTRY(jboolean, JVM_IsInterface(JNIEnv *env, jclass cls))1175oop mirror = JNIHandles::resolve_non_null(cls);1176if (java_lang_Class::is_primitive(mirror)) {1177return JNI_FALSE;1178}1179Klass* k = java_lang_Class::as_Klass(mirror);1180jboolean result = k->is_interface();1181assert(!result || k->is_instance_klass(),1182"all interfaces are instance types");1183// The compiler intrinsic for isInterface tests the1184// Klass::_access_flags bits in the same way.1185return result;1186JVM_END11871188JVM_ENTRY(jboolean, JVM_IsHiddenClass(JNIEnv *env, jclass cls))1189oop mirror = JNIHandles::resolve_non_null(cls);1190if (java_lang_Class::is_primitive(mirror)) {1191return JNI_FALSE;1192}1193Klass* k = java_lang_Class::as_Klass(mirror);1194return k->is_hidden();1195JVM_END11961197JVM_ENTRY(jobjectArray, JVM_GetClassSigners(JNIEnv *env, jclass cls))1198JvmtiVMObjectAllocEventCollector oam;1199oop mirror = JNIHandles::resolve_non_null(cls);1200if (java_lang_Class::is_primitive(mirror)) {1201// There are no signers for primitive types1202return NULL;1203}12041205objArrayHandle signers(THREAD, java_lang_Class::signers(mirror));12061207// If there are no signers set in the class, or if the class1208// is an array, return NULL.1209if (signers == NULL) return NULL;12101211// copy of the signers array1212Klass* element = ObjArrayKlass::cast(signers->klass())->element_klass();1213objArrayOop signers_copy = oopFactory::new_objArray(element, signers->length(), CHECK_NULL);1214for (int index = 0; index < signers->length(); index++) {1215signers_copy->obj_at_put(index, signers->obj_at(index));1216}12171218// return the copy1219return (jobjectArray) JNIHandles::make_local(THREAD, signers_copy);1220JVM_END122112221223JVM_ENTRY(void, JVM_SetClassSigners(JNIEnv *env, jclass cls, jobjectArray signers))1224oop mirror = JNIHandles::resolve_non_null(cls);1225if (!java_lang_Class::is_primitive(mirror)) {1226// This call is ignored for primitive types and arrays.1227// Signers are only set once, ClassLoader.java, and thus shouldn't1228// be called with an array. Only the bootstrap loader creates arrays.1229Klass* k = java_lang_Class::as_Klass(mirror);1230if (k->is_instance_klass()) {1231java_lang_Class::set_signers(k->java_mirror(), objArrayOop(JNIHandles::resolve(signers)));1232}1233}1234JVM_END123512361237JVM_ENTRY(jobject, JVM_GetProtectionDomain(JNIEnv *env, jclass cls))1238oop mirror = JNIHandles::resolve_non_null(cls);1239if (mirror == NULL) {1240THROW_(vmSymbols::java_lang_NullPointerException(), NULL);1241}12421243if (java_lang_Class::is_primitive(mirror)) {1244// Primitive types does not have a protection domain.1245return NULL;1246}12471248oop pd = java_lang_Class::protection_domain(mirror);1249return (jobject) JNIHandles::make_local(THREAD, pd);1250JVM_END125112521253// Returns the inherited_access_control_context field of the running thread.1254JVM_ENTRY(jobject, JVM_GetInheritedAccessControlContext(JNIEnv *env, jclass cls))1255oop result = java_lang_Thread::inherited_access_control_context(thread->threadObj());1256return JNIHandles::make_local(THREAD, result);1257JVM_END12581259JVM_ENTRY(jobject, JVM_GetStackAccessControlContext(JNIEnv *env, jclass cls))1260if (!UsePrivilegedStack) return NULL;12611262ResourceMark rm(THREAD);1263GrowableArray<Handle>* local_array = new GrowableArray<Handle>(12);1264JvmtiVMObjectAllocEventCollector oam;12651266// count the protection domains on the execution stack. We collapse1267// duplicate consecutive protection domains into a single one, as1268// well as stopping when we hit a privileged frame.12691270oop previous_protection_domain = NULL;1271Handle privileged_context(thread, NULL);1272bool is_privileged = false;1273oop protection_domain = NULL;12741275// Iterate through Java frames1276vframeStream vfst(thread);1277for(; !vfst.at_end(); vfst.next()) {1278// get method of frame1279Method* method = vfst.method();12801281// stop at the first privileged frame1282if (method->method_holder() == vmClasses::AccessController_klass() &&1283method->name() == vmSymbols::executePrivileged_name())1284{1285// this frame is privileged1286is_privileged = true;12871288javaVFrame *priv = vfst.asJavaVFrame(); // executePrivileged12891290StackValueCollection* locals = priv->locals();1291StackValue* ctx_sv = locals->at(1); // AccessControlContext context1292StackValue* clr_sv = locals->at(2); // Class<?> caller1293assert(!ctx_sv->obj_is_scalar_replaced(), "found scalar-replaced object");1294assert(!clr_sv->obj_is_scalar_replaced(), "found scalar-replaced object");1295privileged_context = ctx_sv->get_obj();1296Handle caller = clr_sv->get_obj();12971298Klass *caller_klass = java_lang_Class::as_Klass(caller());1299protection_domain = caller_klass->protection_domain();1300} else {1301protection_domain = method->method_holder()->protection_domain();1302}13031304if ((previous_protection_domain != protection_domain) && (protection_domain != NULL)) {1305local_array->push(Handle(thread, protection_domain));1306previous_protection_domain = protection_domain;1307}13081309if (is_privileged) break;1310}131113121313// either all the domains on the stack were system domains, or1314// we had a privileged system domain1315if (local_array->is_empty()) {1316if (is_privileged && privileged_context.is_null()) return NULL;13171318oop result = java_security_AccessControlContext::create(objArrayHandle(), is_privileged, privileged_context, CHECK_NULL);1319return JNIHandles::make_local(THREAD, result);1320}13211322objArrayOop context = oopFactory::new_objArray(vmClasses::ProtectionDomain_klass(),1323local_array->length(), CHECK_NULL);1324objArrayHandle h_context(thread, context);1325for (int index = 0; index < local_array->length(); index++) {1326h_context->obj_at_put(index, local_array->at(index)());1327}13281329oop result = java_security_AccessControlContext::create(h_context, is_privileged, privileged_context, CHECK_NULL);13301331return JNIHandles::make_local(THREAD, result);1332JVM_END133313341335JVM_ENTRY(jboolean, JVM_IsArrayClass(JNIEnv *env, jclass cls))1336Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(cls));1337return (k != NULL) && k->is_array_klass() ? true : false;1338JVM_END133913401341JVM_ENTRY(jboolean, JVM_IsPrimitiveClass(JNIEnv *env, jclass cls))1342oop mirror = JNIHandles::resolve_non_null(cls);1343return (jboolean) java_lang_Class::is_primitive(mirror);1344JVM_END134513461347JVM_ENTRY(jint, JVM_GetClassModifiers(JNIEnv *env, jclass cls))1348oop mirror = JNIHandles::resolve_non_null(cls);1349if (java_lang_Class::is_primitive(mirror)) {1350// Primitive type1351return JVM_ACC_ABSTRACT | JVM_ACC_FINAL | JVM_ACC_PUBLIC;1352}13531354Klass* k = java_lang_Class::as_Klass(mirror);1355debug_only(int computed_modifiers = k->compute_modifier_flags());1356assert(k->modifier_flags() == computed_modifiers, "modifiers cache is OK");1357return k->modifier_flags();1358JVM_END135913601361// Inner class reflection ///////////////////////////////////////////////////////////////////////////////13621363JVM_ENTRY(jobjectArray, JVM_GetDeclaredClasses(JNIEnv *env, jclass ofClass))1364JvmtiVMObjectAllocEventCollector oam;1365// ofClass is a reference to a java_lang_Class object. The mirror object1366// of an InstanceKlass1367oop ofMirror = JNIHandles::resolve_non_null(ofClass);1368if (java_lang_Class::is_primitive(ofMirror) ||1369! java_lang_Class::as_Klass(ofMirror)->is_instance_klass()) {1370oop result = oopFactory::new_objArray(vmClasses::Class_klass(), 0, CHECK_NULL);1371return (jobjectArray)JNIHandles::make_local(THREAD, result);1372}13731374InstanceKlass* k = InstanceKlass::cast(java_lang_Class::as_Klass(ofMirror));1375InnerClassesIterator iter(k);13761377if (iter.length() == 0) {1378// Neither an inner nor outer class1379oop result = oopFactory::new_objArray(vmClasses::Class_klass(), 0, CHECK_NULL);1380return (jobjectArray)JNIHandles::make_local(THREAD, result);1381}13821383// find inner class info1384constantPoolHandle cp(thread, k->constants());1385int length = iter.length();13861387// Allocate temp. result array1388objArrayOop r = oopFactory::new_objArray(vmClasses::Class_klass(), length/4, CHECK_NULL);1389objArrayHandle result (THREAD, r);1390int members = 0;13911392for (; !iter.done(); iter.next()) {1393int ioff = iter.inner_class_info_index();1394int ooff = iter.outer_class_info_index();13951396if (ioff != 0 && ooff != 0) {1397// Check to see if the name matches the class we're looking for1398// before attempting to find the class.1399if (cp->klass_name_at_matches(k, ooff)) {1400Klass* outer_klass = cp->klass_at(ooff, CHECK_NULL);1401if (outer_klass == k) {1402Klass* ik = cp->klass_at(ioff, CHECK_NULL);1403InstanceKlass* inner_klass = InstanceKlass::cast(ik);14041405// Throws an exception if outer klass has not declared k as1406// an inner klass1407Reflection::check_for_inner_class(k, inner_klass, true, CHECK_NULL);14081409result->obj_at_put(members, inner_klass->java_mirror());1410members++;1411}1412}1413}1414}14151416if (members != length) {1417// Return array of right length1418objArrayOop res = oopFactory::new_objArray(vmClasses::Class_klass(), members, CHECK_NULL);1419for(int i = 0; i < members; i++) {1420res->obj_at_put(i, result->obj_at(i));1421}1422return (jobjectArray)JNIHandles::make_local(THREAD, res);1423}14241425return (jobjectArray)JNIHandles::make_local(THREAD, result());1426JVM_END142714281429JVM_ENTRY(jclass, JVM_GetDeclaringClass(JNIEnv *env, jclass ofClass))1430{1431// ofClass is a reference to a java_lang_Class object.1432oop ofMirror = JNIHandles::resolve_non_null(ofClass);1433if (java_lang_Class::is_primitive(ofMirror)) {1434return NULL;1435}1436Klass* klass = java_lang_Class::as_Klass(ofMirror);1437if (!klass->is_instance_klass()) {1438return NULL;1439}14401441bool inner_is_member = false;1442Klass* outer_klass1443= InstanceKlass::cast(klass)->compute_enclosing_class(&inner_is_member, CHECK_NULL);1444if (outer_klass == NULL) return NULL; // already a top-level class1445if (!inner_is_member) return NULL; // a hidden class (inside a method)1446return (jclass) JNIHandles::make_local(THREAD, outer_klass->java_mirror());1447}1448JVM_END14491450JVM_ENTRY(jstring, JVM_GetSimpleBinaryName(JNIEnv *env, jclass cls))1451{1452oop mirror = JNIHandles::resolve_non_null(cls);1453if (java_lang_Class::is_primitive(mirror)) {1454return NULL;1455}1456Klass* klass = java_lang_Class::as_Klass(mirror);1457if (!klass->is_instance_klass()) {1458return NULL;1459}1460InstanceKlass* k = InstanceKlass::cast(klass);1461int ooff = 0, noff = 0;1462if (k->find_inner_classes_attr(&ooff, &noff, THREAD)) {1463if (noff != 0) {1464constantPoolHandle i_cp(thread, k->constants());1465Symbol* name = i_cp->symbol_at(noff);1466Handle str = java_lang_String::create_from_symbol(name, CHECK_NULL);1467return (jstring) JNIHandles::make_local(THREAD, str());1468}1469}1470return NULL;1471}1472JVM_END14731474JVM_ENTRY(jstring, JVM_GetClassSignature(JNIEnv *env, jclass cls))1475assert (cls != NULL, "illegal class");1476JvmtiVMObjectAllocEventCollector oam;1477ResourceMark rm(THREAD);1478oop mirror = JNIHandles::resolve_non_null(cls);1479// Return null for arrays and primatives1480if (!java_lang_Class::is_primitive(mirror)) {1481Klass* k = java_lang_Class::as_Klass(mirror);1482if (k->is_instance_klass()) {1483Symbol* sym = InstanceKlass::cast(k)->generic_signature();1484if (sym == NULL) return NULL;1485Handle str = java_lang_String::create_from_symbol(sym, CHECK_NULL);1486return (jstring) JNIHandles::make_local(THREAD, str());1487}1488}1489return NULL;1490JVM_END149114921493JVM_ENTRY(jbyteArray, JVM_GetClassAnnotations(JNIEnv *env, jclass cls))1494assert (cls != NULL, "illegal class");1495oop mirror = JNIHandles::resolve_non_null(cls);1496// Return null for arrays and primitives1497if (!java_lang_Class::is_primitive(mirror)) {1498Klass* k = java_lang_Class::as_Klass(mirror);1499if (k->is_instance_klass()) {1500typeArrayOop a = Annotations::make_java_array(InstanceKlass::cast(k)->class_annotations(), CHECK_NULL);1501return (jbyteArray) JNIHandles::make_local(THREAD, a);1502}1503}1504return NULL;1505JVM_END150615071508static bool jvm_get_field_common(jobject field, fieldDescriptor& fd) {1509// some of this code was adapted from from jni_FromReflectedField15101511oop reflected = JNIHandles::resolve_non_null(field);1512oop mirror = java_lang_reflect_Field::clazz(reflected);1513Klass* k = java_lang_Class::as_Klass(mirror);1514int slot = java_lang_reflect_Field::slot(reflected);1515int modifiers = java_lang_reflect_Field::modifiers(reflected);15161517InstanceKlass* ik = InstanceKlass::cast(k);1518intptr_t offset = ik->field_offset(slot);15191520if (modifiers & JVM_ACC_STATIC) {1521// for static fields we only look in the current class1522if (!ik->find_local_field_from_offset(offset, true, &fd)) {1523assert(false, "cannot find static field");1524return false;1525}1526} else {1527// for instance fields we start with the current class and work1528// our way up through the superclass chain1529if (!ik->find_field_from_offset(offset, false, &fd)) {1530assert(false, "cannot find instance field");1531return false;1532}1533}1534return true;1535}15361537static Method* jvm_get_method_common(jobject method) {1538// some of this code was adapted from from jni_FromReflectedMethod15391540oop reflected = JNIHandles::resolve_non_null(method);1541oop mirror = NULL;1542int slot = 0;15431544if (reflected->klass() == vmClasses::reflect_Constructor_klass()) {1545mirror = java_lang_reflect_Constructor::clazz(reflected);1546slot = java_lang_reflect_Constructor::slot(reflected);1547} else {1548assert(reflected->klass() == vmClasses::reflect_Method_klass(),1549"wrong type");1550mirror = java_lang_reflect_Method::clazz(reflected);1551slot = java_lang_reflect_Method::slot(reflected);1552}1553Klass* k = java_lang_Class::as_Klass(mirror);15541555Method* m = InstanceKlass::cast(k)->method_with_idnum(slot);1556assert(m != NULL, "cannot find method");1557return m; // caller has to deal with NULL in product mode1558}15591560/* Type use annotations support (JDK 1.8) */15611562JVM_ENTRY(jbyteArray, JVM_GetClassTypeAnnotations(JNIEnv *env, jclass cls))1563assert (cls != NULL, "illegal class");1564ResourceMark rm(THREAD);1565// Return null for arrays and primitives1566if (!java_lang_Class::is_primitive(JNIHandles::resolve(cls))) {1567Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve(cls));1568if (k->is_instance_klass()) {1569AnnotationArray* type_annotations = InstanceKlass::cast(k)->class_type_annotations();1570if (type_annotations != NULL) {1571typeArrayOop a = Annotations::make_java_array(type_annotations, CHECK_NULL);1572return (jbyteArray) JNIHandles::make_local(THREAD, a);1573}1574}1575}1576return NULL;1577JVM_END15781579JVM_ENTRY(jbyteArray, JVM_GetMethodTypeAnnotations(JNIEnv *env, jobject method))1580assert (method != NULL, "illegal method");1581// method is a handle to a java.lang.reflect.Method object1582Method* m = jvm_get_method_common(method);1583if (m == NULL) {1584return NULL;1585}15861587AnnotationArray* type_annotations = m->type_annotations();1588if (type_annotations != NULL) {1589typeArrayOop a = Annotations::make_java_array(type_annotations, CHECK_NULL);1590return (jbyteArray) JNIHandles::make_local(THREAD, a);1591}15921593return NULL;1594JVM_END15951596JVM_ENTRY(jbyteArray, JVM_GetFieldTypeAnnotations(JNIEnv *env, jobject field))1597assert (field != NULL, "illegal field");1598fieldDescriptor fd;1599bool gotFd = jvm_get_field_common(field, fd);1600if (!gotFd) {1601return NULL;1602}16031604return (jbyteArray) JNIHandles::make_local(THREAD, Annotations::make_java_array(fd.type_annotations(), THREAD));1605JVM_END16061607static void bounds_check(const constantPoolHandle& cp, jint index, TRAPS) {1608if (!cp->is_within_bounds(index)) {1609THROW_MSG(vmSymbols::java_lang_IllegalArgumentException(), "Constant pool index out of bounds");1610}1611}16121613JVM_ENTRY(jobjectArray, JVM_GetMethodParameters(JNIEnv *env, jobject method))1614{1615// method is a handle to a java.lang.reflect.Method object1616Method* method_ptr = jvm_get_method_common(method);1617methodHandle mh (THREAD, method_ptr);1618Handle reflected_method (THREAD, JNIHandles::resolve_non_null(method));1619const int num_params = mh->method_parameters_length();16201621if (num_params < 0) {1622// A -1 return value from method_parameters_length means there is no1623// parameter data. Return null to indicate this to the reflection1624// API.1625assert(num_params == -1, "num_params should be -1 if it is less than zero");1626return (jobjectArray)NULL;1627} else {1628// Otherwise, we return something up to reflection, even if it is1629// a zero-length array. Why? Because in some cases this can1630// trigger a MalformedParametersException.16311632// make sure all the symbols are properly formatted1633for (int i = 0; i < num_params; i++) {1634MethodParametersElement* params = mh->method_parameters_start();1635int index = params[i].name_cp_index;1636constantPoolHandle cp(THREAD, mh->constants());1637bounds_check(cp, index, CHECK_NULL);16381639if (0 != index && !mh->constants()->tag_at(index).is_utf8()) {1640THROW_MSG_0(vmSymbols::java_lang_IllegalArgumentException(),1641"Wrong type at constant pool index");1642}16431644}16451646objArrayOop result_oop = oopFactory::new_objArray(vmClasses::reflect_Parameter_klass(), num_params, CHECK_NULL);1647objArrayHandle result (THREAD, result_oop);16481649for (int i = 0; i < num_params; i++) {1650MethodParametersElement* params = mh->method_parameters_start();1651// For a 0 index, give a NULL symbol1652Symbol* sym = 0 != params[i].name_cp_index ?1653mh->constants()->symbol_at(params[i].name_cp_index) : NULL;1654int flags = params[i].flags;1655oop param = Reflection::new_parameter(reflected_method, i, sym,1656flags, CHECK_NULL);1657result->obj_at_put(i, param);1658}1659return (jobjectArray)JNIHandles::make_local(THREAD, result());1660}1661}1662JVM_END16631664// New (JDK 1.4) reflection implementation /////////////////////////////////////16651666JVM_ENTRY(jobjectArray, JVM_GetClassDeclaredFields(JNIEnv *env, jclass ofClass, jboolean publicOnly))1667{1668JvmtiVMObjectAllocEventCollector oam;16691670oop ofMirror = JNIHandles::resolve_non_null(ofClass);1671// Exclude primitive types and array types1672if (java_lang_Class::is_primitive(ofMirror) ||1673java_lang_Class::as_Klass(ofMirror)->is_array_klass()) {1674// Return empty array1675oop res = oopFactory::new_objArray(vmClasses::reflect_Field_klass(), 0, CHECK_NULL);1676return (jobjectArray) JNIHandles::make_local(THREAD, res);1677}16781679InstanceKlass* k = InstanceKlass::cast(java_lang_Class::as_Klass(ofMirror));1680constantPoolHandle cp(THREAD, k->constants());16811682// Ensure class is linked1683k->link_class(CHECK_NULL);16841685// Allocate result1686int num_fields;16871688if (publicOnly) {1689num_fields = 0;1690for (JavaFieldStream fs(k); !fs.done(); fs.next()) {1691if (fs.access_flags().is_public()) ++num_fields;1692}1693} else {1694num_fields = k->java_fields_count();1695}16961697objArrayOop r = oopFactory::new_objArray(vmClasses::reflect_Field_klass(), num_fields, CHECK_NULL);1698objArrayHandle result (THREAD, r);16991700int out_idx = 0;1701fieldDescriptor fd;1702for (JavaFieldStream fs(k); !fs.done(); fs.next()) {1703if (!publicOnly || fs.access_flags().is_public()) {1704fd.reinitialize(k, fs.index());1705oop field = Reflection::new_field(&fd, CHECK_NULL);1706result->obj_at_put(out_idx, field);1707++out_idx;1708}1709}1710assert(out_idx == num_fields, "just checking");1711return (jobjectArray) JNIHandles::make_local(THREAD, result());1712}1713JVM_END17141715// A class is a record if and only if it is final and a direct subclass of1716// java.lang.Record and has a Record attribute; otherwise, it is not a record.1717JVM_ENTRY(jboolean, JVM_IsRecord(JNIEnv *env, jclass cls))1718{1719Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(cls));1720if (k != NULL && k->is_instance_klass()) {1721InstanceKlass* ik = InstanceKlass::cast(k);1722return ik->is_record();1723} else {1724return false;1725}1726}1727JVM_END17281729// Returns an array containing the components of the Record attribute,1730// or NULL if the attribute is not present.1731//1732// Note that this function returns the components of the Record attribute1733// even if the class is not a record.1734JVM_ENTRY(jobjectArray, JVM_GetRecordComponents(JNIEnv* env, jclass ofClass))1735{1736Klass* c = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(ofClass));1737assert(c->is_instance_klass(), "must be");1738InstanceKlass* ik = InstanceKlass::cast(c);17391740Array<RecordComponent*>* components = ik->record_components();1741if (components != NULL) {1742JvmtiVMObjectAllocEventCollector oam;1743constantPoolHandle cp(THREAD, ik->constants());1744int length = components->length();1745assert(length >= 0, "unexpected record_components length");1746objArrayOop record_components =1747oopFactory::new_objArray(vmClasses::RecordComponent_klass(), length, CHECK_NULL);1748objArrayHandle components_h (THREAD, record_components);17491750for (int x = 0; x < length; x++) {1751RecordComponent* component = components->at(x);1752assert(component != NULL, "unexpected NULL record component");1753oop component_oop = java_lang_reflect_RecordComponent::create(ik, component, CHECK_NULL);1754components_h->obj_at_put(x, component_oop);1755}1756return (jobjectArray)JNIHandles::make_local(THREAD, components_h());1757}17581759return NULL;1760}1761JVM_END17621763static bool select_method(const methodHandle& method, bool want_constructor) {1764if (want_constructor) {1765return (method->is_initializer() && !method->is_static());1766} else {1767return (!method->is_initializer() && !method->is_overpass());1768}1769}17701771static jobjectArray get_class_declared_methods_helper(1772JNIEnv *env,1773jclass ofClass, jboolean publicOnly,1774bool want_constructor,1775Klass* klass, TRAPS) {17761777JvmtiVMObjectAllocEventCollector oam;17781779oop ofMirror = JNIHandles::resolve_non_null(ofClass);1780// Exclude primitive types and array types1781if (java_lang_Class::is_primitive(ofMirror)1782|| java_lang_Class::as_Klass(ofMirror)->is_array_klass()) {1783// Return empty array1784oop res = oopFactory::new_objArray(klass, 0, CHECK_NULL);1785return (jobjectArray) JNIHandles::make_local(THREAD, res);1786}17871788InstanceKlass* k = InstanceKlass::cast(java_lang_Class::as_Klass(ofMirror));17891790// Ensure class is linked1791k->link_class(CHECK_NULL);17921793Array<Method*>* methods = k->methods();1794int methods_length = methods->length();17951796// Save original method_idnum in case of redefinition, which can change1797// the idnum of obsolete methods. The new method will have the same idnum1798// but if we refresh the methods array, the counts will be wrong.1799ResourceMark rm(THREAD);1800GrowableArray<int>* idnums = new GrowableArray<int>(methods_length);1801int num_methods = 0;18021803for (int i = 0; i < methods_length; i++) {1804methodHandle method(THREAD, methods->at(i));1805if (select_method(method, want_constructor)) {1806if (!publicOnly || method->is_public()) {1807idnums->push(method->method_idnum());1808++num_methods;1809}1810}1811}18121813// Allocate result1814objArrayOop r = oopFactory::new_objArray(klass, num_methods, CHECK_NULL);1815objArrayHandle result (THREAD, r);18161817// Now just put the methods that we selected above, but go by their idnum1818// in case of redefinition. The methods can be redefined at any safepoint,1819// so above when allocating the oop array and below when creating reflect1820// objects.1821for (int i = 0; i < num_methods; i++) {1822methodHandle method(THREAD, k->method_with_idnum(idnums->at(i)));1823if (method.is_null()) {1824// Method may have been deleted and seems this API can handle null1825// Otherwise should probably put a method that throws NSME1826result->obj_at_put(i, NULL);1827} else {1828oop m;1829if (want_constructor) {1830m = Reflection::new_constructor(method, CHECK_NULL);1831} else {1832m = Reflection::new_method(method, false, CHECK_NULL);1833}1834result->obj_at_put(i, m);1835}1836}18371838return (jobjectArray) JNIHandles::make_local(THREAD, result());1839}18401841JVM_ENTRY(jobjectArray, JVM_GetClassDeclaredMethods(JNIEnv *env, jclass ofClass, jboolean publicOnly))1842{1843return get_class_declared_methods_helper(env, ofClass, publicOnly,1844/*want_constructor*/ false,1845vmClasses::reflect_Method_klass(), THREAD);1846}1847JVM_END18481849JVM_ENTRY(jobjectArray, JVM_GetClassDeclaredConstructors(JNIEnv *env, jclass ofClass, jboolean publicOnly))1850{1851return get_class_declared_methods_helper(env, ofClass, publicOnly,1852/*want_constructor*/ true,1853vmClasses::reflect_Constructor_klass(), THREAD);1854}1855JVM_END18561857JVM_ENTRY(jint, JVM_GetClassAccessFlags(JNIEnv *env, jclass cls))1858{1859oop mirror = JNIHandles::resolve_non_null(cls);1860if (java_lang_Class::is_primitive(mirror)) {1861// Primitive type1862return JVM_ACC_ABSTRACT | JVM_ACC_FINAL | JVM_ACC_PUBLIC;1863}18641865Klass* k = java_lang_Class::as_Klass(mirror);1866return k->access_flags().as_int() & JVM_ACC_WRITTEN_FLAGS;1867}1868JVM_END18691870JVM_ENTRY(jboolean, JVM_AreNestMates(JNIEnv *env, jclass current, jclass member))1871{1872Klass* c = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(current));1873assert(c->is_instance_klass(), "must be");1874InstanceKlass* ck = InstanceKlass::cast(c);1875Klass* m = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(member));1876assert(m->is_instance_klass(), "must be");1877InstanceKlass* mk = InstanceKlass::cast(m);1878return ck->has_nestmate_access_to(mk, THREAD);1879}1880JVM_END18811882JVM_ENTRY(jclass, JVM_GetNestHost(JNIEnv* env, jclass current))1883{1884// current is not a primitive or array class1885Klass* c = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(current));1886assert(c->is_instance_klass(), "must be");1887InstanceKlass* ck = InstanceKlass::cast(c);1888InstanceKlass* host = ck->nest_host(THREAD);1889return (jclass) (host == NULL ? NULL :1890JNIHandles::make_local(THREAD, host->java_mirror()));1891}1892JVM_END18931894JVM_ENTRY(jobjectArray, JVM_GetNestMembers(JNIEnv* env, jclass current))1895{1896// current is not a primitive or array class1897ResourceMark rm(THREAD);1898Klass* c = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(current));1899assert(c->is_instance_klass(), "must be");1900InstanceKlass* ck = InstanceKlass::cast(c);1901InstanceKlass* host = ck->nest_host(THREAD);19021903log_trace(class, nestmates)("Calling GetNestMembers for type %s with nest-host %s",1904ck->external_name(), host->external_name());1905{1906JvmtiVMObjectAllocEventCollector oam;1907Array<u2>* members = host->nest_members();1908int length = members == NULL ? 0 : members->length();19091910log_trace(class, nestmates)(" - host has %d listed nest members", length);19111912// nest host is first in the array so make it one bigger1913objArrayOop r = oopFactory::new_objArray(vmClasses::Class_klass(),1914length + 1, CHECK_NULL);1915objArrayHandle result(THREAD, r);1916result->obj_at_put(0, host->java_mirror());1917if (length != 0) {1918int count = 0;1919for (int i = 0; i < length; i++) {1920int cp_index = members->at(i);1921Klass* k = host->constants()->klass_at(cp_index, THREAD);1922if (HAS_PENDING_EXCEPTION) {1923if (PENDING_EXCEPTION->is_a(vmClasses::VirtualMachineError_klass())) {1924return NULL; // propagate VMEs1925}1926if (log_is_enabled(Trace, class, nestmates)) {1927stringStream ss;1928char* target_member_class = host->constants()->klass_name_at(cp_index)->as_C_string();1929ss.print(" - resolution of nest member %s failed: ", target_member_class);1930java_lang_Throwable::print(PENDING_EXCEPTION, &ss);1931log_trace(class, nestmates)("%s", ss.as_string());1932}1933CLEAR_PENDING_EXCEPTION;1934continue;1935}1936if (k->is_instance_klass()) {1937InstanceKlass* ik = InstanceKlass::cast(k);1938InstanceKlass* nest_host_k = ik->nest_host(CHECK_NULL);1939if (nest_host_k == host) {1940result->obj_at_put(count+1, k->java_mirror());1941count++;1942log_trace(class, nestmates)(" - [%d] = %s", count, ik->external_name());1943} else {1944log_trace(class, nestmates)(" - skipping member %s with different host %s",1945ik->external_name(), nest_host_k->external_name());1946}1947} else {1948log_trace(class, nestmates)(" - skipping member %s that is not an instance class",1949k->external_name());1950}1951}1952if (count < length) {1953// we had invalid entries so we need to compact the array1954log_trace(class, nestmates)(" - compacting array from length %d to %d",1955length + 1, count + 1);19561957objArrayOop r2 = oopFactory::new_objArray(vmClasses::Class_klass(),1958count + 1, CHECK_NULL);1959objArrayHandle result2(THREAD, r2);1960for (int i = 0; i < count + 1; i++) {1961result2->obj_at_put(i, result->obj_at(i));1962}1963return (jobjectArray)JNIHandles::make_local(THREAD, result2());1964}1965}1966else {1967assert(host == ck || ck->is_hidden(), "must be singleton nest or dynamic nestmate");1968}1969return (jobjectArray)JNIHandles::make_local(THREAD, result());1970}1971}1972JVM_END19731974JVM_ENTRY(jobjectArray, JVM_GetPermittedSubclasses(JNIEnv* env, jclass current))1975{1976oop mirror = JNIHandles::resolve_non_null(current);1977assert(!java_lang_Class::is_primitive(mirror), "should not be");1978Klass* c = java_lang_Class::as_Klass(mirror);1979assert(c->is_instance_klass(), "must be");1980InstanceKlass* ik = InstanceKlass::cast(c);1981ResourceMark rm(THREAD);1982log_trace(class, sealed)("Calling GetPermittedSubclasses for %s type %s",1983ik->is_sealed() ? "sealed" : "non-sealed", ik->external_name());1984if (ik->is_sealed()) {1985JvmtiVMObjectAllocEventCollector oam;1986Array<u2>* subclasses = ik->permitted_subclasses();1987int length = subclasses->length();19881989log_trace(class, sealed)(" - sealed class has %d permitted subclasses", length);19901991objArrayOop r = oopFactory::new_objArray(vmClasses::Class_klass(),1992length, CHECK_NULL);1993objArrayHandle result(THREAD, r);1994int count = 0;1995for (int i = 0; i < length; i++) {1996int cp_index = subclasses->at(i);1997Klass* k = ik->constants()->klass_at(cp_index, THREAD);1998if (HAS_PENDING_EXCEPTION) {1999if (PENDING_EXCEPTION->is_a(vmClasses::VirtualMachineError_klass())) {2000return NULL; // propagate VMEs2001}2002if (log_is_enabled(Trace, class, sealed)) {2003stringStream ss;2004char* permitted_subclass = ik->constants()->klass_name_at(cp_index)->as_C_string();2005ss.print(" - resolution of permitted subclass %s failed: ", permitted_subclass);2006java_lang_Throwable::print(PENDING_EXCEPTION, &ss);2007log_trace(class, sealed)("%s", ss.as_string());2008}20092010CLEAR_PENDING_EXCEPTION;2011continue;2012}2013if (k->is_instance_klass()) {2014result->obj_at_put(count++, k->java_mirror());2015log_trace(class, sealed)(" - [%d] = %s", count, k->external_name());2016}2017}2018if (count < length) {2019// we had invalid entries so we need to compact the array2020objArrayOop r2 = oopFactory::new_objArray(vmClasses::Class_klass(),2021count, CHECK_NULL);2022objArrayHandle result2(THREAD, r2);2023for (int i = 0; i < count; i++) {2024result2->obj_at_put(i, result->obj_at(i));2025}2026return (jobjectArray)JNIHandles::make_local(THREAD, result2());2027}2028return (jobjectArray)JNIHandles::make_local(THREAD, result());2029} else {2030return NULL;2031}2032}2033JVM_END20342035// Constant pool access //////////////////////////////////////////////////////////20362037JVM_ENTRY(jobject, JVM_GetClassConstantPool(JNIEnv *env, jclass cls))2038{2039JvmtiVMObjectAllocEventCollector oam;2040oop mirror = JNIHandles::resolve_non_null(cls);2041// Return null for primitives and arrays2042if (!java_lang_Class::is_primitive(mirror)) {2043Klass* k = java_lang_Class::as_Klass(mirror);2044if (k->is_instance_klass()) {2045InstanceKlass* k_h = InstanceKlass::cast(k);2046Handle jcp = reflect_ConstantPool::create(CHECK_NULL);2047reflect_ConstantPool::set_cp(jcp(), k_h->constants());2048return JNIHandles::make_local(THREAD, jcp());2049}2050}2051return NULL;2052}2053JVM_END205420552056JVM_ENTRY(jint, JVM_ConstantPoolGetSize(JNIEnv *env, jobject obj, jobject unused))2057{2058constantPoolHandle cp = constantPoolHandle(THREAD, reflect_ConstantPool::get_cp(JNIHandles::resolve_non_null(obj)));2059return cp->length();2060}2061JVM_END206220632064JVM_ENTRY(jclass, JVM_ConstantPoolGetClassAt(JNIEnv *env, jobject obj, jobject unused, jint index))2065{2066constantPoolHandle cp = constantPoolHandle(THREAD, reflect_ConstantPool::get_cp(JNIHandles::resolve_non_null(obj)));2067bounds_check(cp, index, CHECK_NULL);2068constantTag tag = cp->tag_at(index);2069if (!tag.is_klass() && !tag.is_unresolved_klass()) {2070THROW_MSG_0(vmSymbols::java_lang_IllegalArgumentException(), "Wrong type at constant pool index");2071}2072Klass* k = cp->klass_at(index, CHECK_NULL);2073return (jclass) JNIHandles::make_local(THREAD, k->java_mirror());2074}2075JVM_END20762077JVM_ENTRY(jclass, JVM_ConstantPoolGetClassAtIfLoaded(JNIEnv *env, jobject obj, jobject unused, jint index))2078{2079constantPoolHandle cp = constantPoolHandle(THREAD, reflect_ConstantPool::get_cp(JNIHandles::resolve_non_null(obj)));2080bounds_check(cp, index, CHECK_NULL);2081constantTag tag = cp->tag_at(index);2082if (!tag.is_klass() && !tag.is_unresolved_klass()) {2083THROW_MSG_0(vmSymbols::java_lang_IllegalArgumentException(), "Wrong type at constant pool index");2084}2085Klass* k = ConstantPool::klass_at_if_loaded(cp, index);2086if (k == NULL) return NULL;2087return (jclass) JNIHandles::make_local(THREAD, k->java_mirror());2088}2089JVM_END20902091static jobject get_method_at_helper(const constantPoolHandle& cp, jint index, bool force_resolution, TRAPS) {2092constantTag tag = cp->tag_at(index);2093if (!tag.is_method() && !tag.is_interface_method()) {2094THROW_MSG_0(vmSymbols::java_lang_IllegalArgumentException(), "Wrong type at constant pool index");2095}2096int klass_ref = cp->uncached_klass_ref_index_at(index);2097Klass* k_o;2098if (force_resolution) {2099k_o = cp->klass_at(klass_ref, CHECK_NULL);2100} else {2101k_o = ConstantPool::klass_at_if_loaded(cp, klass_ref);2102if (k_o == NULL) return NULL;2103}2104InstanceKlass* k = InstanceKlass::cast(k_o);2105Symbol* name = cp->uncached_name_ref_at(index);2106Symbol* sig = cp->uncached_signature_ref_at(index);2107methodHandle m (THREAD, k->find_method(name, sig));2108if (m.is_null()) {2109THROW_MSG_0(vmSymbols::java_lang_RuntimeException(), "Unable to look up method in target class");2110}2111oop method;2112if (!m->is_initializer() || m->is_static()) {2113method = Reflection::new_method(m, true, CHECK_NULL);2114} else {2115method = Reflection::new_constructor(m, CHECK_NULL);2116}2117return JNIHandles::make_local(THREAD, method);2118}21192120JVM_ENTRY(jobject, JVM_ConstantPoolGetMethodAt(JNIEnv *env, jobject obj, jobject unused, jint index))2121{2122JvmtiVMObjectAllocEventCollector oam;2123constantPoolHandle cp = constantPoolHandle(THREAD, reflect_ConstantPool::get_cp(JNIHandles::resolve_non_null(obj)));2124bounds_check(cp, index, CHECK_NULL);2125jobject res = get_method_at_helper(cp, index, true, CHECK_NULL);2126return res;2127}2128JVM_END21292130JVM_ENTRY(jobject, JVM_ConstantPoolGetMethodAtIfLoaded(JNIEnv *env, jobject obj, jobject unused, jint index))2131{2132JvmtiVMObjectAllocEventCollector oam;2133constantPoolHandle cp = constantPoolHandle(THREAD, reflect_ConstantPool::get_cp(JNIHandles::resolve_non_null(obj)));2134bounds_check(cp, index, CHECK_NULL);2135jobject res = get_method_at_helper(cp, index, false, CHECK_NULL);2136return res;2137}2138JVM_END21392140static jobject get_field_at_helper(constantPoolHandle cp, jint index, bool force_resolution, TRAPS) {2141constantTag tag = cp->tag_at(index);2142if (!tag.is_field()) {2143THROW_MSG_0(vmSymbols::java_lang_IllegalArgumentException(), "Wrong type at constant pool index");2144}2145int klass_ref = cp->uncached_klass_ref_index_at(index);2146Klass* k_o;2147if (force_resolution) {2148k_o = cp->klass_at(klass_ref, CHECK_NULL);2149} else {2150k_o = ConstantPool::klass_at_if_loaded(cp, klass_ref);2151if (k_o == NULL) return NULL;2152}2153InstanceKlass* k = InstanceKlass::cast(k_o);2154Symbol* name = cp->uncached_name_ref_at(index);2155Symbol* sig = cp->uncached_signature_ref_at(index);2156fieldDescriptor fd;2157Klass* target_klass = k->find_field(name, sig, &fd);2158if (target_klass == NULL) {2159THROW_MSG_0(vmSymbols::java_lang_RuntimeException(), "Unable to look up field in target class");2160}2161oop field = Reflection::new_field(&fd, CHECK_NULL);2162return JNIHandles::make_local(THREAD, field);2163}21642165JVM_ENTRY(jobject, JVM_ConstantPoolGetFieldAt(JNIEnv *env, jobject obj, jobject unusedl, jint index))2166{2167JvmtiVMObjectAllocEventCollector oam;2168constantPoolHandle cp = constantPoolHandle(THREAD, reflect_ConstantPool::get_cp(JNIHandles::resolve_non_null(obj)));2169bounds_check(cp, index, CHECK_NULL);2170jobject res = get_field_at_helper(cp, index, true, CHECK_NULL);2171return res;2172}2173JVM_END21742175JVM_ENTRY(jobject, JVM_ConstantPoolGetFieldAtIfLoaded(JNIEnv *env, jobject obj, jobject unused, jint index))2176{2177JvmtiVMObjectAllocEventCollector oam;2178constantPoolHandle cp = constantPoolHandle(THREAD, reflect_ConstantPool::get_cp(JNIHandles::resolve_non_null(obj)));2179bounds_check(cp, index, CHECK_NULL);2180jobject res = get_field_at_helper(cp, index, false, CHECK_NULL);2181return res;2182}2183JVM_END21842185JVM_ENTRY(jobjectArray, JVM_ConstantPoolGetMemberRefInfoAt(JNIEnv *env, jobject obj, jobject unused, jint index))2186{2187JvmtiVMObjectAllocEventCollector oam;2188constantPoolHandle cp = constantPoolHandle(THREAD, reflect_ConstantPool::get_cp(JNIHandles::resolve_non_null(obj)));2189bounds_check(cp, index, CHECK_NULL);2190constantTag tag = cp->tag_at(index);2191if (!tag.is_field_or_method()) {2192THROW_MSG_0(vmSymbols::java_lang_IllegalArgumentException(), "Wrong type at constant pool index");2193}2194int klass_ref = cp->uncached_klass_ref_index_at(index);2195Symbol* klass_name = cp->klass_name_at(klass_ref);2196Symbol* member_name = cp->uncached_name_ref_at(index);2197Symbol* member_sig = cp->uncached_signature_ref_at(index);2198objArrayOop dest_o = oopFactory::new_objArray(vmClasses::String_klass(), 3, CHECK_NULL);2199objArrayHandle dest(THREAD, dest_o);2200Handle str = java_lang_String::create_from_symbol(klass_name, CHECK_NULL);2201dest->obj_at_put(0, str());2202str = java_lang_String::create_from_symbol(member_name, CHECK_NULL);2203dest->obj_at_put(1, str());2204str = java_lang_String::create_from_symbol(member_sig, CHECK_NULL);2205dest->obj_at_put(2, str());2206return (jobjectArray) JNIHandles::make_local(THREAD, dest());2207}2208JVM_END22092210JVM_ENTRY(jint, JVM_ConstantPoolGetClassRefIndexAt(JNIEnv *env, jobject obj, jobject unused, jint index))2211{2212JvmtiVMObjectAllocEventCollector oam;2213constantPoolHandle cp(THREAD, reflect_ConstantPool::get_cp(JNIHandles::resolve_non_null(obj)));2214bounds_check(cp, index, CHECK_0);2215constantTag tag = cp->tag_at(index);2216if (!tag.is_field_or_method()) {2217THROW_MSG_0(vmSymbols::java_lang_IllegalArgumentException(), "Wrong type at constant pool index");2218}2219return (jint) cp->uncached_klass_ref_index_at(index);2220}2221JVM_END22222223JVM_ENTRY(jint, JVM_ConstantPoolGetNameAndTypeRefIndexAt(JNIEnv *env, jobject obj, jobject unused, jint index))2224{2225JvmtiVMObjectAllocEventCollector oam;2226constantPoolHandle cp(THREAD, reflect_ConstantPool::get_cp(JNIHandles::resolve_non_null(obj)));2227bounds_check(cp, index, CHECK_0);2228constantTag tag = cp->tag_at(index);2229if (!tag.is_invoke_dynamic() && !tag.is_field_or_method()) {2230THROW_MSG_0(vmSymbols::java_lang_IllegalArgumentException(), "Wrong type at constant pool index");2231}2232return (jint) cp->uncached_name_and_type_ref_index_at(index);2233}2234JVM_END22352236JVM_ENTRY(jobjectArray, JVM_ConstantPoolGetNameAndTypeRefInfoAt(JNIEnv *env, jobject obj, jobject unused, jint index))2237{2238JvmtiVMObjectAllocEventCollector oam;2239constantPoolHandle cp(THREAD, reflect_ConstantPool::get_cp(JNIHandles::resolve_non_null(obj)));2240bounds_check(cp, index, CHECK_NULL);2241constantTag tag = cp->tag_at(index);2242if (!tag.is_name_and_type()) {2243THROW_MSG_0(vmSymbols::java_lang_IllegalArgumentException(), "Wrong type at constant pool index");2244}2245Symbol* member_name = cp->symbol_at(cp->name_ref_index_at(index));2246Symbol* member_sig = cp->symbol_at(cp->signature_ref_index_at(index));2247objArrayOop dest_o = oopFactory::new_objArray(vmClasses::String_klass(), 2, CHECK_NULL);2248objArrayHandle dest(THREAD, dest_o);2249Handle str = java_lang_String::create_from_symbol(member_name, CHECK_NULL);2250dest->obj_at_put(0, str());2251str = java_lang_String::create_from_symbol(member_sig, CHECK_NULL);2252dest->obj_at_put(1, str());2253return (jobjectArray) JNIHandles::make_local(THREAD, dest());2254}2255JVM_END22562257JVM_ENTRY(jint, JVM_ConstantPoolGetIntAt(JNIEnv *env, jobject obj, jobject unused, jint index))2258{2259constantPoolHandle cp = constantPoolHandle(THREAD, reflect_ConstantPool::get_cp(JNIHandles::resolve_non_null(obj)));2260bounds_check(cp, index, CHECK_0);2261constantTag tag = cp->tag_at(index);2262if (!tag.is_int()) {2263THROW_MSG_0(vmSymbols::java_lang_IllegalArgumentException(), "Wrong type at constant pool index");2264}2265return cp->int_at(index);2266}2267JVM_END22682269JVM_ENTRY(jlong, JVM_ConstantPoolGetLongAt(JNIEnv *env, jobject obj, jobject unused, jint index))2270{2271constantPoolHandle cp = constantPoolHandle(THREAD, reflect_ConstantPool::get_cp(JNIHandles::resolve_non_null(obj)));2272bounds_check(cp, index, CHECK_(0L));2273constantTag tag = cp->tag_at(index);2274if (!tag.is_long()) {2275THROW_MSG_0(vmSymbols::java_lang_IllegalArgumentException(), "Wrong type at constant pool index");2276}2277return cp->long_at(index);2278}2279JVM_END22802281JVM_ENTRY(jfloat, JVM_ConstantPoolGetFloatAt(JNIEnv *env, jobject obj, jobject unused, jint index))2282{2283constantPoolHandle cp = constantPoolHandle(THREAD, reflect_ConstantPool::get_cp(JNIHandles::resolve_non_null(obj)));2284bounds_check(cp, index, CHECK_(0.0f));2285constantTag tag = cp->tag_at(index);2286if (!tag.is_float()) {2287THROW_MSG_0(vmSymbols::java_lang_IllegalArgumentException(), "Wrong type at constant pool index");2288}2289return cp->float_at(index);2290}2291JVM_END22922293JVM_ENTRY(jdouble, JVM_ConstantPoolGetDoubleAt(JNIEnv *env, jobject obj, jobject unused, jint index))2294{2295constantPoolHandle cp = constantPoolHandle(THREAD, reflect_ConstantPool::get_cp(JNIHandles::resolve_non_null(obj)));2296bounds_check(cp, index, CHECK_(0.0));2297constantTag tag = cp->tag_at(index);2298if (!tag.is_double()) {2299THROW_MSG_0(vmSymbols::java_lang_IllegalArgumentException(), "Wrong type at constant pool index");2300}2301return cp->double_at(index);2302}2303JVM_END23042305JVM_ENTRY(jstring, JVM_ConstantPoolGetStringAt(JNIEnv *env, jobject obj, jobject unused, jint index))2306{2307constantPoolHandle cp = constantPoolHandle(THREAD, reflect_ConstantPool::get_cp(JNIHandles::resolve_non_null(obj)));2308bounds_check(cp, index, CHECK_NULL);2309constantTag tag = cp->tag_at(index);2310if (!tag.is_string()) {2311THROW_MSG_0(vmSymbols::java_lang_IllegalArgumentException(), "Wrong type at constant pool index");2312}2313oop str = cp->string_at(index, CHECK_NULL);2314return (jstring) JNIHandles::make_local(THREAD, str);2315}2316JVM_END23172318JVM_ENTRY(jstring, JVM_ConstantPoolGetUTF8At(JNIEnv *env, jobject obj, jobject unused, jint index))2319{2320JvmtiVMObjectAllocEventCollector oam;2321constantPoolHandle cp = constantPoolHandle(THREAD, reflect_ConstantPool::get_cp(JNIHandles::resolve_non_null(obj)));2322bounds_check(cp, index, CHECK_NULL);2323constantTag tag = cp->tag_at(index);2324if (!tag.is_symbol()) {2325THROW_MSG_0(vmSymbols::java_lang_IllegalArgumentException(), "Wrong type at constant pool index");2326}2327Symbol* sym = cp->symbol_at(index);2328Handle str = java_lang_String::create_from_symbol(sym, CHECK_NULL);2329return (jstring) JNIHandles::make_local(THREAD, str());2330}2331JVM_END23322333JVM_ENTRY(jbyte, JVM_ConstantPoolGetTagAt(JNIEnv *env, jobject obj, jobject unused, jint index))2334{2335constantPoolHandle cp = constantPoolHandle(THREAD, reflect_ConstantPool::get_cp(JNIHandles::resolve_non_null(obj)));2336bounds_check(cp, index, CHECK_0);2337constantTag tag = cp->tag_at(index);2338jbyte result = tag.value();2339// If returned tag values are not from the JVM spec, e.g. tags from 100 to 105,2340// they are changed to the corresponding tags from the JVM spec, so that java code in2341// sun.reflect.ConstantPool will return only tags from the JVM spec, not internal ones.2342if (tag.is_klass_or_reference()) {2343result = JVM_CONSTANT_Class;2344} else if (tag.is_string_index()) {2345result = JVM_CONSTANT_String;2346} else if (tag.is_method_type_in_error()) {2347result = JVM_CONSTANT_MethodType;2348} else if (tag.is_method_handle_in_error()) {2349result = JVM_CONSTANT_MethodHandle;2350} else if (tag.is_dynamic_constant_in_error()) {2351result = JVM_CONSTANT_Dynamic;2352}2353return result;2354}2355JVM_END23562357// Assertion support. //////////////////////////////////////////////////////////23582359JVM_ENTRY(jboolean, JVM_DesiredAssertionStatus(JNIEnv *env, jclass unused, jclass cls))2360assert(cls != NULL, "bad class");23612362oop r = JNIHandles::resolve(cls);2363assert(! java_lang_Class::is_primitive(r), "primitive classes not allowed");2364if (java_lang_Class::is_primitive(r)) return false;23652366Klass* k = java_lang_Class::as_Klass(r);2367assert(k->is_instance_klass(), "must be an instance klass");2368if (!k->is_instance_klass()) return false;23692370ResourceMark rm(THREAD);2371const char* name = k->name()->as_C_string();2372bool system_class = k->class_loader() == NULL;2373return JavaAssertions::enabled(name, system_class);23742375JVM_END237623772378// Return a new AssertionStatusDirectives object with the fields filled in with2379// command-line assertion arguments (i.e., -ea, -da).2380JVM_ENTRY(jobject, JVM_AssertionStatusDirectives(JNIEnv *env, jclass unused))2381JvmtiVMObjectAllocEventCollector oam;2382oop asd = JavaAssertions::createAssertionStatusDirectives(CHECK_NULL);2383return JNIHandles::make_local(THREAD, asd);2384JVM_END23852386// Verification ////////////////////////////////////////////////////////////////////////////////23872388// Reflection for the verifier /////////////////////////////////////////////////////////////////23892390// RedefineClasses support: bug 6214132 caused verification to fail.2391// All functions from this section should call the jvmtiThreadSate function:2392// Klass* class_to_verify_considering_redefinition(Klass* klass).2393// The function returns a Klass* of the _scratch_class if the verifier2394// was invoked in the middle of the class redefinition.2395// Otherwise it returns its argument value which is the _the_class Klass*.2396// Please, refer to the description in the jvmtiThreadSate.hpp.23972398JVM_ENTRY(const char*, JVM_GetClassNameUTF(JNIEnv *env, jclass cls))2399Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(cls));2400k = JvmtiThreadState::class_to_verify_considering_redefinition(k, thread);2401return k->name()->as_utf8();2402JVM_END240324042405JVM_ENTRY(void, JVM_GetClassCPTypes(JNIEnv *env, jclass cls, unsigned char *types))2406Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(cls));2407k = JvmtiThreadState::class_to_verify_considering_redefinition(k, thread);2408// types will have length zero if this is not an InstanceKlass2409// (length is determined by call to JVM_GetClassCPEntriesCount)2410if (k->is_instance_klass()) {2411ConstantPool* cp = InstanceKlass::cast(k)->constants();2412for (int index = cp->length() - 1; index >= 0; index--) {2413constantTag tag = cp->tag_at(index);2414types[index] = (tag.is_unresolved_klass()) ? (unsigned char) JVM_CONSTANT_Class : tag.value();2415}2416}2417JVM_END241824192420JVM_ENTRY(jint, JVM_GetClassCPEntriesCount(JNIEnv *env, jclass cls))2421Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(cls));2422k = JvmtiThreadState::class_to_verify_considering_redefinition(k, thread);2423return (!k->is_instance_klass()) ? 0 : InstanceKlass::cast(k)->constants()->length();2424JVM_END242524262427JVM_ENTRY(jint, JVM_GetClassFieldsCount(JNIEnv *env, jclass cls))2428Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(cls));2429k = JvmtiThreadState::class_to_verify_considering_redefinition(k, thread);2430return (!k->is_instance_klass()) ? 0 : InstanceKlass::cast(k)->java_fields_count();2431JVM_END243224332434JVM_ENTRY(jint, JVM_GetClassMethodsCount(JNIEnv *env, jclass cls))2435Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(cls));2436k = JvmtiThreadState::class_to_verify_considering_redefinition(k, thread);2437return (!k->is_instance_klass()) ? 0 : InstanceKlass::cast(k)->methods()->length();2438JVM_END243924402441// The following methods, used for the verifier, are never called with2442// array klasses, so a direct cast to InstanceKlass is safe.2443// Typically, these methods are called in a loop with bounds determined2444// by the results of JVM_GetClass{Fields,Methods}Count, which return2445// zero for arrays.2446JVM_ENTRY(void, JVM_GetMethodIxExceptionIndexes(JNIEnv *env, jclass cls, jint method_index, unsigned short *exceptions))2447Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(cls));2448k = JvmtiThreadState::class_to_verify_considering_redefinition(k, thread);2449Method* method = InstanceKlass::cast(k)->methods()->at(method_index);2450int length = method->checked_exceptions_length();2451if (length > 0) {2452CheckedExceptionElement* table= method->checked_exceptions_start();2453for (int i = 0; i < length; i++) {2454exceptions[i] = table[i].class_cp_index;2455}2456}2457JVM_END245824592460JVM_ENTRY(jint, JVM_GetMethodIxExceptionsCount(JNIEnv *env, jclass cls, jint method_index))2461Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(cls));2462k = JvmtiThreadState::class_to_verify_considering_redefinition(k, thread);2463Method* method = InstanceKlass::cast(k)->methods()->at(method_index);2464return method->checked_exceptions_length();2465JVM_END246624672468JVM_ENTRY(void, JVM_GetMethodIxByteCode(JNIEnv *env, jclass cls, jint method_index, unsigned char *code))2469Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(cls));2470k = JvmtiThreadState::class_to_verify_considering_redefinition(k, thread);2471Method* method = InstanceKlass::cast(k)->methods()->at(method_index);2472memcpy(code, method->code_base(), method->code_size());2473JVM_END247424752476JVM_ENTRY(jint, JVM_GetMethodIxByteCodeLength(JNIEnv *env, jclass cls, jint method_index))2477Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(cls));2478k = JvmtiThreadState::class_to_verify_considering_redefinition(k, thread);2479Method* method = InstanceKlass::cast(k)->methods()->at(method_index);2480return method->code_size();2481JVM_END248224832484JVM_ENTRY(void, JVM_GetMethodIxExceptionTableEntry(JNIEnv *env, jclass cls, jint method_index, jint entry_index, JVM_ExceptionTableEntryType *entry))2485Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(cls));2486k = JvmtiThreadState::class_to_verify_considering_redefinition(k, thread);2487Method* method = InstanceKlass::cast(k)->methods()->at(method_index);2488ExceptionTable extable(method);2489entry->start_pc = extable.start_pc(entry_index);2490entry->end_pc = extable.end_pc(entry_index);2491entry->handler_pc = extable.handler_pc(entry_index);2492entry->catchType = extable.catch_type_index(entry_index);2493JVM_END249424952496JVM_ENTRY(jint, JVM_GetMethodIxExceptionTableLength(JNIEnv *env, jclass cls, int method_index))2497Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(cls));2498k = JvmtiThreadState::class_to_verify_considering_redefinition(k, thread);2499Method* method = InstanceKlass::cast(k)->methods()->at(method_index);2500return method->exception_table_length();2501JVM_END250225032504JVM_ENTRY(jint, JVM_GetMethodIxModifiers(JNIEnv *env, jclass cls, int method_index))2505Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(cls));2506k = JvmtiThreadState::class_to_verify_considering_redefinition(k, thread);2507Method* method = InstanceKlass::cast(k)->methods()->at(method_index);2508return method->access_flags().as_int() & JVM_RECOGNIZED_METHOD_MODIFIERS;2509JVM_END251025112512JVM_ENTRY(jint, JVM_GetFieldIxModifiers(JNIEnv *env, jclass cls, int field_index))2513Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(cls));2514k = JvmtiThreadState::class_to_verify_considering_redefinition(k, thread);2515return InstanceKlass::cast(k)->field_access_flags(field_index) & JVM_RECOGNIZED_FIELD_MODIFIERS;2516JVM_END251725182519JVM_ENTRY(jint, JVM_GetMethodIxLocalsCount(JNIEnv *env, jclass cls, int method_index))2520Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(cls));2521k = JvmtiThreadState::class_to_verify_considering_redefinition(k, thread);2522Method* method = InstanceKlass::cast(k)->methods()->at(method_index);2523return method->max_locals();2524JVM_END252525262527JVM_ENTRY(jint, JVM_GetMethodIxArgsSize(JNIEnv *env, jclass cls, int method_index))2528Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(cls));2529k = JvmtiThreadState::class_to_verify_considering_redefinition(k, thread);2530Method* method = InstanceKlass::cast(k)->methods()->at(method_index);2531return method->size_of_parameters();2532JVM_END253325342535JVM_ENTRY(jint, JVM_GetMethodIxMaxStack(JNIEnv *env, jclass cls, int method_index))2536Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(cls));2537k = JvmtiThreadState::class_to_verify_considering_redefinition(k, thread);2538Method* method = InstanceKlass::cast(k)->methods()->at(method_index);2539return method->verifier_max_stack();2540JVM_END254125422543JVM_ENTRY(jboolean, JVM_IsConstructorIx(JNIEnv *env, jclass cls, int method_index))2544ResourceMark rm(THREAD);2545Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(cls));2546k = JvmtiThreadState::class_to_verify_considering_redefinition(k, thread);2547Method* method = InstanceKlass::cast(k)->methods()->at(method_index);2548return method->name() == vmSymbols::object_initializer_name();2549JVM_END255025512552JVM_ENTRY(jboolean, JVM_IsVMGeneratedMethodIx(JNIEnv *env, jclass cls, int method_index))2553ResourceMark rm(THREAD);2554Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(cls));2555k = JvmtiThreadState::class_to_verify_considering_redefinition(k, thread);2556Method* method = InstanceKlass::cast(k)->methods()->at(method_index);2557return method->is_overpass();2558JVM_END25592560JVM_ENTRY(const char*, JVM_GetMethodIxNameUTF(JNIEnv *env, jclass cls, jint method_index))2561Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(cls));2562k = JvmtiThreadState::class_to_verify_considering_redefinition(k, thread);2563Method* method = InstanceKlass::cast(k)->methods()->at(method_index);2564return method->name()->as_utf8();2565JVM_END256625672568JVM_ENTRY(const char*, JVM_GetMethodIxSignatureUTF(JNIEnv *env, jclass cls, jint method_index))2569Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(cls));2570k = JvmtiThreadState::class_to_verify_considering_redefinition(k, thread);2571Method* method = InstanceKlass::cast(k)->methods()->at(method_index);2572return method->signature()->as_utf8();2573JVM_END25742575/**2576* All of these JVM_GetCP-xxx methods are used by the old verifier to2577* read entries in the constant pool. Since the old verifier always2578* works on a copy of the code, it will not see any rewriting that2579* may possibly occur in the middle of verification. So it is important2580* that nothing it calls tries to use the cpCache instead of the raw2581* constant pool, so we must use cp->uncached_x methods when appropriate.2582*/2583JVM_ENTRY(const char*, JVM_GetCPFieldNameUTF(JNIEnv *env, jclass cls, jint cp_index))2584Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(cls));2585k = JvmtiThreadState::class_to_verify_considering_redefinition(k, thread);2586ConstantPool* cp = InstanceKlass::cast(k)->constants();2587switch (cp->tag_at(cp_index).value()) {2588case JVM_CONSTANT_Fieldref:2589return cp->uncached_name_ref_at(cp_index)->as_utf8();2590default:2591fatal("JVM_GetCPFieldNameUTF: illegal constant");2592}2593ShouldNotReachHere();2594return NULL;2595JVM_END259625972598JVM_ENTRY(const char*, JVM_GetCPMethodNameUTF(JNIEnv *env, jclass cls, jint cp_index))2599Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(cls));2600k = JvmtiThreadState::class_to_verify_considering_redefinition(k, thread);2601ConstantPool* cp = InstanceKlass::cast(k)->constants();2602switch (cp->tag_at(cp_index).value()) {2603case JVM_CONSTANT_InterfaceMethodref:2604case JVM_CONSTANT_Methodref:2605return cp->uncached_name_ref_at(cp_index)->as_utf8();2606default:2607fatal("JVM_GetCPMethodNameUTF: illegal constant");2608}2609ShouldNotReachHere();2610return NULL;2611JVM_END261226132614JVM_ENTRY(const char*, JVM_GetCPMethodSignatureUTF(JNIEnv *env, jclass cls, jint cp_index))2615Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(cls));2616k = JvmtiThreadState::class_to_verify_considering_redefinition(k, thread);2617ConstantPool* cp = InstanceKlass::cast(k)->constants();2618switch (cp->tag_at(cp_index).value()) {2619case JVM_CONSTANT_InterfaceMethodref:2620case JVM_CONSTANT_Methodref:2621return cp->uncached_signature_ref_at(cp_index)->as_utf8();2622default:2623fatal("JVM_GetCPMethodSignatureUTF: illegal constant");2624}2625ShouldNotReachHere();2626return NULL;2627JVM_END262826292630JVM_ENTRY(const char*, JVM_GetCPFieldSignatureUTF(JNIEnv *env, jclass cls, jint cp_index))2631Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(cls));2632k = JvmtiThreadState::class_to_verify_considering_redefinition(k, thread);2633ConstantPool* cp = InstanceKlass::cast(k)->constants();2634switch (cp->tag_at(cp_index).value()) {2635case JVM_CONSTANT_Fieldref:2636return cp->uncached_signature_ref_at(cp_index)->as_utf8();2637default:2638fatal("JVM_GetCPFieldSignatureUTF: illegal constant");2639}2640ShouldNotReachHere();2641return NULL;2642JVM_END264326442645JVM_ENTRY(const char*, JVM_GetCPClassNameUTF(JNIEnv *env, jclass cls, jint cp_index))2646Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(cls));2647k = JvmtiThreadState::class_to_verify_considering_redefinition(k, thread);2648ConstantPool* cp = InstanceKlass::cast(k)->constants();2649Symbol* classname = cp->klass_name_at(cp_index);2650return classname->as_utf8();2651JVM_END265226532654JVM_ENTRY(const char*, JVM_GetCPFieldClassNameUTF(JNIEnv *env, jclass cls, jint cp_index))2655Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(cls));2656k = JvmtiThreadState::class_to_verify_considering_redefinition(k, thread);2657ConstantPool* cp = InstanceKlass::cast(k)->constants();2658switch (cp->tag_at(cp_index).value()) {2659case JVM_CONSTANT_Fieldref: {2660int class_index = cp->uncached_klass_ref_index_at(cp_index);2661Symbol* classname = cp->klass_name_at(class_index);2662return classname->as_utf8();2663}2664default:2665fatal("JVM_GetCPFieldClassNameUTF: illegal constant");2666}2667ShouldNotReachHere();2668return NULL;2669JVM_END267026712672JVM_ENTRY(const char*, JVM_GetCPMethodClassNameUTF(JNIEnv *env, jclass cls, jint cp_index))2673Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(cls));2674k = JvmtiThreadState::class_to_verify_considering_redefinition(k, thread);2675ConstantPool* cp = InstanceKlass::cast(k)->constants();2676switch (cp->tag_at(cp_index).value()) {2677case JVM_CONSTANT_Methodref:2678case JVM_CONSTANT_InterfaceMethodref: {2679int class_index = cp->uncached_klass_ref_index_at(cp_index);2680Symbol* classname = cp->klass_name_at(class_index);2681return classname->as_utf8();2682}2683default:2684fatal("JVM_GetCPMethodClassNameUTF: illegal constant");2685}2686ShouldNotReachHere();2687return NULL;2688JVM_END268926902691JVM_ENTRY(jint, JVM_GetCPFieldModifiers(JNIEnv *env, jclass cls, int cp_index, jclass called_cls))2692Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(cls));2693Klass* k_called = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(called_cls));2694k = JvmtiThreadState::class_to_verify_considering_redefinition(k, thread);2695k_called = JvmtiThreadState::class_to_verify_considering_redefinition(k_called, thread);2696ConstantPool* cp = InstanceKlass::cast(k)->constants();2697ConstantPool* cp_called = InstanceKlass::cast(k_called)->constants();2698switch (cp->tag_at(cp_index).value()) {2699case JVM_CONSTANT_Fieldref: {2700Symbol* name = cp->uncached_name_ref_at(cp_index);2701Symbol* signature = cp->uncached_signature_ref_at(cp_index);2702InstanceKlass* ik = InstanceKlass::cast(k_called);2703for (JavaFieldStream fs(ik); !fs.done(); fs.next()) {2704if (fs.name() == name && fs.signature() == signature) {2705return fs.access_flags().as_short() & JVM_RECOGNIZED_FIELD_MODIFIERS;2706}2707}2708return -1;2709}2710default:2711fatal("JVM_GetCPFieldModifiers: illegal constant");2712}2713ShouldNotReachHere();2714return 0;2715JVM_END271627172718JVM_ENTRY(jint, JVM_GetCPMethodModifiers(JNIEnv *env, jclass cls, int cp_index, jclass called_cls))2719Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(cls));2720Klass* k_called = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(called_cls));2721k = JvmtiThreadState::class_to_verify_considering_redefinition(k, thread);2722k_called = JvmtiThreadState::class_to_verify_considering_redefinition(k_called, thread);2723ConstantPool* cp = InstanceKlass::cast(k)->constants();2724switch (cp->tag_at(cp_index).value()) {2725case JVM_CONSTANT_Methodref:2726case JVM_CONSTANT_InterfaceMethodref: {2727Symbol* name = cp->uncached_name_ref_at(cp_index);2728Symbol* signature = cp->uncached_signature_ref_at(cp_index);2729Array<Method*>* methods = InstanceKlass::cast(k_called)->methods();2730int methods_count = methods->length();2731for (int i = 0; i < methods_count; i++) {2732Method* method = methods->at(i);2733if (method->name() == name && method->signature() == signature) {2734return method->access_flags().as_int() & JVM_RECOGNIZED_METHOD_MODIFIERS;2735}2736}2737return -1;2738}2739default:2740fatal("JVM_GetCPMethodModifiers: illegal constant");2741}2742ShouldNotReachHere();2743return 0;2744JVM_END274527462747// Misc //////////////////////////////////////////////////////////////////////////////////////////////27482749JVM_LEAF(void, JVM_ReleaseUTF(const char *utf))2750// So long as UTF8::convert_to_utf8 returns resource strings, we don't have to do anything2751JVM_END275227532754JVM_ENTRY(jboolean, JVM_IsSameClassPackage(JNIEnv *env, jclass class1, jclass class2))2755oop class1_mirror = JNIHandles::resolve_non_null(class1);2756oop class2_mirror = JNIHandles::resolve_non_null(class2);2757Klass* klass1 = java_lang_Class::as_Klass(class1_mirror);2758Klass* klass2 = java_lang_Class::as_Klass(class2_mirror);2759return (jboolean) Reflection::is_same_class_package(klass1, klass2);2760JVM_END27612762// Printing support //////////////////////////////////////////////////2763extern "C" {27642765ATTRIBUTE_PRINTF(3, 0)2766int jio_vsnprintf(char *str, size_t count, const char *fmt, va_list args) {2767// Reject count values that are negative signed values converted to2768// unsigned; see bug 4399518, 44172142769if ((intptr_t)count <= 0) return -1;27702771int result = os::vsnprintf(str, count, fmt, args);2772if (result > 0 && (size_t)result >= count) {2773result = -1;2774}27752776return result;2777}27782779ATTRIBUTE_PRINTF(3, 4)2780int jio_snprintf(char *str, size_t count, const char *fmt, ...) {2781va_list args;2782int len;2783va_start(args, fmt);2784len = jio_vsnprintf(str, count, fmt, args);2785va_end(args);2786return len;2787}27882789ATTRIBUTE_PRINTF(2, 3)2790int jio_fprintf(FILE* f, const char *fmt, ...) {2791int len;2792va_list args;2793va_start(args, fmt);2794len = jio_vfprintf(f, fmt, args);2795va_end(args);2796return len;2797}27982799ATTRIBUTE_PRINTF(2, 0)2800int jio_vfprintf(FILE* f, const char *fmt, va_list args) {2801if (Arguments::vfprintf_hook() != NULL) {2802return Arguments::vfprintf_hook()(f, fmt, args);2803} else {2804return vfprintf(f, fmt, args);2805}2806}28072808ATTRIBUTE_PRINTF(1, 2)2809JNIEXPORT int jio_printf(const char *fmt, ...) {2810int len;2811va_list args;2812va_start(args, fmt);2813len = jio_vfprintf(defaultStream::output_stream(), fmt, args);2814va_end(args);2815return len;2816}28172818// HotSpot specific jio method2819void jio_print(const char* s, size_t len) {2820// Try to make this function as atomic as possible.2821if (Arguments::vfprintf_hook() != NULL) {2822jio_fprintf(defaultStream::output_stream(), "%.*s", (int)len, s);2823} else {2824// Make an unused local variable to avoid warning from gcc compiler.2825size_t count = ::write(defaultStream::output_fd(), s, (int)len);2826}2827}28282829} // Extern C28302831// java.lang.Thread //////////////////////////////////////////////////////////////////////////////28322833// In most of the JVM thread support functions we need to access the2834// thread through a ThreadsListHandle to prevent it from exiting and2835// being reclaimed while we try to operate on it. The exceptions to this2836// rule are when operating on the current thread, or if the monitor of2837// the target java.lang.Thread is locked at the Java level - in both2838// cases the target cannot exit.28392840static void thread_entry(JavaThread* thread, TRAPS) {2841HandleMark hm(THREAD);2842Handle obj(THREAD, thread->threadObj());2843JavaValue result(T_VOID);2844JavaCalls::call_virtual(&result,2845obj,2846vmClasses::Thread_klass(),2847vmSymbols::run_method_name(),2848vmSymbols::void_method_signature(),2849THREAD);2850}285128522853JVM_ENTRY(void, JVM_StartThread(JNIEnv* env, jobject jthread))2854JavaThread *native_thread = NULL;28552856// We cannot hold the Threads_lock when we throw an exception,2857// due to rank ordering issues. Example: we might need to grab the2858// Heap_lock while we construct the exception.2859bool throw_illegal_thread_state = false;28602861// We must release the Threads_lock before we can post a jvmti event2862// in Thread::start.2863{2864// Ensure that the C++ Thread and OSThread structures aren't freed before2865// we operate.2866MutexLocker mu(Threads_lock);28672868// Since JDK 5 the java.lang.Thread threadStatus is used to prevent2869// re-starting an already started thread, so we should usually find2870// that the JavaThread is null. However for a JNI attached thread2871// there is a small window between the Thread object being created2872// (with its JavaThread set) and the update to its threadStatus, so we2873// have to check for this2874if (java_lang_Thread::thread(JNIHandles::resolve_non_null(jthread)) != NULL) {2875throw_illegal_thread_state = true;2876} else {2877// We could also check the stillborn flag to see if this thread was already stopped, but2878// for historical reasons we let the thread detect that itself when it starts running28792880jlong size =2881java_lang_Thread::stackSize(JNIHandles::resolve_non_null(jthread));2882// Allocate the C++ Thread structure and create the native thread. The2883// stack size retrieved from java is 64-bit signed, but the constructor takes2884// size_t (an unsigned type), which may be 32 or 64-bit depending on the platform.2885// - Avoid truncating on 32-bit platforms if size is greater than UINT_MAX.2886// - Avoid passing negative values which would result in really large stacks.2887NOT_LP64(if (size > SIZE_MAX) size = SIZE_MAX;)2888size_t sz = size > 0 ? (size_t) size : 0;2889native_thread = new JavaThread(&thread_entry, sz);28902891// At this point it may be possible that no osthread was created for the2892// JavaThread due to lack of memory. Check for this situation and throw2893// an exception if necessary. Eventually we may want to change this so2894// that we only grab the lock if the thread was created successfully -2895// then we can also do this check and throw the exception in the2896// JavaThread constructor.2897if (native_thread->osthread() != NULL) {2898// Note: the current thread is not being used within "prepare".2899native_thread->prepare(jthread);2900}2901}2902}29032904if (throw_illegal_thread_state) {2905THROW(vmSymbols::java_lang_IllegalThreadStateException());2906}29072908assert(native_thread != NULL, "Starting null thread?");29092910if (native_thread->osthread() == NULL) {2911ResourceMark rm(thread);2912log_warning(os, thread)("Failed to start the native thread for java.lang.Thread \"%s\"",2913JavaThread::name_for(JNIHandles::resolve_non_null(jthread)));2914// No one should hold a reference to the 'native_thread'.2915native_thread->smr_delete();2916if (JvmtiExport::should_post_resource_exhausted()) {2917JvmtiExport::post_resource_exhausted(2918JVMTI_RESOURCE_EXHAUSTED_OOM_ERROR | JVMTI_RESOURCE_EXHAUSTED_THREADS,2919os::native_thread_creation_failed_msg());2920}2921THROW_MSG(vmSymbols::java_lang_OutOfMemoryError(),2922os::native_thread_creation_failed_msg());2923}29242925#if INCLUDE_JFR2926if (Jfr::is_recording() && EventThreadStart::is_enabled() &&2927EventThreadStart::is_stacktrace_enabled()) {2928JfrThreadLocal* tl = native_thread->jfr_thread_local();2929// skip Thread.start() and Thread.start0()2930tl->set_cached_stack_trace_id(JfrStackTraceRepository::record(thread, 2));2931}2932#endif29332934Thread::start(native_thread);29352936JVM_END293729382939// JVM_Stop is implemented using a VM_Operation, so threads are forced to safepoints2940// before the quasi-asynchronous exception is delivered. This is a little obtrusive,2941// but is thought to be reliable and simple. In the case, where the receiver is the2942// same thread as the sender, no VM_Operation is needed.2943JVM_ENTRY(void, JVM_StopThread(JNIEnv* env, jobject jthread, jobject throwable))2944ThreadsListHandle tlh(thread);2945oop java_throwable = JNIHandles::resolve(throwable);2946if (java_throwable == NULL) {2947THROW(vmSymbols::java_lang_NullPointerException());2948}2949oop java_thread = NULL;2950JavaThread* receiver = NULL;2951bool is_alive = tlh.cv_internal_thread_to_JavaThread(jthread, &receiver, &java_thread);2952Events::log_exception(thread,2953"JVM_StopThread thread JavaThread " INTPTR_FORMAT " as oop " INTPTR_FORMAT " [exception " INTPTR_FORMAT "]",2954p2i(receiver), p2i(java_thread), p2i(throwable));29552956if (is_alive) {2957// jthread refers to a live JavaThread.2958if (thread == receiver) {2959// Exception is getting thrown at self so no VM_Operation needed.2960THROW_OOP(java_throwable);2961} else {2962// Use a VM_Operation to throw the exception.2963JavaThread::send_async_exception(java_thread, java_throwable);2964}2965} else {2966// Either:2967// - target thread has not been started before being stopped, or2968// - target thread already terminated2969// We could read the threadStatus to determine which case it is2970// but that is overkill as it doesn't matter. We must set the2971// stillborn flag for the first case, and if the thread has already2972// exited setting this flag has no effect.2973java_lang_Thread::set_stillborn(java_thread);2974}2975JVM_END297629772978JVM_ENTRY(jboolean, JVM_IsThreadAlive(JNIEnv* env, jobject jthread))2979oop thread_oop = JNIHandles::resolve_non_null(jthread);2980return java_lang_Thread::is_alive(thread_oop);2981JVM_END298229832984JVM_ENTRY(void, JVM_SuspendThread(JNIEnv* env, jobject jthread))2985ThreadsListHandle tlh(thread);2986JavaThread* receiver = NULL;2987bool is_alive = tlh.cv_internal_thread_to_JavaThread(jthread, &receiver, NULL);2988if (is_alive) {2989// jthread refers to a live JavaThread, but java_suspend() will2990// detect a thread that has started to exit and will ignore it.2991receiver->java_suspend();2992}2993JVM_END299429952996JVM_ENTRY(void, JVM_ResumeThread(JNIEnv* env, jobject jthread))2997ThreadsListHandle tlh(thread);2998JavaThread* receiver = NULL;2999bool is_alive = tlh.cv_internal_thread_to_JavaThread(jthread, &receiver, NULL);3000if (is_alive) {3001// jthread refers to a live JavaThread.3002receiver->java_resume();3003}3004JVM_END300530063007JVM_ENTRY(void, JVM_SetThreadPriority(JNIEnv* env, jobject jthread, jint prio))3008ThreadsListHandle tlh(thread);3009oop java_thread = NULL;3010JavaThread* receiver = NULL;3011bool is_alive = tlh.cv_internal_thread_to_JavaThread(jthread, &receiver, &java_thread);3012java_lang_Thread::set_priority(java_thread, (ThreadPriority)prio);30133014if (is_alive) {3015// jthread refers to a live JavaThread.3016Thread::set_priority(receiver, (ThreadPriority)prio);3017}3018// Implied else: If the JavaThread hasn't started yet, then the3019// priority set in the java.lang.Thread object above will be pushed3020// down when it does start.3021JVM_END302230233024JVM_ENTRY(void, JVM_Yield(JNIEnv *env, jclass threadClass))3025if (os::dont_yield()) return;3026HOTSPOT_THREAD_YIELD();3027os::naked_yield();3028JVM_END30293030static void post_thread_sleep_event(EventThreadSleep* event, jlong millis) {3031assert(event != NULL, "invariant");3032assert(event->should_commit(), "invariant");3033event->set_time(millis);3034event->commit();3035}30363037JVM_ENTRY(void, JVM_Sleep(JNIEnv* env, jclass threadClass, jlong millis))3038if (millis < 0) {3039THROW_MSG(vmSymbols::java_lang_IllegalArgumentException(), "timeout value is negative");3040}30413042if (thread->is_interrupted(true) && !HAS_PENDING_EXCEPTION) {3043THROW_MSG(vmSymbols::java_lang_InterruptedException(), "sleep interrupted");3044}30453046// Save current thread state and restore it at the end of this block.3047// And set new thread state to SLEEPING.3048JavaThreadSleepState jtss(thread);30493050HOTSPOT_THREAD_SLEEP_BEGIN(millis);3051EventThreadSleep event;30523053if (millis == 0) {3054os::naked_yield();3055} else {3056ThreadState old_state = thread->osthread()->get_state();3057thread->osthread()->set_state(SLEEPING);3058if (!thread->sleep(millis)) { // interrupted3059// An asynchronous exception (e.g., ThreadDeathException) could have been thrown on3060// us while we were sleeping. We do not overwrite those.3061if (!HAS_PENDING_EXCEPTION) {3062if (event.should_commit()) {3063post_thread_sleep_event(&event, millis);3064}3065HOTSPOT_THREAD_SLEEP_END(1);30663067// TODO-FIXME: THROW_MSG returns which means we will not call set_state()3068// to properly restore the thread state. That's likely wrong.3069THROW_MSG(vmSymbols::java_lang_InterruptedException(), "sleep interrupted");3070}3071}3072thread->osthread()->set_state(old_state);3073}3074if (event.should_commit()) {3075post_thread_sleep_event(&event, millis);3076}3077HOTSPOT_THREAD_SLEEP_END(0);3078JVM_END30793080JVM_ENTRY(jobject, JVM_CurrentThread(JNIEnv* env, jclass threadClass))3081oop jthread = thread->threadObj();3082assert(jthread != NULL, "no current thread!");3083return JNIHandles::make_local(THREAD, jthread);3084JVM_END30853086JVM_ENTRY(void, JVM_Interrupt(JNIEnv* env, jobject jthread))3087ThreadsListHandle tlh(thread);3088JavaThread* receiver = NULL;3089bool is_alive = tlh.cv_internal_thread_to_JavaThread(jthread, &receiver, NULL);3090if (is_alive) {3091// jthread refers to a live JavaThread.3092receiver->interrupt();3093}3094JVM_END309530963097// Return true iff the current thread has locked the object passed in30983099JVM_ENTRY(jboolean, JVM_HoldsLock(JNIEnv* env, jclass threadClass, jobject obj))3100if (obj == NULL) {3101THROW_(vmSymbols::java_lang_NullPointerException(), JNI_FALSE);3102}3103Handle h_obj(THREAD, JNIHandles::resolve(obj));3104return ObjectSynchronizer::current_thread_holds_lock(thread, h_obj);3105JVM_END310631073108JVM_ENTRY(void, JVM_DumpAllStacks(JNIEnv* env, jclass))3109VM_PrintThreads op;3110VMThread::execute(&op);3111if (JvmtiExport::should_post_data_dump()) {3112JvmtiExport::post_data_dump();3113}3114JVM_END31153116JVM_ENTRY(void, JVM_SetNativeThreadName(JNIEnv* env, jobject jthread, jstring name))3117// We don't use a ThreadsListHandle here because the current thread3118// must be alive.3119oop java_thread = JNIHandles::resolve_non_null(jthread);3120JavaThread* thr = java_lang_Thread::thread(java_thread);3121if (thread == thr && !thr->has_attached_via_jni()) {3122// Thread naming is only supported for the current thread and3123// we don't set the name of an attached thread to avoid stepping3124// on other programs.3125ResourceMark rm(thread);3126const char *thread_name = java_lang_String::as_utf8_string(JNIHandles::resolve_non_null(name));3127os::set_native_thread_name(thread_name);3128}3129JVM_END31303131// java.lang.SecurityManager ///////////////////////////////////////////////////////////////////////31323133JVM_ENTRY(jobjectArray, JVM_GetClassContext(JNIEnv *env))3134ResourceMark rm(THREAD);3135JvmtiVMObjectAllocEventCollector oam;3136vframeStream vfst(thread);31373138if (vmClasses::reflect_CallerSensitive_klass() != NULL) {3139// This must only be called from SecurityManager.getClassContext3140Method* m = vfst.method();3141if (!(m->method_holder() == vmClasses::SecurityManager_klass() &&3142m->name() == vmSymbols::getClassContext_name() &&3143m->signature() == vmSymbols::void_class_array_signature())) {3144THROW_MSG_NULL(vmSymbols::java_lang_InternalError(), "JVM_GetClassContext must only be called from SecurityManager.getClassContext");3145}3146}31473148// Collect method holders3149GrowableArray<Klass*>* klass_array = new GrowableArray<Klass*>();3150for (; !vfst.at_end(); vfst.security_next()) {3151Method* m = vfst.method();3152// Native frames are not returned3153if (!m->is_ignored_by_security_stack_walk() && !m->is_native()) {3154Klass* holder = m->method_holder();3155assert(holder->is_klass(), "just checking");3156klass_array->append(holder);3157}3158}31593160// Create result array of type [Ljava/lang/Class;3161objArrayOop result = oopFactory::new_objArray(vmClasses::Class_klass(), klass_array->length(), CHECK_NULL);3162// Fill in mirrors corresponding to method holders3163for (int i = 0; i < klass_array->length(); i++) {3164result->obj_at_put(i, klass_array->at(i)->java_mirror());3165}31663167return (jobjectArray) JNIHandles::make_local(THREAD, result);3168JVM_END316931703171// java.lang.Package ////////////////////////////////////////////////////////////////317231733174JVM_ENTRY(jstring, JVM_GetSystemPackage(JNIEnv *env, jstring name))3175ResourceMark rm(THREAD);3176JvmtiVMObjectAllocEventCollector oam;3177char* str = java_lang_String::as_utf8_string(JNIHandles::resolve_non_null(name));3178oop result = ClassLoader::get_system_package(str, CHECK_NULL);3179return (jstring) JNIHandles::make_local(THREAD, result);3180JVM_END318131823183JVM_ENTRY(jobjectArray, JVM_GetSystemPackages(JNIEnv *env))3184JvmtiVMObjectAllocEventCollector oam;3185objArrayOop result = ClassLoader::get_system_packages(CHECK_NULL);3186return (jobjectArray) JNIHandles::make_local(THREAD, result);3187JVM_END318831893190// java.lang.ref.Reference ///////////////////////////////////////////////////////////////319131923193JVM_ENTRY(jobject, JVM_GetAndClearReferencePendingList(JNIEnv* env))3194MonitorLocker ml(Heap_lock);3195oop ref = Universe::reference_pending_list();3196if (ref != NULL) {3197Universe::clear_reference_pending_list();3198}3199return JNIHandles::make_local(THREAD, ref);3200JVM_END32013202JVM_ENTRY(jboolean, JVM_HasReferencePendingList(JNIEnv* env))3203MonitorLocker ml(Heap_lock);3204return Universe::has_reference_pending_list();3205JVM_END32063207JVM_ENTRY(void, JVM_WaitForReferencePendingList(JNIEnv* env))3208MonitorLocker ml(Heap_lock);3209while (!Universe::has_reference_pending_list()) {3210ml.wait();3211}3212JVM_END32133214JVM_ENTRY(jboolean, JVM_ReferenceRefersTo(JNIEnv* env, jobject ref, jobject o))3215oop ref_oop = JNIHandles::resolve_non_null(ref);3216oop referent = java_lang_ref_Reference::weak_referent_no_keepalive(ref_oop);3217return referent == JNIHandles::resolve(o);3218JVM_END32193220JVM_ENTRY(void, JVM_ReferenceClear(JNIEnv* env, jobject ref))3221oop ref_oop = JNIHandles::resolve_non_null(ref);3222// FinalReference has it's own implementation of clear().3223assert(!java_lang_ref_Reference::is_final(ref_oop), "precondition");3224if (java_lang_ref_Reference::unknown_referent_no_keepalive(ref_oop) == NULL) {3225// If the referent has already been cleared then done.3226// However, if the referent is dead but has not yet been cleared by3227// concurrent reference processing, it should NOT be cleared here.3228// Instead, clearing should be left to the GC. Clearing it here could3229// detectably lose an expected notification, which is impossible with3230// STW reference processing. The clearing in enqueue() doesn't have3231// this problem, since the enqueue covers the notification, but it's not3232// worth the effort to handle that case specially.3233return;3234}3235java_lang_ref_Reference::clear_referent(ref_oop);3236JVM_END323732383239// java.lang.ref.PhantomReference //////////////////////////////////////////////////324032413242JVM_ENTRY(jboolean, JVM_PhantomReferenceRefersTo(JNIEnv* env, jobject ref, jobject o))3243oop ref_oop = JNIHandles::resolve_non_null(ref);3244oop referent = java_lang_ref_Reference::phantom_referent_no_keepalive(ref_oop);3245return referent == JNIHandles::resolve(o);3246JVM_END324732483249// ObjectInputStream ///////////////////////////////////////////////////////////////32503251// Return the first user-defined class loader up the execution stack, or null3252// if only code from the bootstrap or platform class loader is on the stack.32533254JVM_ENTRY(jobject, JVM_LatestUserDefinedLoader(JNIEnv *env))3255for (vframeStream vfst(thread); !vfst.at_end(); vfst.next()) {3256InstanceKlass* ik = vfst.method()->method_holder();3257oop loader = ik->class_loader();3258if (loader != NULL && !SystemDictionary::is_platform_class_loader(loader)) {3259// Skip reflection related frames3260if (!ik->is_subclass_of(vmClasses::reflect_MethodAccessorImpl_klass()) &&3261!ik->is_subclass_of(vmClasses::reflect_ConstructorAccessorImpl_klass())) {3262return JNIHandles::make_local(THREAD, loader);3263}3264}3265}3266return NULL;3267JVM_END326832693270// Array ///////////////////////////////////////////////////////////////////////////////////////////327132723273// resolve array handle and check arguments3274static inline arrayOop check_array(JNIEnv *env, jobject arr, bool type_array_only, TRAPS) {3275if (arr == NULL) {3276THROW_0(vmSymbols::java_lang_NullPointerException());3277}3278oop a = JNIHandles::resolve_non_null(arr);3279if (!a->is_array()) {3280THROW_MSG_0(vmSymbols::java_lang_IllegalArgumentException(), "Argument is not an array");3281} else if (type_array_only && !a->is_typeArray()) {3282THROW_MSG_0(vmSymbols::java_lang_IllegalArgumentException(), "Argument is not an array of primitive type");3283}3284return arrayOop(a);3285}328632873288JVM_ENTRY(jint, JVM_GetArrayLength(JNIEnv *env, jobject arr))3289arrayOop a = check_array(env, arr, false, CHECK_0);3290return a->length();3291JVM_END329232933294JVM_ENTRY(jobject, JVM_GetArrayElement(JNIEnv *env, jobject arr, jint index))3295JvmtiVMObjectAllocEventCollector oam;3296arrayOop a = check_array(env, arr, false, CHECK_NULL);3297jvalue value;3298BasicType type = Reflection::array_get(&value, a, index, CHECK_NULL);3299oop box = Reflection::box(&value, type, CHECK_NULL);3300return JNIHandles::make_local(THREAD, box);3301JVM_END330233033304JVM_ENTRY(jvalue, JVM_GetPrimitiveArrayElement(JNIEnv *env, jobject arr, jint index, jint wCode))3305jvalue value;3306value.i = 0; // to initialize value before getting used in CHECK3307arrayOop a = check_array(env, arr, true, CHECK_(value));3308assert(a->is_typeArray(), "just checking");3309BasicType type = Reflection::array_get(&value, a, index, CHECK_(value));3310BasicType wide_type = (BasicType) wCode;3311if (type != wide_type) {3312Reflection::widen(&value, type, wide_type, CHECK_(value));3313}3314return value;3315JVM_END331633173318JVM_ENTRY(void, JVM_SetArrayElement(JNIEnv *env, jobject arr, jint index, jobject val))3319arrayOop a = check_array(env, arr, false, CHECK);3320oop box = JNIHandles::resolve(val);3321jvalue value;3322value.i = 0; // to initialize value before getting used in CHECK3323BasicType value_type;3324if (a->is_objArray()) {3325// Make sure we do no unbox e.g. java/lang/Integer instances when storing into an object array3326value_type = Reflection::unbox_for_regular_object(box, &value);3327} else {3328value_type = Reflection::unbox_for_primitive(box, &value, CHECK);3329}3330Reflection::array_set(&value, a, index, value_type, CHECK);3331JVM_END333233333334JVM_ENTRY(void, JVM_SetPrimitiveArrayElement(JNIEnv *env, jobject arr, jint index, jvalue v, unsigned char vCode))3335arrayOop a = check_array(env, arr, true, CHECK);3336assert(a->is_typeArray(), "just checking");3337BasicType value_type = (BasicType) vCode;3338Reflection::array_set(&v, a, index, value_type, CHECK);3339JVM_END334033413342JVM_ENTRY(jobject, JVM_NewArray(JNIEnv *env, jclass eltClass, jint length))3343JvmtiVMObjectAllocEventCollector oam;3344oop element_mirror = JNIHandles::resolve(eltClass);3345oop result = Reflection::reflect_new_array(element_mirror, length, CHECK_NULL);3346return JNIHandles::make_local(THREAD, result);3347JVM_END334833493350JVM_ENTRY(jobject, JVM_NewMultiArray(JNIEnv *env, jclass eltClass, jintArray dim))3351JvmtiVMObjectAllocEventCollector oam;3352arrayOop dim_array = check_array(env, dim, true, CHECK_NULL);3353oop element_mirror = JNIHandles::resolve(eltClass);3354assert(dim_array->is_typeArray(), "just checking");3355oop result = Reflection::reflect_new_multi_array(element_mirror, typeArrayOop(dim_array), CHECK_NULL);3356return JNIHandles::make_local(THREAD, result);3357JVM_END335833593360// Library support ///////////////////////////////////////////////////////////////////////////33613362JVM_ENTRY_NO_ENV(void*, JVM_LoadLibrary(const char* name, jboolean throwException))3363//%note jvm_ct3364char ebuf[1024];3365void *load_result;3366{3367ThreadToNativeFromVM ttnfvm(thread);3368load_result = os::dll_load(name, ebuf, sizeof ebuf);3369}3370if (load_result == NULL) {3371if (throwException) {3372char msg[1024];3373jio_snprintf(msg, sizeof msg, "%s: %s", name, ebuf);3374// Since 'ebuf' may contain a string encoded using3375// platform encoding scheme, we need to pass3376// Exceptions::unsafe_to_utf8 to the new_exception method3377// as the last argument. See bug 6367357.3378Handle h_exception =3379Exceptions::new_exception(thread,3380vmSymbols::java_lang_UnsatisfiedLinkError(),3381msg, Exceptions::unsafe_to_utf8);33823383THROW_HANDLE_0(h_exception);3384} else {3385log_info(library)("Failed to load library %s", name);3386return load_result;3387}3388}3389log_info(library)("Loaded library %s, handle " INTPTR_FORMAT, name, p2i(load_result));3390return load_result;3391JVM_END339233933394JVM_LEAF(void, JVM_UnloadLibrary(void* handle))3395os::dll_unload(handle);3396log_info(library)("Unloaded library with handle " INTPTR_FORMAT, p2i(handle));3397JVM_END339833993400JVM_LEAF(void*, JVM_FindLibraryEntry(void* handle, const char* name))3401void* find_result = os::dll_lookup(handle, name);3402log_info(library)("%s %s in library with handle " INTPTR_FORMAT,3403find_result != NULL ? "Found" : "Failed to find",3404name, p2i(handle));3405return find_result;3406JVM_END340734083409// JNI version ///////////////////////////////////////////////////////////////////////////////34103411JVM_LEAF(jboolean, JVM_IsSupportedJNIVersion(jint version))3412return Threads::is_supported_jni_version_including_1_1(version);3413JVM_END341434153416// String support ///////////////////////////////////////////////////////////////////////////34173418JVM_ENTRY(jstring, JVM_InternString(JNIEnv *env, jstring str))3419JvmtiVMObjectAllocEventCollector oam;3420if (str == NULL) return NULL;3421oop string = JNIHandles::resolve_non_null(str);3422oop result = StringTable::intern(string, CHECK_NULL);3423return (jstring) JNIHandles::make_local(THREAD, result);3424JVM_END342534263427// VM Raw monitor support //////////////////////////////////////////////////////////////////////34283429// VM Raw monitors (not to be confused with JvmtiRawMonitors) are a simple mutual exclusion3430// lock (not actually monitors: no wait/notify) that is exported by the VM for use by JDK3431// library code. They may be used by JavaThreads and non-JavaThreads and do not participate3432// in the safepoint protocol, thread suspension, thread interruption, or anything of that3433// nature. JavaThreads will be "in native" when using this API from JDK code.343434353436JNIEXPORT void* JNICALL JVM_RawMonitorCreate(void) {3437VM_Exit::block_if_vm_exited();3438return new os::PlatformMutex();3439}344034413442JNIEXPORT void JNICALL JVM_RawMonitorDestroy(void *mon) {3443VM_Exit::block_if_vm_exited();3444delete ((os::PlatformMutex*) mon);3445}344634473448JNIEXPORT jint JNICALL JVM_RawMonitorEnter(void *mon) {3449VM_Exit::block_if_vm_exited();3450((os::PlatformMutex*) mon)->lock();3451return 0;3452}345334543455JNIEXPORT void JNICALL JVM_RawMonitorExit(void *mon) {3456VM_Exit::block_if_vm_exited();3457((os::PlatformMutex*) mon)->unlock();3458}345934603461// Shared JNI/JVM entry points //////////////////////////////////////////////////////////////34623463jclass find_class_from_class_loader(JNIEnv* env, Symbol* name, jboolean init,3464Handle loader, Handle protection_domain,3465jboolean throwError, TRAPS) {3466// Security Note:3467// The Java level wrapper will perform the necessary security check allowing3468// us to pass the NULL as the initiating class loader. The VM is responsible for3469// the checkPackageAccess relative to the initiating class loader via the3470// protection_domain. The protection_domain is passed as NULL by the java code3471// if there is no security manager in 3-arg Class.forName().3472Klass* klass = SystemDictionary::resolve_or_fail(name, loader, protection_domain, throwError != 0, CHECK_NULL);34733474// Check if we should initialize the class3475if (init && klass->is_instance_klass()) {3476klass->initialize(CHECK_NULL);3477}3478return (jclass) JNIHandles::make_local(THREAD, klass->java_mirror());3479}348034813482// Method ///////////////////////////////////////////////////////////////////////////////////////////34833484JVM_ENTRY(jobject, JVM_InvokeMethod(JNIEnv *env, jobject method, jobject obj, jobjectArray args0))3485Handle method_handle;3486if (thread->stack_overflow_state()->stack_available((address) &method_handle) >= JVMInvokeMethodSlack) {3487method_handle = Handle(THREAD, JNIHandles::resolve(method));3488Handle receiver(THREAD, JNIHandles::resolve(obj));3489objArrayHandle args(THREAD, objArrayOop(JNIHandles::resolve(args0)));3490oop result = Reflection::invoke_method(method_handle(), receiver, args, CHECK_NULL);3491jobject res = JNIHandles::make_local(THREAD, result);3492if (JvmtiExport::should_post_vm_object_alloc()) {3493oop ret_type = java_lang_reflect_Method::return_type(method_handle());3494assert(ret_type != NULL, "sanity check: ret_type oop must not be NULL!");3495if (java_lang_Class::is_primitive(ret_type)) {3496// Only for primitive type vm allocates memory for java object.3497// See box() method.3498JvmtiExport::post_vm_object_alloc(thread, result);3499}3500}3501return res;3502} else {3503THROW_0(vmSymbols::java_lang_StackOverflowError());3504}3505JVM_END350635073508JVM_ENTRY(jobject, JVM_NewInstanceFromConstructor(JNIEnv *env, jobject c, jobjectArray args0))3509oop constructor_mirror = JNIHandles::resolve(c);3510objArrayHandle args(THREAD, objArrayOop(JNIHandles::resolve(args0)));3511oop result = Reflection::invoke_constructor(constructor_mirror, args, CHECK_NULL);3512jobject res = JNIHandles::make_local(THREAD, result);3513if (JvmtiExport::should_post_vm_object_alloc()) {3514JvmtiExport::post_vm_object_alloc(thread, result);3515}3516return res;3517JVM_END35183519// Atomic ///////////////////////////////////////////////////////////////////////////////////////////35203521JVM_LEAF(jboolean, JVM_SupportsCX8())3522return VM_Version::supports_cx8();3523JVM_END35243525JVM_ENTRY(void, JVM_InitializeFromArchive(JNIEnv* env, jclass cls))3526Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve(cls));3527assert(k->is_klass(), "just checking");3528HeapShared::initialize_from_archived_subgraph(k, THREAD);3529JVM_END35303531JVM_ENTRY(void, JVM_RegisterLambdaProxyClassForArchiving(JNIEnv* env,3532jclass caller,3533jstring interfaceMethodName,3534jobject factoryType,3535jobject interfaceMethodType,3536jobject implementationMember,3537jobject dynamicMethodType,3538jclass lambdaProxyClass))3539#if INCLUDE_CDS3540if (!Arguments::is_dumping_archive()) {3541return;3542}35433544Klass* caller_k = java_lang_Class::as_Klass(JNIHandles::resolve(caller));3545InstanceKlass* caller_ik = InstanceKlass::cast(caller_k);3546if (caller_ik->is_hidden()) {3547// Hidden classes not of type lambda proxy classes are currently not being archived.3548// If the caller_ik is of one of the above types, the corresponding lambda proxy class won't be3549// registered for archiving.3550return;3551}3552Klass* lambda_k = java_lang_Class::as_Klass(JNIHandles::resolve(lambdaProxyClass));3553InstanceKlass* lambda_ik = InstanceKlass::cast(lambda_k);3554assert(lambda_ik->is_hidden(), "must be a hidden class");3555assert(!lambda_ik->is_non_strong_hidden(), "expected a strong hidden class");35563557Symbol* interface_method_name = NULL;3558if (interfaceMethodName != NULL) {3559interface_method_name = java_lang_String::as_symbol(JNIHandles::resolve_non_null(interfaceMethodName));3560}3561Handle factory_type_oop(THREAD, JNIHandles::resolve_non_null(factoryType));3562Symbol* factory_type = java_lang_invoke_MethodType::as_signature(factory_type_oop(), true);35633564Handle interface_method_type_oop(THREAD, JNIHandles::resolve_non_null(interfaceMethodType));3565Symbol* interface_method_type = java_lang_invoke_MethodType::as_signature(interface_method_type_oop(), true);35663567Handle implementation_member_oop(THREAD, JNIHandles::resolve_non_null(implementationMember));3568assert(java_lang_invoke_MemberName::is_method(implementation_member_oop()), "must be");3569Method* m = java_lang_invoke_MemberName::vmtarget(implementation_member_oop());35703571Handle dynamic_method_type_oop(THREAD, JNIHandles::resolve_non_null(dynamicMethodType));3572Symbol* dynamic_method_type = java_lang_invoke_MethodType::as_signature(dynamic_method_type_oop(), true);35733574SystemDictionaryShared::add_lambda_proxy_class(caller_ik, lambda_ik, interface_method_name, factory_type,3575interface_method_type, m, dynamic_method_type, THREAD);3576#endif // INCLUDE_CDS3577JVM_END35783579JVM_ENTRY(jclass, JVM_LookupLambdaProxyClassFromArchive(JNIEnv* env,3580jclass caller,3581jstring interfaceMethodName,3582jobject factoryType,3583jobject interfaceMethodType,3584jobject implementationMember,3585jobject dynamicMethodType))3586#if INCLUDE_CDS35873588if (interfaceMethodName == NULL || factoryType == NULL || interfaceMethodType == NULL ||3589implementationMember == NULL || dynamicMethodType == NULL) {3590THROW_(vmSymbols::java_lang_NullPointerException(), NULL);3591}35923593Klass* caller_k = java_lang_Class::as_Klass(JNIHandles::resolve(caller));3594InstanceKlass* caller_ik = InstanceKlass::cast(caller_k);3595if (!caller_ik->is_shared()) {3596// there won't be a shared lambda class if the caller_ik is not in the shared archive.3597return NULL;3598}35993600Symbol* interface_method_name = java_lang_String::as_symbol(JNIHandles::resolve_non_null(interfaceMethodName));3601Handle factory_type_oop(THREAD, JNIHandles::resolve_non_null(factoryType));3602Symbol* factory_type = java_lang_invoke_MethodType::as_signature(factory_type_oop(), true);36033604Handle interface_method_type_oop(THREAD, JNIHandles::resolve_non_null(interfaceMethodType));3605Symbol* interface_method_type = java_lang_invoke_MethodType::as_signature(interface_method_type_oop(), true);36063607Handle implementation_member_oop(THREAD, JNIHandles::resolve_non_null(implementationMember));3608assert(java_lang_invoke_MemberName::is_method(implementation_member_oop()), "must be");3609Method* m = java_lang_invoke_MemberName::vmtarget(implementation_member_oop());36103611Handle dynamic_method_type_oop(THREAD, JNIHandles::resolve_non_null(dynamicMethodType));3612Symbol* dynamic_method_type = java_lang_invoke_MethodType::as_signature(dynamic_method_type_oop(), true);36133614InstanceKlass* lambda_ik = SystemDictionaryShared::get_shared_lambda_proxy_class(caller_ik, interface_method_name, factory_type,3615interface_method_type, m, dynamic_method_type);3616jclass jcls = NULL;3617if (lambda_ik != NULL) {3618InstanceKlass* loaded_lambda = SystemDictionaryShared::prepare_shared_lambda_proxy_class(lambda_ik, caller_ik, THREAD);3619jcls = loaded_lambda == NULL ? NULL : (jclass) JNIHandles::make_local(THREAD, loaded_lambda->java_mirror());3620}3621return jcls;3622#else3623return NULL;3624#endif // INCLUDE_CDS3625JVM_END36263627JVM_ENTRY(jboolean, JVM_IsCDSDumpingEnabled(JNIEnv* env))3628return Arguments::is_dumping_archive();3629JVM_END36303631JVM_ENTRY(jboolean, JVM_IsSharingEnabled(JNIEnv* env))3632return UseSharedSpaces;3633JVM_END36343635JVM_ENTRY_NO_ENV(jlong, JVM_GetRandomSeedForDumping())3636if (DumpSharedSpaces) {3637const char* release = Abstract_VM_Version::vm_release();3638const char* dbg_level = Abstract_VM_Version::jdk_debug_level();3639const char* version = VM_Version::internal_vm_info_string();3640jlong seed = (jlong)(java_lang_String::hash_code((const jbyte*)release, (int)strlen(release)) ^3641java_lang_String::hash_code((const jbyte*)dbg_level, (int)strlen(dbg_level)) ^3642java_lang_String::hash_code((const jbyte*)version, (int)strlen(version)));3643seed += (jlong)Abstract_VM_Version::vm_major_version();3644seed += (jlong)Abstract_VM_Version::vm_minor_version();3645seed += (jlong)Abstract_VM_Version::vm_security_version();3646seed += (jlong)Abstract_VM_Version::vm_patch_version();3647if (seed == 0) { // don't let this ever be zero.3648seed = 0x87654321;3649}3650log_debug(cds)("JVM_GetRandomSeedForDumping() = " JLONG_FORMAT, seed);3651return seed;3652} else {3653return 0;3654}3655JVM_END36563657JVM_ENTRY(jboolean, JVM_IsDumpingClassList(JNIEnv *env))3658#if INCLUDE_CDS3659return ClassListWriter::is_enabled() || DynamicDumpSharedSpaces;3660#else3661return false;3662#endif // INCLUDE_CDS3663JVM_END36643665JVM_ENTRY(void, JVM_LogLambdaFormInvoker(JNIEnv *env, jstring line))3666#if INCLUDE_CDS3667assert(ClassListWriter::is_enabled() || DynamicDumpSharedSpaces, "Should be set and open or do dynamic dump");3668if (line != NULL) {3669ResourceMark rm(THREAD);3670Handle h_line (THREAD, JNIHandles::resolve_non_null(line));3671char* c_line = java_lang_String::as_utf8_string(h_line());3672if (DynamicDumpSharedSpaces) {3673// Note: LambdaFormInvokers::append_filtered and LambdaFormInvokers::append take same format which is not3674// same as below the print format. The line does not include LAMBDA_FORM_TAG.3675LambdaFormInvokers::append_filtered(os::strdup((const char*)c_line, mtInternal));3676}3677if (ClassListWriter::is_enabled()) {3678ClassListWriter w;3679w.stream()->print_cr("%s %s", LAMBDA_FORM_TAG, c_line);3680}3681}3682#endif // INCLUDE_CDS3683JVM_END36843685JVM_ENTRY(void, JVM_DumpClassListToFile(JNIEnv *env, jstring listFileName))3686#if INCLUDE_CDS3687ResourceMark rm(THREAD);3688Handle file_handle(THREAD, JNIHandles::resolve_non_null(listFileName));3689char* file_name = java_lang_String::as_utf8_string(file_handle());3690MetaspaceShared::dump_loaded_classes(file_name, THREAD);3691#endif // INCLUDE_CDS3692JVM_END36933694JVM_ENTRY(void, JVM_DumpDynamicArchive(JNIEnv *env, jstring archiveName))3695#if INCLUDE_CDS3696ResourceMark rm(THREAD);3697Handle file_handle(THREAD, JNIHandles::resolve_non_null(archiveName));3698char* archive_name = java_lang_String::as_utf8_string(file_handle());3699DynamicArchive::dump(archive_name, CHECK);3700#endif // INCLUDE_CDS3701JVM_END37023703// Returns an array of all live Thread objects (VM internal JavaThreads,3704// jvmti agent threads, and JNI attaching threads are skipped)3705// See CR 6404306 regarding JNI attaching threads3706JVM_ENTRY(jobjectArray, JVM_GetAllThreads(JNIEnv *env, jclass dummy))3707ResourceMark rm(THREAD);3708ThreadsListEnumerator tle(THREAD, false, false);3709JvmtiVMObjectAllocEventCollector oam;37103711int num_threads = tle.num_threads();3712objArrayOop r = oopFactory::new_objArray(vmClasses::Thread_klass(), num_threads, CHECK_NULL);3713objArrayHandle threads_ah(THREAD, r);37143715for (int i = 0; i < num_threads; i++) {3716Handle h = tle.get_threadObj(i);3717threads_ah->obj_at_put(i, h());3718}37193720return (jobjectArray) JNIHandles::make_local(THREAD, threads_ah());3721JVM_END372237233724// Support for java.lang.Thread.getStackTrace() and getAllStackTraces() methods3725// Return StackTraceElement[][], each element is the stack trace of a thread in3726// the corresponding entry in the given threads array3727JVM_ENTRY(jobjectArray, JVM_DumpThreads(JNIEnv *env, jclass threadClass, jobjectArray threads))3728JvmtiVMObjectAllocEventCollector oam;37293730// Check if threads is null3731if (threads == NULL) {3732THROW_(vmSymbols::java_lang_NullPointerException(), 0);3733}37343735objArrayOop a = objArrayOop(JNIHandles::resolve_non_null(threads));3736objArrayHandle ah(THREAD, a);3737int num_threads = ah->length();3738// check if threads is non-empty array3739if (num_threads == 0) {3740THROW_(vmSymbols::java_lang_IllegalArgumentException(), 0);3741}37423743// check if threads is not an array of objects of Thread class3744Klass* k = ObjArrayKlass::cast(ah->klass())->element_klass();3745if (k != vmClasses::Thread_klass()) {3746THROW_(vmSymbols::java_lang_IllegalArgumentException(), 0);3747}37483749ResourceMark rm(THREAD);37503751GrowableArray<instanceHandle>* thread_handle_array = new GrowableArray<instanceHandle>(num_threads);3752for (int i = 0; i < num_threads; i++) {3753oop thread_obj = ah->obj_at(i);3754instanceHandle h(THREAD, (instanceOop) thread_obj);3755thread_handle_array->append(h);3756}37573758// The JavaThread references in thread_handle_array are validated3759// in VM_ThreadDump::doit().3760Handle stacktraces = ThreadService::dump_stack_traces(thread_handle_array, num_threads, CHECK_NULL);3761return (jobjectArray)JNIHandles::make_local(THREAD, stacktraces());37623763JVM_END37643765// JVM monitoring and management support3766JVM_ENTRY_NO_ENV(void*, JVM_GetManagement(jint version))3767return Management::get_jmm_interface(version);3768JVM_END37693770// com.sun.tools.attach.VirtualMachine agent properties support3771//3772// Initialize the agent properties with the properties maintained in the VM3773JVM_ENTRY(jobject, JVM_InitAgentProperties(JNIEnv *env, jobject properties))3774ResourceMark rm;37753776Handle props(THREAD, JNIHandles::resolve_non_null(properties));37773778PUTPROP(props, "sun.java.command", Arguments::java_command());3779PUTPROP(props, "sun.jvm.flags", Arguments::jvm_flags());3780PUTPROP(props, "sun.jvm.args", Arguments::jvm_args());3781return properties;3782JVM_END37833784JVM_ENTRY(jobjectArray, JVM_GetEnclosingMethodInfo(JNIEnv *env, jclass ofClass))3785{3786JvmtiVMObjectAllocEventCollector oam;37873788if (ofClass == NULL) {3789return NULL;3790}3791Handle mirror(THREAD, JNIHandles::resolve_non_null(ofClass));3792// Special handling for primitive objects3793if (java_lang_Class::is_primitive(mirror())) {3794return NULL;3795}3796Klass* k = java_lang_Class::as_Klass(mirror());3797if (!k->is_instance_klass()) {3798return NULL;3799}3800InstanceKlass* ik = InstanceKlass::cast(k);3801int encl_method_class_idx = ik->enclosing_method_class_index();3802if (encl_method_class_idx == 0) {3803return NULL;3804}3805objArrayOop dest_o = oopFactory::new_objArray(vmClasses::Object_klass(), 3, CHECK_NULL);3806objArrayHandle dest(THREAD, dest_o);3807Klass* enc_k = ik->constants()->klass_at(encl_method_class_idx, CHECK_NULL);3808dest->obj_at_put(0, enc_k->java_mirror());3809int encl_method_method_idx = ik->enclosing_method_method_index();3810if (encl_method_method_idx != 0) {3811Symbol* sym = ik->constants()->symbol_at(3812extract_low_short_from_int(3813ik->constants()->name_and_type_at(encl_method_method_idx)));3814Handle str = java_lang_String::create_from_symbol(sym, CHECK_NULL);3815dest->obj_at_put(1, str());3816sym = ik->constants()->symbol_at(3817extract_high_short_from_int(3818ik->constants()->name_and_type_at(encl_method_method_idx)));3819str = java_lang_String::create_from_symbol(sym, CHECK_NULL);3820dest->obj_at_put(2, str());3821}3822return (jobjectArray) JNIHandles::make_local(THREAD, dest());3823}3824JVM_END38253826// Returns an array of java.lang.String objects containing the input arguments to the VM.3827JVM_ENTRY(jobjectArray, JVM_GetVmArguments(JNIEnv *env))3828ResourceMark rm(THREAD);38293830if (Arguments::num_jvm_args() == 0 && Arguments::num_jvm_flags() == 0) {3831return NULL;3832}38333834char** vm_flags = Arguments::jvm_flags_array();3835char** vm_args = Arguments::jvm_args_array();3836int num_flags = Arguments::num_jvm_flags();3837int num_args = Arguments::num_jvm_args();38383839InstanceKlass* ik = vmClasses::String_klass();3840objArrayOop r = oopFactory::new_objArray(ik, num_args + num_flags, CHECK_NULL);3841objArrayHandle result_h(THREAD, r);38423843int index = 0;3844for (int j = 0; j < num_flags; j++, index++) {3845Handle h = java_lang_String::create_from_platform_dependent_str(vm_flags[j], CHECK_NULL);3846result_h->obj_at_put(index, h());3847}3848for (int i = 0; i < num_args; i++, index++) {3849Handle h = java_lang_String::create_from_platform_dependent_str(vm_args[i], CHECK_NULL);3850result_h->obj_at_put(index, h());3851}3852return (jobjectArray) JNIHandles::make_local(THREAD, result_h());3853JVM_END38543855JVM_ENTRY_NO_ENV(jint, JVM_FindSignal(const char *name))3856return os::get_signal_number(name);3857JVM_END385838593860