def prepare(self): last_exp = None for block in self._blocks: exp = Expression(block, self.tokenizer, self) self._expressions.append(exp) if last_exp: last_exp.next = exp last_exp = exp for exp in self._expressions: exp.tokenize() self.convert_breaks() self.convert_jumps()
def setup(self): self._scope = {} for index, name in enumerate(self.bytecode.argnames): self._scope[name] = index blocks = [] # find LOAD_GLOBALS gbl = [] for instr in self.bytecode: if isinstance(instr, Instr) and instr.opcode == pyop.LOAD_GLOBAL: gbl.append(instr.arg) # if there are global things passed in # we want to check if they are used in the method # and if so, load them in global_blocks = [] if len(self._extra): for item in self._extra: if item[-1].opcode == pyop.STORE_NAME: if item[-1].arg in gbl: global_blocks.append(item) self.add_to_scope(item[-1].arg) if item[0].opcode == pyop.LOAD_NAME: item[0].opcode = pyop.LOAD_GLOBAL blocks = global_blocks for item in global_blocks: for instr in item: if instr.lineno < self.MAX_FILE_LINENO: # many method shared the _extra instruction. so only add once! instr.lineno = self.MAX_FILE_LINENO + instr.lineno instructions = [] last_ln = self.bytecode[0].lineno for instr in self.bytecode: if not isinstance(instr, Label) and instr.lineno != last_ln: last_ln = instr.lineno if len(instructions): blocks.append(instructions) instructions = [] if not isinstance(instr, Label) and instr.opcode == pyop.STORE_FAST: self.add_to_scope(instr.arg) instructions.append(instr) if len(instructions): blocks.append(instructions) self._blocks = blocks method_exp = Expression([], None, self) method_instr = Instr('NOP') method_instr.lineno = 1 method_token = PyToken(method_instr, method_exp, None, None) self.tokenizer = VMTokenizer(self, method_token) self._expressions = []