// File: /workspace/github_c_makefile_star2_O1/nilyang[P]redis-tdd-annotation/src/dict.c
// Function: dictGenericDelete
static int dictGenericDelete(dict *d, const void *key, int nofree)
{
    unsigned int h, idx;
    dictEntry *he, *prevHe;
    int table;

    // 字典（的哈希表）为空
    if (d->ht[0].size == 0) return DICT_ERR; /* d->ht[0].table is NULL */

    // 进行单步 rehash ，T = O(1)
    if (dictIsRehashing(d)) _dictRehashStep(d);

    // 计算哈希值
    h = dictHashKey(d, key);

    // 遍历哈希表
    // T = O(1)
    for (table = 0; table <= 1; table++) {

        // 计算索引值 
        idx = h & d->ht[table].sizemask;
        // 指向该索引上的链表
        he = d->ht[table].table[idx];
        prevHe = NULL;
        // 遍历链表上的所有节点
        // T = O(1)
        while(he) {
        
            if (dictCompareKeys(d, key, he->key)) {
                // 超找目标节点

                /* Unlink the element from the list */
                // 从链表中删除
                if (prevHe)
                    prevHe->next = he->next;
                else
                    d->ht[table].table[idx] = he->next;

                // 释放调用键和值的释放函数？
                if (!nofree) {
                    dictFreeKey(d, he);
                    dictFreeVal(d, he);
                }
                
                // 释放节点本身
                zfree(he);

                // 更新已使用节点数量
                d->ht[table].used--;

                // 返回已找到信号
                return DICT_OK;
            }

            prevHe = he;
            he = he->next;
        }

        // 如果执行到这里，说明在 0 号哈希表中找不到给定键
        // 那么根据字典是否正在进行 rehash ，决定要不要查找 1 号哈希表
        if (!dictIsRehashing(d)) break;
    }

    // 没找到
    return DICT_ERR; /* not found */
}

// Assembly:
movl $0x1, %eax
cmpq $0x0, 0x18(%rdi)
je 0x22723
pushq %rbp
pushq %r15
pushq %r14
pushq %r13
pushq %r12
pushq %rbx
subq $0x18, %rsp
movq %rsi, %r15
movq %rdi, %rbx
movl %edx, 0x8(%rsp)
cmpl $-0x1, 0x50(%rdi)
je 0x22618
cmpl $0x0, 0x54(%rbx)
jne 0x22618
movq %rbx, %rdi
movl $0x1, %esi
callq 0x2208c
leaq 0x10(%rbx), %rax
movq %rax, 0x10(%rsp)
movq (%rbx), %rax
movq %r15, %rdi
callq *(%rax)
movl %eax, 0xc(%rsp)
xorl %ebp, %ebp
movq %rbp, %rax
shlq $0x5, %rax
movq 0x10(%rsp), %rcx
movl 0x10(%rcx,%rax), %r14d
andl 0xc(%rsp), %r14d
movq %rax, (%rsp)
movq (%rcx,%rax), %rax
movq (%rax,%r14,8), %rax
testq %rax, %rax
je 0x22696
movq 0x10(%rsp), %rcx
addq %rcx, (%rsp)
xorl %r12d, %r12d
movq %rax, %r13
movq (%rbx), %rax
movq 0x18(%rax), %rax
testq %rax, %rax
je 0x22684
movq 0x8(%rbx), %rdi
movq (%r13), %rdx
movq %r15, %rsi
callq *%rax
testl %eax, %eax
je 0x2268a
jmp 0x226af
cmpq %r15, (%r13)
je 0x226af
movq 0x10(%r13), %rax
movq %r13, %r12
testq %rax, %rax
jne 0x22662
cmpl $-0x1, 0x50(%rbx)
je 0x226a8
leaq 0x1(%rbp), %rax
testq %rbp, %rbp
movq %rax, %rbp
je 0x2262f
movl $0x1, %eax
jmp 0x22715
movq 0x10(%r13), %rax
testq %r12, %r12
je 0x226c2
addq $0x10, %r12
movq (%rsp), %r15
jmp 0x226d0
shlq $0x3, %r14
movq (%rsp), %r15
addq (%r15), %r14
movq %r14, %r12
movq %rax, (%r12)
cmpl $0x0, 0x8(%rsp)
jne 0x22707
movq (%rbx), %rax
movq 0x20(%rax), %rax
testq %rax, %rax
je 0x226f1
movq 0x8(%rbx), %rdi
movq (%r13), %rsi
callq *%rax
movq (%rbx), %rax
movq 0x28(%rax), %rax
testq %rax, %rax
je 0x22707
movq 0x8(%rbx), %rdi
movq 0x8(%r13), %rsi
callq *%rax
movq %r13, %rdi
callq 0x2984b
decq 0x18(%r15)
xorl %eax, %eax
addq $0x18, %rsp
popq %rbx
popq %r12
popq %r13
popq %r14
popq %r15
popq %rbp
retq