// File: Nallantli[P]Rossa/main/rossa/signature/signature.cpp
// Function: signature_t::validity(std::vector<symbol_t, std::allocator<symbol_t>> const&, std::vector<std::pair<token_t, function_t>, std::allocator<std::pair<token_t, function_t>>>&) const
const size_t signature_t::validity(const std::vector<symbol_t> &check, trace_t &stack_trace) const
{
	if (values.size() == 0)
	{
		return 1;
	}

	size_t v = 0;
	for (size_t i = 0; i < values.size(); i++)
	{
		auto check_i = check[i];
		auto values_i = values[i];
		auto vt = check_i.getAugValueType();
		if (values_i.getQualifiers().empty())
		{
			auto base = values_i.getBase();
			if (base == vt.getBase())
			{
				v += 3;
			}
			else if (base[0] > 0 && vt.getBase()[0] == value_type_enum::NIL)
			{
				v += 2;
			}
			else if (base[0] == value_type_enum::ANY)
			{
				v += 1;
			}
			else if (check[0].getValueType() == value_type_enum::OBJECT)
			{
				if (base[0] == value_type_enum::OBJECT || check_i.getObject(NULL, stack_trace)->extendsObject(base))
				{
					v += 2;
				}
				else
				{
					return 0;
				}
			}
			else
			{
				return 0;
			}
		}
		else
		{
			auto ql = values_i.getQualifiers();
			auto fo = check_i.getFunctionOverloads(NULL, stack_trace);
			const auto it = fo.find(ql.size());
			if (it == fo.end())
			{
				if (check_i.hasVarg(NULL, stack_trace))
				{
					v += 1;
				}
				else
				{
					return 0;
				}
			}
			else
			{
				size_t flag = 0;
				for (auto f : it->second)
				{
					for (size_t i = 0; i < ql.size(); i++)
					{
						auto val = ql[i] & f.first.values[i];
						if (val > flag)
						{
							flag = val;
							if (val == 3)
							{
								break;
							}
						}
					}
					if (flag == 3)
					{
						break;
					}
				}
				if (flag > 0)
				{
					v += flag;
				}
				else
				{
					if (check_i.hasVarg(NULL, stack_trace))
					{
						v += 1;
					}
					else
					{
						return 0;
					}
				}
			}
		}
	}
	return v;
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x260, %rsp            # imm = 0x260
movq %rdi, -0x10(%rbp)
movq %rsi, -0x18(%rbp)
movq %rdx, -0x20(%rbp)
movq -0x10(%rbp), %rdi
movq %rdi, -0x208(%rbp)
callq 0x5b6a0
cmpq $0x0, %rax
jne 0x8392a
movq $0x1, -0x8(%rbp)
jmp 0x840b5
movq $0x0, -0x28(%rbp)
movq $0x0, -0x30(%rbp)
movq -0x208(%rbp), %rdi
movq -0x30(%rbp), %rax
movq %rax, -0x210(%rbp)
callq 0x5b6a0
movq %rax, %rcx
movq -0x210(%rbp), %rax
cmpq %rcx, %rax
jae 0x840ad
movq -0x18(%rbp), %rdi
movq -0x30(%rbp), %rsi
callq 0x24e40
movq %rax, %rsi
leaq -0x40(%rbp), %rdi
callq 0x86d80
movq -0x208(%rbp), %rdi
movq -0x30(%rbp), %rsi
callq 0x80e70
movq %rax, %rsi
leaq -0x88(%rbp), %rdi
callq 0x5bca0
jmp 0x8399e
leaq -0xe0(%rbp), %rdi
leaq -0x40(%rbp), %rsi
callq 0x88400
jmp 0x839b0
leaq -0xf8(%rbp), %rdi
leaq -0x88(%rbp), %rsi
callq 0x80810
jmp 0x839c5
leaq -0xf8(%rbp), %rdi
callq 0x80cf0
movb %al, -0x211(%rbp)
leaq -0xf8(%rbp), %rdi
callq 0x581b0
movb -0x211(%rbp), %al
testb $0x1, %al
jne 0x839f2
jmp 0x83ca3
leaq -0x110(%rbp), %rdi
leaq -0x88(%rbp), %rsi
callq 0x80840
jmp 0x83a07
leaq -0x128(%rbp), %rdi
leaq -0xe0(%rbp), %rsi
callq 0x80840
jmp 0x83a1c
leaq -0x110(%rbp), %rdi
leaq -0x128(%rbp), %rsi
callq 0x7ffa0
movb %al, -0x212(%rbp)
jmp 0x83a37
leaq -0x128(%rbp), %rdi
callq 0x57de0
movb -0x212(%rbp), %al
testb $0x1, %al
jne 0x83a52
jmp 0x83ae2
movq -0x28(%rbp), %rax
addq $0x3, %rax
movq %rax, -0x28(%rbp)
jmp 0x83c67
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x90(%rbp)
movl %eax, -0x94(%rbp)
jmp 0x840a2
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x90(%rbp)
movl %eax, -0x94(%rbp)
jmp 0x84096
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x90(%rbp)
movl %eax, -0x94(%rbp)
jmp 0x8408a
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x90(%rbp)
movl %eax, -0x94(%rbp)
jmp 0x83c92
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x90(%rbp)
movl %eax, -0x94(%rbp)
leaq -0x128(%rbp), %rdi
callq 0x57de0
jmp 0x83c92
leaq -0x110(%rbp), %rdi
xorl %eax, %eax
movl %eax, %esi
callq 0x84460
movq (%rax), %rcx
movb $0x0, -0x141(%rbp)
xorl %eax, %eax
cmpq $0x0, %rcx
movb %al, -0x213(%rbp)
jle 0x83b43
leaq -0x140(%rbp), %rdi
leaq -0xe0(%rbp), %rsi
callq 0x80840
jmp 0x83b1f
movb $0x1, -0x141(%rbp)
leaq -0x140(%rbp), %rdi
xorl %eax, %eax
movl %eax, %esi
callq 0x80eb0
cmpq $-0x1, (%rax)
sete %al
movb %al, -0x213(%rbp)
movb -0x213(%rbp), %al
movb %al, -0x214(%rbp)
testb $0x1, -0x141(%rbp)
jne 0x83b5a
jmp 0x83b66
leaq -0x140(%rbp), %rdi
callq 0x57de0
movb -0x214(%rbp), %al
testb $0x1, %al
jne 0x83b72
jmp 0x83b83
movq -0x28(%rbp), %rax
addq $0x2, %rax
movq %rax, -0x28(%rbp)
jmp 0x83c65
leaq -0x110(%rbp), %rdi
xorl %eax, %eax
movl %eax, %esi
callq 0x84460
cmpq $-0xb, (%rax)
jne 0x83baa
movq -0x28(%rbp), %rax
addq $0x1, %rax
movq %rax, -0x28(%rbp)
jmp 0x83c63
movq -0x18(%rbp), %rdi
xorl %eax, %eax
movl %eax, %esi
callq 0x24e40
movq %rax, %rdi
callq 0x883e0
movl %eax, -0x218(%rbp)
jmp 0x83bc7
movl -0x218(%rbp), %eax
cmpl $-0x8, %eax
jne 0x83c4d
leaq -0x110(%rbp), %rdi
xorl %eax, %eax
movl %eax, %esi
callq 0x84460
cmpq $-0x8, (%rax)
je 0x83c29
movq -0x20(%rbp), %rdx
xorl %eax, %eax
movl %eax, %esi
leaq -0x40(%rbp), %rdi
callq 0x882f0
movq %rax, -0x220(%rbp)
jmp 0x83c02
movq -0x220(%rbp), %rdi
leaq -0x110(%rbp), %rsi
callq 0x7de80
movb %al, -0x221(%rbp)
jmp 0x83c1d
movb -0x221(%rbp), %al
testb $0x1, %al
jne 0x83c29
jmp 0x83c37
movq -0x28(%rbp), %rax
addq $0x2, %rax
movq %rax, -0x28(%rbp)
jmp 0x83c4b
movq $0x0, -0x8(%rbp)
movl $0x1, -0x148(%rbp)
jmp 0x83c71
jmp 0x83c61
movq $0x0, -0x8(%rbp)
movl $0x1, -0x148(%rbp)
jmp 0x83c71
jmp 0x83c63
jmp 0x83c65
jmp 0x83c67
movl $0x0, -0x148(%rbp)
leaq -0x110(%rbp), %rdi
callq 0x57de0
movl -0x148(%rbp), %eax
testl %eax, %eax
jne 0x84048
jmp 0x83c8d
jmp 0x8403e
leaq -0x110(%rbp), %rdi
callq 0x57de0
jmp 0x8408a
leaq -0x160(%rbp), %rdi
leaq -0x88(%rbp), %rsi
callq 0x80810
jmp 0x83cb8
movq -0x20(%rbp), %rdx
xorl %eax, %eax
movl %eax, %esi
leaq -0x40(%rbp), %rdi
callq 0x88660
movq %rax, -0x230(%rbp)
jmp 0x83cd2
movq -0x230(%rbp), %rsi
leaq -0x190(%rbp), %rdi
callq 0x84480
jmp 0x83ce7
leaq -0x160(%rbp), %rdi
callq 0x5b6a0
movq %rax, -0x1a0(%rbp)
leaq -0x190(%rbp), %rdi
leaq -0x1a0(%rbp), %rsi
callq 0x844b0
movq %rax, -0x238(%rbp)
jmp 0x83d16
movq -0x238(%rbp), %rax
movq %rax, -0x198(%rbp)
leaq -0x190(%rbp), %rdi
callq 0x84510
movq %rax, -0x1a8(%rbp)
leaq -0x198(%rbp), %rdi
leaq -0x1a8(%rbp), %rsi
callq 0x844e0
testb $0x1, %al
jne 0x83d50
jmp 0x83dcd
movq -0x20(%rbp), %rdx
xorl %eax, %eax
movl %eax, %esi
leaq -0x40(%rbp), %rdi
callq 0x887b0
movb %al, -0x239(%rbp)
jmp 0x83d69
movb -0x239(%rbp), %al
testb $0x1, %al
jne 0x83d75
jmp 0x83db1
movq -0x28(%rbp), %rax
addq $0x1, %rax
movq %rax, -0x28(%rbp)
jmp 0x83dc8
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x90(%rbp)
movl %eax, -0x94(%rbp)
jmp 0x84030
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x90(%rbp)
movl %eax, -0x94(%rbp)
jmp 0x84024
movq $0x0, -0x8(%rbp)
movl $0x1, -0x148(%rbp)
jmp 0x83ffe
jmp 0x83ff4
movq $0x0, -0x1b0(%rbp)
leaq -0x198(%rbp), %rdi
callq 0x84540
addq $0x8, %rax
movq %rax, -0x1b8(%rbp)
movq -0x1b8(%rbp), %rdi
callq 0x84560
movq %rax, -0x1c0(%rbp)
movq -0x1b8(%rbp), %rdi
callq 0x84590
movq %rax, -0x1c8(%rbp)
leaq -0x1c0(%rbp), %rdi
leaq -0x1c8(%rbp), %rsi
callq 0x845c0
testb $0x1, %al
jne 0x83e31
jmp 0x83f8e
leaq -0x1c0(%rbp), %rdi
callq 0x845f0
movq %rax, %rsi
leaq -0x1f0(%rbp), %rdi
callq 0x84610
jmp 0x83e4e
movq $0x0, -0x1f8(%rbp)
movq -0x1f8(%rbp), %rax
movq %rax, -0x248(%rbp)
leaq -0x160(%rbp), %rdi
callq 0x5b6a0
movq %rax, %rcx
movq -0x248(%rbp), %rax
cmpq %rcx, %rax
jae 0x83f41
movq -0x1f8(%rbp), %rsi
leaq -0x160(%rbp), %rdi
callq 0x84650
movq %rax, -0x258(%rbp)
movq -0x1f8(%rbp), %rsi
leaq -0x1f0(%rbp), %rdi
callq 0x80e70
movq -0x258(%rbp), %rdi
movq %rax, %rsi
callq 0x80a60
movq %rax, -0x250(%rbp)
jmp 0x83ecb
movq -0x250(%rbp), %rax
movq %rax, -0x200(%rbp)
movq -0x200(%rbp), %rax
cmpq -0x1b0(%rbp), %rax
jbe 0x83f28
movq -0x200(%rbp), %rax
movq %rax, -0x1b0(%rbp)
cmpq $0x3, -0x200(%rbp)
jne 0x83f26
jmp 0x83f41
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x90(%rbp)
movl %eax, -0x94(%rbp)
leaq -0x1f0(%rbp), %rdi
callq 0x84670
jmp 0x84024
jmp 0x83f28
jmp 0x83f2a
movq -0x1f8(%rbp), %rax
addq $0x1, %rax
movq %rax, -0x1f8(%rbp)
jmp 0x83e59
cmpq $0x3, -0x1b0(%rbp)
jne 0x83f57
movl $0x5, -0x148(%rbp)
jmp 0x83f61
movl $0x0, -0x148(%rbp)
leaq -0x1f0(%rbp), %rdi
callq 0x84670
movl -0x148(%rbp), %eax
testl %eax, %eax
je 0x83f7b
jmp 0x83f79
jmp 0x83f8e
jmp 0x83f7d
leaq -0x1c0(%rbp), %rdi
callq 0x846a0
jmp 0x83e15
cmpq $0x0, -0x1b0(%rbp)
jbe 0x83fa9
movq -0x1b0(%rbp), %rax
addq -0x28(%rbp), %rax
movq %rax, -0x28(%rbp)
jmp 0x83ff2
movq -0x20(%rbp), %rdx
xorl %eax, %eax
movl %eax, %esi
leaq -0x40(%rbp), %rdi
callq 0x887b0
movb %al, -0x259(%rbp)
jmp 0x83fc2
movb -0x259(%rbp), %al
testb $0x1, %al
jne 0x83fce
jmp 0x83fdc
movq -0x28(%rbp), %rax
addq $0x1, %rax
movq %rax, -0x28(%rbp)
jmp 0x83ff0
movq $0x0, -0x8(%rbp)
movl $0x1, -0x148(%rbp)
jmp 0x83ffe
jmp 0x83ff2
jmp 0x83ff4
movl $0x0, -0x148(%rbp)
leaq -0x190(%rbp), %rdi
callq 0x846d0
leaq -0x160(%rbp), %rdi
callq 0x581b0
movl -0x148(%rbp), %eax
testl %eax, %eax
jne 0x84048
jmp 0x84022
jmp 0x8403e
leaq -0x190(%rbp), %rdi
callq 0x846d0
leaq -0x160(%rbp), %rdi
callq 0x581b0
jmp 0x8408a
movl $0x0, -0x148(%rbp)
leaq -0xe0(%rbp), %rdi
callq 0x57da0
leaq -0x88(%rbp), %rdi
callq 0x57da0
leaq -0x40(%rbp), %rdi
callq 0x86dc0
movl -0x148(%rbp), %eax
testl %eax, %eax
je 0x84077
jmp 0x84075
jmp 0x840b5
jmp 0x84079
movq -0x30(%rbp), %rax
addq $0x1, %rax
movq %rax, -0x30(%rbp)
jmp 0x8393a
leaq -0xe0(%rbp), %rdi
callq 0x57da0
leaq -0x88(%rbp), %rdi
callq 0x57da0
leaq -0x40(%rbp), %rdi
callq 0x86dc0
jmp 0x840c2
movq -0x28(%rbp), %rax
movq %rax, -0x8(%rbp)
movq -0x8(%rbp), %rax
addq $0x260, %rsp            # imm = 0x260
popq %rbp
retq
movq -0x90(%rbp), %rdi
callq 0x119c0
nop