jvmtiEnv.cpp revision 1472
1472N/A * Copyright (c) 2003, 2009, Oracle and/or its affiliates. All rights reserved. 0N/A * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 0N/A * This code is free software; you can redistribute it and/or modify it 0N/A * under the terms of the GNU General Public License version 2 only, as 0N/A * published by the Free Software Foundation. 0N/A * This code is distributed in the hope that it will be useful, but WITHOUT 0N/A * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 0N/A * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 0N/A * version 2 for more details (a copy is included in the LICENSE file that 0N/A * accompanied this code). 0N/A * You should have received a copy of the GNU General Public License version 0N/A * 2 along with this work; if not, write to the Free Software Foundation, 0N/A * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 1472N/A * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 0N/A#
include "incls/_precompiled.incl" 0N/A // FIXLATER: hook into JvmtiTrace 0N/A// VM operation class to copy jni function table at safepoint. 0N/A// More than one java threads or jvmti agents may be reading/ 0N/A// modifying jni function tables. To reduce the risk of bad 0N/A// interaction b/w these threads it is copied at safepoint. 0N/A// Do not change the "prefix" marker below, everything above it is copied 0N/A// unchanged into the filled stub, everything below is controlled by the 0N/A// stub filler (only method bodies are carried forward, and then only for 0N/A// functionality still in the spec). 0N/A // Memory Management functions 0N/A// mem_ptr - pre-checked for NULL 0N/A// mem - NULL is a valid value, must be checked 0N/A}
/* end Deallocate */ 0N/A// Threads_lock NOT held, java_thread not protected by lock 0N/A// java_thread - pre-checked 0N/A// data - NULL is a valid value, must be checked 0N/A // leaving state unset same as data set to NULL 0N/A // otherwise, create the state 0N/A}
/* end SetThreadLocalStorage */ 0N/A// Threads_lock NOT held 0N/A// thread - NOT pre-checked 0N/A// data_ptr - pre-checked for NULL 0N/A // jvmti_GetThreadLocalStorage is "in native" and doesn't transition 0N/A // the thread to _thread_in_vm. However, when the TLS for a thread 0N/A // other than the current thread is required we need to transition 0N/A // from native so as to resolve the jthread. 0N/A}
/* end GetThreadLocalStorage */ 0N/A// class_count_ptr - pre-checked for NULL 0N/A// classes_ptr - pre-checked for NULL 0N/A}
/* end GetLoadedClasses */ 0N/A// initiating_loader - NULL is a valid value, must be checked 0N/A// class_count_ptr - pre-checked for NULL 0N/A// classes_ptr - pre-checked for NULL 0N/A}
/* end GetClassLoaderClasses */ 0N/A// k_mirror - may be primitive, this must be checked 0N/A// is_modifiable_class_ptr - pre-checked for NULL 0N/A}
/* end IsModifiableClass */ 0N/A// class_count - pre-checked to be greater than or equal to 0 0N/A// classes - pre-checked for NULL 0N/A // not cached, we need to reconstitute the class file from VM representation 0N/A // it is cached, get it from the cache 0N/A}
/* end RetransformClasses */ 0N/A// class_count - pre-checked to be greater than or equal to 0 0N/A// class_definitions - pre-checked for NULL 0N/A}
/* end RedefineClasses */ 0N/A// size_ptr - pre-checked for NULL 0N/A}
/* end GetObjectSize */ 0N/A// prefix - NULL is a valid value, must be checked 0N/A}
/* end SetNativeMethodPrefix */ 0N/A// prefix_count - pre-checked to be greater than or equal to 0 0N/A// prefixes - pre-checked for NULL 0N/A // Have to grab JVMTI thread state lock to be sure that some thread 0N/A // isn't accessing the prefixes at the same time we are setting them. 0N/A // No locks during VM bring-up. 0N/A}
/* end SetNativeMethodPrefixes */ 0N/A // Event Management functions 0N/A// callbacks - NULL is a valid value, must be checked 0N/A// size_of_callbacks - pre-checked to be greater than or equal to 0 0N/A}
/* end SetEventCallbacks */ 0N/A// event_thread - NULL is a valid value, must be checked 0N/A // event_type must be valid 0N/A // global events cannot be controlled at thread level. 0N/A // assure that needed capabilities are present 0N/A}
/* end SetEventNotificationMode */ 0N/A // Capability functions 0N/A// capabilities_ptr - pre-checked for NULL 0N/A}
/* end GetPotentialCapabilities */ 0N/A// capabilities_ptr - pre-checked for NULL 0N/A}
/* end AddCapabilities */ 0N/A// capabilities_ptr - pre-checked for NULL 0N/A}
/* end RelinquishCapabilities */ 0N/A// capabilities_ptr - pre-checked for NULL 0N/A}
/* end GetCapabilities */ 0N/A // Class Loader Search functions 0N/A// segment - pre-checked for NULL 1121N/A // This JvmtiEnv requested version 1.0 semantics and this function 1121N/A // is only allowed in the ONLOAD phase in version 1.0 so we need to 1120N/A // The phase is checked by the wrapper that called this function, 1120N/A // but this thread could be racing with the thread that is 1120N/A // terminating the VM so we check one more time. 0N/A // create the zip entry 0N/A // add the jar file to the bootclasspath 0N/A}
/* end AddToBootstrapClassLoaderSearch */ 0N/A// segment - pre-checked for NULL 1120N/A // The phase is checked by the wrapper that called this function, 1120N/A // but this thread could be racing with the thread that is 1120N/A // terminating the VM so we check one more time. 0N/A // create the zip entry (which will open the zip file and hence 0N/A // check that the segment is indeed a zip file). 0N/A // need the path as java.lang.String 0N/A // Invoke the appendToClassPathForInstrumentation method - if the method 0N/A // is not found it means the loader doesn't support adding to the class path 0N/A // in the live phase. 0N/A}
/* end AddToSystemClassLoaderSearch */ 0N/A // General functions 0N/A// phase_ptr - pre-checked for NULL 0N/A}
/* end DisposeEnvironment */ 0N/A// data - NULL is a valid value, must be checked 0N/A}
/* end SetEnvironmentLocalStorage */ 0N/A// data_ptr - pre-checked for NULL 0N/A}
/* end GetEnvironmentLocalStorage */ 0N/A// version_ptr - pre-checked for NULL 0N/A}
/* end GetVersionNumber */ 0N/A// name_ptr - pre-checked for NULL 0N/A}
/* end GetErrorName */ 0N/A}
/* end SetVerboseFlag */ 0N/A// format_ptr - pre-checked for NULL 0N/A}
/* end GetJLocationFormat */ 0N/A// Threads_lock NOT held 0N/A// thread - NOT pre-checked 0N/A// thread_state_ptr - pre-checked for NULL 0N/A // get most state bits 0N/A // add more state bits 0N/A}
/* end GetThreadState */ 0N/A// thread_ptr - pre-checked for NULL 0N/A}
/* end GetCurrentThread */ 0N/A// threads_count_ptr - pre-checked for NULL 0N/A// threads_ptr - pre-checked for NULL 0N/A // enumerate threads (including agent threads) 0N/A // have to make global handles outside of Threads_lock 0N/A}
/* end GetAllThreads */ 0N/A// Threads_lock NOT held, java_thread not protected by lock 0N/A// java_thread - pre-checked 0N/A // don't allow hidden thread suspend request. 0N/A // don't allow nested external suspend requests. 0N/A // the thread was in the process of exiting 0N/A}
/* end SuspendThread */ 0N/A// request_count - pre-checked to be greater than or equal to 0 0N/A// request_list - pre-checked for NULL 0N/A// results - pre-checked for NULL 0N/A // the thread has not yet run or has exited (not on threads list) 0N/A // don't allow hidden thread suspend request. 0N/A // don't allow nested external suspend requests. 0N/A // We need to try and suspend native threads here. Threads in 0N/A // other states will self-suspend on their next transition. 0N/A // The thread was in the process of exiting. Force another 0N/A // safepoint to make sure that this thread transitions. 0N/A // per-thread suspend results returned via results parameter 0N/A}
/* end SuspendThreadList */ 0N/A// Threads_lock NOT held, java_thread not protected by lock 0N/A// java_thread - pre-checked 0N/A // don't allow hidden thread resume request. 0N/A}
/* end ResumeThread */ 0N/A// request_count - pre-checked to be greater than or equal to 0 0N/A// request_list - pre-checked for NULL 0N/A// results - pre-checked for NULL 0N/A // don't allow hidden thread resume request. 0N/A // per-thread resume results returned via results parameter 0N/A}
/* end ResumeThreadList */ 0N/A// Threads_lock NOT held, java_thread not protected by lock 0N/A// java_thread - pre-checked 0N/A}
/* end StopThread */ 0N/A// Threads_lock NOT held 0N/A// thread - NOT pre-checked 0N/A // Todo: this is a duplicate of JVM_Interrupt; share code in future 0N/A // Ensure that the C++ Thread and OSThread structures aren't freed before we operate 0N/A // We need to re-resolve the java_thread, since a GC might have happened during the 0N/A // acquire of the lock 0N/A}
/* end InterruptThread */ 0N/A// Threads_lock NOT held 0N/A// thread - NOT pre-checked 0N/A// info_ptr - pre-checked for NULL 0N/A // if thread is NULL the current thread is used 0N/A}
/* end GetThreadInfo */ 0N/A// Threads_lock NOT held, java_thread not protected by lock 0N/A// java_thread - pre-checked 0N/A// owned_monitor_count_ptr - pre-checked for NULL 0N/A// owned_monitors_ptr - pre-checked for NULL 0N/A // growable array of jvmti monitors info on the C-heap 0N/A // JVMTI get monitors info at safepoint. Do not require target thread to 0N/A // copy into the returned array 0N/A}
/* end GetOwnedMonitorInfo */ 0N/A// Threads_lock NOT held, java_thread not protected by lock 0N/A// java_thread - pre-checked 0N/A// monitor_info_count_ptr - pre-checked for NULL 0N/A// monitor_info_ptr - pre-checked for NULL 0N/A // growable array of jvmti monitors info on the C-heap 0N/A // JVMTI get owned monitors info at safepoint. Do not require target thread to 0N/A // copy to output array. 0N/A}
/* end GetOwnedMonitorStackDepthInfo */ 0N/A// Threads_lock NOT held, java_thread not protected by lock 0N/A// java_thread - pre-checked 0N/A// monitor_ptr - pre-checked for NULL 0N/A // get contended monitor information at safepoint. 0N/A}
/* end GetCurrentContendedMonitor */ 0N/A// Threads_lock NOT held 0N/A// thread - NOT pre-checked 0N/A// proc - pre-checked for NULL 0N/A// arg - NULL is a valid value, must be checked 0N/A // At this point it may be possible that no osthread was created for the 0N/A // JavaThread due to lack of memory. 0N/A }
// unlock Threads_lock 0N/A}
/* end RunAgentThread */ 0N/A // Thread Group functions 0N/A// group_count_ptr - pre-checked for NULL 0N/A// groups_ptr - pre-checked for NULL 0N/A // Only one top level thread group now. 0N/A // Allocate memory to store global-refs to the thread groups. 0N/A // Assume this area is freed by caller. 0N/A // Convert oop to Handle, then convert Handle to global-ref. 0N/A}
/* end GetTopThreadGroups */ 0N/A// info_ptr - pre-checked for NULL 0N/A}
/* end GetThreadGroupInfo */ 0N/A// thread_count_ptr - pre-checked for NULL 0N/A// threads_ptr - pre-checked for NULL 0N/A// group_count_ptr - pre-checked for NULL 0N/A// groups_ptr - pre-checked for NULL 0N/A // Filter out hidden java threads. 0N/A // have to make global handles outside of Threads_lock 0N/A}
/* end GetThreadGroupChildren */ 0N/A // Stack Frame functions 0N/A// Threads_lock NOT held, java_thread not protected by lock 0N/A// java_thread - pre-checked 0N/A// max_frame_count - pre-checked to be greater than or equal to 0 0N/A// frame_buffer - pre-checked for NULL 0N/A// count_ptr - pre-checked for NULL 0N/A // JVMTI get stack trace at safepoint. Do not require target thread to 0N/A}
/* end GetStackTrace */ 0N/A// max_frame_count - pre-checked to be greater than or equal to 0 0N/A// stack_info_ptr - pre-checked for NULL 0N/A// thread_count_ptr - pre-checked for NULL 0N/A // JVMTI get stack traces at safepoint. 0N/A}
/* end GetAllStackTraces */ 0N/A// thread_count - pre-checked to be greater than or equal to 0 0N/A// thread_list - pre-checked for NULL 0N/A// max_frame_count - pre-checked to be greater than or equal to 0 0N/A// stack_info_ptr - pre-checked for NULL 0N/A // JVMTI get stack traces at safepoint. 0N/A}
/* end GetThreadListStackTraces */ 0N/A// Threads_lock NOT held, java_thread not protected by lock 0N/A// java_thread - pre-checked 0N/A// count_ptr - pre-checked for NULL 0N/A // retrieve or create JvmtiThreadState. 0N/A // get java stack frame count at safepoint. 0N/A}
/* end GetFrameCount */ 0N/A// Threads_lock NOT held, java_thread not protected by lock 0N/A// java_thread - pre-checked 609N/A // retrieve or create the state 0N/A // Check if java_thread is fully suspended 0N/A // Check to see if a PopFrame was already in progress 0N/A // Probably possible for JVMTI clients to trigger this, but the 0N/A // JPDA backend shouldn't allow this to happen 0N/A // Was workaround bug 0N/A // 4812902: popFrame hangs if the method is waiting at a synchronize 0N/A // Catch this condition and return an error to avoid hanging. 0N/A // Now JVMTI spec allows an implementation to bail out with an opaque frame error. 0N/A // Check if there are more than one Java frame in this thread, that the top two frames 0N/A // are Java (not native) frames, and that there is no intervening VM frame 0N/A // The 2-nd arg of constructor is needed to stop iterating at java entry frame. 0N/A // We haven't found two adjacent non-native Java frames on the top. 0N/A // There can be two situations here: 0N/A // 1. There are no more java frames 0N/A // 2. Two top java frames are separated by non-java native frames 0N/A // Intervening non-java native or VM frames separate java frames. 0N/A // Current implementation does not support this. See bug #5031735. 0N/A // In theory it is possible to pop frames in such cases. 0N/A // If any of the top 2 frames is a compiled one, need to deoptimize it 0N/A for (
int i = 0; i <
2; i++) {
0N/A // Update the thread state to reflect that the top frame is popped 0N/A // so that cur_stack_depth is maintained properly and all frameIDs 0N/A // The current frame will be popped later when the suspended thread 0N/A // is resumed and right before returning from VM to Java. 0N/A // (see call_VM_base() in assembler_<cpu>.cpp). 0N/A // It's fine to update the thread state here because no JVMTI events 0N/A // shall be posted for this PopFrame. 0N/A // Set pending step flag for this popframe and it is cleared when next 0N/A // step event is posted. 0N/A// Threads_lock NOT held, java_thread not protected by lock 0N/A// java_thread - pre-checked 0N/A// java_thread - unchecked 0N/A// depth - pre-checked as non-negative 0N/A// method_ptr - pre-checked for NULL 0N/A// location_ptr - pre-checked for NULL 0N/A // JVMTI get java stack frame location at safepoint. 0N/A}
/* end GetFrameLocation */ 0N/A// Threads_lock NOT held, java_thread not protected by lock 0N/A// java_thread - pre-checked 0N/A// java_thread - unchecked 0N/A// depth - pre-checked as non-negative 0N/A}
/* end NotifyFramePop */ 0N/A // Force Early Return functions 0N/A// Threads_lock NOT held, java_thread not protected by lock 0N/A// java_thread - pre-checked 0N/A}
/* end ForceEarlyReturnObject */ 0N/A// Threads_lock NOT held, java_thread not protected by lock 0N/A// java_thread - pre-checked 0N/A}
/* end ForceEarlyReturnInt */ 0N/A// Threads_lock NOT held, java_thread not protected by lock 0N/A// java_thread - pre-checked 0N/A}
/* end ForceEarlyReturnLong */ 0N/A// Threads_lock NOT held, java_thread not protected by lock 0N/A// java_thread - pre-checked 0N/A}
/* end ForceEarlyReturnFloat */ 0N/A// Threads_lock NOT held, java_thread not protected by lock 0N/A// java_thread - pre-checked 0N/A}
/* end ForceEarlyReturnDouble */ 0N/A// Threads_lock NOT held, java_thread not protected by lock 0N/A// java_thread - pre-checked 0N/A}
/* end ForceEarlyReturnVoid */ 0N/A// klass - NULL is a valid value, must be checked 0N/A// initial_object - NULL is a valid value, must be checked 0N/A// callbacks - pre-checked for NULL 0N/A// user_data - NULL is a valid value, must be checked 0N/A // check klass if provided 0N/A}
/* end FollowReferences */ 0N/A// klass - NULL is a valid value, must be checked 0N/A// callbacks - pre-checked for NULL 0N/A// user_data - NULL is a valid value, must be checked 0N/A // check klass if provided 0N/A}
/* end IterateThroughHeap */ 0N/A// tag_ptr - pre-checked for NULL 0N/A// tag_count - pre-checked to be greater than or equal to 0 0N/A// tags - pre-checked for NULL 0N/A// count_ptr - pre-checked for NULL 0N/A// object_result_ptr - NULL is a valid value, must be checked 0N/A// tag_result_ptr - NULL is a valid value, must be checked 0N/A}
/* end GetObjectsWithTags */ 0N/A}
/* end ForceGarbageCollection */ 0N/A // Heap (1.0) functions 0N/A// object_reference_callback - pre-checked for NULL 0N/A// user_data - NULL is a valid value, must be checked 0N/A}
/* end IterateOverObjectsReachableFromObject */ 0N/A// heap_root_callback - NULL is a valid value, must be checked 0N/A// stack_ref_callback - NULL is a valid value, must be checked 0N/A// object_ref_callback - NULL is a valid value, must be checked 0N/A// user_data - NULL is a valid value, must be checked 0N/A}
/* end IterateOverReachableObjects */ 0N/A// heap_object_callback - pre-checked for NULL 0N/A// user_data - NULL is a valid value, must be checked 0N/A}
/* end IterateOverHeap */ 0N/A// k_mirror - may be primitive, this must be checked 0N/A// heap_object_callback - pre-checked for NULL 0N/A// user_data - NULL is a valid value, must be checked 0N/A // DO PRIMITIVE CLASS PROCESSING 0N/A}
/* end IterateOverInstancesOfClass */ 0N/A // Local Variable functions 0N/A// Threads_lock NOT held, java_thread not protected by lock 0N/A// java_thread - pre-checked 0N/A// java_thread - unchecked 0N/A// depth - pre-checked as non-negative 0N/A// value_ptr - pre-checked for NULL 0N/A // rm object is created to clean up the javaVFrame created in 0N/A // doit_prologue(), but after doit() is finished with it. 0N/A}
/* end GetLocalObject */ 0N/A// Threads_lock NOT held, java_thread not protected by lock 0N/A// java_thread - pre-checked 0N/A// java_thread - unchecked 0N/A// depth - pre-checked as non-negative 0N/A// value_ptr - pre-checked for NULL 0N/A // rm object is created to clean up the javaVFrame created in 0N/A // doit_prologue(), but after doit() is finished with it. 0N/A}
/* end GetLocalInt */ 0N/A// Threads_lock NOT held, java_thread not protected by lock 0N/A// java_thread - pre-checked 0N/A// java_thread - unchecked 0N/A// depth - pre-checked as non-negative 0N/A// value_ptr - pre-checked for NULL 0N/A // rm object is created to clean up the javaVFrame created in 0N/A // doit_prologue(), but after doit() is finished with it. 0N/A}
/* end GetLocalLong */ 0N/A// Threads_lock NOT held, java_thread not protected by lock 0N/A// java_thread - pre-checked 0N/A// java_thread - unchecked 0N/A// depth - pre-checked as non-negative 0N/A// value_ptr - pre-checked for NULL 0N/A // rm object is created to clean up the javaVFrame created in 0N/A // doit_prologue(), but after doit() is finished with it. 0N/A}
/* end GetLocalFloat */ 0N/A// Threads_lock NOT held, java_thread not protected by lock 0N/A// java_thread - pre-checked 0N/A// java_thread - unchecked 0N/A// depth - pre-checked as non-negative 0N/A// value_ptr - pre-checked for NULL 0N/A // rm object is created to clean up the javaVFrame created in 0N/A // doit_prologue(), but after doit() is finished with it. 0N/A}
/* end GetLocalDouble */ 0N/A// Threads_lock NOT held, java_thread not protected by lock 0N/A// java_thread - pre-checked 0N/A// java_thread - unchecked 0N/A// depth - pre-checked as non-negative 0N/A // rm object is created to clean up the javaVFrame created in 0N/A // doit_prologue(), but after doit() is finished with it. 0N/A}
/* end SetLocalObject */ 0N/A// Threads_lock NOT held, java_thread not protected by lock 0N/A// java_thread - pre-checked 0N/A// java_thread - unchecked 0N/A// depth - pre-checked as non-negative 0N/A // rm object is created to clean up the javaVFrame created in 0N/A // doit_prologue(), but after doit() is finished with it. 0N/A}
/* end SetLocalInt */ 0N/A// Threads_lock NOT held, java_thread not protected by lock 0N/A// java_thread - pre-checked 0N/A// java_thread - unchecked 0N/A// depth - pre-checked as non-negative 0N/A // rm object is created to clean up the javaVFrame created in 0N/A // doit_prologue(), but after doit() is finished with it. 0N/A}
/* end SetLocalLong */ 0N/A// Threads_lock NOT held, java_thread not protected by lock 0N/A// java_thread - pre-checked 0N/A// java_thread - unchecked 0N/A// depth - pre-checked as non-negative 0N/A // rm object is created to clean up the javaVFrame created in 0N/A // doit_prologue(), but after doit() is finished with it. 0N/A}
/* end SetLocalFloat */ 0N/A// Threads_lock NOT held, java_thread not protected by lock 0N/A// java_thread - pre-checked 0N/A// java_thread - unchecked 0N/A// depth - pre-checked as non-negative 0N/A // rm object is created to clean up the javaVFrame created in 0N/A // doit_prologue(), but after doit() is finished with it. 0N/A}
/* end SetLocalDouble */ 0N/A // Breakpoint functions 0N/A// method_oop - pre-checked for validity, but may be NULL meaning obsolete method 0N/A if (
location < 0) {
// simple invalid location check first 0N/A // verify that the breakpoint is not past the end of the method 0N/A}
/* end SetBreakpoint */ 0N/A// method_oop - pre-checked for validity, but may be NULL meaning obsolete method 0N/A if (
location < 0) {
// simple invalid location check first 0N/A // verify that the breakpoint is not past the end of the method 0N/A}
/* end ClearBreakpoint */ 0N/A // Watched Field functions 0N/A // make sure we haven't set this watch before 0N/A}
/* end SetFieldAccessWatch */ 0N/A // make sure we have a watch to clear 0N/A}
/* end ClearFieldAccessWatch */ 0N/A // make sure we haven't set this watch before 0N/A}
/* end SetFieldModificationWatch */ 0N/A // make sure we have a watch to clear 0N/A}
/* end ClearFieldModificationWatch */ 0N/A// k_mirror - may be primitive, this must be checked 0N/A// signature_ptr - NULL is a valid value, must be checked 0N/A// generic_ptr - NULL is a valid value, must be checked 0N/A}
/* end GetClassSignature */ 0N/A// k_mirror - may be primitive, this must be checked 0N/A// status_ptr - pre-checked for NULL 0N/A}
/* end GetClassStatus */ 0N/A// k_mirror - may be primitive, this must be checked 0N/A// source_name_ptr - pre-checked for NULL 0N/A}
/* end GetSourceFileName */ 0N/A// k_mirror - may be primitive, this must be checked 0N/A// modifiers_ptr - pre-checked for NULL 0N/A // Reset the deleted ACC_SUPER bit ( deleted in compute_modifier_flags()). 0N/A}
/* end GetClassModifiers */ 0N/A// k_mirror - may be primitive, this must be checked 0N/A// method_count_ptr - pre-checked for NULL 0N/A// methods_ptr - pre-checked for NULL 0N/A // Return CLASS_NOT_PREPARED error as per JVMTI spec. 0N/A // Allocate the result and fill it in 0N/A // Use the original method ordering indices stored in the class, so we can emit 0N/A // jmethodIDs in the order they appeared in the class file 0N/A // otherwise just copy in any order 0N/A // Fill in return value. 0N/A}
/* end GetClassMethods */ 0N/A// k_mirror - may be primitive, this must be checked 0N/A// field_count_ptr - pre-checked for NULL 0N/A// fields_ptr - pre-checked for NULL 0N/A // Return CLASS_NOT_PREPARED error as per JVMTI spec. 0N/A // First, count the fields. 0N/A // Allocate the result and fill it in 0N/A // The JVMTI spec requires fields in the order they occur in the class file, 0N/A // this is the reverse order of what FieldStream hands out. 0N/A // Fill in the results 0N/A}
/* end GetClassFields */ 0N/A// k_mirror - may be primitive, this must be checked 0N/A// interface_count_ptr - pre-checked for NULL 0N/A// interfaces_ptr - pre-checked for NULL 0N/A // Return CLASS_NOT_PREPARED error as per JVMTI spec. 0N/A}
/* end GetImplementedInterfaces */ 0N/A// k_mirror - may be primitive, this must be checked 0N/A// minor_version_ptr - pre-checked for NULL 0N/A// major_version_ptr - pre-checked for NULL 0N/A}
/* end GetClassVersionNumbers */ 0N/A// k_mirror - may be primitive, this must be checked 0N/A// constant_pool_count_ptr - pre-checked for NULL 0N/A// constant_pool_byte_count_ptr - pre-checked for NULL 0N/A// constant_pool_bytes_ptr - pre-checked for NULL 0N/A}
/* end GetConstantPool */ 0N/A// k_mirror - may be primitive, this must be checked 0N/A// is_interface_ptr - pre-checked for NULL 0N/A}
/* end IsInterface */ 0N/A// k_mirror - may be primitive, this must be checked 0N/A// is_array_class_ptr - pre-checked for NULL 0N/A}
/* end IsArrayClass */ 0N/A// k_mirror - may be primitive, this must be checked 0N/A// classloader_ptr - pre-checked for NULL 0N/A}
/* end GetClassLoader */ 0N/A// k_mirror - may be primitive, this must be checked 0N/A// source_debug_extension_ptr - pre-checked for NULL 0N/A}
/* end GetSourceDebugExtension */ 0N/A// hash_code_ptr - pre-checked for NULL 0N/A}
/* end GetObjectHashCode */ 0N/A// info_ptr - pre-checked for NULL 0N/A // Some of the critical threads were not suspended. go to a safepoint and try again 0N/A}
/* end GetObjectMonitorUsage */ 0N/A// name_ptr - NULL is a valid value, must be checked 0N/A// signature_ptr - NULL is a valid value, must be checked 0N/A// generic_ptr - NULL is a valid value, must be checked 0N/A // just don't return the name 0N/A // just don't return the signature 0N/A}
/* end GetFieldName */ 0N/A// declaring_class_ptr - pre-checked for NULL 0N/A}
/* end GetFieldDeclaringClass */ 0N/A// modifiers_ptr - pre-checked for NULL 0N/A}
/* end GetFieldModifiers */ 0N/A// is_synthetic_ptr - pre-checked for NULL 0N/A}
/* end IsFieldSynthetic */ 0N/A// method_oop - pre-checked for validity, but may be NULL meaning obsolete method 0N/A// name_ptr - NULL is a valid value, must be checked 0N/A// signature_ptr - NULL is a valid value, must be checked 0N/A// generic_ptr - NULL is a valid value, must be checked 0N/A // just don't return the name 0N/A // just don't return the signature 0N/A}
/* end GetMethodName */ 0N/A// method_oop - pre-checked for validity, but may be NULL meaning obsolete method 0N/A// declaring_class_ptr - pre-checked for NULL 0N/A}
/* end GetMethodDeclaringClass */ 0N/A// method_oop - pre-checked for validity, but may be NULL meaning obsolete method 0N/A// modifiers_ptr - pre-checked for NULL 0N/A}
/* end GetMethodModifiers */ 0N/A// method_oop - pre-checked for validity, but may be NULL meaning obsolete method 0N/A// max_ptr - pre-checked for NULL 0N/A}
/* end GetMaxLocals */ 0N/A// method_oop - pre-checked for validity, but may be NULL meaning obsolete method 0N/A// size_ptr - pre-checked for NULL 0N/A // get size of arguments 0N/A}
/* end GetArgumentsSize */ 0N/A// method_oop - pre-checked for validity, but may be NULL meaning obsolete method 0N/A// entry_count_ptr - pre-checked for NULL 0N/A// table_ptr - pre-checked for NULL 0N/A // The line number table is compressed so we don't know how big it is until decompressed. 0N/A // Decompression is really fast so we just do it twice. 0N/A // Compute size of table 0N/A}
/* end GetLineNumberTable */ 0N/A// method_oop - pre-checked for validity, but may be NULL meaning obsolete method 0N/A// start_location_ptr - pre-checked for NULL 0N/A// end_location_ptr - pre-checked for NULL 0N/A // get start and end location 0N/A // there is no code so there is no start location 0N/A}
/* end GetMethodLocation */ 0N/A// method_oop - pre-checked for validity, but may be NULL meaning obsolete method 0N/A// entry_count_ptr - pre-checked for NULL 0N/A// table_ptr - pre-checked for NULL 0N/A // does the klass have any local variable information? 0N/A // in the vm localvariable table representation, 6 consecutive elements in the table 0N/A // represent a 6-tuple of shorts 0N/A // [start_pc, length, name_index, descriptor_index, signature_index, index] 0N/A // get the 5 tuple information from the vm table 0N/A // get utf8 name and signature 0N/A // fill in the jvmti local variable table 0N/A}
/* end GetLocalVariableTable */ 0N/A// method_oop - pre-checked for validity, but may be NULL meaning obsolete method 0N/A// bytecode_count_ptr - pre-checked for NULL 0N/A// bytecodes_ptr - pre-checked for NULL 0N/A}
/* end GetBytecodes */ 0N/A// method_oop - pre-checked for validity, but may be NULL meaning obsolete method 0N/A// is_native_ptr - pre-checked for NULL 0N/A}
/* end IsMethodNative */ 0N/A// method_oop - pre-checked for validity, but may be NULL meaning obsolete method 0N/A// is_synthetic_ptr - pre-checked for NULL 0N/A}
/* end IsMethodSynthetic */ 0N/A// method_oop - pre-checked for validity, but may be NULL meaning obsolete method 0N/A// is_obsolete_ptr - pre-checked for NULL 1121N/A // This JvmtiEnv requested version 1.0 semantics and this function 1121N/A // requires the can_redefine_classes capability in version 1.0 so 1121N/A // we need to return an error here. 0N/A}
/* end IsMethodObsolete */ 0N/A // Raw Monitor functions 0N/A// name - pre-checked for NULL 0N/A// monitor_ptr - pre-checked for NULL 0N/A}
/* end CreateRawMonitor */ 0N/A// rmonitor - pre-checked for validity 0N/A // Remove this monitor from pending raw monitors list 0N/A // if it has entered in onload or start phase. 0N/A // The caller owns this monitor which we are about to destroy. 0N/A // We exit the underlying synchronization object so that the 0N/A // "delete monitor" call below can work without an assertion 0N/A // failure on systems that don't like destroying synchronization 0N/A // objects that are locked. 0N/A // The caller is trying to destroy a monitor that is locked by 0N/A // someone else. While this is not forbidden by the JVMTI 0N/A // spec, it will cause an assertion failure on systems that don't 0N/A // like destroying synchronization objects that are locked. 0N/A // We indicate a problem with the error return (and leak the 0N/A // monitor's memory). 0N/A}
/* end DestroyRawMonitor */ 0N/A// rmonitor - pre-checked for validity 0N/A // No JavaThreads exist so ObjectMonitor enter cannot be 0N/A // used, add this raw monitor to the pending list. 0N/A // The pending monitors will be actually entered when 0N/A // See transition_pending_raw_monitors in create_vm() 0N/A // Not really unknown but ThreadInVMfromNative does more than we want 0N/A /* Transition to thread_blocked without entering vm state */ 0N/A /* This is really evil. Normally you can't undo _thread_blocked */ 0N/A /* transitions like this because it would cause us to miss a */ 0N/A /* safepoint but since the thread was already in _thread_in_native */ 0N/A /* the thread is not leaving a safepoint safe state and it will */ 0N/A /* block when it tries to return from native. We can't safepoint */ 0N/A /* block in here because we could deadlock the vmthread. Blech. */ 0N/A // frame should already be walkable since we are in native 0N/A // restore state, still at a safepoint safe state 0N/A#
endif /* PROPER_TRANSITIONS */ 0N/A}
/* end RawMonitorEnter */ 0N/A// rmonitor - pre-checked for validity 0N/A // No JavaThreads exist so just remove this monitor from the pending list. 0N/A // Bool value from exit is false if rmonitor is not in the list. 0N/A // Not really unknown but ThreadInVMfromNative does more than we want 0N/A#
endif /* PROPER_TRANSITIONS */ 0N/A}
/* end RawMonitorExit */ 0N/A// rmonitor - pre-checked for validity 0N/A // Not really unknown but ThreadInVMfromNative does more than we want 0N/A /* Transition to thread_blocked without entering vm state */ 0N/A /* This is really evil. Normally you can't undo _thread_blocked */ 0N/A /* transitions like this because it would cause us to miss a */ 0N/A /* safepoint but since the thread was already in _thread_in_native */ 0N/A /* the thread is not leaving a safepoint safe state and it will */ 0N/A /* block when it tries to return from native. We can't safepoint */ 0N/A /* block in here because we could deadlock the vmthread. Blech. */ 0N/A // frame should already be walkable since we are in native 0N/A // restore state, still at a safepoint safe state 0N/A#
endif /* PROPER_TRANSITIONS */ 0N/A}
/* end RawMonitorWait */ 0N/A// rmonitor - pre-checked for validity 0N/A // Not really unknown but ThreadInVMfromNative does more than we want 0N/A}
/* end RawMonitorNotify */ 0N/A// rmonitor - pre-checked for validity 0N/A}
/* end RawMonitorNotifyAll */ 0N/A // JNI Function Interception functions 0N/A// function_table - pre-checked for NULL 0N/A // Copy jni function table at safepoint. 0N/A}
/* end SetJNIFunctionTable */ 0N/A// function_table - pre-checked for NULL 0N/A}
/* end GetJNIFunctionTable */ 0N/A // Event Management functions 0N/A // can only generate two event types 0N/A // for compiled_method_load events we must check that the environment 0N/A // has the can_generate_compiled_method_load_events capability. 0N/A}
/* end GenerateEvents */ 0N/A // Extension Mechanism functions 0N/A// extension_count_ptr - pre-checked for NULL 0N/A// extensions - pre-checked for NULL 0N/A}
/* end GetExtensionFunctions */ 0N/A// extension_count_ptr - pre-checked for NULL 0N/A// extensions - pre-checked for NULL 0N/A}
/* end GetExtensionEvents */ 0N/A// callback - NULL is a valid value, must be checked 0N/A}
/* end SetExtensionEventCallback */ 0N/A// info_ptr - pre-checked for NULL 0N/A}
/* end GetCurrentThreadCpuTimerInfo */ 0N/A// nanos_ptr - pre-checked for NULL 0N/A}
/* end GetCurrentThreadCpuTime */ 0N/A// info_ptr - pre-checked for NULL 0N/A}
/* end GetThreadCpuTimerInfo */ 0N/A// Threads_lock NOT held, java_thread not protected by lock 0N/A// java_thread - pre-checked 0N/A// nanos_ptr - pre-checked for NULL 0N/A}
/* end GetThreadCpuTime */ 0N/A// info_ptr - pre-checked for NULL 0N/A}
/* end GetTimerInfo */ 0N/A// nanos_ptr - pre-checked for NULL 0N/A// processor_count_ptr - pre-checked for NULL 0N/A}
/* end GetAvailableProcessors */ 0N/A // System Properties functions 0N/A// count_ptr - pre-checked for NULL 0N/A// property_ptr - pre-checked for NULL 0N/A // clean up previously allocated memory. 0N/A for (
int j=0; j<i; j++) {
0N/A}
/* end GetSystemProperties */ 0N/A// property - pre-checked for NULL 0N/A// value_ptr - pre-checked for NULL 0N/A}
/* end GetSystemProperty */ 0N/A// property - pre-checked for NULL 0N/A// value - NULL is a valid value, must be checked 0N/A}
/* end SetSystemProperty */ 0N/A#
endif // !JVMTI_KERNEL