From 02874e6afedace526146f154e883e84eecc56fad Mon Sep 17 00:00:00 2001 From: danghvu Date: Wed, 8 Jan 2014 08:20:35 +0700 Subject: [PATCH] Shorten python code for getting detail info --- bindings/python/capstone/capstone.py | 389 ++------------------------- 1 file changed, 23 insertions(+), 366 deletions(-) diff --git a/bindings/python/capstone/capstone.py b/bindings/python/capstone/capstone.py index e44321a0..3aab1711 100644 --- a/bindings/python/capstone/capstone.py +++ b/bindings/python/capstone/capstone.py @@ -304,375 +304,32 @@ class CsInsn(object): return detail.groups[:detail.groups_count] return None - @property - def cc(self): - if not self._cs._detail: - return None + def __gen_detail(self): + arch = self._cs.arch + all_info = self._raw.detail.contents + if arch == CS_ARCH_ARM: + (self.cc, self.update_flags, self.writeback, self.operands) = \ + arm.get_arch_info(all_info.arch.arm) + elif arch == CS_ARCH_ARM64: + (self.cc, self.update_flags, self.writeback, self.operands) = \ + arm64.get_arch_info(all_info.arch.arm64) + elif arch == CS_ARCH_X86: + (self.prefix, self.segment, self.opcode, self.op_size, self.addr_size, \ + self.disp_size, self.imm_size, self.modrm, self.sib, self.disp, \ + self.sib_index, self.sib_scale, self.sib_base, self.operands) = x86.get_arch_info(all_info.arch.x86) + elif arch == CS_ARCH_MIPS: + self.operands = mips.get_arch_info(all_info.arch.mips) - detail = self._raw.detail.contents - if self._cs.arch == CS_ARCH_ARM: - try: - return self._cc - except: - (self._cc, self._update_flags, self._writeback, self._operands) = \ - arm.get_arch_info(detail.arch.arm) - return self._cc - elif self._cs.arch == CS_ARCH_ARM64: - try: - return self._cc - except: - (self._cc, self._update_flags, self._writeback, self._operands) = \ - arm64.get_arch_info(detail.arch.arm64) - return self._cc - else: + def __getattr__(self, name): + attr = object.__getattribute__ + if not attr(self, '_cs')._detail: return None - - @property - def update_flags(self): - if not self._cs._detail: - return None - - detail = self._raw.detail.contents - if self._cs.arch == CS_ARCH_ARM: - try: - return self._update_flags - except: - (self._cc, self._update_flags, self._writeback, self._operands) = \ - arm.get_arch_info(detail.arch.arm) - return self._update_flags - elif self._cs.arch == CS_ARCH_ARM64: - try: - return self._update_flags - except: - (self._cc, self._update_flags, self._writeback, self._operands) = \ - arm64.get_arch_info(detail.arch.arm64) - return self._update_flags - else: - return None - - @property - def writeback(self): - if not self._cs._detail: - return None - - detail = self._raw.detail.contents - if self._cs.arch == CS_ARCH_ARM: - try: - return self._writeback - except: - (self._cc, self._update_flags, self._writeback, self._operands) = \ - arm.get_arch_info(detail.arch.arm) - return self._writeback - elif self._cs.arch == CS_ARCH_ARM64: - try: - return self._writeback - except: - (self._cc, self._update_flags, self._writeback, self._operands) = \ - arm64.get_arch_info(detail.arch.arm64) - return self._writeback - else: - return None - - @property - def operands(self): - if not self._cs._detail: - return None - - detail = self._raw.detail.contents - try: - return self._operands - except: - if self._cs.arch == CS_ARCH_ARM: - (self._cc, self._update_flags, self._writeback, self._operands) = \ - arm.get_arch_info(detail.arch.arm) - return self._operands - elif self._cs.arch == CS_ARCH_ARM64: - (self._cc, self._update_flags, self._writeback, self._operands) = \ - arm64.get_arch_info(detail.arch.arm64) - return self._operands - elif self._cs.arch == CS_ARCH_X86: - (self._prefix, self._segment, self._opcode, self._op_size, self._addr_size, \ - self._disp_size, self._imm_size, self._modrm, self._sib, self._disp, \ - self._sib_index, self._sib_scale, self._sib_base, self._operands) = x86.get_arch_info(detail.arch.x86) - return self._operands - elif self._cs.arch == CS_ARCH_MIPS: - self._operands = mips.get_arch_info(detail.arch.mips) - return self._operands - if self._cs.arch == CS_ARCH_PPC: - (self._bc, self._bh, self._update_cr0, self._operands) = \ - ppc.get_arch_info(detail.arch.ppc) - return self._operands - else: - return None - - @property - def bc(self): - if not self._cs._detail: - return None - - detail = self._raw.detail.contents - if self._cs.arch == CS_ARCH_PPC: - try: - return self._bc - except: - (self._bc, self._bh, self._update_cr0, self._operands) = \ - ppc.get_arch_info(detail.arch.ppc) - return self._bc - else: - return None - - @property - def bh(self): - if not self._cs._detail: - return None - - detail = self._raw.detail.contents - if self._cs.arch == CS_ARCH_PPC: - try: - return self._bh - except: - (self._bc, self._bh, self._update_cr0, self._operands) = \ - ppc.get_arch_info(detail.arch.ppc) - return self._bh - else: - return None - - @property - def update_cr0(self): - if not self._cs._detail: - return None - - detail = self._raw.detail.contents - if self._cs.arch == CS_ARCH_PPC: - try: - return self._update_cr0 - except: - (self._bc, self._bh, self._update_cr0, self._operands) = \ - ppc.get_arch_info(detail.arch.ppc) - return self._update_cr0 - else: - return None - - @property - def prefix(self): - if not self._cs._detail: - return None - - detail = self._raw.detail.contents - if self._cs.arch == CS_ARCH_X86: - try: - return self._prefix - except: - (self._prefix, self._segment, self._opcode, self._op_size, self._addr_size, \ - self._disp_size, self._imm_size, self._modrm, self._sib, self._disp, \ - self._sib_index, self._sib_scale, self._sib_base, self._operands) = x86.get_arch_info(detail.arch.x86) - return self.prefix - else: - return None - - @property - def segment(self): - if not self._cs._detail: - return None - - detail = self._raw.detail.contents - if self._cs.arch == CS_ARCH_X86: - try: - return self._segment - except: - (self._prefix, self._segment, self._opcode, self._op_size, self._addr_size, \ - self._disp_size, self._imm_size, self._modrm, self._sib, self._disp, \ - self._sib_index, self._sib_scale, self._sib_base, self._operands) = x86.get_arch_info(detail.arch.x86) - return self._segment - else: - return None - - @property - def opcode(self): - if not self._cs._detail: - return None - - detail = self._raw.detail.contents - if self._cs.arch == CS_ARCH_X86: - try: - return self._opcode - except: - (self._prefix, self._segment, self._opcode, self._op_size, self._addr_size, \ - self._disp_size, self._imm_size, self._modrm, self._sib, self._disp, \ - self._sib_index, self._sib_scale, self._sib_base, self._operands) = x86.get_arch_info(detail.arch.x86) - return self.opcode - else: - return None - - @property - def op_size(self): - if not self._cs._detail: - return None - - detail = self._raw.detail.contents - if self._cs.arch == CS_ARCH_X86: - try: - return self._op_size - except: - (self._prefix, self._segment, self._opcode, self._op_size, self._addr_size, \ - self._disp_size, self._imm_size, self._modrm, self._sib, self._disp, \ - self._sib_index, self._sib_scale, self._sib_base, self._operands) = x86.get_arch_info(detail.arch.x86) - return self._op_size - else: - return None - - @property - def addr_size(self): - if not self._cs._detail: - return None - - detail = self._raw.detail.contents - if self._cs.arch == CS_ARCH_X86: - try: - return self._addr_size - except: - (self._prefix, self._segment, self._opcode, self._op_size, self._addr_size, \ - self._disp_size, self._imm_size, self._modrm, self._sib, self._disp, \ - self._sib_index, self._sib_scale, self._sib_base, self._operands) = x86.get_arch_info(detail.arch.x86) - return self._addr_size - else: - return None - - @property - def disp_size(self): - if not self._cs._detail: - return None - - detail = self._raw.detail.contents - if self._cs.arch == CS_ARCH_X86: - try: - return self._disp_size - except: - (self._prefix, self._segment, self._opcode, self._op_size, self._addr_size, \ - self._disp_size, self._imm_size, self._modrm, self._sib, self._disp, \ - self._sib_index, self._sib_scale, self._sib_base, self._operands) = x86.get_arch_info(detail.arch.x86) - return self._disp_size - else: - return None - - @property - def imm_size(self): - if not self._cs._detail: - return None - - detail = self._raw.detail.contents - if self._cs.arch == CS_ARCH_X86: - try: - return self._imm_size - except: - (self._prefix, self._segment, self._opcode, self._op_size, self._addr_size, \ - self._disp_size, self._imm_size, self._modrm, self._sib, self._disp, \ - self._sib_index, self._sib_scale, self._sib_base, self._operands) = x86.get_arch_info(detail.arch.x86) - return self._imm_size - else: - return None - - @property - def modrm(self): - if not self._cs._detail: - return None - - detail = self._raw.detail.contents - if self._cs.arch == CS_ARCH_X86: - try: - return self._modrm - except: - (self._prefix, self._segment, self._opcode, self._op_size, self._addr_size, \ - self._disp_size, self._imm_size, self._modrm, self._sib, self._disp, \ - self._sib_index, self._sib_scale, self._sib_base, self._operands) = x86.get_arch_info(detail.arch.x86) - return self._modrm - else: - return None - - @property - def sib(self): - if not self._cs._detail: - return None - - detail = self._raw.detail.contents - if self._cs.arch == CS_ARCH_X86: - try: - return self._sib - except: - (self._prefix, self._segment, self._opcode, self._op_size, self._addr_size, \ - self._disp_size, self._imm_size, self._modrm, self._sib, self._disp, \ - self._sib_index, self._sib_scale, self._sib_base, self._operands) = x86.get_arch_info(detail.arch.x86) - return self._sib - else: - return None - - @property - def disp(self): - if not self._cs._detail: - return None - - detail = self._raw.detail.contents - if self._cs.arch == CS_ARCH_X86: - try: - return self._disp - except: - (self._prefix, self._segment, self._opcode, self._op_size, self._addr_size, \ - self._disp_size, self._imm_size, self._modrm, self._sib, self._disp, \ - self._sib_index, self._sib_scale, self._sib_base, self._operands) = x86.get_arch_info(detail.arch.x86) - return self._disp - else: - return None - - @property - def sib_index(self): - if not self._cs._detail: - return None - - detail = self._raw.detail.contents - if self._cs.arch == CS_ARCH_X86: - try: - return self._sib_index - except: - (self._prefix, self._segment, self._opcode, self._op_size, self._addr_size, \ - self._disp_size, self._imm_size, self._modrm, self._sib, self._disp, \ - self._sib_index, self._sib_scale, self._sib_base, self._operands) = x86.get_arch_info(detail.arch.x86) - return self._sib_index - else: - return None - - @property - def sib_scale(self): - if not self._cs._detail: - return None - - detail = self._raw.detail.contents - if self._cs.arch == CS_ARCH_X86: - try: - return self._sib_scale - except: - (self._prefix, self._segment, self._opcode, self._op_size, self._addr_size, \ - self._disp_size, self._imm_size, self._modrm, self._sib, self._disp, \ - self._sib_index, self._sib_scale, self._sib_base, self._operands) = x86.get_arch_info(detail.arch.x86) - return self._sib_scale - else: - return None - - @property - def sib_base(self): - if not self._cs._detail: - return None - - detail = self._raw.detail.contents - if self._cs.arch == CS_ARCH_X86: - try: - return self._sib_base - except: - (self._prefix, self._segment, self._opcode, self._op_size, self._addr_size, \ - self._disp_size, self._imm_size, self._modrm, self._sib, self._disp, \ - self._sib_index, self._sib_scale, self._sib_base, self._operands) = x86.get_arch_info(detail.arch.x86) - return self._sib_base - else: + _dict = attr(self, '__dict__') + if 'operands' not in _dict: + self.__gen_detail() + if name not in _dict: return None + return _dict[name] # get the last error code def errno():