public NewArray(Type.Array t, Expr[] dims) { this.t = t; this.dims = dims; }
public NewArray(Type.Array t, Expr dim) { this(t,new Expr[]{dim}); }
public Type getType() { return t; }
+ public String _toString() {
+ Type base = t;
+ int totalDims = 0;
+ while(base.isArray()) {
+ totalDims++;
+ base = base.asArray().getElementType();
+ }
+ StringBuffer sb = new StringBuffer("new " + base);
+ for(int i=0;i<totalDims;i++)
+ sb.append("[" + (i < dims.length ? dims[i].toString() : "") + "]");
+ return sb.toString();
+ }
}
public class Return extends Op {
final Expr e;
public Return() { this(VOID_EXPR); }
- public Return(Expr e) { this.e = e; }
+ public Return(Expr e) {
+ this.e = e;
+ if(Type.unify(method.getReturnType(),e.getType()) != method.getReturnType())
+ throw new IllegalArgumentException("type mismatch");
+ }
public String toString() { return e.getType() == Type.VOID ? "return" : ("return "+e.toString()); }
}
public class ArrayPut extends Op {
final Expr e, i, v;
- public ArrayPut(Expr e, Expr i, Expr v) { this.e = e; this.i = i; this.v = v; }
+ public ArrayPut(Expr v, Expr i, Expr e) { this.e = e; this.i = i; this.v = v; }
+ public String toString() { return e + "[" + i + "] := " + v; }
}
public class ArrayGet extends Expr {
final Expr e, i;
- public ArrayGet(Expr e, Expr i) { this.e = e; this.i = i; }
+ public ArrayGet(Expr i, Expr e) { this.e = e; this.i = i; }
public Type getType() { return e.getType().asArray().getElementType(); }
+ public String _toString() { return e + "[" + i + "]"; }
}
public class ArrayLength extends Expr {
private final Object o;
public Constant(int i) { this(new Integer(i)); }
public Constant(Object o) { this.o = o; }
- public String _toString() { return o instanceof String ? "\"" + o + "\"" : o.toString(); }
+ public String _toString() { return o == null ? "null" : o instanceof String ? "\"" + o + "\"" : o.toString(); }
public Type getType() {
+ if (o == null) return Type.NULL;
if (o instanceof Byte) return Type.BYTE;
if (o instanceof Short) return Type.SHORT;
if (o instanceof Character) return Type.CHAR;
// Stack manipulations //////////////////////////////////////////////////////////////////////////////
- case ACONST_NULL: return stack[sp++] = new Constant(null);
- case ICONST_M1: return stack[sp++] = new Constant(-1);
+ case ACONST_NULL: push(new Constant(null)); return null;
+ case ICONST_M1: push(new Constant(-1)); return null;
case ICONST_0: case LCONST_0: case FCONST_0: case DCONST_0: push(new Constant(0)); return null;
case ICONST_1: case LCONST_1: case FCONST_1: case DCONST_1: push(new Constant(1)); return null;
case ICONST_2: case FCONST_2: push(new Constant(2)); return null;
else prefix = "o";
s = prefix + (nextVar++);
bindingMap.put(e,s);
- return "(" + s + ":= " + e._toString() + ")";
+ return "(" + s + " = " + e._toString() + ")";
}
public static void main(String[] args) throws Exception {