This is the mail archive of the
frysk@sourceware.org
mailing list for the frysk project.
Use StringBuilder instead of PrintWriter for type display
- From: Stan Cox <scox at redhat dot com>
- To: Frysk List <frysk at sourceware dot org>
- Date: Fri, 07 Dec 2007 16:36:00 -0500
- Subject: Use StringBuilder instead of PrintWriter for type display
This changes type display so it builds in a StringBuilder
instead of displaying a piece at a time. Most of the changes are
changing writer.print to stringBuilder.append. A printf style %s token
is used to support types like
"int (*ptr_arr) [4]" where (in this instance) the name and pointer
info have to be inserted a printf %s string is used. For instance
ArrayType would construct "int %s [4]" and then PointerType would
massage that to "int (*%s) [4] and if it is member of a struct
CompositeType would massage it to "int (*ptr_arr) [4]" (otherwise "int
(*) [4]). This allows removal of some instanceof checks and some
specialized code.
EvalCommands - Don't pass writer to toPrint
--- a/frysk-core/frysk/hpd/EvalCommands.java
+++ b/frysk-core/frysk/hpd/EvalCommands.java
@@ -71,8 +71,7 @@ abstract class EvalCommands extends
ParameterizedCommand {
static final Printer TYPE = new Printer() {
void print(Expression e, PrintWriter writer, Format format,
ByteBuffer memory) {
- e.getType().toPrint(writer, 0);
- writer.println();
+ writer.println(e.getType().toPrint());
}
};
static final Printer TREE = new Printer() {
ArrayType - Insert %s where name/ptr would go
--- a/frysk-core/frysk/value/ArrayType.java
+++ b/frysk-core/frysk/value/ArrayType.java
@@ -275,20 +275,17 @@ public class ArrayType
return noNullByte;
}
- public void toPrint(PrintWriter writer, String s, int indent) {
- type.toPrint(writer, indent);
- writer.print(" " + s);
+ public void toPrint(StringBuilder stringBuilder, int indent) {
+ type.toPrint(stringBuilder, indent);
+ stringBuilder.append(" ");
+ stringBuilder.append("%s");
for(int i = 0; i < this.dimension.length; i++) {
- writer.print("[");
- writer.print(dimension[i]);
- writer.print("]");
+ stringBuilder.append("[");
+ stringBuilder.append(dimension[i]);
+ stringBuilder.append("]");
}
}
- public void toPrint(PrintWriter writer, int indent) {
- this.toPrint(writer, "", indent);
- }
-
/* getALUs are double dispatch functions to determine
* the ArithmeticUnit for an operation between two types.
*/
CompositeType - Insert name for %s, remove some specialized code
--- a/frysk-core/frysk/value/CompositeType.java
+++ b/frysk-core/frysk/value/CompositeType.java
@@ -275,7 +275,7 @@ public abstract class CompositeType
writer.print("}");
}
- public void toPrint(PrintWriter writer, int indentation) {
+ public void toPrint(StringBuilder stringBuilder, int indentation) {
if (indentation == 0)
indentation = 2;
String indentPrefix = "";
@@ -283,10 +283,10 @@ public abstract class CompositeType
indentPrefix = indentPrefix + " ";
// {class,union,struct} NAME
- writer.print(getPrefix());
+ stringBuilder.append(getPrefix());
if (getName() != null && getName().length() > 0) {
- writer.print(" ");
- writer.print(getName());
+ stringBuilder.append(" ");
+ stringBuilder.append(getName());
}
// : public PARENT ...
boolean first = true;
@@ -298,57 +298,43 @@ public abstract class CompositeType
if (!member.inheritance)
break;
if (first) {
- writer.print(" : ");
+ stringBuilder.append(" : ");
first = false;
} else {
- writer.print(", ");
+ stringBuilder.append(", ");
}
if (member.access != null) {
- writer.print(member.access.toPrint());
- writer.print(" ");
+ stringBuilder.append(member.access.toPrint());
+ stringBuilder.append(" ");
}
- writer.print(member.type.getName());
+ stringBuilder.append(member.type.getName());
member = null;
}
// { content ... }
Access previousAccess = null;
- writer.print(" {\n");
+ stringBuilder.append(" {\n");
while (member != null) {
- boolean printName = true;
if (member.access != previousAccess) {
previousAccess = member.access;
if (member.access != null) {
- writer.print(" ");
- writer.print(member.access.toPrint());
- writer.print(":\n");
+ stringBuilder.append(" ");
+ stringBuilder.append(member.access.toPrint());
+ stringBuilder.append(":\n");
}
}
- writer.print(indentPrefix);
- if (member.type instanceof ArrayType) {
- // For handling int x[2]
- printName = false;
- ((ArrayType) member.type).toPrint(writer, member.name, indentation +
2);
- }
- else if (member.type instanceof PointerType) {
- // For handling int (*x)[2]
- printName = false;
- ((PointerType) member.type).toPrint(writer, " " + member.name,
- indentation + 2);
- }
- else
- member.type.toPrint (writer, indentation + 2);
- if (member.type instanceof frysk.value.FunctionType)
- printName = false;
- if (printName) {
- writer.print(" ");
- writer.print(member.name);
+ stringBuilder.append(indentPrefix);
+ member.type.toPrint (stringBuilder, indentation + 2);
+ if (! toPrintFormat(stringBuilder, member.name)) {
+ if (stringBuilder.charAt(stringBuilder.length() - 1) != '*')
+ stringBuilder.append(" ");
+ stringBuilder.append(member.name);
}
if (member.bitSize > 0) {
- writer.print(":");
- writer.print(member.bitSize);
+ stringBuilder.append(":");
+ stringBuilder.append(member.bitSize);
}
- writer.print(";\n");
+ stringBuilder.append(";\n");
// Advance
if (i.hasNext())
member = (DynamicMember)i.next();
@@ -356,8 +342,8 @@ public abstract class CompositeType
member = null;
}
for (int indent = 1; indent <= indentation - 2; indent++)
- writer.print(" ");
- writer.print("}");
+ stringBuilder.append(" ");
+ stringBuilder.append("}");
}
public Value member(Value var1, String member)
PointerType Simplify handling of "type (*x) [n]"
diff --git a/frysk-core/frysk/value/PointerType.java
b/frysk-core/frysk/value/PointerType.java
index b6e2f27..1c702fd 100644
--- a/frysk-core/frysk/value/PointerType.java
+++ b/frysk-core/frysk/value/PointerType.java
@@ -79,9 +79,14 @@ public class PointerType
void toPrint(PrintWriter writer, Location location, ByteBuffer
memory,
Format format, int indent) {
// Print type of pointer
- writer.print("(");
- this.toPrint(writer, 0);
- writer.print(") ");
+ StringBuilder stringBuilder = new StringBuilder();
+ stringBuilder.append("(");
+ this.toPrint(stringBuilder, indent);
+ int percentIdx = stringBuilder.indexOf("%");
+ if (percentIdx >= 0)
+ stringBuilder.replace(percentIdx, percentIdx + 2, "");
+ stringBuilder.append(") ");
+ writer.print(stringBuilder);
try {
format.print(writer, location, this);
} catch (RuntimeException e) {
@@ -110,21 +115,20 @@ public class PointerType
}
}
- public void toPrint(PrintWriter writer, String s, int indent) {
+ public void toPrint(StringBuilder stringBuilder, int indent) {
// For handling int (*x)[2]
if (type instanceof ArrayType) {
- ((ArrayType)type).toPrint(writer, "(*" + s + ")", indent);
+ ((ArrayType)type).toPrint(stringBuilder, indent);
+ toPrintFormat(stringBuilder, "(*%s)");
}
else {
- type.toPrint(writer, indent);
- writer.print(" *" + s);
+ type.toPrint(stringBuilder, indent);
+ if (stringBuilder.charAt(stringBuilder.length() - 1) != '*')
+ stringBuilder.append(" ");
+ stringBuilder.append("*");
}
- }
+ }
- public void toPrint(PrintWriter writer, int indent) {
- this.toPrint(writer, "", indent);
- }
-
protected Type clone(IntegerType accessor) {
return new PointerType(getName(), order(), getSize(), type, accessor);
}
Type - Add toPrintFormat, sort of a poor man's printf
--- a/frysk-core/frysk/value/Type.java
+++ b/frysk-core/frysk/value/Type.java
@@ -112,16 +112,28 @@ public abstract class Type {
/**
* Print this Type after indenting INDENT spaces.
+ * @param stringBuilder TODO
*/
- public abstract void toPrint(PrintWriter writer, int indent);
+ public abstract void toPrint(StringBuilder stringBuilder, int
indent);
+
/**
* Print this Type to a StringBuffer and return the String.
*/
public final String toPrint() {
- StringWriter stringWriter = new StringWriter();
- PrintWriter writer = new PrintWriter(stringWriter);
- toPrint(writer, 0);
- return stringWriter.toString();
+ StringBuilder stringBuilder = new StringBuilder();
+ toPrint(stringBuilder, 0);
+ toPrintFormat(stringBuilder, "");
+ return stringBuilder.toString();
+ }
+
+ public boolean toPrintFormat(StringBuilder stringBuilder, String
string) {
+ int percentIdx = stringBuilder.indexOf("%");
+ if (percentIdx >= 0) {
+ stringBuilder.replace(percentIdx, percentIdx + 2, string);
+ return true;
+ }
+ else
+ return false;
}
/* getALUs are double dispatch functions to determine the
These just have writer -> stringBuilder changes
EnumType
FunctionType
TypeDecorator
TypeDef
UnknownType
Variable
VoidType
ArithmeticType