home *** CD-ROM | disk | FTP | other *** search
/ Tutto per Internet / Internet.iso / soft95 / Java / espints / espinst.exe / classes / espresso / Binop.class (.txt) < prev    next >
Encoding:
Java Class File  |  1996-02-28  |  5.2 KB  |  214 lines

  1. package espresso;
  2.  
  3. class Binop extends AST {
  4.    static Name[] mnem;
  5.    static int[] opprec = new int[19];
  6.    static Name concatS = Name.fromString("concat");
  7.    static Name valueOfS = Name.fromString("valueOf");
  8.    Obj binop;
  9.    AST right;
  10.    AST left;
  11.  
  12.    static {
  13.       opprec[0] = 0;
  14.       opprec[1] = 1;
  15.       opprec[2] = 5;
  16.       opprec[3] = 5;
  17.       opprec[4] = 6;
  18.       opprec[5] = 6;
  19.       opprec[6] = 6;
  20.       opprec[7] = 6;
  21.       opprec[8] = 2;
  22.       opprec[9] = 3;
  23.       opprec[10] = 4;
  24.       opprec[11] = 7;
  25.       opprec[12] = 7;
  26.       opprec[13] = 7;
  27.       opprec[14] = 8;
  28.       opprec[15] = 8;
  29.       opprec[16] = 9;
  30.       opprec[17] = 9;
  31.       opprec[18] = 9;
  32.       mnem = new Name[19];
  33.       mnem[0] = Name.fromString("||");
  34.       mnem[1] = Name.fromString("&&");
  35.       mnem[2] = Name.fromString("==");
  36.       mnem[3] = Name.fromString("!=");
  37.       mnem[4] = Name.fromString("<");
  38.       mnem[5] = Name.fromString(">");
  39.       mnem[6] = Name.fromString("<=");
  40.       mnem[7] = Name.fromString(">=");
  41.       mnem[8] = Name.fromString("|");
  42.       mnem[9] = Name.fromString("^");
  43.       mnem[10] = Name.fromString("&");
  44.       mnem[11] = Name.fromString("<<");
  45.       mnem[12] = Name.fromString(">>");
  46.       mnem[13] = Name.fromString(">>>");
  47.       mnem[14] = Name.fromString("+");
  48.       mnem[15] = Name.fromString("-");
  49.       mnem[16] = Name.fromString("*");
  50.       mnem[17] = Name.fromString("/");
  51.       mnem[18] = Name.fromString("%");
  52.    }
  53.  
  54.    void print(int var1) {
  55.       Pretty.open(var1, opprec[super.tag - 30]);
  56.       this.left.print(opprec[super.tag - 30]);
  57.       System.out.print(String.valueOf(String.valueOf(" ").concat(String.valueOf(mnem[super.tag - 30]))).concat(String.valueOf(" ")));
  58.       this.right.print(opprec[super.tag - 30]);
  59.       Pretty.close(var1, opprec[super.tag - 30]);
  60.    }
  61.  
  62.    Item gen() {
  63.       Item var1 = this.left.gen();
  64.       if (super.tag == 30 && !this.isConstant()) {
  65.          CondItem var2 = var1.mkCond();
  66.          if (var2.falseJumps == null && var2.opcode == 167) {
  67.             return var2;
  68.          } else {
  69.             Label var3 = var2.jumpTrue();
  70.             Gen.resolve(var2.falseJumps);
  71.             CondItem var4 = this.right.gen().mkCond();
  72.             return new CondItem(var4.opcode, Gen.mergeLabels(var3, var4.trueJumps), var4.falseJumps);
  73.          }
  74.       } else if (super.tag == 31 && !this.isConstant()) {
  75.          CondItem var5 = var1.mkCond();
  76.          if (var5.trueJumps == null && var5.opcode == Gen.dontgoto) {
  77.             return var5;
  78.          } else {
  79.             Label var6 = var5.jumpFalse();
  80.             Gen.resolve(var5.trueJumps);
  81.             CondItem var7 = this.right.gen().mkCond();
  82.             return new CondItem(var7.opcode, var7.trueJumps, Gen.mergeLabels(var6, var7.falseJumps));
  83.          }
  84.       } else {
  85.          return completeBinop(super.pos, super.tag, this.binop, this.left, this.right, var1);
  86.       }
  87.    }
  88.  
  89.    static Item completeBinop(int var0, int var1, Obj var2, AST var3, AST var4, Item var5) {
  90.       int var6 = Gen.typecode(var3.typ);
  91.       int var7 = Gen.typecode(var4.typ);
  92.       int var8 = var6 < var7 ? var7 : var6;
  93.       int var9 = ((OperatorObj)var2).opcode;
  94.       boolean var10 = var3.isConstant() && var4.isConstant();
  95.       if (!var10) {
  96.          var5.load(var3.typ);
  97.          var5 = Item.stackItem;
  98.       }
  99.  
  100.       boolean var11 = var1 == 44 && var9 == 256;
  101.       if (var11) {
  102.          mkString(var3.typ);
  103.       } else {
  104.          var5.coerce(var3.typ, var6, var8);
  105.       }
  106.  
  107.       Item var12 = var4.gen();
  108.       if (!var10) {
  109.          var12.load(var4.typ);
  110.          var12 = Item.stackItem;
  111.       }
  112.  
  113.       if (var11) {
  114.          mkString(var4.typ);
  115.          Obj var13 = findInString(concatS, Predef.stringTyp);
  116.          (new BasedItem(0, var5, var13)).invoke();
  117.          return Item.stackItem;
  118.       } else {
  119.          if (var1 != 41 && var1 != 42 && var1 != 43) {
  120.             var12.coerce(var4.typ, var7, var8);
  121.          }
  122.  
  123.          if (var10) {
  124.             return ConstantFolder.fold(var0, (ImmediateItem)var5, (ImmediateItem)var12, var9);
  125.          } else {
  126.             switch (var1) {
  127.                case 32:
  128.                case 33:
  129.                case 34:
  130.                case 35:
  131.                case 36:
  132.                case 37:
  133.                   switch (var8) {
  134.                      case 1:
  135.                         Gen.emitop(148);
  136.                         break;
  137.                      case 2:
  138.                         if (var1 != 34 && var1 != 36) {
  139.                            Gen.emitop(149);
  140.                         } else {
  141.                            Gen.emitop(150);
  142.                         }
  143.                         break;
  144.                      case 3:
  145.                         if (var1 != 34 && var1 != 36) {
  146.                            Gen.emitop(151);
  147.                         } else {
  148.                            Gen.emitop(152);
  149.                         }
  150.                   }
  151.  
  152.                   return new CondItem(var9 & 255);
  153.                default:
  154.                   Gen.emitop(var9);
  155.                   return Item.stackItem;
  156.             }
  157.          }
  158.       }
  159.    }
  160.  
  161.    private static void mkString(Typ var0) {
  162.       Obj var1 = findInString(valueOfS, var0);
  163.       (new BasedItem(0, (Item)null, var1)).invoke();
  164.    }
  165.  
  166.    private static Obj findInString(Name var0, Typ var1) {
  167.       Typ[] var2 = new Typ[]{var1};
  168.       return Attr.resolve(0, (Env)null, Predef.stringClass.scope, 16, new FunTyp(var2, Predef.stringTyp, (TypSet)null), var0, 1);
  169.    }
  170.  
  171.    AST simplify() {
  172.       this.left = this.left.simplify();
  173.       this.right = this.right.simplify();
  174.       return this;
  175.    }
  176.  
  177.    void markCaptured(Bits var1) {
  178.       this.left.markCaptured(var1);
  179.       this.right.markCaptured(var1);
  180.    }
  181.  
  182.    Typ attr(Env var1, int var2, Typ var3) {
  183.       if (Attr.checkKind(super.pos, 12, var2)) {
  184.          Typ var4 = this.left.attr(var1, 12, Typ.anyTyp);
  185.          Typ var5 = this.right.attr(var1, 12, Typ.anyTyp);
  186.          Typ[] var6 = new Typ[]{var4, var5};
  187.          this.binop = Attr.resolve(super.pos, var1, Predef.scope, 16, new FunTyp(var6, var3, (TypSet)null), mnem[super.tag - 30], 0);
  188.          if (this.binop.typ.tag == 14) {
  189.             super.typ = Attr.checkTyp(super.pos, ((FunTyp)this.binop.typ).restyp, var3);
  190.          } else {
  191.             super.typ = Typ.errTyp;
  192.          }
  193.       } else {
  194.          super.typ = Typ.errTyp;
  195.       }
  196.  
  197.       return super.typ;
  198.    }
  199.  
  200.    boolean isConstant() {
  201.       return this.left.isConstant() && this.right.isConstant();
  202.    }
  203.  
  204.    boolean isExpr() {
  205.       return true;
  206.    }
  207.  
  208.    Binop(int var1, int var2, AST var3, AST var4) {
  209.       super(var1, var2);
  210.       this.left = var3;
  211.       this.right = var4;
  212.    }
  213. }
  214.