#ifndef _CONTEXT_H_ #define _CONTEXT_H_ #include class evalcontext_t; class evaltree_t { public: virtual std::string Evaluate(evalcontext_t* context)=0; }; typedef std::vector evaltree_vector; //------------ class eval_binary_operator_t : public evaltree_t { public: eval_binary_operator_t(ushort itype, evaltree_t* left, evaltree_t* right); static evaltree_t* MakeNode(ushort itype, evaltree_t* left, evaltree_t* right); virtual std::string Evaluate(evalcontext_t* context); ushort GetOperation(); evaltree_t*GetLeft(); evaltree_t*GetRight(); std::string GetOperatorString(); private: ushort m_itype; evaltree_t* m_left; evaltree_t* m_right; }; //------------ class eval_unary_operator_t : public evaltree_t { public: eval_unary_operator_t(ushort itype, evaltree_t* arg); static evaltree_t* MakeNode(ushort itype, evaltree_t* arg); virtual std::string Evaluate(evalcontext_t* context); ushort GetOperation(); evaltree_t* GetArg(); std::string GetOperatorString(); private: ushort m_itype; evaltree_t* m_arg; }; //------------ class eval_constant_t : public evaltree_t { public: eval_constant_t(ea_t ea); static evaltree_t* MakeNode(ea_t ea); virtual std::string Evaluate(evalcontext_t* context); ea_t GetConstant(); private: ea_t m_ea; }; //------------ class eval_register_t : public evaltree_t { public: eval_register_t(int reg); static evaltree_t* MakeNode(int reg); virtual std::string Evaluate(evalcontext_t* context); int GetRegister(); private: int m_reg; }; //------------ class evalcontext_t { public: evalcontext_t(ea_t ea); ~evalcontext_t(); evaltree_t *GetRegisterExpression(int reg); evaltree_t *GetStackArgExpression(int stackarg); evaltree_t *GetStackVarExpression(int stackvar); std::string EvaluateExpression(evaltree_t *tree); private: evaltree_vector m_registers; // 0 = R0, .. 3 = R3 evaltree_vector m_stackargs; // 0 = [SP], 1 = [SP-4], etc evaltree_vector m_stackvars; // either SP, or FP based. ea_t m_ea; func_t *m_pfn; void TraceBack(); void Assign(evaltree_t *dst, evaltree_t *src); evaltree_t *GetOperandExpression(const op_t& op); evaltree_t *GetRegister(int reg); }; #endif