home *** CD-ROM | disk | FTP | other *** search
- package espresso;
-
- class Assignop extends AST {
- static Name[] mnem = new Name[12];
- Obj binop;
- AST right;
- AST left;
-
- static {
- mnem[0] = Name.fromString("");
- mnem[1] = Name.fromString("|");
- mnem[2] = Name.fromString("^");
- mnem[3] = Name.fromString("&");
- mnem[4] = Name.fromString("<<");
- mnem[5] = Name.fromString(">>");
- mnem[6] = Name.fromString(">>>");
- mnem[7] = Name.fromString("+");
- mnem[8] = Name.fromString("-");
- mnem[9] = Name.fromString("*");
- mnem[10] = Name.fromString("/");
- mnem[11] = Name.fromString("%");
- }
-
- void print(int var1) {
- Pretty.open(var1, -3);
- this.left.print(-2);
- System.out.print(String.valueOf(String.valueOf(" ").concat(String.valueOf(mnem[super.tag - 49]))).concat(String.valueOf("= ")));
- this.right.print(-2);
- Pretty.close(var1, -3);
- }
-
- Item gen() {
- Item var1 = this.left.gen();
- if (super.tag == 49) {
- this.right.gen().coerce(this.right.typ, this.left.typ).load(this.left.typ);
- } else {
- if ((super.tag == 56 || super.tag == 57) && var1.mode == 5 && this.left.typ.tag <= 6 && this.right.tag == 90) {
- int var2 = (Integer)((Literal)this.right).val;
- if (super.tag == 57) {
- var2 = -var2;
- }
-
- if (-128 <= var2 && var2 <= 127) {
- ((LocalItem)var1).incr(var2);
- return var1;
- }
- }
-
- var1.duplicate(this.left.typ);
- Binop.completeBinop(super.pos, super.tag - 50 + 38, this.binop, this.left, this.right, var1);
- Item.stackItem.coerce(((FunTyp)this.binop.typ).restyp, this.left.typ);
- }
-
- return new AssignItem(var1);
- }
-
- AST simplify() {
- this.left = this.left.simplify();
- this.right = this.right.simplify();
- return this;
- }
-
- void markCaptured(Bits var1) {
- this.left.markCaptured(var1);
- this.right.markCaptured(var1);
- if (this.left.tag == 1) {
- VarObj var2 = (VarObj)((Ident)this.left).obj;
- if (var2.owner != null && var2.owner instanceof FunObj && var1.member(var2.vnum)) {
- var2.passByRef = true;
- }
- }
-
- }
-
- Typ attr(Env var1, int var2, Typ var3) {
- if (Attr.checkKind(super.pos, 12, var2)) {
- Typ var4 = this.left.attr(var1, 4, Typ.anyTyp);
- if (super.tag == 49) {
- this.right.attr(var1, 12, var4);
- } else {
- Typ var5 = this.right.attr(var1, 12, Typ.anyTyp);
- Typ[] var6 = new Typ[]{var4, var5};
- this.binop = Attr.resolve(super.pos, var1, Predef.scope, 16, new FunTyp(var6, Typ.anyTyp, (TypSet)null), mnem[super.tag - 49], 0);
- if (this.binop.typ.tag == 14 && !Attr.canCast(((FunTyp)this.binop.typ).restyp, var4)) {
- Attr.checkTyp(this.right.pos, ((FunTyp)this.binop.typ).restyp, var4);
- }
- }
-
- super.typ = Attr.checkTyp(super.pos, var4, var3);
- } else {
- super.typ = Typ.errTyp;
- }
-
- return super.typ;
- }
-
- boolean isExpr() {
- return true;
- }
-
- Assignop(int var1, int var2, AST var3, AST var4) {
- super(var1, var2);
- this.left = var3;
- this.right = var4;
- }
- }
-