def _transform(self, node): laststr = [] tr = Transformer(node) for i, cur in tr: if isinstance(cur, Output) and cur.expr.simple(): tr.replace() laststr.append(chr(int(cur.expr) & 0xFF)) elif isinstance(cur, OutputConst): tr.replace() laststr.append(cur.str) elif not cur.pure(): # I/O cannot be reordered! if laststr: tr.prepend(OutputConst("".join(laststr))) laststr = [] if laststr: node.append(OutputConst("".join(laststr))) return node
def _transform(self, node): laststr = [] tr = Transformer(node) for i, cur in tr: if isinstance(cur, Output) and cur.expr.simple(): tr.replace() laststr.append(chr(int(cur.expr) & 0xff)) elif isinstance(cur, OutputConst): tr.replace() laststr.append(cur.str) elif not cur.pure(): # I/O cannot be reordered! if laststr: tr.prepend(OutputConst(''.join(laststr))) laststr = [] if laststr: node.append(OutputConst(''.join(laststr))) return node
def transform(self, node): if not isinstance(node, Program): return node offsets = 0 changed = set([None]) # for getting rid of None tr = Transformer(node) for i, cur in tr: refs = cur.prereferences().movepointer(offsets) updates = cur.preupdates().movepointer(offsets) zerorefs = set(refs.unsure) - changed if zerorefs: tr.prepend(*[SetMemory(j - offsets, 0) for j in zerorefs]) changed.update(zerorefs) changed.update(updates.unsure) ioffsets = cur.offsets() if ioffsets is None: break offsets += ioffsets return node
def transform(self, node): if not isinstance(node, Program): return node offsets = 0 changed = set([None]) # for getting rid of None tr = Transformer(node) for i, cur in tr: refs = cur.prereferences().movepointer(offsets) updates = cur.preupdates().movepointer(offsets) zerorefs = set(refs.unsure) - changed if zerorefs: tr.prepend(*[SetMemory(j - offsets, 0) for j in zerorefs]) changed.update(zerorefs) changed.update(updates.unsure) ioffsets = cur.offsets() if ioffsets is None: break offsets += ioffsets return node