javap/src/main/java/org/apidesign/javap/StackMapTableData.java
branchregisters
changeset 281 f2352e0b713e
parent 221 3ee23267706c
child 307 eaf4e8387065
     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