提交 5766562e authored 作者: Thomas Mueller's avatar Thomas Mueller

Java to C++ converter

上级 890a9624
......@@ -129,7 +129,7 @@ public class ClassObj {
if (isPrimitive) {
return "j" + className;
}
return className;
return JavaParser.toC(className);
}
/**
......@@ -178,6 +178,18 @@ public class ClassObj {
return instanceFields.get(name);
}
public int hashCode() {
return className.hashCode();
}
public boolean equals(Object other) {
if (other instanceof ClassObj) {
ClassObj c = (ClassObj) other;
return c.className.equals(className);
}
return false;
}
}
/**
......@@ -343,37 +355,64 @@ class Type {
boolean isVarArgs;
/**
* Whether this is a non-array primitive type.
* Use ref-counting.
*/
boolean refCount = JavaParser.REF_COUNT;
/**
* Whether this is a array or an non-primitive type.
*
* @return true if yes
*/
public boolean isSimplePrimitive() {
return arrayLevel == 0 && classObj.isPrimitive;
public boolean isObject() {
return arrayLevel > 0 || !classObj.isPrimitive;
}
public String toString() {
return asString();
}
public String asString() {
StringBuilder buff = new StringBuilder();
for (int i = 0; i < arrayLevel; i++) {
buff.append("ptr<array< ");
if (refCount) {
buff.append("ptr< ");
}
buff.append("array< ");
}
if (refCount) {
if (!classObj.isPrimitive) {
buff.append("ptr< ");
}
}
buff.append(classObj.toString());
if (refCount) {
if (!classObj.isPrimitive) {
buff.append(" >");
}
}
for (int i = 0; i < arrayLevel; i++) {
buff.append(" > >");
buff.append(" >");
if (refCount) {
buff.append(" >");
}
}
if (!refCount) {
if (isObject()) {
buff.append("*");
}
}
return buff.toString();
}
boolean isObject() {
return arrayLevel > 0 || !classObj.isPrimitive;
}
public int hashCode() {
return toString().hashCode();
}
public boolean equals(Object other) {
if (other instanceof Type) {
return this.toString().equals(other.toString());
Type t = (Type) other;
return t.classObj.equals(classObj) && t.arrayLevel == arrayLevel && t.isVarArgs == isVarArgs;
}
return false;
}
......
......@@ -13,15 +13,26 @@ import java.util.Iterator;
* An expression.
*/
public interface Expr {
// toString
String asString();
Type getType();
Expr cast(Type type);
}
/**
* The base expression class.
*/
abstract class ExprBase implements Expr {
public final String toString() {
return "_" + asString() + "_";
}
}
/**
* A method call.
*/
class CallExpr implements Expr {
class CallExpr extends ExprBase {
final ArrayList<Expr> args = new ArrayList<Expr>();
private final JavaParser context;
......@@ -53,7 +64,7 @@ class CallExpr implements Expr {
}
}
public String toString() {
public String asString() {
StringBuilder buff = new StringBuilder();
initMethod();
if (method.isIgnore) {
......@@ -70,7 +81,7 @@ class CallExpr implements Expr {
// static method
buff.append(JavaParser.toC(classObj.toString() + "." + method.name));
} else {
buff.append(expr.toString()).append("->");
buff.append(expr.asString()).append("->");
buff.append(method.name);
}
buff.append("(");
......@@ -82,7 +93,7 @@ class CallExpr implements Expr {
}
FieldObj f = paramIt.next();
i++;
buff.append(a.cast(f.type));
buff.append(a.cast(f.type).asString());
}
buff.append(")");
}
......@@ -103,14 +114,14 @@ class CallExpr implements Expr {
/**
* A assignment expression.
*/
class AssignExpr implements Expr {
class AssignExpr extends ExprBase {
Expr left;
String op;
Expr right;
public String toString() {
return left + " " + op + " " + right.cast(left.getType());
public String asString() {
return left.asString() + " " + op + " " + right.cast(left.getType()).asString();
}
public Type getType() {
......@@ -126,13 +137,13 @@ class AssignExpr implements Expr {
/**
* A conditional expression.
*/
class ConditionalExpr implements Expr {
class ConditionalExpr extends ExprBase {
Expr condition;
Expr ifTrue, ifFalse;
public String toString() {
return condition + " ? " + ifTrue + " : " + ifFalse;
public String asString() {
return condition.asString() + " ? " + ifTrue.asString() + " : " + ifFalse.asString();
}
public Type getType() {
......@@ -152,7 +163,7 @@ class ConditionalExpr implements Expr {
/**
* A literal.
*/
class LiteralExpr implements Expr {
class LiteralExpr extends ExprBase {
String literal;
private final JavaParser context;
......@@ -164,9 +175,9 @@ class LiteralExpr implements Expr {
this.className = className;
}
public String toString() {
public String asString() {
if ("null".equals(literal)) {
return JavaParser.toCType(type, true) + "()";
return type.asString() + "()";
}
return literal;
}
......@@ -192,7 +203,7 @@ class LiteralExpr implements Expr {
/**
* An operation.
*/
class OpExpr implements Expr {
class OpExpr extends ExprBase {
Expr left;
String op;
......@@ -203,11 +214,11 @@ class OpExpr implements Expr {
this.context = context;
}
public String toString() {
public String asString() {
if (left == null) {
return op + right;
return op + right.asString();
} else if (right == null) {
return left + op;
return left.asString() + op;
}
if (op.equals(">>>")) {
// ujint / ujlong
......@@ -216,7 +227,11 @@ class OpExpr implements Expr {
if (left.getType().isObject() || right.getType().isObject()) {
// TODO convert primitive to to String, call toString
StringBuilder buff = new StringBuilder();
buff.append("ptr<java_lang_StringBuilder>(new java_lang_StringBuilder(");
if (JavaParser.REF_COUNT) {
buff.append("ptr<java_lang_StringBuilder>(new java_lang_StringBuilder(");
} else {
buff.append("(new java_lang_StringBuilder(");
}
buff.append(convertToString(left));
buff.append("))->append(");
buff.append(convertToString(right));
......@@ -224,7 +239,7 @@ class OpExpr implements Expr {
return buff.toString();
}
}
return "(" + left + " " + op + " " + right + ")";
return "(" + left.asString() + " " + op + " " + right.asString() + ")";
}
private String convertToString(Expr e) {
......@@ -234,11 +249,11 @@ class OpExpr implements Expr {
}
if (t.classObj.isPrimitive) {
ClassObj wrapper = context.getWrapper(t.classObj);
return JavaParser.toC(wrapper + ".toString") + "(" + e.toString() + ")";
} else if (e.getType().toString().equals("java_lang_String*")) {
return e.toString();
return JavaParser.toC(wrapper + ".toString") + "(" + e.asString() + ")";
} else if (e.getType().asString().equals("java_lang_String*")) {
return e.asString();
}
return e.toString() + "->toString()";
return e.asString() + "->toString()";
}
private static boolean isComparison(String op) {
......@@ -282,7 +297,7 @@ class OpExpr implements Expr {
/**
* A "new" expression.
*/
class NewExpr implements Expr {
class NewExpr extends ExprBase {
ClassObj classObj;
ArrayList<Expr> arrayInitExpr = new ArrayList<Expr>();
......@@ -293,23 +308,29 @@ class NewExpr implements Expr {
this.context = context;
}
public String toString() {
public String asString() {
StringBuilder buff = new StringBuilder();
if (arrayInitExpr.size() > 0) {
buff.append("ptr<array<" + classObj + "> >(new array<" + classObj + ">(1 ");
if (JavaParser.REF_COUNT) {
buff.append("ptr< array< " + classObj.toString() + " > >");
}
buff.append("(new array< " + classObj + " >(1 ");
for (Expr e : arrayInitExpr) {
buff.append("* ").append(e);
buff.append("* ").append(e.asString());
}
buff.append("))");
} else {
buff.append("ptr<" + JavaParser.toC(classObj.toString()) + ">(new " + JavaParser.toC(classObj.toString()));
if (JavaParser.REF_COUNT) {
buff.append("ptr< " + classObj.toString() + " >");
}
buff.append("(new " + JavaParser.toC(classObj.toString()));
buff.append("(");
int i = 0;
for (Expr a : args) {
if (i++ > 0) {
buff.append(", ");
}
buff.append(a);
buff.append(a.asString());
}
buff.append("))");
}
......@@ -332,7 +353,7 @@ class NewExpr implements Expr {
/**
* A String literal.
*/
class StringExpr implements Expr {
class StringExpr extends ExprBase {
/**
* The constant name.
......@@ -351,7 +372,7 @@ class StringExpr implements Expr {
this.context = context;
}
public String toString() {
public String asString() {
return constantName;
}
......@@ -426,7 +447,7 @@ class StringExpr implements Expr {
/**
* A variable.
*/
class VariableExpr implements Expr {
class VariableExpr extends ExprBase {
Expr base;
FieldObj field;
......@@ -437,11 +458,11 @@ class VariableExpr implements Expr {
this.context = context;
}
public String toString() {
public String asString() {
init();
StringBuilder buff = new StringBuilder();
if (base != null) {
buff.append(base.toString()).append("->");
buff.append(base.asString()).append("->");
}
if (field != null) {
if (field.isStatic) {
......@@ -487,12 +508,12 @@ class VariableExpr implements Expr {
/**
* A array access expression.
*/
class ArrayExpr implements Expr {
class ArrayExpr extends ExprBase {
Expr expr;
ArrayList<Expr> indexes = new ArrayList<Expr>();
public String toString() {
public String asString() {
StringBuilder buff = new StringBuilder();
buff.append(expr.toString());
for (Expr e : indexes) {
......@@ -514,7 +535,7 @@ class ArrayExpr implements Expr {
/**
* An array initializer expression.
*/
class ArrayInitExpr implements Expr {
class ArrayInitExpr extends ExprBase {
Type type;
ArrayList<Expr> list = new ArrayList<Expr>();
......@@ -523,7 +544,7 @@ class ArrayInitExpr implements Expr {
return type;
}
public String toString() {
public String asString() {
StringBuilder buff = new StringBuilder("{ ");
int i = 0;
for (Expr e : list) {
......@@ -545,7 +566,7 @@ class ArrayInitExpr implements Expr {
/**
* A type cast expression.
*/
class CastExpr implements Expr {
class CastExpr extends ExprBase {
Type type;
Expr expr;
......@@ -554,8 +575,8 @@ class CastExpr implements Expr {
return type;
}
public String toString() {
return "(" + type + ") " + expr;
public String asString() {
return "(" + type.asString() + ") " + expr.asString();
}
public Expr cast(Type type) {
......@@ -567,7 +588,7 @@ class CastExpr implements Expr {
/**
* An array access expression (get or set).
*/
class ArrayAccessExpr implements Expr {
class ArrayAccessExpr extends ExprBase {
Expr base;
Expr index;
......@@ -579,8 +600,8 @@ class ArrayAccessExpr implements Expr {
return t;
}
public String toString() {
return base + "->at(" + index + ")";
public String asString() {
return base.asString() + "->at(" + index.asString() + ")";
}
public Expr cast(Type type) {
......
......@@ -22,6 +22,8 @@ import org.h2.util.New;
*/
public class JavaParser {
public static final boolean REF_COUNT = true;
private static final HashMap<String, ClassObj> BUILT_IN_CLASSES = New.hashMap();
private static final int TOKEN_LITERAL_CHAR = 0;
......@@ -1561,7 +1563,7 @@ public class JavaParser {
if (f.isFinal) {
buff.append("const ");
}
buff.append(toCType(f.type, !f.isLocalField));
buff.append(f.type.asString());
buff.append(" ").append(toC(c.className + "." + f.name));
buff.append(";");
out.println(buff.toString());
......@@ -1572,14 +1574,14 @@ public class JavaParser {
continue;
}
if (m.isStatic) {
out.print(toCType(m.returnType, true));
out.print(m.returnType.asString());
out.print(" " + toC(c.className + "_" + m.name) + "(");
int i = 0;
for (FieldObj p : m.parameters.values()) {
if (i > 0) {
out.print(", ");
}
out.print(toCType(p.type, false) + " " + p.name);
out.print(p.type.asString() + " " + p.name);
i++;
}
out.println(");");
......@@ -1600,7 +1602,7 @@ public class JavaParser {
out.println("public:");
for (FieldObj f : c.instanceFields.values()) {
out.print(" ");
out.print(toCType(f.type, !f.isLocalField) + " " + f.name);
out.print(f.type.asString() + " " + f.name);
if (f.value != null) {
out.print(" = " + f.value);
}
......@@ -1618,14 +1620,14 @@ public class JavaParser {
if (m.isConstructor) {
out.print(" " + toC(c.className) + "(");
} else {
out.print(" " + toCType(m.returnType, true) + " " + m.name + "(");
out.print(" " + m.returnType.asString() + " " + m.name + "(");
}
int i = 0;
for (FieldObj p : m.parameters.values()) {
if (i > 0) {
out.print(", ");
}
out.print(toCType(p.type, false));
out.print(p.type.asString());
out.print(" " + p.name);
i++;
}
......@@ -1638,7 +1640,11 @@ public class JavaParser {
Collections.sort(constantNames);
for (String c : constantNames) {
String s = stringConstantToStringMap.get(c);
out.println("ptr<java_lang_String> " + c + " = STRING(L\"" + s + "\");");
if (JavaParser.REF_COUNT) {
out.println("ptr<java_lang_String> " + c + " = STRING(L\"" + s + "\");");
} else {
out.println("java_lang_String* " + c + " = STRING(L\"" + s + "\");");
}
}
}
......@@ -1658,10 +1664,10 @@ public class JavaParser {
if (f.isFinal) {
buff.append("const ");
}
buff.append(toCType(f.type, !f.isLocalField));
buff.append(f.type.asString());
buff.append(" ").append(toC(c.className + "." + f.name));
if (f.value != null) {
buff.append(" = " + f.value);
buff.append(" = ").append(f.value.asString());
}
buff.append(";");
out.println(buff.toString());
......@@ -1672,18 +1678,18 @@ public class JavaParser {
continue;
}
if (m.isStatic) {
out.print(toCType(m.returnType, true) + " " + toC(c.className + "_" + m.name) + "(");
out.print(m.returnType.asString() + " " + toC(c.className + "_" + m.name) + "(");
} else if (m.isConstructor) {
out.print(toC(c.className) + "::" + toC(c.className) + "(");
} else {
out.print(toCType(m.returnType, true) + " " + toC(c.className) + "::" + m.name + "(");
out.print(m.returnType.asString() + " " + toC(c.className) + "::" + m.name + "(");
}
int i = 0;
for (FieldObj p : m.parameters.values()) {
if (i > 0) {
out.print(", ");
}
out.print(toCType(p.type, false) + " " + p.name);
out.print(p.type.asString() + " " + p.name);
i++;
}
out.println(") {");
......@@ -1737,39 +1743,6 @@ public class JavaParser {
return identifier.replace('.', '_');
}
static String toCType(Type type, boolean refCounted) {
// TODO not everything needs to be ref-counted
refCounted = true;
StringBuilder buff = new StringBuilder();
for (int i = 0; i < type.arrayLevel; i++) {
if (refCounted) {
buff.append("ptr<array< ");
} else {
buff.append("array< ");
}
}
if (type.classObj.isPrimitive) {
buff.append(toC(type.classObj.toString()));
} else {
if (refCounted) {
buff.append("ptr<").append(toC(type.classObj.toString())).append('>');
} else {
buff.append(toC(type.classObj.toString()));
}
}
for (int i = 0; i < type.arrayLevel; i++) {
if (refCounted) {
buff.append(" > >");
} else {
buff.append(" >");
}
}
if (!refCounted) {
buff.append("*");
}
return buff.toString();
}
ClassObj getClassObj() {
return classObj;
}
......
......@@ -41,10 +41,13 @@ class ReturnStatement extends StatementBase {
if (expr == null) {
return "return;";
}
if (expr.getType().isSimplePrimitive()) {
return "return " + expr + ";";
if (!expr.getType().isObject()) {
return "return " + expr.asString() + ";";
}
return "return " + JavaParser.toCType(expr.getType(), true) + "(" + expr + ");";
if (JavaParser.REF_COUNT) {
return "return " + expr.getType().asString() + "(" + expr.asString() + ");";
}
return "return " + expr.asString() + ";";
}
}
......@@ -58,7 +61,7 @@ class DoWhileStatement extends StatementBase {
Statement block;
public String toString() {
return "do {\n" + block + "} while (" + condition + ");";
return "do {\n" + block + "} while (" + condition.asString() + ");";
}
}
......@@ -108,9 +111,9 @@ class SwitchStatement extends StatementBase {
public String toString() {
StringBuilder buff = new StringBuilder();
buff.append("switch (").append(expr).append(") {\n");
buff.append("switch (").append(expr.asString()).append(") {\n");
for (int i = 0; i < cases.size(); i++) {
buff.append("case " + cases.get(i) + ":\n");
buff.append("case " + cases.get(i).asString() + ":\n");
buff.append(blocks.get(i).toString());
}
if (defaultBlock != null) {
......@@ -131,7 +134,7 @@ class ExprStatement extends StatementBase {
Expr expr;
public String toString() {
return expr + ";";
return expr.asString() + ";";
}
}
......@@ -145,7 +148,7 @@ class WhileStatement extends StatementBase {
Statement block;
public String toString() {
String w = "while (" + condition + ")";
String w = "while (" + condition.asString() + ")";
String s = block.toString();
return w + "\n" + s;
}
......@@ -162,7 +165,7 @@ class IfStatement extends StatementBase {
Statement elseBlock;
public String toString() {
String w = "if (" + condition + ") {\n";
String w = "if (" + condition.asString() + ") {\n";
String s = block.toString();
if (elseBlock != null) {
s += "} else {\n" + elseBlock.toString();
......@@ -179,7 +182,6 @@ class ForStatement extends StatementBase {
Statement init;
Expr condition;
Expr update;
Statement block;
ArrayList<Expr> updates = new ArrayList<Expr>();
Type iterableType;
......@@ -193,9 +195,9 @@ class ForStatement extends StatementBase {
Type it = iterable.getType();
if (it != null && it.arrayLevel > 0) {
String idx = "i_" + iterableVariable;
buff.append("int " + idx + " = 0; " + idx + " < " + iterable + "->length(); " + idx + "++");
buff.append("int " + idx + " = 0; " + idx + " < " + iterable.asString() + "->length(); " + idx + "++");
buff.append(") {\n");
buff.append(JavaParser.indent(iterableType + " " + iterableVariable + " = " + iterable + "->at("+ idx +");\n"));
buff.append(JavaParser.indent(iterableType + " " + iterableVariable + " = " + iterable.asString() + "->at("+ idx +");\n"));
buff.append(block.toString()).append("}");
} else {
// TODO iterate over a collection
......@@ -207,12 +209,12 @@ class ForStatement extends StatementBase {
}
} else {
buff.append(init.toString());
buff.append(" ").append(condition.toString()).append("; ");
buff.append(" ").append(condition.asString()).append("; ");
for (int i = 0; i < updates.size(); i++) {
if (i > 0) {
buff.append(", ");
}
buff.append(updates.get(i));
buff.append(updates.get(i).asString());
}
buff.append(") {\n");
buff.append(block.toString()).append("}");
......@@ -253,7 +255,7 @@ class VarDecStatement extends StatementBase {
public String toString() {
StringBuilder buff = new StringBuilder();
buff.append(JavaParser.toCType(type, true)).append(' ');
buff.append(type.asString()).append(' ');
StringBuilder assign = new StringBuilder();
for (int i = 0; i < variables.size(); i++) {
if (i > 0) {
......@@ -263,10 +265,10 @@ class VarDecStatement extends StatementBase {
buff.append(varName);
Expr value = values.get(i);
if (value != null) {
if (value.getType().isSimplePrimitive()) {
buff.append(" = ").append(value);
if (!value.getType().isObject()) {
buff.append(" = ").append(value.asString());
} else {
assign.append(varName).append(" = ").append(value).append(";\n");
assign.append(varName).append(" = ").append(value.asString()).append(";\n");
}
}
}
......
......@@ -86,4 +86,5 @@ public class Test extends TestBase {
w.close();
}
}
......@@ -14,6 +14,7 @@ public class TestApp {
/* c:
int main(int argc, char** argv) {
// org_h2_java_TestApp_main(0);
org_h2_java_TestApp_main(ptr<array<ptr<java_lang_String> > >());
}
......
......@@ -33,6 +33,8 @@ import org.h2.java.Local;
#define STRING(s) ptr<java_lang_String>(new java_lang_String(ptr< array<jchar> >(new array<jchar>(s, (jint) wcslen(s)))));
// #define STRING(s) new java_lang_String(new array<jchar>(s, (jint) wcslen(s)));
class RefBase {
protected:
jint refCount;
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论