home *** CD-ROM | disk | FTP | other *** search
- package espresso;
-
- class Unop extends AST {
- static Name[] mnem = new Name[8];
- Obj unop;
- AST operand;
-
- 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("--");
- }
-
- void print(int var1) {
- int var2 = super.tag >= 77 ? 11 : 10;
- Pretty.open(var1, var2);
- if (super.tag < 77) {
- System.out.print(String.valueOf(mnem[super.tag - 71]).concat(String.valueOf(" ")));
- }
-
- this.operand.print(var2);
- if (super.tag >= 77) {
- System.out.print(String.valueOf(" ").concat(String.valueOf(mnem[super.tag - 71])));
- }
-
- Pretty.close(var1, var2);
- }
-
- Item gen() {
- Item var1 = this.operand.gen();
- int var2 = ((OperatorObj)this.unop).opcode;
- if (this.isConstant()) {
- return ConstantFolder.fold(super.pos, (ImmediateItem)var1, var2);
- } else {
- switch (super.tag) {
- case 71:
- return var1;
- case 72:
- var1.load(this.operand.typ);
- Gen.emitop(var2);
- return Item.stackItem;
- case 73:
- return var1.mkCond().negate();
- case 74:
- var1.load(this.operand.typ);
- Gen.emitMinusOne(Gen.typecode(this.operand.typ));
- Gen.emitop(var2);
- return Item.stackItem;
- case 75:
- case 76:
- if (var1.mode == 5 && this.operand.typ.tag <= 6) {
- ((LocalItem)var1).incr(super.tag == 75 ? 1 : 255);
- return var1;
- }
-
- var1.duplicate(this.operand.typ);
- var1.load(this.operand.typ);
- Gen.emitop(Gen.one(Gen.typecode(this.operand.typ)));
- Gen.emitop(var2);
- return new AssignItem(var1);
- case 77:
- case 78:
- if (var1.mode == 5 && this.operand.typ.tag <= 6) {
- var1.load(this.operand.typ);
- ((LocalItem)var1).incr(super.tag == 77 ? 1 : 255);
- } else {
- var1.duplicate(this.operand.typ);
- var1.load(this.operand.typ);
- var1.stash(this.operand.typ, Gen.width(this.operand.typ));
- Gen.emitop(Gen.one(Gen.typecode(this.operand.typ)));
- Gen.emitop(var2);
- var1.store(this.operand.typ);
- }
-
- return Item.stackItem;
- default:
- throw new CompilerError("gen");
- }
- }
- }
-
- AST simplify() {
- this.operand = this.operand.simplify();
- return this;
- }
-
- void markCaptured(Bits var1) {
- this.operand.markCaptured(var1);
- if (super.tag >= 75 && this.operand.tag == 1) {
- VarObj var2 = (VarObj)((Ident)this.operand).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.operand.attr(var1, super.tag >= 75 ? 4 : 12, Typ.anyTyp);
- Typ[] var5 = new Typ[]{var4};
- this.unop = Attr.resolve(super.pos, var1, Predef.scope, 16, new FunTyp(var5, var3, (TypSet)null), mnem[super.tag - 71], 0);
- if (this.unop.typ.tag == 14) {
- super.typ = Attr.checkTyp(super.pos, ((FunTyp)this.unop.typ).restyp, var3);
- } else {
- super.typ = Typ.errTyp;
- }
- } else {
- super.typ = Typ.errTyp;
- }
-
- return super.typ;
- }
-
- boolean isConstant() {
- return super.tag <= 74 && this.operand.isConstant();
- }
-
- boolean isExpr() {
- return true;
- }
-
- Unop(int var1, int var2, AST var3) {
- super(var1, var2);
- this.operand = var3;
- }
- }
-