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

Java to C++ converter

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