home *** CD-ROM | disk | FTP | other *** search
/ Symantec Visual Cafe for Java 2.5 / symantec-visual-cafe-2.5-database-dev-edition.iso / VPage / Java.bin / CLASSES.ZIP / sun / tools / tree / IfStatement.class (.txt) < prev    next >
Encoding:
Java Class File  |  1997-07-08  |  4.3 KB  |  124 lines

  1. package sun.tools.tree;
  2.  
  3. import java.io.PrintStream;
  4. import java.util.Hashtable;
  5. import sun.tools.asm.Assembler;
  6. import sun.tools.asm.Label;
  7. import sun.tools.java.Environment;
  8. import sun.tools.java.Type;
  9.  
  10. public class IfStatement extends Statement {
  11.    Expression cond;
  12.    Statement ifTrue;
  13.    Statement ifFalse;
  14.  
  15.    public IfStatement(int var1, Expression var2, Statement var3, Statement var4) {
  16.       super(90, var1);
  17.       this.cond = var2;
  18.       this.ifTrue = var3;
  19.       this.ifFalse = var4;
  20.    }
  21.  
  22.    Vset check(Environment var1, Context var2, Vset var3, Hashtable var4) {
  23.       CheckContext var5 = new CheckContext(var2, this);
  24.       Vset var6 = var3.copy();
  25.       ConditionVars var7 = this.cond.checkCondition(var1, var5, ((Statement)this).reach(var1, var3), var4);
  26.       this.cond = ((Node)this).convert(var1, var5, Type.tBoolean, this.cond);
  27.       Vset var8 = var7.vsTrue.isDeadEnd() ? var6 : var7.vsTrue;
  28.       Vset var9 = var7.vsFalse.isDeadEnd() ? var6 : var7.vsFalse;
  29.       var8 = this.ifTrue.check(var1, var5, var8, var4);
  30.       if (this.ifFalse != null) {
  31.          var9 = this.ifFalse.check(var1, var5, var9, var4);
  32.       }
  33.  
  34.       var3 = var8.join(var9.join(var5.vsBreak));
  35.       return var2.removeAdditionalVars(var3);
  36.    }
  37.  
  38.    public Statement inline(Environment var1, Context var2) {
  39.       var2 = new Context(var2, this);
  40.       this.cond = this.cond.inlineValue(var1, var2);
  41.       if (this.cond.equals(true)) {
  42.          this.ifTrue = this.ifTrue.inline(var1, var2);
  43.          return ((Statement)this).eliminate(var1, this.ifTrue);
  44.       } else if (this.cond.equals(false)) {
  45.          return ((Statement)this).eliminate(var1, this.ifFalse != null ? this.ifFalse.inline(var1, var2) : null);
  46.       } else {
  47.          if (this.ifTrue != null) {
  48.             this.ifTrue = this.ifTrue.inline(var1, var2);
  49.          }
  50.  
  51.          if (this.ifFalse != null) {
  52.             this.ifFalse = this.ifFalse.inline(var1, var2);
  53.          }
  54.  
  55.          if (this.ifTrue == null && this.ifFalse == null) {
  56.             return ((Statement)this).eliminate(var1, (new ExpressionStatement(super.where, this.cond)).inline(var1, var2));
  57.          } else if (this.ifTrue == null) {
  58.             this.cond = (new NotExpression(this.cond.where, this.cond)).inlineValue(var1, var2);
  59.             return ((Statement)this).eliminate(var1, new IfStatement(super.where, this.cond, this.ifFalse, (Statement)null));
  60.          } else {
  61.             return this;
  62.          }
  63.       }
  64.    }
  65.  
  66.    public Statement copyInline(Context var1, boolean var2) {
  67.       IfStatement var3 = (IfStatement)((Node)this).clone();
  68.       var3.cond = this.cond.copyInline(var1);
  69.       if (this.ifTrue != null) {
  70.          var3.ifTrue = this.ifTrue.copyInline(var1, var2);
  71.       }
  72.  
  73.       if (this.ifFalse != null) {
  74.          var3.ifFalse = this.ifFalse.copyInline(var1, var2);
  75.       }
  76.  
  77.       return var3;
  78.    }
  79.  
  80.    public int costInline(int var1, Environment var2, Context var3) {
  81.       int var4 = 1 + this.cond.costInline(var1, var2, var3);
  82.       if (this.ifTrue != null) {
  83.          var4 += this.ifTrue.costInline(var1, var2, var3);
  84.       }
  85.  
  86.       if (this.ifFalse != null) {
  87.          var4 += this.ifFalse.costInline(var1, var2, var3);
  88.       }
  89.  
  90.       return var4;
  91.    }
  92.  
  93.    public void code(Environment var1, Context var2, Assembler var3) {
  94.       CodeContext var4 = new CodeContext(var2, this);
  95.       Label var5 = new Label();
  96.       this.cond.codeBranch(var1, var4, var3, var5, false);
  97.       this.ifTrue.code(var1, var4, var3);
  98.       if (this.ifFalse != null) {
  99.          Label var6 = new Label();
  100.          var3.add(true, super.where, 167, var6);
  101.          var3.add(var5);
  102.          this.ifFalse.code(var1, var4, var3);
  103.          var3.add(var6);
  104.       } else {
  105.          var3.add(var5);
  106.       }
  107.  
  108.       var3.add(var4.breakLabel);
  109.    }
  110.  
  111.    public void print(PrintStream var1, int var2) {
  112.       super.print(var1, var2);
  113.       var1.print("if ");
  114.       this.cond.print(var1);
  115.       var1.print(" ");
  116.       this.ifTrue.print(var1, var2);
  117.       if (this.ifFalse != null) {
  118.          var1.print(" else ");
  119.          this.ifFalse.print(var1, var2);
  120.       }
  121.  
  122.    }
  123. }
  124.