// File: Nallantli[P]Rossa/main/rossa/symbol/symbol.cpp
// Function: symbol_t::equals(symbol_t const*, token_t const*, std::vector<std::pair<token_t, function_t>, std::allocator<std::pair<token_t, function_t>>>&) const
const bool symbol_t::equals(const symbol_t *b, const token_t *token, trace_t &stack_trace) const
{
	if (d->type != b->d->type && d->type != value_type_enum::OBJECT)
	{
		return false;
	}
	switch (d->type)
	{
	case value_type_enum::NIL:
		return true;
	case value_type_enum::NUMBER:
		return std::get<number_t>(d->value) == std::get<number_t>(b->d->value);
	case value_type_enum::BOOLEAN_D:
		return std::get<bool>(d->value) == std::get<bool>(b->d->value);
	case value_type_enum::STRING:
		return std::get<std::string>(d->value) == std::get<std::string>(b->d->value);
	case value_type_enum::OBJECT:
	{
		auto o = std::get<object_t>(d->value);
		if (o.hasValue(parser_t::HASH_EQUALS))
		{
			return o.getVariable(parser_t::HASH_EQUALS, token, stack_trace).call({*b}, token, stack_trace).getBool(token, stack_trace);
		}
		return o == std::get<object_t>(b->d->value);
	}
	case value_type_enum::ARRAY:
	{
		auto bv = std::get<std::vector<symbol_t>>(b->d->value);
		if (std::get<std::vector<symbol_t>>(d->value).size() != bv.size())
		{
			return false;
		}
		for (unsigned long i = 0; i < std::get<std::vector<symbol_t>>(d->value).size(); i++)
		{
			if (!std::get<std::vector<symbol_t>>(d->value)[i].equals(&bv[i], token, stack_trace))
			{
				return false;
			}
		}
		return true;
	}
	case value_type_enum::DICTIONARY:
		for (auto &e : std::get<std::map<const std::string, const symbol_t>>(d->value))
		{
			if (!e.second.equals(&std::get<std::map<const std::string, const symbol_t>>(b->d->value)[e.first], token, stack_trace))
			{
				return false;
			}
		}
		return true;
	case value_type_enum::FUNCTION:
		return std::get<wrapper_t>(d->value).map == std::get<wrapper_t>(b->d->value).map && std::get<wrapper_t>(d->value).varg == std::get<wrapper_t>(b->d->value).varg;
	case value_type_enum::TYPE_NAME:
		return std::get<parameter_t>(d->value) == std::get<parameter_t>(b->d->value);
	default:
		return false;
	}
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x1e0, %rsp            # imm = 0x1E0
movq %rdi, -0x10(%rbp)
movq %rsi, -0x18(%rbp)
movq %rdx, -0x20(%rbp)
movq %rcx, -0x28(%rbp)
movq -0x10(%rbp), %rax
movq %rax, -0xe8(%rbp)
movq (%rax), %rax
movl (%rax), %eax
movq -0x18(%rbp), %rcx
movq (%rcx), %rcx
cmpl (%rcx), %eax
je 0x8ad2e
movq -0xe8(%rbp), %rax
movq (%rax), %rax
cmpl $-0x8, (%rax)
je 0x8ad2e
movb $0x0, -0x1(%rbp)
jmp 0x8b491
movq -0xe8(%rbp), %rax
movq (%rax), %rax
movl (%rax), %eax
addl $0x9, %eax
movl %eax, %ecx
movq %rcx, -0xf0(%rbp)
subl $0x8, %eax
ja 0x8b48d
movq -0xf0(%rbp), %rax
leaq 0xc723f(%rip), %rcx     # 0x151f9c
movslq (%rcx,%rax,4), %rax
addq %rcx, %rax
jmpq *%rax
movb $0x1, -0x1(%rbp)
jmp 0x8b491
movq -0xe8(%rbp), %rax
movq (%rax), %rdi
addq $0x8, %rdi
callq 0x8bc40
movq %rax, -0xf8(%rbp)
movq -0x18(%rbp), %rax
movq (%rax), %rdi
addq $0x8, %rdi
callq 0x8bc40
movq -0xf8(%rbp), %rdi
movq %rax, %rsi
callq 0x9d3b0
andb $0x1, %al
movb %al, -0x1(%rbp)
jmp 0x8b491
movq -0xe8(%rbp), %rax
movq (%rax), %rdi
addq $0x8, %rdi
callq 0x8bd50
movb (%rax), %al
andb $0x1, %al
movzbl %al, %eax
movl %eax, -0xfc(%rbp)
movq -0x18(%rbp), %rax
movq (%rax), %rdi
addq $0x8, %rdi
callq 0x8bd50
movq %rax, %rcx
movl -0xfc(%rbp), %eax
movb (%rcx), %cl
andb $0x1, %cl
movzbl %cl, %ecx
cmpl %ecx, %eax
sete %al
andb $0x1, %al
movb %al, -0x1(%rbp)
jmp 0x8b491
movq -0xe8(%rbp), %rax
movq (%rax), %rdi
addq $0x8, %rdi
callq 0x8bd30
movq %rax, -0x108(%rbp)
movq -0x18(%rbp), %rax
movq (%rax), %rdi
addq $0x8, %rdi
callq 0x8bd30
movq -0x108(%rbp), %rdi
movq %rax, %rsi
callq 0x2dd40
andb $0x1, %al
movb %al, -0x1(%rbp)
jmp 0x8b491
movq -0xe8(%rbp), %rax
movq (%rax), %rdi
addq $0x8, %rdi
callq 0x8bd70
movq %rax, %rsi
leaq -0x38(%rbp), %rdi
movq %rdi, -0x118(%rbp)
callq 0x7d750
movq -0x118(%rbp), %rdi
leaq 0x15ace7(%rip), %rsi    # 0x1e5b60
callq 0x7dd00
movb %al, -0x109(%rbp)
jmp 0x8ae86
movb -0x109(%rbp), %al
testb $0x1, %al
jne 0x8ae95
jmp 0x8b0c7
movq -0x20(%rbp), %rdx
movq -0x28(%rbp), %rcx
leaq 0x15acbc(%rip), %rsi    # 0x1e5b60
leaq -0x38(%rbp), %rdi
callq 0x7ddd0
movq %rax, -0x120(%rbp)
jmp 0x8aeb6
leaq -0x90(%rbp), %rdi
movq %rdi, -0x98(%rbp)
movq -0x18(%rbp), %rsi
callq 0x86d80
jmp 0x8aecf
leaq -0x90(%rbp), %rax
movq %rax, -0x80(%rbp)
movq $0x1, -0x78(%rbp)
leaq -0x99(%rbp), %rdi
movq %rdi, -0x128(%rbp)
callq 0x2e2f0
movq -0x128(%rbp), %rcx
movq -0x80(%rbp), %rsi
movq -0x78(%rbp), %rdx
leaq -0x70(%rbp), %rdi
callq 0x8c330
jmp 0x8af0f
movq -0x120(%rbp), %rsi
movq -0x20(%rbp), %rcx
movq -0x28(%rbp), %r8
leaq -0x58(%rbp), %rdi
leaq -0x70(%rbp), %rdx
callq 0x89e20
jmp 0x8af2d
movq -0x20(%rbp), %rsi
movq -0x28(%rbp), %rdx
leaq -0x58(%rbp), %rdi
callq 0x881f0
movb %al, -0x129(%rbp)
jmp 0x8af46
movb -0x129(%rbp), %al
andb $0x1, %al
movb %al, -0x1(%rbp)
leaq -0x58(%rbp), %rdi
callq 0x86dc0
leaq -0x70(%rbp), %rdi
callq 0x2cf10
leaq -0x99(%rbp), %rdi
callq 0x304d0
leaq -0x90(%rbp), %rax
movq %rax, -0x140(%rbp)
addq $0x10, %rax
movq %rax, -0x138(%rbp)
movq -0x138(%rbp), %rdi
addq $-0x10, %rdi
movq %rdi, -0x148(%rbp)
callq 0x86dc0
movq -0x140(%rbp), %rcx
movq -0x148(%rbp), %rax
cmpq %rcx, %rax
movq %rax, -0x138(%rbp)
jne 0x8af88
movl $0x1, -0xa0(%rbp)
jmp 0x8b10d
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x40(%rbp)
movl %eax, -0x44(%rbp)
jmp 0x8b11b
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x40(%rbp)
movl %eax, -0x44(%rbp)
movq -0x98(%rbp), %rax
leaq -0x90(%rbp), %rcx
cmpq %rax, %rcx
movq %rax, -0x150(%rbp)
je 0x8b030
movq -0x150(%rbp), %rdi
addq $-0x10, %rdi
movq %rdi, -0x158(%rbp)
callq 0x86dc0
movq -0x158(%rbp), %rax
leaq -0x90(%rbp), %rcx
cmpq %rcx, %rax
movq %rax, -0x150(%rbp)
jne 0x8afff
jmp 0x8b11b
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x40(%rbp)
movl %eax, -0x44(%rbp)
jmp 0x8b06f
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x40(%rbp)
movl %eax, -0x44(%rbp)
jmp 0x8b066
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x40(%rbp)
movl %eax, -0x44(%rbp)
leaq -0x58(%rbp), %rdi
callq 0x86dc0
leaq -0x70(%rbp), %rdi
callq 0x2cf10
leaq -0x99(%rbp), %rdi
callq 0x304d0
leaq -0x90(%rbp), %rax
movq %rax, -0x168(%rbp)
addq $0x10, %rax
movq %rax, -0x160(%rbp)
movq -0x160(%rbp), %rdi
addq $-0x10, %rdi
movq %rdi, -0x170(%rbp)
callq 0x86dc0
movq -0x168(%rbp), %rcx
movq -0x170(%rbp), %rax
cmpq %rcx, %rax
movq %rax, -0x160(%rbp)
jne 0x8b094
jmp 0x8b11b
movq -0x18(%rbp), %rax
movq (%rax), %rdi
addq $0x8, %rdi
callq 0x8bd70
movq %rax, -0x178(%rbp)
jmp 0x8b0e0
movq -0x178(%rbp), %rsi
leaq -0x38(%rbp), %rdi
callq 0x7dd60
movb %al, -0x179(%rbp)
jmp 0x8b0f8
movb -0x179(%rbp), %al
andb $0x1, %al
movb %al, -0x1(%rbp)
movl $0x1, -0xa0(%rbp)
leaq -0x38(%rbp), %rdi
callq 0x7d790
jmp 0x8b491
leaq -0x38(%rbp), %rdi
callq 0x7d790
jmp 0x8b49f
movq -0x18(%rbp), %rax
movq (%rax), %rdi
addq $0x8, %rdi
callq 0x8bcd0
movq %rax, %rsi
leaq -0xb8(%rbp), %rdi
callq 0x8c650
movq -0xe8(%rbp), %rax
movq (%rax), %rdi
addq $0x8, %rdi
callq 0x8bcd0
movq %rax, -0x188(%rbp)
jmp 0x8b164
movq -0x188(%rbp), %rdi
callq 0x30a90
movq %rax, -0x190(%rbp)
leaq -0xb8(%rbp), %rdi
callq 0x30a90
movq %rax, %rcx
movq -0x190(%rbp), %rax
cmpq %rcx, %rax
je 0x8b1c2
movb $0x0, -0x1(%rbp)
movl $0x1, -0xa0(%rbp)
jmp 0x8b2c1
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x40(%rbp)
movl %eax, -0x44(%rbp)
leaq -0xb8(%rbp), %rdi
callq 0x2cf10
jmp 0x8b49f
movq $0x0, -0xc0(%rbp)
movq -0xe8(%rbp), %rax
movq -0xc0(%rbp), %rcx
movq %rcx, -0x1a0(%rbp)
movq (%rax), %rdi
addq $0x8, %rdi
callq 0x8bcd0
movq %rax, -0x198(%rbp)
jmp 0x8b1f7
movq -0x198(%rbp), %rdi
callq 0x30a90
movq %rax, %rcx
movq -0x1a0(%rbp), %rax
cmpq %rcx, %rax
jae 0x8b2b3
movq -0xe8(%rbp), %rax
movq (%rax), %rdi
addq $0x8, %rdi
callq 0x8bcd0
movq %rax, -0x1a8(%rbp)
jmp 0x8b232
movq -0x1a8(%rbp), %rdi
movq -0xc0(%rbp), %rsi
callq 0x8c3d0
movq %rax, -0x1b8(%rbp)
movq -0xc0(%rbp), %rsi
leaq -0xb8(%rbp), %rdi
callq 0x8c3d0
movq -0x1b8(%rbp), %rdi
movq %rax, %rsi
movq -0x20(%rbp), %rdx
movq -0x28(%rbp), %rcx
callq 0x8ace0
movb %al, -0x1a9(%rbp)
jmp 0x8b27e
movb -0x1a9(%rbp), %al
testb $0x1, %al
jne 0x8b29a
jmp 0x8b28a
movb $0x0, -0x1(%rbp)
movl $0x1, -0xa0(%rbp)
jmp 0x8b2c1
jmp 0x8b29c
movq -0xc0(%rbp), %rax
addq $0x1, %rax
movq %rax, -0xc0(%rbp)
jmp 0x8b1cd
movb $0x1, -0x1(%rbp)
movl $0x1, -0xa0(%rbp)
leaq -0xb8(%rbp), %rdi
callq 0x2cf10
jmp 0x8b491
movq -0xe8(%rbp), %rax
movq (%rax), %rdi
addq $0x8, %rdi
callq 0x8bcb0
movq %rax, -0xc8(%rbp)
movq -0xc8(%rbp), %rdi
callq 0x8c0f0
movq %rax, -0xd0(%rbp)
movq -0xc8(%rbp), %rdi
callq 0x8bff0
movq %rax, -0xd8(%rbp)
leaq -0xd0(%rbp), %rdi
leaq -0xd8(%rbp), %rsi
callq 0x8bf90
testb $0x1, %al
jne 0x8b32b
jmp 0x8b3a6
leaq -0xd0(%rbp), %rdi
callq 0x8c120
movq %rax, -0xe0(%rbp)
movq -0xe0(%rbp), %rax
addq $0x20, %rax
movq %rax, -0x1c0(%rbp)
movq -0x18(%rbp), %rax
movq (%rax), %rdi
addq $0x8, %rdi
callq 0x8bcb0
movq %rax, %rdi
movq -0xe0(%rbp), %rsi
callq 0x8beb0
movq -0x1c0(%rbp), %rdi
movq %rax, %rsi
movq -0x20(%rbp), %rdx
movq -0x28(%rbp), %rcx
callq 0x8ace0
testb $0x1, %al
jne 0x8b393
movb $0x0, -0x1(%rbp)
jmp 0x8b491
jmp 0x8b395
leaq -0xd0(%rbp), %rdi
callq 0x8c140
jmp 0x8b312
movb $0x1, -0x1(%rbp)
jmp 0x8b491
movq -0xe8(%rbp), %rax
movq (%rax), %rdi
addq $0x8, %rdi
callq 0x8bdb0
movq %rax, -0x1d0(%rbp)
movq -0x18(%rbp), %rax
movq (%rax), %rdi
addq $0x8, %rdi
callq 0x8bdb0
movq -0x1d0(%rbp), %rdi
movq %rax, %rsi
callq 0x8c740
movb %al, %cl
xorl %eax, %eax
testb $0x1, %cl
movb %al, -0x1c1(%rbp)
jne 0x8b3f9
jmp 0x8b440
movq -0xe8(%rbp), %rax
movq (%rax), %rdi
addq $0x8, %rdi
callq 0x8bdb0
addq $0x30, %rax
movq %rax, -0x1d8(%rbp)
movq -0x18(%rbp), %rax
movq (%rax), %rdi
addq $0x8, %rdi
callq 0x8bdb0
movq -0x1d8(%rbp), %rdi
movq %rax, %rsi
addq $0x30, %rsi
callq 0x8c770
movb %al, -0x1c1(%rbp)
movb -0x1c1(%rbp), %al
andb $0x1, %al
movb %al, -0x1(%rbp)
jmp 0x8b491
movq -0xe8(%rbp), %rax
movq (%rax), %rdi
addq $0x8, %rdi
callq 0x8bd90
movq %rax, -0x1e0(%rbp)
movq -0x18(%rbp), %rax
movq (%rax), %rdi
addq $0x8, %rdi
callq 0x8bd90
movq -0x1e0(%rbp), %rdi
movq %rax, %rsi
callq 0x80c90
andb $0x1, %al
movb %al, -0x1(%rbp)
jmp 0x8b491
movb $0x0, -0x1(%rbp)
movb -0x1(%rbp), %al
andb $0x1, %al
addq $0x1e0, %rsp            # imm = 0x1E0
popq %rbp
retq
movq -0x40(%rbp), %rdi
callq 0x119c0
nopl (%rax,%rax)