def as_entity(self):
     if self.__fixed_var:
         block = self.sup.compiler.create_block('as_entity')
         block.set_is_function()
         self.sup.compiler.add_insn(i.Call(block))
         return block, self.__fixed_var
     return self.sup.as_entity(self._var)
Exemplo n.º 2
0
    def _gen_for(size, func, prefix, indexparam, gen_callback, *cb_args):
        entry = func.create_block('entry')
        # Copy to local variable due to register allocation speedup
        index = func.preamble.define(i.DefineVariable(indexparam.type))
        entry.add(i.SetScore(index, indexparam))

        def pair_name(pair):
            return '%s_%d_%d' % (prefix, pair.min, pair.max)

        def branch(func, index, pair):
            return i.RangeBr(index, pair.min, pair.max,
                             func.get_or_create_block(pair_name(pair)), None)

        def callback(pair):
            block = func.get_or_create_block(pair_name(pair))
            block.defined = True
            if pair.left:
                block.add(branch(func, index, pair.left))
            if pair.right:
                block.add(branch(func, index, pair.right))
            if pair.min == pair.max:
                gen_callback(block, index, pair.min, *cb_args)

        root = generate_bin_tree(size, callback)
        entry.add(i.Call(func.get_or_create_block(pair_name(root))))
        entry.add(i.Return())
        func.end()
    def as_entity(self, ptr):
        block = self.compiler.create_block('as_entity')
        block.set_is_function()
        sender = self.compiler.insn_def(i.CreateSelector(
            i.SelectorType.SENDER))

        if ptr != self._current_sender:
            exec = self.compiler.insn_def(i.CreateExec())
            sel = self.compiler.insn_def(
                i.CreateSelector(i.SelectorType.ALL_ENTITIES))
            test_uid = self.compiler.insn_def(
                i.CreateEntityLocalAccess(self.uid_obj, sender))
            self.compiler.add_insn(i.ExecAsEntity(exec, sel))
            self.compiler.add_insn(i.ExecIfCmp(exec, test_uid, 'eq', ptr))
            self.compiler.add_insn(i.ExecRun(exec, block))
        else:
            self.compiler.add_insn(i.Call(block))

        return block, sender  # sender for convenience