1.1 --- a/javap/src/main/java/org/apidesign/javap/StackMapTableData.java Thu Nov 29 20:19:00 2012 +0100
1.2 +++ b/javap/src/main/java/org/apidesign/javap/StackMapTableData.java Fri Dec 07 15:02:35 2012 +0100
1.3 @@ -40,7 +40,75 @@
1.4 this.frameType = frameType;
1.5 }
1.6
1.7 - abstract int getStackItemsCount();
1.8 + abstract void applyTo(TypeArray localTypes, TypeArray stackTypes);
1.9 +
1.10 + protected static String toString(
1.11 + final String frameType,
1.12 + final int offset,
1.13 + final int[] localTypes,
1.14 + final int[] stackTypes) {
1.15 + final StringBuilder sb = new StringBuilder(frameType);
1.16 +
1.17 + sb.append("(off: +").append(offset);
1.18 + if (localTypes != null) {
1.19 + sb.append(", locals: ");
1.20 + appendTypes(sb, localTypes);
1.21 + }
1.22 + if (stackTypes != null) {
1.23 + sb.append(", stack: ");
1.24 + appendTypes(sb, stackTypes);
1.25 + }
1.26 + sb.append(')');
1.27 +
1.28 + return sb.toString();
1.29 + }
1.30 +
1.31 + private static void appendTypes(final StringBuilder sb, final int[] types) {
1.32 + sb.append('[');
1.33 + if (types.length > 0) {
1.34 + appendType(sb, types[0]);
1.35 + for (int i = 1; i < types.length; ++i) {
1.36 + sb.append(", ");
1.37 + appendType(sb, types[i]);
1.38 + }
1.39 + }
1.40 + sb.append(']');
1.41 + }
1.42 +
1.43 + private static void appendType(final StringBuilder sb, final int type) {
1.44 + switch (type & 0xff) {
1.45 + case ITEM_Bogus:
1.46 + sb.append("_top_");
1.47 + break;
1.48 + case ITEM_Integer:
1.49 + sb.append("_int_");
1.50 + break;
1.51 + case ITEM_Float:
1.52 + sb.append("_float_");
1.53 + break;
1.54 + case ITEM_Double:
1.55 + sb.append("_double_");
1.56 + break;
1.57 + case ITEM_Long:
1.58 + sb.append("_long_");
1.59 + break;
1.60 + case ITEM_Null:
1.61 + sb.append("_null_");
1.62 + break;
1.63 + case ITEM_InitObject: // UninitializedThis
1.64 + sb.append("_init_");
1.65 + break;
1.66 + case ITEM_Object:
1.67 + sb.append("_object_");
1.68 + break;
1.69 + case ITEM_NewObject: // Uninitialized
1.70 + sb.append("_new_");
1.71 + break;
1.72 + default:
1.73 + sb.append("_unknown_");
1.74 + break;
1.75 + }
1.76 + }
1.77
1.78 static class SameFrame extends StackMapTableData {
1.79 SameFrame(int frameType, int offsetDelta) {
1.80 @@ -49,16 +117,16 @@
1.81 }
1.82
1.83 @Override
1.84 - int getStackItemsCount() {
1.85 - return 0;
1.86 + void applyTo(TypeArray localTypes, TypeArray stackTypes) {
1.87 + stackTypes.clear();
1.88 }
1.89
1.90 @Override
1.91 public String toString() {
1.92 - return "SAME"
1.93 - + ((frameType == SAME_FRAME_EXTENDED)
1.94 - ? "_FRAME_EXTENDED" : "")
1.95 - + "(" + offsetDelta + ")";
1.96 + return toString("SAME" + ((frameType == SAME_FRAME_EXTENDED)
1.97 + ? "_FRAME_EXTENDED" : ""),
1.98 + offsetDelta,
1.99 + null, null);
1.100 }
1.101 }
1.102
1.103 @@ -71,16 +139,18 @@
1.104 }
1.105
1.106 @Override
1.107 - int getStackItemsCount() {
1.108 - return 1;
1.109 + void applyTo(TypeArray localTypes, TypeArray stackTypes) {
1.110 + stackTypes.setAll(stack);
1.111 }
1.112
1.113 @Override
1.114 public String toString() {
1.115 - return "SAME_LOCALS_1_STACK_ITEM"
1.116 - + ((frameType == SAME_LOCALS_1_STACK_ITEM_EXTENDED)
1.117 - ? "_EXTENDED" : "")
1.118 - + "(" + offsetDelta + ")";
1.119 + return toString(
1.120 + "SAME_LOCALS_1_STACK_ITEM"
1.121 + + ((frameType == SAME_LOCALS_1_STACK_ITEM_EXTENDED)
1.122 + ? "_EXTENDED" : ""),
1.123 + offsetDelta,
1.124 + null, stack);
1.125 }
1.126 }
1.127
1.128 @@ -91,13 +161,15 @@
1.129 }
1.130
1.131 @Override
1.132 - int getStackItemsCount() {
1.133 - return 0;
1.134 + void applyTo(TypeArray localTypes, TypeArray stackTypes) {
1.135 + localTypes.setSize(localTypes.getSize()
1.136 + - (SAME_FRAME_EXTENDED - frameType));
1.137 + stackTypes.clear();
1.138 }
1.139
1.140 @Override
1.141 public String toString() {
1.142 - return "CHOP(" + offsetDelta + ")";
1.143 + return toString("CHOP", offsetDelta, null, null);
1.144 }
1.145 }
1.146
1.147 @@ -110,13 +182,14 @@
1.148 }
1.149
1.150 @Override
1.151 - int getStackItemsCount() {
1.152 - return 0;
1.153 + void applyTo(TypeArray localTypes, TypeArray stackTypes) {
1.154 + localTypes.addAll(locals);
1.155 + stackTypes.clear();
1.156 }
1.157
1.158 @Override
1.159 public String toString() {
1.160 - return "APPEND(" + offsetDelta + ")";
1.161 + return toString("APPEND", offsetDelta, locals, null);
1.162 }
1.163 }
1.164
1.165 @@ -131,13 +204,14 @@
1.166 }
1.167
1.168 @Override
1.169 - int getStackItemsCount() {
1.170 - return stack.length;
1.171 + void applyTo(TypeArray localTypes, TypeArray stackTypes) {
1.172 + localTypes.setAll(locals);
1.173 + stackTypes.setAll(stack);
1.174 }
1.175
1.176 @Override
1.177 public String toString() {
1.178 - return "FULL(" + offsetDelta + ")";
1.179 + return toString("FULL", offsetDelta, locals, stack);
1.180 }
1.181 }
1.182