docs: def link_methods(self):
          """
          Perform linkage of addresses between methods.
          """
  
          from ..compiler import Compiler
  
          for method in self.methods:
              method.prepare()
  
          self.all_vm_tokens = OrderedDict()
  
          address = 0
  
          for method in self.orderered_methods:
  
              if not method.is_interop:
                  #                print("ADDING METHOD %s " % method.full_name)
                  method.address = address
  
                  for key, vmtoken in method.vm_tokens.items():
                      self.all_vm_tokens[address] = vmtoken
                      address += 1
  
                      if vmtoken.data is not None and vmtoken.vm_op != VMOp.NOP:
                          address += len(vmtoken.data)
  
                      vmtoken.addr = vmtoken.addr + method.address
  
          for key, vmtoken in self.all_vm_tokens.items():
              if vmtoken.src_method is not None:
  
                  target_method = self.method_by_name(vmtoken.target_method)
                  if target_method:
                      jump_len = target_method.address - vmtoken.addr
  
                      param_ret_counts = bytearray()
                      if Compiler.instance().nep8:
                          param_ret_counts = vmtoken.data[0:2]
                          jump_len -= 2
  
                      if jump_len > -32767 and jump_len < 32767:
                          vmtoken.data = param_ret_counts + jump_len.to_bytes(2, 'little', signed=True)
                      else:
                          vmtoken.data = param_ret_counts + jump_len.to_bytes(4, 'little', signed=True)
                  else:
                      raise Exception("Target method %s not found" % vmtoken.target_method)