def bind_code(co, globals): """ Take a code object and a dictionnary and returns a new code object where the opcodes LOAD_GLOBAL are replaced by LOAD_CONST whenever the global's name appear in the dictionnary """ consts = list(co.co_consts) assigned = {} code = co.co_code new_code = "" n = len(code) i = 0 while i < n: c = code[i] op = ord(c) i += 1 if op >= HAVE_ARGUMENT: oparg = ord(code[i]) + ord(code[i+1]) * 256 i += 2 else: oparg = None if op == LOAD_GLOBAL: name = co.co_names[oparg] if name in globals: k = assigned.get(name, None) if k == None: k = len(consts) assigned[name] = len(consts) consts.append(globals[name]) op = LOAD_CONST oparg = k new_code += chr(op) if oparg is not None: new_code += chr(oparg & 255) new_code += chr( (oparg>>8) & 255 ) return make_code(co.co_argcount, co.co_nlocals, co.co_stacksize, co.co_flags, new_code, tuple(consts), co.co_names, co.co_varnames, co.co_filename, co.co_name, co.co_firstlineno, co.co_lnotab )
def bind_code(co, globals): """ Take a code object and a dictionnary and returns a new code object where the opcodes LOAD_GLOBAL are replaced by LOAD_CONST whenever the global's name appear in the dictionnary """ consts = list(co.co_consts) assigned = {} code = co.co_code new_code = "" n = len(code) i = 0 while i < n: c = code[i] op = ord(c) i += 1 if op >= HAVE_ARGUMENT: oparg = ord(code[i]) + ord(code[i+1]) * 256 i += 2 else: oparg = None if op == LOAD_GLOBAL: name = co.co_names[oparg] if globals.has_key(name): k = assigned.get(name, None) if k == None: k = len(consts) assigned[name] = len(consts) consts.append(globals[name]) op = LOAD_CONST oparg = k new_code += chr(op) if oparg is not None: new_code += chr(oparg & 255) new_code += chr( (oparg>>8) & 255 ) return make_code(co.co_argcount, co.co_nlocals, co.co_stacksize, co.co_flags, new_code, tuple(consts), co.co_names, co.co_varnames, co.co_filename, co.co_name, co.co_firstlineno, co.co_lnotab )
def rewrite_code(co, consts_dict, consts_tuple): """Take a code object and a dictionnary and returns a new code object where the opcodes LOAD_GLOBAL are replaced by LOAD_CONST whenever the global's name appear in the dictionnary""" code = co.co_code new_code = "" n = len(code) i = 0 consts_list = list(consts_tuple) while i < n: c = code[i] op = ord(c) i += 1 extended_arg = 0 if op >= HAVE_ARGUMENT: oparg = ord(code[i]) + ord(code[i+1])*256+extended_arg extended_arg = 0 i += 2 else: oparg = None if op == EXTENDED_ARG: extended_arg = oparg*65536 elif op == LOAD_GLOBAL: name = co.co_names[oparg] k = consts_dict.get(name) if k is not None: op = LOAD_CONST oparg = k elif op == LOAD_CONST: val = co.co_consts[oparg] oparg = consts_list.index(val) new_code += chr(op) if oparg is not None: new_code += chr(oparg & 255) new_code += chr( (oparg>>8) & 255 ) return make_code(co.co_argcount, co.co_nlocals, co.co_stacksize, co.co_flags, new_code, consts_tuple, co.co_names, co.co_varnames, co.co_filename, co.co_name, co.co_firstlineno, co.co_lnotab )
def rewrite_code(co, consts_dict, consts_tuple): """Take a code object and a dictionnary and returns a new code object where the opcodes LOAD_GLOBAL are replaced by LOAD_CONST whenever the global's name appear in the dictionnary""" code = co.co_code new_code = "" n = len(code) i = 0 consts_list = list(consts_tuple) while i < n: c = code[i] op = ord(c) i += 1 extended_arg = 0 if op >= HAVE_ARGUMENT: oparg = ord(code[i]) + ord(code[i+1])*256+extended_arg extended_arg = 0 i += 2 else: oparg = None if op == EXTENDED_ARG: extended_arg = oparg*65536L elif op == LOAD_GLOBAL: name = co.co_names[oparg] k = consts_dict.get(name) if k is not None: op = LOAD_CONST oparg = k elif op == LOAD_CONST: val = co.co_consts[oparg] oparg = consts_list.index(val) new_code += chr(op) if oparg is not None: new_code += chr(oparg & 255) new_code += chr( (oparg>>8) & 255 ) return make_code(co.co_argcount, co.co_nlocals, co.co_stacksize, co.co_flags, new_code, consts_tuple, co.co_names, co.co_varnames, co.co_filename, co.co_name, co.co_firstlineno, co.co_lnotab )