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

  1. package espresso;
  2.  
  3. class Unop extends AST {
  4.    static Name[] mnem = new Name[8];
  5.    Obj unop;
  6.    AST operand;
  7.  
  8.    static {
  9.       mnem[0] = Name.fromString("+");
  10.       mnem[1] = Name.fromString("-");
  11.       mnem[2] = Name.fromString("!");
  12.       mnem[3] = Name.fromString("~");
  13.       mnem[4] = Name.fromString("++");
  14.       mnem[5] = Name.fromString("--");
  15.       mnem[6] = Name.fromString("++");
  16.       mnem[7] = Name.fromString("--");
  17.    }
  18.  
  19.    void print(int var1) {
  20.       int var2 = super.tag >= 77 ? 11 : 10;
  21.       Pretty.open(var1, var2);
  22.       if (super.tag < 77) {
  23.          System.out.print(String.valueOf(mnem[super.tag - 71]).concat(String.valueOf(" ")));
  24.       }
  25.  
  26.       this.operand.print(var2);
  27.       if (super.tag >= 77) {
  28.          System.out.print(String.valueOf(" ").concat(String.valueOf(mnem[super.tag - 71])));
  29.       }
  30.  
  31.       Pretty.close(var1, var2);
  32.    }
  33.  
  34.    Item gen() {
  35.       Item var1 = this.operand.gen();
  36.       int var2 = ((OperatorObj)this.unop).opcode;
  37.       if (this.isConstant()) {
  38.          return ConstantFolder.fold(super.pos, (ImmediateItem)var1, var2);
  39.       } else {
  40.          switch (super.tag) {
  41.             case 71:
  42.                return var1;
  43.             case 72:
  44.                var1.load(this.operand.typ);
  45.                Gen.emitop(var2);
  46.                return Item.stackItem;
  47.             case 73:
  48.                return var1.mkCond().negate();
  49.             case 74:
  50.                var1.load(this.operand.typ);
  51.                Gen.emitMinusOne(Gen.typecode(this.operand.typ));
  52.                Gen.emitop(var2);
  53.                return Item.stackItem;
  54.             case 75:
  55.             case 76:
  56.                if (var1.mode == 5 && this.operand.typ.tag <= 6) {
  57.                   ((LocalItem)var1).incr(super.tag == 75 ? 1 : 255);
  58.                   return var1;
  59.                }
  60.  
  61.                var1.duplicate(this.operand.typ);
  62.                var1.load(this.operand.typ);
  63.                Gen.emitop(Gen.one(Gen.typecode(this.operand.typ)));
  64.                Gen.emitop(var2);
  65.                return new AssignItem(var1);
  66.             case 77:
  67.             case 78:
  68.                if (var1.mode == 5 && this.operand.typ.tag <= 6) {
  69.                   var1.load(this.operand.typ);
  70.                   ((LocalItem)var1).incr(super.tag == 77 ? 1 : 255);
  71.                } else {
  72.                   var1.duplicate(this.operand.typ);
  73.                   var1.load(this.operand.typ);
  74.                   var1.stash(this.operand.typ, Gen.width(this.operand.typ));
  75.                   Gen.emitop(Gen.one(Gen.typecode(this.operand.typ)));
  76.                   Gen.emitop(var2);
  77.                   var1.store(this.operand.typ);
  78.                }
  79.  
  80.                return Item.stackItem;
  81.             default:
  82.                throw new CompilerError("gen");
  83.          }
  84.       }
  85.    }
  86.  
  87.    AST simplify() {
  88.       this.operand = this.operand.simplify();
  89.       return this;
  90.    }
  91.  
  92.    void markCaptured(Bits var1) {
  93.       this.operand.markCaptured(var1);
  94.       if (super.tag >= 75 && this.operand.tag == 1) {
  95.          VarObj var2 = (VarObj)((Ident)this.operand).obj;
  96.          if (var2.owner != null && var2.owner instanceof FunObj && var1.member(var2.vnum)) {
  97.             var2.passByRef = true;
  98.          }
  99.       }
  100.  
  101.    }
  102.  
  103.    Typ attr(Env var1, int var2, Typ var3) {
  104.       if (Attr.checkKind(super.pos, 12, var2)) {
  105.          Typ var4 = this.operand.attr(var1, super.tag >= 75 ? 4 : 12, Typ.anyTyp);
  106.          Typ[] var5 = new Typ[]{var4};
  107.          this.unop = Attr.resolve(super.pos, var1, Predef.scope, 16, new FunTyp(var5, var3, (TypSet)null), mnem[super.tag - 71], 0);
  108.          if (this.unop.typ.tag == 14) {
  109.             super.typ = Attr.checkTyp(super.pos, ((FunTyp)this.unop.typ).restyp, var3);
  110.          } else {
  111.             super.typ = Typ.errTyp;
  112.          }
  113.       } else {
  114.          super.typ = Typ.errTyp;
  115.       }
  116.  
  117.       return super.typ;
  118.    }
  119.  
  120.    boolean isConstant() {
  121.       return super.tag <= 74 && this.operand.isConstant();
  122.    }
  123.  
  124.    boolean isExpr() {
  125.       return true;
  126.    }
  127.  
  128.    Unop(int var1, int var2, AST var3) {
  129.       super(var1, var2);
  130.       this.operand = var3;
  131.    }
  132. }
  133.