// ino.module.WhileStmt.8659.package package mycompiler.mystatement; // ino.end // ino.module.WhileStmt.8659.import import java.util.Enumeration; import java.util.Hashtable; import java.util.Iterator; import java.util.Vector; import mycompiler.mybytecode.ClassFile; import mycompiler.mybytecode.CodeAttribute; import mycompiler.mybytecode.JVMCode; import mycompiler.myclass.Class; import mycompiler.myexception.CTypeReconstructionException; import mycompiler.myexception.JVMCodeException; import mycompiler.myexception.SCExcept; import mycompiler.myexception.SCStatementException; import mycompiler.myoperator.LogOp; import mycompiler.myoperator.Operator; import mycompiler.myoperator.RelOp; import mycompiler.mytype.BooleanType; import mycompiler.mytype.GenericTypeVar; import mycompiler.mytype.Pair; import mycompiler.mytype.RefType; import mycompiler.mytype.Type; import mycompiler.mytypereconstruction.CSupportData; import mycompiler.mytypereconstruction.CTriple; import mycompiler.mytypereconstruction.replacementlistener.CReplaceTypeEvent; import mycompiler.mytypereconstruction.set.CSubstitutionSet; import mycompiler.mytypereconstruction.set.CTripleSet; import mycompiler.mytypereconstruction.set.CTypeAssumptionSet; import mycompiler.mytypereconstruction.typeassumption.CTypeAssumption; import mycompiler.mytypereconstruction.unify.Unify; import org.apache.log4j.Logger; // ino.end import sun.reflect.generics.reflectiveObjects.NotImplementedException; import typinferenz.JavaCodeResult; import typinferenz.SingleConstraint; import typinferenz.ConstraintsSet; import typinferenz.ResultSet; import typinferenz.assumptions.TypeAssumptions; // ino.class.WhileStmt.26326.declaration public class WhileStmt extends Statement // ino.end // ino.class.WhileStmt.26326.body { // ino.method.WhileStmt.26330.definition public WhileStmt(int offset, int variableLength) // ino.end // ino.method.WhileStmt.26330.body { super(offset,variableLength); } // ino.end // ino.attribute.expr.26333.declaration public Expr expr; // ino.end // ino.attribute.loop_block.26336.declaration public Statement loop_block; // ino.end // ino.attribute.parserlog.26339.declaration protected static Logger parserlog = Logger.getLogger("parser"); // ino.end // ino.method.set_Expr.26342.definition public void set_Expr(Expr exp) // ino.end // ino.method.set_Expr.26342.body { this.expr = exp; } // ino.end // ino.method.set_Loop_block.26345.definition public void set_Loop_block(Statement blk) // ino.end // ino.method.set_Loop_block.26345.body { this.loop_block = blk; } // ino.end // ino.method.codegen.26351.definition public void codegen(ClassFile classfile, CodeAttribute code, Vector paralist) throws JVMCodeException // ino.end // ino.method.codegen.26351.body { if(loop_block!=null && expr!=null) { code.add_code(JVMCode.goto_); int breakpoint = code.get_code_length(); code.add_code_short(0); loop_block.codegen(classfile, code, paralist); code.set_code_short(code.get_code_length() + 1 - breakpoint, breakpoint); loop_codegen(classfile, code, breakpoint, false, paralist); } } // ino.end // ino.method.loop_codegen.26354.definition public void loop_codegen(ClassFile classfile, CodeAttribute code, int breakpoint, boolean not, Vector paralist) throws JVMCodeException // ino.end // ino.method.loop_codegen.26354.body { if(expr instanceof NotExpr) { expr = ((NotExpr)expr).get_Expr(); loop_codegen(classfile, code, breakpoint, !not, paralist); } else if(expr instanceof Binary) { Operator op = ((Binary)expr).get_Operator(); if(op instanceof LogOp) ((LogOp)op).loop_codegen(classfile, code, expr, breakpoint, !not, paralist); else if(op instanceof RelOp) { Expr expr1 = ((Binary)expr).get_Expr1(); Expr expr2 = ((Binary)expr).get_Expr2(); expr1.codegen(classfile, code, paralist); expr2.codegen(classfile, code, paralist); if(expr1 instanceof Null || expr2 instanceof Null) ((RelOp)op).if_codegen(classfile, code, "null", !not); else ((RelOp)op).if_codegen(classfile, code, expr1.getTypeName(), !not); code.add_code_short(breakpoint + 3 - code.get_code_length()); } else throw new JVMCodeException("JVMCodeException: WhileStmt: void loop_codegen(ClassFile classfile, Code_attribute code, int breakpoint, boolean not)"); } else { expr.codegen(classfile, code, paralist); if(!not) code.add_code(JVMCode.ifne); else code.add_code(JVMCode.ifeq); code.add_code_short(breakpoint + 3 - code.get_code_length()); } } // ino.end // ino.method.toString.26360.defdescription type=javadoc /** *
Author: Martin Pl�micke * @return */ // ino.end // ino.method.toString.26360.definition public String toString() // ino.end // ino.method.toString.26360.body { return "WHILE " + loop_block.toString(); } // ino.end // ino.method.wandleRefTypeAttributes2GenericAttributes.26363.definition public void wandleRefTypeAttributes2GenericAttributes(Vector paralist, Vector genericMethodParameters) // ino.end // ino.method.wandleRefTypeAttributes2GenericAttributes.26363.body { if(loop_block!=null){ loop_block.wandleRefTypeAttributes2GenericAttributes(paralist,genericMethodParameters); } } // ino.end public boolean addOffsetsToStatement(CTypeAssumption localAssumption, String NameVariable, boolean isMemberVariable) { expr.addOffsetsToExpression(localAssumption,NameVariable,isMemberVariable); loop_block.addOffsetsToStatement(localAssumption,NameVariable,isMemberVariable); return true; } @Override public ConstraintsSet TYPEStmt(TypeAssumptions assumptions) { ConstraintsSet ret = new ConstraintsSet(); ret.add(expr.TYPEExpr(assumptions)); SingleConstraint exprMustBeBool = new SingleConstraint(expr.getType(), new RefType("boolean", 0)); // while(expr){}; expr <. boolean ret.add(exprMustBeBool); ret.add(this.loop_block.TYPEStmt(assumptions)); this.setType(loop_block.getType()); return ret; } public void replaceType(CReplaceTypeEvent e) { // TODO Auto-generated method stub throw new NotImplementedException(); } public int getTypeLineNumber() { throw new NotImplementedException(); } @Override public JavaCodeResult printJavaCode(ResultSet resultSet) { return new JavaCodeResult().attach("while(").attach(this.expr.printJavaCode(resultSet)).attach(")").attach(this.loop_block.printJavaCode(resultSet)); } } // ino.end