blob: 983f7f212db3f9209ca5ac33062996976b89692e (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
|
/*
* Fernflower - The Analytical Java Decompiler
* http://www.reversed-java.com
*
* (C) 2008 - 2010, Stiver
*
* This software is NEITHER public domain NOR free software
* as per GNU License. See license.txt for more details.
*
* This software is distributed WITHOUT ANY WARRANTY; without
* even the implied warranty of MERCHANTABILITY or FITNESS FOR
* A PARTICULAR PURPOSE.
*/
package de.fernflower.modules.decompiler.stats;
import de.fernflower.code.CodeConstants;
import de.fernflower.code.Instruction;
import de.fernflower.code.SimpleInstructionSequence;
import de.fernflower.code.cfg.BasicBlock;
import de.fernflower.main.DecompilerContext;
import de.fernflower.main.collectors.CounterContainer;
import de.fernflower.modules.decompiler.ExprProcessor;
public class BasicBlockStatement extends Statement {
// *****************************************************************************
// private fields
// *****************************************************************************
private BasicBlock block;
// *****************************************************************************
// constructors
// *****************************************************************************
public BasicBlockStatement(BasicBlock block) {
type = Statement.TYPE_BASICBLOCK;
this.block = block;
id = block.id;
CounterContainer coun = DecompilerContext.getCountercontainer();
if(id>=coun.getCounter(CounterContainer.STATEMENT_COUNTER)) {
coun.setCounter(CounterContainer.STATEMENT_COUNTER, id+1);
}
Instruction instr = block.getLastInstruction();
if(instr != null) {
if(instr.group==CodeConstants.GROUP_JUMP && instr.opcode != CodeConstants.opc_goto) {
lastBasicType = LASTBASICTYPE_IF;
} else if(instr.group==CodeConstants.GROUP_SWITCH) {
lastBasicType = LASTBASICTYPE_SWITCH;
}
}
// monitorenter and monitorexits
buildMonitorFlags();
}
// *****************************************************************************
// public methods
// *****************************************************************************
public String toJava(int indent) {
return ExprProcessor.listToJava(varDefinitions, indent)+
ExprProcessor.listToJava(exprents, indent);
}
public Statement getSimpleCopy() {
BasicBlock newblock = new BasicBlock(
DecompilerContext.getCountercontainer().getCounterAndIncrement(CounterContainer.STATEMENT_COUNTER));
SimpleInstructionSequence seq = new SimpleInstructionSequence();
for(int i=0;i<block.getSeq().length();i++) {
seq.addInstruction(block.getSeq().getInstr(i).clone(), -1);
}
newblock.setSeq(seq);
return new BasicBlockStatement(newblock);
}
// *****************************************************************************
// getter and setter methods
// *****************************************************************************
public BasicBlock getBlock() {
return block;
}
}
|