mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-10-26 12:31:29 +01:00
+ new -varparas option that adds overloads for imported methods whereby
Java array parameters are translated into single element var-parameters git-svn-id: trunk@21407 -
This commit is contained in:
parent
252483ffd8
commit
3a2afe27aa
@ -79,6 +79,7 @@ public class JavapEnvironment {
|
|||||||
String prefix_constant = "";
|
String prefix_constant = "";
|
||||||
String prefix_field = "f";
|
String prefix_field = "f";
|
||||||
String prefix_innerclass = "Inner";
|
String prefix_innerclass = "Inner";
|
||||||
|
boolean addVarOverloads = false;
|
||||||
|
|
||||||
public JavapEnvironment() {
|
public JavapEnvironment() {
|
||||||
excludePrefixes = new ArrayList<String>();
|
excludePrefixes = new ArrayList<String>();
|
||||||
|
|||||||
@ -287,6 +287,42 @@ public class JavapPrinter {
|
|||||||
prefix=prefix.substring(2);
|
prefix=prefix.substring(2);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected void PrintSignatureVariants(PascalMethodData method, StringBuilder sigStart, StringBuilder sigEnd, boolean useConstOpenArray, boolean forceSingleVarVersion){
|
||||||
|
java.util.Set<PascalTypeSignature.ParaFlags> paraFlags;
|
||||||
|
|
||||||
|
paraFlags = java.util.EnumSet.noneOf(PascalTypeSignature.ParaFlags.class);
|
||||||
|
String dynArrParas = method.getParameters(paraFlags);
|
||||||
|
|
||||||
|
paraFlags.add(PascalTypeSignature.ParaFlags.OpenArrays);
|
||||||
|
if (useConstOpenArray)
|
||||||
|
paraFlags.add(PascalTypeSignature.ParaFlags.OpenConstArrays);
|
||||||
|
String openArrParas = method.getParameters(paraFlags);
|
||||||
|
|
||||||
|
String regularVarParas = "";
|
||||||
|
if (env.addVarOverloads &&
|
||||||
|
(!useConstOpenArray ||
|
||||||
|
forceSingleVarVersion)) {
|
||||||
|
paraFlags = java.util.EnumSet.noneOf(PascalTypeSignature.ParaFlags.class);
|
||||||
|
paraFlags.add(PascalTypeSignature.ParaFlags.SingleVar);
|
||||||
|
regularVarParas = method.getParameters(paraFlags);
|
||||||
|
}
|
||||||
|
|
||||||
|
out.print(sigStart+dynArrParas+sigEnd);
|
||||||
|
printExceptions(method);
|
||||||
|
out.println();
|
||||||
|
if (!dynArrParas.equals(openArrParas)) {
|
||||||
|
out.print(sigStart+openArrParas+sigEnd);
|
||||||
|
printExceptions(method);
|
||||||
|
out.println();
|
||||||
|
}
|
||||||
|
if ((regularVarParas != "") &&
|
||||||
|
!dynArrParas.equals(regularVarParas)) {
|
||||||
|
out.print(sigStart+regularVarParas+sigEnd);
|
||||||
|
printExceptions(method);
|
||||||
|
out.println();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Print method signature.
|
* Print method signature.
|
||||||
*/
|
*/
|
||||||
@ -301,20 +337,12 @@ public class JavapPrinter {
|
|||||||
sigEnd = new StringBuilder();
|
sigEnd = new StringBuilder();
|
||||||
// to fix compilation in Delphi mode
|
// to fix compilation in Delphi mode
|
||||||
sigEnd.append("; overload;");
|
sigEnd.append("; overload;");
|
||||||
String dynArrParas = method.getParameters(false,true);
|
PrintSignatureVariants(method,sigStart,sigEnd,true,true);
|
||||||
String openArrParas = method.getParameters(true,true);
|
|
||||||
out.print(sigStart+dynArrParas+sigEnd);
|
|
||||||
printExceptions(method);
|
|
||||||
out.println();
|
|
||||||
if (!dynArrParas.equals(openArrParas)) {
|
|
||||||
out.print(sigStart+openArrParas+sigEnd);
|
|
||||||
printExceptions(method);
|
|
||||||
out.println();
|
|
||||||
}
|
|
||||||
}else if(pascalName.equals("<clinit>")){
|
}else if(pascalName.equals("<clinit>")){
|
||||||
sigStart.append("class constructor classcreate");
|
sigStart.append("class constructor classcreate");
|
||||||
}else{
|
}else{
|
||||||
String rettype = method.getReturnType();
|
String rettype = method.getReturnType();
|
||||||
|
java.util.Set<PascalTypeSignature.ParaFlags> paraFlags;
|
||||||
if (method.isStatic())
|
if (method.isStatic())
|
||||||
sigStart.append("class ");
|
sigStart.append("class ");
|
||||||
if (rettype.equals(""))
|
if (rettype.equals(""))
|
||||||
@ -335,16 +363,8 @@ public class JavapPrinter {
|
|||||||
// all interface methods are marked as "abstract", and cannot be final
|
// all interface methods are marked as "abstract", and cannot be final
|
||||||
if (!cls.isInterface())
|
if (!cls.isInterface())
|
||||||
sigEnd.append(method.getModifiers());
|
sigEnd.append(method.getModifiers());
|
||||||
String dynArrParas = method.getParameters(false,false);
|
|
||||||
String openArrParas = method.getParameters(true,varargs);
|
PrintSignatureVariants(method,sigStart,sigEnd,varargs,false);
|
||||||
out.print(sigStart+dynArrParas+sigEnd);
|
|
||||||
printExceptions(method);
|
|
||||||
out.println();
|
|
||||||
if (!dynArrParas.equals(openArrParas)) {
|
|
||||||
out.print(sigStart+openArrParas+sigEnd);
|
|
||||||
printExceptions(method);
|
|
||||||
out.println();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -112,6 +112,7 @@ public class Main{
|
|||||||
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");
|
||||||
out.println(" by the bootstrap class loader");
|
out.println(" by the bootstrap class loader");
|
||||||
|
out.println(" -varparas Add overloads that translate non-varargs array parameters into single-element 'var' parameters");
|
||||||
out.println(" -verbose Print stack size, number of locals and args for methods");
|
out.println(" -verbose Print stack size, number of locals and args for methods");
|
||||||
out.println(" If verifying, print reasons for failure");
|
out.println(" If verifying, print reasons for failure");
|
||||||
out.println();
|
out.println();
|
||||||
@ -227,6 +228,8 @@ public class Main{
|
|||||||
usage();
|
usage();
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
} else if (arg.equals("-varparas")) {
|
||||||
|
env.addVarOverloads = true;
|
||||||
} else {
|
} else {
|
||||||
error("invalid flag: " + arg);
|
error("invalid flag: " + arg);
|
||||||
usage();
|
usage();
|
||||||
|
|||||||
@ -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(env,getInternalSig(),cls,false,false).getFieldType();
|
return new PascalTypeSignature(env,getInternalSig(),cls,java.util.EnumSet.noneOf(PascalTypeSignature.ParaFlags.class)).getFieldType();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@ -41,7 +41,7 @@ public class PascalMethodData extends MethodData {
|
|||||||
*/
|
*/
|
||||||
public String getReturnType(){
|
public String getReturnType(){
|
||||||
|
|
||||||
String rttype = (new PascalTypeSignature(env,getInternalSig(), cls, false, false)).getReturnType();
|
String rttype = (new PascalTypeSignature(env,getInternalSig(), cls, java.util.EnumSet.noneOf(PascalTypeSignature.ParaFlags.class))).getReturnType();
|
||||||
return rttype;
|
return rttype;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -60,8 +60,8 @@ 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(java.util.Set<PascalTypeSignature.ParaFlags> paraFlags){
|
||||||
String ptype = (new PascalTypeSignature(env,getInternalSig(),cls,useOpenArrays,useConstOpenArrays)).getParameters();
|
String ptype = (new PascalTypeSignature(env,getInternalSig(),cls,paraFlags)).getParameters();
|
||||||
|
|
||||||
return ptype;
|
return ptype;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -4,18 +4,23 @@ import java.util.Vector;
|
|||||||
|
|
||||||
public class PascalTypeSignature extends TypeSignature {
|
public class PascalTypeSignature extends TypeSignature {
|
||||||
|
|
||||||
// use open arrays rather than dynamic arrays for array parameters
|
private java.util.Set<ParaFlags> paraFlags;
|
||||||
private boolean useOpenArrays;
|
|
||||||
// when creating open array parameters, declare them as "const" rather than var
|
|
||||||
// (done for constructors, under the assumption that these won't change the
|
|
||||||
// incoming data)
|
|
||||||
private boolean useConstOpenArrays;
|
|
||||||
private JavapEnvironment env;
|
private JavapEnvironment env;
|
||||||
|
|
||||||
public PascalTypeSignature(JavapEnvironment env, String JVMSignature, ClassData cls, boolean useOpenArrays, boolean useConstOpenArrays) {
|
public enum ParaFlags {
|
||||||
this.env = env;
|
// use open arrays rather than dynamic arrays for array parameters
|
||||||
this.useOpenArrays = useOpenArrays;
|
OpenArrays,
|
||||||
this.useConstOpenArrays = useConstOpenArrays;
|
// when creating open array parameters, declare them as "const" rather than var
|
||||||
|
// (done for constructors, under the assumption that these won't change the
|
||||||
|
// incoming data)
|
||||||
|
OpenConstArrays,
|
||||||
|
// translate array parameters into var parameters of single elements
|
||||||
|
SingleVar
|
||||||
|
}
|
||||||
|
|
||||||
|
public PascalTypeSignature(JavapEnvironment env, String JVMSignature, ClassData cls, java.util.Set<ParaFlags> paraFlags) {
|
||||||
|
this.env = env;
|
||||||
|
this.paraFlags=paraFlags;
|
||||||
init(JVMSignature);
|
init(JVMSignature);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -85,7 +90,8 @@ public class PascalTypeSignature extends TypeSignature {
|
|||||||
}else {
|
}else {
|
||||||
componentType = getBaseType(arrayType);
|
componentType = getBaseType(arrayType);
|
||||||
}
|
}
|
||||||
if (!useOpenArrays ||
|
if ((!paraFlags.contains(ParaFlags.OpenArrays) &&
|
||||||
|
!paraFlags.contains(ParaFlags.SingleVar)) ||
|
||||||
(dimCount>1))
|
(dimCount>1))
|
||||||
return outerClass+"Arr"+dimCount+componentType;
|
return outerClass+"Arr"+dimCount+componentType;
|
||||||
else
|
else
|
||||||
@ -106,7 +112,12 @@ public class PascalTypeSignature extends TypeSignature {
|
|||||||
String paraType = (String)parameters.elementAt(i);
|
String paraType = (String)parameters.elementAt(i);
|
||||||
// contents of open arrays could be changed -> var parameters
|
// contents of open arrays could be changed -> var parameters
|
||||||
if (paraType.contains("array of")) {
|
if (paraType.contains("array of")) {
|
||||||
if (!useConstOpenArrays)
|
if (paraFlags.contains(ParaFlags.SingleVar))
|
||||||
|
{
|
||||||
|
parametersignature.append("var ");
|
||||||
|
paraType = paraType.substring(paraType.indexOf("array of ")+"array of ".length());
|
||||||
|
}
|
||||||
|
else if (!paraFlags.contains(ParaFlags.OpenConstArrays))
|
||||||
parametersignature.append("var ");
|
parametersignature.append("var ");
|
||||||
else
|
else
|
||||||
parametersignature.append("const ");
|
parametersignature.append("const ");
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user