Python dis._unpack_opargs() Examples
The following are 9
code examples of dis._unpack_opargs().
You can vote up the ones you like or vote down the ones you don't like,
and go to the original project or source file by following the links above each example.
You may also want to check out all available functions/classes of the module
dis
, or try the search function
.
Example #1
Source File: modulefinder.py From Imogen with MIT License | 6 votes |
def scan_opcodes(self, co): # Scan the code, and yield 'interesting' opcode combinations code = co.co_code names = co.co_names consts = co.co_consts opargs = [(op, arg) for _, op, arg in dis._unpack_opargs(code) if op != EXTENDED_ARG] for i, (op, oparg) in enumerate(opargs): if op in STORE_OPS: yield "store", (names[oparg],) continue if (op == IMPORT_NAME and i >= 2 and opargs[i-1][0] == opargs[i-2][0] == LOAD_CONST): level = consts[opargs[i-2][1]] fromlist = consts[opargs[i-1][1]] if level == 0: # absolute import yield "absolute_import", (fromlist, names[oparg]) else: # relative import yield "relative_import", (level, fromlist, names[oparg]) continue
Example #2
Source File: modulefinder.py From Project-New-Reign---Nemesis-Main with GNU General Public License v3.0 | 6 votes |
def scan_opcodes_25(self, co, unpack = struct.unpack): # Scan the code, and yield 'interesting' opcode combinations code = co.co_code names = co.co_names consts = co.co_consts opargs = [(op, arg) for _, op, arg in dis._unpack_opargs(code) if op != EXTENDED_ARG] for i, (op, oparg) in enumerate(opargs): if op in STORE_OPS: yield "store", (names[oparg],) continue if (op == IMPORT_NAME and i >= 2 and opargs[i-1][0] == opargs[i-2][0] == LOAD_CONST): level = consts[opargs[i-2][1]] fromlist = consts[opargs[i-1][1]] if level == 0: # absolute import yield "absolute_import", (fromlist, names[oparg]) else: # relative import yield "relative_import", (level, fromlist, names[oparg]) continue
Example #3
Source File: finder.py From tensorlang with Apache License 2.0 | 6 votes |
def _UnpackOpArgs(self, code): """Unpack the operations and arguments from the byte code. From Python 3.5 onwards this is found in the private method _unpack_opargs but for earlier releases this wasn't available as a separate method.""" opIndex = 0 numOps = len(code) is3 = sys.version_info[0] >= 3 while opIndex < numOps: offset = opIndex if is3: op = code[opIndex] else: op = ord(code[opIndex]) opIndex += 1 arg = None if op >= dis.HAVE_ARGUMENT: if is3: arg = code[opIndex] + code[opIndex + 1] * 256 else: arg = ord(code[opIndex]) + ord(code[opIndex + 1]) * 256 opIndex += 2 yield (offset, op, arg)
Example #4
Source File: modulefinder.py From odoo13-x64 with GNU General Public License v3.0 | 6 votes |
def scan_opcodes(self, co): # Scan the code, and yield 'interesting' opcode combinations code = co.co_code names = co.co_names consts = co.co_consts opargs = [(op, arg) for _, op, arg in dis._unpack_opargs(code) if op != EXTENDED_ARG] for i, (op, oparg) in enumerate(opargs): if op in STORE_OPS: yield "store", (names[oparg],) continue if (op == IMPORT_NAME and i >= 2 and opargs[i-1][0] == opargs[i-2][0] == LOAD_CONST): level = consts[opargs[i-2][1]] fromlist = consts[opargs[i-1][1]] if level == 0: # absolute import yield "absolute_import", (fromlist, names[oparg]) else: # relative import yield "relative_import", (level, fromlist, names[oparg]) continue
Example #5
Source File: modulefinder.py From Carnets with BSD 3-Clause "New" or "Revised" License | 6 votes |
def scan_opcodes(self, co): # Scan the code, and yield 'interesting' opcode combinations code = co.co_code names = co.co_names consts = co.co_consts opargs = [(op, arg) for _, op, arg in dis._unpack_opargs(code) if op != EXTENDED_ARG] for i, (op, oparg) in enumerate(opargs): if op in STORE_OPS: yield "store", (names[oparg],) continue if (op == IMPORT_NAME and i >= 2 and opargs[i-1][0] == opargs[i-2][0] == LOAD_CONST): level = consts[opargs[i-2][1]] fromlist = consts[opargs[i-1][1]] if level == 0: # absolute import yield "absolute_import", (fromlist, names[oparg]) else: # relative import yield "relative_import", (level, fromlist, names[oparg]) continue
Example #6
Source File: modulefinder.py From android_universal with MIT License | 6 votes |
def scan_opcodes(self, co): # Scan the code, and yield 'interesting' opcode combinations code = co.co_code names = co.co_names consts = co.co_consts opargs = [(op, arg) for _, op, arg in dis._unpack_opargs(code) if op != EXTENDED_ARG] for i, (op, oparg) in enumerate(opargs): if op in STORE_OPS: yield "store", (names[oparg],) continue if (op == IMPORT_NAME and i >= 2 and opargs[i-1][0] == opargs[i-2][0] == LOAD_CONST): level = consts[opargs[i-2][1]] fromlist = consts[opargs[i-1][1]] if level == 0: # absolute import yield "absolute_import", (fromlist, names[oparg]) else: # relative import yield "relative_import", (level, fromlist, names[oparg]) continue
Example #7
Source File: test_bytecode_modification.py From PyDev.Debugger with Eclipse Public License 1.0 | 5 votes |
def compare_bytes_sequence(self, code1, code2, inserted_code_size): """ Compare code after modification and the real code Since we add POP_JUMP_IF_TRUE instruction, we can't compare modified code and the real code. That's why we allow some inaccuracies while code comparison :param code1: result code after modification :param code2: a real code for checking :param inserted_code_size: size of inserted code """ seq1 = [(offset, op, arg) for offset, op, arg in dis._unpack_opargs(code1)] seq2 = [(offset, op, arg) for offset, op, arg in dis._unpack_opargs(code2)] assert len(seq1) == len(seq2), "Bytes sequences have different lengths %s != %s" % (len(seq1), len(seq2)) for i in range(len(seq1)): of, op1, arg1 = seq1[i] _, op2, arg2 = seq2[i] if op1 != op2: if op1 == 115 and op2 == 1: # it's ok, because we added POP_JUMP_IF_TRUE manually, but it's POP_TOP in the real code # inserted code - 2 (removed return instruction) - real code inserted # Jump should be done to the beginning of inserted fragment self.assertEqual(arg1, of - (inserted_code_size - 2)) continue elif op1 == EXTENDED_ARG and op2 == 12: # we added a real UNARY_NOT to balance EXTENDED_ARG added by new jump instruction # i.e. inserted code size was increased as well inserted_code_size += 2 continue self.assertEqual(op1, op2, "Different operators at offset {}".format(of)) if arg1 != arg2: if op1 in (100, 101, 106, 116): # Sometimes indexes of variable names and consts may be different, when we insert them, it's ok continue else: self.assertEqual(arg1, arg2, "Different arguments at offset {}".format(of))
Example #8
Source File: serialise_main.py From chopsticks with Apache License 2.0 | 5 votes |
def iter_opcodes(code): """Iterate over (op, arg) parameters in the bytecode of code. Taken from the code of the dis module. """ try: unpack_opargs = dis._unpack_opargs except AttributeError: # In Python (< 3.5) we have to parse the bytecode ourselves if PY2: ord_ = ord else: def ord_(c): return c n = len(code) i = 0 extended_arg = 0 while i < n: op = ord_(code[i]) i = i + 1 if op >= dis.HAVE_ARGUMENT: oparg = ord_(code[i]) + ord_(code[i + 1]) * 256 + extended_arg extended_arg = 0 i = i + 2 if op == dis.EXTENDED_ARG: extended_arg = oparg * long(65536) else: yield op, oparg else: # More recent Python 3 has a function for this, though it is # not a public API. for _, op, arg in unpack_opargs(code): yield (op, arg)
Example #9
Source File: finder.py From tensorlang with Apache License 2.0 | 4 votes |
def _ScanCode(self, co, module, deferredImports, topLevel = True): """Scan code, looking for imported modules and keeping track of the constants that have been created in order to better tell which modules are truly missing.""" arguments = [] importedModule = None method = dis._unpack_opargs if sys.version_info[:2] >= (3, 5) \ else self._UnpackOpArgs for opIndex, op, opArg in method(co.co_code): # keep track of constants (these are used for importing) # immediately restart loop so arguments are retained if op == LOAD_CONST: arguments.append(co.co_consts[opArg]) continue # import statement: attempt to import module elif op == IMPORT_NAME: name = co.co_names[opArg] if len(arguments) >= 2: relativeImportIndex, fromList = arguments[-2:] else: relativeImportIndex = -1 fromList, = arguments if name not in module.excludeNames: importedModule = self._ImportModule(name, deferredImports, module, relativeImportIndex) if importedModule is not None: if fromList and fromList != ("*",) \ and importedModule.path is not None: self._EnsureFromList(module, importedModule, fromList, deferredImports) # import * statement: copy all global names elif op == IMPORT_STAR and topLevel and importedModule is not None: module.globalNames.update(importedModule.globalNames) # store operation: track only top level elif topLevel and op in STORE_OPS: name = co.co_names[opArg] module.globalNames[name] = None # reset arguments; these are only needed for import statements so # ignore them in all other cases! arguments = [] # Scan the code objects from function & class definitions for constant in co.co_consts: if isinstance(constant, type(co)): self._ScanCode(constant, module, deferredImports, topLevel = False)