1 19 20 package jode.expr; 21 import jode.type.Type; 22 import jode.GlobalOptions; 23 import jode.decompiler.TabbedPrintWriter; 24 25 public class StoreInstruction extends Operator 26 implements CombineableOperator { 27 28 boolean opAssign = false; 29 30 public StoreInstruction(LValueExpression lvalue) { 31 super(Type.tVoid, ASSIGN_OP); 32 initOperands(2); 33 setSubExpressions(0, (Operator) lvalue); 34 } 35 36 public LValueExpression getLValue() { 37 return (LValueExpression) subExpressions[0]; 38 } 39 40 public void makeOpAssign(int operatorIndex) { 41 setOperatorIndex(operatorIndex); 42 if (subExpressions[1] instanceof NopOperator) 43 subExpressions[1].type = Type.tUnknown; 44 opAssign = true; 45 } 46 47 public boolean isOpAssign() { 48 return opAssign; 49 } 50 51 54 public void makeNonVoid() { 55 if (type != Type.tVoid) 56 throw new jode.AssertError("already non void"); 57 type = subExpressions[0].getType(); 58 } 59 60 public boolean lvalueMatches(Operator loadop) { 61 return getLValue().matches(loadop); 62 } 63 64 public int getPriority() { 65 return 100; 66 } 67 68 public void updateSubTypes() { 69 if (!isVoid()) { 70 subExpressions[0].setType(type); 71 subExpressions[1].setType(Type.tSubType(type)); 72 } 73 } 74 75 public void updateType() { 76 77 Type newType; 78 79 if (!opAssign) { 80 81 Type lvalueType = subExpressions[0].getType(); 82 Type rvalueType = subExpressions[1].getType(); 83 subExpressions[0].setType(Type.tSuperType(rvalueType)); 84 subExpressions[1].setType(Type.tSubType(lvalueType)); 85 } 86 87 if (!isVoid()) 88 updateParentType(subExpressions[0].getType()); 89 } 90 91 public Expression simplify() { 92 if (subExpressions[1] instanceof ConstOperator) { 93 ConstOperator one = (ConstOperator) subExpressions[1]; 94 95 if ((getOperatorIndex() == OPASSIGN_OP+ADD_OP || 96 getOperatorIndex() == OPASSIGN_OP+SUB_OP) 97 && one.isOne(subExpressions[0].getType())) { 98 99 int op = (getOperatorIndex() == OPASSIGN_OP+ADD_OP) 100 ? INC_OP : DEC_OP; 101 102 return new PrePostFixOperator 103 (getType(), op, getLValue(), isVoid()).simplify(); 104 } 105 } 106 return super.simplify(); 107 } 108 109 public boolean opEquals(Operator o) { 110 return o instanceof StoreInstruction 111 && o.operatorIndex == operatorIndex 112 && o.isVoid() == isVoid(); 113 } 114 115 public void dumpExpression(TabbedPrintWriter writer) 116 throws java.io.IOException 117 { 118 writer.startOp(writer.NO_PAREN, 2); 119 subExpressions[0].dumpExpression(writer); 120 writer.endOp(); 121 writer.breakOp(); 122 writer.print(getOperatorString()); 123 subExpressions[1].dumpExpression(writer, 100); 124 } 125 } 126 | Popular Tags |