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 / BinaryExpression.class (.txt) < prev    next >
Encoding:
Java Class File  |  1997-07-08  |  5.0 KB  |  201 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.CompilerError;
  8. import sun.tools.java.Constants;
  9. import sun.tools.java.Environment;
  10. import sun.tools.java.Type;
  11.  
  12. public class BinaryExpression extends UnaryExpression {
  13.    Expression left;
  14.  
  15.    BinaryExpression(int var1, int var2, Type var3, Expression var4, Expression var5) {
  16.       super(var1, var2, var3, var5);
  17.       this.left = var4;
  18.    }
  19.  
  20.    public Expression order() {
  21.       if (((Expression)this).precedence() > this.left.precedence()) {
  22.          UnaryExpression var1 = (UnaryExpression)this.left;
  23.          this.left = var1.right;
  24.          var1.right = this.order();
  25.          return var1;
  26.       } else {
  27.          return this;
  28.       }
  29.    }
  30.  
  31.    public Vset checkValue(Environment var1, Context var2, Vset var3, Hashtable var4) {
  32.       var3 = this.left.checkValue(var1, var2, var3, var4);
  33.       var3 = super.right.checkValue(var1, var2, var3, var4);
  34.       int var5 = this.left.type.getTypeMask() | super.right.type.getTypeMask();
  35.       if ((var5 & 8192) != 0) {
  36.          return var3;
  37.       } else {
  38.          ((UnaryExpression)this).selectType(var1, var2, var5);
  39.          if (super.type.isType(13)) {
  40.             var1.error(super.where, "invalid.args", Constants.opNames[super.op]);
  41.          }
  42.  
  43.          return var3;
  44.       }
  45.    }
  46.  
  47.    public boolean isConstant() {
  48.       switch (super.op) {
  49.          case 14:
  50.          case 15:
  51.          case 16:
  52.          case 17:
  53.          case 18:
  54.          case 19:
  55.          case 20:
  56.          case 21:
  57.          case 22:
  58.          case 23:
  59.          case 24:
  60.          case 26:
  61.          case 27:
  62.          case 28:
  63.          case 29:
  64.          case 30:
  65.          case 31:
  66.          case 32:
  67.          case 33:
  68.             if (this.left.isConstant() && super.right.isConstant()) {
  69.                return true;
  70.             }
  71.  
  72.             return false;
  73.          case 25:
  74.          default:
  75.             return false;
  76.       }
  77.    }
  78.  
  79.    Expression eval(int var1, int var2) {
  80.       return this;
  81.    }
  82.  
  83.    Expression eval(long var1, long var3) {
  84.       return this;
  85.    }
  86.  
  87.    Expression eval(float var1, float var2) {
  88.       return this;
  89.    }
  90.  
  91.    Expression eval(double var1, double var3) {
  92.       return this;
  93.    }
  94.  
  95.    Expression eval(boolean var1, boolean var2) {
  96.       return this;
  97.    }
  98.  
  99.    Expression eval(String var1, String var2) {
  100.       return this;
  101.    }
  102.  
  103.    Expression eval() {
  104.       if (this.left.op == super.right.op) {
  105.          switch (this.left.op) {
  106.             case 61:
  107.                return this.eval(((BooleanExpression)this.left).value, ((BooleanExpression)super.right).value);
  108.             case 62:
  109.             case 63:
  110.             case 64:
  111.             case 65:
  112.                return this.eval(((IntegerExpression)this.left).value, ((IntegerExpression)super.right).value);
  113.             case 66:
  114.                return this.eval(((LongExpression)this.left).value, ((LongExpression)super.right).value);
  115.             case 67:
  116.                return this.eval(((FloatExpression)this.left).value, ((FloatExpression)super.right).value);
  117.             case 68:
  118.                return this.eval(((DoubleExpression)this.left).value, ((DoubleExpression)super.right).value);
  119.             case 69:
  120.                return this.eval(((StringExpression)this.left).value, ((StringExpression)super.right).value);
  121.          }
  122.       }
  123.  
  124.       return this;
  125.    }
  126.  
  127.    public Expression inline(Environment var1, Context var2) {
  128.       this.left = this.left.inline(var1, var2);
  129.       super.right = super.right.inline(var1, var2);
  130.       return (Expression)(this.left == null ? super.right : new CommaExpression(super.where, this.left, super.right));
  131.    }
  132.  
  133.    public Expression inlineValue(Environment var1, Context var2) {
  134.       this.left = this.left.inlineValue(var1, var2);
  135.       super.right = super.right.inlineValue(var1, var2);
  136.  
  137.       try {
  138.          return this.eval().simplify();
  139.       } catch (ArithmeticException var3) {
  140.          var1.error(super.where, "arithmetic.exception");
  141.          return this;
  142.       }
  143.    }
  144.  
  145.    public Expression copyInline(Context var1) {
  146.       BinaryExpression var2 = (BinaryExpression)((Node)this).clone();
  147.       if (this.left != null) {
  148.          var2.left = this.left.copyInline(var1);
  149.       }
  150.  
  151.       if (super.right != null) {
  152.          var2.right = super.right.copyInline(var1);
  153.       }
  154.  
  155.       return var2;
  156.    }
  157.  
  158.    public int costInline(int var1, Environment var2, Context var3) {
  159.       return 1 + (this.left != null ? this.left.costInline(var1, var2, var3) : 0) + (super.right != null ? super.right.costInline(var1, var2, var3) : 0);
  160.    }
  161.  
  162.    void codeOperation(Environment var1, Context var2, Assembler var3) {
  163.       throw new CompilerError("codeOperation: " + Constants.opNames[super.op]);
  164.    }
  165.  
  166.    public void codeValue(Environment var1, Context var2, Assembler var3) {
  167.       if (super.type.isType(0)) {
  168.          Label var4 = new Label();
  169.          Label var5 = new Label();
  170.          ((Expression)this).codeBranch(var1, var2, var3, var4, true);
  171.          var3.add(true, super.where, 18, new Integer(0));
  172.          var3.add(true, super.where, 167, var5);
  173.          var3.add(var4);
  174.          var3.add(true, super.where, 18, new Integer(1));
  175.          var3.add(var5);
  176.       } else {
  177.          this.left.codeValue(var1, var2, var3);
  178.          super.right.codeValue(var1, var2, var3);
  179.          this.codeOperation(var1, var2, var3);
  180.       }
  181.    }
  182.  
  183.    public void print(PrintStream var1) {
  184.       var1.print("(" + Constants.opNames[super.op] + " ");
  185.       if (this.left != null) {
  186.          this.left.print(var1);
  187.       } else {
  188.          var1.print("<null>");
  189.       }
  190.  
  191.       var1.print(" ");
  192.       if (super.right != null) {
  193.          super.right.print(var1);
  194.       } else {
  195.          var1.print("<null>");
  196.       }
  197.  
  198.       var1.print(")");
  199.    }
  200. }
  201.