// File: /workspace/github_c_makefile_star2_O0/nilyang[P]redis-tdd-annotation/src/t_zset.c
// Function: zuiLongLongFromValue
int zuiLongLongFromValue(zsetopval *val) {

    if (!(val->flags & OPVAL_DIRTY_LL)) {

        // 打开标识 DIRTY LL
        val->flags |= OPVAL_DIRTY_LL;

        // 从对象中取值
        if (val->ele != NULL) {
            // 从 INT 编码的字符串中取出整数
            if (val->ele->encoding == REDIS_ENCODING_INT) {
                val->ell = (long)val->ele->ptr;
                val->flags |= OPVAL_VALID_LL;
            // 从未编码的字符串中转换整数
            } else if (sdsEncodedObject(val->ele)) {
                if (string2ll(val->ele->ptr,sdslen(val->ele->ptr),&val->ell))
                    val->flags |= OPVAL_VALID_LL;

            } else {
                redisPanic("Unsupported element encoding");
            }

        // 从 ziplist 节点中取值
        } else if (val->estr != NULL) {
            // 将节点值（一个字符串）转换为整数
            if (string2ll((char*)val->estr,val->elen,&val->ell))
                val->flags |= OPVAL_VALID_LL;

        } else {
            /* The long long was already set, flag as valid. */
            // 总是打开 VALID LL 标识
            val->flags |= OPVAL_VALID_LL;
        }
    }

    // 检查 VALID LL 标识是否已打开
    return val->flags & OPVAL_VALID_LL;
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x10, %rsp
movq %rdi, -0x8(%rbp)
movq -0x8(%rbp), %rax
movl (%rax), %eax
andl $0x2, %eax
cmpl $0x0, %eax
jne 0x51f32
movq -0x8(%rbp), %rax
movl (%rax), %ecx
orl $0x2, %ecx
movl %ecx, (%rax)
movq -0x8(%rbp), %rax
cmpq $0x0, 0x28(%rax)
je 0x51ee8
movq -0x8(%rbp), %rax
movq 0x28(%rax), %rax
movl (%rax), %eax
shrl $0x4, %eax
andl $0xf, %eax
cmpl $0x1, %eax
jne 0x51e51
movq -0x8(%rbp), %rax
movq 0x28(%rax), %rax
movq 0x8(%rax), %rcx
movq -0x8(%rbp), %rax
movq %rcx, 0x40(%rax)
movq -0x8(%rbp), %rax
movl (%rax), %ecx
orl $0x4, %ecx
movl %ecx, (%rax)
jmp 0x51ee6
movq -0x8(%rbp), %rax
movq 0x28(%rax), %rax
movl (%rax), %eax
shrl $0x4, %eax
andl $0xf, %eax
cmpl $0x0, %eax
je 0x51e7b
movq -0x8(%rbp), %rax
movq 0x28(%rax), %rax
movl (%rax), %eax
shrl $0x4, %eax
andl $0xf, %eax
cmpl $0x8, %eax
jne 0x51ec2
movq -0x8(%rbp), %rax
movq 0x28(%rax), %rax
movq 0x8(%rax), %rax
movq %rax, -0x10(%rbp)
movq -0x8(%rbp), %rax
movq 0x28(%rax), %rax
movq 0x8(%rax), %rdi
callq 0x4cfd0
movq -0x10(%rbp), %rdi
movq %rax, %rsi
movq -0x8(%rbp), %rdx
addq $0x40, %rdx
callq 0x39780
cmpl $0x0, %eax
je 0x51ec0
movq -0x8(%rbp), %rax
movl (%rax), %ecx
orl $0x4, %ecx
movl %ecx, (%rax)
jmp 0x51ee4
leaq 0x91651(%rip), %rdi     # 0xe351a
leaq 0x913be(%rip), %rsi     # 0xe328e
movl $0x9b9, %edx            # imm = 0x9B9
callq 0x63d40
movl $0x1, %edi
callq 0x1f3b0
jmp 0x51ee6
jmp 0x51f30
movq -0x8(%rbp), %rax
cmpq $0x0, 0x30(%rax)
je 0x51f23
movq -0x8(%rbp), %rax
movq 0x30(%rax), %rdi
movq -0x8(%rbp), %rax
movl 0x38(%rax), %eax
movl %eax, %esi
movq -0x8(%rbp), %rdx
addq $0x40, %rdx
callq 0x39780
cmpl $0x0, %eax
je 0x51f21
movq -0x8(%rbp), %rax
movl (%rax), %ecx
orl $0x4, %ecx
movl %ecx, (%rax)
jmp 0x51f2e
movq -0x8(%rbp), %rax
movl (%rax), %ecx
orl $0x4, %ecx
movl %ecx, (%rax)
jmp 0x51f30
jmp 0x51f32
movq -0x8(%rbp), %rax
movl (%rax), %eax
andl $0x4, %eax
addq $0x10, %rsp
popq %rbp
retq
nopw %cs:(%rax,%rax)