Replace StringBuffer with StringBuilder, other minor String optimizationstags/rel_3_29_0_ga
char sep = File.separatorChar; | char sep = File.separatorChar; | ||||
String filename = directory + sep | String filename = directory + sep | ||||
+ classname.replace('.', sep) + ".class"; | + classname.replace('.', sep) + ".class"; | ||||
return new FileInputStream(filename.toString()); | |||||
return new FileInputStream(filename); | |||||
} | } | ||||
catch (FileNotFoundException e) {} | catch (FileNotFoundException e) {} | ||||
catch (SecurityException e) {} | catch (SecurityException e) {} | ||||
@Override | @Override | ||||
public String toString() { | public String toString() { | ||||
return jarfileURL == null ? "<null>" : jarfileURL.toString(); | |||||
return jarfileURL == null ? "<null>" : jarfileURL; | |||||
} | } | ||||
} | } | ||||
@Override | @Override | ||||
public String toString() { | public String toString() { | ||||
StringBuffer buf = new StringBuffer(); | |||||
StringBuilder buf = new StringBuilder(); | |||||
buf.append("[class path: "); | buf.append("[class path: "); | ||||
ClassPathList list = pathList; | ClassPathList list = pathList; | ||||
while (list != null) { | while (list != null) { |
} | } | ||||
@Override | @Override | ||||
protected void extendToString(StringBuffer buffer) { | |||||
protected void extendToString(StringBuilder buffer) { | |||||
buffer.append(' '); | buffer.append(' '); | ||||
buffer.append(getName()); | buffer.append(getName()); | ||||
buffer.append(' '); | buffer.append(' '); |
*/ | */ | ||||
@Override | @Override | ||||
public String toString() { | public String toString() { | ||||
StringBuffer buf = new StringBuffer(getClass().getName()); | |||||
buf.append("@"); | |||||
StringBuilder buf = new StringBuilder(getClass().getName()); | |||||
buf.append('@'); | |||||
buf.append(Integer.toHexString(hashCode())); | buf.append(Integer.toHexString(hashCode())); | ||||
buf.append("["); | |||||
buf.append('['); | |||||
extendToString(buf); | extendToString(buf); | ||||
buf.append("]"); | |||||
buf.append(']'); | |||||
return buf.toString(); | return buf.toString(); | ||||
} | } | ||||
* Implemented in subclasses to add to the {@link #toString()} result. | * Implemented in subclasses to add to the {@link #toString()} result. | ||||
* Subclasses should put a space before each token added to the buffer. | * Subclasses should put a space before each token added to the buffer. | ||||
*/ | */ | ||||
protected void extendToString(StringBuffer buffer) { | |||||
protected void extendToString(StringBuilder buffer) { | |||||
buffer.append(getName()); | buffer.append(getName()); | ||||
} | } | ||||
} | } | ||||
@Override | @Override | ||||
protected void extendToString(StringBuffer buffer) { | |||||
protected void extendToString(StringBuilder buffer) { | |||||
if (wasChanged) | if (wasChanged) | ||||
buffer.append("changed "); | buffer.append("changed "); | ||||
if (ext != null) { | if (ext != null) { | ||||
String name = ext.getName(); | String name = ext.getName(); | ||||
if (!name.equals("java.lang.Object")) | if (!name.equals("java.lang.Object")) | ||||
buffer.append(" extends " + ext.getName()); | |||||
buffer.append(" extends ").append(ext.getName()); | |||||
} | } | ||||
} | } | ||||
catch (NotFoundException e) { | catch (NotFoundException e) { | ||||
memCache.methodHead(), memCache.lastMethod()); | memCache.methodHead(), memCache.lastMethod()); | ||||
} | } | ||||
private void exToString(StringBuffer buffer, String msg, | |||||
private void exToString(StringBuilder buffer, String msg, | |||||
CtMember head, CtMember tail) { | CtMember head, CtMember tail) { | ||||
buffer.append(msg); | buffer.append(msg); | ||||
while (head != tail) { | while (head != tail) { |
} | } | ||||
@Override | @Override | ||||
protected void extendToString(StringBuffer buffer) { | |||||
protected void extendToString(StringBuilder buffer) { | |||||
buffer.append(' '); | buffer.append(' '); | ||||
buffer.append(getName()); | buffer.append(getName()); | ||||
buffer.append(' '); | buffer.append(' '); |
*/ | */ | ||||
static class Cache extends CtMember { | static class Cache extends CtMember { | ||||
@Override | @Override | ||||
protected void extendToString(StringBuffer buffer) {} | |||||
protected void extendToString(StringBuilder buffer) {} | |||||
@Override | @Override | ||||
public boolean hasAnnotation(String clz) { return false; } | public boolean hasAnnotation(String clz) { return false; } | ||||
@Override | @Override | ||||
@Override | @Override | ||||
public String toString() { | public String toString() { | ||||
StringBuffer buffer = new StringBuffer(getClass().getName()); | |||||
buffer.append("@"); | |||||
StringBuilder buffer = new StringBuilder(getClass().getName()); | |||||
buffer.append('@'); | |||||
buffer.append(Integer.toHexString(hashCode())); | buffer.append(Integer.toHexString(hashCode())); | ||||
buffer.append("["); | |||||
buffer.append('['); | |||||
buffer.append(Modifier.toString(getModifiers())); | buffer.append(Modifier.toString(getModifiers())); | ||||
extendToString(buffer); | extendToString(buffer); | ||||
buffer.append("]"); | |||||
buffer.append(']'); | |||||
return buffer.toString(); | return buffer.toString(); | ||||
} | } | ||||
* provided first; subclasses should provide additional data such | * provided first; subclasses should provide additional data such | ||||
* as return type, field or method name, etc. | * as return type, field or method name, etc. | ||||
*/ | */ | ||||
protected abstract void extendToString(StringBuffer buffer); | |||||
protected abstract void extendToString(StringBuilder buffer); | |||||
/** | /** | ||||
* Returns the class that declares this member. | * Returns the class that declares this member. |
} | } | ||||
@Override | @Override | ||||
protected void extendToString(StringBuffer buffer) { | |||||
protected void extendToString(StringBuilder buffer) { | |||||
if (hasConstructor) | if (hasConstructor) | ||||
buffer.append("hasConstructor "); | buffer.append("hasConstructor "); | ||||
if (arrayDim == 0) | if (arrayDim == 0) | ||||
return name; | return name; | ||||
StringBuffer sbuf = new StringBuffer(name); | |||||
StringBuilder sbuf = new StringBuilder(name); | |||||
do { | do { | ||||
sbuf.append("[]"); | sbuf.append("[]"); | ||||
} while (--arrayDim > 0); | } while (--arrayDim > 0); | ||||
if (desc.indexOf(oldname) < 0) | if (desc.indexOf(oldname) < 0) | ||||
return desc; | return desc; | ||||
StringBuffer newdesc = new StringBuffer(); | |||||
StringBuilder newdesc = new StringBuilder(); | |||||
int head = 0; | int head = 0; | ||||
int i = 0; | int i = 0; | ||||
for (;;) { | for (;;) { | ||||
if (map == null) | if (map == null) | ||||
return desc; | return desc; | ||||
StringBuffer newdesc = new StringBuffer(); | |||||
StringBuilder newdesc = new StringBuilder(); | |||||
int head = 0; | int head = 0; | ||||
int i = 0; | int i = 0; | ||||
for (;;) { | for (;;) { | ||||
* Returns the descriptor representing the given type. | * Returns the descriptor representing the given type. | ||||
*/ | */ | ||||
public static String of(CtClass type) { | public static String of(CtClass type) { | ||||
StringBuffer sbuf = new StringBuffer(); | |||||
StringBuilder sbuf = new StringBuilder(); | |||||
toDescriptor(sbuf, type); | toDescriptor(sbuf, type); | ||||
return sbuf.toString(); | return sbuf.toString(); | ||||
} | } | ||||
private static void toDescriptor(StringBuffer desc, CtClass type) { | |||||
private static void toDescriptor(StringBuilder desc, CtClass type) { | |||||
if (type.isArray()) { | if (type.isArray()) { | ||||
desc.append('['); | desc.append('['); | ||||
try { | try { | ||||
* @param paramTypes parameter types | * @param paramTypes parameter types | ||||
*/ | */ | ||||
public static String ofMethod(CtClass returnType, CtClass[] paramTypes) { | public static String ofMethod(CtClass returnType, CtClass[] paramTypes) { | ||||
StringBuffer desc = new StringBuffer(); | |||||
StringBuilder desc = new StringBuilder(); | |||||
desc.append('('); | desc.append('('); | ||||
if (paramTypes != null) { | if (paramTypes != null) { | ||||
int n = paramTypes.length; | int n = paramTypes.length; | ||||
int i = desc.indexOf(')'); | int i = desc.indexOf(')'); | ||||
if (i < 0) | if (i < 0) | ||||
return desc; | return desc; | ||||
StringBuffer newdesc = new StringBuffer(); | |||||
StringBuilder newdesc = new StringBuilder(); | |||||
newdesc.append(desc.substring(0, i)); | newdesc.append(desc.substring(0, i)); | ||||
newdesc.append('L'); | newdesc.append('L'); | ||||
newdesc.append(classname.replace('.', '/')); | newdesc.append(classname.replace('.', '/')); | ||||
int i = descriptor.indexOf(')'); | int i = descriptor.indexOf(')'); | ||||
if (i < 0) | if (i < 0) | ||||
return descriptor; | return descriptor; | ||||
StringBuffer newdesc = new StringBuffer(); | |||||
StringBuilder newdesc = new StringBuilder(); | |||||
newdesc.append(descriptor.substring(0, i)); | newdesc.append(descriptor.substring(0, i)); | ||||
toDescriptor(newdesc, type); | toDescriptor(newdesc, type); | ||||
newdesc.append(descriptor.substring(i)); | newdesc.append(descriptor.substring(i)); | ||||
int i = desc.indexOf(')'); | int i = desc.indexOf(')'); | ||||
if (i < 0) | if (i < 0) | ||||
return desc; | return desc; | ||||
StringBuffer newdesc = new StringBuffer(); | |||||
StringBuilder newdesc = new StringBuilder(); | |||||
newdesc.append(desc.substring(0, i + 1)); | newdesc.append(desc.substring(0, i + 1)); | ||||
newdesc.append('L'); | newdesc.append('L'); | ||||
newdesc.append(classname.replace('.', '/')); | newdesc.append(classname.replace('.', '/')); | ||||
} | } | ||||
if (arrayDim > 0) { | if (arrayDim > 0) { | ||||
StringBuffer sbuf = new StringBuffer(name); | |||||
StringBuilder sbuf = new StringBuilder(name); | |||||
while (arrayDim-- > 0) | while (arrayDim-- > 0) | ||||
sbuf.append("[]"); | sbuf.append("[]"); | ||||
static class PrettyPrinter { | static class PrettyPrinter { | ||||
static String toString(String desc) { | static String toString(String desc) { | ||||
StringBuffer sbuf = new StringBuffer(); | |||||
StringBuilder sbuf = new StringBuilder(); | |||||
if (desc.charAt(0) == '(') { | if (desc.charAt(0) == '(') { | ||||
int pos = 1; | int pos = 1; | ||||
sbuf.append('('); | sbuf.append('('); | ||||
return sbuf.toString(); | return sbuf.toString(); | ||||
} | } | ||||
static int readType(StringBuffer sbuf, int pos, String desc) { | |||||
static int readType(StringBuilder sbuf, int pos, String desc) { | |||||
char c = desc.charAt(pos); | char c = desc.charAt(pos); | ||||
int arrayDim = 0; | int arrayDim = 0; | ||||
while (c == '[') { | while (c == '[') { |
private static String lookupSwitch(CodeIterator iter, int pos) { | private static String lookupSwitch(CodeIterator iter, int pos) { | ||||
StringBuffer buffer = new StringBuffer("lookupswitch {\n"); | |||||
StringBuilder buffer = new StringBuilder("lookupswitch {\n"); | |||||
int index = (pos & ~3) + 4; | int index = (pos & ~3) + 4; | ||||
// default | // default | ||||
buffer.append("\t\tdefault: ").append(pos + iter.s32bitAt(index)).append("\n"); | |||||
buffer.append("\t\tdefault: ").append(pos + iter.s32bitAt(index)).append('\n'); | |||||
int npairs = iter.s32bitAt(index += 4); | int npairs = iter.s32bitAt(index += 4); | ||||
int end = npairs * 8 + (index += 4); | int end = npairs * 8 + (index += 4); | ||||
for (; index < end; index += 8) { | for (; index < end; index += 8) { | ||||
int match = iter.s32bitAt(index); | int match = iter.s32bitAt(index); | ||||
int target = iter.s32bitAt(index + 4) + pos; | int target = iter.s32bitAt(index + 4) + pos; | ||||
buffer.append("\t\t").append(match).append(": ").append(target).append("\n"); | |||||
buffer.append("\t\t").append(match).append(": ").append(target).append('\n'); | |||||
} | } | ||||
buffer.setCharAt(buffer.length() - 1, '}'); | buffer.setCharAt(buffer.length() - 1, '}'); | ||||
private static String tableSwitch(CodeIterator iter, int pos) { | private static String tableSwitch(CodeIterator iter, int pos) { | ||||
StringBuffer buffer = new StringBuffer("tableswitch {\n"); | |||||
StringBuilder buffer = new StringBuilder("tableswitch {\n"); | |||||
int index = (pos & ~3) + 4; | int index = (pos & ~3) + 4; | ||||
// default | // default | ||||
buffer.append("\t\tdefault: ").append(pos + iter.s32bitAt(index)).append("\n"); | |||||
buffer.append("\t\tdefault: ").append(pos + iter.s32bitAt(index)).append('\n'); | |||||
int low = iter.s32bitAt(index += 4); | int low = iter.s32bitAt(index += 4); | ||||
int high = iter.s32bitAt(index += 4); | int high = iter.s32bitAt(index += 4); | ||||
int end = (high - low + 1) * 4 + (index += 4); | int end = (high - low + 1) * 4 + (index += 4); | ||||
// Offset table | // Offset table | ||||
for (int key = low; index < end; index += 4, key++) { | for (int key = low; index < end; index += 4, key++) { | ||||
int target = iter.s32bitAt(index) + pos; | int target = iter.s32bitAt(index) + pos; | ||||
buffer.append("\t\t").append(key).append(": ").append(target).append("\n"); | |||||
buffer.append("\t\t").append(key).append(": ").append(target).append('\n'); | |||||
} | } | ||||
buffer.setCharAt(buffer.length() - 1, '}'); | buffer.setCharAt(buffer.length() - 1, '}'); |
StringBuilder sbuf = new StringBuilder(); | StringBuilder sbuf = new StringBuilder(); | ||||
for (Annotation[] a : aa) { | for (Annotation[] a : aa) { | ||||
for (Annotation i : a) | for (Annotation i : a) | ||||
sbuf.append(i.toString()).append(" "); | |||||
sbuf.append(i.toString()).append(' '); | |||||
sbuf.append(", "); | sbuf.append(", "); | ||||
} | } |
*/ | */ | ||||
@Override | @Override | ||||
public String toString() { | public String toString() { | ||||
StringBuffer sbuf = new StringBuffer(); | |||||
StringBuilder sbuf = new StringBuilder(); | |||||
TypeParameter.toString(sbuf, params); | TypeParameter.toString(sbuf, params); | ||||
sbuf.append(" extends ").append(superClass); | sbuf.append(" extends ").append(superClass); | ||||
* Returns the encoded string representing the method type signature. | * Returns the encoded string representing the method type signature. | ||||
*/ | */ | ||||
public String encode() { | public String encode() { | ||||
StringBuffer sbuf = new StringBuffer(); | |||||
StringBuilder sbuf = new StringBuilder(); | |||||
if (params.length > 0) { | if (params.length > 0) { | ||||
sbuf.append('<'); | sbuf.append('<'); | ||||
for (int i = 0; i < params.length; i++) | for (int i = 0; i < params.length; i++) | ||||
*/ | */ | ||||
@Override | @Override | ||||
public String toString() { | public String toString() { | ||||
StringBuffer sbuf = new StringBuffer(); | |||||
StringBuilder sbuf = new StringBuilder(); | |||||
TypeParameter.toString(sbuf, typeParams); | TypeParameter.toString(sbuf, typeParams); | ||||
sbuf.append(" ("); | sbuf.append(" ("); | ||||
* Returns the encoded string representing the method type signature. | * Returns the encoded string representing the method type signature. | ||||
*/ | */ | ||||
public String encode() { | public String encode() { | ||||
StringBuffer sbuf = new StringBuffer(); | |||||
StringBuilder sbuf = new StringBuilder(); | |||||
if (typeParams.length > 0) { | if (typeParams.length > 0) { | ||||
sbuf.append('<'); | sbuf.append('<'); | ||||
for (int i = 0; i < typeParams.length; i++) | for (int i = 0; i < typeParams.length; i++) | ||||
*/ | */ | ||||
@Override | @Override | ||||
public String toString() { | public String toString() { | ||||
StringBuffer sbuf = new StringBuffer(getName()); | |||||
StringBuilder sbuf = new StringBuilder(getName()); | |||||
if (superClass != null) | if (superClass != null) | ||||
sbuf.append(" extends ").append(superClass.toString()); | sbuf.append(" extends ").append(superClass.toString()); | ||||
return sbuf.toString(); | return sbuf.toString(); | ||||
} | } | ||||
static void toString(StringBuffer sbuf, TypeParameter[] tp) { | |||||
static void toString(StringBuilder sbuf, TypeParameter[] tp) { | |||||
sbuf.append('<'); | sbuf.append('<'); | ||||
for (int i = 0; i < tp.length; i++) { | for (int i = 0; i < tp.length; i++) { | ||||
if (i > 0) | if (i > 0) | ||||
sbuf.append('>'); | sbuf.append('>'); | ||||
} | } | ||||
void encode(StringBuffer sb) { | |||||
void encode(StringBuilder sb) { | |||||
sb.append(name); | sb.append(name); | ||||
if (superClass == null) | if (superClass == null) | ||||
sb.append(":Ljava/lang/Object;"); | sb.append(":Ljava/lang/Object;"); | ||||
return "? super " + type; | return "? super " + type; | ||||
} | } | ||||
static void encode(StringBuffer sb, TypeArgument[] args) { | |||||
static void encode(StringBuilder sb, TypeArgument[] args) { | |||||
sb.append('<'); | sb.append('<'); | ||||
for (int i = 0; i < args.length; i++) { | for (int i = 0; i < args.length; i++) { | ||||
TypeArgument ta = args[i]; | TypeArgument ta = args[i]; | ||||
* Primitive types and object types. | * Primitive types and object types. | ||||
*/ | */ | ||||
public static abstract class Type { | public static abstract class Type { | ||||
abstract void encode(StringBuffer sb); | |||||
static void toString(StringBuffer sbuf, Type[] ts) { | |||||
abstract void encode(StringBuilder sb); | |||||
static void toString(StringBuilder sbuf, Type[] ts) { | |||||
for (int i = 0; i < ts.length; i++) { | for (int i = 0; i < ts.length; i++) { | ||||
if (i > 0) | if (i > 0) | ||||
sbuf.append(", "); | sbuf.append(", "); | ||||
} | } | ||||
@Override | @Override | ||||
void encode(StringBuffer sb) { | |||||
void encode(StringBuilder sb) { | |||||
sb.append(descriptor); | sb.append(descriptor); | ||||
} | } | ||||
} | } | ||||
* Returns the encoded string representing the object type signature. | * Returns the encoded string representing the object type signature. | ||||
*/ | */ | ||||
public String encode() { | public String encode() { | ||||
StringBuffer sb = new StringBuffer(); | |||||
StringBuilder sb = new StringBuilder(); | |||||
encode(sb); | encode(sb); | ||||
return sb.toString(); | return sb.toString(); | ||||
} | } | ||||
*/ | */ | ||||
@Override | @Override | ||||
public String toString() { | public String toString() { | ||||
StringBuffer sbuf = new StringBuffer(); | |||||
StringBuilder sbuf = new StringBuilder(); | |||||
ClassType parent = getDeclaringClass(); | ClassType parent = getDeclaringClass(); | ||||
if (parent != null) | if (parent != null) | ||||
sbuf.append(parent.toString()).append('.'); | sbuf.append(parent.toString()).append('.'); | ||||
return toString2(sbuf); | return toString2(sbuf); | ||||
} | } | ||||
private String toString2(StringBuffer sbuf) { | |||||
private String toString2(StringBuilder sbuf) { | |||||
sbuf.append(name); | sbuf.append(name); | ||||
if (arguments != null) { | if (arguments != null) { | ||||
sbuf.append('<'); | sbuf.append('<'); | ||||
*/ | */ | ||||
@Override | @Override | ||||
public String jvmTypeName() { | public String jvmTypeName() { | ||||
StringBuffer sbuf = new StringBuffer(); | |||||
StringBuilder sbuf = new StringBuilder(); | |||||
ClassType parent = getDeclaringClass(); | ClassType parent = getDeclaringClass(); | ||||
if (parent != null) | if (parent != null) | ||||
sbuf.append(parent.jvmTypeName()).append('$'); | sbuf.append(parent.jvmTypeName()).append('$'); | ||||
} | } | ||||
@Override | @Override | ||||
void encode(StringBuffer sb) { | |||||
void encode(StringBuilder sb) { | |||||
sb.append('L'); | sb.append('L'); | ||||
encode2(sb); | encode2(sb); | ||||
sb.append(';'); | sb.append(';'); | ||||
} | } | ||||
void encode2(StringBuffer sb) { | |||||
void encode2(StringBuilder sb) { | |||||
ClassType parent = getDeclaringClass(); | ClassType parent = getDeclaringClass(); | ||||
if (parent != null) { | if (parent != null) { | ||||
parent.encode2(sb); | parent.encode2(sb); | ||||
*/ | */ | ||||
@Override | @Override | ||||
public String toString() { | public String toString() { | ||||
StringBuffer sbuf = new StringBuffer(componentType.toString()); | |||||
StringBuilder sbuf = new StringBuilder(componentType.toString()); | |||||
for (int i = 0; i < dim; i++) | for (int i = 0; i < dim; i++) | ||||
sbuf.append("[]"); | sbuf.append("[]"); | ||||
} | } | ||||
@Override | @Override | ||||
void encode(StringBuffer sb) { | |||||
void encode(StringBuilder sb) { | |||||
for (int i = 0; i < dim; i++) | for (int i = 0; i < dim; i++) | ||||
sb.append('['); | sb.append('['); | ||||
} | } | ||||
@Override | @Override | ||||
void encode(StringBuffer sb) { | |||||
void encode(StringBuilder sb) { | |||||
sb.append('T').append(name).append(';'); | sb.append('T').append(name).append(';'); | ||||
} | } | ||||
} | } |
} | } | ||||
@Override | @Override | ||||
protected void toString2(StringBuffer sbuf) { | |||||
protected void toString2(StringBuilder sbuf) { | |||||
super.toString2(sbuf); | super.toString2(sbuf); | ||||
sbuf.append(", incoming{"); | sbuf.append(", incoming{"); | ||||
for (int i = 0; i < entrances.length; i++) | for (int i = 0; i < entrances.length; i++) | ||||
sbuf.append(entrances[i].position).append(", "); | sbuf.append(entrances[i].position).append(", "); | ||||
sbuf.append("}"); | |||||
sbuf.append('}'); | |||||
} | } | ||||
BasicBlock[] getExit() { return exit; } | BasicBlock[] getExit() { return exit; } | ||||
*/ | */ | ||||
@Override | @Override | ||||
public String toString() { | public String toString() { | ||||
StringBuffer sbuf = new StringBuffer(); | |||||
StringBuilder sbuf = new StringBuilder(); | |||||
sbuf.append("Node[pos=").append(block().position()); | sbuf.append("Node[pos=").append(block().position()); | ||||
sbuf.append(", parent="); | sbuf.append(", parent="); | ||||
sbuf.append(parent == null ? "*" : Integer.toString(parent.block().position())); | sbuf.append(parent == null ? "*" : Integer.toString(parent.block().position())); |
@Override | @Override | ||||
public String toString() { | public String toString() { | ||||
StringBuffer buffer = new StringBuffer(); | |||||
StringBuilder buffer = new StringBuilder(); | |||||
buffer.append("locals = ["); | buffer.append("locals = ["); | ||||
for (int i = 0; i < locals.length; i++) { | for (int i = 0; i < locals.length; i++) { | ||||
if (i < top - 1) | if (i < top - 1) | ||||
buffer.append(", "); | buffer.append(", "); | ||||
} | } | ||||
buffer.append("]"); | |||||
buffer.append(']'); | |||||
return buffer.toString(); | return buffer.toString(); | ||||
} | } |
if (resolved != null) | if (resolved != null) | ||||
return resolved.toString(); | return resolved.toString(); | ||||
StringBuffer buffer = new StringBuffer("{"); | |||||
StringBuilder buffer = new StringBuilder(); | |||||
buffer.append('{'); | |||||
for (String key:interfaces.keySet()) | for (String key:interfaces.keySet()) | ||||
buffer.append(key).append(", "); | buffer.append(key).append(", "); | ||||
if (potentialClass != null) | if (potentialClass != null) | ||||
buffer.append("*").append(potentialClass.toString()); | |||||
buffer.append('*').append(potentialClass.toString()); | |||||
else | else | ||||
buffer.setLength(buffer.length() - 2); | buffer.setLength(buffer.length() - 2); | ||||
buffer.append("}"); | |||||
buffer.append('}'); | |||||
return buffer.toString(); | return buffer.toString(); | ||||
} | } | ||||
} | } |
*/ | */ | ||||
@Override | @Override | ||||
public String toString() { | public String toString() { | ||||
StringBuffer buf = new StringBuffer("@"); | |||||
StringBuilder buf = new StringBuilder(); | |||||
buf.append('@'); | |||||
buf.append(getTypeName()); | buf.append(getTypeName()); | ||||
if (members != null) { | if (members != null) { | ||||
buf.append("("); | |||||
buf.append('('); | |||||
for (String name:members.keySet()) { | for (String name:members.keySet()) { | ||||
buf.append(name).append("=") | |||||
buf.append(name).append('=') | |||||
.append(getMemberValue(name)) | .append(getMemberValue(name)) | ||||
.append(", "); | .append(", "); | ||||
} | } | ||||
buf.setLength(buf.length()-2); | buf.setLength(buf.length()-2); | ||||
buf.append(")"); | |||||
buf.append(')'); | |||||
} | } | ||||
return buf.toString(); | return buf.toString(); |
*/ | */ | ||||
@Override | @Override | ||||
public String toString() { | public String toString() { | ||||
StringBuffer buf = new StringBuffer("{"); | |||||
StringBuilder buf = new StringBuilder(); | |||||
buf.append('{'); | |||||
if (values != null) { | if (values != null) { | ||||
for (int i = 0; i < values.length; i++) { | for (int i = 0; i < values.length; i++) { | ||||
buf.append(values[i].toString()); | buf.append(values[i].toString()); | ||||
} | } | ||||
} | } | ||||
buf.append("}"); | |||||
buf.append('}'); | |||||
return buf.toString(); | return buf.toString(); | ||||
} | } | ||||
int index = classname.indexOf("[]"); | int index = classname.indexOf("[]"); | ||||
if (index != -1) { | if (index != -1) { | ||||
String rawType = classname.substring(0, index); | String rawType = classname.substring(0, index); | ||||
StringBuffer sb = new StringBuffer(Descriptor.of(rawType)); | |||||
StringBuilder sb = new StringBuilder(Descriptor.of(rawType)); | |||||
while (index != -1) { | while (index != -1) { | ||||
sb.insert(0, "["); | |||||
sb.insert(0, '['); | |||||
index = classname.indexOf("[]", index + 1); | index = classname.indexOf("[]", index + 1); | ||||
} | } | ||||
return sb.toString().replace('/', '.'); | return sb.toString().replace('/', '.'); |
@Override | @Override | ||||
public String toString() { | public String toString() { | ||||
StringBuffer sbuf = new StringBuffer(); | |||||
StringBuilder sbuf = new StringBuilder(); | |||||
String cname = this.getClass().getName(); | String cname = this.getClass().getName(); | ||||
int i = cname.lastIndexOf('.'); | int i = cname.lastIndexOf('.'); | ||||
sbuf.append(i < 0 ? cname : cname.substring(i + 1)); | sbuf.append(i < 0 ? cname : cname.substring(i + 1)); | ||||
sbuf.append("["); | |||||
sbuf.append('['); | |||||
toString2(sbuf); | toString2(sbuf); | ||||
sbuf.append("]"); | |||||
sbuf.append(']'); | |||||
return sbuf.toString(); | return sbuf.toString(); | ||||
} | } | ||||
protected void toString2(StringBuffer sbuf) { | |||||
protected void toString2(StringBuilder sbuf) { | |||||
sbuf.append("pos=").append(position).append(", len=") | sbuf.append("pos=").append(position).append(", len=") | ||||
.append(length).append(", in=").append(incoming) | .append(length).append(", in=").append(incoming) | ||||
.append(", exit{"); | .append(", exit{"); | ||||
if (exit != null) | if (exit != null) | ||||
for (BasicBlock b:exit) | for (BasicBlock b:exit) | ||||
sbuf.append(b.position).append(","); | |||||
sbuf.append(b.position).append(','); | |||||
sbuf.append("}, {"); | sbuf.append("}, {"); | ||||
Catch th = toCatch; | Catch th = toCatch; | ||||
while (th != null) { | while (th != null) { | ||||
sbuf.append("(").append(th.body.position).append(", ") | |||||
sbuf.append('(').append(th.body.position).append(", ") | |||||
.append(th.typeIndex).append("), "); | .append(th.typeIndex).append("), "); | ||||
th = th.next; | th = th.next; | ||||
} | } | ||||
sbuf.append("}"); | |||||
sbuf.append('}'); | |||||
} | } | ||||
/** | /** |
private String fixTypes2(List<TypeData> scc, Set<String> lowersSet, ClassPool cp) throws NotFoundException { | private String fixTypes2(List<TypeData> scc, Set<String> lowersSet, ClassPool cp) throws NotFoundException { | ||||
Iterator<String> it = lowersSet.iterator(); | Iterator<String> it = lowersSet.iterator(); | ||||
if (lowersSet.size() == 0) | |||||
if (lowersSet.isEmpty()) | |||||
return null; // only NullType | return null; // only NullType | ||||
else if (lowersSet.size() == 1) | else if (lowersSet.size() == 1) | ||||
return it.next(); | return it.next(); |
} | } | ||||
@Override | @Override | ||||
protected void toString2(StringBuffer sbuf) { | |||||
protected void toString2(StringBuilder sbuf) { | |||||
super.toString2(sbuf); | super.toString2(sbuf); | ||||
sbuf.append(",\n stack={"); | sbuf.append(",\n stack={"); | ||||
printTypes(sbuf, stackTop, stackTypes); | printTypes(sbuf, stackTop, stackTypes); | ||||
sbuf.append('}'); | sbuf.append('}'); | ||||
} | } | ||||
private void printTypes(StringBuffer sbuf, int size, | |||||
private void printTypes(StringBuilder sbuf, int size, | |||||
TypeData[] types) { | TypeData[] types) { | ||||
if (types == null) | if (types == null) | ||||
return; | return; |
if (dim == 0) | if (dim == 0) | ||||
return name; | return name; | ||||
StringBuffer sbuf = new StringBuffer(); | |||||
StringBuilder sbuf = new StringBuilder(); | |||||
int d = dim; | int d = dim; | ||||
while (d-- > 0) | while (d-- > 0) | ||||
sbuf.append('['); | sbuf.append('['); | ||||
break; | break; | ||||
} | } | ||||
StringBuffer sbuf = new StringBuffer(); | |||||
StringBuilder sbuf = new StringBuilder(); | |||||
while (dim-- > 0) | while (dim-- > 0) | ||||
sbuf.append('['); | sbuf.append('['); | ||||
boolean alwaysBranch = compileBooleanExpr(true, expr); | boolean alwaysBranch = compileBooleanExpr(true, expr); | ||||
if (alwaysBranch) { | if (alwaysBranch) { | ||||
bytecode.addOpcode(Opcode.GOTO); | bytecode.addOpcode(Opcode.GOTO); | ||||
alwaysBranch = breakList.size() == 0; | |||||
alwaysBranch = breakList.isEmpty(); | |||||
} | } | ||||
bytecode.addIndex(pc2 - bytecode.currentPc() + 1); | bytecode.addIndex(pc2 - bytecode.currentPc() + 1); | ||||
* must be passed to Class.forName(). | * must be passed to Class.forName(). | ||||
*/ | */ | ||||
name2 = MemberResolver.jvmToJavaName(name2); | name2 = MemberResolver.jvmToJavaName(name2); | ||||
StringBuffer sbuf = new StringBuffer(); | |||||
StringBuilder sbuf = new StringBuilder(); | |||||
while (i-- >= 0) | while (i-- >= 0) | ||||
sbuf.append('['); | sbuf.append('['); | ||||
/* To support $cflow(). | /* To support $cflow(). | ||||
*/ | */ | ||||
protected void atCflow(ASTList cname) throws CompileError { | protected void atCflow(ASTList cname) throws CompileError { | ||||
StringBuffer sbuf = new StringBuffer(); | |||||
StringBuilder sbuf = new StringBuilder(); | |||||
if (cname == null || cname.tail() != null) | if (cname == null || cname.tail() != null) | ||||
throw new CompileError("bad " + cflowName); | throw new CompileError("bad " + cflowName); | ||||
* <cflow> : $cflow '(' <cflow name> ')' | * <cflow> : $cflow '(' <cflow name> ')' | ||||
* <cflow name> : <identifier> ('.' <identifier>)* | * <cflow name> : <identifier> ('.' <identifier>)* | ||||
*/ | */ | ||||
private static void makeCflowName(StringBuffer sbuf, ASTree name) | |||||
private static void makeCflowName(StringBuilder sbuf, ASTree name) | |||||
throws CompileError | throws CompileError | ||||
{ | { | ||||
if (name instanceof Symbol) { | if (name instanceof Symbol) { |
public class Lex implements TokenId { | public class Lex implements TokenId { | ||||
private int lastChar; | private int lastChar; | ||||
private StringBuffer textBuffer; | |||||
private StringBuilder textBuffer; | |||||
private Token currentToken; | private Token currentToken; | ||||
private Token lookAheadTokens; | private Token lookAheadTokens; | ||||
*/ | */ | ||||
public Lex(String s) { | public Lex(String s) { | ||||
lastChar = -1; | lastChar = -1; | ||||
textBuffer = new StringBuffer(); | |||||
textBuffer = new StringBuilder(); | |||||
currentToken = new Token(); | currentToken = new Token(); | ||||
lookAheadTokens = null; | lookAheadTokens = null; | ||||
else if(c == '.'){ | else if(c == '.'){ | ||||
c = getc(); | c = getc(); | ||||
if ('0' <= c && c <= '9') { | if ('0' <= c && c <= '9') { | ||||
StringBuffer tbuf = textBuffer; | |||||
StringBuilder tbuf = textBuffer; | |||||
tbuf.setLength(0); | tbuf.setLength(0); | ||||
tbuf.append('.'); | tbuf.append('.'); | ||||
return readDouble(tbuf, c, token); | return readDouble(tbuf, c, token); | ||||
private int readStringL(Token token) { | private int readStringL(Token token) { | ||||
int c; | int c; | ||||
StringBuffer tbuf = textBuffer; | |||||
StringBuilder tbuf = textBuffer; | |||||
tbuf.setLength(0); | tbuf.setLength(0); | ||||
for (;;) { | for (;;) { | ||||
while ((c = getc()) != '"') { | while ((c = getc()) != '"') { | ||||
} | } | ||||
else if (c2 == 'E' || c2 == 'e' | else if (c2 == 'E' || c2 == 'e' | ||||
|| c2 == 'D' || c2 == 'd' || c2 == '.') { | || c2 == 'D' || c2 == 'd' || c2 == '.') { | ||||
StringBuffer tbuf = textBuffer; | |||||
StringBuilder tbuf = textBuffer; | |||||
tbuf.setLength(0); | tbuf.setLength(0); | ||||
tbuf.append(value); | tbuf.append(value); | ||||
return readDouble(tbuf, c2, token); | return readDouble(tbuf, c2, token); | ||||
} | } | ||||
} | } | ||||
private int readDouble(StringBuffer sbuf, int c, Token token) { | |||||
private int readDouble(StringBuilder sbuf, int c, Token token) { | |||||
if (c != 'E' && c != 'e' && c != 'D' && c != 'd') { | if (c != 'E' && c != 'e' && c != 'D' && c != 'd') { | ||||
sbuf.append((char)c); | sbuf.append((char)c); | ||||
for (;;) { | for (;;) { | ||||
} | } | ||||
private int readIdentifier(int c, Token token) { | private int readIdentifier(int c, Token token) { | ||||
StringBuffer tbuf = textBuffer; | |||||
StringBuilder tbuf = textBuffer; | |||||
tbuf.setLength(0); | tbuf.setLength(0); | ||||
do { | do { |
int i = classname.lastIndexOf('.'); | int i = classname.lastIndexOf('.'); | ||||
if (notCheckInner || i < 0) | if (notCheckInner || i < 0) | ||||
throw e; | throw e; | ||||
StringBuffer sbuf = new StringBuffer(classname); | |||||
StringBuilder sbuf = new StringBuilder(classname); | |||||
sbuf.setCharAt(i, '$'); | sbuf.setCharAt(i, '$'); | ||||
classname = sbuf.toString(); | classname = sbuf.toString(); | ||||
} | } |
{ | { | ||||
String cname = toClassName(className); | String cname = toClassName(className); | ||||
if (dim > 0) { | if (dim > 0) { | ||||
StringBuffer sbuf = new StringBuffer(); | |||||
StringBuilder sbuf = new StringBuilder(); | |||||
while (dim-- > 0) | while (dim-- > 0) | ||||
sbuf.append('['); | sbuf.append('['); | ||||
private String toClassName(ASTree name) | private String toClassName(ASTree name) | ||||
throws CompileError | throws CompileError | ||||
{ | { | ||||
StringBuffer sbuf = new StringBuffer(); | |||||
StringBuilder sbuf = new StringBuilder(); | |||||
toClassName(name, sbuf); | toClassName(name, sbuf); | ||||
return sbuf.toString(); | return sbuf.toString(); | ||||
} | } | ||||
private void toClassName(ASTree name, StringBuffer sbuf) | |||||
private void toClassName(ASTree name, StringBuilder sbuf) | |||||
throws CompileError | throws CompileError | ||||
{ | { | ||||
if (name instanceof Symbol) { | if (name instanceof Symbol) { |
*/ | */ | ||||
protected static String argTypesToString(int[] types, int[] dims, | protected static String argTypesToString(int[] types, int[] dims, | ||||
String[] cnames) { | String[] cnames) { | ||||
StringBuffer sbuf = new StringBuffer(); | |||||
StringBuilder sbuf = new StringBuilder(); | |||||
sbuf.append('('); | sbuf.append('('); | ||||
int n = types.length; | int n = types.length; | ||||
if (n > 0) { | if (n > 0) { | ||||
* Converts a tuple of exprType, arrayDim, and className | * Converts a tuple of exprType, arrayDim, and className | ||||
* into a String object. | * into a String object. | ||||
*/ | */ | ||||
protected static StringBuffer typeToString(StringBuffer sbuf, | |||||
protected static StringBuilder typeToString(StringBuilder sbuf, | |||||
int type, int dim, String cname) { | int type, int dim, String cname) { | ||||
String s; | String s; | ||||
if (type == CLASS) | if (type == CLASS) |
@Override | @Override | ||||
public String toString() { | public String toString() { | ||||
StringBuffer sbuf = new StringBuffer(); | |||||
StringBuilder sbuf = new StringBuilder(); | |||||
sbuf.append("(<"); | sbuf.append("(<"); | ||||
sbuf.append(getTag()); | sbuf.append(getTag()); | ||||
sbuf.append('>'); | sbuf.append('>'); |
@Override | @Override | ||||
public String toString() { | public String toString() { | ||||
StringBuffer sbuf = new StringBuffer(); | |||||
StringBuilder sbuf = new StringBuilder(); | |||||
sbuf.append('<'); | sbuf.append('<'); | ||||
sbuf.append(getTag()); | sbuf.append(getTag()); | ||||
sbuf.append('>'); | sbuf.append('>'); |
if (name == null) | if (name == null) | ||||
return null; | return null; | ||||
StringBuffer sbuf = new StringBuffer(); | |||||
StringBuilder sbuf = new StringBuilder(); | |||||
astToClassName(sbuf, name, sep); | astToClassName(sbuf, name, sep); | ||||
return sbuf.toString(); | return sbuf.toString(); | ||||
} | } | ||||
private static void astToClassName(StringBuffer sbuf, ASTList name, | |||||
private static void astToClassName(StringBuilder sbuf, ASTList name, | |||||
char sep) { | char sep) { | ||||
for (;;) { | for (;;) { | ||||
ASTree h = name.head(); | ASTree h = name.head(); |
@Override | @Override | ||||
public String toString() { | public String toString() { | ||||
StringBuffer sbuf = new StringBuffer(); | |||||
StringBuilder sbuf = new StringBuilder(); | |||||
sbuf.append("(<Pair> "); | sbuf.append("(<Pair> "); | ||||
sbuf.append(left == null ? "<null>" : left.toString()); | sbuf.append(left == null ? "<null>" : left.toString()); | ||||
sbuf.append(" . "); | sbuf.append(" . "); |
break; | break; | ||||
} | } | ||||
if (methodName.equals("")) | |||||
if ("".equals(methodName)) | |||||
methodName = null; | methodName = null; | ||||
return methodName; | return methodName; |
if (!rtclass.isArray()) | if (!rtclass.isArray()) | ||||
name = rtclass.getName(); | name = rtclass.getName(); | ||||
else { | else { | ||||
StringBuffer sbuf = new StringBuffer(); | |||||
StringBuilder sbuf = new StringBuilder(); | |||||
do { | do { | ||||
sbuf.append("[]"); | sbuf.append("[]"); | ||||
rtclass = rtclass.getComponentType(); | rtclass = rtclass.getComponentType(); |
} | } | ||||
private String readLine(InputStream in) throws IOException { | private String readLine(InputStream in) throws IOException { | ||||
StringBuffer buf = new StringBuffer(); | |||||
StringBuilder buf = new StringBuilder(); | |||||
int c; | int c; | ||||
while ((c = in.read()) >= 0 && c != 0x0d) | while ((c = in.read()) >= 0 && c != 0x0d) | ||||
buf.append((char)c); | buf.append((char)c); |
public String getKey(Class<?> superClass, Class<?>[] interfaces, byte[] signature, boolean useWriteReplace) | public String getKey(Class<?> superClass, Class<?>[] interfaces, byte[] signature, boolean useWriteReplace) | ||||
{ | { | ||||
StringBuffer sbuf = new StringBuffer(); | |||||
StringBuilder sbuf = new StringBuilder(); | |||||
if (superClass != null){ | if (superClass != null){ | ||||
sbuf.append(superClass.getName()); | sbuf.append(superClass.getName()); | ||||
} | } | ||||
sbuf.append(":"); | |||||
sbuf.append(':'); | |||||
for (int i = 0; i < interfaces.length; i++) { | for (int i = 0; i < interfaces.length; i++) { | ||||
sbuf.append(interfaces[i].getName()); | sbuf.append(interfaces[i].getName()); | ||||
sbuf.append(":"); | |||||
sbuf.append(':'); | |||||
} | } | ||||
for (int i = 0; i < signature.length; i++) { | for (int i = 0; i < signature.length; i++) { | ||||
byte b = signature[i]; | byte b = signature[i]; |
* @param retType return type. | * @param retType return type. | ||||
*/ | */ | ||||
public static String makeDescriptor(Class<?>[] params, Class<?> retType) { | public static String makeDescriptor(Class<?>[] params, Class<?> retType) { | ||||
StringBuffer sbuf = new StringBuffer(); | |||||
StringBuilder sbuf = new StringBuilder(); | |||||
sbuf.append('('); | sbuf.append('('); | ||||
for (int i = 0; i < params.length; i++) | for (int i = 0; i < params.length; i++) | ||||
makeDesc(sbuf, params[i]); | makeDesc(sbuf, params[i]); | ||||
* @param retType return type. | * @param retType return type. | ||||
*/ | */ | ||||
public static String makeDescriptor(String params, Class<?> retType) { | public static String makeDescriptor(String params, Class<?> retType) { | ||||
StringBuffer sbuf = new StringBuffer(params); | |||||
StringBuilder sbuf = new StringBuilder(params); | |||||
makeDesc(sbuf, retType); | makeDesc(sbuf, retType); | ||||
return sbuf.toString(); | return sbuf.toString(); | ||||
} | } | ||||
private static void makeDesc(StringBuffer sbuf, Class<?> type) { | |||||
private static void makeDesc(StringBuilder sbuf, Class<?> type) { | |||||
if (type.isArray()) { | if (type.isArray()) { | ||||
sbuf.append('['); | sbuf.append('['); | ||||
makeDesc(sbuf, type.getComponentType()); | makeDesc(sbuf, type.getComponentType()); |