Exemplo n.º 1
0
 def on_call(self, base, bases):
     if base is not None:
         instructions.starg(regint(base))
     block = self.basic_block
     if block not in get_tape().function_basicblocks:
         raise CompilerError('unknown function')
     old_block = get_tape().active_basicblock
     old_block.set_exit(instructions.CALL(0, add_to_prog=False), block)
     p_return_address = get_tape().function_basicblocks[block]
     return_address = get_tape().new_reg('r')
     get_tape().start_new_basicblock(name='call-' + self.name)
     get_tape().active_basicblock.set_return(old_block, self.last_sub_block)
     get_tape().req_node.children.append(self.node)
     if self.result is not None:
         return unmemorize(self.result)
Exemplo n.º 2
0
 def on_call(self, base, bases):
     if base is not None:
         instructions.starg(regint(base))
     block = self.basic_block
     if block not in get_tape().function_basicblocks:
         raise CompilerError('unknown function')
     old_block = get_tape().active_basicblock
     old_block.set_exit(instructions.jmp(0, add_to_prog=False), block)
     p_return_address = get_tape().function_basicblocks[block]
     return_address = get_tape().new_reg('ci')
     old_block.return_address_store = instructions.ldint(return_address, 0)
     instructions.stmint(return_address, p_return_address)
     get_tape().start_new_basicblock(name='call-' + self.name)
     get_tape().active_basicblock.set_return(old_block, self.last_sub_block)
     get_tape().req_node.children.append(self.node)
     if self.result is not None:
         return unmemorize(self.result)