Commit 224aaa41 by Tom Tromey Committed by Tom Tromey

jvmti.cc (REQUIRE_PHASE): New macro.

	* jvmti.cc (REQUIRE_PHASE): New macro.
	(_Jv_JVMTI_InterruptThread): New function.
	(_Jv_JVMTI_CreateRawMonitor): Likewise.
	(_Jv_JVMTI_DestroyRawMonitor): Likewise.
	(_Jv_JVMTI_RawMonitorEnter): Likewise.
	(_Jv_JVMTI_RawMonitorExit): Likewise.
	(_Jv_JVMTI_RawMonitorWait): Likewise.
	(_Jv_JVMTI_RawMonitorNotify): Likewise.
	(_Jv_JVMTI_RawMonitorNotifyAll): Likewise.
	(_Jv_JVMTI_Allocate): Likewise.
	(_Jv_JVMTI_Deallocate): Likewise.
	(_Jv_JVMTI_GetClassModifiers): Likewise.
	(_Jv_JVMTI_GetClassMethods): Likewise.
	(_Jv_JVMTI_IsInterface): Likewise.
	(_Jv_JVMTI_IsArrayClass): Likewise.
	(_Jv_JVMTI_GetClassLoader): Likewise.
	(_Jv_JVMTI_GetObjectHashCode): Likewise.
	(_Jv_JVMTI_GetFieldModifiers): Likewise.
	(_Jv_JVMTI_IsFieldSynthetic): Likewise.
	(_Jv_JVMTI_GetMethodModifiers): Likewise.
	(_Jv_JVMTI_IsMethodNative): Likewise.
	(_Jv_JVMTI_IsMethodSynthetic): Likewise.
	(_Jv_JVMTI_GetClassLoaderClasses): Likewise.
	(_Jv_JVMTI_ForceGarbageCollection): Likewise.
	(_Jv_JVMTI_GetSystemProperty): Likewise.
	(_Jv_JVMTI_SetSystemProperty): Likewise.
	(_Jv_JVMTI_GetTime): Likewise.
	(_Jv_JVMTI_GetAvailableProcessors): Likewise.
	(_Jv_JVMTI_AddToBootstrapClassLoaderSearch): Likewise.
	(_Jv_JVMTI_SetVerboseFlag): Likewise.
	(_Jv_JVMTI_GetObjectSize): Likewise.
	(_Jv_JVMTI_SetJNIFunctionTable): Likewise.
	(_Jv_JVMTI_GetJNIFunctionTable): Likewise.
	(_Jv_JVMTI_Interface): Updated.
	(NULL_CHECK): New macro.

From-SVN: r115907
parent 00643d1c
2006-08-03 Tom Tromey <tromey@redhat.com>
* jvmti.cc (REQUIRE_PHASE): New macro.
(_Jv_JVMTI_InterruptThread): New function.
(_Jv_JVMTI_CreateRawMonitor): Likewise.
(_Jv_JVMTI_DestroyRawMonitor): Likewise.
(_Jv_JVMTI_RawMonitorEnter): Likewise.
(_Jv_JVMTI_RawMonitorExit): Likewise.
(_Jv_JVMTI_RawMonitorWait): Likewise.
(_Jv_JVMTI_RawMonitorNotify): Likewise.
(_Jv_JVMTI_RawMonitorNotifyAll): Likewise.
(_Jv_JVMTI_Allocate): Likewise.
(_Jv_JVMTI_Deallocate): Likewise.
(_Jv_JVMTI_GetClassModifiers): Likewise.
(_Jv_JVMTI_GetClassMethods): Likewise.
(_Jv_JVMTI_IsInterface): Likewise.
(_Jv_JVMTI_IsArrayClass): Likewise.
(_Jv_JVMTI_GetClassLoader): Likewise.
(_Jv_JVMTI_GetObjectHashCode): Likewise.
(_Jv_JVMTI_GetFieldModifiers): Likewise.
(_Jv_JVMTI_IsFieldSynthetic): Likewise.
(_Jv_JVMTI_GetMethodModifiers): Likewise.
(_Jv_JVMTI_IsMethodNative): Likewise.
(_Jv_JVMTI_IsMethodSynthetic): Likewise.
(_Jv_JVMTI_GetClassLoaderClasses): Likewise.
(_Jv_JVMTI_ForceGarbageCollection): Likewise.
(_Jv_JVMTI_GetSystemProperty): Likewise.
(_Jv_JVMTI_SetSystemProperty): Likewise.
(_Jv_JVMTI_GetTime): Likewise.
(_Jv_JVMTI_GetAvailableProcessors): Likewise.
(_Jv_JVMTI_AddToBootstrapClassLoaderSearch): Likewise.
(_Jv_JVMTI_SetVerboseFlag): Likewise.
(_Jv_JVMTI_GetObjectSize): Likewise.
(_Jv_JVMTI_SetJNIFunctionTable): Likewise.
(_Jv_JVMTI_GetJNIFunctionTable): Likewise.
(_Jv_JVMTI_Interface): Updated.
(NULL_CHECK): New macro.
2006-08-02 Andreas Tobler <a.tobler@schweiz.ch> 2006-08-02 Andreas Tobler <a.tobler@schweiz.ch>
PR libgcj/28546 PR libgcj/28546
......
...@@ -9,13 +9,33 @@ Libgcj License. Please consult the file "LIBGCJ_LICENSE" for ...@@ -9,13 +9,33 @@ Libgcj License. Please consult the file "LIBGCJ_LICENSE" for
details. */ details. */
#include <config.h> #include <config.h>
#include <platform.h>
#include <jvm.h> #include <jvm.h>
#include <java-threads.h> #include <java-threads.h>
#include <java-gc.h> #include <java-gc.h>
#include <jvmti.h> #include <jvmti.h>
#include <gnu/classpath/SystemProperties.h>
#include <gnu/gcj/runtime/BootClassLoader.h>
#include <java/lang/Class.h>
#include <java/lang/ClassLoader.h>
#include <java/lang/Thread.h> #include <java/lang/Thread.h>
#include <java/lang/Throwable.h>
#include <java/lang/VMClassLoader.h>
#include <java/lang/reflect/Field.h>
#include <java/lang/reflect/Modifier.h>
#include <java/util/Collection.h>
#include <java/util/HashMap.h>
#include <java/net/URL.h>
extern struct JNINativeInterface _Jv_JNIFunctions;
struct _Jv_rawMonitorID
{
_Jv_Mutex_t mutex;
_Jv_ConditionVariable_t condition;
};
// Some commonly-used checks // Some commonly-used checks
...@@ -29,6 +49,13 @@ details. */ ...@@ -29,6 +49,13 @@ details. */
#define THREAD_CHECK_IS_ALIVE(thread) \ #define THREAD_CHECK_IS_ALIVE(thread) \
if (!thread->isAlive ()) return JVMTI_ERROR_THREAD_NOT_ALIVE; if (!thread->isAlive ()) return JVMTI_ERROR_THREAD_NOT_ALIVE;
// FIXME: if current phase is not set in Phases,
// return JVMTI_ERROR_WRONG_PHASE
#define REQUIRE_PHASE(Env, Phases)
#define NULL_CHECK(Ptr) \
if (Ptr == NULL) return JVMTI_ERROR_NULL_POINTER;
static jvmtiError JNICALL static jvmtiError JNICALL
_Jv_JVMTI_SuspendThread (MAYBE_UNUSED jvmtiEnv *env, jthread thread) _Jv_JVMTI_SuspendThread (MAYBE_UNUSED jvmtiEnv *env, jthread thread)
{ {
...@@ -61,8 +88,340 @@ _Jv_JVMTI_ResumeThread (MAYBE_UNUSED jvmtiEnv *env, jthread thread) ...@@ -61,8 +88,340 @@ _Jv_JVMTI_ResumeThread (MAYBE_UNUSED jvmtiEnv *env, jthread thread)
return JVMTI_ERROR_NONE; return JVMTI_ERROR_NONE;
} }
#define RESERVED NULL static jvmtiError JNICALL
#define UNIMPLEMENTED NULL _Jv_JVMTI_InterruptThread (MAYBE_UNUSED jvmtiEnv *env, jthread thread)
{
using namespace java::lang;
REQUIRE_PHASE (env, JVMTI_PHASE_LIVE);
// FIXME: capability handling? 'can_signal_thread'
if (thread == NULL)
return JVMTI_ERROR_INVALID_THREAD;
THREAD_CHECK_VALID (thread);
Thread *real_thread = reinterpret_cast<Thread *> (thread);
THREAD_CHECK_IS_ALIVE (real_thread);
real_thread->interrupt();
return JVMTI_ERROR_NONE;
}
static jvmtiError JNICALL
_Jv_JVMTI_CreateRawMonitor (MAYBE_UNUSED jvmtiEnv *env, const char *name,
jrawMonitorID *result)
{
REQUIRE_PHASE (env, JVMTI_PHASE_ONLOAD | JVMTI_PHASE_LIVE);
NULL_CHECK (name);
NULL_CHECK (result);
*result = (jrawMonitorID) _Jv_Malloc (sizeof (_Jv_rawMonitorID));
_Jv_MutexInit (&(*result)->mutex);
_Jv_CondInit (&(*result)->condition);
return JVMTI_ERROR_NONE;
}
static jvmtiError JNICALL
_Jv_JVMTI_DestroyRawMonitor (MAYBE_UNUSED jvmtiEnv *env, jrawMonitorID monitor)
{
REQUIRE_PHASE (env, JVMTI_PHASE_ONLOAD | JVMTI_PHASE_LIVE);
// Note we have no better way of knowing whether this object is
// really a raw monitor.
if (monitor == NULL)
return JVMTI_ERROR_INVALID_MONITOR;
// FIXME: perform checks on monitor, release it if this thread owns
// it.
#ifdef _Jv_HaveMutexDestroy
_Jv_MutexDestroy (&monitor->mutex);
#endif
_Jv_Free (monitor);
return JVMTI_ERROR_NONE;
}
static jvmtiError JNICALL
_Jv_JVMTI_RawMonitorEnter (MAYBE_UNUSED jvmtiEnv *env, jrawMonitorID monitor)
{
if (monitor == NULL)
return JVMTI_ERROR_INVALID_MONITOR;
_Jv_MutexLock (&monitor->mutex);
return JVMTI_ERROR_NONE;
}
static jvmtiError JNICALL
_Jv_JVMTI_RawMonitorExit (MAYBE_UNUSED jvmtiEnv *env, jrawMonitorID monitor)
{
if (monitor == NULL)
return JVMTI_ERROR_INVALID_MONITOR;
if (_Jv_MutexUnlock (&monitor->mutex))
return JVMTI_ERROR_NOT_MONITOR_OWNER;
return JVMTI_ERROR_NONE;
}
static jvmtiError JNICALL
_Jv_JVMTI_RawMonitorWait (MAYBE_UNUSED jvmtiEnv *env, jrawMonitorID monitor)
{
if (monitor == NULL)
return JVMTI_ERROR_INVALID_MONITOR;
int r = _Jv_CondWait (&monitor->condition, &monitor->mutex, 0, 0);
if (r == _JV_NOT_OWNER)
return JVMTI_ERROR_NOT_MONITOR_OWNER;
if (r == _JV_INTERRUPTED)
return JVMTI_ERROR_INTERRUPT;
return JVMTI_ERROR_NONE;
}
static jvmtiError JNICALL
_Jv_JVMTI_RawMonitorNotify (MAYBE_UNUSED jvmtiEnv *env, jrawMonitorID monitor)
{
if (monitor == NULL)
return JVMTI_ERROR_INVALID_MONITOR;
if (_Jv_CondNotify (&monitor->condition, &monitor->mutex) == _JV_NOT_OWNER)
return JVMTI_ERROR_NOT_MONITOR_OWNER;
return JVMTI_ERROR_NONE;
}
static jvmtiError JNICALL
_Jv_JVMTI_RawMonitorNotifyAll (MAYBE_UNUSED jvmtiEnv *env,
jrawMonitorID monitor)
{
if (monitor == NULL)
return JVMTI_ERROR_INVALID_MONITOR;
if (_Jv_CondNotifyAll (&monitor->condition, &monitor->mutex)
== _JV_NOT_OWNER)
return JVMTI_ERROR_NOT_MONITOR_OWNER;
return JVMTI_ERROR_NONE;
}
static jvmtiError JNICALL
_Jv_JVMTI_Allocate (MAYBE_UNUSED jvmtiEnv *env, jlong size,
unsigned char **result)
{
if (size < 0)
return JVMTI_ERROR_ILLEGAL_ARGUMENT;
NULL_CHECK (result);
if (size == 0)
*result = NULL;
else
{
*result = (unsigned char *) _Jv_MallocUnchecked (size);
if (*result == NULL)
return JVMTI_ERROR_OUT_OF_MEMORY;
}
return JVMTI_ERROR_NONE;
}
static jvmtiError JNICALL
_Jv_JVMTI_Deallocate (MAYBE_UNUSED jvmtiEnv *env, unsigned char *mem)
{
if (mem != NULL)
_Jv_Free (mem);
return JVMTI_ERROR_NONE;
}
static jvmtiError JNICALL
_Jv_JVMTI_GetClassModifiers (jvmtiEnv *env, jclass klass, jint *mods)
{
REQUIRE_PHASE (env, JVMTI_PHASE_START | JVMTI_PHASE_LIVE);
// Don't bother checking KLASS' type.
if (klass == NULL)
return JVMTI_ERROR_INVALID_CLASS;
NULL_CHECK (mods);
*mods = klass->getModifiers();
return JVMTI_ERROR_NONE;
}
static jvmtiError JNICALL
_Jv_JVMTI_GetClassMethods (jvmtiEnv *env, jclass klass, jint *count_ptr,
jmethodID **methods_ptr)
{
REQUIRE_PHASE (env, JVMTI_PHASE_START | JVMTI_PHASE_LIVE);
// FIXME: capability can_maintain_original_method_order
// Don't bother checking KLASS' type.
if (klass == NULL)
return JVMTI_ERROR_INVALID_CLASS;
NULL_CHECK (count_ptr);
NULL_CHECK (methods_ptr);
*count_ptr = JvNumMethods(klass);
*methods_ptr = (jmethodID *) _Jv_Malloc (*count_ptr * sizeof (jmethodID));
jmethodID start = JvGetFirstMethod (klass);
for (jint i = 0; i < *count_ptr; ++i)
// FIXME: correct?
(*methods_ptr)[i] = start + i;
return JVMTI_ERROR_NONE;
}
static jvmtiError JNICALL
_Jv_JVMTI_IsInterface (jvmtiEnv *env, jclass klass, jboolean *result)
{
REQUIRE_PHASE (env, JVMTI_PHASE_START | JVMTI_PHASE_LIVE);
if (klass == NULL)
return JVMTI_ERROR_INVALID_CLASS;
NULL_CHECK (result);
*result = klass->isInterface();
return JVMTI_ERROR_NONE;
}
static jvmtiError JNICALL
_Jv_JVMTI_IsArrayClass (jvmtiEnv *env, jclass klass, jboolean *result)
{
REQUIRE_PHASE (env, JVMTI_PHASE_START | JVMTI_PHASE_LIVE);
if (klass == NULL)
return JVMTI_ERROR_INVALID_CLASS;
NULL_CHECK (result);
*result = klass->isArray();
return JVMTI_ERROR_NONE;
}
static jvmtiError JNICALL
_Jv_JVMTI_GetClassLoader (jvmtiEnv *env, jclass klass, jobject *result)
{
REQUIRE_PHASE (env, JVMTI_PHASE_START | JVMTI_PHASE_LIVE);
if (klass == NULL)
return JVMTI_ERROR_INVALID_CLASS;
NULL_CHECK (result);
*result = klass->getClassLoaderInternal();
return JVMTI_ERROR_NONE;
}
static jvmtiError JNICALL
_Jv_JVMTI_GetObjectHashCode (jvmtiEnv *env, jobject obj, jint *result)
{
REQUIRE_PHASE (env, JVMTI_PHASE_START | JVMTI_PHASE_LIVE);
if (obj == NULL)
return JVMTI_ERROR_INVALID_OBJECT;
NULL_CHECK (result);
*result = _Jv_HashCode (obj);
return JVMTI_ERROR_NONE;
}
static jvmtiError JNICALL
_Jv_JVMTI_GetFieldModifiers (jvmtiEnv *env, jclass klass, jfieldID field,
jint *result)
{
REQUIRE_PHASE (env, JVMTI_PHASE_START | JVMTI_PHASE_LIVE);
if (klass == NULL)
return JVMTI_ERROR_INVALID_CLASS;
if (field == NULL)
return JVMTI_ERROR_INVALID_FIELDID;
NULL_CHECK (result);
*result = field->getModifiers();
return JVMTI_ERROR_NONE;
}
static jvmtiError JNICALL
_Jv_JVMTI_IsFieldSynthetic (jvmtiEnv *env, jclass klass, jfieldID field,
jboolean *result)
{
REQUIRE_PHASE (env, JVMTI_PHASE_START | JVMTI_PHASE_LIVE);
if (klass == NULL)
return JVMTI_ERROR_INVALID_CLASS;
if (field == NULL)
return JVMTI_ERROR_INVALID_FIELDID;
NULL_CHECK (result);
// FIXME: capability can_get_synthetic_attribute
*result = ((field->getModifiers() & java::lang::reflect::Modifier::SYNTHETIC)
!= 0);
return JVMTI_ERROR_NONE;
}
static jvmtiError JNICALL
_Jv_JVMTI_GetMethodModifiers (jvmtiEnv *env, jmethodID method, jint *result)
{
REQUIRE_PHASE (env, JVMTI_PHASE_START | JVMTI_PHASE_LIVE);
if (method == NULL)
return JVMTI_ERROR_INVALID_METHODID;
NULL_CHECK (result);
// FIXME: mask off some internal bits...
*result = method->accflags;
return JVMTI_ERROR_NONE;
}
static jvmtiError JNICALL
_Jv_JVMTI_IsMethodNative (jvmtiEnv *env, jmethodID method, jboolean *result)
{
REQUIRE_PHASE (env, JVMTI_PHASE_START | JVMTI_PHASE_LIVE);
if (method == NULL)
return JVMTI_ERROR_INVALID_METHODID;
NULL_CHECK (result);
*result = ((method->accflags & java::lang::reflect::Modifier::NATIVE) != 0);
return JVMTI_ERROR_NONE;
}
static jvmtiError JNICALL
_Jv_JVMTI_IsMethodSynthetic (jvmtiEnv *env, jmethodID method, jboolean *result)
{
REQUIRE_PHASE (env, JVMTI_PHASE_START | JVMTI_PHASE_LIVE);
if (method == NULL)
return JVMTI_ERROR_INVALID_METHODID;
NULL_CHECK (result);
// FIXME capability can_get_synthetic_attribute
*result = ((method->accflags & java::lang::reflect::Modifier::SYNTHETIC)
!= 0);
return JVMTI_ERROR_NONE;
}
static jvmtiError JNICALL
_Jv_JVMTI_GetClassLoaderClasses (jvmtiEnv *env,
jobject init_loader,
jint *count_ptr,
jclass **result_ptr)
{
using namespace java::lang;
using namespace java::util;
REQUIRE_PHASE (env, JVMTI_PHASE_LIVE);
NULL_CHECK (count_ptr);
NULL_CHECK (result_ptr);
ClassLoader *loader = (ClassLoader *) init_loader;
if (loader == NULL)
loader = VMClassLoader::bootLoader;
Collection *values = loader->loadedClasses->values();
jobjectArray array = values->toArray();
*count_ptr = array->length;
jobject *elts = elements (array);
jclass *result = (jclass *) _Jv_Malloc (*count_ptr * sizeof (jclass));
// FIXME: JNI references...
memcpy (result, elts, *count_ptr * sizeof (jclass));
*result_ptr = result;
return JVMTI_ERROR_NONE;
}
static jvmtiError JNICALL
_Jv_JVMTI_ForceGarbageCollection (jvmtiEnv *env)
{
REQUIRE_PHASE (env, JVMTI_PHASE_LIVE);
_Jv_RunGC();
return JVMTI_ERROR_NONE;
}
static jvmtiError JNICALL
_Jv_JVMTI_SetJNIFunctionTable (jvmtiEnv *env,
const jniNativeInterface *function_table)
{
REQUIRE_PHASE (env, JVMTI_PHASE_START | JVMTI_PHASE_LIVE);
NULL_CHECK (function_table);
memcpy (&_Jv_JNIFunctions, function_table, sizeof (jniNativeInterface));
return JVMTI_ERROR_NONE;
}
static jvmtiError JNICALL
_Jv_JVMTI_GetJNIFunctionTable (jvmtiEnv *env,
jniNativeInterface **function_table)
{
REQUIRE_PHASE (env, JVMTI_PHASE_START | JVMTI_PHASE_LIVE);
NULL_CHECK (function_table);
*function_table
= (jniNativeInterface *) _Jv_Malloc (sizeof (jniNativeInterface));
memcpy (*function_table, &_Jv_JNIFunctions, sizeof (jniNativeInterface));
return JVMTI_ERROR_NONE;
}
static jvmtiError JNICALL static jvmtiError JNICALL
_Jv_JVMTI_DisposeEnvironment (jvmtiEnv *env) _Jv_JVMTI_DisposeEnvironment (jvmtiEnv *env)
...@@ -72,6 +431,148 @@ _Jv_JVMTI_DisposeEnvironment (jvmtiEnv *env) ...@@ -72,6 +431,148 @@ _Jv_JVMTI_DisposeEnvironment (jvmtiEnv *env)
return JVMTI_ERROR_NONE; return JVMTI_ERROR_NONE;
} }
static jvmtiError JNICALL
_Jv_JVMTI_GetSystemProperty (jvmtiEnv *env, const char *property,
char **result)
{
REQUIRE_PHASE (env, JVMTI_PHASE_ONLOAD | JVMTI_PHASE_LIVE);
NULL_CHECK (property);
NULL_CHECK (result);
jstring name = JvNewStringUTF(property);
jstring result_str = gnu::classpath::SystemProperties::getProperty(name);
if (result_str == NULL)
return JVMTI_ERROR_NOT_AVAILABLE;
int len = JvGetStringUTFLength (result_str);
*result = (char *) _Jv_Malloc (len + 1);
JvGetStringUTFRegion (result_str, 0, result_str->length(), *result);
(*result)[len] = '\0';
return JVMTI_ERROR_NONE;
}
static jvmtiError JNICALL
_Jv_JVMTI_SetSystemProperty (jvmtiEnv *env, const char *property,
const char *value)
{
REQUIRE_PHASE (env, JVMTI_PHASE_ONLOAD);
NULL_CHECK (property);
if (value == NULL)
{
// FIXME: When would a property not be writeable?
return JVMTI_ERROR_NONE;
}
jstring prop_str = JvNewStringUTF(property);
jstring value_str = JvNewStringUTF(value);
gnu::classpath::SystemProperties::setProperty(prop_str, value_str);
return JVMTI_ERROR_NONE;
}
static jvmtiError JNICALL
_Jv_JVMTI_GetTime (MAYBE_UNUSED jvmtiEnv *env, jlong *nanos_ptr)
{
NULL_CHECK (nanos_ptr);
*nanos_ptr = _Jv_platform_nanotime();
return JVMTI_ERROR_NONE;
}
static jvmtiError JNICALL
_Jv_JVMTI_GetAvailableProcessors (MAYBE_UNUSED jvmtiEnv *env,
jint *nprocessors_ptr)
{
NULL_CHECK (nprocessors_ptr);
#ifdef _SC_NPROCESSORS_ONLN
*nprocessors_ptr = sysconf(_SC_NPROCESSORS_ONLN);
#else
*nprocessors_ptr = 1;
#endif
return JVMTI_ERROR_NONE;
}
static jvmtiError JNICALL
_Jv_JVMTI_AddToBootstrapClassLoaderSearch (jvmtiEnv *env, const char *segment)
{
using namespace java::lang;
using namespace java::net;
using namespace gnu::gcj::runtime;
REQUIRE_PHASE (env, JVMTI_PHASE_ONLOAD);
NULL_CHECK (segment);
jstring str_segment = JvNewStringUTF(segment);
URL *url;
try
{
url = new URL(JvNewStringUTF("file"), NULL, str_segment);
}
catch (jthrowable ignore)
{
return JVMTI_ERROR_ILLEGAL_ARGUMENT;
}
BootClassLoader *loader = VMClassLoader::bootLoader;
// Don't call this too early.
// assert (loader != NULL);
loader->addURL(url);
return JVMTI_ERROR_NONE;
}
static jvmtiError JNICALL
_Jv_JVMTI_SetVerboseFlag (MAYBE_UNUSED jvmtiEnv *env, jvmtiVerboseFlag flag,
jboolean value)
{
switch (flag)
{
case JVMTI_VERBOSE_OTHER:
case JVMTI_VERBOSE_GC:
case JVMTI_VERBOSE_JNI:
// Ignore.
break;
case JVMTI_VERBOSE_CLASS:
gcj::verbose_class_flag = value;
break;
default:
return JVMTI_ERROR_ILLEGAL_ARGUMENT;
}
return JVMTI_ERROR_NONE;
}
static jvmtiError JNICALL
_Jv_JVMTI_GetObjectSize (jvmtiEnv *env, jobject object, jlong *result)
{
REQUIRE_PHASE (env, JVMTI_PHASE_START | JVMTI_PHASE_LIVE);
if (object == NULL)
return JVMTI_ERROR_INVALID_OBJECT;
NULL_CHECK (result);
jclass klass = object->getClass();
if (klass->isArray())
{
jclass comp = klass->getComponentType();
jint base
= (jint) _Jv_GetArrayElementFromElementType(NULL,
klass->getComponentType());
// FIXME: correct for primitive types?
jint compSize = comp->size();
__JArray *array = (__JArray *) object;
*result = base + array->length * compSize;
}
else
{
// Note that if OBJECT is a String then it may (if
// str->data==str) take more space. Do we care?
*result = klass->size();
}
return JVMTI_ERROR_NONE;
}
#define RESERVED NULL
#define UNIMPLEMENTED NULL
struct _Jv_jvmtiEnv _Jv_JVMTI_Interface = struct _Jv_jvmtiEnv _Jv_JVMTI_Interface =
{ {
RESERVED, // reserved1 RESERVED, // reserved1
...@@ -81,7 +582,7 @@ struct _Jv_jvmtiEnv _Jv_JVMTI_Interface = ...@@ -81,7 +582,7 @@ struct _Jv_jvmtiEnv _Jv_JVMTI_Interface =
_Jv_JVMTI_SuspendThread, // SuspendThread _Jv_JVMTI_SuspendThread, // SuspendThread
_Jv_JVMTI_ResumeThread, // ResumeThread _Jv_JVMTI_ResumeThread, // ResumeThread
UNIMPLEMENTED, // StopThread UNIMPLEMENTED, // StopThread
UNIMPLEMENTED, // InterruptThread _Jv_JVMTI_InterruptThread, // InterruptThread
UNIMPLEMENTED, // GetThreadInfo UNIMPLEMENTED, // GetThreadInfo
UNIMPLEMENTED, // GetOwnedMonitorInfo UNIMPLEMENTED, // GetOwnedMonitorInfo
UNIMPLEMENTED, // GetCurrentContendedMonitor UNIMPLEMENTED, // GetCurrentContendedMonitor
...@@ -104,42 +605,42 @@ struct _Jv_jvmtiEnv _Jv_JVMTI_Interface = ...@@ -104,42 +605,42 @@ struct _Jv_jvmtiEnv _Jv_JVMTI_Interface =
UNIMPLEMENTED, // SetLocalLong UNIMPLEMENTED, // SetLocalLong
UNIMPLEMENTED, // SetLocalFloat UNIMPLEMENTED, // SetLocalFloat
UNIMPLEMENTED, // SetLocalDouble UNIMPLEMENTED, // SetLocalDouble
UNIMPLEMENTED, // CreateRawMonitor _Jv_JVMTI_CreateRawMonitor, // CreateRawMonitor
UNIMPLEMENTED, // DestroyRawMonitor _Jv_JVMTI_DestroyRawMonitor, // DestroyRawMonitor
UNIMPLEMENTED, // RawMonitorEnter _Jv_JVMTI_RawMonitorEnter, // RawMonitorEnter
UNIMPLEMENTED, // RawMonitorExit _Jv_JVMTI_RawMonitorExit, // RawMonitorExit
UNIMPLEMENTED, // RawMonitorWait _Jv_JVMTI_RawMonitorWait, // RawMonitorWait
UNIMPLEMENTED, // RawMonitorNotify _Jv_JVMTI_RawMonitorNotify, // RawMonitorNotify
UNIMPLEMENTED, // RawMonitorNotifyAll _Jv_JVMTI_RawMonitorNotifyAll, // RawMonitorNotifyAll
UNIMPLEMENTED, // SetBreakpoint UNIMPLEMENTED, // SetBreakpoint
UNIMPLEMENTED, // CleareBreakpoint UNIMPLEMENTED, // ClearBreakpoint
RESERVED, // reserved40 RESERVED, // reserved40
UNIMPLEMENTED, // SetFieldAccessWatch UNIMPLEMENTED, // SetFieldAccessWatch
UNIMPLEMENTED, // ClearFieldAccessWatch UNIMPLEMENTED, // ClearFieldAccessWatch
UNIMPLEMENTED, // SetFieldModificationWatch UNIMPLEMENTED, // SetFieldModificationWatch
UNIMPLEMENTED, // ClearFieldModificationWatch UNIMPLEMENTED, // ClearFieldModificationWatch
RESERVED, // reserved45 RESERVED, // reserved45
UNIMPLEMENTED, // Allocate _Jv_JVMTI_Allocate, // Allocate
UNIMPLEMENTED, // Deallocate _Jv_JVMTI_Deallocate, // Deallocate
UNIMPLEMENTED, // GetClassSignature UNIMPLEMENTED, // GetClassSignature
UNIMPLEMENTED, // GetClassStatus UNIMPLEMENTED, // GetClassStatus
UNIMPLEMENTED, // GetSourceFileName UNIMPLEMENTED, // GetSourceFileName
UNIMPLEMENTED, // GetClassModifiers _Jv_JVMTI_GetClassModifiers, // GetClassModifiers
UNIMPLEMENTED, // GetClassMethods _Jv_JVMTI_GetClassMethods, // GetClassMethods
UNIMPLEMENTED, // GetClassFields UNIMPLEMENTED, // GetClassFields
UNIMPLEMENTED, // GetImplementedInterfaces UNIMPLEMENTED, // GetImplementedInterfaces
UNIMPLEMENTED, // IsInterface _Jv_JVMTI_IsInterface, // IsInterface
UNIMPLEMENTED, // IsArrayClass _Jv_JVMTI_IsArrayClass, // IsArrayClass
UNIMPLEMENTED, // GetClassLoader _Jv_JVMTI_GetClassLoader, // GetClassLoader
UNIMPLEMENTED, // GetObjectHashCode _Jv_JVMTI_GetObjectHashCode, // GetObjectHashCode
UNIMPLEMENTED, // GetObjectMonitorUsage UNIMPLEMENTED, // GetObjectMonitorUsage
UNIMPLEMENTED, // GetFieldName UNIMPLEMENTED, // GetFieldName
UNIMPLEMENTED, // GetFieldDeclaringClass UNIMPLEMENTED, // GetFieldDeclaringClass
UNIMPLEMENTED, // GetFieldModifiers _Jv_JVMTI_GetFieldModifiers, // GetFieldModifiers
UNIMPLEMENTED, // IsFieldSynthetic _Jv_JVMTI_IsFieldSynthetic, // IsFieldSynthetic
UNIMPLEMENTED, // GetMethodName UNIMPLEMENTED, // GetMethodName
UNIMPLEMENTED, // GetMethodDeclaringClass UNIMPLEMENTED, // GetMethodDeclaringClass
UNIMPLEMENTED, // GetMethodModiifers _Jv_JVMTI_GetMethodModifiers, // GetMethodModifers
RESERVED, // reserved67 RESERVED, // reserved67
UNIMPLEMENTED, // GetMaxLocals UNIMPLEMENTED, // GetMaxLocals
UNIMPLEMENTED, // GetArgumentsSize UNIMPLEMENTED, // GetArgumentsSize
...@@ -149,10 +650,10 @@ struct _Jv_jvmtiEnv _Jv_JVMTI_Interface = ...@@ -149,10 +650,10 @@ struct _Jv_jvmtiEnv _Jv_JVMTI_Interface =
RESERVED, // reserved73 RESERVED, // reserved73
RESERVED, // reserved74 RESERVED, // reserved74
UNIMPLEMENTED, // GetBytecodes UNIMPLEMENTED, // GetBytecodes
UNIMPLEMENTED, // IsMethodNative _Jv_JVMTI_IsMethodNative, // IsMethodNative
UNIMPLEMENTED, // IsMethodSynthetic _Jv_JVMTI_IsMethodSynthetic, // IsMethodSynthetic
UNIMPLEMENTED, // GetLoadedClasses UNIMPLEMENTED, // GetLoadedClasses
UNIMPLEMENTED, // GetClassLoaderClasses _Jv_JVMTI_GetClassLoaderClasses, // GetClassLoaderClasses
UNIMPLEMENTED, // PopFrame UNIMPLEMENTED, // PopFrame
RESERVED, // reserved81 RESERVED, // reserved81
RESERVED, // reserved82 RESERVED, // reserved82
...@@ -181,7 +682,7 @@ struct _Jv_jvmtiEnv _Jv_JVMTI_Interface = ...@@ -181,7 +682,7 @@ struct _Jv_jvmtiEnv _Jv_JVMTI_Interface =
RESERVED, // reserved105 RESERVED, // reserved105
UNIMPLEMENTED, // GetTag UNIMPLEMENTED, // GetTag
UNIMPLEMENTED, // SetTag UNIMPLEMENTED, // SetTag
UNIMPLEMENTED, // ForceGarbageCollection _Jv_JVMTI_ForceGarbageCollection, // ForceGarbageCollection
UNIMPLEMENTED, // IterateOverObjectsReachable UNIMPLEMENTED, // IterateOverObjectsReachable
UNIMPLEMENTED, // IterateOverReachableObjects UNIMPLEMENTED, // IterateOverReachableObjects
UNIMPLEMENTED, // IterateOverHeap UNIMPLEMENTED, // IterateOverHeap
...@@ -193,8 +694,8 @@ struct _Jv_jvmtiEnv _Jv_JVMTI_Interface = ...@@ -193,8 +694,8 @@ struct _Jv_jvmtiEnv _Jv_JVMTI_Interface =
RESERVED, // reserved117 RESERVED, // reserved117
RESERVED, // reserved118 RESERVED, // reserved118
RESERVED, // reserved119 RESERVED, // reserved119
UNIMPLEMENTED, // SetJNIFunctionTable _Jv_JVMTI_SetJNIFunctionTable, // SetJNIFunctionTable
UNIMPLEMENTED, // GetJNIFunctionTable _Jv_JVMTI_GetJNIFunctionTable, // GetJNIFunctionTable
UNIMPLEMENTED, // SetEventCallbacks UNIMPLEMENTED, // SetEventCallbacks
UNIMPLEMENTED, // GenerateEvents UNIMPLEMENTED, // GenerateEvents
UNIMPLEMENTED, // GetExtensionFunctions UNIMPLEMENTED, // GetExtensionFunctions
...@@ -204,30 +705,30 @@ struct _Jv_jvmtiEnv _Jv_JVMTI_Interface = ...@@ -204,30 +705,30 @@ struct _Jv_jvmtiEnv _Jv_JVMTI_Interface =
UNIMPLEMENTED, // GetErrorName UNIMPLEMENTED, // GetErrorName
UNIMPLEMENTED, // GetJLocationFormat UNIMPLEMENTED, // GetJLocationFormat
UNIMPLEMENTED, // GetSystemProperties UNIMPLEMENTED, // GetSystemProperties
UNIMPLEMENTED, // GetSystemProperty _Jv_JVMTI_GetSystemProperty, // GetSystemProperty
UNIMPLEMENTED, // SetSystemProperty _Jv_JVMTI_SetSystemProperty, // SetSystemProperty
UNIMPLEMENTED, // GetPhase UNIMPLEMENTED, // GetPhase
UNIMPLEMENTED, // GetCurrentThreadCpuTimerInfo UNIMPLEMENTED, // GetCurrentThreadCpuTimerInfo
UNIMPLEMENTED, // GetCurrentThreadCpuTime UNIMPLEMENTED, // GetCurrentThreadCpuTime
UNIMPLEMENTED, // GetThreadCpuTimerInfo UNIMPLEMENTED, // GetThreadCpuTimerInfo
UNIMPLEMENTED, // GetThreadCpuTime UNIMPLEMENTED, // GetThreadCpuTime
UNIMPLEMENTED, // GetTimerInfo UNIMPLEMENTED, // GetTimerInfo
UNIMPLEMENTED, // GetTime _Jv_JVMTI_GetTime, // GetTime
UNIMPLEMENTED, // GetPotentialCapabilities UNIMPLEMENTED, // GetPotentialCapabilities
RESERVED, // reserved141 RESERVED, // reserved141
UNIMPLEMENTED, // AddCapabilities UNIMPLEMENTED, // AddCapabilities
UNIMPLEMENTED, // RelinquishCapabilities UNIMPLEMENTED, // RelinquishCapabilities
UNIMPLEMENTED, // GetAvailableProcessors _Jv_JVMTI_GetAvailableProcessors, // GetAvailableProcessors
RESERVED, // reserved145 RESERVED, // reserved145
RESERVED, // reserved146 RESERVED, // reserved146
UNIMPLEMENTED, // GetEnvironmentLocalStorage UNIMPLEMENTED, // GetEnvironmentLocalStorage
UNIMPLEMENTED, // SetEnvironmentLocalStorage UNIMPLEMENTED, // SetEnvironmentLocalStorage
UNIMPLEMENTED, // AddToBootstrapClassLoaderSearch _Jv_JVMTI_AddToBootstrapClassLoaderSearch, // AddToBootstrapClassLoaderSearch
UNIMPLEMENTED, // SetVerboseFlag _Jv_JVMTI_SetVerboseFlag, // SetVerboseFlag
RESERVED, // reserved151 RESERVED, // reserved151
RESERVED, // reserved152 RESERVED, // reserved152
RESERVED, // reserved153 RESERVED, // reserved153
UNIMPLEMENTED // GetObjectSize _Jv_JVMTI_GetObjectSize // GetObjectSize
}; };
_Jv_JVMTIEnv * _Jv_JVMTIEnv *
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment