aboutsummaryrefslogtreecommitdiff
path: root/agent
diff options
context:
space:
mode:
authorjrose <none@none>2010-10-30 13:08:23 -0700
committerjrose <none@none>2010-10-30 13:08:23 -0700
commit0192fd35406f783addb602cdb884ec7c24b6a62c (patch)
treeadd87efbaf924354bb8aee6c6e58e8fd6e1ec3f8 /agent
parentf34b2b83972fdda157b2a413a3254237c46177c6 (diff)
6984311: JSR 292 needs optional bootstrap method parameters
Summary: Allow CONSTANT_InvokeDynamic nodes to have any number of extra operands. Reviewed-by: twisti
Diffstat (limited to 'agent')
-rw-r--r--agent/src/share/classes/sun/jvm/hotspot/interpreter/BytecodeLoadConstant.java4
-rw-r--r--agent/src/share/classes/sun/jvm/hotspot/oops/ConstantPool.java53
-rw-r--r--agent/src/share/classes/sun/jvm/hotspot/runtime/ClassConstants.java3
-rw-r--r--agent/src/share/classes/sun/jvm/hotspot/tools/jcore/ClassWriter.java9
-rw-r--r--agent/src/share/classes/sun/jvm/hotspot/ui/classbrowser/HTMLGenerator.java14
-rw-r--r--agent/src/share/classes/sun/jvm/hotspot/utilities/ConstantTag.java5
6 files changed, 72 insertions, 16 deletions
diff --git a/agent/src/share/classes/sun/jvm/hotspot/interpreter/BytecodeLoadConstant.java b/agent/src/share/classes/sun/jvm/hotspot/interpreter/BytecodeLoadConstant.java
index f08c03128..163388810 100644
--- a/agent/src/share/classes/sun/jvm/hotspot/interpreter/BytecodeLoadConstant.java
+++ b/agent/src/share/classes/sun/jvm/hotspot/interpreter/BytecodeLoadConstant.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2002, 2003, 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
@@ -188,7 +188,7 @@ public class BytecodeLoadConstant extends BytecodeWithCPIndex {
} else {
throw new RuntimeException("should not reach here");
}
- } else if (ctag.isMethodHandle() || ctag.isMethodType()) {
+ } else if (ctag.isMethodHandle()) {
Oop x = getCachedConstant();
int refidx = cpool.getMethodHandleIndexAt(cpIndex);
int refkind = cpool.getMethodHandleRefKindAt(cpIndex);
diff --git a/agent/src/share/classes/sun/jvm/hotspot/oops/ConstantPool.java b/agent/src/share/classes/sun/jvm/hotspot/oops/ConstantPool.java
index 278724504..fb7727a7c 100644
--- a/agent/src/share/classes/sun/jvm/hotspot/oops/ConstantPool.java
+++ b/agent/src/share/classes/sun/jvm/hotspot/oops/ConstantPool.java
@@ -53,11 +53,19 @@ public class ConstantPool extends Oop implements ClassConstants {
private static synchronized void initialize(TypeDataBase db) throws WrongTypeException {
Type type = db.lookupType("constantPoolOopDesc");
tags = new OopField(type.getOopField("_tags"), 0);
+ operands = new OopField(type.getOopField("_operands"), 0);
cache = new OopField(type.getOopField("_cache"), 0);
poolHolder = new OopField(type.getOopField("_pool_holder"), 0);
length = new CIntField(type.getCIntegerField("_length"), 0);
headerSize = type.getSize();
elementSize = 0;
+ // fetch constants:
+ MULTI_OPERAND_COUNT_OFFSET = db.lookupIntConstant("constantPoolOopDesc::_multi_operand_count_offset").intValue();
+ MULTI_OPERAND_BASE_OFFSET = db.lookupIntConstant("constantPoolOopDesc::_multi_operand_base_offset").intValue();
+ INDY_BSM_OFFSET = db.lookupIntConstant("constantPoolOopDesc::_indy_bsm_offset").intValue();
+ INDY_NT_OFFSET = db.lookupIntConstant("constantPoolOopDesc::_indy_nt_offset").intValue();
+ INDY_ARGC_OFFSET = db.lookupIntConstant("constantPoolOopDesc::_indy_argc_offset").intValue();
+ INDY_ARGV_OFFSET = db.lookupIntConstant("constantPoolOopDesc::_indy_argv_offset").intValue();
}
ConstantPool(OopHandle handle, ObjectHeap heap) {
@@ -67,6 +75,7 @@ public class ConstantPool extends Oop implements ClassConstants {
public boolean isConstantPool() { return true; }
private static OopField tags;
+ private static OopField operands;
private static OopField cache;
private static OopField poolHolder;
private static CIntField length; // number of elements in oop
@@ -74,7 +83,15 @@ public class ConstantPool extends Oop implements ClassConstants {
private static long headerSize;
private static long elementSize;
+ private static int MULTI_OPERAND_COUNT_OFFSET;
+ private static int MULTI_OPERAND_BASE_OFFSET;
+ private static int INDY_BSM_OFFSET;
+ private static int INDY_NT_OFFSET;
+ private static int INDY_ARGC_OFFSET;
+ private static int INDY_ARGV_OFFSET;
+
public TypeArray getTags() { return (TypeArray) tags.getValue(this); }
+ public TypeArray getOperands() { return (TypeArray) operands.getValue(this); }
public ConstantPoolCache getCache() { return (ConstantPoolCache) cache.getValue(this); }
public Klass getPoolHolder() { return (Klass) poolHolder.getValue(this); }
public int getLength() { return (int)length.getValue(this); }
@@ -278,6 +295,25 @@ public class ConstantPool extends Oop implements ClassConstants {
return res;
}
+ /** Lookup for multi-operand (InvokeDynamic) entries. */
+ public int[] getMultiOperandsAt(int i) {
+ if (Assert.ASSERTS_ENABLED) {
+ Assert.that(getTagAt(i).isInvokeDynamic(), "Corrupted constant pool");
+ }
+ int pos = this.getIntAt(i);
+ int countPos = pos + MULTI_OPERAND_COUNT_OFFSET; // == pos-1
+ int basePos = pos + MULTI_OPERAND_BASE_OFFSET; // == pos
+ if (countPos < 0) return null; // safety first
+ TypeArray operands = getOperands();
+ if (operands == null) return null; // safety first
+ int length = operands.getIntAt(countPos);
+ int[] values = new int[length];
+ for (int j = 0; j < length; j++) {
+ values[j] = operands.getIntAt(basePos+j);
+ }
+ return values;
+ }
+
final private static String[] nameForTag = new String[] {
};
@@ -522,15 +558,20 @@ public class ConstantPool extends Oop implements ClassConstants {
case JVM_CONSTANT_InvokeDynamic: {
dos.writeByte(cpConstType);
- int value = getIntAt(ci);
- short bootstrapMethodIndex = (short) extractLowShortFromInt(value);
- short nameAndTypeIndex = (short) extractHighShortFromInt(value);
- dos.writeShort(bootstrapMethodIndex);
- dos.writeShort(nameAndTypeIndex);
+ int[] values = getMultiOperandsAt(ci);
+ for (int vn = 0; vn < values.length; vn++) {
+ dos.writeShort(values[vn]);
+ }
+ int bootstrapMethodIndex = values[INDY_BSM_OFFSET];
+ int nameAndTypeIndex = values[INDY_NT_OFFSET];
+ int argumentCount = values[INDY_ARGC_OFFSET];
+ assert(INDY_ARGV_OFFSET + argumentCount == values.length);
if (DEBUG) debugMessage("CP[" + ci + "] = indy BSM = " + bootstrapMethodIndex
- + ", N&T = " + nameAndTypeIndex);
+ + ", N&T = " + nameAndTypeIndex
+ + ", argc = " + argumentCount);
break;
}
+
default:
throw new InternalError("unknown tag: " + cpConstType);
} // switch
diff --git a/agent/src/share/classes/sun/jvm/hotspot/runtime/ClassConstants.java b/agent/src/share/classes/sun/jvm/hotspot/runtime/ClassConstants.java
index ff7db309f..3a008c0b0 100644
--- a/agent/src/share/classes/sun/jvm/hotspot/runtime/ClassConstants.java
+++ b/agent/src/share/classes/sun/jvm/hotspot/runtime/ClassConstants.java
@@ -42,7 +42,8 @@ public interface ClassConstants
public static final int JVM_CONSTANT_NameAndType = 12;
public static final int JVM_CONSTANT_MethodHandle = 15;
public static final int JVM_CONSTANT_MethodType = 16;
- public static final int JVM_CONSTANT_InvokeDynamic = 17;
+ public static final int JVM_CONSTANT_InvokeDynamicTrans = 17; // only occurs in old class files
+ public static final int JVM_CONSTANT_InvokeDynamic = 18;
// JVM_CONSTANT_MethodHandle subtypes
public static final int JVM_REF_getField = 1;
diff --git a/agent/src/share/classes/sun/jvm/hotspot/tools/jcore/ClassWriter.java b/agent/src/share/classes/sun/jvm/hotspot/tools/jcore/ClassWriter.java
index 31f37a5df..105b55a07 100644
--- a/agent/src/share/classes/sun/jvm/hotspot/tools/jcore/ClassWriter.java
+++ b/agent/src/share/classes/sun/jvm/hotspot/tools/jcore/ClassWriter.java
@@ -323,10 +323,11 @@ public class ClassWriter implements /* imports */ ClassConstants
case JVM_CONSTANT_InvokeDynamic: {
dos.writeByte(cpConstType);
- int value = cpool.getIntAt(ci);
- short refIndex = (short) value;
- dos.writeShort(refIndex);
- if (DEBUG) debugMessage("CP[" + ci + "] = MT index = " + refIndex);
+ int[] values = cpool.getMultiOperandsAt(ci);
+ for (int vn = 0; vn < values.length; vn++) {
+ dos.writeShort(values[vn]);
+ }
+ if (DEBUG) debugMessage("CP[" + ci + "] = INDY indexes = " + Arrays.toString(values));
break;
}
diff --git a/agent/src/share/classes/sun/jvm/hotspot/ui/classbrowser/HTMLGenerator.java b/agent/src/share/classes/sun/jvm/hotspot/ui/classbrowser/HTMLGenerator.java
index e70ba9461..49c101fe6 100644
--- a/agent/src/share/classes/sun/jvm/hotspot/ui/classbrowser/HTMLGenerator.java
+++ b/agent/src/share/classes/sun/jvm/hotspot/ui/classbrowser/HTMLGenerator.java
@@ -460,6 +460,18 @@ public class HTMLGenerator implements /* imports */ ClassConstants {
return buf.toString();
}
+ private String genListOfShort(int[] values) {
+ Formatter buf = new Formatter(genHTML);
+ buf.append('[');
+ for (int i = 0; i < values.length; i++) {
+ if (i > 0) buf.append(' ');
+ buf.append('#');
+ buf.append(Integer.toString(values[i]));
+ }
+ buf.append(']');
+ return buf.toString();
+ }
+
protected String genHTMLTableForConstantPool(ConstantPool cpool) {
Formatter buf = new Formatter(genHTML);
buf.beginTable(1);
@@ -584,7 +596,7 @@ public class HTMLGenerator implements /* imports */ ClassConstants {
case JVM_CONSTANT_InvokeDynamic:
buf.cell("JVM_CONSTANT_InvokeDynamic");
- buf.cell(genLowHighShort(cpool.getIntAt(index)));
+ buf.cell(genListOfShort(cpool.getMultiOperandsAt(index)));
break;
default:
diff --git a/agent/src/share/classes/sun/jvm/hotspot/utilities/ConstantTag.java b/agent/src/share/classes/sun/jvm/hotspot/utilities/ConstantTag.java
index 3f2baf3d9..849531da1 100644
--- a/agent/src/share/classes/sun/jvm/hotspot/utilities/ConstantTag.java
+++ b/agent/src/share/classes/sun/jvm/hotspot/utilities/ConstantTag.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2001, 2005, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2001, 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
@@ -40,7 +40,8 @@ public class ConstantTag {
private static int JVM_CONSTANT_NameAndType = 12;
private static int JVM_CONSTANT_MethodHandle = 15; // JSR 292
private static int JVM_CONSTANT_MethodType = 16; // JSR 292
- private static int JVM_CONSTANT_InvokeDynamic = 17; // JSR 292
+ // static int JVM_CONSTANT_InvokeDynamicTrans = 17; // JSR 292, only occurs in old class files
+ private static int JVM_CONSTANT_InvokeDynamic = 18; // JSR 292
private static int JVM_CONSTANT_Invalid = 0; // For bad value initialization
private static int JVM_CONSTANT_UnresolvedClass = 100; // Temporary tag until actual use
private static int JVM_CONSTANT_ClassIndex = 101; // Temporary tag while constructing constant pool