001: package net.sf.jdec.jvminstructions.commands;
002:
003: import java.util.Stack;
004:
005: import net.sf.jdec.core.DecompilerHelper;
006: import net.sf.jdec.core.GlobalVariableStore;
007: import net.sf.jdec.core.JvmOpCodes;
008: import net.sf.jdec.core.Operand;
009: import net.sf.jdec.core.OperandStack;
010: import net.sf.jdec.reflection.Behaviour;
011: import net.sf.jdec.util.Constants;
012: import net.sf.jdec.util.Util;
013:
014: public class NewArrayCommand extends AbstractInstructionCommand {
015:
016: public NewArrayCommand(Behaviour context) {
017: super (context);
018:
019: }
020:
021: public int getSkipBytes() {
022: return 1;
023: }
024:
025: public void execute() {
026: java.lang.String temp = "";
027: byte[] info = getCode();
028: int currentForIndex = getCurrentInstPosInCode();
029: Behaviour behavior = getContext();
030: boolean embeddedNEWARRAY = GlobalVariableStore
031: .isEmbeddedNEWARRAY();
032: boolean embeddedNewArrayCopy = GlobalVariableStore
033: .isEmbeddedANEWARRAYCopy();
034: switch (info[(currentForIndex + 1)]) {
035: case 4:
036:
037: temp = "boolean[";
038: break;
039: case 5:
040:
041: temp = "char[";
042: break;
043: case 6:
044:
045: temp = "float[";
046: break;
047: case 7:
048:
049: temp = "double[";
050: break;
051: case 8:
052:
053: temp = "byte[";
054: break;
055: case 9:
056:
057: temp = "short[";
058: break;
059: case 10:
060:
061: temp = "int[";
062: break;
063: case 11:
064:
065: temp = "long[";
066: break;
067: }
068: Stack arraytimesstack = GlobalVariableStore
069: .getArraytimesstack();
070: OperandStack opStack = getStack();
071: // Pop The Size
072: Operand arSize = opStack.getTopOfStack();
073: int arraytimespush = GlobalVariableStore.getArraytimespush();
074: boolean dup = getGenericFinder().isInstDup(
075: (currentForIndex + 2));
076: if (!dup) {
077: Operand op = new Operand();
078: op.setOperandType(Constants.IS_ARRAY_REF);
079: java.lang.String Reference = "JdecGenerated"
080: + (currentForIndex + 1);
081: op.setClassType(temp + "]");
082: temp = temp + "] " + Reference + " = new " + temp
083: + arSize.getOperandValue() + "]";
084: behavior.appendToBuffer("\n"
085: + Util.formatDecompiledStatement(temp) + ";\n");
086: op.setOperandValue(Reference);
087: opStack.push(op);
088: // arraypush=false;
089: } else {
090: if (newfound()) {
091: Operand op = new Operand();
092: op.setOperandType(Constants.IS_ARRAY_REF);
093: java.lang.String Reference = "JdecGenerated"
094: + (currentForIndex + 1);
095: op.setClassType(temp + "]");
096: Util.forceNewLine = false;
097: Util.forceStartSpace = false;
098: op.setOperandValue("new " + temp + "]{");
099: boolean r = false;// checkIFLoadInstIsPartOFTernaryCond(currentForIndex);
100: if (r) {
101: if (opStack.size() > 0) {
102: java.lang.String str = opStack.getTopOfStack()
103: .getOperandValue();
104: str = str + op.getOperandValue();
105: op.setOperandValue(str);
106: }
107: }
108: opStack.push(op);
109:
110: try {
111: arraytimespush = Integer.parseInt(arSize
112: .getOperandValue());
113: } catch (NumberFormatException ne) {
114: // Check whether prev was bipush or sipush
115: int currentPos = currentForIndex;
116: int prevs = getGenericFinder().getPrevStartOfInst(
117: currentPos);
118: if (info[prevs] == JvmOpCodes.BIPUSH) {
119: int bipushvalue = info[(prevs + 1)];
120: arraytimespush = bipushvalue;
121: } else {
122: if (info[prevs] == JvmOpCodes.SIPUSH) {
123: int sipushvalue = getGenericFinder()
124: .getOffset(prevs);
125: arraytimespush = sipushvalue;
126: } else {
127: arraytimespush = 0;
128: }
129:
130: }
131:
132: }
133: arraytimesstack.push("" + arraytimespush);
134: } else {
135: Operand op = new Operand();
136: op.setOperandType(Constants.IS_ARRAY_REF);
137: java.lang.String Reference = "JdecGenerated"
138: + (currentForIndex + 1);
139: op.setClassType(temp + "]");
140: if (arraytimesstack.size() == 0)
141: temp = temp + "] " + Reference + " = new " + temp
142: + "]";
143: else
144: temp = "new " + temp + "]";
145: behavior.appendToBuffer("\n"
146: + Util.formatDecompiledStatement(temp));
147: behavior.appendToBuffer("{");
148:
149: boolean embed = DecompilerHelper
150: .isNewArrayEmbedded(info);
151: if (!embed) {
152: op.setOperandValue(Reference);
153: opStack.push(op);
154: } else {
155: if (opStack.size() > 0) {
156: opStack.getTopOfStack();
157: }
158: embeddedNEWARRAY = true;
159: embeddedNewArrayCopy = true;
160: }
161:
162: try {
163: arraytimespush = Integer.parseInt(arSize
164: .getOperandValue());
165:
166: } catch (NumberFormatException ne) {
167: // Check whether prev was bipush or sipush
168: int currentPos = currentForIndex;
169: int prevs = getGenericFinder().getPrevStartOfInst(
170: currentPos);
171: if (info[prevs] == JvmOpCodes.BIPUSH) {
172: int bipushvalue = info[(prevs + 1)];
173: arraytimespush = bipushvalue;
174: } else {
175: if (info[prevs] == JvmOpCodes.SIPUSH) {
176: int sipushvalue = getGenericFinder()
177: .getOffset(prevs);
178: arraytimespush = sipushvalue;
179: } else {
180: arraytimespush = 0;
181: }
182:
183: }
184:
185: }
186: arraytimesstack.push("" + arraytimespush);
187: System.out.println();
188: }
189: }
190: GlobalVariableStore.setEmbeddedNEWARRAY(embeddedNEWARRAY);
191: GlobalVariableStore
192: .setEmbeddedNewArrayCopy(embeddedNewArrayCopy);
193: GlobalVariableStore.setArraytimespush(arraytimespush);
194:
195: }
196:
197: }
|