home *** CD-ROM | disk | FTP | other *** search
- package espresso;
-
- class Binop extends AST {
- static Name[] mnem;
- static int[] opprec = new int[19];
- static Name concatS = Name.fromString("concat");
- static Name valueOfS = Name.fromString("valueOf");
- Obj binop;
- AST right;
- AST left;
-
- static {
- opprec[0] = 0;
- opprec[1] = 1;
- opprec[2] = 5;
- opprec[3] = 5;
- opprec[4] = 6;
- opprec[5] = 6;
- opprec[6] = 6;
- opprec[7] = 6;
- opprec[8] = 2;
- opprec[9] = 3;
- opprec[10] = 4;
- opprec[11] = 7;
- opprec[12] = 7;
- opprec[13] = 7;
- opprec[14] = 8;
- opprec[15] = 8;
- opprec[16] = 9;
- opprec[17] = 9;
- opprec[18] = 9;
- mnem = new Name[19];
- 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("<<");
- mnem[12] = Name.fromString(">>");
- mnem[13] = Name.fromString(">>>");
- mnem[14] = Name.fromString("+");
- mnem[15] = Name.fromString("-");
- mnem[16] = Name.fromString("*");
- mnem[17] = Name.fromString("/");
- mnem[18] = Name.fromString("%");
- }
-
- void print(int var1) {
- Pretty.open(var1, opprec[super.tag - 30]);
- this.left.print(opprec[super.tag - 30]);
- System.out.print(String.valueOf(String.valueOf(" ").concat(String.valueOf(mnem[super.tag - 30]))).concat(String.valueOf(" ")));
- this.right.print(opprec[super.tag - 30]);
- Pretty.close(var1, opprec[super.tag - 30]);
- }
-
- Item gen() {
- Item var1 = this.left.gen();
- if (super.tag == 30 && !this.isConstant()) {
- CondItem var2 = var1.mkCond();
- if (var2.falseJumps == null && var2.opcode == 167) {
- return var2;
- } else {
- Label var3 = var2.jumpTrue();
- Gen.resolve(var2.falseJumps);
- CondItem var4 = this.right.gen().mkCond();
- return new CondItem(var4.opcode, Gen.mergeLabels(var3, var4.trueJumps), var4.falseJumps);
- }
- } else if (super.tag == 31 && !this.isConstant()) {
- CondItem var5 = var1.mkCond();
- if (var5.trueJumps == null && var5.opcode == Gen.dontgoto) {
- return var5;
- } else {
- Label var6 = var5.jumpFalse();
- Gen.resolve(var5.trueJumps);
- CondItem var7 = this.right.gen().mkCond();
- return new CondItem(var7.opcode, var7.trueJumps, Gen.mergeLabels(var6, var7.falseJumps));
- }
- } else {
- return completeBinop(super.pos, super.tag, this.binop, this.left, this.right, var1);
- }
- }
-
- static Item completeBinop(int var0, int var1, Obj var2, AST var3, AST var4, Item var5) {
- int var6 = Gen.typecode(var3.typ);
- int var7 = Gen.typecode(var4.typ);
- int var8 = var6 < var7 ? var7 : var6;
- int var9 = ((OperatorObj)var2).opcode;
- boolean var10 = var3.isConstant() && var4.isConstant();
- if (!var10) {
- var5.load(var3.typ);
- var5 = Item.stackItem;
- }
-
- boolean var11 = var1 == 44 && var9 == 256;
- if (var11) {
- mkString(var3.typ);
- } else {
- var5.coerce(var3.typ, var6, var8);
- }
-
- Item var12 = var4.gen();
- if (!var10) {
- var12.load(var4.typ);
- var12 = Item.stackItem;
- }
-
- if (var11) {
- mkString(var4.typ);
- Obj var13 = findInString(concatS, Predef.stringTyp);
- (new BasedItem(0, var5, var13)).invoke();
- return Item.stackItem;
- } else {
- if (var1 != 41 && var1 != 42 && var1 != 43) {
- var12.coerce(var4.typ, var7, var8);
- }
-
- if (var10) {
- return ConstantFolder.fold(var0, (ImmediateItem)var5, (ImmediateItem)var12, var9);
- } else {
- switch (var1) {
- case 32:
- case 33:
- case 34:
- case 35:
- case 36:
- case 37:
- switch (var8) {
- case 1:
- Gen.emitop(148);
- break;
- case 2:
- if (var1 != 34 && var1 != 36) {
- Gen.emitop(149);
- } else {
- Gen.emitop(150);
- }
- break;
- case 3:
- if (var1 != 34 && var1 != 36) {
- Gen.emitop(151);
- } else {
- Gen.emitop(152);
- }
- }
-
- return new CondItem(var9 & 255);
- default:
- Gen.emitop(var9);
- return Item.stackItem;
- }
- }
- }
- }
-
- private static void mkString(Typ var0) {
- Obj var1 = findInString(valueOfS, var0);
- (new BasedItem(0, (Item)null, var1)).invoke();
- }
-
- private static Obj findInString(Name var0, Typ var1) {
- Typ[] var2 = new Typ[]{var1};
- return Attr.resolve(0, (Env)null, Predef.stringClass.scope, 16, new FunTyp(var2, Predef.stringTyp, (TypSet)null), var0, 1);
- }
-
- 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);
- }
-
- Typ attr(Env var1, int var2, Typ var3) {
- if (Attr.checkKind(super.pos, 12, var2)) {
- Typ var4 = this.left.attr(var1, 12, Typ.anyTyp);
- 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, var3, (TypSet)null), mnem[super.tag - 30], 0);
- if (this.binop.typ.tag == 14) {
- super.typ = Attr.checkTyp(super.pos, ((FunTyp)this.binop.typ).restyp, var3);
- } else {
- super.typ = Typ.errTyp;
- }
- } else {
- super.typ = Typ.errTyp;
- }
-
- return super.typ;
- }
-
- boolean isConstant() {
- return this.left.isConstant() && this.right.isConstant();
- }
-
- boolean isExpr() {
- return true;
- }
-
- Binop(int var1, int var2, AST var3, AST var4) {
- super(var1, var2);
- this.left = var3;
- this.right = var4;
- }
- }
-