6849968: 3/2 JVMTI tests fails on jdk5.0 with hs14
If a JVMTI agent asks for version 1.0, then it should get version 1.0 semantics. Reviewed-by: dholmes, ohair
This commit is contained in:
parent
8dd1b6ace1
commit
ce78944539
@ -32,15 +32,15 @@
|
||||
// FIXLATER: hook into JvmtiTrace
|
||||
#define TraceJVMTICalls false
|
||||
|
||||
JvmtiEnv::JvmtiEnv() : JvmtiEnvBase() {
|
||||
JvmtiEnv::JvmtiEnv(jint version) : JvmtiEnvBase(version) {
|
||||
}
|
||||
|
||||
JvmtiEnv::~JvmtiEnv() {
|
||||
}
|
||||
|
||||
JvmtiEnv*
|
||||
JvmtiEnv::create_a_jvmti() {
|
||||
return new JvmtiEnv();
|
||||
JvmtiEnv::create_a_jvmti(jint version) {
|
||||
return new JvmtiEnv(version);
|
||||
}
|
||||
|
||||
// VM operation class to copy jni function table at safepoint.
|
||||
@ -408,6 +408,11 @@ JvmtiEnv::AddToBootstrapClassLoaderSearch(const char* segment) {
|
||||
if (phase == JVMTI_PHASE_ONLOAD) {
|
||||
Arguments::append_sysclasspath(segment);
|
||||
return JVMTI_ERROR_NONE;
|
||||
} else if (use_version_1_0_semantics()) {
|
||||
// This JvmtiEnv requested version 1.0 semantics and this function
|
||||
// is only allowed in the ONLOAD phase in version 1.0 so we need to
|
||||
// return an error here.
|
||||
return JVMTI_ERROR_WRONG_PHASE;
|
||||
} else if (phase == JVMTI_PHASE_LIVE) {
|
||||
// The phase is checked by the wrapper that called this function,
|
||||
// but this thread could be racing with the thread that is
|
||||
@ -2857,6 +2862,14 @@ JvmtiEnv::IsMethodSynthetic(methodOop method_oop, jboolean* is_synthetic_ptr) {
|
||||
// is_obsolete_ptr - pre-checked for NULL
|
||||
jvmtiError
|
||||
JvmtiEnv::IsMethodObsolete(methodOop method_oop, jboolean* is_obsolete_ptr) {
|
||||
if (use_version_1_0_semantics() &&
|
||||
get_capabilities()->can_redefine_classes == 0) {
|
||||
// This JvmtiEnv requested version 1.0 semantics and this function
|
||||
// requires the can_redefine_classes capability in version 1.0 so
|
||||
// we need to return an error here.
|
||||
return JVMTI_ERROR_MUST_POSSESS_CAPABILITY;
|
||||
}
|
||||
|
||||
if (method_oop == NULL || method_oop->is_obsolete()) {
|
||||
*is_obsolete_ptr = true;
|
||||
} else {
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2003-2008 Sun Microsystems, Inc. All Rights Reserved.
|
||||
* Copyright 2003-2009 Sun Microsystems, Inc. All Rights Reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -94,7 +94,26 @@ JvmtiEnvBase::initialize() {
|
||||
}
|
||||
|
||||
|
||||
JvmtiEnvBase::JvmtiEnvBase() : _env_event_enable() {
|
||||
bool
|
||||
JvmtiEnvBase::use_version_1_0_semantics() {
|
||||
int major, minor, micro;
|
||||
|
||||
JvmtiExport::decode_version_values(_version, &major, &minor, µ);
|
||||
return major == 1 && minor == 0; // micro version doesn't matter here
|
||||
}
|
||||
|
||||
|
||||
bool
|
||||
JvmtiEnvBase::use_version_1_1_semantics() {
|
||||
int major, minor, micro;
|
||||
|
||||
JvmtiExport::decode_version_values(_version, &major, &minor, µ);
|
||||
return major == 1 && minor == 1; // micro version doesn't matter here
|
||||
}
|
||||
|
||||
|
||||
JvmtiEnvBase::JvmtiEnvBase(jint version) : _env_event_enable() {
|
||||
_version = version;
|
||||
_env_local_storage = NULL;
|
||||
_tag_map = NULL;
|
||||
_native_method_prefix_count = 0;
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2003-2006 Sun Microsystems, Inc. All Rights Reserved.
|
||||
* Copyright 2003-2009 Sun Microsystems, Inc. All Rights Reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -76,6 +76,7 @@ class JvmtiEnvBase : public CHeapObj {
|
||||
|
||||
jvmtiEnv _jvmti_external;
|
||||
jint _magic;
|
||||
jint _version; // version value passed to JNI GetEnv()
|
||||
JvmtiEnvBase* _next;
|
||||
bool _is_retransformable;
|
||||
const void *_env_local_storage; // per env agent allocated data.
|
||||
@ -91,7 +92,7 @@ class JvmtiEnvBase : public CHeapObj {
|
||||
int _native_method_prefix_count;
|
||||
|
||||
protected:
|
||||
JvmtiEnvBase();
|
||||
JvmtiEnvBase(jint version);
|
||||
~JvmtiEnvBase();
|
||||
void dispose();
|
||||
void env_dispose();
|
||||
@ -122,6 +123,9 @@ class JvmtiEnvBase : public CHeapObj {
|
||||
|
||||
bool is_valid() { return _magic == JVMTI_MAGIC; }
|
||||
|
||||
bool use_version_1_0_semantics(); // agent asked for version 1.0
|
||||
bool use_version_1_1_semantics(); // agent asked for version 1.1
|
||||
|
||||
bool is_retransformable() { return _is_retransformable; }
|
||||
|
||||
static ByteSize jvmti_external_offset() {
|
||||
|
@ -319,7 +319,27 @@ address JvmtiExport::get_field_modification_count_addr() {
|
||||
|
||||
jint
|
||||
JvmtiExport::get_jvmti_interface(JavaVM *jvm, void **penv, jint version) {
|
||||
/* To Do: add version checks */
|
||||
// The JVMTI_VERSION_INTERFACE_JVMTI part of the version number
|
||||
// has already been validated in JNI GetEnv().
|
||||
int major, minor, micro;
|
||||
|
||||
// micro version doesn't matter here (yet?)
|
||||
decode_version_values(version, &major, &minor, µ);
|
||||
switch (major) {
|
||||
case 1:
|
||||
switch (minor) {
|
||||
case 0: // version 1.0.<micro> is recognized
|
||||
case 1: // version 1.1.<micro> is recognized
|
||||
break;
|
||||
|
||||
default:
|
||||
return JNI_EVERSION; // unsupported minor version number
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
return JNI_EVERSION; // unsupported major version number
|
||||
}
|
||||
|
||||
if (JvmtiEnv::get_phase() == JVMTI_PHASE_LIVE) {
|
||||
JavaThread* current_thread = (JavaThread*) ThreadLocalStorage::thread();
|
||||
@ -328,13 +348,13 @@ JvmtiExport::get_jvmti_interface(JavaVM *jvm, void **penv, jint version) {
|
||||
__ENTRY(jvmtiEnv*, JvmtiExport::get_jvmti_interface, current_thread)
|
||||
debug_only(VMNativeEntryWrapper __vew;)
|
||||
|
||||
JvmtiEnv *jvmti_env = JvmtiEnv::create_a_jvmti();
|
||||
JvmtiEnv *jvmti_env = JvmtiEnv::create_a_jvmti(version);
|
||||
*penv = jvmti_env->jvmti_external(); // actual type is jvmtiEnv* -- not to be confused with JvmtiEnv*
|
||||
return JNI_OK;
|
||||
|
||||
} else if (JvmtiEnv::get_phase() == JVMTI_PHASE_ONLOAD) {
|
||||
// not live, no thread to transition
|
||||
JvmtiEnv *jvmti_env = JvmtiEnv::create_a_jvmti();
|
||||
JvmtiEnv *jvmti_env = JvmtiEnv::create_a_jvmti(version);
|
||||
*penv = jvmti_env->jvmti_external(); // actual type is jvmtiEnv* -- not to be confused with JvmtiEnv*
|
||||
return JNI_OK;
|
||||
|
||||
@ -345,6 +365,15 @@ JvmtiExport::get_jvmti_interface(JavaVM *jvm, void **penv, jint version) {
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
JvmtiExport::decode_version_values(jint version, int * major, int * minor,
|
||||
int * micro) {
|
||||
*major = (version & JVMTI_VERSION_MASK_MAJOR) >> JVMTI_VERSION_SHIFT_MAJOR;
|
||||
*minor = (version & JVMTI_VERSION_MASK_MINOR) >> JVMTI_VERSION_SHIFT_MINOR;
|
||||
*micro = (version & JVMTI_VERSION_MASK_MICRO) >> JVMTI_VERSION_SHIFT_MICRO;
|
||||
}
|
||||
|
||||
void JvmtiExport::enter_primordial_phase() {
|
||||
JvmtiEnvBase::set_phase(JVMTI_PHASE_PRIMORDIAL);
|
||||
}
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 1998-2006 Sun Microsystems, Inc. All Rights Reserved.
|
||||
* Copyright 1998-2009 Sun Microsystems, Inc. All Rights Reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -236,6 +236,8 @@ class JvmtiExport : public AllStatic {
|
||||
static bool is_jvmti_version(jint version) { return (version & JVMTI_VERSION_MASK) == JVMTI_VERSION_VALUE; }
|
||||
static bool is_jvmdi_version(jint version) { return (version & JVMTI_VERSION_MASK) == JVMDI_VERSION_VALUE; }
|
||||
static jint get_jvmti_interface(JavaVM *jvm, void **penv, jint version);
|
||||
static void decode_version_values(jint version, int * major, int * minor,
|
||||
int * micro);
|
||||
|
||||
// single stepping management methods
|
||||
static void at_single_stepping_point(JavaThread *thread, methodOop method, address location) KERNEL_RETURN;
|
||||
|
@ -1,6 +1,6 @@
|
||||
<?xml version="1.0"?>
|
||||
<!--
|
||||
Copyright 2002-2005 Sun Microsystems, Inc. All Rights Reserved.
|
||||
Copyright 2002-2009 Sun Microsystems, Inc. All Rights Reserved.
|
||||
DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
|
||||
This code is free software; you can redistribute it and/or modify it
|
||||
@ -48,12 +48,12 @@ class JvmtiEnv : public JvmtiEnvBase {
|
||||
|
||||
private:
|
||||
|
||||
JvmtiEnv();
|
||||
JvmtiEnv(jint version);
|
||||
~JvmtiEnv();
|
||||
|
||||
public:
|
||||
|
||||
static JvmtiEnv* create_a_jvmti();
|
||||
static JvmtiEnv* create_a_jvmti(jint version);
|
||||
|
||||
</xsl:text>
|
||||
<xsl:apply-templates select="functionsection"/>
|
||||
|
Loading…
x
Reference in New Issue
Block a user