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

  1. package espresso;
  2.  
  3. class Assignop extends AST {
  4.    static Name[] mnem = new Name[12];
  5.    Obj binop;
  6.    AST right;
  7.    AST left;
  8.  
  9.    static {
  10.       mnem[0] = Name.fromString("");
  11.       mnem[1] = Name.fromString("|");
  12.       mnem[2] = Name.fromString("^");
  13.       mnem[3] = Name.fromString("&");
  14.       mnem[4] = Name.fromString("<<");
  15.       mnem[5] = Name.fromString(">>");
  16.       mnem[6] = Name.fromString(">>>");
  17.       mnem[7] = Name.fromString("+");
  18.       mnem[8] = Name.fromString("-");
  19.       mnem[9] = Name.fromString("*");
  20.       mnem[10] = Name.fromString("/");
  21.       mnem[11] = Name.fromString("%");
  22.    }
  23.  
  24.    void print(int var1) {
  25.       Pretty.open(var1, -3);
  26.       this.left.print(-2);
  27.       System.out.print(String.valueOf(String.valueOf(" ").concat(String.valueOf(mnem[super.tag - 49]))).concat(String.valueOf("= ")));
  28.       this.right.print(-2);
  29.       Pretty.close(var1, -3);
  30.    }
  31.  
  32.    Item gen() {
  33.       Item var1 = this.left.gen();
  34.       if (super.tag == 49) {
  35.          this.right.gen().coerce(this.right.typ, this.left.typ).load(this.left.typ);
  36.       } else {
  37.          if ((super.tag == 56 || super.tag == 57) && var1.mode == 5 && this.left.typ.tag <= 6 && this.right.tag == 90) {
  38.             int var2 = (Integer)((Literal)this.right).val;
  39.             if (super.tag == 57) {
  40.                var2 = -var2;
  41.             }
  42.  
  43.             if (-128 <= var2 && var2 <= 127) {
  44.                ((LocalItem)var1).incr(var2);
  45.                return var1;
  46.             }
  47.          }
  48.  
  49.          var1.duplicate(this.left.typ);
  50.          Binop.completeBinop(super.pos, super.tag - 50 + 38, this.binop, this.left, this.right, var1);
  51.          Item.stackItem.coerce(((FunTyp)this.binop.typ).restyp, this.left.typ);
  52.       }
  53.  
  54.       return new AssignItem(var1);
  55.    }
  56.  
  57.    AST simplify() {
  58.       this.left = this.left.simplify();
  59.       this.right = this.right.simplify();
  60.       return this;
  61.    }
  62.  
  63.    void markCaptured(Bits var1) {
  64.       this.left.markCaptured(var1);
  65.       this.right.markCaptured(var1);
  66.       if (this.left.tag == 1) {
  67.          VarObj var2 = (VarObj)((Ident)this.left).obj;
  68.          if (var2.owner != null && var2.owner instanceof FunObj && var1.member(var2.vnum)) {
  69.             var2.passByRef = true;
  70.          }
  71.       }
  72.  
  73.    }
  74.  
  75.    Typ attr(Env var1, int var2, Typ var3) {
  76.       if (Attr.checkKind(super.pos, 12, var2)) {
  77.          Typ var4 = this.left.attr(var1, 4, Typ.anyTyp);
  78.          if (super.tag == 49) {
  79.             this.right.attr(var1, 12, var4);
  80.          } else {
  81.             Typ var5 = this.right.attr(var1, 12, Typ.anyTyp);
  82.             Typ[] var6 = new Typ[]{var4, var5};
  83.             this.binop = Attr.resolve(super.pos, var1, Predef.scope, 16, new FunTyp(var6, Typ.anyTyp, (TypSet)null), mnem[super.tag - 49], 0);
  84.             if (this.binop.typ.tag == 14 && !Attr.canCast(((FunTyp)this.binop.typ).restyp, var4)) {
  85.                Attr.checkTyp(this.right.pos, ((FunTyp)this.binop.typ).restyp, var4);
  86.             }
  87.          }
  88.  
  89.          super.typ = Attr.checkTyp(super.pos, var4, var3);
  90.       } else {
  91.          super.typ = Typ.errTyp;
  92.       }
  93.  
  94.       return super.typ;
  95.    }
  96.  
  97.    boolean isExpr() {
  98.       return true;
  99.    }
  100.  
  101.    Assignop(int var1, int var2, AST var3, AST var4) {
  102.       super(var1, var2);
  103.       this.left = var3;
  104.       this.right = var4;
  105.    }
  106. }
  107.