1 52 53 package com.go.trove.classfile; 54 55 import java.io.*; 56 57 65 public class ExceptionHandler implements LocationRange { 66 private Location mStart; 67 private Location mEnd; 68 private Location mCatch; 69 private ConstantClassInfo mCatchType; 70 71 77 public ExceptionHandler(Location startLocation, 78 Location endLocation, 79 Location catchLocation, 80 ConstantClassInfo catchType) { 81 mStart = startLocation; 82 mEnd = endLocation; 83 mCatch = catchLocation; 84 mCatchType = catchType; 85 } 86 87 public Location getStartLocation() { 88 return mStart; 89 } 90 91 public Location getEndLocation() { 92 return mEnd; 93 } 94 95 public Location getCatchLocation() { 96 return mCatch; 97 } 98 99 102 public ConstantClassInfo getCatchType() { 103 return mCatchType; 104 } 105 106 public int compareTo(Object obj) { 107 if (this == obj) { 108 return 0; 109 } 110 111 LocationRange other = (LocationRange)obj; 112 113 int result = getStartLocation().compareTo(other.getStartLocation()); 114 115 if (result == 0) { 116 result = getEndLocation().compareTo(other.getEndLocation()); 117 } 118 119 if (result == 0 && obj instanceof ExceptionHandler) { 120 result = getCatchLocation().compareTo 121 (((ExceptionHandler)other).getCatchLocation()); 122 } 123 124 return result; 125 } 126 127 public void writeTo(DataOutput dout) throws IOException { 128 int start_pc = getStartLocation().getLocation(); 129 int end_pc = getEndLocation().getLocation(); 130 int handler_pc = getCatchLocation().getLocation(); 131 int catch_type; 132 ConstantClassInfo catchType = getCatchType(); 133 if (catchType == null) { 134 catch_type = 0; 135 } 136 else { 137 catch_type = catchType.getIndex(); 138 } 139 140 check("exception start PC", start_pc); 141 check("exception end PC", end_pc); 142 check("exception handler PC", handler_pc); 143 144 dout.writeShort(start_pc); 145 dout.writeShort(end_pc); 146 dout.writeShort(handler_pc); 147 dout.writeShort(catch_type); 148 } 149 150 private void check(String type, int addr) throws RuntimeException { 151 if (addr < 0 || addr > 65535) { 152 throw new RuntimeException ("Value for " + type + " out of " + 153 "valid range: " + addr); 154 155 } 156 } 157 158 static ExceptionHandler readFrom(ConstantPool cp, 159 DataInput din) throws IOException { 160 int start_pc = din.readUnsignedShort(); 161 int end_pc = din.readUnsignedShort(); 162 int handler_pc = din.readUnsignedShort(); 163 int catch_type = din.readUnsignedShort(); 164 165 ConstantClassInfo catchTypeConstant; 166 if (catch_type == 0) { 167 catchTypeConstant = null; 168 } 169 else { 170 catchTypeConstant = (ConstantClassInfo)cp.getConstant(catch_type); 171 } 172 173 return new ExceptionHandler(new FixedLocation(start_pc), 174 new FixedLocation(end_pc), 175 new FixedLocation(handler_pc), 176 catchTypeConstant); 177 } 178 } 179 | Popular Tags |