// File: acliusBackHome[P]kamaya/dist/ParseType.cpp
// Function: ParseType::get_struct(std::vector<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>>, unsigned long>, std::allocator<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>>, unsigned long>>> const&, std::vector<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>>, unsigned long>, std::allocator<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>>, unsigned long>>> const&)
ParseType ParseType::get_struct(const vector<pair<string, size_t> > &otherTypes,
                                const vector<pair<string, size_t> > &self_ptr) {
    if(id2type.empty()) {
        init();
    }
    size_t new_type_id = id2type.size();
    // 给新类型预分配位置
    // 这有个"特性": 如果重复调用此函数试图生成一模一样的结构体会被看成两个
    id2type.emplace_back(T_UNKNOWN);
    ParseType &res = id2type[new_type_id];
    res.base_type = T_UNKNOWN;
    res.type_id = (size_t) -1;
    res.lower_type = 0;
    res.fields = new map<string, size_t>();
    res.type_size = res.pointer_level = res.array_size = 0;
    auto &res_fields = *res.fields;
    for (const auto &field: otherTypes) {
        if (res_fields.find(field.first) == res_fields.end()) {
            (*res.fields)[field.first] = field.second;
            res.type_size += get_type(field.second).get_size();
        } else {
            return ParseType();
        }
    }
    for (const auto &self_ptr_field: self_ptr) {
        if (res_fields.find(self_ptr_field.first) == res_fields.end()) {
            ParseType ptr(T_UNKNOWN, new_type_id, nullptr, sizeof(void *), self_ptr_field.second, 0);
            res.type_size += ptr.type_size;
            (*res.fields)[self_ptr_field.first] = get_type_id(ptr);
        } else {
            return ParseType();
        }
    }
    type2id[res] = res.type_id = new_type_id;
    return res;
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x130, %rsp            # imm = 0x130
movq %rdi, -0xf0(%rbp)
movq %rdi, %rax
movq %rax, -0xe8(%rbp)
movq %rdi, -0x8(%rbp)
movq %rsi, -0x10(%rbp)
movq %rdx, -0x18(%rbp)
leaq 0x6ff89(%rip), %rdi     # 0xc7348
callq 0x59450
testb $0x1, %al
jne 0x573ca
jmp 0x573cf
callq 0x57750
leaq 0x6ff72(%rip), %rdi     # 0xc7348
callq 0x59490
movq %rax, -0x20(%rbp)
movl $0x0, -0x24(%rbp)
leaq 0x6ff5b(%rip), %rdi     # 0xc7348
leaq -0x24(%rbp), %rsi
callq 0x594c0
movq -0x20(%rbp), %rsi
leaq 0x6ff47(%rip), %rdi     # 0xc7348
callq 0x59530
movq %rax, -0x30(%rbp)
movq -0x30(%rbp), %rax
movl $0x0, (%rax)
movq -0x30(%rbp), %rax
movq $-0x1, 0x18(%rax)
movq -0x30(%rbp), %rax
movq $0x0, 0x8(%rax)
movl $0x30, %edi
callq 0x4310
movq %rax, %rdi
movq %rdi, -0xf8(%rbp)
xorl %esi, %esi
movl $0x30, %edx
callq 0x41e0
movq -0xf8(%rbp), %rdi
callq 0x33b50
movq -0xf8(%rbp), %rcx
movq -0x30(%rbp), %rax
movq %rcx, 0x10(%rax)
movq -0x30(%rbp), %rax
movq $0x0, 0x30(%rax)
movq -0x30(%rbp), %rax
movq $0x0, 0x28(%rax)
movq -0x30(%rbp), %rax
movq $0x0, 0x20(%rax)
movq -0x30(%rbp), %rax
movq 0x10(%rax), %rax
movq %rax, -0x38(%rbp)
movq -0x10(%rbp), %rax
movq %rax, -0x40(%rbp)
movq -0x40(%rbp), %rdi
callq 0x59550
movq %rax, -0x48(%rbp)
movq -0x40(%rbp), %rdi
callq 0x59580
movq %rax, -0x50(%rbp)
leaq -0x48(%rbp), %rdi
leaq -0x50(%rbp), %rsi
callq 0x595b0
testb $0x1, %al
jne 0x574cf
jmp 0x5757e
leaq -0x48(%rbp), %rdi
callq 0x595f0
movq %rax, -0x58(%rbp)
movq -0x38(%rbp), %rdi
movq -0x58(%rbp), %rsi
callq 0x34440
movq %rax, -0x60(%rbp)
movq -0x38(%rbp), %rdi
callq 0x344a0
movq %rax, -0x68(%rbp)
leaq -0x60(%rbp), %rdi
leaq -0x68(%rbp), %rsi
callq 0x34470
testb $0x1, %al
jne 0x5750d
jmp 0x5755d
movq -0x58(%rbp), %rax
movq 0x20(%rax), %rax
movq %rax, -0x100(%rbp)
movq -0x30(%rbp), %rax
movq 0x10(%rax), %rdi
movq -0x58(%rbp), %rsi
callq 0x34520
movq -0x100(%rbp), %rcx
movq %rcx, (%rax)
movq -0x58(%rbp), %rax
movq 0x20(%rax), %rdi
callq 0x56e60
movq %rax, %rdi
callq 0x57260
movq %rax, %rcx
movq -0x30(%rbp), %rax
addq 0x20(%rax), %rcx
movq %rcx, 0x20(%rax)
jmp 0x5756e
movq -0xf0(%rbp), %rdi
callq 0x572d0
jmp 0x57728
jmp 0x57570
leaq -0x48(%rbp), %rdi
callq 0x59610
jmp 0x574b9
movq -0x18(%rbp), %rax
movq %rax, -0x70(%rbp)
movq -0x70(%rbp), %rdi
callq 0x59550
movq %rax, -0x78(%rbp)
movq -0x70(%rbp), %rdi
callq 0x59580
movq %rax, -0x80(%rbp)
leaq -0x78(%rbp), %rdi
leaq -0x80(%rbp), %rsi
callq 0x595b0
testb $0x1, %al
jne 0x575b6
jmp 0x576eb
leaq -0x78(%rbp), %rdi
callq 0x595f0
movq %rax, -0x88(%rbp)
movq -0x38(%rbp), %rdi
movq -0x88(%rbp), %rsi
callq 0x34440
movq %rax, -0x90(%rbp)
movq -0x38(%rbp), %rdi
callq 0x344a0
movq %rax, -0x98(%rbp)
leaq -0x90(%rbp), %rdi
leaq -0x98(%rbp), %rsi
callq 0x34470
testb $0x1, %al
jne 0x57609
jmp 0x576cd
movq -0x20(%rbp), %rdx
movq -0x88(%rbp), %rax
movq 0x20(%rax), %r9
movq %rsp, %rax
movl $0x0, 0x8(%rax)
movq $0x0, (%rax)
xorl %esi, %esi
movl %esi, %ecx
leaq -0xd0(%rbp), %rdi
movq %rdi, -0x110(%rbp)
movl $0x8, %r8d
callq 0x58480
movq -0x110(%rbp), %rdi
movq -0xb0(%rbp), %rdx
movq -0x30(%rbp), %rax
movq 0x20(%rax), %rcx
addq %rdx, %rcx
movq %rcx, 0x20(%rax)
callq 0x56d20
movq %rax, -0x108(%rbp)
jmp 0x57671
movq -0x30(%rbp), %rax
movq 0x10(%rax), %rdi
movq -0x88(%rbp), %rsi
callq 0x34520
movq %rax, -0x118(%rbp)
jmp 0x5768e
movq -0x118(%rbp), %rax
movq -0x108(%rbp), %rcx
movq %rcx, (%rax)
leaq -0xd0(%rbp), %rdi
callq 0x57350
jmp 0x576db
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0xd8(%rbp)
movl %eax, -0xdc(%rbp)
leaq -0xd0(%rbp), %rdi
callq 0x57350
jmp 0x57738
movq -0xf0(%rbp), %rdi
callq 0x572d0
jmp 0x57728
jmp 0x576dd
leaq -0x78(%rbp), %rdi
callq 0x59610
jmp 0x575a0
movq -0x20(%rbp), %rcx
movq %rcx, -0x120(%rbp)
movq -0x30(%rbp), %rax
movq %rcx, 0x18(%rax)
movq -0x30(%rbp), %rsi
leaq 0x6fc0f(%rip), %rdi     # 0xc7318
callq 0x59630
movq -0x120(%rbp), %rcx
movq -0xf0(%rbp), %rdi
movq %rcx, (%rax)
movq -0x30(%rbp), %rsi
callq 0x55d70
movq -0xe8(%rbp), %rax
addq $0x130, %rsp            # imm = 0x130
popq %rbp
retq
movq -0xd8(%rbp), %rdi
callq 0x45e0
nopw %cs:(%rax,%rax)