aboutsummaryrefslogtreecommitdiff
path: root/agent
diff options
context:
space:
mode:
authordsamersoff <none@none>2013-10-17 16:45:08 +0400
committerdsamersoff <none@none>2013-10-17 16:45:08 +0400
commit25004322b30e146392b197df31cc31ab4b77e138 (patch)
tree66e3d80195a591c653b3d17c5f5d3363ee226ee6 /agent
parent00f2054bdfaad825d5a0fca876df0e41161f8798 (diff)
downloadjdk8u_hotspot-25004322b30e146392b197df31cc31ab4b77e138.tar.gz
8005810: Update Hotspot Serviceability Agent for Method Parameter Reflection and Generic Type Signature Data
Summary: Hotspot was updated to store method parameter reflection and generic type signature data at runtime. Serviceability agent support was updated for this data Reviewed-by: coleenp, minqi, sla Contributed-by: eric.mccorkle@oracle.com
Diffstat (limited to 'agent')
-rw-r--r--agent/src/share/classes/sun/jvm/hotspot/oops/ConstMethod.java47
1 files changed, 45 insertions, 2 deletions
diff --git a/agent/src/share/classes/sun/jvm/hotspot/oops/ConstMethod.java b/agent/src/share/classes/sun/jvm/hotspot/oops/ConstMethod.java
index 3d0a370cd..585581fef 100644
--- a/agent/src/share/classes/sun/jvm/hotspot/oops/ConstMethod.java
+++ b/agent/src/share/classes/sun/jvm/hotspot/oops/ConstMethod.java
@@ -51,6 +51,7 @@ public class ConstMethod extends VMObject {
private static int HAS_GENERIC_SIGNATURE;
private static int HAS_METHOD_ANNOTATIONS;
private static int HAS_PARAMETER_ANNOTATIONS;
+ private static int HAS_METHOD_PARAMETERS;
private static int HAS_DEFAULT_ANNOTATIONS;
private static int HAS_TYPE_ANNOTATIONS;
@@ -70,6 +71,7 @@ public class ConstMethod extends VMObject {
HAS_GENERIC_SIGNATURE = db.lookupIntConstant("ConstMethod::_has_generic_signature").intValue();
HAS_METHOD_ANNOTATIONS = db.lookupIntConstant("ConstMethod::_has_method_annotations").intValue();
HAS_PARAMETER_ANNOTATIONS = db.lookupIntConstant("ConstMethod::_has_parameter_annotations").intValue();
+ HAS_METHOD_PARAMETERS = db.lookupIntConstant("ConstMethod::_has_method_parameters").intValue();
HAS_DEFAULT_ANNOTATIONS = db.lookupIntConstant("ConstMethod::_has_default_annotations").intValue();
HAS_TYPE_ANNOTATIONS = db.lookupIntConstant("ConstMethod::_has_type_annotations").intValue();
@@ -85,6 +87,9 @@ public class ConstMethod extends VMObject {
// start of byte code
bytecodeOffset = type.getSize();
+ type = db.lookupType("MethodParametersElement");
+ methodParametersElementSize = type.getSize();
+
type = db.lookupType("CheckedExceptionElement");
checkedExceptionElementSize = type.getSize();
@@ -113,7 +118,7 @@ public class ConstMethod extends VMObject {
// start of bytecode
private static long bytecodeOffset;
-
+ private static long methodParametersElementSize;
private static long checkedExceptionElementSize;
private static long localVariableTableElementSize;
private static long exceptionTableElementSize;
@@ -387,6 +392,10 @@ public class ConstMethod extends VMObject {
return ret;
}
+ private boolean hasMethodParameters() {
+ return (getFlags() & HAS_METHOD_PARAMETERS) != 0;
+ }
+
private boolean hasGenericSignature() {
return (getFlags() & HAS_GENERIC_SIGNATURE) != 0;
}
@@ -442,11 +451,41 @@ public class ConstMethod extends VMObject {
return offsetOfLastU2Element();
}
- private long offsetOfCheckedExceptionsLength() {
+ private long offsetOfMethodParametersLength() {
+ if (Assert.ASSERTS_ENABLED) {
+ Assert.that(hasMethodParameters(), "should only be called if table is present");
+ }
return hasGenericSignature() ? offsetOfLastU2Element() - sizeofShort :
offsetOfLastU2Element();
}
+ private int getMethodParametersLength() {
+ if (hasMethodParameters())
+ return (int) getAddress().getCIntegerAt(offsetOfMethodParametersLength(), 2, true);
+ else
+ return 0;
+ }
+
+ // Offset of start of checked exceptions
+ private long offsetOfMethodParameters() {
+ long offset = offsetOfMethodParametersLength();
+ long length = getMethodParametersLength();
+ if (Assert.ASSERTS_ENABLED) {
+ Assert.that(length > 0, "should only be called if method parameter information is present");
+ }
+ offset -= length * methodParametersElementSize;
+ return offset;
+ }
+
+ private long offsetOfCheckedExceptionsLength() {
+ if (hasMethodParameters())
+ return offsetOfMethodParameters() - sizeofShort;
+ else {
+ return hasGenericSignature() ? offsetOfLastU2Element() - sizeofShort :
+ offsetOfLastU2Element();
+ }
+ }
+
private int getCheckedExceptionsLength() {
if (hasCheckedExceptions()) {
return (int) getAddress().getCIntegerAt(offsetOfCheckedExceptionsLength(), 2, true);
@@ -496,6 +535,8 @@ public class ConstMethod extends VMObject {
return offsetOfExceptionTable() - sizeofShort;
} else if (hasCheckedExceptions()) {
return offsetOfCheckedExceptions() - sizeofShort;
+ } else if (hasMethodParameters()) {
+ return offsetOfMethodParameters() - sizeofShort;
} else {
return hasGenericSignature() ? offsetOfLastU2Element() - sizeofShort :
offsetOfLastU2Element();
@@ -526,6 +567,8 @@ public class ConstMethod extends VMObject {
}
if (hasCheckedExceptions()) {
return offsetOfCheckedExceptions() - sizeofShort;
+ } else if (hasMethodParameters()) {
+ return offsetOfMethodParameters() - sizeofShort;
} else {
return hasGenericSignature() ? offsetOfLastU2Element() - sizeofShort :
offsetOfLastU2Element();