X-Git-Url: http://git.megacz.com/?p=org.ibex.classgen.git;a=blobdiff_plain;f=src%2Forg%2Fibex%2Fclassgen%2FJSSA.java;h=c16f5e607c4122b5f9f3dd8617762ccb3f18fe05;hp=d304d0f4e867d16d7a8e2480cac1288d15ed137a;hb=e2cfb2a90a85bcb7a8f6a6a6a6a8c9e0a3d1d371;hpb=bc4d7cc9145dfdd0feba52e05cd0d33b7eff9efb diff --git a/src/org/ibex/classgen/JSSA.java b/src/org/ibex/classgen/JSSA.java index d304d0f..c16f5e6 100644 --- a/src/org/ibex/classgen/JSSA.java +++ b/src/org/ibex/classgen/JSSA.java @@ -73,8 +73,14 @@ public class JSSA extends MethodGen implements CGConst { /** JVM stack pointer */ private int sp = 0; - private Expr push(Expr e) { return stack[sp++] = e; } - private Expr pop() { return stack[--sp]; } + private Expr push(Expr e) { + if(sp == stack.length-1) throw new IllegalStateException("stack overflow"); + return stack[sp++] = e; + } + private Expr pop() { + if(sp == 0) throw new IllegalStateException("stack underflow"); + return stack[--sp]; + } // SSA-node classes ///////////////////////////////////////////////////////////////////////////////////////// @@ -191,20 +197,33 @@ public class JSSA extends MethodGen implements CGConst { public class Cast extends Expr { final Expr e; final Type t; - public Cast(Expr e, Type t) { this.e = e; this.t = t; } + public Cast(Expr e, Type t) { + if(e.getType().isRef() != t.isRef()) throw new IllegalArgumentException("invalid cast"); + // FEATURE: Check that one is a subclass of the other if it is a ref + this.e = e; + this.t = t; + } public Type getType() { return t; } } public class InstanceOf extends Expr { final Expr e; - final Type t; - public InstanceOf(Expr e, Type t) { this.e = e; this.t = t; } + final Type.Ref t; + public InstanceOf(Expr e, Type.Ref t) { + if(!e.getType().isRef()) throw new IllegalArgumentException("can't do an instanceof check on a non-ref"); + this.e = e; + this.t = t; + } public Type getType() { return Type.BOOLEAN; } } public class Throw extends Op { public final Expr e; - public Throw(Expr e) { this.e = e; } + public Throw(Expr e) { + if(!e.getType().isRef()) throw new IllegalArgumentException("can't throw a non ref"); + // FEATURE: CHeck that it is a subclass of Throwable + this.e = e; + } } public class Branch extends Op { @@ -527,8 +546,8 @@ public class JSSA extends MethodGen implements CGConst { // Runtime Type information ////////////////////////////////////////////////////////////////////////////// - case CHECKCAST: push(new Cast(pop(), (Type)arg)); return null; - case INSTANCEOF: push(new InstanceOf(pop(), (Type)arg)); return null; + case CHECKCAST: push(new Cast(pop(), (Type.Ref)arg)); return null; + case INSTANCEOF: push(new InstanceOf(pop(), (Type.Ref)arg)); return null; case LDC: case LDC_W: case LDC2_W: push(new Constant(arg)); return null;