Example #1
0
    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
Example #2
0
    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
Example #3
0
    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
Example #4
0
    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