001: package net.sf.jdec.jvminstructions.commands;
002:
003: import java.util.ArrayList;
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.Util;
012:
013: public class DastoreCommand extends AbstractInstructionCommand {
014:
015: public DastoreCommand(Behaviour context) {
016: super (context);
017:
018: }
019:
020: public int getSkipBytes() {
021: return 0;
022: }
023:
024: public void execute() {
025: Behaviour behaviour = getContext();
026: byte[] info = behaviour.getCode();
027: Operand op = null;
028: Operand op1 = null;
029: Operand op2 = null;
030: ArrayList starts = behaviour.getInstructionStartPositions();
031: int currentForIndex = getCurrentInstPosInCode();
032: StringBuffer addtype = new StringBuffer();
033: OperandStack opStack = getStack();
034:
035: boolean specialIASTORE = GlobalVariableStore.isSpecialIASTORE();
036: boolean primitiveastore = GlobalVariableStore
037: .isPrimitiveastore();
038: int arraytimespush = GlobalVariableStore.getArraytimespush();
039: boolean b = DecompilerHelper.checkForArrayPostIncrement(
040: currentForIndex, opStack, behaviour.getCode(),
041: "category1", addtype);
042: boolean bl2 = DecompilerHelper
043: .checkForArrayMultiAssignablePostIncrement(
044: currentForIndex, opStack, behaviour.getCode(),
045: "category1");
046: if (b && opStack.size() > 0
047: && GlobalVariableStore.getArraytimesstack().size() == 0) {
048: op = (Operand) opStack.pop();
049: op1 = (Operand) opStack.pop();
050: op2 = (Operand) opStack.pop();
051: java.lang.String temp = "";
052: if (addtype.toString().equals("add"))
053: temp += op2.getOperandValue() + "["
054: + op1.getOperandValue() + "]" + "++";
055: else
056: temp += op2.getOperandValue() + "["
057: + op1.getOperandValue() + "]" + "--";
058: Operand o = opStack.peekTopOfStack();
059: o.setOperandValue(temp);
060:
061: } else if (bl2 && opStack.size() > 0
062: && GlobalVariableStore.getArraytimesstack().size() == 0) {
063: op = (Operand) opStack.pop();
064: op1 = (Operand) opStack.pop();
065: op2 = (Operand) opStack.pop();
066: java.lang.String temp = "";
067: temp += op2.getOperandValue() + "[" + op1.getOperandValue()
068: + "]" + "=";
069: Operand o = opStack.peekTopOfStack();
070: temp = temp + o.getOperandValue();
071: o.setOperandValue(temp);
072: } else {
073: if (GlobalVariableStore.getSkipPrimitiveArrayStores()
074: .contains(new Integer(currentForIndex)) == false) {
075: java.lang.String tempString = "";
076: op = (Operand) opStack.pop();
077: op1 = (Operand) opStack.pop();
078: if (opStack.size() > 0) {
079: op2 = (Operand) opStack.pop();
080: tempString = op2.getOperandValue() + "["
081: + op1.getOperandValue() + "]="
082: + op.getOperandValue() + ";\n";
083: }
084: if (GlobalVariableStore.getArraytimesstack().size() == 0) {
085:
086: int curpos = currentForIndex;
087: if (curpos - 2 > 0
088: && (info[curpos - 1] == JvmOpCodes.DUP_X2
089: || info[curpos - 1] == JvmOpCodes.DUP
090: || info[curpos - 1] == JvmOpCodes.DUP2
091: || info[curpos - 1] == JvmOpCodes.DUP_X1
092: || info[curpos - 1] == JvmOpCodes.DUP2_X1 || info[curpos - 1] == JvmOpCodes.DUP2_X2)
093: && info[curpos - 2] == JvmOpCodes.DADD) {
094: tempString = "++" + op2.getOperandValue() + "["
095: + op1.getOperandValue() + "]";
096: java.lang.String v1 = op2.getOperandValue()
097: + "[" + op1.getOperandValue() + "]";
098: java.lang.String v2 = opStack.peekTopOfStack()
099: .getOperandValue();
100: if (v2.equals(v1)) {
101: opStack.pop();
102: }
103: opStack.push(createOperand(tempString));
104: specialIASTORE = true;
105: } else if (curpos - 2 > 0
106: && (info[curpos - 1] == JvmOpCodes.DUP_X2
107: || info[curpos - 1] == JvmOpCodes.DUP
108: || info[curpos - 1] == JvmOpCodes.DUP2
109: || info[curpos - 1] == JvmOpCodes.DUP_X1
110: || info[curpos - 1] == JvmOpCodes.DUP2_X1 || info[curpos - 1] == JvmOpCodes.DUP2_X2)
111: && info[curpos - 2] == JvmOpCodes.DSUB) {
112: tempString = "--" + op2.getOperandValue() + "["
113: + op1.getOperandValue() + "]";
114: java.lang.String v1 = op2.getOperandValue()
115: + "[" + op1.getOperandValue() + "]";
116: java.lang.String v2 = opStack.peekTopOfStack()
117: .getOperandValue();
118: if (v2.equals(v1)) {
119: opStack.pop();
120: }
121: opStack.push(createOperand(tempString));
122: specialIASTORE = true;
123: } else if (curpos - 3 > 0
124: && info[curpos - 1] == JvmOpCodes.DADD
125: && info[curpos - 2] == JvmOpCodes.DCONST_1
126: && (info[curpos - 3] == JvmOpCodes.DUP_X2
127: || info[curpos - 3] == JvmOpCodes.DUP
128: || info[curpos - 3] == JvmOpCodes.DUP2
129: || info[curpos - 3] == JvmOpCodes.DUP_X1
130: || info[curpos - 3] == JvmOpCodes.DUP2_X1 || info[curpos - 3] == JvmOpCodes.DUP2_X2)) {
131: tempString = op2.getOperandValue() + "["
132: + op1.getOperandValue() + "]++";
133: java.lang.String v1 = op2.getOperandValue()
134: + "[" + op1.getOperandValue() + "]";
135: java.lang.String v2 = opStack.peekTopOfStack()
136: .getOperandValue();
137: if (v2.equals(v1)) {
138: opStack.pop();
139: }
140: opStack.push(createOperand(tempString));
141: specialIASTORE = true;
142: } else if (curpos - 3 > 0
143: && info[curpos - 1] == JvmOpCodes.DSUB
144: && info[curpos - 2] == JvmOpCodes.DCONST_1
145: && (info[curpos - 3] == JvmOpCodes.DUP_X2
146: || info[curpos - 3] == JvmOpCodes.DUP
147: || info[curpos - 3] == JvmOpCodes.DUP2
148: || info[curpos - 3] == JvmOpCodes.DUP_X1
149: || info[curpos - 3] == JvmOpCodes.DUP2_X1 || info[curpos - 3] == JvmOpCodes.DUP2_X2)) {
150: tempString = op2.getOperandValue() + "["
151: + op1.getOperandValue() + "]--";
152: java.lang.String v1 = op2.getOperandValue()
153: + "[" + op1.getOperandValue() + "]";
154: java.lang.String v2 = opStack.peekTopOfStack()
155: .getOperandValue();
156: if (v2.equals(v1)) {
157: opStack.pop();
158: }
159: opStack.push(createOperand(tempString));
160: specialIASTORE = true;
161: } else {
162: if (GlobalVariableStore
163: .getSkipPrimitiveArrayStores()
164: .contains(new Integer(currentForIndex)) == false) {
165: behaviour
166: .appendToBuffer(Util
167: .formatDecompiledStatement(tempString));
168: }
169: }
170: } else {
171: primitiveastore = true;
172: java.lang.String newvalue = "";
173: arraytimespush = Integer
174: .parseInt(GlobalVariableStore
175: .getArraytimesstack().peek()
176: .toString());
177: if (arraytimespush > 0) {
178:
179: int curpos = currentForIndex;
180:
181: if (curpos - 2 > 0
182: && DecompilerHelper
183: .isArrayElement(curpos + 1)
184: && (info[curpos - 1] == JvmOpCodes.DUP_X2
185: || info[curpos - 1] == JvmOpCodes.DUP
186: || info[curpos - 1] == JvmOpCodes.DUP2
187: || info[curpos - 1] == JvmOpCodes.DUP_X1
188: || info[curpos - 1] == JvmOpCodes.DUP2_X1 || info[curpos - 1] == JvmOpCodes.DUP2_X2)
189: && info[curpos - 2] == JvmOpCodes.DADD) {
190: if (!newfound())
191: newvalue = "++" + op2.getOperandValue()
192: + "[" + op1.getOperandValue()
193: + "]";
194: else {
195: if (opStack.size() > 0) {
196: java.lang.String topv = opStack
197: .getTopOfStack()
198: .getOperandValue();
199: if (topv.trim().startsWith("++")) {
200: newvalue = op2
201: .getOperandValue()
202: + topv;
203: } else
204: newvalue = "++"
205: + op2.getOperandValue()
206: + topv;
207: if (topv.equals(opStack
208: .peekTopOfStack()
209: .getOperandValue())) {
210: opStack.pop();
211: }
212: }
213: }
214:
215: } else if (curpos - 2 > 0
216: && DecompilerHelper
217: .isArrayElement(curpos + 1)
218: && (info[curpos - 1] == JvmOpCodes.DUP_X2
219: || info[curpos - 1] == JvmOpCodes.DUP
220: || info[curpos - 1] == JvmOpCodes.DUP2
221: || info[curpos - 1] == JvmOpCodes.DUP_X1
222: || info[curpos - 1] == JvmOpCodes.DUP2_X1 || info[curpos - 1] == JvmOpCodes.DUP2_X2)
223: && info[curpos - 2] == JvmOpCodes.DSUB) {
224: if (!newfound())
225: newvalue = "--" + op2.getOperandValue()
226: + "[" + op1.getOperandValue()
227: + "]";
228: else {
229: if (opStack.size() > 0) {
230:
231: java.lang.String topv = opStack
232: .getTopOfStack()
233: .getOperandValue();
234: if (topv.trim().startsWith("--")) {
235: newvalue = op2
236: .getOperandValue()
237: + topv;
238: } else
239: newvalue = "--"
240: + op2.getOperandValue()
241: + topv;//
242: if (topv.equals(opStack
243: .peekTopOfStack()
244: .getOperandValue())) {
245: opStack.pop();
246: }
247:
248: }
249: }
250:
251: } else if (curpos - 3 > 0
252: && DecompilerHelper
253: .isArrayElement(curpos + 1)
254: && info[curpos - 1] == JvmOpCodes.DADD
255: && info[curpos - 2] == JvmOpCodes.DCONST_1
256: && (info[curpos - 3] == JvmOpCodes.DUP_X2
257: || info[curpos - 3] == JvmOpCodes.DUP
258: || info[curpos - 3] == JvmOpCodes.DUP2
259: || info[curpos - 3] == JvmOpCodes.DUP_X1
260: || info[curpos - 3] == JvmOpCodes.DUP2_X1 || info[curpos - 3] == JvmOpCodes.DUP2_X2)) {
261: if (!newfound())
262: newvalue = op2.getOperandValue() + "["
263: + op1.getOperandValue() + "]++";
264: else {
265: if (opStack.size() > 0) {
266:
267: java.lang.String topv = opStack
268: .getTopOfStack()
269: .getOperandValue();
270: newvalue = op2.getOperandValue()
271: + topv + "++";
272: if (topv.equals(opStack
273: .peekTopOfStack()
274: .getOperandValue())) {
275: opStack.pop();
276: }
277:
278: }
279: }
280:
281: } else if (curpos - 3 > 0
282: && DecompilerHelper
283: .isArrayElement(curpos + 1)
284: && info[curpos - 1] == JvmOpCodes.DSUB
285: && info[curpos - 2] == JvmOpCodes.DCONST_1
286: && (info[curpos - 3] == JvmOpCodes.DUP_X2
287: || info[curpos - 3] == JvmOpCodes.DUP
288: || info[curpos - 3] == JvmOpCodes.DUP2
289: || info[curpos - 3] == JvmOpCodes.DUP_X1
290: || info[curpos - 3] == JvmOpCodes.DUP2_X1 || info[curpos - 3] == JvmOpCodes.DUP2_X2)) {
291:
292: if (!newfound())
293: newvalue = op2.getOperandValue() + "["
294: + op1.getOperandValue() + "]--";
295: else {
296: if (opStack.size() > 0) {
297:
298: java.lang.String topv = opStack
299: .getTopOfStack()
300: .getOperandValue();
301: newvalue = op2.getOperandValue()
302: + topv + "--";
303: if (topv.equals(opStack
304: .peekTopOfStack()
305: .getOperandValue())) {
306: opStack.pop();
307: }
308: }
309: }
310:
311: } else
312: newvalue = "";
313: if (newvalue.length() > 0) {
314: StringBuffer v = new StringBuffer("");
315: int c = getGenericFinder()
316: .isNextInstructionConversionInst(
317: currentForIndex + 1, v);
318: if (c != -1
319: && newvalue.indexOf(v.toString()) == -1) {
320: newvalue = "(" + v.toString() + ")"
321: + newvalue;
322: }
323: }
324:
325: // ///////////////
326: if (GlobalVariableStore
327: .getSkipPrimitiveArrayStores()
328: .contains(new Integer(currentForIndex)) == false) {
329:
330: if (newfound()) {
331: // z=createOperand(op.getOperandValue());
332: // Operand y=opStack.getTopOfStack();
333: java.lang.String newv = op2
334: .getOperandValue()
335: + op.getOperandValue();
336: if (newvalue.length() > 0) {
337: newv = newvalue;
338: specialIASTORE = true;
339: }
340: arraytimespush = Integer
341: .parseInt(GlobalVariableStore
342: .getArraytimesstack()
343: .pop().toString());
344: arraytimespush--;
345: if (arraytimespush == 0) {
346: newv += "}";
347: } else {
348: GlobalVariableStore
349: .getArraytimesstack()
350: .push("" + arraytimespush);
351: newv += ",";
352: }
353: opStack.push(createOperand(newv));
354: } else {
355: if (GlobalVariableStore
356: .getArraytimesstack().size() > 0) {
357: arraytimespush = Integer
358: .parseInt(GlobalVariableStore
359: .getArraytimesstack()
360: .pop().toString());
361: arraytimespush--;
362: } else {
363: arraytimespush = 0;
364: }
365: if (arraytimespush == 0) {
366: boolean closeImmediate = false; // for the
367: // parent
368: // actually
369: if (GlobalVariableStore
370: .getArraytimesstack()
371: .size() > 0) {
372: int oldstacksize = Integer
373: .parseInt(GlobalVariableStore
374: .getArraytimesstack()
375: .pop()
376: .toString());
377: int newstacksize = oldstacksize - 1;
378: if (newstacksize != 0)
379: GlobalVariableStore
380: .getArraytimesstack()
381: .push(
382: ""
383: + newstacksize);
384: else
385: closeImmediate = true;
386: // codeStatements+="}";
387: }
388:
389: if (GlobalVariableStore
390: .getArraytimesstack()
391: .isEmpty()) {
392: if (newvalue.length() > 0) {
393: behaviour
394: .appendToBuffer(newvalue
395: + "}");
396: int count = arrayClosingBracketCount(currentForIndex);
397: java.lang.String temp = "";
398: for (int z = 1; z <= count; z++) {
399: temp += "\n}";
400: if (z < count)
401: temp += "\n";
402:
403: }
404: // Util.forceNewLine=false;
405: Util.forceTrimLines = false;
406: behaviour
407: .appendToBuffer(Util
408: .formatDecompiledStatement(temp)
409: + ";\n");
410: Util.forceNewLine = true;
411: Util.forceTrimLines = true;
412: specialIASTORE = true;
413: } else {
414: behaviour.appendToBuffer(op
415: .getOperandValue()
416: + "}");
417: int count = arrayClosingBracketCount(currentForIndex);
418: java.lang.String temp = "";
419: for (int z = 1; z <= count; z++) {
420: temp += "\n}";
421: if (z < count)
422: temp += "\n";
423: }
424: Util.forceStartSpace = false;
425: Util.forceNewLine = false;
426: Util.forceTrimLines = false;
427: behaviour
428: .appendToBuffer(Util
429: .formatDecompiledStatement(temp)
430: + ";\n");
431: Util.forceStartSpace = true;
432: Util.forceTrimLines = false;
433: Util.forceNewLine = true;
434: }
435: } else {
436: if (newvalue.length() > 0) {
437: behaviour
438: .appendToBuffer(newvalue
439: + "},");
440: specialIASTORE = true;
441: } else {
442: behaviour.appendToBuffer(op
443: .getOperandValue()
444: + "},");
445: }
446: if (closeImmediate) {
447: do {
448: Util.forceStartSpace = false;
449: Util.forceNewLine = false;
450: Util.forceTrimLines = false;
451: if (GlobalVariableStore
452: .getArraytimesstack()
453: .size() > 0)
454: behaviour
455: .appendToBuffer(Util
456: .formatDecompiledStatement("\n},\n"));
457: else {
458: behaviour
459: .appendToBuffer(Util
460: .formatDecompiledStatement("\n};\n"));
461: }
462: Util.forceStartSpace = true;
463: Util.forceNewLine = true;
464: Util.forceTrimLines = true;
465:
466: if (GlobalVariableStore
467: .getArraytimesstack()
468: .size() > 0) {
469: int oldstacksize = Integer
470: .parseInt(GlobalVariableStore
471: .getArraytimesstack()
472: .pop()
473: .toString());
474: int newstacksize = oldstacksize - 1;
475: if (newstacksize != 0) {
476: GlobalVariableStore
477: .getArraytimesstack()
478: .push(
479: ""
480: + newstacksize);
481: closeImmediate = false;
482: } else {
483: closeImmediate = true;
484: }
485: } else {
486: closeImmediate = false;
487: }
488:
489: } while (closeImmediate);
490:
491: }
492:
493: }
494:
495: } else {
496:
497: GlobalVariableStore
498: .getArraytimesstack()
499: .push("" + arraytimespush);
500: /*
501: * if(isThisInstrStart(starts,(currentForIndex-1)) &&
502: * isInstructionAnyDUP(info[currentForIndex-1]) &&
503: * newvalue!=null &&
504: * newvalue.trim().length() > 0){
505: * if(newvalue!=null &&
506: * (newvalue.trim().startsWith("++") ||
507: * newvalue.trim().startsWith("--")) &&
508: * opStack.size() > 0) { java.lang.String
509: * tpv=opStack.peekTopOfStack().getOperandValue().trim();
510: * if("++".concat(tpv).equals(newvalue) ||
511: * "--".concat(tpv).equals(newvalue)){
512: * opStack.pop(); } }
513: *
514: * opStack.push(createOperand(newvalue)); }
515: */
516: // else{
517: if (newvalue.length() > 0) {
518: behaviour
519: .appendToBuffer(newvalue
520: + ",");
521: specialIASTORE = true;
522: } else {
523:
524: if (getStoreFinder()
525: .isInstPrimitiveArrayStore(
526: info[(currentForIndex + 1)])
527: && tempString != null
528: && tempString.length() > 0)
529: behaviour
530: .appendToBuffer(tempString);
531: else
532: behaviour.appendToBuffer(op
533: .getOperandValue()
534: + ",");
535: }
536: // }
537: }
538: }
539: }
540: }
541: }
542: } else {
543:
544: if (opStack.size() > 2 && !newfound()) {
545: opStack.pop();
546: opStack.pop();
547: // opStack.pop();
548: }
549:
550: }
551: int nextinst = info[currentForIndex + 1];
552: if (getGenericFinder()
553: .isThisInstrStart(currentForIndex + 1)
554: && nextinst == JvmOpCodes.AASTORE) {
555: GlobalVariableStore.getSkipaastores().add(
556: new Integer(currentForIndex + 1));
557: }
558:
559: }
560:
561: GlobalVariableStore.setSpecialIASTORE(specialIASTORE);
562: GlobalVariableStore.setPrimitiveastore(primitiveastore);
563: GlobalVariableStore.setArraytimespush(arraytimespush);
564:
565: }
566:
567: }
|