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)
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