def assert_contains_sequence(self, loop, instr): class Glob(object): next = None prev = None def __repr__(self): return '*' from rpython.jit.tool.oparser import OpParser, default_fail_descr parser = OpParser(instr, self.cpu, self.namespace, None, default_fail_descr, True, None) parser.vars = { arg.repr_short(arg._repr_memo) : arg for arg in loop.inputargs} operations = [] last_glob = None prev_op = None for line in instr.splitlines(): line = line.strip() if line.startswith("#") or \ line == "": continue if line.startswith("..."): last_glob = Glob() last_glob.prev = prev_op operations.append(last_glob) continue op = parser.parse_next_op(line) if last_glob is not None: last_glob.next = op last_glob = None operations.append(op) def check(op, candidate, rename): m = 0 if isinstance(candidate, Glob): if candidate.next is None: return 0 # consumes the rest if op.getopnum() != candidate.next.getopnum(): return 0 m = 1 candidate = candidate.next if op.getopnum() == candidate.getopnum(): for i,arg in enumerate(op.getarglist()): oarg = candidate.getarg(i) if arg in rename: assert rename[arg].same_box(oarg) else: rename[arg] = oarg if not op.returns_void(): rename[op] = candidate m += 1 return m return 0 j = 0 rename = {} ops = loop.finaloplist() for i, op in enumerate(ops): candidate = operations[j] j += check(op, candidate, rename) if isinstance(operations[-1], Glob): assert j == len(operations)-1, self.debug_print_operations(loop) else: assert j == len(operations), self.debug_print_operations(loop)