def call_function(self, addr: int, args: Sequence[int], ret: int):
    'Call a function after properly setting up its arguments and return address.\n\n        Args:\n            addr : function address\n            args : a sequence of arguments to pass to the function; may be empty\n            ret  : return address; may be None\n        '
    regs = ('rcx', 'rdx', 'r8', 'r9')
    assert (len(args) <= len(regs)), f'currently supporting up to {len(regs)} arguments'
    for (reg, arg) in zip(regs, args):
        self.ql.reg.write(reg, arg)
    if (ret is not None):
        self.ql.stack_push(ret)
    self.ql.reg.rip = addr
Call a function after properly setting up its arguments and return address.

Args:
    addr : function address
    args : a sequence of arguments to pass to the function; may be empty
    ret  : return address; may be None
def call_function(self, addr: int, args: Sequence[int], ret: int):
    'Call a function after properly setting up its arguments and return address.\n\n        Args:\n            addr : function address\n            args : a sequence of arguments to pass to the function; may be empty\n            ret  : return address; may be None\n        '
    regs = ('rcx', 'rdx', 'r8', 'r9')
    assert (len(args) <= len(regs)), f'currently supporting up to {len(regs)} arguments'
    for (reg, arg) in zip(regs, args):
        self.ql.reg.write(reg, arg)
    if (ret is not None):
        self.ql.stack_push(ret)
    self.ql.reg.rip = addr