From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 29425 invoked by alias); 7 Dec 2007 21:43:31 -0000 Received: (qmail 29410 invoked by uid 22791); 7 Dec 2007 21:43:30 -0000 X-Spam-Status: No, hits=-1.2 required=5.0 tests=AWL,BAYES_40,DK_POLICY_SIGNSOME,SPF_HELO_PASS,SPF_PASS X-Spam-Check-By: sourceware.org Received: from mx1.redhat.com (HELO mx1.redhat.com) (66.187.233.31) by sourceware.org (qpsmtpd/0.31) with ESMTP; Fri, 07 Dec 2007 21:43:24 +0000 Received: from int-mx1.corp.redhat.com (int-mx1.corp.redhat.com [172.16.52.254]) by mx1.redhat.com (8.13.8/8.13.1) with ESMTP id lB7LhMM1028092 for ; Fri, 7 Dec 2007 16:43:22 -0500 Received: from pobox.corp.redhat.com (pobox.corp.redhat.com [10.11.255.20]) by int-mx1.corp.redhat.com (8.13.1/8.13.1) with ESMTP id lB7LhMPh028004 for ; Fri, 7 Dec 2007 16:43:22 -0500 Received: from [172.16.57.153] (multics.rdu.redhat.com [172.16.57.153]) by pobox.corp.redhat.com (8.13.1/8.13.1) with ESMTP id lB7LhMTv008683 for ; Fri, 7 Dec 2007 16:43:22 -0500 Subject: Use StringBuilder instead of PrintWriter for type display From: Stan Cox To: Frysk List Content-Type: text/plain Date: Fri, 07 Dec 2007 21:43:00 -0000 Message-Id: <1197063360.10805.165.camel@multics.rdu.redhat.com> Mime-Version: 1.0 X-Mailer: Evolution 2.10.3 (2.10.3-4.fc7) Content-Transfer-Encoding: 7bit X-IsSubscribed: yes Mailing-List: contact frysk-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Post: List-Help: , Sender: frysk-owner@sourceware.org X-SW-Source: 2007-q4/txt/msg00212.txt.bz2 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