aboutsummaryrefslogtreecommitdiff
path: root/src/share/vm/prims
diff options
context:
space:
mode:
author"Andrew Dinn ext:(%22) <adinn@redhat.com>2013-01-25 14:30:04 +0000
committer"Andrew Dinn ext:(%22) <adinn@redhat.com>2013-01-25 14:30:04 +0000
commitb39a63d94cd62ca24e786e1c118b798bb3d9ea8d (patch)
tree8daa1a3e725eec2cdbc4fb09b26b2e2df5fee20c /src/share/vm/prims
parentf1d109e3aec309a7cb0f461deb4a3ba671a77457 (diff)
parenta18c8faf24aa21ffe773ac01f18d4a650ee0d3c6 (diff)
merged upstream jdk8 changes up to tag jdk8_b72
Diffstat (limited to 'src/share/vm/prims')
-rw-r--r--src/share/vm/prims/forte.cpp25
-rw-r--r--src/share/vm/prims/forte.hpp4
-rw-r--r--src/share/vm/prims/jni.cpp122
-rw-r--r--src/share/vm/prims/jniCheck.cpp4
-rw-r--r--src/share/vm/prims/jniExport.hpp2
-rw-r--r--src/share/vm/prims/jvm.cpp149
-rw-r--r--src/share/vm/prims/jvmti.xml51
-rw-r--r--src/share/vm/prims/jvmtiClassFileReconstituter.cpp72
-rw-r--r--src/share/vm/prims/jvmtiClassFileReconstituter.hpp1
-rw-r--r--src/share/vm/prims/jvmtiCodeBlobEvents.cpp2
-rw-r--r--src/share/vm/prims/jvmtiEnter.xsl9
-rw-r--r--src/share/vm/prims/jvmtiEnv.cpp52
-rw-r--r--src/share/vm/prims/jvmtiEnvBase.cpp4
-rw-r--r--src/share/vm/prims/jvmtiEnvBase.hpp9
-rw-r--r--src/share/vm/prims/jvmtiExport.cpp25
-rw-r--r--src/share/vm/prims/jvmtiExport.hpp221
-rw-r--r--src/share/vm/prims/jvmtiExtensions.cpp2
-rw-r--r--src/share/vm/prims/jvmtiGetLoadedClasses.cpp20
-rw-r--r--src/share/vm/prims/jvmtiImpl.cpp19
-rw-r--r--src/share/vm/prims/jvmtiImpl.hpp18
-rw-r--r--src/share/vm/prims/jvmtiRawMonitor.cpp2
-rw-r--r--src/share/vm/prims/jvmtiRedefineClasses.cpp16
-rw-r--r--src/share/vm/prims/jvmtiRedefineClasses.hpp6
-rw-r--r--src/share/vm/prims/jvmtiTagMap.cpp19
-rw-r--r--src/share/vm/prims/jvmtiTagMap.hpp4
-rw-r--r--src/share/vm/prims/jvmtiThreadState.hpp2
-rw-r--r--src/share/vm/prims/jvmtiTrace.cpp2
-rw-r--r--src/share/vm/prims/jvmtiUtil.cpp2
-rw-r--r--src/share/vm/prims/methodHandles.cpp59
-rw-r--r--src/share/vm/prims/methodHandles.hpp22
-rw-r--r--src/share/vm/prims/nativeLookup.cpp9
-rw-r--r--src/share/vm/prims/unsafe.cpp55
32 files changed, 561 insertions, 448 deletions
diff --git a/src/share/vm/prims/forte.cpp b/src/share/vm/prims/forte.cpp
index 7a15af974..33419f298 100644
--- a/src/share/vm/prims/forte.cpp
+++ b/src/share/vm/prims/forte.cpp
@@ -216,10 +216,7 @@ static bool is_decipherable_interpreted_frame(JavaThread* thread,
// not yet valid.
*method_p = method;
-
- // See if gc may have invalidated method since we validated frame
-
- if (!Universe::heap()->is_valid_method(method)) return false;
+ if (!method->is_valid_method()) return false;
intptr_t bcx = fr->interpreter_frame_bcx();
@@ -394,19 +391,11 @@ static void forte_fill_call_trace_given_top(JavaThread* thd,
bool fully_decipherable = find_initial_Java_frame(thd, &top_frame, &initial_Java_frame, &method, &bci);
// The frame might not be walkable but still recovered a method
- // (e.g. an nmethod with no scope info for the pc
+ // (e.g. an nmethod with no scope info for the pc)
if (method == NULL) return;
- CollectedHeap* ch = Universe::heap();
-
- // The method is not stored GC safe so see if GC became active
- // after we entered AsyncGetCallTrace() and before we try to
- // use the Method*.
- // Yes, there is still a window after this check and before
- // we use Method* below, but we can't lock out GC so that
- // has to be an acceptable risk.
- if (!ch->is_valid_method(method)) {
+ if (!method->is_valid_method()) {
trace->num_frames = ticks_GC_active; // -2
return;
}
@@ -440,13 +429,7 @@ static void forte_fill_call_trace_given_top(JavaThread* thd,
bci = st.bci();
method = st.method();
- // The method is not stored GC safe so see if GC became active
- // after we entered AsyncGetCallTrace() and before we try to
- // use the Method*.
- // Yes, there is still a window after this check and before
- // we use Method* below, but we can't lock out GC so that
- // has to be an acceptable risk.
- if (!ch->is_valid_method(method)) {
+ if (!method->is_valid_method()) {
// we throw away everything we've gathered in this sample since
// none of it is safe
trace->num_frames = ticks_GC_active; // -2
diff --git a/src/share/vm/prims/forte.hpp b/src/share/vm/prims/forte.hpp
index 9631faeb1..29a8a6854 100644
--- a/src/share/vm/prims/forte.hpp
+++ b/src/share/vm/prims/forte.hpp
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2004, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2004, 2012, Oracle and/or its affiliates. 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
@@ -30,7 +30,7 @@
class Forte : AllStatic {
public:
static void register_stub(const char* name, address start, address end)
- KERNEL_RETURN;
+ NOT_JVMTI_RETURN;
// register internal VM stub
};
diff --git a/src/share/vm/prims/jni.cpp b/src/share/vm/prims/jni.cpp
index c9450e9dc..ddbde753f 100644
--- a/src/share/vm/prims/jni.cpp
+++ b/src/share/vm/prims/jni.cpp
@@ -1,5 +1,6 @@
/*
* Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2012 Red Hat, Inc.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -23,6 +24,7 @@
*/
#include "precompiled.hpp"
+#include "ci/ciReplay.hpp"
#include "classfile/altHashing.hpp"
#include "classfile/classLoader.hpp"
#include "classfile/javaClasses.hpp"
@@ -67,6 +69,7 @@
#include "runtime/reflection.hpp"
#include "runtime/sharedRuntime.hpp"
#include "runtime/signature.hpp"
+#include "runtime/thread.inline.hpp"
#include "runtime/vm_operations.hpp"
#include "services/runtimeService.hpp"
#include "trace/tracing.hpp"
@@ -77,19 +80,15 @@
#include "utilities/histogram.hpp"
#ifdef TARGET_OS_FAMILY_linux
# include "os_linux.inline.hpp"
-# include "thread_linux.inline.hpp"
#endif
#ifdef TARGET_OS_FAMILY_solaris
# include "os_solaris.inline.hpp"
-# include "thread_solaris.inline.hpp"
#endif
#ifdef TARGET_OS_FAMILY_windows
# include "os_windows.inline.hpp"
-# include "thread_windows.inline.hpp"
#endif
#ifdef TARGET_OS_FAMILY_bsd
# include "os_bsd.inline.hpp"
-# include "thread_bsd.inline.hpp"
#endif
static jint CurrentVersion = JNI_VERSION_1_6;
@@ -232,13 +231,13 @@ bool jfieldIDWorkaround::is_valid_jfieldID(Klass* k, jfieldID id) {
intptr_t jfieldIDWorkaround::encode_klass_hash(Klass* k, intptr_t offset) {
if (offset <= small_offset_mask) {
Klass* field_klass = k;
- Klass* super_klass = Klass::cast(field_klass)->super();
+ Klass* super_klass = field_klass->super();
// With compressed oops the most super class with nonstatic fields would
// be the owner of fields embedded in the header.
while (InstanceKlass::cast(super_klass)->has_nonstatic_fields() &&
InstanceKlass::cast(super_klass)->contains_field_offset(offset)) {
field_klass = super_klass; // super contains the field also
- super_klass = Klass::cast(field_klass)->super();
+ super_klass = field_klass->super();
}
debug_only(No_Safepoint_Verifier nosafepoint;)
uintptr_t klass_hash = field_klass->identity_hash();
@@ -248,7 +247,7 @@ intptr_t jfieldIDWorkaround::encode_klass_hash(Klass* k, intptr_t offset) {
#ifndef PRODUCT
{
ResourceMark rm;
- warning("VerifyJNIFields: long offset %d in %s", offset, Klass::cast(k)->external_name());
+ warning("VerifyJNIFields: long offset %d in %s", offset, k->external_name());
}
#endif
#endif
@@ -264,7 +263,7 @@ bool jfieldIDWorkaround::klass_hash_ok(Klass* k, jfieldID id) {
// Could use a non-blocking query for identity_hash here...
if ((k->identity_hash() & klass_mask) == klass_hash)
return true;
- k = Klass::cast(k)->super();
+ k = k->super();
} while (k != NULL);
return false;
}
@@ -282,7 +281,7 @@ void jfieldIDWorkaround::verify_instance_jfieldID(Klass* k, jfieldID id) {
#ifndef PRODUCT
if (Verbose) {
ResourceMark rm;
- warning("VerifyJNIFields: unverified offset %d for %s", offset, Klass::cast(k)->external_name());
+ warning("VerifyJNIFields: unverified offset %d for %s", offset, k->external_name());
}
#endif
#endif
@@ -414,7 +413,7 @@ JNI_ENTRY(jclass, jni_DefineClass(JNIEnv *env, const char *name, jobject loaderR
}
cls = (jclass)JNIHandles::make_local(
- env, Klass::cast(k)->java_mirror());
+ env, k->java_mirror());
return cls;
JNI_END
@@ -535,7 +534,7 @@ JNI_ENTRY(jmethodID, jni_FromReflectedMethod(JNIEnv *env, jobject method))
KlassHandle k1(THREAD, k);
// Make sure class is initialized before handing id's out to methods
- Klass::cast(k1())->initialize(CHECK_NULL);
+ k1()->initialize(CHECK_NULL);
Method* m = InstanceKlass::cast(k1())->method_with_idnum(slot);
ret = m==NULL? NULL : m->jmethod_id(); // return NULL if reflected method deleted
return ret;
@@ -568,7 +567,7 @@ JNI_ENTRY(jfieldID, jni_FromReflectedField(JNIEnv *env, jobject field))
KlassHandle k1(THREAD, k);
// Make sure class is initialized before handing id's out to fields
- Klass::cast(k1())->initialize(CHECK_NULL);
+ k1()->initialize(CHECK_NULL);
// First check if this is a static field
if (modifiers & JVM_ACC_STATIC) {
@@ -647,17 +646,17 @@ JNI_ENTRY(jclass, jni_GetSuperclass(JNIEnv *env, jclass sub))
// interfaces return NULL
// proper classes return Klass::super()
Klass* k = java_lang_Class::as_Klass(mirror);
- if (Klass::cast(k)->is_interface()) return NULL;
+ if (k->is_interface()) return NULL;
// return mirror for superclass
- Klass* super = Klass::cast(k)->java_super();
+ Klass* super = k->java_super();
// super2 is the value computed by the compiler's getSuperClass intrinsic:
- debug_only(Klass* super2 = ( Klass::cast(k)->oop_is_array()
+ debug_only(Klass* super2 = ( k->oop_is_array()
? SystemDictionary::Object_klass()
- : Klass::cast(k)->super() ) );
+ : k->super() ) );
assert(super == super2,
"java_super computation depends on interface, array, other super");
- obj = (super == NULL) ? NULL : (jclass) JNIHandles::make_local(Klass::cast(super)->java_mirror());
+ obj = (super == NULL) ? NULL : (jclass) JNIHandles::make_local(super->java_mirror());
return obj;
JNI_END
@@ -685,7 +684,7 @@ JNI_QUICK_ENTRY(jboolean, jni_IsAssignableFrom(JNIEnv *env, jclass sub, jclass s
Klass* sub_klass = java_lang_Class::as_Klass(sub_mirror);
Klass* super_klass = java_lang_Class::as_Klass(super_mirror);
assert(sub_klass != NULL && super_klass != NULL, "invalid arguments to jni_IsAssignableFrom");
- jboolean ret = Klass::cast(sub_klass)->is_subtype_of(super_klass) ?
+ jboolean ret = sub_klass->is_subtype_of(super_klass) ?
JNI_TRUE : JNI_FALSE;
#ifndef USDT2
DTRACE_PROBE1(hotspot_jni, IsAssignableFrom__return, ret);
@@ -819,7 +818,7 @@ JNI_ENTRY_NO_PRESERVE(void, jni_ExceptionDescribe(JNIEnv *env))
ResourceMark rm(THREAD);
jio_fprintf(defaultStream::error_stream(),
". Uncaught exception of type %s.",
- Klass::cast(ex->klass())->external_name());
+ ex->klass()->external_name());
}
}
}
@@ -1357,7 +1356,7 @@ static void jni_invoke_nonstatic(JNIEnv *env, JavaValue* result, jobject receive
Method* m = Method::resolve_jmethod_id(method_id);
number_of_parameters = m->size_of_parameters();
Klass* holder = m->method_holder();
- if (!(Klass::cast(holder))->is_interface()) {
+ if (!(holder)->is_interface()) {
// non-interface call -- for that little speed boost, don't handlize
debug_only(No_Safepoint_Verifier nosafepoint;)
if (call_type == JNI_VIRTUAL) {
@@ -1422,7 +1421,7 @@ static void jni_invoke_nonstatic(JNIEnv *env, JavaValue* result, jobject receive
static instanceOop alloc_object(jclass clazz, TRAPS) {
KlassHandle k(THREAD, java_lang_Class::as_Klass(JNIHandles::resolve_non_null(clazz)));
- Klass::cast(k())->check_valid_for_instantiation(false, CHECK_NULL);
+ k()->check_valid_for_instantiation(false, CHECK_NULL);
InstanceKlass::cast(k())->initialize(CHECK_NULL);
instanceOop ih = InstanceKlass::cast(k())->allocate_instance(THREAD);
return ih;
@@ -1544,7 +1543,7 @@ JNI_ENTRY(jclass, jni_GetObjectClass(JNIEnv *env, jobject obj))
#endif /* USDT2 */
Klass* k = JNIHandles::resolve_non_null(obj)->klass();
jclass ret =
- (jclass) JNIHandles::make_local(env, Klass::cast(k)->java_mirror());
+ (jclass) JNIHandles::make_local(env, k->java_mirror());
#ifndef USDT2
DTRACE_PROBE1(hotspot_jni, GetObjectClass__return, ret);
#else /* USDT2 */
@@ -1609,7 +1608,7 @@ static jmethodID get_method_id(JNIEnv *env, jclass clazz, const char *name_str,
// Make sure class is linked and initialized before handing id's out to
// Method*s.
- Klass::cast(klass())->initialize(CHECK_NULL);
+ klass()->initialize(CHECK_NULL);
Method* m;
if (name == vmSymbols::object_initializer_name() ||
@@ -2425,7 +2424,7 @@ JNI_ENTRY(ResultType, \
JNI_ArgumentPusherVaArg ap(methodID, args); \
/* Make sure class is initialized before trying to invoke its method */ \
KlassHandle k(THREAD, java_lang_Class::as_Klass(JNIHandles::resolve_non_null(cls))); \
- Klass::cast(k())->initialize(CHECK_0); \
+ k()->initialize(CHECK_0); \
jni_invoke_static(env, &jvalue, NULL, JNI_STATIC, methodID, &ap, CHECK_0); \
va_end(args); \
ret = jvalue.get_##ResultType(); \
@@ -2610,10 +2609,10 @@ JNI_ENTRY(jfieldID, jni_GetFieldID(JNIEnv *env, jclass clazz,
KlassHandle k(THREAD,
java_lang_Class::as_Klass(JNIHandles::resolve_non_null(clazz)));
// Make sure class is initialized before handing id's out to fields
- Klass::cast(k())->initialize(CHECK_NULL);
+ k()->initialize(CHECK_NULL);
fieldDescriptor fd;
- if (!Klass::cast(k())->oop_is_instance() ||
+ if (!k()->oop_is_instance() ||
!InstanceKlass::cast(k())->find_field(fieldname, signame, false, &fd)) {
THROW_MSG_0(vmSymbols::java_lang_NoSuchFieldError(), (char*) name);
}
@@ -2820,10 +2819,9 @@ JNI_END
JNI_QUICK_ENTRY(void, jni_Set##Result##Field(JNIEnv *env, jobject obj, jfieldID fieldID, Argument value)) \
JNIWrapper("Set" XSTR(Result) "Field"); \
\
- HS_DTRACE_PROBE_CDECL_N(hotspot_jni, Set##Result##Field__entry, \
- ( JNIEnv*, jobject, jfieldID FP_SELECT_##Result(COMMA Argument,/*empty*/) ) ); \
- HS_DTRACE_PROBE_N(hotspot_jni, Set##Result##Field__entry, \
- ( env, obj, fieldID FP_SELECT_##Result(COMMA value,/*empty*/) ) ); \
+ FP_SELECT_##Result( \
+ DTRACE_PROBE4(hotspot_jni, Set##Result##Field__entry, env, obj, fieldID, value), \
+ DTRACE_PROBE3(hotspot_jni, Set##Result##Field__entry, env, obj, fieldID)); \
\
oop o = JNIHandles::resolve_non_null(obj); \
Klass* k = o->klass(); \
@@ -2976,16 +2974,16 @@ JNI_ENTRY(jfieldID, jni_GetStaticFieldID(JNIEnv *env, jclass clazz,
KlassHandle k(THREAD,
java_lang_Class::as_Klass(JNIHandles::resolve_non_null(clazz)));
// Make sure class is initialized before handing id's out to static fields
- Klass::cast(k())->initialize(CHECK_NULL);
+ k()->initialize(CHECK_NULL);
fieldDescriptor fd;
- if (!Klass::cast(k())->oop_is_instance() ||
+ if (!k()->oop_is_instance() ||
!InstanceKlass::cast(k())->find_field(fieldname, signame, true, &fd)) {
THROW_MSG_0(vmSymbols::java_lang_NoSuchFieldError(), (char*) name);
}
// A jfieldID for a static field is a JNIid specifying the field holder and the offset within the Klass*
- JNIid* id = InstanceKlass::cast(fd.field_holder())->jni_id_for(fd.offset());
+ JNIid* id = fd.field_holder()->jni_id_for(fd.offset());
debug_only(id->set_is_static_field_id();)
debug_only(id->verify(fd.field_holder()));
@@ -3003,9 +3001,9 @@ JNI_ENTRY(jobject, jni_GetStaticObjectField(JNIEnv *env, jclass clazz, jfieldID
HOTSPOT_JNI_GETSTATICOBJECTFIELD_ENTRY(
env, clazz, (uintptr_t) fieldID);
#endif /* USDT2 */
-#ifndef JNICHECK_KERNEL
+#if INCLUDE_JNI_CHECK
DEBUG_ONLY(Klass* param_k = jniCheck::validate_class(thread, clazz);)
-#endif // JNICHECK_KERNEL
+#endif // INCLUDE_JNI_CHECK
JNIid* id = jfieldIDWorkaround::from_static_jfieldID(fieldID);
assert(id->is_static_field_id(), "invalid static field id");
// Keep JVMTI addition small and only check enabled flag here.
@@ -3130,10 +3128,9 @@ JNI_END
\
JNI_ENTRY(void, jni_SetStatic##Result##Field(JNIEnv *env, jclass clazz, jfieldID fieldID, Argument value)) \
JNIWrapper("SetStatic" XSTR(Result) "Field"); \
- HS_DTRACE_PROBE_CDECL_N(hotspot_jni, SetStatic##Result##Field__entry,\
- ( JNIEnv*, jclass, jfieldID FP_SELECT_##Result(COMMA Argument,/*empty*/) ) ); \
- HS_DTRACE_PROBE_N(hotspot_jni, SetStatic##Result##Field__entry, \
- ( env, clazz, fieldID FP_SELECT_##Result(COMMA value,/*empty*/) ) ); \
+ FP_SELECT_##Result( \
+ DTRACE_PROBE4(hotspot_jni, SetStatic##Result##Field__entry, env, clazz, fieldID, value), \
+ DTRACE_PROBE3(hotspot_jni, SetStatic##Result##Field__entry, env, clazz, fieldID)); \
\
JNIid* id = jfieldIDWorkaround::from_static_jfieldID(fieldID); \
assert(id->is_static_field_id(), "invalid static field id"); \
@@ -3440,10 +3437,10 @@ JNI_ENTRY(jobjectArray, jni_NewObjectArray(JNIEnv *env, jsize length, jclass ele
jobjectArray ret = NULL;
DT_RETURN_MARK(NewObjectArray, jobjectArray, (const jobjectArray&)ret);
KlassHandle ek(THREAD, java_lang_Class::as_Klass(JNIHandles::resolve_non_null(elementClass)));
- Klass* ako = Klass::cast(ek())->array_klass(CHECK_NULL);
+ Klass* ako = ek()->array_klass(CHECK_NULL);
KlassHandle ak = KlassHandle(THREAD, ako);
- objArrayKlass::cast(ak())->initialize(CHECK_NULL);
- objArrayOop result = objArrayKlass::cast(ak())->allocate(length, CHECK_NULL);
+ ObjArrayKlass::cast(ak())->initialize(CHECK_NULL);
+ objArrayOop result = ObjArrayKlass::cast(ak())->allocate(length, CHECK_NULL);
oop initial_value = JNIHandles::resolve(initialElement);
if (initial_value != NULL) { // array already initialized with NULL
for (int index = 0; index < length; index++) {
@@ -3502,7 +3499,7 @@ JNI_ENTRY(void, jni_SetObjectArrayElement(JNIEnv *env, jobjectArray array, jsize
objArrayOop a = objArrayOop(JNIHandles::resolve_non_null(array));
oop v = JNIHandles::resolve(value);
if (a->is_within_bounds(index)) {
- if (v == NULL || v->is_a(objArrayKlass::cast(a->klass())->element_klass())) {
+ if (v == NULL || v->is_a(ObjArrayKlass::cast(a->klass())->element_klass())) {
a->obj_at_put(index, v);
} else {
THROW(vmSymbols::java_lang_ArrayStoreException());
@@ -3787,7 +3784,7 @@ jni_Get##Result##ArrayRegion(JNIEnv *env, ElementType##Array array, jsize start,
THROW(vmSymbols::java_lang_ArrayIndexOutOfBoundsException()); \
} else { \
if (len > 0) { \
- int sc = typeArrayKlass::cast(src->klass())->log2_element_size(); \
+ int sc = TypeArrayKlass::cast(src->klass())->log2_element_size(); \
memcpy((u_char*) buf, \
(u_char*) src->Tag##_at_addr(start), \
len << sc); \
@@ -3822,7 +3819,7 @@ jni_Get##Result##ArrayRegion(JNIEnv *env, ElementType##Array array, jsize start,
THROW(vmSymbols::java_lang_ArrayIndexOutOfBoundsException()); \
} else { \
if (len > 0) { \
- int sc = typeArrayKlass::cast(src->klass())->log2_element_size(); \
+ int sc = TypeArrayKlass::cast(src->klass())->log2_element_size(); \
memcpy((u_char*) buf, \
(u_char*) src->Tag##_at_addr(start), \
len << sc); \
@@ -3871,7 +3868,7 @@ jni_Set##Result##ArrayRegion(JNIEnv *env, ElementType##Array array, jsize start,
THROW(vmSymbols::java_lang_ArrayIndexOutOfBoundsException()); \
} else { \
if (len > 0) { \
- int sc = typeArrayKlass::cast(dst->klass())->log2_element_size(); \
+ int sc = TypeArrayKlass::cast(dst->klass())->log2_element_size(); \
memcpy((u_char*) dst->Tag##_at_addr(start), \
(u_char*) buf, \
len << sc); \
@@ -3906,7 +3903,7 @@ jni_Set##Result##ArrayRegion(JNIEnv *env, ElementType##Array array, jsize start,
THROW(vmSymbols::java_lang_ArrayIndexOutOfBoundsException()); \
} else { \
if (len > 0) { \
- int sc = typeArrayKlass::cast(dst->klass())->log2_element_size(); \
+ int sc = TypeArrayKlass::cast(dst->klass())->log2_element_size(); \
memcpy((u_char*) dst->Tag##_at_addr(start), \
(u_char*) buf, \
len << sc); \
@@ -3951,6 +3948,7 @@ DEFINE_SETSCALARARRAYREGION(T_DOUBLE, jdouble, Double, double
// SetNativeMethodPrefix(es) functions in the JVM TI Spec for details.
static Method* find_prefixed_native(KlassHandle k,
Symbol* name, Symbol* signature, TRAPS) {
+#if INCLUDE_JVMTI
ResourceMark rm(THREAD);
Method* method;
int name_len = name->utf8_length();
@@ -3970,7 +3968,7 @@ static Method* find_prefixed_native(KlassHandle k,
if (trial_name == NULL) {
continue; // no such symbol, so this prefix wasn't used, try the next prefix
}
- method = Klass::cast(k())->lookup_method(trial_name, signature);
+ method = k()->lookup_method(trial_name, signature);
if (method == NULL) {
continue; // signature doesn't match, try the next prefix
}
@@ -3982,16 +3980,17 @@ static Method* find_prefixed_native(KlassHandle k,
name_len = trial_len;
name_str = trial_name_str;
}
+#endif // INCLUDE_JVMTI
return NULL; // not found
}
static bool register_native(KlassHandle k, Symbol* name, Symbol* signature, address entry, TRAPS) {
- Method* method = Klass::cast(k())->lookup_method(name, signature);
+ Method* method = k()->lookup_method(name, signature);
if (method == NULL) {
ResourceMark rm;
stringStream st;
st.print("Method %s name or signature does not match",
- Method::name_and_sig_as_C_string(Klass::cast(k()), name, signature));
+ Method::name_and_sig_as_C_string(k(), name, signature));
THROW_MSG_(vmSymbols::java_lang_NoSuchMethodError(), st.as_string(), false);
}
if (!method->is_native()) {
@@ -4001,7 +4000,7 @@ static bool register_native(KlassHandle k, Symbol* name, Symbol* signature, addr
ResourceMark rm;
stringStream st;
st.print("Method %s is not declared as native",
- Method::name_and_sig_as_C_string(Klass::cast(k()), name, signature));
+ Method::name_and_sig_as_C_string(k(), name, signature));
THROW_MSG_(vmSymbols::java_lang_NoSuchMethodError(), st.as_string(), false);
}
}
@@ -4015,7 +4014,7 @@ static bool register_native(KlassHandle k, Symbol* name, Symbol* signature, addr
if (PrintJNIResolving) {
ResourceMark rm(THREAD);
tty->print_cr("[Registering JNI native method %s.%s]",
- Klass::cast(method->method_holder())->external_name(),
+ method->method_holder()->external_name(),
method->name()->as_C_string());
}
return true;
@@ -4057,7 +4056,7 @@ JNI_ENTRY(jint, jni_RegisterNatives(JNIEnv *env, jclass clazz,
if (name == NULL || signature == NULL) {
ResourceMark rm;
stringStream st;
- st.print("Method %s.%s%s not found", Klass::cast(h_k())->external_name(), meth_name, meth_sig);
+ st.print("Method %s.%s%s not found", h_k()->external_name(), meth_name, meth_sig);
// Must return negative value on failure
THROW_MSG_(vmSymbols::java_lang_NoSuchMethodError(), st.as_string(), -1);
}
@@ -4083,7 +4082,7 @@ JNI_ENTRY(jint, jni_UnregisterNatives(JNIEnv *env, jclass clazz))
#endif /* USDT2 */
Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(clazz));
//%note jni_2
- if (Klass::cast(k)->oop_is_instance()) {
+ if (k->oop_is_instance()) {
for (int index = 0; index < InstanceKlass::cast(k)->methods()->length(); index++) {
Method* m = InstanceKlass::cast(k)->methods()->at(index);
if (m->is_native()) {
@@ -4251,7 +4250,7 @@ JNI_ENTRY(void*, jni_GetPrimitiveArrayCritical(JNIEnv *env, jarray array, jboole
if (a->is_objArray()) {
type = T_OBJECT;
} else {
- type = typeArrayKlass::cast(a->klass())->element_type();
+ type = TypeArrayKlass::cast(a->klass())->element_type();
}
void* ret = arrayOop(a)->base(type);
#ifndef USDT2
@@ -4975,11 +4974,9 @@ void quicken_jni_functions() {
// Returns the function structure
struct JNINativeInterface_* jni_functions() {
-#ifndef JNICHECK_KERNEL
+#if INCLUDE_JNI_CHECK
if (CheckJNICalls) return jni_functions_check();
-#else // JNICHECK_KERNEL
- if (CheckJNICalls) warning("-Xcheck:jni is not supported in kernel vm.");
-#endif // JNICHECK_KERNEL
+#endif // INCLUDE_JNI_CHECK
return &jni_NativeInterface;
}
@@ -5044,6 +5041,9 @@ _JNI_IMPORT_OR_EXPORT_ jint JNICALL JNI_GetDefaultJavaVMInitArgs(void *args_) {
#include "gc_interface/collectedHeap.hpp"
#include "utilities/quickSort.hpp"
+#if INCLUDE_VM_STRUCTS
+#include "runtime/vmStructs.hpp"
+#endif
#define run_unit_test(unit_test_function_call) \
tty->print_cr("Running test: " #unit_test_function_call); \
@@ -5056,6 +5056,9 @@ void execute_internal_vm_tests() {
run_unit_test(CollectedHeap::test_is_in());
run_unit_test(QuickSort::test_quick_sort());
run_unit_test(AltHashing::test_alt_hash());
+#if INCLUDE_VM_STRUCTS
+ run_unit_test(VMStructs::test());
+#endif
tty->print_cr("All internal VM tests passed");
}
}
@@ -5152,6 +5155,7 @@ _JNI_IMPORT_OR_EXPORT_ jint JNICALL JNI_CreateJavaVM(JavaVM **vm, void **penv, v
// Check if we should compile all classes on bootclasspath
NOT_PRODUCT(if (CompileTheWorld) ClassLoader::compile_the_world();)
+ NOT_PRODUCT(if (ReplayCompiles) ciReplay::replay(thread);)
// Since this is not a JVM_ENTRY we have to set the thread state manually before leaving.
ThreadStateTransition::transition_and_fence(thread, _thread_in_vm, _thread_in_native);
} else {
diff --git a/src/share/vm/prims/jniCheck.cpp b/src/share/vm/prims/jniCheck.cpp
index c95accb6c..32692669b 100644
--- a/src/share/vm/prims/jniCheck.cpp
+++ b/src/share/vm/prims/jniCheck.cpp
@@ -293,7 +293,7 @@ checkArray(JavaThread* thr, jarray jArray, int elementType)
if (elementType != -1) {
if (aOop->is_typeArray()) {
- BasicType array_type = typeArrayKlass::cast(aOop->klass())->element_type();
+ BasicType array_type = TypeArrayKlass::cast(aOop->klass())->element_type();
if (array_type != elementType)
ReportJNIFatalError(thr, fatal_element_type_mismatch);
} else if (aOop->is_objArray()) {
@@ -386,7 +386,7 @@ void jniCheck::validate_throwable_klass(JavaThread* thr, Klass* klass) {
ASSERT_OOPS_ALLOWED;
assert(klass != NULL, "klass argument must have a value");
- if (!Klass::cast(klass)->oop_is_instance() ||
+ if (!klass->oop_is_instance() ||
!InstanceKlass::cast(klass)->is_subclass_of(SystemDictionary::Throwable_klass())) {
ReportJNIFatalError(thr, fatal_class_not_a_throwable_class);
}
diff --git a/src/share/vm/prims/jniExport.hpp b/src/share/vm/prims/jniExport.hpp
index 841b3dc5c..9c93de8c7 100644
--- a/src/share/vm/prims/jniExport.hpp
+++ b/src/share/vm/prims/jniExport.hpp
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2012, Oracle and/or its affiliates. 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
diff --git a/src/share/vm/prims/jvm.cpp b/src/share/vm/prims/jvm.cpp
index 63748cf36..c381674ff 100644
--- a/src/share/vm/prims/jvm.cpp
+++ b/src/share/vm/prims/jvm.cpp
@@ -125,7 +125,7 @@ static void trace_class_resolution_impl(Klass* to_class, TRAPS) {
int line_number = -1;
const char * source_file = NULL;
const char * trace = "explicit";
- Klass* caller = NULL;
+ InstanceKlass* caller = NULL;
JavaThread* jthread = JavaThread::current();
if (jthread->has_last_Java_frame()) {
vframeStream vfst(jthread);
@@ -153,17 +153,17 @@ static void trace_class_resolution_impl(Klass* to_class, TRAPS) {
// that caller, otherwise keep quiet since this should be picked up elsewhere.
bool found_it = false;
if (!vfst.at_end() &&
- InstanceKlass::cast(vfst.method()->method_holder())->name() == vmSymbols::java_lang_Class() &&
+ vfst.method()->method_holder()->name() == vmSymbols::java_lang_Class() &&
vfst.method()->name() == vmSymbols::forName0_name()) {
vfst.next();
if (!vfst.at_end() &&
- InstanceKlass::cast(vfst.method()->method_holder())->name() == vmSymbols::java_lang_Class() &&
+ vfst.method()->method_holder()->name() == vmSymbols::java_lang_Class() &&
vfst.method()->name() == vmSymbols::forName_name()) {
vfst.next();
found_it = true;
}
} else if (last_caller != NULL &&
- InstanceKlass::cast(last_caller->method_holder())->name() ==
+ last_caller->method_holder()->name() ==
vmSymbols::java_lang_ClassLoader() &&
(last_caller->name() == vmSymbols::loadClassInternal_name() ||
last_caller->name() == vmSymbols::loadClass_name())) {
@@ -182,7 +182,7 @@ static void trace_class_resolution_impl(Klass* to_class, TRAPS) {
// show method name if it's a native method
trace = vfst.method()->name_and_sig_as_C_string();
}
- Symbol* s = InstanceKlass::cast(caller)->source_file_name();
+ Symbol* s = caller->source_file_name();
if (s != NULL) {
source_file = s->as_C_string();
}
@@ -190,8 +190,8 @@ static void trace_class_resolution_impl(Klass* to_class, TRAPS) {
}
if (caller != NULL) {
if (to_class != caller) {
- const char * from = Klass::cast(caller)->external_name();
- const char * to = Klass::cast(to_class)->external_name();
+ const char * from = caller->external_name();
+ const char * to = to_class->external_name();
// print in a single call to reduce interleaving between threads
if (source_file != NULL) {
tty->print("RESOLVE %s %s %s:%d (%s)\n", from, to, source_file, line_number, trace);
@@ -305,7 +305,7 @@ JVM_ENTRY(void, JVM_ArrayCopy(JNIEnv *env, jclass ignored, jobject src, jint src
assert(s->is_oop(), "JVM_ArrayCopy: src not an oop");
assert(d->is_oop(), "JVM_ArrayCopy: dst not an oop");
// Do copy
- Klass::cast(s->klass())->copy_array(s, src_pos, d, dst_pos, length, thread);
+ s->klass()->copy_array(s, src_pos, d, dst_pos, length, thread);
JVM_END
@@ -675,7 +675,7 @@ JVM_END
JVM_ENTRY(jclass, JVM_GetCallerClass(JNIEnv* env, int depth))
JVMWrapper("JVM_GetCallerClass");
Klass* k = thread->security_get_caller_class(depth);
- return (k == NULL) ? NULL : (jclass) JNIHandles::make_local(env, Klass::cast(k)->java_mirror());
+ return (k == NULL) ? NULL : (jclass) JNIHandles::make_local(env, k->java_mirror());
JVM_END
@@ -739,7 +739,7 @@ JVM_ENTRY(jclass, JVM_FindClassFromBootLoader(JNIEnv* env,
if (TraceClassResolution) {
trace_class_resolution(k);
}
- return (jclass) JNIHandles::make_local(env, Klass::cast(k)->java_mirror());
+ return (jclass) JNIHandles::make_local(env, k->java_mirror());
JVM_END
JVM_ENTRY(jclass, JVM_FindClassFromClassLoader(JNIEnv* env, const char* name,
@@ -785,8 +785,8 @@ JVM_ENTRY(jclass, JVM_FindClassFromClass(JNIEnv *env, const char *name,
oop class_loader = NULL;
oop protection_domain = NULL;
if (from_class != NULL) {
- class_loader = Klass::cast(from_class)->class_loader();
- protection_domain = Klass::cast(from_class)->protection_domain();
+ class_loader = from_class->class_loader();
+ protection_domain = from_class->protection_domain();
}
Handle h_loader(THREAD, class_loader);
Handle h_prot (THREAD, protection_domain);
@@ -798,11 +798,11 @@ JVM_ENTRY(jclass, JVM_FindClassFromClass(JNIEnv *env, const char *name,
ResourceMark rm;
oop from_mirror = JNIHandles::resolve_non_null(from);
Klass* from_class = java_lang_Class::as_Klass(from_mirror);
- const char * from_name = Klass::cast(from_class)->external_name();
+ const char * from_name = from_class->external_name();
oop mirror = JNIHandles::resolve_non_null(result);
Klass* to_class = java_lang_Class::as_Klass(mirror);
- const char * to = Klass::cast(to_class)->external_name();
+ const char * to = to_class->external_name();
tty->print("RESOLVE %s %s (verification)\n", from_name, to);
}
@@ -875,7 +875,7 @@ static jclass jvm_define_class_common(JNIEnv *env, const char *name,
trace_class_resolution(k);
}
- return (jclass) JNIHandles::make_local(env, Klass::cast(k)->java_mirror());
+ return (jclass) JNIHandles::make_local(env, k->java_mirror());
}
@@ -936,7 +936,7 @@ JVM_ENTRY(jclass, JVM_FindLoadedClass(JNIEnv *env, jobject loader, jstring name)
CHECK_NULL);
return (k == NULL) ? NULL :
- (jclass) JNIHandles::make_local(env, Klass::cast(k)->java_mirror());
+ (jclass) JNIHandles::make_local(env, k->java_mirror());
JVM_END
@@ -954,7 +954,7 @@ JVM_ENTRY(jstring, JVM_GetClassName(JNIEnv *env, jclass cls))
// Consider caching interned string in Klass
Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve(cls));
assert(k->is_klass(), "just checking");
- name = Klass::cast(k)->external_name();
+ name = k->external_name();
}
oop result = StringTable::intern((char*) name, CHECK_NULL);
return (jstring) JNIHandles::make_local(env, result);
@@ -991,12 +991,12 @@ JVM_ENTRY(jobjectArray, JVM_GetClassInterfaces(JNIEnv *env, jclass cls))
// Regular instance klass, fill in all local interfaces
for (int index = 0; index < size; index++) {
Klass* k = InstanceKlass::cast(klass())->local_interfaces()->at(index);
- result->obj_at_put(index, Klass::cast(k)->java_mirror());
+ result->obj_at_put(index, k->java_mirror());
}
} else {
// All arrays implement java.lang.Cloneable and java.io.Serializable
- result->obj_at_put(0, Klass::cast(SystemDictionary::Cloneable_klass())->java_mirror());
- result->obj_at_put(1, Klass::cast(SystemDictionary::Serializable_klass())->java_mirror());
+ result->obj_at_put(0, SystemDictionary::Cloneable_klass()->java_mirror());
+ result->obj_at_put(1, SystemDictionary::Serializable_klass()->java_mirror());
}
return (jobjectArray) JNIHandles::make_local(env, result());
JVM_END
@@ -1008,7 +1008,7 @@ JVM_ENTRY(jobject, JVM_GetClassLoader(JNIEnv *env, jclass cls))
return NULL;
}
Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(cls));
- oop loader = Klass::cast(k)->class_loader();
+ oop loader = k->class_loader();
return JNIHandles::make_local(env, loader);
JVM_END
@@ -1020,8 +1020,8 @@ JVM_QUICK_ENTRY(jboolean, JVM_IsInterface(JNIEnv *env, jclass cls))
return JNI_FALSE;
}
Klass* k = java_lang_Class::as_Klass(mirror);
- jboolean result = Klass::cast(k)->is_interface();
- assert(!result || Klass::cast(k)->oop_is_instance(),
+ jboolean result = k->is_interface();
+ assert(!result || k->oop_is_instance(),
"all interfaces are instance types");
// The compiler intrinsic for isInterface tests the
// Klass::_access_flags bits in the same way.
@@ -1039,7 +1039,7 @@ JVM_ENTRY(jobjectArray, JVM_GetClassSigners(JNIEnv *env, jclass cls))
Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(cls));
objArrayOop signers = NULL;
- if (Klass::cast(k)->oop_is_instance()) {
+ if (k->oop_is_instance()) {
signers = InstanceKlass::cast(k)->signers();
}
@@ -1048,7 +1048,7 @@ JVM_ENTRY(jobjectArray, JVM_GetClassSigners(JNIEnv *env, jclass cls))
if (signers == NULL) return NULL;
// copy of the signers array
- Klass* element = objArrayKlass::cast(signers->klass())->element_klass();
+ Klass* element = ObjArrayKlass::cast(signers->klass())->element_klass();
objArrayOop signers_copy = oopFactory::new_objArray(element, signers->length(), CHECK_NULL);
for (int index = 0; index < signers->length(); index++) {
signers_copy->obj_at_put(index, signers->obj_at(index));
@@ -1066,7 +1066,7 @@ JVM_ENTRY(void, JVM_SetClassSigners(JNIEnv *env, jclass cls, jobjectArray signer
// Signers are only set once, ClassLoader.java, and thus shouldn't
// be called with an array. Only the bootstrap loader creates arrays.
Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(cls));
- if (Klass::cast(k)->oop_is_instance()) {
+ if (k->oop_is_instance()) {
InstanceKlass::cast(k)->set_signers(objArrayOop(JNIHandles::resolve(signers)));
}
}
@@ -1085,7 +1085,7 @@ JVM_ENTRY(jobject, JVM_GetProtectionDomain(JNIEnv *env, jclass cls))
}
Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve(cls));
- return (jobject) JNIHandles::make_local(env, Klass::cast(k)->protection_domain());
+ return (jobject) JNIHandles::make_local(env, k->protection_domain());
JVM_END
@@ -1101,7 +1101,7 @@ JVM_ENTRY(void, JVM_SetProtectionDomain(JNIEnv *env, jclass cls, jobject protect
Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve(cls));
// cls won't be an array, as this called only from ClassLoader.defineClass
- if (Klass::cast(k)->oop_is_instance()) {
+ if (k->oop_is_instance()) {
oop pd = JNIHandles::resolve(protection_domain);
assert(pd == NULL || pd->is_oop(), "just checking");
InstanceKlass::cast(k)->set_protection_domain(pd);
@@ -1124,7 +1124,7 @@ JVM_ENTRY(jobject, JVM_DoPrivileged(JNIEnv *env, jclass cls, jobject action, job
Handle object (THREAD, JNIHandles::resolve(action));
// get run() method
- Method* m_oop = Klass::cast(object->klass())->uncached_lookup_method(
+ Method* m_oop = object->klass()->uncached_lookup_method(
vmSymbols::run_method_name(),
vmSymbols::void_object_signature());
methodHandle m (THREAD, m_oop);
@@ -1228,7 +1228,7 @@ JVM_ENTRY(jobject, JVM_GetStackAccessControlContext(JNIEnv *env, jclass cls))
privileged_context = Handle(thread, thread->privileged_stack_top()->privileged_context());
protection_domain = thread->privileged_stack_top()->protection_domain();
} else {
- protection_domain = InstanceKlass::cast(method->method_holder())->protection_domain();
+ protection_domain = method->method_holder()->protection_domain();
}
if ((previous_protection_domain != protection_domain) && (protection_domain != NULL)) {
@@ -1267,7 +1267,7 @@ JVM_END
JVM_QUICK_ENTRY(jboolean, JVM_IsArrayClass(JNIEnv *env, jclass cls))
JVMWrapper("JVM_IsArrayClass");
Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(cls));
- return (k != NULL) && Klass::cast(k)->oop_is_array() ? true : false;
+ return (k != NULL) && k->oop_is_array() ? true : false;
JVM_END
@@ -1293,7 +1293,7 @@ JVM_ENTRY(jint, JVM_GetClassModifiers(JNIEnv *env, jclass cls))
return JVM_ACC_ABSTRACT | JVM_ACC_FINAL | JVM_ACC_PUBLIC;
}
- Klass* k = Klass::cast(java_lang_Class::as_Klass(JNIHandles::resolve_non_null(cls)));
+ Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(cls));
debug_only(int computed_modifiers = k->compute_modifier_flags(CHECK_0));
assert(k->modifier_flags() == computed_modifiers, "modifiers cache is OK");
return k->modifier_flags();
@@ -1308,7 +1308,7 @@ JVM_ENTRY(jobjectArray, JVM_GetDeclaredClasses(JNIEnv *env, jclass ofClass))
// of an InstanceKlass
if (java_lang_Class::is_primitive(JNIHandles::resolve_non_null(ofClass)) ||
- ! Klass::cast(java_lang_Class::as_Klass(JNIHandles::resolve_non_null(ofClass)))->oop_is_instance()) {
+ ! java_lang_Class::as_Klass(JNIHandles::resolve_non_null(ofClass))->oop_is_instance()) {
oop result = oopFactory::new_objArray(SystemDictionary::Class_klass(), 0, CHECK_NULL);
return (jobjectArray)JNIHandles::make_local(env, result);
}
@@ -1372,7 +1372,7 @@ JVM_ENTRY(jclass, JVM_GetDeclaringClass(JNIEnv *env, jclass ofClass))
{
// ofClass is a reference to a java_lang_Class object.
if (java_lang_Class::is_primitive(JNIHandles::resolve_non_null(ofClass)) ||
- ! Klass::cast(java_lang_Class::as_Klass(JNIHandles::resolve_non_null(ofClass)))->oop_is_instance()) {
+ ! java_lang_Class::as_Klass(JNIHandles::resolve_non_null(ofClass))->oop_is_instance()) {
return NULL;
}
@@ -1382,7 +1382,7 @@ JVM_ENTRY(jclass, JVM_GetDeclaringClass(JNIEnv *env, jclass ofClass))
)->compute_enclosing_class(&inner_is_member, CHECK_NULL);
if (outer_klass == NULL) return NULL; // already a top-level class
if (!inner_is_member) return NULL; // an anonymous class (inside a method)
- return (jclass) JNIHandles::make_local(env, Klass::cast(outer_klass)->java_mirror());
+ return (jclass) JNIHandles::make_local(env, outer_klass->java_mirror());
}
JVM_END
@@ -1452,7 +1452,7 @@ JVM_ENTRY(jstring, JVM_GetClassSignature(JNIEnv *env, jclass cls))
// Return null for arrays and primatives
if (!java_lang_Class::is_primitive(JNIHandles::resolve(cls))) {
Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve(cls));
- if (Klass::cast(k)->oop_is_instance()) {
+ if (k->oop_is_instance()) {
Symbol* sym = InstanceKlass::cast(k)->generic_signature();
if (sym == NULL) return NULL;
Handle str = java_lang_String::create_from_symbol(sym, CHECK_NULL);
@@ -1470,7 +1470,7 @@ JVM_ENTRY(jbyteArray, JVM_GetClassAnnotations(JNIEnv *env, jclass cls))
// Return null for arrays and primitives
if (!java_lang_Class::is_primitive(JNIHandles::resolve(cls))) {
Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve(cls));
- if (Klass::cast(k)->oop_is_instance()) {
+ if (k->oop_is_instance()) {
typeArrayOop a = Annotations::make_java_array(InstanceKlass::cast(k)->class_annotations(), CHECK_NULL);
return (jbyteArray) JNIHandles::make_local(env, a);
}
@@ -1583,7 +1583,7 @@ JVM_ENTRY(jobjectArray, JVM_GetClassDeclaredFields(JNIEnv *env, jclass ofClass,
// Exclude primitive types and array types
if (java_lang_Class::is_primitive(JNIHandles::resolve_non_null(ofClass)) ||
- Klass::cast(java_lang_Class::as_Klass(JNIHandles::resolve_non_null(ofClass)))->oop_is_array()) {
+ java_lang_Class::as_Klass(JNIHandles::resolve_non_null(ofClass))->oop_is_array()) {
// Return empty array
oop res = oopFactory::new_objArray(SystemDictionary::reflect_Field_klass(), 0, CHECK_NULL);
return (jobjectArray) JNIHandles::make_local(env, res);
@@ -1646,7 +1646,7 @@ JVM_ENTRY(jobjectArray, JVM_GetClassDeclaredMethods(JNIEnv *env, jclass ofClass,
// Exclude primitive types and array types
if (java_lang_Class::is_primitive(JNIHandles::resolve_non_null(ofClass))
- || Klass::cast(java_lang_Class::as_Klass(JNIHandles::resolve_non_null(ofClass)))->oop_is_array()) {
+ || java_lang_Class::as_Klass(JNIHandles::resolve_non_null(ofClass))->oop_is_array()) {
// Return empty array
oop res = oopFactory::new_objArray(SystemDictionary::reflect_Method_klass(), 0, CHECK_NULL);
return (jobjectArray) JNIHandles::make_local(env, res);
@@ -1698,7 +1698,7 @@ JVM_ENTRY(jobjectArray, JVM_GetClassDeclaredConstructors(JNIEnv *env, jclass ofC
// Exclude primitive types and array types
if (java_lang_Class::is_primitive(JNIHandles::resolve_non_null(ofClass))
- || Klass::cast(java_lang_Class::as_Klass(JNIHandles::resolve_non_null(ofClass)))->oop_is_array()) {
+ || java_lang_Class::as_Klass(JNIHandles::resolve_non_null(ofClass))->oop_is_array()) {
// Return empty array
oop res = oopFactory::new_objArray(SystemDictionary::reflect_Constructor_klass(), 0 , CHECK_NULL);
return (jobjectArray) JNIHandles::make_local(env, res);
@@ -1751,7 +1751,7 @@ JVM_ENTRY(jint, JVM_GetClassAccessFlags(JNIEnv *env, jclass cls))
return JVM_ACC_ABSTRACT | JVM_ACC_FINAL | JVM_ACC_PUBLIC;
}
- Klass* k = Klass::cast(java_lang_Class::as_Klass(JNIHandles::resolve_non_null(cls)));
+ Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(cls));
return k->access_flags().as_int() & JVM_ACC_WRITTEN_FLAGS;
}
JVM_END
@@ -1767,7 +1767,7 @@ JVM_ENTRY(jobject, JVM_GetClassConstantPool(JNIEnv *env, jclass cls))
// Return null for primitives and arrays
if (!java_lang_Class::is_primitive(JNIHandles::resolve_non_null(cls))) {
Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(cls));
- if (Klass::cast(k)->oop_is_instance()) {
+ if (k->oop_is_instance()) {
instanceKlassHandle k_h(THREAD, k);
Handle jcp = sun_reflect_ConstantPool::create(CHECK_NULL);
sun_reflect_ConstantPool::set_cp(jcp(), k_h->constants());
@@ -2043,12 +2043,12 @@ JVM_ENTRY(jboolean, JVM_DesiredAssertionStatus(JNIEnv *env, jclass unused, jclas
if (java_lang_Class::is_primitive(r)) return false;
Klass* k = java_lang_Class::as_Klass(r);
- assert(Klass::cast(k)->oop_is_instance(), "must be an instance klass");
- if (! Klass::cast(k)->oop_is_instance()) return false;
+ assert(k->oop_is_instance(), "must be an instance klass");
+ if (! k->oop_is_instance()) return false;
ResourceMark rm(THREAD);
- const char* name = Klass::cast(k)->name()->as_C_string();
- bool system_class = Klass::cast(k)->class_loader() == NULL;
+ const char* name = k->name()->as_C_string();
+ bool system_class = k->class_loader() == NULL;
return JavaAssertions::enabled(name, system_class);
JVM_END
@@ -2079,7 +2079,7 @@ JVM_ENTRY(const char*, JVM_GetClassNameUTF(JNIEnv *env, jclass cls))
JVMWrapper("JVM_GetClassNameUTF");
Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(cls));
k = JvmtiThreadState::class_to_verify_considering_redefinition(k, thread);
- return Klass::cast(k)->name()->as_utf8();
+ return k->name()->as_utf8();
JVM_END
@@ -2089,7 +2089,7 @@ JVM_QUICK_ENTRY(void, JVM_GetClassCPTypes(JNIEnv *env, jclass cls, unsigned char
k = JvmtiThreadState::class_to_verify_considering_redefinition(k, thread);
// types will have length zero if this is not an InstanceKlass
// (length is determined by call to JVM_GetClassCPEntriesCount)
- if (Klass::cast(k)->oop_is_instance()) {
+ if (k->oop_is_instance()) {
ConstantPool* cp = InstanceKlass::cast(k)->constants();
for (int index = cp->length() - 1; index >= 0; index--) {
constantTag tag = cp->tag_at(index);
@@ -2103,7 +2103,7 @@ JVM_QUICK_ENTRY(jint, JVM_GetClassCPEntriesCount(JNIEnv *env, jclass cls))
JVMWrapper("JVM_GetClassCPEntriesCount");
Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(cls));
k = JvmtiThreadState::class_to_verify_considering_redefinition(k, thread);
- if (!Klass::cast(k)->oop_is_instance())
+ if (!k->oop_is_instance())
return 0;
return InstanceKlass::cast(k)->constants()->length();
JVM_END
@@ -2113,7 +2113,7 @@ JVM_QUICK_ENTRY(jint, JVM_GetClassFieldsCount(JNIEnv *env, jclass cls))
JVMWrapper("JVM_GetClassFieldsCount");
Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(cls));
k = JvmtiThreadState::class_to_verify_considering_redefinition(k, thread);
- if (!Klass::cast(k)->oop_is_instance())
+ if (!k->oop_is_instance())
return 0;
return InstanceKlass::cast(k)->java_fields_count();
JVM_END
@@ -2123,7 +2123,7 @@ JVM_QUICK_ENTRY(jint, JVM_GetClassMethodsCount(JNIEnv *env, jclass cls))
JVMWrapper("JVM_GetClassMethodsCount");
Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(cls));
k = JvmtiThreadState::class_to_verify_considering_redefinition(k, thread);
- if (!Klass::cast(k)->oop_is_instance())
+ if (!k->oop_is_instance())
return 0;
return InstanceKlass::cast(k)->methods()->length();
JVM_END
@@ -3048,10 +3048,10 @@ JVM_ENTRY(jclass, JVM_CurrentLoadedClass(JNIEnv *env))
Method* m = vfst.method();
if (!m->is_native()) {
- Klass* holder = m->method_holder();
- oop loader = InstanceKlass::cast(holder)->class_loader();
+ InstanceKlass* holder = m->method_holder();
+ oop loader = holder->class_loader();
if (loader != NULL && !java_lang_ClassLoader::is_trusted_loader(loader)) {
- return (jclass) JNIHandles::make_local(env, Klass::cast(holder)->java_mirror());
+ return (jclass) JNIHandles::make_local(env, holder->java_mirror());
}
}
}
@@ -3071,9 +3071,9 @@ JVM_ENTRY(jobject, JVM_CurrentClassLoader(JNIEnv *env))
Method* m = vfst.method();
if (!m->is_native()) {
- Klass* holder = m->method_holder();
+ InstanceKlass* holder = m->method_holder();
assert(holder->is_klass(), "just checking");
- oop loader = InstanceKlass::cast(holder)->class_loader();
+ oop loader = holder->class_loader();
if (loader != NULL && !java_lang_ClassLoader::is_trusted_loader(loader)) {
return JNIHandles::make_local(env, loader);
}
@@ -3123,7 +3123,7 @@ JVM_ENTRY(jobjectArray, JVM_GetClassContext(JNIEnv *env))
// Fill in mirrors corresponding to method holders
int index = 0;
while (first != NULL) {
- result->obj_at_put(index++, Klass::cast(first->klass())->java_mirror());
+ result->obj_at_put(index++, first->klass()->java_mirror());
first = first->next;
}
assert(index == depth, "just checking");
@@ -3148,9 +3148,9 @@ JVM_ENTRY(jint, JVM_ClassDepth(JNIEnv *env, jstring name))
for(vframeStream vfst(thread); !vfst.at_end(); vfst.next()) {
if (!vfst.method()->is_native()) {
- Klass* holder = vfst.method()->method_holder();
+ InstanceKlass* holder = vfst.method()->method_holder();
assert(holder->is_klass(), "just checking");
- if (InstanceKlass::cast(holder)->name() == class_name_sym) {
+ if (holder->name() == class_name_sym) {
return depth;
}
depth++;
@@ -3171,9 +3171,9 @@ JVM_ENTRY(jint, JVM_ClassLoaderDepth(JNIEnv *env))
Method* m = vfst.method();
if (!m->is_native()) {
- Klass* holder = m->method_holder();
+ InstanceKlass* holder = m->method_holder();
assert(holder->is_klass(), "just checking");
- oop loader = InstanceKlass::cast(holder)->class_loader();
+ oop loader = holder->class_loader();
if (loader != NULL && !java_lang_ClassLoader::is_trusted_loader(loader)) {
return depth;
}
@@ -3217,7 +3217,7 @@ bool force_verify_field_access(Klass* current_class, Klass* field_class, AccessF
if (access.is_protected()) {
// See if current_class is a subclass of field_class
- if (Klass::cast(current_class)->is_subclass_of(field_class)) {
+ if (current_class->is_subclass_of(field_class)) {
return true;
}
}
@@ -3241,8 +3241,8 @@ JVM_ENTRY(jobject, JVM_AllocateNewObject(JNIEnv *env, jobject receiver, jclass c
}
// Arrays not allowed here, must use JVM_AllocateNewArray
- if (Klass::cast(java_lang_Class::as_Klass(curr_mirror))->oop_is_array() ||
- Klass::cast(java_lang_Class::as_Klass(init_mirror))->oop_is_array()) {
+ if (java_lang_Class::as_Klass(curr_mirror)->oop_is_array() ||
+ java_lang_Class::as_Klass(init_mirror)->oop_is_array()) {
ResourceMark rm(THREAD);
THROW_0(vmSymbols::java_lang_InvalidClassException());
}
@@ -3264,7 +3264,7 @@ JVM_ENTRY(jobject, JVM_AllocateNewObject(JNIEnv *env, jobject receiver, jclass c
if (m.is_null()) {
ResourceMark rm(THREAD);
THROW_MSG_0(vmSymbols::java_lang_NoSuchMethodError(),
- Method::name_and_sig_as_C_string(Klass::cast(init_klass()),
+ Method::name_and_sig_as_C_string(init_klass(),
vmSymbols::object_initializer_name(),
vmSymbols::void_method_signature()));
}
@@ -3302,10 +3302,10 @@ JVM_ENTRY(jobject, JVM_AllocateNewArray(JNIEnv *env, jobject obj, jclass currCla
if (k->oop_is_typeArray()) {
// typeArray
- result = typeArrayKlass::cast(k)->allocate(length, CHECK_NULL);
+ result = TypeArrayKlass::cast(k)->allocate(length, CHECK_NULL);
} else if (k->oop_is_objArray()) {
// objArray
- objArrayKlass* oak = objArrayKlass::cast(k);
+ ObjArrayKlass* oak = ObjArrayKlass::cast(k);
oak->initialize(CHECK_NULL); // make sure class is initialized (matches Classic VM behavior)
result = oak->allocate(length, CHECK_NULL);
} else {
@@ -3322,8 +3322,7 @@ JVM_ENTRY(jobject, JVM_LatestUserDefinedLoader(JNIEnv *env))
for (vframeStream vfst(thread); !vfst.at_end(); vfst.next()) {
// UseNewReflection
vfst.skip_reflection_related_frames(); // Only needed for 1.4 reflection
- Klass* holder = vfst.method()->method_holder();
- oop loader = InstanceKlass::cast(holder)->class_loader();
+ oop loader = vfst.method()->method_holder()->class_loader();
if (loader != NULL) {
return JNIHandles::make_local(env, loader);
}
@@ -3365,9 +3364,9 @@ JVM_ENTRY(jclass, JVM_LoadClass0(JNIEnv *env, jobject receiver,
!vfst.at_end() && loader == NULL;
vfst.next()) {
if (!vfst.method()->is_native()) {
- Klass* holder = vfst.method()->method_holder();
- loader = InstanceKlass::cast(holder)->class_loader();
- protection_domain = InstanceKlass::cast(holder)->protection_domain();
+ InstanceKlass* holder = vfst.method()->method_holder();
+ loader = holder->class_loader();
+ protection_domain = holder->protection_domain();
}
}
} else {
@@ -4193,7 +4192,7 @@ JVM_ENTRY(jobjectArray, JVM_DumpThreads(JNIEnv *env, jclass threadClass, jobject
}
// check if threads is not an array of objects of Thread class
- Klass* k = objArrayKlass::cast(ah->klass())->element_klass();
+ Klass* k = ObjArrayKlass::cast(ah->klass())->element_klass();
if (k != SystemDictionary::Thread_klass()) {
THROW_(vmSymbols::java_lang_IllegalArgumentException(), 0);
}
@@ -4246,7 +4245,7 @@ JVM_ENTRY(jobjectArray, JVM_GetEnclosingMethodInfo(JNIEnv *env, jclass ofClass))
return NULL;
}
Klass* k = java_lang_Class::as_Klass(mirror());
- if (!Klass::cast(k)->oop_is_instance()) {
+ if (!k->oop_is_instance()) {
return NULL;
}
instanceKlassHandle ik_h(THREAD, k);
@@ -4257,7 +4256,7 @@ JVM_ENTRY(jobjectArray, JVM_GetEnclosingMethodInfo(JNIEnv *env, jclass ofClass))
objArrayOop dest_o = oopFactory::new_objArray(SystemDictionary::Object_klass(), 3, CHECK_NULL);
objArrayHandle dest(THREAD, dest_o);
Klass* enc_k = ik_h->constants()->klass_at(encl_method_class_idx, CHECK_NULL);
- dest->obj_at_put(0, Klass::cast(enc_k)->java_mirror());
+ dest->obj_at_put(0, enc_k->java_mirror());
int encl_method_method_idx = ik_h->enclosing_method_method_index();
if (encl_method_method_idx != 0) {
Symbol* sym = ik_h->constants()->symbol_at(
diff --git a/src/share/vm/prims/jvmti.xml b/src/share/vm/prims/jvmti.xml
index 512e3cb00..dbd6735aa 100644
--- a/src/share/vm/prims/jvmti.xml
+++ b/src/share/vm/prims/jvmti.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="ISO-8859-1"?>
<?xml-stylesheet type="text/xsl" href="jvmti.xsl"?>
<!--
- Copyright (c) 2002, 2011, Oracle and/or its affiliates. All rights reserved.
+ Copyright (c) 2002, 2012, Oracle and/or its affiliates. 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
@@ -358,7 +358,7 @@
<specification label="JVM(TM) Tool Interface"
majorversion="1"
minorversion="2"
- microversion="1">
+ microversion="2">
<title subtitle="Version">
<tm>JVM</tm> Tool Interface
</title>
@@ -405,7 +405,7 @@
interfaces are more appropriate than <jvmti/> for many tools.
For more information on the Java Platform Debugger Architecture,
see the
- <externallink id="http://java.sun.com/products/jpda/">Java
+ <externallink id="http://docs.oracle.com/javase/7/docs/technotes/guides/jpda/architecture.html">Java
Platform Debugger Architecture website</externallink>.
</intro>
@@ -693,7 +693,7 @@ Agent_OnUnload(JavaVM *vm)</example>
An agent creates a <jvmti/> environment
by passing a <jvmti/> version
as the interface ID to the JNI Invocation API function
- <externallink id="http://java.sun.com/javase/6/docs/technotes/guides/jni/spec/invocation.html#GetEnv"><code>GetEnv</code></externallink>.
+ <externallink id="http://docs.oracle.com/javase/7/docs/technotes/guides/jni/spec/invocation.html#GetEnv"><code>GetEnv</code></externallink>.
See <internallink id="jvmtiEnvAccess">Accessing <jvmti/> Functions</internallink>
for more details on the creation and use of
<jvmti/> environments.
@@ -797,7 +797,7 @@ Agent_OnUnload(JavaVM *vm)</example>
Modified UTF-8 differs
from standard UTF-8 in the representation of supplementary characters
and of the null character. See the
- <externallink id="http://java.sun.com/javase/6/docs/technotes/guides/jni/spec/types.html#wp16542">
+ <externallink id="http://docs.oracle.com/javase/7/docs/technotes/guides/jni/spec/types.html#wp16542">
Modified UTF-8 Strings</externallink>
section of the JNI specification for details.
</intro>
@@ -827,7 +827,7 @@ Agent_OnUnload(JavaVM *vm)</example>
by calling <jvmti/> functions.
Access to <jvmti/> functions is by use of an interface pointer
in the same manner as
- <externallink id="http://java.sun.com/javase/6/docs/technotes/guides/jni/spec/design.html">Java
+ <externallink id="http://docs.oracle.com/javase/7/docs/technotes/guides/jni/spec/design.html">Java
Native Interface (JNI) functions</externallink> are accessed.
The <jvmti/> interface pointer is called the
<i>environment pointer</i>.
@@ -919,7 +919,7 @@ jvmtiEnv *jvmti;
local references--these local references are created
during the <jvmti/> call.
Local references are a resource that must be managed (see the
- <externallink id="http://java.sun.com/javase/6/docs/guide/jni/spec/functions.html#wp18654">JNI Documentation</externallink>).
+ <externallink id="http://docs.oracle.com/javase/7/docs/technotes/guides/jni/spec/functions.html#wp18654">JNI Documentation</externallink>).
When threads return from native code all local references
are freed. Note that some threads, including typical
agent threads, will never return from native code.
@@ -954,7 +954,7 @@ jvmtiEnv *jvmti;
<jvmti/> function.
See the
<externallink
- id="http://java.sun.com/javase/6/docs/technotes/guides/jni/spec/design.html#wp770"
+ id="http://docs.oracle.com/javase/7/docs/technotes/guides/jni/spec/design.html#wp770"
>Java Exceptions</externallink>
section of the JNI specification for information on handling exceptions.
</intro>
@@ -2024,7 +2024,7 @@ jvmtiEnv *jvmti;
<p/>
Upon execution of <code>proc</code>, the new thread will be attached to the
VM--see the JNI documentation on
- <externallink id="http://java.sun.com/javase/6/docs/technotes/guides/jni/spec/invocation.html#wp1060"
+ <externallink id="http://docs.oracle.com/javase/7/docs/technotes/guides/jni/spec/invocation.html#wp1060"
>Attaching to the VM</externallink>.
</description>
<origin>jvmdiClone</origin>
@@ -2370,11 +2370,11 @@ jint count;
jvmtiError err;
err = (*jvmti)-&gt;GetStackTrace(jvmti, aThread, 0, 5,
- &amp;frames, &amp;count);
+ frames, &amp;count);
if (err == JVMTI_ERROR_NONE &amp;&amp; count &gt;= 1) {
char *methodName;
err = (*jvmti)-&gt;GetMethodName(jvmti, frames[0].method,
- &amp;methodName, NULL);
+ &amp;methodName, NULL, NULL);
if (err == JVMTI_ERROR_NONE) {
printf("Executing method: %s", methodName);
}
@@ -4010,7 +4010,7 @@ class C2 extends C1 implements I2 {
</inptr>
<description>
Details about the reference.
- Set when the <paramlink id="reference_kind"/> is
+ Set when the <datalink id="jvmtiHeapReferenceCallback.reference_kind">reference_kind</datalink> is
<datalink id="JVMTI_HEAP_REFERENCE_FIELD"/>,
<datalink id="JVMTI_HEAP_REFERENCE_STATIC_FIELD"/>,
<datalink id="JVMTI_HEAP_REFERENCE_ARRAY_ELEMENT"/>,
@@ -4378,7 +4378,7 @@ class C2 extends C1 implements I2 {
do not control which objects are visited but they do control which
objects and primitive values are reported by the callbacks.
For example, if the only callback that was set is
- <paramlink id="array_primitive_value_callback"/> and <code>klass</code>
+ <fieldlink id="array_primitive_value_callback" struct="jvmtiHeapCallbacks"/> and <code>klass</code>
is set to the array of bytes class, then only arrays of byte will be
reported.
The table below summarizes this:
@@ -4414,7 +4414,7 @@ class C2 extends C1 implements I2 {
</tr>
<tr>
<th align="left">
- <fieldlink id="object_reference_callback" struct="jvmtiHeapCallbacks"/>
+ <fieldlink id="array_primitive_value_callback" struct="jvmtiHeapCallbacks"/>
in <paramlink id="callbacks"/> set
</th>
<td>
@@ -4570,7 +4570,7 @@ class C2 extends C1 implements I2 {
do not control which objects are visited but they do control which
objects and primitive values are reported by the callbacks.
For example, if the only callback that was set is
- <paramlink id="array_primitive_value_callback"/> and <code>klass</code>
+ <fieldlink id="array_primitive_value_callback" struct="jvmtiHeapCallbacks"/> and <code>klass</code>
is set to the array of bytes class, then only arrays of byte will be
reported. The table below summarizes this (contrast this with
<functionlink id="FollowReferences"/>):
@@ -4606,7 +4606,7 @@ class C2 extends C1 implements I2 {
</tr>
<tr>
<th align="left">
- <fieldlink id="object_callback" struct="jvmtiHeapCallbacks"/>
+ <fieldlink id="array_primitive_value_callback" struct="jvmtiHeapCallbacks"/>
in <paramlink id="callbacks"/> set
</th>
<td>
@@ -6478,7 +6478,7 @@ class C2 extends C1 implements I2 {
<synopsis>Get Class Signature</synopsis>
<description>
For the class indicated by <code>klass</code>, return the
- <externallink id="http://java.sun.com/javase/6/docs/guide/jni/spec/types.html#wp16432">JNI
+ <externallink id="http://docs.oracle.com/javase/7/docs/technotes/guides/jni/spec/types.html#wp16432">JNI
type signature</externallink>
and the generic signature of the class.
For example, <code>java.util.List</code> is <code>"Ljava/util/List;"</code>
@@ -8763,7 +8763,7 @@ method(wrapped_foo) -> nativeImplementation(foo)</example>
Provides the ability to intercept and resend
Java Native Interface (JNI) function calls
by manipulating the JNI function table.
- See <externallink id="http://java.sun.com/javase/6/docs/guide/jni/spec/functions.html">JNI
+ See <externallink id="http://docs.oracle.com/javase/7/docs/technotes/guides/jni/spec/functions.html">JNI
Functions</externallink> in the <i>Java Native Interface Specification</i>.
<p/>
The following example illustrates intercepting the
@@ -10446,7 +10446,7 @@ myInit() {
for a class. The segment is typically a directory or JAR file.
<p/>
In the live phase the <paramlink id="segment"/> may be used to specify any platform-dependent
- path to a <externallink id="http://java.sun.com/javase/6/docs/guide/jar/jar.html">
+ path to a <externallink id="http://docs.oracle.com/javase/7/docs/technotes/guides/jar/jar.html">
JAR file</externallink>. The agent should take care that the JAR file does not
contain any classes or resources other than those to be defined by the bootstrap
class loader for the purposes of instrumentation.
@@ -10494,7 +10494,7 @@ myInit() {
for a class. The segment is typically a directory or JAR file.
<p/>
In the live phase the <paramlink id="segment"/> is a platform-dependent path to a <externallink
- id="http://java.sun.com/javase/6/docs/guide/jar/jar.html">JAR file</externallink> to be
+ id="http://docs.oracle.com/javase/7/docs/technotes/guides/jar/jar.html">JAR file</externallink> to be
searched after the system class loader unsuccessfully searches for a class. The agent should
take care that the JAR file does not contain any classes or resources other than those to be
defined by the system class loader for the purposes of instrumentation.
@@ -13128,6 +13128,12 @@ myInit() {
Unsigned 8 bits.
</description>
</basetype>
+ <basetype id="jchar">
+ <description>
+ Holds a Java programming language <code>char</code>.
+ Unsigned 16 bits.
+ </description>
+ </basetype>
<basetype id="jint">
<description>
Holds a Java programming language <code>int</code>.
@@ -13285,7 +13291,7 @@ typedef void (JNICALL *jvmtiEventVMInit)
<description>
Typedef for the JNI function table <code>JNINativeInterface</code>
defined in the
- <externallink id="http://java.sun.com/javase/6/docs/guide/jni/spec/functions.html#wp23720">JNI Specification</externallink>.
+ <externallink id="http://docs.oracle.com/javase/7/docs/technotes/guides/jni/spec/functions.html#wp23720">JNI Specification</externallink>.
The JNI reference implementation defines this with an underscore.
</description>
</basetype>
@@ -14252,6 +14258,9 @@ typedef void (JNICALL *jvmtiEventVMInit)
<change date="6 August 2006" version="1.1.102">
Add ResourceExhaustedEvent.
</change>
+ <change date="11 October 2012" version="1.2.2">
+ Fixed the "HTTP" and "Missing Anchor" errors reported by the LinkCheck tool.
+ </change>
</changehistory>
</specification>
diff --git a/src/share/vm/prims/jvmtiClassFileReconstituter.cpp b/src/share/vm/prims/jvmtiClassFileReconstituter.cpp
index 4df7e874b..e4fc052e4 100644
--- a/src/share/vm/prims/jvmtiClassFileReconstituter.cpp
+++ b/src/share/vm/prims/jvmtiClassFileReconstituter.cpp
@@ -46,7 +46,7 @@
#ifdef TARGET_ARCH_ppc
# include "bytes_ppc.hpp"
#endif
-// FIXME: add Deprecated, LVTT attributes
+// FIXME: add Deprecated attribute
// FIXME: fix Synthetic attribute
// FIXME: per Serguei, add error return handling for ConstantPool::copy_cpool_bytes()
@@ -138,6 +138,7 @@ void JvmtiClassFileReconstituter::write_code_attribute(methodHandle method) {
u2 line_num_cnt = 0;
int stackmap_len = 0;
int local_variable_table_length = 0;
+ int local_variable_type_table_length = 0;
// compute number and length of attributes
int attr_count = 0;
@@ -174,8 +175,8 @@ void JvmtiClassFileReconstituter::write_code_attribute(methodHandle method) {
}
if (method->has_localvariable_table()) {
local_variable_table_length = method->localvariable_table_length();
- ++attr_count;
if (local_variable_table_length != 0) {
+ ++attr_count;
// Compute the size of the local variable table attribute (VM stores raw):
// LocalVariableTable_attribute {
// u2 attribute_name_index;
@@ -189,6 +190,31 @@ void JvmtiClassFileReconstituter::write_code_attribute(methodHandle method) {
// u2 index;
// }
attr_size += 2 + 4 + 2 + local_variable_table_length * (2 + 2 + 2 + 2 + 2);
+
+ // Local variables with generic signatures must have LVTT entries
+ LocalVariableTableElement *elem = method->localvariable_table_start();
+ for (int idx = 0; idx < local_variable_table_length; idx++) {
+ if (elem[idx].signature_cp_index != 0) {
+ local_variable_type_table_length++;
+ }
+ }
+
+ if (local_variable_type_table_length != 0) {
+ ++attr_count;
+ // Compute the size of the local variable type table attribute (VM stores raw):
+ // LocalVariableTypeTable_attribute {
+ // u2 attribute_name_index;
+ // u4 attribute_length;
+ // u2 local_variable_type_table_length;
+ // {
+ // u2 start_pc;
+ // u2 length;
+ // u2 name_index;
+ // u2 signature_index;
+ // u2 index;
+ // }
+ attr_size += 2 + 4 + 2 + local_variable_type_table_length * (2 + 2 + 2 + 2 + 2);
+ }
}
}
@@ -205,7 +231,7 @@ void JvmtiClassFileReconstituter::write_code_attribute(methodHandle method) {
write_attribute_name_index("Code");
write_u4(size);
- write_u2(method->max_stack());
+ write_u2(method->verifier_max_stack());
write_u2(method->max_locals());
write_u4(code_size);
copy_bytecodes(method, (unsigned char*)writeable_address(code_size));
@@ -226,6 +252,9 @@ void JvmtiClassFileReconstituter::write_code_attribute(methodHandle method) {
if (local_variable_table_length != 0) {
write_local_variable_table_attribute(method, local_variable_table_length);
}
+ if (local_variable_type_table_length != 0) {
+ write_local_variable_type_table_attribute(method, local_variable_type_table_length);
+ }
}
// Write Exceptions attribute
@@ -390,7 +419,7 @@ void JvmtiClassFileReconstituter::write_line_number_table_attribute(methodHandle
}
}
-// Write LineNumberTable attribute
+// Write LocalVariableTable attribute
// JVMSpec| LocalVariableTable_attribute {
// JVMSpec| u2 attribute_name_index;
// JVMSpec| u4 attribute_length;
@@ -420,6 +449,39 @@ void JvmtiClassFileReconstituter::write_local_variable_table_attribute(methodHan
}
}
+// Write LocalVariableTypeTable attribute
+// JVMSpec| LocalVariableTypeTable_attribute {
+// JVMSpec| u2 attribute_name_index;
+// JVMSpec| u4 attribute_length;
+// JVMSpec| u2 local_variable_type_table_length;
+// JVMSpec| { u2 start_pc;
+// JVMSpec| u2 length;
+// JVMSpec| u2 name_index;
+// JVMSpec| u2 signature_index;
+// JVMSpec| u2 index;
+// JVMSpec| } local_variable_type_table[local_variable_type_table_length];
+// JVMSpec| }
+void JvmtiClassFileReconstituter::write_local_variable_type_table_attribute(methodHandle method, u2 num_entries) {
+ write_attribute_name_index("LocalVariableTypeTable");
+ write_u4(2 + num_entries * (2 + 2 + 2 + 2 + 2));
+ write_u2(num_entries);
+
+ LocalVariableTableElement *elem = method->localvariable_table_start();
+ for (int j=0; j<method->localvariable_table_length(); j++) {
+ if (elem->signature_cp_index > 0) {
+ // Local variable has a generic signature - write LVTT attribute entry
+ write_u2(elem->start_bci);
+ write_u2(elem->length);
+ write_u2(elem->name_cp_index);
+ write_u2(elem->signature_cp_index);
+ write_u2(elem->slot);
+ num_entries--;
+ }
+ elem++;
+ }
+ assert(num_entries == 0, "just checking");
+}
+
// Write stack map table attribute
// JSR-202| StackMapTable_attribute {
// JSR-202| u2 attribute_name_index;
@@ -694,7 +756,7 @@ void JvmtiClassFileReconstituter::copy_bytecodes(methodHandle mh,
unsigned char* p = bytecodes;
Bytecodes::Code code;
- bool is_rewritten = InstanceKlass::cast(mh->method_holder())->is_rewritten();
+ bool is_rewritten = mh->method_holder()->is_rewritten();
while ((code = bs.next()) >= 0) {
assert(Bytecodes::is_java_code(code), "sanity check");
diff --git a/src/share/vm/prims/jvmtiClassFileReconstituter.hpp b/src/share/vm/prims/jvmtiClassFileReconstituter.hpp
index 0904d17fa..365bcd756 100644
--- a/src/share/vm/prims/jvmtiClassFileReconstituter.hpp
+++ b/src/share/vm/prims/jvmtiClassFileReconstituter.hpp
@@ -120,6 +120,7 @@ class JvmtiClassFileReconstituter : public JvmtiConstantPoolReconstituter {
u2 line_number_table_entries(methodHandle method);
void write_line_number_table_attribute(methodHandle method, u2 num_entries);
void write_local_variable_table_attribute(methodHandle method, u2 num_entries);
+ void write_local_variable_type_table_attribute(methodHandle method, u2 num_entries);
void write_stackmap_table_attribute(methodHandle method, int stackmap_table_len);
u2 inner_classes_attribute_length();
void write_inner_classes_attribute(int length);
diff --git a/src/share/vm/prims/jvmtiCodeBlobEvents.cpp b/src/share/vm/prims/jvmtiCodeBlobEvents.cpp
index 3a9a4ea1c..c46afdc10 100644
--- a/src/share/vm/prims/jvmtiCodeBlobEvents.cpp
+++ b/src/share/vm/prims/jvmtiCodeBlobEvents.cpp
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 2012, Oracle and/or its affiliates. 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
diff --git a/src/share/vm/prims/jvmtiEnter.xsl b/src/share/vm/prims/jvmtiEnter.xsl
index 6b867e676..a1d128b13 100644
--- a/src/share/vm/prims/jvmtiEnter.xsl
+++ b/src/share/vm/prims/jvmtiEnter.xsl
@@ -1,6 +1,6 @@
<?xml version="1.0"?>
<!--
- Copyright (c) 2002, 2012, Oracle and/or its affiliates. All rights reserved.
+ Copyright (c) 2002, 2010, Oracle and/or its affiliates. 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
@@ -37,6 +37,8 @@
<xsl:call-template name="sourceHeader"/>
<xsl:text>
# include "precompiled.hpp"
+# include "utilities/macros.hpp"
+#if INCLUDE_JVMTI
# include "prims/jvmtiEnter.hpp"
# include "prims/jvmtiRawMonitor.hpp"
# include "prims/jvmtiUtil.hpp"
@@ -247,6 +249,7 @@ struct jvmtiInterface_1_ jvmti</xsl:text>
<xsl:text>
};
+#endif // INCLUDE_JVMTI
</xsl:text>
</xsl:template>
@@ -469,7 +472,7 @@ static jvmtiError JNICALL
</xsl:text>
<xsl:if test="not(contains(@jkernel,'yes'))">
- <xsl:text>&#xA;#ifdef JVMTI_KERNEL &#xA;</xsl:text>
+ <xsl:text>&#xA;#if !INCLUDE_JVMTI &#xA;</xsl:text>
<xsl:text> return JVMTI_ERROR_NOT_AVAILABLE; &#xA;</xsl:text>
<xsl:text>#else &#xA;</xsl:text>
</xsl:if>
@@ -596,7 +599,7 @@ static jvmtiError JNICALL
</xsl:text>
<xsl:if test="not(contains(@jkernel,'yes'))">
- <xsl:text>#endif // JVMTI_KERNEL&#xA;</xsl:text>
+ <xsl:text>#endif // INCLUDE_JVMTI&#xA;</xsl:text>
</xsl:if>
<xsl:text>}&#xA;</xsl:text>
diff --git a/src/share/vm/prims/jvmtiEnv.cpp b/src/share/vm/prims/jvmtiEnv.cpp
index b0fe73ed8..cb3b3db1e 100644
--- a/src/share/vm/prims/jvmtiEnv.cpp
+++ b/src/share/vm/prims/jvmtiEnv.cpp
@@ -53,24 +53,12 @@
#include "runtime/osThread.hpp"
#include "runtime/reflectionUtils.hpp"
#include "runtime/signature.hpp"
+#include "runtime/thread.inline.hpp"
#include "runtime/vframe.hpp"
#include "runtime/vmThread.hpp"
#include "services/threadService.hpp"
#include "utilities/exceptions.hpp"
#include "utilities/preserveException.hpp"
-#ifdef TARGET_OS_FAMILY_linux
-# include "thread_linux.inline.hpp"
-#endif
-#ifdef TARGET_OS_FAMILY_solaris
-# include "thread_solaris.inline.hpp"
-#endif
-#ifdef TARGET_OS_FAMILY_windows
-# include "thread_windows.inline.hpp"
-#endif
-#ifdef TARGET_OS_FAMILY_bsd
-# include "thread_bsd.inline.hpp"
-#endif
-
#define FIXLATER 0 // REMOVE this when completed.
@@ -2116,7 +2104,7 @@ JvmtiEnv::GetClassSignature(oop k_mirror, char** signature_ptr, char** generic_p
result[0] = tchar;
result[1] = '\0';
} else {
- const char* class_sig = Klass::cast(k)->signature_name();
+ const char* class_sig = k->signature_name();
result = (char *) jvmtiMalloc(strlen(class_sig)+1);
strcpy(result, class_sig);
}
@@ -2124,7 +2112,7 @@ JvmtiEnv::GetClassSignature(oop k_mirror, char** signature_ptr, char** generic_p
}
if (generic_ptr != NULL) {
*generic_ptr = NULL;
- if (!isPrimitive && Klass::cast(k)->oop_is_instance()) {
+ if (!isPrimitive && k->oop_is_instance()) {
Symbol* soo = InstanceKlass::cast(k)->generic_signature();
if (soo != NULL) {
const char *gen_sig = soo->as_C_string();
@@ -2155,7 +2143,7 @@ JvmtiEnv::GetClassStatus(oop k_mirror, jint* status_ptr) {
} else {
Klass* k = java_lang_Class::as_Klass(k_mirror);
NULL_CHECK(k, JVMTI_ERROR_INVALID_CLASS);
- result = Klass::cast(k)->jvmti_class_status();
+ result = k->jvmti_class_status();
}
*status_ptr = result;
@@ -2173,7 +2161,7 @@ JvmtiEnv::GetSourceFileName(oop k_mirror, char** source_name_ptr) {
Klass* k_klass = java_lang_Class::as_Klass(k_mirror);
NULL_CHECK(k_klass, JVMTI_ERROR_INVALID_CLASS);
- if (!Klass::cast(k_klass)->oop_is_instance()) {
+ if (!k_klass->oop_is_instance()) {
return JVMTI_ERROR_ABSENT_INFORMATION;
}
@@ -2200,7 +2188,7 @@ JvmtiEnv::GetClassModifiers(oop k_mirror, jint* modifiers_ptr) {
if (!java_lang_Class::is_primitive(k_mirror)) {
Klass* k = java_lang_Class::as_Klass(k_mirror);
NULL_CHECK(k, JVMTI_ERROR_INVALID_CLASS);
- result = Klass::cast(k)->compute_modifier_flags(current_thread);
+ result = k->compute_modifier_flags(current_thread);
JavaThread* THREAD = current_thread; // pass to macros
if (HAS_PENDING_EXCEPTION) {
CLEAR_PENDING_EXCEPTION;
@@ -2208,7 +2196,7 @@ JvmtiEnv::GetClassModifiers(oop k_mirror, jint* modifiers_ptr) {
};
// Reset the deleted ACC_SUPER bit ( deleted in compute_modifier_flags()).
- if(Klass::cast(k)->is_super()) {
+ if(k->is_super()) {
result |= JVM_ACC_SUPER;
}
} else {
@@ -2237,11 +2225,11 @@ JvmtiEnv::GetClassMethods(oop k_mirror, jint* method_count_ptr, jmethodID** meth
NULL_CHECK(k, JVMTI_ERROR_INVALID_CLASS);
// Return CLASS_NOT_PREPARED error as per JVMTI spec.
- if (!(Klass::cast(k)->jvmti_class_status() & (JVMTI_CLASS_STATUS_PREPARED|JVMTI_CLASS_STATUS_ARRAY) )) {
+ if (!(k->jvmti_class_status() & (JVMTI_CLASS_STATUS_PREPARED|JVMTI_CLASS_STATUS_ARRAY) )) {
return JVMTI_ERROR_CLASS_NOT_PREPARED;
}
- if (!Klass::cast(k)->oop_is_instance()) {
+ if (!k->oop_is_instance()) {
*method_count_ptr = 0;
*methods_ptr = (jmethodID*) jvmtiMalloc(0 * sizeof(jmethodID));
return JVMTI_ERROR_NONE;
@@ -2293,11 +2281,11 @@ JvmtiEnv::GetClassFields(oop k_mirror, jint* field_count_ptr, jfieldID** fields_
NULL_CHECK(k, JVMTI_ERROR_INVALID_CLASS);
// Return CLASS_NOT_PREPARED error as per JVMTI spec.
- if (!(Klass::cast(k)->jvmti_class_status() & (JVMTI_CLASS_STATUS_PREPARED|JVMTI_CLASS_STATUS_ARRAY) )) {
+ if (!(k->jvmti_class_status() & (JVMTI_CLASS_STATUS_PREPARED|JVMTI_CLASS_STATUS_ARRAY) )) {
return JVMTI_ERROR_CLASS_NOT_PREPARED;
}
- if (!Klass::cast(k)->oop_is_instance()) {
+ if (!k->oop_is_instance()) {
*field_count_ptr = 0;
*fields_ptr = (jfieldID*) jvmtiMalloc(0 * sizeof(jfieldID));
return JVMTI_ERROR_NONE;
@@ -2348,10 +2336,10 @@ JvmtiEnv::GetImplementedInterfaces(oop k_mirror, jint* interface_count_ptr, jcla
NULL_CHECK(k, JVMTI_ERROR_INVALID_CLASS);
// Return CLASS_NOT_PREPARED error as per JVMTI spec.
- if (!(Klass::cast(k)->jvmti_class_status() & (JVMTI_CLASS_STATUS_PREPARED|JVMTI_CLASS_STATUS_ARRAY) ))
+ if (!(k->jvmti_class_status() & (JVMTI_CLASS_STATUS_PREPARED|JVMTI_CLASS_STATUS_ARRAY) ))
return JVMTI_ERROR_CLASS_NOT_PREPARED;
- if (!Klass::cast(k)->oop_is_instance()) {
+ if (!k->oop_is_instance()) {
*interface_count_ptr = 0;
*interfaces_ptr = (jclass*) jvmtiMalloc(0 * sizeof(jclass));
return JVMTI_ERROR_NONE;
@@ -2363,8 +2351,8 @@ JvmtiEnv::GetImplementedInterfaces(oop k_mirror, jint* interface_count_ptr, jcla
for (int i_index = 0; i_index < result_length; i_index += 1) {
Klass* klass_at = interface_list->at(i_index);
assert(klass_at->is_klass(), "interfaces must be Klass*s");
- assert(Klass::cast(klass_at)->is_interface(), "interfaces must be interfaces");
- oop mirror_at = Klass::cast(klass_at)->java_mirror();
+ assert(klass_at->is_interface(), "interfaces must be interfaces");
+ oop mirror_at = klass_at->java_mirror();
Handle handle_at = Handle(current_thread, mirror_at);
result_list[i_index] = (jclass) jni_reference(handle_at);
}
@@ -2468,7 +2456,7 @@ JvmtiEnv::IsInterface(oop k_mirror, jboolean* is_interface_ptr) {
bool result = false;
if (!java_lang_Class::is_primitive(k_mirror)) {
Klass* k = java_lang_Class::as_Klass(k_mirror);
- if (k != NULL && Klass::cast(k)->is_interface()) {
+ if (k != NULL && k->is_interface()) {
result = true;
}
}
@@ -2487,7 +2475,7 @@ JvmtiEnv::IsArrayClass(oop k_mirror, jboolean* is_array_class_ptr) {
bool result = false;
if (!java_lang_Class::is_primitive(k_mirror)) {
Klass* k = java_lang_Class::as_Klass(k_mirror);
- if (k != NULL && Klass::cast(k)->oop_is_array()) {
+ if (k != NULL && k->oop_is_array()) {
result = true;
}
}
@@ -2512,7 +2500,7 @@ JvmtiEnv::GetClassLoader(oop k_mirror, jobject* classloader_ptr) {
Klass* k = java_lang_Class::as_Klass(k_mirror);
NULL_CHECK(k, JVMTI_ERROR_INVALID_CLASS);
- oop result_oop = Klass::cast(k)->class_loader();
+ oop result_oop = k->class_loader();
if (result_oop == NULL) {
*classloader_ptr = (jclass) jni_reference(Handle());
return JVMTI_ERROR_NONE;
@@ -2535,7 +2523,7 @@ JvmtiEnv::GetSourceDebugExtension(oop k_mirror, char** source_debug_extension_pt
}
Klass* k = java_lang_Class::as_Klass(k_mirror);
NULL_CHECK(k, JVMTI_ERROR_INVALID_CLASS);
- if (!Klass::cast(k)->oop_is_instance()) {
+ if (!k->oop_is_instance()) {
return JVMTI_ERROR_ABSENT_INFORMATION;
}
char* sde = InstanceKlass::cast(k)->source_debug_extension();
@@ -2822,7 +2810,7 @@ JvmtiEnv::GetLocalVariableTable(Method* method_oop, jint* entry_count_ptr, jvmti
JavaThread* current_thread = JavaThread::current();
// does the klass have any local variable information?
- InstanceKlass* ik = InstanceKlass::cast(method_oop->method_holder());
+ InstanceKlass* ik = method_oop->method_holder();
if (!ik->access_flags().has_localvariable_table()) {
return (JVMTI_ERROR_ABSENT_INFORMATION);
}
diff --git a/src/share/vm/prims/jvmtiEnvBase.cpp b/src/share/vm/prims/jvmtiEnvBase.cpp
index d6924fc42..eed312681 100644
--- a/src/share/vm/prims/jvmtiEnvBase.cpp
+++ b/src/share/vm/prims/jvmtiEnvBase.cpp
@@ -590,7 +590,7 @@ JvmtiEnvBase::vframeFor(JavaThread* java_thread, jint depth) {
jclass
JvmtiEnvBase::get_jni_class_non_null(Klass* k) {
assert(k != NULL, "k != NULL");
- return (jclass)jni_reference(Klass::cast(k)->java_mirror());
+ return (jclass)jni_reference(k->java_mirror());
}
#ifndef JVMTI_KERNEL
@@ -1365,7 +1365,7 @@ JvmtiEnvBase::check_top_frame(JavaThread* current_thread, JavaThread* java_threa
// Method return type signature.
char* ty_sign = 1 + strchr(signature->as_C_string(), ')');
- if (!VM_GetOrSetLocal::is_assignable(ty_sign, Klass::cast(ob_kh()), current_thread)) {
+ if (!VM_GetOrSetLocal::is_assignable(ty_sign, ob_kh(), current_thread)) {
return JVMTI_ERROR_TYPE_MISMATCH;
}
*ret_ob_h = ob_h;
diff --git a/src/share/vm/prims/jvmtiEnvBase.hpp b/src/share/vm/prims/jvmtiEnvBase.hpp
index 669b7d511..d7b7d7cf6 100644
--- a/src/share/vm/prims/jvmtiEnvBase.hpp
+++ b/src/share/vm/prims/jvmtiEnvBase.hpp
@@ -56,7 +56,9 @@ class JvmtiEnvBase : public CHeapObj<mtInternal> {
private:
+#if INCLUDE_JVMTI
static JvmtiEnvBase* _head_environment; // head of environment list
+#endif // INCLUDE_JVMTI
static bool _globally_initialized;
static jvmtiPhase _phase;
@@ -67,7 +69,7 @@ class JvmtiEnvBase : public CHeapObj<mtInternal> {
enum {
JDK15_JVMTI_VERSION = JVMTI_VERSION_1_0 + 33, /* version: 1.0.33 */
JDK16_JVMTI_VERSION = JVMTI_VERSION_1_1 + 102, /* version: 1.1.102 */
- JDK17_JVMTI_VERSION = JVMTI_VERSION_1_2 + 1 /* version: 1.2.1 */
+ JDK17_JVMTI_VERSION = JVMTI_VERSION_1_2 + 2 /* version: 1.2.2 */
};
static jvmtiPhase get_phase() { return _phase; }
@@ -129,7 +131,10 @@ class JvmtiEnvBase : public CHeapObj<mtInternal> {
friend class JvmtiEnvIterator;
JvmtiEnv* next_environment() { return (JvmtiEnv*)_next; }
void set_next_environment(JvmtiEnvBase* env) { _next = env; }
- static JvmtiEnv* head_environment() { return (JvmtiEnv*)_head_environment; }
+ static JvmtiEnv* head_environment() {
+ JVMTI_ONLY(return (JvmtiEnv*)_head_environment);
+ NOT_JVMTI(return NULL);
+ }
public:
diff --git a/src/share/vm/prims/jvmtiExport.cpp b/src/share/vm/prims/jvmtiExport.cpp
index 40e8e2115..9674cdce5 100644
--- a/src/share/vm/prims/jvmtiExport.cpp
+++ b/src/share/vm/prims/jvmtiExport.cpp
@@ -196,7 +196,7 @@ public:
jobject to_jobject(oop obj) { return JNIHandles::make_local(_thread,obj); }
#endif
- jclass to_jclass(Klass* klass) { return (klass == NULL ? NULL : (jclass)to_jobject(Klass::cast(klass)->java_mirror())); }
+ jclass to_jclass(Klass* klass) { return (klass == NULL ? NULL : (jclass)to_jobject(klass->java_mirror())); }
jmethodID to_jmethodID(methodHandle method) { return method->jmethod_id(); }
@@ -920,7 +920,7 @@ void JvmtiExport::post_class_load(JavaThread *thread, Klass* klass) {
if (ets->is_enabled(JVMTI_EVENT_CLASS_LOAD)) {
EVT_TRACE(JVMTI_EVENT_CLASS_LOAD, ("JVMTI [%s] Evt Class Load sent %s",
JvmtiTrace::safe_get_thread_name(thread),
- kh()==NULL? "NULL" : Klass::cast(kh())->external_name() ));
+ kh()==NULL? "NULL" : kh()->external_name() ));
JvmtiEnv *env = ets->get_env();
JvmtiClassEventMark jem(thread, kh());
@@ -949,7 +949,7 @@ void JvmtiExport::post_class_prepare(JavaThread *thread, Klass* klass) {
if (ets->is_enabled(JVMTI_EVENT_CLASS_PREPARE)) {
EVT_TRACE(JVMTI_EVENT_CLASS_PREPARE, ("JVMTI [%s] Evt Class Prepare sent %s",
JvmtiTrace::safe_get_thread_name(thread),
- kh()==NULL? "NULL" : Klass::cast(kh())->external_name() ));
+ kh()==NULL? "NULL" : kh()->external_name() ));
JvmtiEnv *env = ets->get_env();
JvmtiClassEventMark jem(thread, kh());
@@ -979,12 +979,12 @@ void JvmtiExport::post_class_unload(Klass* klass) {
for (JvmtiEnv* env = it.first(); env != NULL; env = it.next(env)) {
if (env->is_enabled((jvmtiEvent)EXT_EVENT_CLASS_UNLOAD)) {
EVT_TRACE(EXT_EVENT_CLASS_UNLOAD, ("JVMTI [?] Evt Class Unload sent %s",
- kh()==NULL? "NULL" : Klass::cast(kh())->external_name() ));
+ kh()==NULL? "NULL" : kh()->external_name() ));
// do everything manually, since this is a proxy - needs special care
JNIEnv* jni_env = real_thread->jni_environment();
jthread jt = (jthread)JNIHandles::make_local(real_thread, real_thread->threadObj());
- jclass jk = (jclass)JNIHandles::make_local(real_thread, Klass::cast(kh())->java_mirror());
+ jclass jk = (jclass)JNIHandles::make_local(real_thread, kh()->java_mirror());
// Before we call the JVMTI agent, we have to set the state in the
// thread for which we are proxying.
@@ -2121,7 +2121,7 @@ void JvmtiExport::post_vm_object_alloc(JavaThread *thread, oop object) {
if (env->is_enabled(JVMTI_EVENT_VM_OBJECT_ALLOC)) {
EVT_TRACE(JVMTI_EVENT_VM_OBJECT_ALLOC, ("JVMTI [%s] Evt vmobject alloc sent %s",
JvmtiTrace::safe_get_thread_name(thread),
- object==NULL? "NULL" : Klass::cast(java_lang_Class::as_Klass(object))->external_name()));
+ object==NULL? "NULL" : java_lang_Class::as_Klass(object)->external_name()));
JvmtiVMObjectAllocEventMark jem(thread, h());
JvmtiJavaThreadEventTransition jet(thread);
@@ -2177,7 +2177,7 @@ extern "C" {
jint JvmtiExport::load_agent_library(AttachOperation* op, outputStream* st) {
char ebuf[1024];
char buffer[JVM_MAXPATHLEN];
- void* library;
+ void* library = NULL;
jint result = JNI_ERR;
// get agent name and options
@@ -2196,13 +2196,16 @@ jint JvmtiExport::load_agent_library(AttachOperation* op, outputStream* st) {
library = os::dll_load(agent, ebuf, sizeof ebuf);
} else {
// Try to load the agent from the standard dll directory
- os::dll_build_name(buffer, sizeof(buffer), Arguments::get_dll_dir(), agent);
- library = os::dll_load(buffer, ebuf, sizeof ebuf);
+ if (os::dll_build_name(buffer, sizeof(buffer), Arguments::get_dll_dir(),
+ agent)) {
+ library = os::dll_load(buffer, ebuf, sizeof ebuf);
+ }
if (library == NULL) {
// not found - try local path
char ns[1] = {0};
- os::dll_build_name(buffer, sizeof(buffer), ns, agent);
- library = os::dll_load(buffer, ebuf, sizeof ebuf);
+ if (os::dll_build_name(buffer, sizeof(buffer), ns, agent)) {
+ library = os::dll_load(buffer, ebuf, sizeof ebuf);
+ }
}
}
diff --git a/src/share/vm/prims/jvmtiExport.hpp b/src/share/vm/prims/jvmtiExport.hpp
index 31581a766..1100d5269 100644
--- a/src/share/vm/prims/jvmtiExport.hpp
+++ b/src/share/vm/prims/jvmtiExport.hpp
@@ -46,28 +46,29 @@ class JvmtiEnv;
class JvmtiThreadState;
class AttachOperation;
-#ifndef JVMTI_KERNEL
-#define JVMTI_SUPPORT_FLAG(key) \
- private: \
- static bool _##key; \
- public: \
- inline static void set_##key(bool on) { _##key = (on != 0); } \
- inline static bool key() { return _##key; }
-#else // JVMTI_KERNEL
#define JVMTI_SUPPORT_FLAG(key) \
private: \
- const static bool _##key = false; \
+ static bool _##key; \
public: \
- inline static void set_##key(bool on) { report_unsupported(on); } \
- inline static bool key() { return _##key; }
-#endif // JVMTI_KERNEL
+ inline static void set_##key(bool on) { \
+ JVMTI_ONLY(_##key = (on != 0)); \
+ NOT_JVMTI(report_unsupported(on)); \
+ } \
+ inline static bool key() { \
+ JVMTI_ONLY(return _##key); \
+ NOT_JVMTI(return false); \
+ }
// This class contains the JVMTI interface for the rest of hotspot.
//
class JvmtiExport : public AllStatic {
friend class VMStructs;
+ friend class CompileReplay;
+
private:
+
+#if INCLUDE_JVMTI
static int _field_access_count;
static int _field_modification_count;
@@ -75,6 +76,7 @@ class JvmtiExport : public AllStatic {
static bool _can_hotswap_or_post_breakpoint;
static bool _can_modify_any_class;
static bool _can_walk_any_space;
+#endif // INCLUDE_JVMTI
JVMTI_SUPPORT_FLAG(can_get_source_debug_extension)
JVMTI_SUPPORT_FLAG(can_maintain_original_method_order)
@@ -125,10 +127,18 @@ class JvmtiExport : public AllStatic {
// these should only be called by the friend class
friend class JvmtiManageCapabilities;
- inline static void set_can_modify_any_class(bool on) { _can_modify_any_class = (on != 0); }
- inline static void set_can_access_local_variables(bool on) { _can_access_local_variables = (on != 0); }
- inline static void set_can_hotswap_or_post_breakpoint(bool on) { _can_hotswap_or_post_breakpoint = (on != 0); }
- inline static void set_can_walk_any_space(bool on) { _can_walk_any_space = (on != 0); }
+ inline static void set_can_modify_any_class(bool on) {
+ JVMTI_ONLY(_can_modify_any_class = (on != 0);)
+ }
+ inline static void set_can_access_local_variables(bool on) {
+ JVMTI_ONLY(_can_access_local_variables = (on != 0);)
+ }
+ inline static void set_can_hotswap_or_post_breakpoint(bool on) {
+ JVMTI_ONLY(_can_hotswap_or_post_breakpoint = (on != 0);)
+ }
+ inline static void set_can_walk_any_space(bool on) {
+ JVMTI_ONLY(_can_walk_any_space = (on != 0);)
+ }
enum {
JVMTI_VERSION_MASK = 0x70000000,
@@ -144,7 +154,7 @@ class JvmtiExport : public AllStatic {
// posts a DynamicCodeGenerated event (internal/private implementation).
// The public post_dynamic_code_generated* functions make use of the
// internal implementation. Also called from JvmtiDeferredEvent::post()
- static void post_dynamic_code_generated_internal(const char *name, const void *code_begin, const void *code_end) KERNEL_RETURN;
+ static void post_dynamic_code_generated_internal(const char *name, const void *code_begin, const void *code_end) NOT_JVMTI_RETURN;
private:
@@ -154,9 +164,9 @@ class JvmtiExport : public AllStatic {
static void post_compiled_method_load(JvmtiEnv* env, const jmethodID method, const jint length,
const void *code_begin, const jint map_length,
- const jvmtiAddrLocationMap* map) KERNEL_RETURN;
+ const jvmtiAddrLocationMap* map) NOT_JVMTI_RETURN;
static void post_dynamic_code_generated(JvmtiEnv* env, const char *name, const void *code_begin,
- const void *code_end) KERNEL_RETURN;
+ const void *code_end) NOT_JVMTI_RETURN;
// The RedefineClasses() API breaks some invariants in the "regular"
// system. For example, there are sanity checks when GC'ing nmethods
@@ -178,9 +188,8 @@ class JvmtiExport : public AllStatic {
static bool _has_redefined_a_class;
friend class VM_RedefineClasses;
inline static void set_has_redefined_a_class() {
- _has_redefined_a_class = true;
+ JVMTI_ONLY(_has_redefined_a_class = true;)
}
-
// Flag to indicate if the compiler has recorded all dependencies. When the
// can_redefine_classes capability is enabled in the OnLoad phase then the compiler
// records all dependencies from startup. However if the capability is first
@@ -191,7 +200,8 @@ class JvmtiExport : public AllStatic {
public:
inline static bool has_redefined_a_class() {
- return _has_redefined_a_class;
+ JVMTI_ONLY(return _has_redefined_a_class);
+ NOT_JVMTI(return false);
}
inline static bool all_dependencies_are_recorded() {
@@ -204,120 +214,141 @@ class JvmtiExport : public AllStatic {
// let JVMTI know that the JVM_OnLoad code is running
- static void enter_onload_phase();
+ static void enter_onload_phase() NOT_JVMTI_RETURN;
// let JVMTI know that the VM isn't up yet (and JVM_OnLoad code isn't running)
- static void enter_primordial_phase();
+ static void enter_primordial_phase() NOT_JVMTI_RETURN;
// let JVMTI know that the VM isn't up yet but JNI is live
- static void enter_start_phase();
+ static void enter_start_phase() NOT_JVMTI_RETURN;
// let JVMTI know that the VM is fully up and running now
- static void enter_live_phase();
+ static void enter_live_phase() NOT_JVMTI_RETURN;
// ------ can_* conditions (below) are set at OnLoad and never changed ------------
- inline static bool can_modify_any_class() { return _can_modify_any_class; }
- inline static bool can_access_local_variables() { return _can_access_local_variables; }
- inline static bool can_hotswap_or_post_breakpoint() { return _can_hotswap_or_post_breakpoint; }
- inline static bool can_walk_any_space() { return _can_walk_any_space; }
+ inline static bool can_modify_any_class() {
+ JVMTI_ONLY(return _can_modify_any_class);
+ NOT_JVMTI(return false);
+ }
+ inline static bool can_access_local_variables() {
+ JVMTI_ONLY(return _can_access_local_variables);
+ NOT_JVMTI(return false);
+ }
+ inline static bool can_hotswap_or_post_breakpoint() {
+ JVMTI_ONLY(return _can_hotswap_or_post_breakpoint);
+ NOT_JVMTI(return false);
+ }
+ inline static bool can_walk_any_space() {
+ JVMTI_ONLY(return _can_walk_any_space);
+ NOT_JVMTI(return false);
+ }
// field access management
- static address get_field_access_count_addr();
+ static address get_field_access_count_addr() NOT_JVMTI_RETURN_(0);
// field modification management
- static address get_field_modification_count_addr();
+ static address get_field_modification_count_addr() NOT_JVMTI_RETURN_(0);
// -----------------
- 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 bool is_jvmti_version(jint version) {
+ JVMTI_ONLY(return (version & JVMTI_VERSION_MASK) == JVMTI_VERSION_VALUE);
+ NOT_JVMTI(return false);
+ }
+ static bool is_jvmdi_version(jint version) {
+ JVMTI_ONLY(return (version & JVMTI_VERSION_MASK) == JVMDI_VERSION_VALUE);
+ NOT_JVMTI(return false);
+ }
+ static jint get_jvmti_interface(JavaVM *jvm, void **penv, jint version) NOT_JVMTI_RETURN_(0);
static void decode_version_values(jint version, int * major, int * minor,
- int * micro);
+ int * micro) NOT_JVMTI_RETURN;
// single stepping management methods
- static void at_single_stepping_point(JavaThread *thread, Method* method, address location) KERNEL_RETURN;
- static void expose_single_stepping(JavaThread *thread) KERNEL_RETURN;
- static bool hide_single_stepping(JavaThread *thread) KERNEL_RETURN_(false);
+ static void at_single_stepping_point(JavaThread *thread, Method* method, address location) NOT_JVMTI_RETURN;
+ static void expose_single_stepping(JavaThread *thread) NOT_JVMTI_RETURN;
+ static bool hide_single_stepping(JavaThread *thread) NOT_JVMTI_RETURN_(false);
// Methods that notify the debugger that something interesting has happened in the VM.
- static void post_vm_start ();
- static void post_vm_initialized ();
- static void post_vm_death ();
+ static void post_vm_start () NOT_JVMTI_RETURN;
+ static void post_vm_initialized () NOT_JVMTI_RETURN;
+ static void post_vm_death () NOT_JVMTI_RETURN;
- static void post_single_step (JavaThread *thread, Method* method, address location) KERNEL_RETURN;
- static void post_raw_breakpoint (JavaThread *thread, Method* method, address location) KERNEL_RETURN;
+ static void post_single_step (JavaThread *thread, Method* method, address location) NOT_JVMTI_RETURN;
+ static void post_raw_breakpoint (JavaThread *thread, Method* method, address location) NOT_JVMTI_RETURN;
- static void post_exception_throw (JavaThread *thread, Method* method, address location, oop exception) KERNEL_RETURN;
- static void notice_unwind_due_to_exception (JavaThread *thread, Method* method, address location, oop exception, bool in_handler_frame) KERNEL_RETURN;
+ static void post_exception_throw (JavaThread *thread, Method* method, address location, oop exception) NOT_JVMTI_RETURN;
+ static void notice_unwind_due_to_exception (JavaThread *thread, Method* method, address location, oop exception, bool in_handler_frame) NOT_JVMTI_RETURN;
static oop jni_GetField_probe (JavaThread *thread, jobject jobj,
oop obj, Klass* klass, jfieldID fieldID, bool is_static)
- KERNEL_RETURN_(NULL);
+ NOT_JVMTI_RETURN_(NULL);
static oop jni_GetField_probe_nh (JavaThread *thread, jobject jobj,
oop obj, Klass* klass, jfieldID fieldID, bool is_static)
- KERNEL_RETURN_(NULL);
+ NOT_JVMTI_RETURN_(NULL);
static void post_field_access_by_jni (JavaThread *thread, oop obj,
- Klass* klass, jfieldID fieldID, bool is_static) KERNEL_RETURN;
+ Klass* klass, jfieldID fieldID, bool is_static) NOT_JVMTI_RETURN;
static void post_field_access (JavaThread *thread, Method* method,
- address location, KlassHandle field_klass, Handle object, jfieldID field) KERNEL_RETURN;
+ address location, KlassHandle field_klass, Handle object, jfieldID field) NOT_JVMTI_RETURN;
static oop jni_SetField_probe (JavaThread *thread, jobject jobj,
oop obj, Klass* klass, jfieldID fieldID, bool is_static, char sig_type,
- jvalue *value) KERNEL_RETURN_(NULL);
+ jvalue *value) NOT_JVMTI_RETURN_(NULL);
static oop jni_SetField_probe_nh (JavaThread *thread, jobject jobj,
oop obj, Klass* klass, jfieldID fieldID, bool is_static, char sig_type,
- jvalue *value) KERNEL_RETURN_(NULL);
+ jvalue *value) NOT_JVMTI_RETURN_(NULL);
static void post_field_modification_by_jni(JavaThread *thread, oop obj,
Klass* klass, jfieldID fieldID, bool is_static, char sig_type,
jvalue *value);
static void post_raw_field_modification(JavaThread *thread, Method* method,
address location, KlassHandle field_klass, Handle object, jfieldID field,
- char sig_type, jvalue *value) KERNEL_RETURN;
+ char sig_type, jvalue *value) NOT_JVMTI_RETURN;
- static void post_method_entry (JavaThread *thread, Method* method, frame current_frame) KERNEL_RETURN;
- static void post_method_exit (JavaThread *thread, Method* method, frame current_frame) KERNEL_RETURN;
+ static void post_method_entry (JavaThread *thread, Method* method, frame current_frame) NOT_JVMTI_RETURN;
+ static void post_method_exit (JavaThread *thread, Method* method, frame current_frame) NOT_JVMTI_RETURN;
- static void post_class_load (JavaThread *thread, Klass* klass) KERNEL_RETURN;
- static void post_class_unload (Klass* klass) KERNEL_RETURN;
- static void post_class_prepare (JavaThread *thread, Klass* klass) KERNEL_RETURN;
+ static void post_class_load (JavaThread *thread, Klass* klass) NOT_JVMTI_RETURN;
+ static void post_class_unload (Klass* klass) NOT_JVMTI_RETURN;
+ static void post_class_prepare (JavaThread *thread, Klass* klass) NOT_JVMTI_RETURN;
- static void post_thread_start (JavaThread *thread) KERNEL_RETURN;
- static void post_thread_end (JavaThread *thread) KERNEL_RETURN;
+ static void post_thread_start (JavaThread *thread) NOT_JVMTI_RETURN;
+ static void post_thread_end (JavaThread *thread) NOT_JVMTI_RETURN;
// Support for java.lang.instrument agent loading.
static bool _should_post_class_file_load_hook;
inline static void set_should_post_class_file_load_hook(bool on) { _should_post_class_file_load_hook = on; }
- inline static bool should_post_class_file_load_hook() { return _should_post_class_file_load_hook; }
+ inline static bool should_post_class_file_load_hook() {
+ JVMTI_ONLY(return _should_post_class_file_load_hook);
+ NOT_JVMTI(return false;)
+ }
static void post_class_file_load_hook(Symbol* h_name, Handle class_loader,
Handle h_protection_domain,
unsigned char **data_ptr, unsigned char **end_ptr,
unsigned char **cached_data_ptr,
- jint *cached_length_ptr);
- static void post_native_method_bind(Method* method, address* function_ptr) KERNEL_RETURN;
- static void post_compiled_method_load(nmethod *nm) KERNEL_RETURN;
- static void post_dynamic_code_generated(const char *name, const void *code_begin, const void *code_end) KERNEL_RETURN;
+ jint *cached_length_ptr) NOT_JVMTI_RETURN;
+ static void post_native_method_bind(Method* method, address* function_ptr) NOT_JVMTI_RETURN;
+ static void post_compiled_method_load(nmethod *nm) NOT_JVMTI_RETURN;
+ static void post_dynamic_code_generated(const char *name, const void *code_begin, const void *code_end) NOT_JVMTI_RETURN;
// used to post a CompiledMethodUnload event
- static void post_compiled_method_unload(jmethodID mid, const void *code_begin) KERNEL_RETURN;
+ static void post_compiled_method_unload(jmethodID mid, const void *code_begin) NOT_JVMTI_RETURN;
// similiar to post_dynamic_code_generated except that it can be used to
// post a DynamicCodeGenerated event while holding locks in the VM. Any event
// posted using this function is recorded by the enclosing event collector
// -- JvmtiDynamicCodeEventCollector.
- static void post_dynamic_code_generated_while_holding_locks(const char* name, address code_begin, address code_end) KERNEL_RETURN;
-
- static void post_garbage_collection_finish() KERNEL_RETURN;
- static void post_garbage_collection_start() KERNEL_RETURN;
- static void post_data_dump() KERNEL_RETURN;
- static void post_monitor_contended_enter(JavaThread *thread, ObjectMonitor *obj_mntr) KERNEL_RETURN;
- static void post_monitor_contended_entered(JavaThread *thread, ObjectMonitor *obj_mntr) KERNEL_RETURN;
- static void post_monitor_wait(JavaThread *thread, oop obj, jlong timeout) KERNEL_RETURN;
- static void post_monitor_waited(JavaThread *thread, ObjectMonitor *obj_mntr, jboolean timed_out) KERNEL_RETURN;
- static void post_object_free(JvmtiEnv* env, jlong tag) KERNEL_RETURN;
- static void post_resource_exhausted(jint resource_exhausted_flags, const char* detail) KERNEL_RETURN;
- static void record_vm_internal_object_allocation(oop object) KERNEL_RETURN;
+ static void post_dynamic_code_generated_while_holding_locks(const char* name, address code_begin, address code_end) NOT_JVMTI_RETURN;
+
+ static void post_garbage_collection_finish() NOT_JVMTI_RETURN;
+ static void post_garbage_collection_start() NOT_JVMTI_RETURN;
+ static void post_data_dump() NOT_JVMTI_RETURN;
+ static void post_monitor_contended_enter(JavaThread *thread, ObjectMonitor *obj_mntr) NOT_JVMTI_RETURN;
+ static void post_monitor_contended_entered(JavaThread *thread, ObjectMonitor *obj_mntr) NOT_JVMTI_RETURN;
+ static void post_monitor_wait(JavaThread *thread, oop obj, jlong timeout) NOT_JVMTI_RETURN;
+ static void post_monitor_waited(JavaThread *thread, ObjectMonitor *obj_mntr, jboolean timed_out) NOT_JVMTI_RETURN;
+ static void post_object_free(JvmtiEnv* env, jlong tag) NOT_JVMTI_RETURN;
+ static void post_resource_exhausted(jint resource_exhausted_flags, const char* detail) NOT_JVMTI_RETURN;
+ static void record_vm_internal_object_allocation(oop object) NOT_JVMTI_RETURN;
// Post objects collected by vm_object_alloc_event_collector.
- static void post_vm_object_alloc(JavaThread *thread, oop object) KERNEL_RETURN;
+ static void post_vm_object_alloc(JavaThread *thread, oop object) NOT_JVMTI_RETURN;
// Collects vm internal objects for later event posting.
inline static void vm_object_alloc_event_collector(oop object) {
if (should_post_vm_object_alloc()) {
@@ -331,21 +362,19 @@ class JvmtiExport : public AllStatic {
}
}
- static void cleanup_thread (JavaThread* thread) KERNEL_RETURN;
+ static void cleanup_thread (JavaThread* thread) NOT_JVMTI_RETURN;
- static void oops_do(OopClosure* f) KERNEL_RETURN;
- static void weak_oops_do(BoolObjectClosure* b, OopClosure* f) KERNEL_RETURN;
- static void gc_epilogue() KERNEL_RETURN;
+ static void oops_do(OopClosure* f) NOT_JVMTI_RETURN;
+ static void weak_oops_do(BoolObjectClosure* b, OopClosure* f) NOT_JVMTI_RETURN;
+ static void gc_epilogue() NOT_JVMTI_RETURN;
- static void transition_pending_onload_raw_monitors() KERNEL_RETURN;
+ static void transition_pending_onload_raw_monitors() NOT_JVMTI_RETURN;
-#ifndef SERVICES_KERNEL
// attach support
- static jint load_agent_library(AttachOperation* op, outputStream* out);
-#endif // SERVICES_KERNEL
+ static jint load_agent_library(AttachOperation* op, outputStream* out) NOT_JVMTI_RETURN_(JNI_ERR);
// SetNativeMethodPrefix support
- static char** get_all_native_method_prefixes(int* count_ptr);
+ static char** get_all_native_method_prefixes(int* count_ptr) NOT_JVMTI_RETURN_(NULL);
};
// Support class used by JvmtiDynamicCodeEventCollector and others. It
@@ -408,8 +437,8 @@ class JvmtiDynamicCodeEventCollector : public JvmtiEventCollector {
void register_stub(const char* name, address start, address end);
public:
- JvmtiDynamicCodeEventCollector() KERNEL_RETURN;
- ~JvmtiDynamicCodeEventCollector() KERNEL_RETURN;
+ JvmtiDynamicCodeEventCollector() NOT_JVMTI_RETURN;
+ ~JvmtiDynamicCodeEventCollector() NOT_JVMTI_RETURN;
bool is_dynamic_code_event() { return true; }
};
@@ -441,8 +470,8 @@ class JvmtiVMObjectAllocEventCollector : public JvmtiEventCollector {
static void oops_do_for_all_threads(OopClosure* f);
public:
- JvmtiVMObjectAllocEventCollector() KERNEL_RETURN;
- ~JvmtiVMObjectAllocEventCollector() KERNEL_RETURN;
+ JvmtiVMObjectAllocEventCollector() NOT_JVMTI_RETURN;
+ ~JvmtiVMObjectAllocEventCollector() NOT_JVMTI_RETURN;
bool is_vm_object_alloc_event() { return true; }
bool is_enabled() { return _enable; }
@@ -472,16 +501,16 @@ class NoJvmtiVMObjectAllocMark : public StackObj {
bool was_enabled() { return _collector != NULL; }
public:
- NoJvmtiVMObjectAllocMark() KERNEL_RETURN;
- ~NoJvmtiVMObjectAllocMark() KERNEL_RETURN;
+ NoJvmtiVMObjectAllocMark() NOT_JVMTI_RETURN;
+ ~NoJvmtiVMObjectAllocMark() NOT_JVMTI_RETURN;
};
// Base class for reporting GC events to JVMTI.
class JvmtiGCMarker : public StackObj {
public:
- JvmtiGCMarker() KERNEL_RETURN;
- ~JvmtiGCMarker() KERNEL_RETURN;
+ JvmtiGCMarker() NOT_JVMTI_RETURN;
+ ~JvmtiGCMarker() NOT_JVMTI_RETURN;
};
// JvmtiHideSingleStepping is a helper class for hiding
diff --git a/src/share/vm/prims/jvmtiExtensions.cpp b/src/share/vm/prims/jvmtiExtensions.cpp
index 9f6a1b101..15f61b70b 100644
--- a/src/share/vm/prims/jvmtiExtensions.cpp
+++ b/src/share/vm/prims/jvmtiExtensions.cpp
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 2012, Oracle and/or its affiliates. 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
diff --git a/src/share/vm/prims/jvmtiGetLoadedClasses.cpp b/src/share/vm/prims/jvmtiGetLoadedClasses.cpp
index 8473dd50b..51cfb384a 100644
--- a/src/share/vm/prims/jvmtiGetLoadedClasses.cpp
+++ b/src/share/vm/prims/jvmtiGetLoadedClasses.cpp
@@ -169,7 +169,7 @@ class JvmtiGetLoadedClassesClosure : public StackObj {
static void increment(Klass* k) {
JvmtiGetLoadedClassesClosure* that = JvmtiGetLoadedClassesClosure::get_this();
if (that->get_initiatingLoader() == NULL) {
- for (Klass* l = k; l != NULL; l = Klass::cast(l)->array_klass_or_null()) {
+ for (Klass* l = k; l != NULL; l = l->array_klass_or_null()) {
that->set_count(that->get_count() + 1);
}
} else if (k != NULL) {
@@ -182,7 +182,7 @@ class JvmtiGetLoadedClassesClosure : public StackObj {
JvmtiGetLoadedClassesClosure* that = JvmtiGetLoadedClassesClosure::get_this();
oop class_loader = loader_data->class_loader();
if (class_loader == JNIHandles::resolve(that->get_initiatingLoader())) {
- for (Klass* l = k; l != NULL; l = Klass::cast(l)->array_klass_or_null()) {
+ for (Klass* l = k; l != NULL; l = l->array_klass_or_null()) {
that->set_count(that->get_count() + 1);
}
}
@@ -200,14 +200,14 @@ class JvmtiGetLoadedClassesClosure : public StackObj {
JvmtiGetLoadedClassesClosure* that = JvmtiGetLoadedClassesClosure::get_this();
if (that->available()) {
if (that->get_initiatingLoader() == NULL) {
- for (Klass* l = k; l != NULL; l = Klass::cast(l)->array_klass_or_null()) {
- oop mirror = Klass::cast(l)->java_mirror();
+ for (Klass* l = k; l != NULL; l = l->array_klass_or_null()) {
+ oop mirror = l->java_mirror();
that->set_element(that->get_index(), mirror);
that->set_index(that->get_index() + 1);
}
} else if (k != NULL) {
// if initiating loader not null, just include the instance with 1 dimension
- oop mirror = Klass::cast(k)->java_mirror();
+ oop mirror = k->java_mirror();
that->set_element(that->get_index(), mirror);
that->set_index(that->get_index() + 1);
}
@@ -219,8 +219,8 @@ class JvmtiGetLoadedClassesClosure : public StackObj {
if (that->available()) {
oop class_loader = loader_data->class_loader();
if (class_loader == JNIHandles::resolve(that->get_initiatingLoader())) {
- for (Klass* l = k; l != NULL; l = Klass::cast(l)->array_klass_or_null()) {
- oop mirror = Klass::cast(l)->java_mirror();
+ for (Klass* l = k; l != NULL; l = l->array_klass_or_null()) {
+ oop mirror = l->java_mirror();
that->set_element(that->get_index(), mirror);
that->set_index(that->get_index() + 1);
}
@@ -234,7 +234,7 @@ class JvmtiGetLoadedClassesClosure : public StackObj {
static void increment_for_basic_type_arrays(Klass* k) {
JvmtiGetLoadedClassesClosure* that = JvmtiGetLoadedClassesClosure::get_this();
assert(that != NULL, "no JvmtiGetLoadedClassesClosure");
- for (Klass* l = k; l != NULL; l = Klass::cast(l)->array_klass_or_null()) {
+ for (Klass* l = k; l != NULL; l = l->array_klass_or_null()) {
that->set_count(that->get_count() + 1);
}
}
@@ -244,8 +244,8 @@ class JvmtiGetLoadedClassesClosure : public StackObj {
JvmtiGetLoadedClassesClosure* that = JvmtiGetLoadedClassesClosure::get_this();
assert(that != NULL, "no JvmtiGetLoadedClassesClosure");
assert(that->available(), "no list");
- for (Klass* l = k; l != NULL; l = Klass::cast(l)->array_klass_or_null()) {
- oop mirror = Klass::cast(l)->java_mirror();
+ for (Klass* l = k; l != NULL; l = l->array_klass_or_null()) {
+ oop mirror = l->java_mirror();
that->set_element(that->get_index(), mirror);
that->set_index(that->get_index() + 1);
}
diff --git a/src/share/vm/prims/jvmtiImpl.cpp b/src/share/vm/prims/jvmtiImpl.cpp
index df5b145b9..bb7714d49 100644
--- a/src/share/vm/prims/jvmtiImpl.cpp
+++ b/src/share/vm/prims/jvmtiImpl.cpp
@@ -41,22 +41,11 @@
#include "runtime/os.hpp"
#include "runtime/serviceThread.hpp"
#include "runtime/signature.hpp"
+#include "runtime/thread.inline.hpp"
#include "runtime/vframe.hpp"
#include "runtime/vframe_hp.hpp"
#include "runtime/vm_operations.hpp"
#include "utilities/exceptions.hpp"
-#ifdef TARGET_OS_FAMILY_linux
-# include "thread_linux.inline.hpp"
-#endif
-#ifdef TARGET_OS_FAMILY_solaris
-# include "thread_solaris.inline.hpp"
-#endif
-#ifdef TARGET_OS_FAMILY_windows
-# include "thread_windows.inline.hpp"
-#endif
-#ifdef TARGET_OS_FAMILY_bsd
-# include "thread_bsd.inline.hpp"
-#endif
//
// class JvmtiAgentThread
@@ -641,14 +630,14 @@ bool VM_GetOrSetLocal::is_assignable(const char* ty_sign, Klass* klass, Thread*
int super_depth = klass->super_depth();
int idx;
for (idx = 0; idx < super_depth; idx++) {
- if (Klass::cast(klass->primary_super_of_depth(idx))->name() == ty_sym) {
+ if (klass->primary_super_of_depth(idx)->name() == ty_sym) {
return true;
}
}
// Compare secondary supers
Array<Klass*>* sec_supers = klass->secondary_supers();
for (idx = 0; idx < sec_supers->length(); idx++) {
- if (Klass::cast((Klass*) sec_supers->at(idx))->name() == ty_sym) {
+ if (((Klass*) sec_supers->at(idx))->name() == ty_sym) {
return true;
}
}
@@ -726,7 +715,7 @@ bool VM_GetOrSetLocal::check_slot_type(javaVFrame* jvf) {
KlassHandle ob_kh = KlassHandle(cur_thread, obj->klass());
NULL_CHECK(ob_kh, (_result = JVMTI_ERROR_INVALID_OBJECT, false));
- if (!is_assignable(signature, Klass::cast(ob_kh()), cur_thread)) {
+ if (!is_assignable(signature, ob_kh(), cur_thread)) {
_result = JVMTI_ERROR_TYPE_MISMATCH;
return false;
}
diff --git a/src/share/vm/prims/jvmtiImpl.hpp b/src/share/vm/prims/jvmtiImpl.hpp
index d91fa9c9e..d785930be 100644
--- a/src/share/vm/prims/jvmtiImpl.hpp
+++ b/src/share/vm/prims/jvmtiImpl.hpp
@@ -481,15 +481,15 @@ class JvmtiDeferredEvent VALUE_OBJ_CLASS_SPEC {
// Factory methods
static JvmtiDeferredEvent compiled_method_load_event(nmethod* nm)
- KERNEL_RETURN_(JvmtiDeferredEvent());
+ NOT_JVMTI_RETURN_(JvmtiDeferredEvent());
static JvmtiDeferredEvent compiled_method_unload_event(nmethod* nm,
- jmethodID id, const void* code) KERNEL_RETURN_(JvmtiDeferredEvent());
+ jmethodID id, const void* code) NOT_JVMTI_RETURN_(JvmtiDeferredEvent());
static JvmtiDeferredEvent dynamic_code_generated_event(
const char* name, const void* begin, const void* end)
- KERNEL_RETURN_(JvmtiDeferredEvent());
+ NOT_JVMTI_RETURN_(JvmtiDeferredEvent());
// Actually posts the event.
- void post() KERNEL_RETURN;
+ void post() NOT_JVMTI_RETURN;
};
/**
@@ -520,13 +520,13 @@ class JvmtiDeferredEventQueue : AllStatic {
static volatile QueueNode* _pending_list; // Uses CAS for read/update
// Transfers events from the _pending_list to the _queue.
- static void process_pending_events() KERNEL_RETURN;
+ static void process_pending_events() NOT_JVMTI_RETURN;
public:
// Must be holding Service_lock when calling these
- static bool has_events() KERNEL_RETURN_(false);
- static void enqueue(const JvmtiDeferredEvent& event) KERNEL_RETURN;
- static JvmtiDeferredEvent dequeue() KERNEL_RETURN_(JvmtiDeferredEvent());
+ static bool has_events() NOT_JVMTI_RETURN_(false);
+ static void enqueue(const JvmtiDeferredEvent& event) NOT_JVMTI_RETURN;
+ static JvmtiDeferredEvent dequeue() NOT_JVMTI_RETURN_(JvmtiDeferredEvent());
// Used to enqueue events without using a lock, for times (such as during
// safepoint) when we can't or don't want to lock the Service_lock.
@@ -534,7 +534,7 @@ class JvmtiDeferredEventQueue : AllStatic {
// Events will be held off to the side until there's a call to
// dequeue(), enqueue(), or process_pending_events() (all of which require
// the holding of the Service_lock), and will be enqueued at that time.
- static void add_pending_event(const JvmtiDeferredEvent&) KERNEL_RETURN;
+ static void add_pending_event(const JvmtiDeferredEvent&) NOT_JVMTI_RETURN;
};
// Utility macro that checks for NULL pointers:
diff --git a/src/share/vm/prims/jvmtiRawMonitor.cpp b/src/share/vm/prims/jvmtiRawMonitor.cpp
index 9031bbb29..12e69b369 100644
--- a/src/share/vm/prims/jvmtiRawMonitor.cpp
+++ b/src/share/vm/prims/jvmtiRawMonitor.cpp
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 2012, Oracle and/or its affiliates. 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
diff --git a/src/share/vm/prims/jvmtiRedefineClasses.cpp b/src/share/vm/prims/jvmtiRedefineClasses.cpp
index ef614ff41..e3653000f 100644
--- a/src/share/vm/prims/jvmtiRedefineClasses.cpp
+++ b/src/share/vm/prims/jvmtiRedefineClasses.cpp
@@ -222,7 +222,7 @@ bool VM_RedefineClasses::is_modifiable_class(oop klass_mirror) {
}
Klass* the_class_oop = java_lang_Class::as_Klass(klass_mirror);
// classes for arrays cannot be redefined
- if (the_class_oop == NULL || !Klass::cast(the_class_oop)->oop_is_instance()) {
+ if (the_class_oop == NULL || !the_class_oop->oop_is_instance()) {
return false;
}
return true;
@@ -573,8 +573,8 @@ jvmtiError VM_RedefineClasses::compare_and_normalize_class_versions(
// Check for NULL superclass first since this might be java.lang.Object
if (the_class->super() != scratch_class->super() &&
(the_class->super() == NULL || scratch_class->super() == NULL ||
- Klass::cast(the_class->super())->name() !=
- Klass::cast(scratch_class->super())->name())) {
+ the_class->super()->name() !=
+ scratch_class->super()->name())) {
return JVMTI_ERROR_UNSUPPORTED_REDEFINITION_HIERARCHY_CHANGED;
}
@@ -592,8 +592,8 @@ jvmtiError VM_RedefineClasses::compare_and_normalize_class_versions(
return JVMTI_ERROR_UNSUPPORTED_REDEFINITION_HIERARCHY_CHANGED;
}
for (i = 0; i < n_intfs; i++) {
- if (Klass::cast(k_interfaces->at(i))->name() !=
- Klass::cast(k_new_interfaces->at(i))->name()) {
+ if (k_interfaces->at(i)->name() !=
+ k_new_interfaces->at(i)->name()) {
return JVMTI_ERROR_UNSUPPORTED_REDEFINITION_HIERARCHY_CHANGED;
}
}
@@ -2606,7 +2606,7 @@ void VM_RedefineClasses::set_new_constant_pool(
void VM_RedefineClasses::adjust_array_vtable(Klass* k_oop) {
- arrayKlass* ak = arrayKlass::cast(k_oop);
+ ArrayKlass* ak = ArrayKlass::cast(k_oop);
bool trace_name_printed = false;
ak->vtable()->adjust_method_entries(_matching_old_methods,
_matching_new_methods,
@@ -2684,7 +2684,7 @@ void VM_RedefineClasses::adjust_cpool_cache_and_vtable(Klass* k_oop,
// interface, then we have to call adjust_method_entries() for
// every InstanceKlass that has an itable since there isn't a
// subclass relationship between an interface and an InstanceKlass.
- if (ik->itable_length() > 0 && (Klass::cast(_the_class_oop)->is_interface()
+ if (ik->itable_length() > 0 && (_the_class_oop->is_interface()
|| ik->is_subclass_of(_the_class_oop))) {
// ik->itable() creates a wrapper object; rm cleans it up
ResourceMark rm(THREAD);
@@ -2929,7 +2929,7 @@ class TransferNativeFunctionRegistration {
Symbol* signature) {
TempNewSymbol name_symbol = SymbolTable::probe(name_str, (int)name_len);
if (name_symbol != NULL) {
- Method* method = Klass::cast(the_class())->lookup_method(name_symbol, signature);
+ Method* method = the_class()->lookup_method(name_symbol, signature);
if (method != NULL) {
// Even if prefixed, intermediate methods must exist.
if (method->is_native()) {
diff --git a/src/share/vm/prims/jvmtiRedefineClasses.hpp b/src/share/vm/prims/jvmtiRedefineClasses.hpp
index 00381c2af..7164413c8 100644
--- a/src/share/vm/prims/jvmtiRedefineClasses.hpp
+++ b/src/share/vm/prims/jvmtiRedefineClasses.hpp
@@ -495,9 +495,9 @@ class VM_RedefineClasses: public VM_Operation {
class MetadataOnStackMark : public StackObj {
NOT_PRODUCT(static bool _is_active;)
public:
- MetadataOnStackMark();
- ~MetadataOnStackMark();
- static void record(Metadata* m);
+ MetadataOnStackMark() NOT_JVMTI_RETURN;
+ ~MetadataOnStackMark() NOT_JVMTI_RETURN;
+ static void record(Metadata* m) NOT_JVMTI_RETURN;
};
#endif // SHARE_VM_PRIMS_JVMTIREDEFINECLASSES_HPP
diff --git a/src/share/vm/prims/jvmtiTagMap.cpp b/src/share/vm/prims/jvmtiTagMap.cpp
index cd91a0c8d..3dbc70adf 100644
--- a/src/share/vm/prims/jvmtiTagMap.cpp
+++ b/src/share/vm/prims/jvmtiTagMap.cpp
@@ -1075,7 +1075,7 @@ static jint invoke_array_primitive_value_callback(jvmtiArrayPrimitiveValueCallba
// get base address of first element
typeArrayOop array = typeArrayOop(obj);
- BasicType type = typeArrayKlass::cast(array->klass())->element_type();
+ BasicType type = TypeArrayKlass::cast(array->klass())->element_type();
void* elements = array->base(type);
// jvmtiPrimitiveType is defined so this mapping is always correct
@@ -1135,7 +1135,7 @@ static jint invoke_primitive_field_callback_for_static_fields
// get offset and field value
int offset = field->field_offset();
- address addr = (address)klass + offset;
+ address addr = (address)klass->java_mirror() + offset;
jvalue value;
copy_to_jvalue(&value, addr, value_type);
@@ -2750,7 +2750,7 @@ inline bool VM_HeapWalkOperation::iterate_over_array(oop o) {
objArrayOop array = objArrayOop(o);
// array reference to its class
- oop mirror = objArrayKlass::cast(array->klass())->java_mirror();
+ oop mirror = ObjArrayKlass::cast(array->klass())->java_mirror();
if (!CallbackInvoker::report_class_reference(o, mirror)) {
return false;
}
@@ -2774,7 +2774,7 @@ inline bool VM_HeapWalkOperation::iterate_over_array(oop o) {
// a type array references its class
inline bool VM_HeapWalkOperation::iterate_over_type_array(oop o) {
Klass* k = o->klass();
- oop mirror = Klass::cast(k)->java_mirror();
+ oop mirror = k->java_mirror();
if (!CallbackInvoker::report_class_reference(o, mirror)) {
return false;
}
@@ -2823,7 +2823,7 @@ inline bool VM_HeapWalkOperation::iterate_over_class(oop java_class) {
// super (only if something more interesting than java.lang.Object)
Klass* java_super = ik->java_super();
if (java_super != NULL && java_super != SystemDictionary::Object_klass()) {
- oop super = Klass::cast(java_super)->java_mirror();
+ oop super = java_super->java_mirror();
if (!CallbackInvoker::report_superclass_reference(mirror, super)) {
return false;
}
@@ -2862,11 +2862,10 @@ inline bool VM_HeapWalkOperation::iterate_over_class(oop java_class) {
oop entry;
if (tag.is_string()) {
entry = pool->resolved_string_at(i);
- // If the entry is non-null it it resolved.
+ // If the entry is non-null it is resolved.
if (entry == NULL) continue;
- assert(java_lang_String::is_instance(entry), "must be string");
} else {
- entry = Klass::cast(pool->resolved_klass_at(i))->java_mirror();
+ entry = pool->resolved_klass_at(i)->java_mirror();
}
if (!CallbackInvoker::report_constant_pool_reference(mirror, entry, (jint)i)) {
return false;
@@ -2880,7 +2879,7 @@ inline bool VM_HeapWalkOperation::iterate_over_class(oop java_class) {
// but are specified by IterateOverReachableObjects and must be reported).
Array<Klass*>* interfaces = ik->local_interfaces();
for (i = 0; i < interfaces->length(); i++) {
- oop interf = Klass::cast((Klass*)interfaces->at(i))->java_mirror();
+ oop interf = ((Klass*)interfaces->at(i))->java_mirror();
if (interf == NULL) {
continue;
}
@@ -2929,7 +2928,7 @@ inline bool VM_HeapWalkOperation::iterate_over_class(oop java_class) {
// references from the class).
inline bool VM_HeapWalkOperation::iterate_over_object(oop o) {
// reference to the class
- if (!CallbackInvoker::report_class_reference(o, Klass::cast(o->klass())->java_mirror())) {
+ if (!CallbackInvoker::report_class_reference(o, o->klass()->java_mirror())) {
return false;
}
diff --git a/src/share/vm/prims/jvmtiTagMap.hpp b/src/share/vm/prims/jvmtiTagMap.hpp
index ede639efe..6435f6251 100644
--- a/src/share/vm/prims/jvmtiTagMap.hpp
+++ b/src/share/vm/prims/jvmtiTagMap.hpp
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2003, 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 2012, Oracle and/or its affiliates. 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
@@ -125,7 +125,7 @@ class JvmtiTagMap : public CHeapObj<mtInternal> {
jlong** tag_result_ptr);
static void weak_oops_do(
- BoolObjectClosure* is_alive, OopClosure* f) KERNEL_RETURN;
+ BoolObjectClosure* is_alive, OopClosure* f) NOT_JVMTI_RETURN;
};
#endif // SHARE_VM_PRIMS_JVMTITAGMAP_HPP
diff --git a/src/share/vm/prims/jvmtiThreadState.hpp b/src/share/vm/prims/jvmtiThreadState.hpp
index c2aff2c92..b72d4952a 100644
--- a/src/share/vm/prims/jvmtiThreadState.hpp
+++ b/src/share/vm/prims/jvmtiThreadState.hpp
@@ -391,7 +391,7 @@ class JvmtiThreadState : public CHeapObj<mtInternal> {
static ByteSize earlyret_oop_offset() { return byte_offset_of(JvmtiThreadState, _earlyret_oop); }
static ByteSize earlyret_value_offset() { return byte_offset_of(JvmtiThreadState, _earlyret_value); }
- void oops_do(OopClosure* f); // GC support
+ void oops_do(OopClosure* f) NOT_JVMTI_RETURN; // GC support
public:
void set_should_post_on_exceptions(bool val) { _thread->set_should_post_on_exceptions_flag(val ? JNI_TRUE : JNI_FALSE); }
diff --git a/src/share/vm/prims/jvmtiTrace.cpp b/src/share/vm/prims/jvmtiTrace.cpp
index 9a85e7f0b..279e23ab3 100644
--- a/src/share/vm/prims/jvmtiTrace.cpp
+++ b/src/share/vm/prims/jvmtiTrace.cpp
@@ -292,7 +292,7 @@ const char * JvmtiTrace::get_class_name(oop k_mirror) {
if (k_oop == NULL) {
return "INVALID";
}
- return Klass::cast(k_oop)->external_name();
+ return k_oop->external_name();
}
#endif /*JVMTI_TRACE */
diff --git a/src/share/vm/prims/jvmtiUtil.cpp b/src/share/vm/prims/jvmtiUtil.cpp
index 425ca1d98..0ae652ba6 100644
--- a/src/share/vm/prims/jvmtiUtil.cpp
+++ b/src/share/vm/prims/jvmtiUtil.cpp
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 2012, Oracle and/or its affiliates. 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
diff --git a/src/share/vm/prims/methodHandles.cpp b/src/share/vm/prims/methodHandles.cpp
index 98d379b67..c3b587967 100644
--- a/src/share/vm/prims/methodHandles.cpp
+++ b/src/share/vm/prims/methodHandles.cpp
@@ -138,7 +138,7 @@ oop MethodHandles::init_MemberName(oop mname_oop, oop target_oop) {
oop clazz = java_lang_reflect_Method::clazz(target_oop);
int slot = java_lang_reflect_Method::slot(target_oop);
Klass* k = java_lang_Class::as_Klass(clazz);
- if (k != NULL && Klass::cast(k)->oop_is_instance()) {
+ if (k != NULL && k->oop_is_instance()) {
Method* m = InstanceKlass::cast(k)->method_with_idnum(slot);
return init_method_MemberName(mname_oop, m, true, k);
}
@@ -146,7 +146,7 @@ oop MethodHandles::init_MemberName(oop mname_oop, oop target_oop) {
oop clazz = java_lang_reflect_Constructor::clazz(target_oop);
int slot = java_lang_reflect_Constructor::slot(target_oop);
Klass* k = java_lang_Class::as_Klass(clazz);
- if (k != NULL && Klass::cast(k)->oop_is_instance()) {
+ if (k != NULL && k->oop_is_instance()) {
Method* m = InstanceKlass::cast(k)->method_with_idnum(slot);
return init_method_MemberName(mname_oop, m, false, k);
}
@@ -187,14 +187,14 @@ oop MethodHandles::init_method_MemberName(oop mname_oop, Method* m, bool do_disp
} else if (mods.is_static()) {
flags |= IS_METHOD | (JVM_REF_invokeStatic << REFERENCE_KIND_SHIFT);
} else if (receiver_limit != mklass &&
- !Klass::cast(receiver_limit)->is_subtype_of(mklass)) {
+ !receiver_limit->is_subtype_of(mklass)) {
return NULL; // bad receiver limit
- } else if (Klass::cast(receiver_limit)->is_interface() &&
- Klass::cast(mklass)->is_interface()) {
+ } else if (receiver_limit->is_interface() &&
+ mklass->is_interface()) {
flags |= IS_METHOD | (JVM_REF_invokeInterface << REFERENCE_KIND_SHIFT);
receiver_limit = mklass; // ignore passed-in limit; interfaces are interconvertible
vmindex = klassItable::compute_itable_index(m);
- } else if (mklass != receiver_limit && Klass::cast(mklass)->is_interface()) {
+ } else if (mklass != receiver_limit && mklass->is_interface()) {
flags |= IS_METHOD | (JVM_REF_invokeVirtual << REFERENCE_KIND_SHIFT);
// it is a miranda method, so m->vtable_index is not what we want
ResourceMark rm;
@@ -210,7 +210,7 @@ oop MethodHandles::init_method_MemberName(oop mname_oop, Method* m, bool do_disp
java_lang_invoke_MemberName::set_flags(mname_oop, flags);
java_lang_invoke_MemberName::set_vmtarget(mname_oop, m);
java_lang_invoke_MemberName::set_vmindex(mname_oop, vmindex); // vtable/itable index
- java_lang_invoke_MemberName::set_clazz(mname_oop, Klass::cast(receiver_limit)->java_mirror());
+ java_lang_invoke_MemberName::set_clazz(mname_oop, receiver_limit->java_mirror());
// Note: name and type can be lazily computed by resolve_MemberName,
// if Java code needs them as resolved String and MethodType objects.
// The clazz must be eagerly stored, because it provides a GC
@@ -233,7 +233,7 @@ Handle MethodHandles::init_method_MemberName(oop mname_oop, CallInfo& info, TRAP
methodHandle m = info.resolved_method();
KlassHandle defc = info.resolved_klass();
int vmindex = -1;
- if (defc->is_interface() && Klass::cast(m->method_holder())->is_interface()) {
+ if (defc->is_interface() && m->method_holder()->is_interface()) {
// LinkResolver does not report itable indexes! (fix this?)
vmindex = klassItable::compute_itable_index(m());
} else if (m->can_be_statically_bound()) {
@@ -258,7 +258,7 @@ oop MethodHandles::init_field_MemberName(oop mname_oop, Klass* field_holder,
java_lang_invoke_MemberName::set_flags(mname_oop, flags);
java_lang_invoke_MemberName::set_vmtarget(mname_oop, vmtarget);
java_lang_invoke_MemberName::set_vmindex(mname_oop, vmindex);
- java_lang_invoke_MemberName::set_clazz(mname_oop, Klass::cast(field_holder)->java_mirror());
+ java_lang_invoke_MemberName::set_clazz(mname_oop, field_holder->java_mirror());
if (name != NULL)
java_lang_invoke_MemberName::set_name(mname_oop, name);
if (type != NULL)
@@ -299,7 +299,7 @@ bool MethodHandles::is_method_handle_invoke_name(Klass* klass, Symbol* name) {
// The following test will fail spuriously during bootstrap of MethodHandle itself:
// if (klass != SystemDictionary::MethodHandle_klass())
// Test the name instead:
- if (Klass::cast(klass)->name() != vmSymbols::java_lang_invoke_MethodHandle())
+ if (klass->name() != vmSymbols::java_lang_invoke_MethodHandle())
return false;
Symbol* poly_sig = vmSymbols::object_array_object_signature();
Method* m = InstanceKlass::cast(klass)->find_method(name, poly_sig);
@@ -363,7 +363,7 @@ vmIntrinsics::ID MethodHandles::signature_polymorphic_name_id(Symbol* name) {
vmIntrinsics::ID MethodHandles::signature_polymorphic_name_id(Klass* klass, Symbol* name) {
if (klass != NULL &&
- Klass::cast(klass)->name() == vmSymbols::java_lang_invoke_MethodHandle()) {
+ klass->name() == vmSymbols::java_lang_invoke_MethodHandle()) {
vmIntrinsics::ID iid = signature_polymorphic_name_id(name);
if (iid != vmIntrinsics::_none)
return iid;
@@ -539,7 +539,7 @@ void MethodHandles::print_as_basic_type_signature_on(outputStream* st,
static oop object_java_mirror() {
- return Klass::cast(SystemDictionary::Object_klass())->java_mirror();
+ return SystemDictionary::Object_klass()->java_mirror();
}
static oop field_name_or_null(Symbol* s) {
@@ -560,18 +560,9 @@ static oop field_signature_type_or_null(Symbol* s) {
if (s == vmSymbols::object_signature()) {
return object_java_mirror();
} else if (s == vmSymbols::class_signature()) {
- return Klass::cast(SystemDictionary::Class_klass())->java_mirror();
+ return SystemDictionary::Class_klass()->java_mirror();
} else if (s == vmSymbols::string_signature()) {
- return Klass::cast(SystemDictionary::String_klass())->java_mirror();
- } else {
- int len = s->utf8_length();
- if (s->byte_at(0) == 'L' && s->byte_at(len-1) == ';') {
- TempNewSymbol cname = SymbolTable::probe((const char*)&s->bytes()[1], len-2);
- if (cname == NULL) return NULL;
- Klass* wkk = SystemDictionary::find_well_known_klass(cname);
- if (wkk == NULL) return NULL;
- return Klass::cast(wkk)->java_mirror();
- }
+ return SystemDictionary::String_klass()->java_mirror();
}
}
return NULL;
@@ -612,8 +603,8 @@ Handle MethodHandles::resolve_MemberName(Handle mname, TRAPS) {
{
Klass* defc_klass = java_lang_Class::as_Klass(defc_oop());
if (defc_klass == NULL) return empty; // a primitive; no resolution possible
- if (!Klass::cast(defc_klass)->oop_is_instance()) {
- if (!Klass::cast(defc_klass)->oop_is_array()) return empty;
+ if (!defc_klass->oop_is_instance()) {
+ if (!defc_klass->oop_is_array()) return empty;
defc_klass = SystemDictionary::Object_klass();
}
defc = instanceKlassHandle(THREAD, defc_klass);
@@ -758,8 +749,8 @@ void MethodHandles::expand_MemberName(Handle mname, int suppress, TRAPS) {
DEBUG_ONLY(vmtarget = NULL); // safety
if (m.is_null()) break;
if (!have_defc) {
- Klass* defc = m->method_holder();
- java_lang_invoke_MemberName::set_clazz(mname(), Klass::cast(defc)->java_mirror());
+ InstanceKlass* defc = m->method_holder();
+ java_lang_invoke_MemberName::set_clazz(mname(), defc->java_mirror());
}
if (!have_name) {
//not java_lang_String::create_from_symbol; let's intern member names
@@ -776,7 +767,7 @@ void MethodHandles::expand_MemberName(Handle mname, int suppress, TRAPS) {
{
// This is taken from LinkResolver::resolve_field, sans access checks.
assert(vmtarget->is_klass(), "field vmtarget is Klass*");
- if (!Klass::cast((Klass*) vmtarget)->oop_is_instance()) break;
+ if (!((Klass*) vmtarget)->oop_is_instance()) break;
instanceKlassHandle defc(THREAD, (Klass*) vmtarget);
DEBUG_ONLY(vmtarget = NULL); // safety
bool is_static = ((flags & JVM_ACC_STATIC) != 0);
@@ -814,7 +805,7 @@ int MethodHandles::find_MemberNames(Klass* k,
// %%% take caller into account!
- if (k == NULL || !Klass::cast(k)->oop_is_instance()) return -1;
+ if (k == NULL || !k->oop_is_instance()) return -1;
int rfill = 0, rlimit = results->length(), rskip = skip;
// overflow measurement:
@@ -1041,7 +1032,7 @@ JVM_ENTRY(jobject, MHN_resolve_Mem(JNIEnv *env, jobject igcls, jobject mname_jh,
if (!Reflection::verify_class_access(caller,
reference_klass,
true)) {
- THROW_MSG_NULL(vmSymbols::java_lang_InternalError(), Klass::cast(reference_klass)->external_name());
+ THROW_MSG_NULL(vmSymbols::java_lang_InternalError(), reference_klass->external_name());
}
}
}
@@ -1117,7 +1108,7 @@ JVM_ENTRY(jobject, MHN_getMemberVMInfo(JNIEnv *env, jobject igcls, jobject mname
if (vmtarget == NULL) {
x = NULL;
} else if (vmtarget->is_klass()) {
- x = Klass::cast((Klass*) vmtarget)->java_mirror();
+ x = ((Klass*) vmtarget)->java_mirror();
} else if (vmtarget->is_method()) {
Handle mname2 = MethodHandles::new_MemberName(CHECK_NULL);
x = MethodHandles::init_method_MemberName(mname2(), (Method*)vmtarget, false, NULL);
@@ -1177,8 +1168,8 @@ JVM_ENTRY(void, MHN_setCallSiteTargetNormal(JNIEnv* env, jobject igcls, jobject
// Walk all nmethods depending on this call site.
MutexLocker mu(Compile_lock, thread);
Universe::flush_dependents_on(call_site, target);
+ java_lang_invoke_CallSite::set_target(call_site(), target());
}
- java_lang_invoke_CallSite::set_target(call_site(), target());
}
JVM_END
@@ -1189,8 +1180,8 @@ JVM_ENTRY(void, MHN_setCallSiteTargetVolatile(JNIEnv* env, jobject igcls, jobjec
// Walk all nmethods depending on this call site.
MutexLocker mu(Compile_lock, thread);
Universe::flush_dependents_on(call_site, target);
+ java_lang_invoke_CallSite::set_target_volatile(call_site(), target());
}
- java_lang_invoke_CallSite::set_target_volatile(call_site(), target());
}
JVM_END
@@ -1246,7 +1237,7 @@ JVM_ENTRY(void, JVM_RegisterMethodHandleMethods(JNIEnv *env, jclass MHN_class))
if (SystemDictionary::MethodHandle_klass() == NULL) {
enable_MH = false;
} else {
- oop mirror = Klass::cast(SystemDictionary::MethodHandle_klass())->java_mirror();
+ oop mirror = SystemDictionary::MethodHandle_klass()->java_mirror();
MH_class = (jclass) JNIHandles::make_local(env, mirror);
}
diff --git a/src/share/vm/prims/methodHandles.hpp b/src/share/vm/prims/methodHandles.hpp
index 7761f6c1b..6f6d4edd4 100644
--- a/src/share/vm/prims/methodHandles.hpp
+++ b/src/share/vm/prims/methodHandles.hpp
@@ -199,7 +199,27 @@ public:
# include "methodHandles_ppc.hpp"
#endif
-
+ // Tracing
+ static void trace_method_handle(MacroAssembler* _masm, const char* adaptername) PRODUCT_RETURN;
+ static void trace_method_handle_interpreter_entry(MacroAssembler* _masm, vmIntrinsics::ID iid) {
+ if (TraceMethodHandles) {
+ const char* name = vmIntrinsics::name_at(iid);
+ if (*name == '_') name += 1;
+ const size_t len = strlen(name) + 50;
+ char* qname = NEW_C_HEAP_ARRAY(char, len, mtInternal);
+ const char* suffix = "";
+ if (is_signature_polymorphic(iid)) {
+ if (is_signature_polymorphic_static(iid))
+ suffix = "/static";
+ else
+ suffix = "/private";
+ }
+ jio_snprintf(qname, len, "MethodHandle::interpreter_entry::%s%s", name, suffix);
+ trace_method_handle(_masm, qname);
+ // Note: Don't free the allocated char array because it's used
+ // during runtime.
+ }
+ }
};
diff --git a/src/share/vm/prims/nativeLookup.cpp b/src/share/vm/prims/nativeLookup.cpp
index daadd1de0..5fdd070aa 100644
--- a/src/share/vm/prims/nativeLookup.cpp
+++ b/src/share/vm/prims/nativeLookup.cpp
@@ -165,8 +165,7 @@ address NativeLookup::lookup_style(methodHandle method, char* pure_name, const c
// Note: It is critical for bootstrapping that Java_java_lang_ClassLoader_00024NativeLibrary_find
// gets found the first time around - otherwise an infinite loop can occure. This is
// another VM/library dependency
- Handle loader(THREAD,
- InstanceKlass::cast(method->method_holder())->class_loader());
+ Handle loader(THREAD, method->method_holder()->class_loader());
if (loader.is_null()) {
entry = lookup_special_native(jni_name);
if (entry == NULL) {
@@ -328,6 +327,7 @@ address NativeLookup::lookup_critical_entry(methodHandle method) {
// native implementation again.
// See SetNativeMethodPrefix in the JVM TI Spec for more details.
address NativeLookup::lookup_entry_prefixed(methodHandle method, bool& in_base_library, TRAPS) {
+#if INCLUDE_JVMTI
ResourceMark rm(THREAD);
int prefix_count;
@@ -349,7 +349,7 @@ address NativeLookup::lookup_entry_prefixed(methodHandle method, bool& in_base_l
TempNewSymbol wrapper_symbol = SymbolTable::probe(wrapper_name, wrapper_name_len);
if (wrapper_symbol != NULL) {
KlassHandle kh(method->method_holder());
- Method* wrapper_method = Klass::cast(kh())->lookup_method(wrapper_symbol,
+ Method* wrapper_method = kh()->lookup_method(wrapper_symbol,
method->signature());
if (wrapper_method != NULL && !wrapper_method->is_native()) {
// we found a wrapper method, use its native entry
@@ -358,6 +358,7 @@ address NativeLookup::lookup_entry_prefixed(methodHandle method, bool& in_base_l
}
}
}
+#endif // INCLUDE_JVMTI
return NULL;
}
@@ -391,7 +392,7 @@ address NativeLookup::lookup(methodHandle method, bool& in_base_library, TRAPS)
if (PrintJNIResolving) {
ResourceMark rm(THREAD);
tty->print_cr("[Dynamic-linking native method %s.%s ... JNI]",
- Klass::cast(method->method_holder())->external_name(),
+ method->method_holder()->external_name(),
method->name()->as_C_string());
}
}
diff --git a/src/share/vm/prims/unsafe.cpp b/src/share/vm/prims/unsafe.cpp
index c91a827e5..e56277b65 100644
--- a/src/share/vm/prims/unsafe.cpp
+++ b/src/share/vm/prims/unsafe.cpp
@@ -124,6 +124,8 @@ inline void* index_oop_from_field_offset_long(oop p, jlong field_offset) {
assert((void*)p->obj_field_addr<oop>((jint)byte_offset) == ptr_plus_disp,
"raw [ptr+disp] must be consistent with oop::field_base");
}
+ jlong p_size = HeapWordSize * (jlong)(p->size());
+ assert(byte_offset < p_size, err_msg("Unsafe access: offset " INT64_FORMAT " > object's size " INT64_FORMAT, byte_offset, p_size));
}
#endif
if (sizeof(char*) == sizeof(jint)) // (this constant folds!)
@@ -466,6 +468,21 @@ UNSAFE_ENTRY(void, Unsafe_SetOrderedLong(JNIEnv *env, jobject unsafe, jobject ob
#endif
UNSAFE_END
+UNSAFE_ENTRY(void, Unsafe_LoadFence(JNIEnv *env, jobject unsafe))
+ UnsafeWrapper("Unsafe_LoadFence");
+ OrderAccess::acquire();
+UNSAFE_END
+
+UNSAFE_ENTRY(void, Unsafe_StoreFence(JNIEnv *env, jobject unsafe))
+ UnsafeWrapper("Unsafe_StoreFence");
+ OrderAccess::release();
+UNSAFE_END
+
+UNSAFE_ENTRY(void, Unsafe_FullFence(JNIEnv *env, jobject unsafe))
+ UnsafeWrapper("Unsafe_FullFence");
+ OrderAccess::fence();
+UNSAFE_END
+
////// Data in the C heap.
// Note: These do not throw NullPointerException for bad pointers.
@@ -769,7 +786,7 @@ UNSAFE_ENTRY(void, Unsafe_EnsureClassInitialized(JNIEnv *env, jobject unsafe, jo
oop mirror = JNIHandles::resolve_non_null(clazz);
Klass* klass = java_lang_Class::as_Klass(mirror);
- if (klass != NULL && Klass::cast(klass)->should_be_initialized()) {
+ if (klass != NULL && klass->should_be_initialized()) {
InstanceKlass* k = InstanceKlass::cast(klass);
k->initialize(CHECK);
}
@@ -783,7 +800,7 @@ UNSAFE_ENTRY(jboolean, Unsafe_ShouldBeInitialized(JNIEnv *env, jobject unsafe, j
}
oop mirror = JNIHandles::resolve_non_null(clazz);
Klass* klass = java_lang_Class::as_Klass(mirror);
- if (klass != NULL && Klass::cast(klass)->should_be_initialized()) {
+ if (klass != NULL && klass->should_be_initialized()) {
return true;
}
return false;
@@ -802,7 +819,7 @@ static void getBaseAndScale(int& base, int& scale, jclass acls, TRAPS) {
base = arrayOopDesc::base_offset_in_bytes(T_OBJECT);
scale = heapOopSize;
} else if (k->oop_is_typeArray()) {
- typeArrayKlass* tak = typeArrayKlass::cast(k);
+ TypeArrayKlass* tak = TypeArrayKlass::cast(k);
base = tak->array_header_in_bytes();
assert(base == arrayOopDesc::base_offset_in_bytes(tak->element_type()), "array_header_size semantics ok");
scale = (1 << tak->log2_element_size());
@@ -994,7 +1011,7 @@ UNSAFE_END
// not just a literal string. For such ldc instructions, the verifier uses the
// type Object instead of String, if the loaded constant is not in fact a String.
-static oop
+static instanceKlassHandle
Unsafe_DefineAnonymousClass_impl(JNIEnv *env,
jclass host_class, jbyteArray data, jobjectArray cp_patches_jh,
HeapWord* *temp_alloc,
@@ -1071,32 +1088,39 @@ Unsafe_DefineAnonymousClass_impl(JNIEnv *env,
anon_klass = instanceKlassHandle(THREAD, anonk);
}
- // let caller initialize it as needed...
-
- return anon_klass->java_mirror();
+ return anon_klass;
}
UNSAFE_ENTRY(jclass, Unsafe_DefineAnonymousClass(JNIEnv *env, jobject unsafe, jclass host_class, jbyteArray data, jobjectArray cp_patches_jh))
{
+ instanceKlassHandle anon_klass;
+ jobject res_jh = NULL;
+
UnsafeWrapper("Unsafe_DefineAnonymousClass");
ResourceMark rm(THREAD);
HeapWord* temp_alloc = NULL;
- jobject res_jh = NULL;
-
- { oop res_oop = Unsafe_DefineAnonymousClass_impl(env,
- host_class, data, cp_patches_jh,
+ anon_klass = Unsafe_DefineAnonymousClass_impl(env, host_class, data,
+ cp_patches_jh,
&temp_alloc, THREAD);
- if (res_oop != NULL)
- res_jh = JNIHandles::make_local(env, res_oop);
- }
+ if (anon_klass() != NULL)
+ res_jh = JNIHandles::make_local(env, anon_klass->java_mirror());
// try/finally clause:
if (temp_alloc != NULL) {
FREE_C_HEAP_ARRAY(HeapWord, temp_alloc, mtInternal);
}
+ // The anonymous class loader data has been artificially been kept alive to
+ // this point. The mirror and any instances of this class have to keep
+ // it alive afterwards.
+ if (anon_klass() != NULL) {
+ anon_klass->class_loader_data()->set_keep_alive(false);
+ }
+
+ // let caller initialize it as needed...
+
return (jclass) res_jh;
}
UNSAFE_END
@@ -1541,6 +1565,9 @@ static JNINativeMethod methods[] = {
{CC"putOrderedObject", CC"("OBJ"J"OBJ")V", FN_PTR(Unsafe_SetOrderedObject)},
{CC"putOrderedInt", CC"("OBJ"JI)V", FN_PTR(Unsafe_SetOrderedInt)},
{CC"putOrderedLong", CC"("OBJ"JJ)V", FN_PTR(Unsafe_SetOrderedLong)},
+ {CC"loadFence", CC"()V", FN_PTR(Unsafe_LoadFence)},
+ {CC"storeFence", CC"()V", FN_PTR(Unsafe_StoreFence)},
+ {CC"fullFence", CC"()V", FN_PTR(Unsafe_FullFence)},
{CC"park", CC"(ZJ)V", FN_PTR(Unsafe_Park)},
{CC"unpark", CC"("OBJ")V", FN_PTR(Unsafe_Unpark)}