// File: /workspace/github_c_makefile_star2_O0/johsteffens[P]beth/lib/bcore/bcore_spect_via.c
// Function: bcore_via_default_iget
sr_s bcore_via_default_iget( const bcore_via_s* p, const bcore_via* o, uz_t index )
{
    if( index >= p->size ) ERR( "index (%zu) out of range (%zu)", index, p->size );
    const bcore_vitem_s* vitem = &p->vitem_arr[ index ];
    if( vitem->fp_get )  // explicit getter
    {
        return vitem->fp_get( o );
    }
    switch( vitem->caps )
    {
        case BCORE_CAPS_SOLID_STATIC:
        {
            return sr_twm( vitem->type, ( vd_t )( ( u0_t* )o + vitem->offs ) );
        }

        case BCORE_CAPS_LINK_STATIC:
        {
            const bcore_link_static_s* dst = ( vc_t )( ( u0_t* )o + vitem->offs );
            return sr_twm( vitem->type, dst->link );
        }

        case BCORE_CAPS_LINK_TYPED:
        {
            const bcore_link_typed_s* dst = ( vc_t )( ( u0_t* )o + vitem->offs );
            return dst->link ? sr_twm( dst->type, dst->link ) : sr_null();
        }

        case BCORE_CAPS_LINK_AWARE:
        {
            const bcore_link_aware_s* dst = ( vc_t )( ( u0_t* )o + vitem->offs );
            return sr_twm( dst->link ? *(aware_t*)dst->link : 0, dst->link );
        }

        case BCORE_CAPS_ARRAY_DYN_SOLID_STATIC:
        case BCORE_CAPS_ARRAY_DYN_SOLID_TYPED:
        case BCORE_CAPS_ARRAY_DYN_LINK_STATIC:
        case BCORE_CAPS_ARRAY_DYN_LINK_TYPED:
        case BCORE_CAPS_ARRAY_DYN_LINK_AWARE:
        case BCORE_CAPS_ARRAY_FIX_SOLID_STATIC:
        case BCORE_CAPS_ARRAY_FIX_LINK_STATIC:
        case BCORE_CAPS_ARRAY_FIX_LINK_AWARE:
        {
            return sr_twm( vitem->type, ( vd_t )( ( u0_t* )o + vitem->offs ) );
        }

        default: break;
    }

    return sr_null();
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x60, %rsp
movq %rdi, -0x48(%rbp)
movq %rdi, -0x40(%rbp)
movq %rsi, -0x8(%rbp)
movq %rdx, -0x10(%rbp)
movq %rcx, -0x18(%rbp)
movq -0x18(%rbp), %rax
movq -0x8(%rbp), %rcx
cmpq 0x20(%rcx), %rax
jb 0xf5f87
movq -0x18(%rbp), %r8
movq -0x8(%rbp), %rax
movq 0x20(%rax), %r9
leaq 0x5fb9b(%rip), %rdi     # 0x155b08
leaq 0x5fbab(%rip), %rsi     # 0x155b1f
movl $0x31, %edx
leaq 0x44b02(%rip), %rcx     # 0x13aa82
movb $0x0, %al
callq 0x9cf40
movq -0x8(%rbp), %rax
movq 0x30(%rax), %rax
imulq $0x38, -0x18(%rbp), %rcx
addq %rcx, %rax
movq %rax, -0x20(%rbp)
movq -0x20(%rbp), %rax
cmpq $0x0, 0x28(%rax)
je 0xf5fbd
movq -0x48(%rbp), %rdi
movq -0x20(%rbp), %rax
movq 0x28(%rax), %rax
movq -0x10(%rbp), %rsi
callq *%rax
jmp 0xf60e6
movq -0x20(%rbp), %rax
movl 0x10(%rax), %eax
decl %eax
movl %eax, %ecx
movq %rcx, -0x50(%rbp)
subl $0xc, %eax
ja 0xf60db
movq -0x50(%rbp), %rax
leaq 0x5fa10(%rip), %rcx     # 0x1559f0
movslq (%rcx,%rax,4), %rax
addq %rcx, %rax
jmpq *%rax
movq -0x48(%rbp), %rdi
movq -0x20(%rbp), %rax
movq (%rax), %rsi
movq -0x10(%rbp), %rdx
movq -0x20(%rbp), %rax
addq 0x18(%rax), %rdx
callq 0xf60f0
jmp 0xf60e6
movq -0x48(%rbp), %rdi
movq -0x10(%rbp), %rax
movq -0x20(%rbp), %rcx
addq 0x18(%rcx), %rax
movq %rax, -0x28(%rbp)
movq -0x20(%rbp), %rax
movq (%rax), %rsi
movq -0x28(%rbp), %rax
movq (%rax), %rdx
callq 0xf60f0
jmp 0xf60e6
movq -0x10(%rbp), %rax
movq -0x20(%rbp), %rcx
addq 0x18(%rcx), %rax
movq %rax, -0x30(%rbp)
movq -0x30(%rbp), %rax
cmpq $0x0, (%rax)
je 0xf606a
movq -0x48(%rbp), %rdi
movq -0x30(%rbp), %rax
movq 0x8(%rax), %rsi
movq -0x30(%rbp), %rax
movq (%rax), %rdx
callq 0xf60f0
jmp 0xf6073
movq -0x48(%rbp), %rdi
callq 0xfa030
jmp 0xf60e6
movq -0x10(%rbp), %rax
movq -0x20(%rbp), %rcx
addq 0x18(%rcx), %rax
movq %rax, -0x38(%rbp)
movq -0x38(%rbp), %rax
cmpq $0x0, (%rax)
je 0xf609f
movq -0x38(%rbp), %rax
movq (%rax), %rax
movq (%rax), %rax
movq %rax, -0x58(%rbp)
jmp 0xf60a7
xorl %eax, %eax
movq %rax, -0x58(%rbp)
jmp 0xf60a7
movq -0x48(%rbp), %rdi
movq -0x58(%rbp), %rsi
movq -0x38(%rbp), %rax
movq (%rax), %rdx
callq 0xf60f0
jmp 0xf60e6
movq -0x48(%rbp), %rdi
movq -0x20(%rbp), %rax
movq (%rax), %rsi
movq -0x10(%rbp), %rdx
movq -0x20(%rbp), %rax
addq 0x18(%rax), %rdx
callq 0xf60f0
jmp 0xf60e6
jmp 0xf60dd
movq -0x48(%rbp), %rdi
callq 0xfa030
movq -0x40(%rbp), %rax
addq $0x60, %rsp
popq %rbp
retq