def dw_memarg(obj, data): data = pack(data) obj.a, blen1 = read_leb128(data, 1, 0) obj.bytes += data[0:blen] obj.o, blen2 = read_leb128(data, 1, blen1) obj.bytes += data[blen:blen1 + blen2] obj.type = type_data_processing
def dw_table(obj, data): data = pack(data) v, blen = read_uleb128(data) obj.bytes += data[0:blen] obj.type = type_data_processing if v > 17: raise InstructionError(obj) if v < 8: obj.mntype = "i32" if v < 4 else "i64" post = "f32" if v in (0, 2, 4, 5) else "f64" su = "_s" if v % 2 == 0 else "_u" obj.mnemonic = "trunc_sat_" + post + su if v == 10: obj.mnemonic = "memory" obj.action = "copy" if data[blen:blen + 2] != b'\x00\x00': raise InstructionError(obj) obj.bytes += data[blen:blen + 2] return elif v == 11: obj.mnemonic = "memory" obj.action = "fill" if data[blen:blen + 1] != b'\x00': raise InstructionError(obj) obj.bytes += data[blen:blen + 1] return data = data[blen:] obj.x, blen1 = read_leb128(data, 1, 0) obj.bytes += data[0:blen1] if v == 8: obj.mnemonic = "memory" obj.action = "init" if data[blen1:blen1 + 1] != b'\x00': raise InstructionError(obj) obj.bytes += data[blen1:blen1 + 1] elif v == 9: obj.mnemonic = "data" obj.action = "drop" elif v == 12: obj.y = obj.x obj.x, blen2 = read_leb128(data, 1, blen1) obj.bytes += data[blen1:blen1 + blen2] obj.action = "init" elif v == 13: obj.mnemonic = "elem" obj.action = "drop" elif v == 14: obj.y, blen2 = read_leb128(data, 1, blen1) obj.bytes += data[blen1:blen1 + blen2] obj.action = "copy" else: obj.action = {15: "grow", 16: "size", 17: "fill"}[v]
def xdata_br_table(obj, **kargs): addr = kargs['address'] code = kargs['code'] obj.labels = [] addr += len(obj.bytes) off = 0 for l in range(obj.l): n, sz = read_leb128(code, 1, addr + off) obj.labels.append(n) off += sz n, sz = read_leb128(code, 1, addr + off) obj.default = n off += sz obj.bytes += code[addr:addr + off]
def dw_op_regx(obj, data): data = pack(data) indx, blen = read_leb128(data) sz = env.op_ptr.size r = env.reg("reg%d" % indx, sz) obj.operands = [r] obj.bytes += data[:blen] obj.type = type_data_processing
def dw_op_const(obj, data): sz = env.op_ptr.size if data.size < sz: raise InstructionError(obj) data = pack(data) result, blen = read_leb128(data, obj.sign) obj.operands = [env.cst(result, WORD)] obj.bytes += data[:blen] obj.type = type_data_processing
def xdata_call_indirect(obj, **kargs): addr = kargs['address'] code = kargs['code'] off = 0 n, sz = read_leb128(code, 1, addr + off) obj.y = n obj.operands.append(obj.y) off += sz obj.bytes += code[addr:addr + off]
def xdata_select(obj, **kargs): addr = kargs['address'] code = kargs['code'] obj.t = [] addr = addr + len(obj.bytes) off = 0 for l in range(obj.x): n, sz = read_leb128(code, 1, addr + off) obj.t.append(n) off += sz obj.operands[0] = obj.t obj.bytes += code[addr:addr + off]
def dw_op_bregx(obj, data): data = pack(data) indx, blen = read_leb128(data) sz = env.op_ptr.size r = env.reg("reg%d" % indx, sz) obj.bytes += data[:blen] data = data[blen:] result, blen = read_sleb128(data) offset = env.cst(result, blen * 8).signextend(sz) obj.operands = [r + offset] obj.bytes += data[:blen] obj.type = type_data_processing
def unpack(self, data, offset=0, psize=0): "returns a vector of count element(s) of its self.type" n,sz = read_leb128(data,1,offset) offset += sz vec = [] for _ in range(n): e = self.type() blob = e.unpack(data, offset) vec.append(blob) if isinstance(blob,StructCore): l = len(blob) else: l = e.size() sz += l offset += l self.count = n self._sz = sz return vec
def dw_op_leb128(obj, data): data = pack(data) result, blen = read_leb128(data) obj.operands = [env.cst(result, WORD)] obj.bytes += data[:blen] obj.type = type_data_processing