+ -prefix_constants <x>, -prefix_fields <x> and -prefix_innerclasses <x>

options to customise the prefixes that the translator adds to to resp.
  constant, field and inner class names. For an empty prefix, use "".
  Defaults: nothing for constants, "f" for fields and "Inner" for inner
  classes.

git-svn-id: branches/jvmbackend@21041 -
This commit is contained in:
Jonas Maebe 2012-04-25 18:14:35 +00:00
parent 9a10c5aea8
commit 81d1cfb3ca
11 changed files with 73 additions and 32 deletions

View File

@ -64,11 +64,13 @@ public class ClassData implements RuntimeConstants {
private Hashtable indexHashAscii = new Hashtable(); private Hashtable indexHashAscii = new Hashtable();
private String pkgPrefix=""; private String pkgPrefix="";
private int pkgPrefixLen=0; private int pkgPrefixLen=0;
protected JavapEnvironment env;
/** /**
* Read classfile to disassemble. * Read classfile to disassemble.
*/ */
public ClassData(InputStream infile){ public ClassData(JavapEnvironment env, InputStream infile){
this.env = env;
try{ try{
this.read(new DataInputStream(infile)); this.read(new DataInputStream(infile));
}catch (FileNotFoundException ee) { }catch (FileNotFoundException ee) {
@ -214,7 +216,7 @@ public class ClassData implements RuntimeConstants {
int fields_count = in.readUnsignedShort(); int fields_count = in.readUnsignedShort();
fields=new FieldData[fields_count]; fields=new FieldData[fields_count];
for (int k = 0; k < fields_count; k++) { for (int k = 0; k < fields_count; k++) {
FieldData field=new FieldData(this); FieldData field=new FieldData(env,this);
field.read(in); field.read(in);
fields[k]=field; fields[k]=field;
} }
@ -227,7 +229,7 @@ public class ClassData implements RuntimeConstants {
int methods_count = in.readUnsignedShort(); int methods_count = in.readUnsignedShort();
methods=new MethodData[methods_count]; methods=new MethodData[methods_count];
for (int k = 0; k < methods_count ; k++) { for (int k = 0; k < methods_count ; k++) {
MethodData method=new MethodData(this); MethodData method=new MethodData(env,this);
method.read(in); method.read(in);
methods[k]=method; methods[k]=method;
} }

View File

@ -49,8 +49,10 @@ public class FieldData implements RuntimeConstants {
boolean isSynthetic=false; boolean isSynthetic=false;
boolean isDeprecated=false; boolean isDeprecated=false;
Vector attrs; Vector attrs;
protected JavapEnvironment env;
public FieldData(ClassData cls){ public FieldData(JavapEnvironment env, ClassData cls){
this.env=env;
this.cls=cls; this.cls=cls;
} }

View File

@ -76,6 +76,9 @@ public class JavapEnvironment {
String outputName = "java"; String outputName = "java";
ArrayList<String> excludePrefixes; ArrayList<String> excludePrefixes;
ArrayList<String> skelPrefixes; ArrayList<String> skelPrefixes;
String prefix_constant = "";
String prefix_field = "f";
String prefix_innerclass = "Inner";
public JavapEnvironment() { public JavapEnvironment() {
excludePrefixes = new ArrayList<String>(); excludePrefixes = new ArrayList<String>();

View File

@ -244,7 +244,7 @@ public class JavapPrinter {
// print field attribute information. // print field attribute information.
printFieldAttributes(field); printFieldAttributes(field);
if (!field.isFormalConst()) { if (!field.isFormalConst()) {
out.print("; external name '"+fieldName.substring(1)+"'"); out.print("; external name '"+fieldName.substring(env.prefix_field.length())+"'");
} }
out.println(";"); out.println(";");
} }
@ -853,7 +853,7 @@ public class JavapPrinter {
for (int i = 0; i < innerClassPrinters.size(); i++) { for (int i = 0; i < innerClassPrinters.size(); i++) {
JavapPrinter innerPrinter = innerClassPrinters.get(i); JavapPrinter innerPrinter = innerClassPrinters.get(i);
if (checkInnerVisibility(innerPrinter.cls.access,protpub)) { if (checkInnerVisibility(innerPrinter.cls.access,protpub)) {
String shortInnerName = PascalClassData.getShortClassName(innerPrinter.cls.getClassName()); String shortInnerName = PascalClassData.getShortClassName(env,innerPrinter.cls.getClassName());
String shortInnerSafeName = ClassIdentifierInfo.AddIdentifierNameForClass(cls.getClassName(),shortInnerName); String shortInnerSafeName = ClassIdentifierInfo.AddIdentifierNameForClass(cls.getClassName(),shortInnerName);
if (first) { if (first) {
if (!cls.isInterface()) { if (!cls.isInterface()) {

View File

@ -105,6 +105,9 @@ public class Main{
out.println(" -public Print only public classes and members"); out.println(" -public Print only public classes and members");
out.println(" -protected Print protected/public classes and members"); out.println(" -protected Print protected/public classes and members");
out.println(" -private Show all classes and members"); out.println(" -private Show all classes and members");
out.println(" -prefix_constants <x> Prefix constant names with <x> (default: <nothing>)");
out.println(" -prefix_fields <x> Prefix field names with <x> (default: f)");
out.println(" -prefix_innerclasses <x> Prefix inner class names with <x> (default: Inner)");
out.println(" -x <class_or_pkgename> Treat this class/package as defined in another unit (suffix package names with '.'"); out.println(" -x <class_or_pkgename> Treat this class/package as defined in another unit (suffix package names with '.'");
out.println(" -s Print internal type signatures"); out.println(" -s Print internal type signatures");
out.println(" -bootclasspath <pathlist> Override location of class files loaded"); out.println(" -bootclasspath <pathlist> Override location of class files loaded");
@ -200,6 +203,30 @@ public class Main{
} }
} else if (arg.equals("-all")) { } else if (arg.equals("-all")) {
env.showallAttr = true; env.showallAttr = true;
} else if (arg.equals("-prefix_constants")) {
if ((i + 1) < argv.length) {
env.prefix_constant = argv[++i];
} else {
error("-prefix_constants requires argument");
usage();
return false;
}
} else if (arg.equals("-prefix_fields")) {
if ((i + 1) < argv.length) {
env.prefix_field = argv[++i];
} else {
error("-prefix_fields requires argument");
usage();
return false;
}
} else if (arg.equals("-prefix_innerclasses")) {
if ((i + 1) < argv.length) {
env.prefix_innerclass = argv[++i];
} else {
error("-prefix_innerclasses requires argument");
usage();
return false;
}
} else { } else {
error("invalid flag: " + arg); error("invalid flag: " + arg);
usage(); usage();

View File

@ -62,7 +62,10 @@ public class MethodData {
boolean isSynthetic=false; boolean isSynthetic=false;
boolean isDeprecated=false; boolean isDeprecated=false;
public MethodData(ClassData cls){ protected JavapEnvironment env;
public MethodData(JavapEnvironment env, ClassData cls){
this.env=env;
this.cls=cls; this.cls=cls;
} }

View File

@ -8,9 +8,10 @@ import java.util.HashSet;
import java.util.StringTokenizer; import java.util.StringTokenizer;
import java.util.Vector; import java.util.Vector;
import fpc.tools.javapp.JavapEnvironment;
public class PascalClassData extends ClassData { public class PascalClassData extends ClassData {
private JavapEnvironment env;
public PascalClassData outerClass; public PascalClassData outerClass;
private HashSet<String> nestedDependencies; private HashSet<String> nestedDependencies;
boolean setOuterDependencies; boolean setOuterDependencies;
@ -22,10 +23,9 @@ public class PascalClassData extends ClassData {
public PascalClassData(InputStream infile, PascalClassData outerClass, JavapEnvironment env, boolean doCollectDependencies) { public PascalClassData(InputStream infile, PascalClassData outerClass, JavapEnvironment env, boolean doCollectDependencies) {
super (infile); super (env,infile);
this.outerClass = outerClass; this.outerClass = outerClass;
this.nestedDependencies = new HashSet<String>(); this.nestedDependencies = new HashSet<String>();
this.env = env;
ClassIdentifierInfo.registerClassInfo(getClassName(),getSuperClassName(),getSuperInterfaces()); ClassIdentifierInfo.registerClassInfo(getClassName(),getSuperClassName(),getSuperInterfaces());
if (doCollectDependencies) { if (doCollectDependencies) {
collectDependencies(); collectDependencies();
@ -127,12 +127,12 @@ public class PascalClassData extends ClassData {
return outerClass != null; return outerClass != null;
} }
public static String getShortClassName(String className) { public static String getShortClassName(JavapEnvironment env, String className) {
int index; int index;
className = className.replace('-', '_'); className = className.replace('-', '_');
if (isInnerClass(className)) { if (isInnerClass(className)) {
index=className.lastIndexOf("$")+1; index=className.lastIndexOf("$")+1;
return "Inner"+className.substring(index); return env.prefix_innerclass+className.substring(index);
} }
else else
className = className.replace("$","__"); className = className.replace("$","__");
@ -240,7 +240,7 @@ public class PascalClassData extends ClassData {
} }
public String getShortClassName() { public String getShortClassName() {
return getShortClassName(getClassName()); return getShortClassName(env,getClassName());
} }
public String getShortPascalClassName() { public String getShortPascalClassName() {
@ -305,7 +305,7 @@ public class PascalClassData extends ClassData {
int fields_count = in.readUnsignedShort(); int fields_count = in.readUnsignedShort();
fields=new FieldData[fields_count]; fields=new FieldData[fields_count];
for (int k = 0; k < fields_count; k++) { for (int k = 0; k < fields_count; k++) {
FieldData field=new PascalFieldData(this); FieldData field=new PascalFieldData(env,this);
field.read(in); field.read(in);
fields[k]=field; fields[k]=field;
} }
@ -319,7 +319,7 @@ public class PascalClassData extends ClassData {
int methods_count = in.readUnsignedShort(); int methods_count = in.readUnsignedShort();
methods=new PascalMethodData[methods_count]; methods=new PascalMethodData[methods_count];
for (int k = 0; k < methods_count ; k++) { for (int k = 0; k < methods_count ; k++) {
MethodData method=new PascalMethodData(this); MethodData method=new PascalMethodData(env,this);
method.read(in); method.read(in);
methods[k]=method; methods[k]=method;
} }

View File

@ -8,8 +8,8 @@ public class PascalFieldData extends FieldData {
private String cachedName; private String cachedName;
public PascalFieldData(ClassData cls){ public PascalFieldData(JavapEnvironment env, ClassData cls){
super(cls); super(env, cls);
} }
public String getVisibilitySectionName(){ public String getVisibilitySectionName(){
@ -46,7 +46,7 @@ public class PascalFieldData extends FieldData {
* Returns Pascal type signature of a field. * Returns Pascal type signature of a field.
*/ */
public String getType(){ public String getType(){
return new PascalTypeSignature(getInternalSig(),cls,false,false).getFieldType(); return new PascalTypeSignature(env,getInternalSig(),cls,false,false).getFieldType();
} }
/** /**
@ -65,7 +65,9 @@ public class PascalFieldData extends FieldData {
String realName = super.getName(); String realName = super.getName();
// we prepend an "f" for fields to prevent name clashes // we prepend an "f" for fields to prevent name clashes
if (!isFormalConst()) if (!isFormalConst())
realName = "f" + realName; realName = env.prefix_field + realName;
else
realName = env.prefix_constant + realName;
cachedName = ClassIdentifierInfo.AddIdentifierNameForClass(cls.getClassName(),realName); cachedName = ClassIdentifierInfo.AddIdentifierNameForClass(cls.getClassName(),realName);
} }
return cachedName; return cachedName;

View File

@ -10,8 +10,8 @@ public class PascalMethodData extends MethodData {
private String cachedName; private String cachedName;
public PascalMethodData(ClassData cls) { public PascalMethodData(JavapEnvironment env, ClassData cls) {
super(cls); super(env,cls);
} }
public String getVisibilitySectionName(){ public String getVisibilitySectionName(){
@ -41,7 +41,7 @@ public class PascalMethodData extends MethodData {
*/ */
public String getReturnType(){ public String getReturnType(){
String rttype = (new PascalTypeSignature(getInternalSig(), cls, false, false)).getReturnType(); String rttype = (new PascalTypeSignature(env,getInternalSig(), cls, false, false)).getReturnType();
return rttype; return rttype;
} }
@ -61,7 +61,7 @@ public class PascalMethodData extends MethodData {
* Return java type parameter signature. * Return java type parameter signature.
*/ */
public String getParameters(boolean useOpenArrays, boolean useConstOpenArrays){ public String getParameters(boolean useOpenArrays, boolean useConstOpenArrays){
String ptype = (new PascalTypeSignature(getInternalSig(),cls,useOpenArrays,useConstOpenArrays)).getParameters(); String ptype = (new PascalTypeSignature(env,getInternalSig(),cls,useOpenArrays,useConstOpenArrays)).getParameters();
return ptype; return ptype;
} }

View File

@ -10,8 +10,10 @@ public class PascalTypeSignature extends TypeSignature {
// (done for constructors, under the assumption that these won't change the // (done for constructors, under the assumption that these won't change the
// incoming data) // incoming data)
private boolean useConstOpenArrays; private boolean useConstOpenArrays;
private JavapEnvironment env;
public PascalTypeSignature(String JVMSignature, ClassData cls, boolean useOpenArrays, boolean useConstOpenArrays) { public PascalTypeSignature(JavapEnvironment env, String JVMSignature, ClassData cls, boolean useOpenArrays, boolean useConstOpenArrays) {
this.env = env;
this.useOpenArrays = useOpenArrays; this.useOpenArrays = useOpenArrays;
this.useConstOpenArrays = useConstOpenArrays; this.useConstOpenArrays = useConstOpenArrays;
init(JVMSignature); init(JVMSignature);
@ -75,7 +77,7 @@ public class PascalTypeSignature extends TypeSignature {
!PascalClassData.currentUnit.isExternalInnerClass(baseType)) { !PascalClassData.currentUnit.isExternalInnerClass(baseType)) {
int index = baseType.lastIndexOf('$'); int index = baseType.lastIndexOf('$');
outerClass = PascalClassData.getShortPascalClassName(baseType.substring(0,index))+"."; outerClass = PascalClassData.getShortPascalClassName(baseType.substring(0,index))+".";
componentType = "Inner"+baseType.substring(index+1).replace('$', '.'); componentType = env.prefix_innerclass+baseType.substring(index+1).replace('$', '.');
} else { } else {
outerClass = ""; outerClass = "";
componentType = PascalClassData.getShortPascalClassName(baseType); componentType = PascalClassData.getShortPascalClassName(baseType);

View File

@ -114,10 +114,10 @@ public class PascalUnit {
} }
private String getDefaultShortPascalName(String classname) { private String getDefaultShortPascalName(String classname) {
String shortname = PascalClassData.getShortClassName(classname); String shortname = PascalClassData.getShortClassName(env,classname);
// inner class -> done (no naming problems) // inner class -> done (no naming problems)
if (classname.indexOf('$') != -1) if (classname.indexOf('$') != -1)
return "Inner"+shortname; return env.prefix_innerclass+shortname;
// no package? // no package?
if (shortname.equals(classname)) if (shortname.equals(classname))
@ -139,7 +139,7 @@ public class PascalUnit {
if (PascalClassData.isInnerClass(className)) { if (PascalClassData.isInnerClass(className)) {
int nestedIndex = className.indexOf('$'); int nestedIndex = className.indexOf('$');
// get the abbreviated Pascal name of the top-level class, followed by // get the abbreviated Pascal name of the top-level class, followed by
// "Inner" + the nested class names (to avoid identifier conflicts) // env.prefix_innerclass + the nested class names (to avoid identifier conflicts)
String res = getShortPascalName(className.substring(0,nestedIndex)); String res = getShortPascalName(className.substring(0,nestedIndex));
// create valid identifier for inner classes that only exist in external version // create valid identifier for inner classes that only exist in external version
if (isExternalInnerClass(className)) { if (isExternalInnerClass(className)) {
@ -148,7 +148,7 @@ public class PascalUnit {
} else { } else {
StringTokenizer innerTypes = new StringTokenizer(className.substring(nestedIndex+1), "$"); StringTokenizer innerTypes = new StringTokenizer(className.substring(nestedIndex+1), "$");
while (innerTypes.hasMoreTokens()) { while (innerTypes.hasMoreTokens()) {
res = res + "." + "Inner"+innerTypes.nextToken(); res = res + "." + env.prefix_innerclass+innerTypes.nextToken();
} }
} }
return res; return res;
@ -353,7 +353,7 @@ public class PascalUnit {
// remove added '$' again // remove added '$' again
finishingName = finishingName.substring(0,finishingName.length()-1); finishingName = finishingName.substring(0,finishingName.length()-1);
if (nestedClasses.size()>1) { if (nestedClasses.size()>1) {
finishingName = PascalClassData.getShortClassName(finishingName); finishingName = PascalClassData.getShortClassName(env,finishingName);
} else { } else {
finishingName = PascalClassData.getShortPascalClassName(finishingName); finishingName = PascalClassData.getShortPascalClassName(finishingName);
} }
@ -367,7 +367,7 @@ public class PascalUnit {
if (nestedClasses.size()>0) { if (nestedClasses.size()>0) {
unitFile.println(prefix+" type"); unitFile.println(prefix+" type");
prefix = prefix + " "; prefix = prefix + " ";
shortPascalName = PascalClassData.getShortClassName(curClass); shortPascalName = PascalClassData.getShortClassName(env,curClass);
} else { } else {
shortPascalName = PascalClassData.getShortPascalClassName(curClass); shortPascalName = PascalClassData.getShortPascalClassName(curClass);
unitFile.println(); unitFile.println();
@ -381,7 +381,7 @@ public class PascalUnit {
// remove added '$' again // remove added '$' again
finishingName = finishingName.substring(0,finishingName.length()-1); finishingName = finishingName.substring(0,finishingName.length()-1);
if (nestedClasses.size()>1) { if (nestedClasses.size()>1) {
finishingName = PascalClassData.getShortClassName(finishingName); finishingName = PascalClassData.getShortClassName(env,finishingName);
} else { } else {
finishingName = PascalClassData.getShortPascalClassName(finishingName); finishingName = PascalClassData.getShortPascalClassName(finishingName);
} }