00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #ifndef IFNODE_H
00022 #define IFNODE_H
00023
00024 #include "GenericNodes.h"
00025 #include <deque>
00026 #include "CallNodes.h"
00027
00028 class EndNode : public Node
00029 {
00030 public:
00031 EndNode(const uint32 opcode, const uint32 offset, const uint32 newTargetOffset)
00032 : Node(opcode, offset, Type(Type::T_INVALID)), targetOffset(newTargetOffset)
00033 {
00034 assert(acceptOp(opcode, 0x52));
00035 switch(opcode)
00036 {
00037 case 0x52: etype = JMP; break;
00038 default: assert(false);
00039 }
00040 };
00041 ~EndNode() {};
00042
00043 void print_unk(Console &o, const uint32 isize) const;
00044 void print_asm(Console &o) const;
00045 void print_bin(ODequeDataSource &o) const;
00046 bool fold(DCUnit *unit, std::deque<Node *> &nodes);
00047
00048 inline uint32 TargetOffset() const { return targetOffset; };
00049
00050 protected:
00051 enum endtype { JMP } etype;
00052
00053 private:
00054 uint32 targetOffset;
00055 };
00056
00057 class IfNode;
00058
00059 class IfNode : public UniNode
00060 {
00061 public:
00062 enum iftype { I_IF=0, I_IF_ELSE, I_IF_ELSE_IF, I_ELSE_IF, I_ELSE_IF_ELSE, I_ELSE };
00063
00064 IfNode(const iftype newItype, const uint32 newTargetOffset)
00065 : UniNode(0x51, 0x0000, Type(Type::T_INVALID)), itype(newItype),
00066 targetOffset(newTargetOffset), jmpnode(0), elsenode(0)
00067 {};
00068 IfNode(const uint32 opcode, const uint32 offset, const uint32 newTargetOffset)
00069 : UniNode(opcode, offset, Type(Type::T_INVALID)),
00070 targetOffset(newTargetOffset), jmpnode(0), elsenode(0)
00071 {
00072 assert(acceptOp(opcode, 0x51));
00073 switch(opcode)
00074 {
00075 case 0x51: itype = I_IF; break;
00076 default: assert(false);
00077 }
00078 };
00079 ~IfNode() {};
00080
00081 void print_unk(Console &o, const uint32 isize) const;
00082 void print_asm(Console &o) const;
00083 void print_bin(ODequeDataSource &o) const;
00084 bool fold(DCUnit *unit, std::deque<Node *> &nodes);
00085 bool fold_else(DCUnit *unit, std::deque<Node *> &nodes);
00086
00087 inline uint32 TargetOffset() const
00088 {
00089 if(jmpnode!=0)
00090 return jmpnode->TargetOffset();
00091 return targetOffset;
00092 };
00093
00094 void AddJmp(EndNode *jmp) { assert(jmpnode==0); jmpnode=jmp; };
00095
00096 std::deque<Node *> &nodes() { return ifnodes; };
00097 IfNode *elsen() { return elsenode; };
00098
00099
00100
00101
00102
00103
00104
00105
00106
00107
00108
00109
00110
00111 iftype itype;
00112
00113
00114 void setAddSP(DCCallPostfixNode *newAddSP) { addSP = newAddSP; };
00115
00116 protected:
00117 std::deque<Node *> ifnodes;
00118
00119 private:
00120 uint32 targetOffset;
00121 EndNode *jmpnode;
00122 DCCallPostfixNode *addSP;
00123 public:
00124 IfNode *elsenode;
00125 };
00126
00127 #endif