// File: acliusBackHome[P]kamaya/dist/ParseType.cpp
// Function: ParseType::dfs_convert(std::tuple<ExpressionType, unsigned long, unsigned long> const&)
size_t ParseType::dfs_convert(const OpAble &op_try) {
    const auto record = op_able.find(op_try);
    if (record != op_able.end()) {
        return record->second;
    }
    ExpressionType op_type = get<0>(op_try);
    size_t type1_id = get<1>(op_try), type2_id = get<2>(op_try);
    if (type1_id == type2_id) {
        // 完全一致
        op_able[op_try] = type1_id;
        return type1_id;
    }
    const ParseType &type1 = get_type(type1_id), &type2 = get_type(type2_id);
    if (type1.base_type != T_UNKNOWN && type2.base_type != T_UNKNOWN) {
        // 发现是基础类型的派生
        if (type1.base_type > type2.base_type) {
            op_able[op_try] = type1_id;
            return type1_id;
        }
        if (type1.base_type < type2.base_type) {
            op_able[op_try] = type2_id;
            return type2_id;
        }
        // base_type一致, 比较声明符号
        if (type1.specifier > type2.specifier) {
            op_able[op_try] = type1_id;
            return type1_id;
        }
        if (type1.specifier < type2.specifier) {
            op_able[op_try] = type2_id;
            return type2_id;
        }
        //完全一致
        op_able[op_try] = type1_id;
        return type1_id;
    }
    // 向下一层搜索
    op_trying.insert(op_try);
    // 拿到所有type1和type2能够无条件转化的类型
    vector<size_t> type1_to, type2_to;
    for (const auto &each : op_able) {
        // 遍历目前记录表能够拿到的所有记录
        // 这个可以用多层map进行优化, 但是...现在还没必要...
        const auto &op = each.first;
        if (get<0>(each.first) == E_UNDEFINED) {
            if (get<1>(each.first) == type1_id) {
                type1_to.emplace_back(each.second);
            } else if (get<1>(each.first) == type2_id) {
                type2_to.emplace_back(each.second);
            }
        }
    }
    for (size_t type1_convert_id : type1_to) {
        for (size_t type2_convert_id : type2_to) {
            OpAble op_try_next(op_type, type1_convert_id, type2_convert_id);
            if (op_trying.find(op_try_next) != op_trying.end()) {
                //这个已经有在之前搜索了, 跳过
                // 防止DFS环
                continue;
            }
            size_t try_res = dfs_convert(op_try_next);// op_try_next已经在下一层标记了
            if (try_res != (size_t) -1) {
                // 结果有效
                op_able[op_try] = try_res;
                return try_res;
            }
            // 无效继续搜索
        }
    }
    // 搜索完毕, type1和type2怎么转化都无法得到表达式op_type的返回值
    op_able[op_try] = (size_t) -1;
    return (size_t) -1;
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x1a0, %rsp            # imm = 0x1A0
movq %rdi, -0x10(%rbp)
movq -0x10(%rbp), %rsi
leaq 0x6e94e(%rip), %rdi     # 0xc73a8
callq 0x59bd0
movq %rax, -0x18(%rbp)
leaq 0x6e93e(%rip), %rdi     # 0xc73a8
callq 0x59c70
movq %rax, -0x20(%rbp)
leaq -0x18(%rbp), %rdi
leaq -0x20(%rbp), %rsi
callq 0x59c40
testb $0x1, %al
jne 0x58a86
jmp 0x58a9c
leaq -0x18(%rbp), %rdi
callq 0x59ca0
movq 0x18(%rax), %rax
movq %rax, -0x8(%rbp)
jmp 0x58ff8
movq -0x10(%rbp), %rdi
callq 0x59dc0
movl (%rax), %eax
movl %eax, -0x24(%rbp)
movq -0x10(%rbp), %rdi
callq 0x59de0
movq (%rax), %rax
movq %rax, -0x30(%rbp)
movq -0x10(%rbp), %rdi
callq 0x59e00
movq (%rax), %rax
movq %rax, -0x38(%rbp)
movq -0x30(%rbp), %rax
cmpq -0x38(%rbp), %rax
jne 0x58b06
movq -0x30(%rbp), %rax
movq %rax, -0x140(%rbp)
movq -0x10(%rbp), %rsi
leaq 0x6e8be(%rip), %rdi     # 0xc73a8
callq 0x59ce0
movq -0x140(%rbp), %rcx
movq %rcx, (%rax)
movq -0x30(%rbp), %rax
movq %rax, -0x8(%rbp)
jmp 0x58ff8
movq -0x30(%rbp), %rdi
callq 0x56e60
movq %rax, -0x40(%rbp)
movq -0x38(%rbp), %rdi
callq 0x56e60
movq %rax, -0x48(%rbp)
movq -0x40(%rbp), %rax
cmpl $0x0, (%rax)
je 0x58c70
movq -0x48(%rbp), %rax
cmpl $0x0, (%rax)
je 0x58c70
movq -0x40(%rbp), %rax
movl (%rax), %eax
movq -0x48(%rbp), %rcx
cmpl (%rcx), %eax
jle 0x58b7a
movq -0x30(%rbp), %rax
movq %rax, -0x148(%rbp)
movq -0x10(%rbp), %rsi
leaq 0x6e84a(%rip), %rdi     # 0xc73a8
callq 0x59ce0
movq -0x148(%rbp), %rcx
movq %rcx, (%rax)
movq -0x30(%rbp), %rax
movq %rax, -0x8(%rbp)
jmp 0x58ff8
movq -0x40(%rbp), %rax
movl (%rax), %eax
movq -0x48(%rbp), %rcx
cmpl (%rcx), %eax
jge 0x58bba
movq -0x38(%rbp), %rax
movq %rax, -0x150(%rbp)
movq -0x10(%rbp), %rsi
leaq 0x6e80a(%rip), %rdi     # 0xc73a8
callq 0x59ce0
movq -0x150(%rbp), %rcx
movq %rcx, (%rax)
movq -0x38(%rbp), %rax
movq %rax, -0x8(%rbp)
jmp 0x58ff8
movq -0x40(%rbp), %rax
movl 0x4(%rax), %eax
movq -0x48(%rbp), %rcx
cmpl 0x4(%rcx), %eax
jle 0x58bfc
movq -0x30(%rbp), %rax
movq %rax, -0x158(%rbp)
movq -0x10(%rbp), %rsi
leaq 0x6e7c8(%rip), %rdi     # 0xc73a8
callq 0x59ce0
movq -0x158(%rbp), %rcx
movq %rcx, (%rax)
movq -0x30(%rbp), %rax
movq %rax, -0x8(%rbp)
jmp 0x58ff8
movq -0x40(%rbp), %rax
movl 0x4(%rax), %eax
movq -0x48(%rbp), %rcx
cmpl 0x4(%rcx), %eax
jge 0x58c3e
movq -0x38(%rbp), %rax
movq %rax, -0x160(%rbp)
movq -0x10(%rbp), %rsi
leaq 0x6e786(%rip), %rdi     # 0xc73a8
callq 0x59ce0
movq -0x160(%rbp), %rcx
movq %rcx, (%rax)
movq -0x38(%rbp), %rax
movq %rax, -0x8(%rbp)
jmp 0x58ff8
movq -0x30(%rbp), %rax
movq %rax, -0x168(%rbp)
movq -0x10(%rbp), %rsi
leaq 0x6e754(%rip), %rdi     # 0xc73a8
callq 0x59ce0
movq -0x168(%rbp), %rcx
movq %rcx, (%rax)
movq -0x30(%rbp), %rax
movq %rax, -0x8(%rbp)
jmp 0x58ff8
movq -0x10(%rbp), %rsi
leaq 0x6e6fd(%rip), %rdi     # 0xc7378
callq 0x59e20
movq %rax, -0x58(%rbp)
movb %dl, -0x50(%rbp)
leaq -0x70(%rbp), %rdi
callq 0x16700
leaq -0x88(%rbp), %rdi
callq 0x16700
leaq 0x6e705(%rip), %rax     # 0xc73a8
movq %rax, -0x90(%rbp)
leaq 0x6e6f7(%rip), %rdi     # 0xc73a8
callq 0x59e70
movq %rax, -0x98(%rbp)
leaq 0x6e6e4(%rip), %rdi     # 0xc73a8
callq 0x59c70
movq %rax, -0xa0(%rbp)
leaq -0x98(%rbp), %rdi
leaq -0xa0(%rbp), %rsi
callq 0x59c40
testb $0x1, %al
jne 0x58cec
jmp 0x58dc2
leaq -0x98(%rbp), %rdi
callq 0x59ea0
movq %rax, -0xa8(%rbp)
movq -0xa8(%rbp), %rax
movq %rax, -0xb0(%rbp)
movq -0xa8(%rbp), %rdi
callq 0x59dc0
cmpl $0x0, (%rax)
jne 0x58daf
movq -0xa8(%rbp), %rdi
callq 0x59de0
movq (%rax), %rax
cmpq -0x30(%rbp), %rax
jne 0x58d7b
movq -0xa8(%rbp), %rsi
addq $0x18, %rsi
leaq -0x70(%rbp), %rdi
callq 0x59ec0
jmp 0x58d4d
jmp 0x58dad
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0xb8(%rbp)
movl %eax, -0xbc(%rbp)
leaq -0x88(%rbp), %rdi
callq 0x166a0
leaq -0x70(%rbp), %rdi
callq 0x166a0
jmp 0x59005
movq -0xa8(%rbp), %rdi
callq 0x59de0
movq (%rax), %rax
cmpq -0x38(%rbp), %rax
jne 0x58dab
movq -0xa8(%rbp), %rsi
addq $0x18, %rsi
leaq -0x88(%rbp), %rdi
callq 0x59ec0
jmp 0x58da9
jmp 0x58dab
jmp 0x58dad
jmp 0x58daf
jmp 0x58db1
leaq -0x98(%rbp), %rdi
callq 0x59f30
jmp 0x58cd0
leaq -0x70(%rbp), %rax
movq %rax, -0xc8(%rbp)
movq -0xc8(%rbp), %rdi
callq 0x34240
movq %rax, -0xd0(%rbp)
movq -0xc8(%rbp), %rdi
callq 0x34270
movq %rax, -0xd8(%rbp)
leaq -0xd0(%rbp), %rdi
leaq -0xd8(%rbp), %rsi
callq 0x342a0
testb $0x1, %al
jne 0x58e0f
jmp 0x58faa
leaq -0xd0(%rbp), %rdi
callq 0x342e0
movq (%rax), %rax
movq %rax, -0xe0(%rbp)
leaq -0x88(%rbp), %rax
movq %rax, -0xe8(%rbp)
movq -0xe8(%rbp), %rdi
callq 0x34240
movq %rax, -0xf0(%rbp)
movq -0xe8(%rbp), %rdi
callq 0x34270
movq %rax, -0xf8(%rbp)
leaq -0xf0(%rbp), %rdi
leaq -0xf8(%rbp), %rsi
callq 0x342a0
testb $0x1, %al
jne 0x58e75
jmp 0x58f97
leaq -0xf0(%rbp), %rdi
callq 0x342e0
movq (%rax), %rax
movq %rax, -0x100(%rbp)
leaq -0x118(%rbp), %rdi
movq %rdi, -0x178(%rbp)
leaq -0x24(%rbp), %rsi
leaq -0xe0(%rbp), %rdx
leaq -0x100(%rbp), %rcx
callq 0x59c00
movq -0x178(%rbp), %rsi
leaq 0x6e4ba(%rip), %rdi     # 0xc7378
callq 0x59f90
movq %rax, -0x170(%rbp)
jmp 0x58ecc
movq -0x170(%rbp), %rax
movq %rax, -0x120(%rbp)
leaq 0x6e497(%rip), %rdi     # 0xc7378
callq 0x59fd0
movq %rax, -0x128(%rbp)
leaq -0x120(%rbp), %rdi
leaq -0x128(%rbp), %rsi
callq 0x59f60
testb $0x1, %al
jne 0x58f06
jmp 0x58f08
jmp 0x58f86
leaq -0x118(%rbp), %rdi
callq 0x58a40
movq %rax, -0x180(%rbp)
jmp 0x58f1d
movq -0x180(%rbp), %rax
movq %rax, -0x130(%rbp)
cmpq $-0x1, -0x130(%rbp)
je 0x58f84
movq -0x130(%rbp), %rax
movq %rax, -0x190(%rbp)
movq -0x10(%rbp), %rsi
leaq 0x6e45a(%rip), %rdi     # 0xc73a8
callq 0x59ce0
movq %rax, -0x188(%rbp)
jmp 0x58f5c
movq -0x188(%rbp), %rax
movq -0x190(%rbp), %rcx
movq %rcx, (%rax)
movq -0x130(%rbp), %rax
movq %rax, -0x8(%rbp)
movl $0x1, -0x134(%rbp)
jmp 0x58fe3
jmp 0x58f86
leaq -0xf0(%rbp), %rdi
callq 0x34300
jmp 0x58e59
jmp 0x58f99
leaq -0xd0(%rbp), %rdi
callq 0x34300
jmp 0x58df3
movq -0x10(%rbp), %rsi
leaq 0x6e3f3(%rip), %rdi     # 0xc73a8
callq 0x59ce0
movq %rax, -0x198(%rbp)
jmp 0x58fc3
movq -0x198(%rbp), %rax
movq $-0x1, (%rax)
movq $-0x1, -0x8(%rbp)
movl $0x1, -0x134(%rbp)
leaq -0x88(%rbp), %rdi
callq 0x166a0
leaq -0x70(%rbp), %rdi
callq 0x166a0
movq -0x8(%rbp), %rax
addq $0x1a0, %rsp            # imm = 0x1A0
popq %rbp
retq
movq -0xb8(%rbp), %rdi
callq 0x45e0
nopw %cs:(%rax,%rax)