; assembly | /* r2dec pseudo code output */ | /* bdlcc_objectpool.t/none @ 0x410af0 */ | #include | ; (fcn) method.BloombergLP::bdlcc.ObjectPool__anonymous_namespace_::OtherType__bsl::function_void__void__BloombergLP::bslma::Allocator____BloombergLP::bdlcc::ObjectPoolFunctors::Nil__anonymous_namespace_::OtherType___::getObject__ () | int64_t method_BloombergLP::bdlcc_ObjectPool_anonymous_namespace_::OtherType_bsl::function_void_void_BloombergLP::bslma::Allocator_BloombergLP::bdlcc::ObjectPoolFunctors::Nil_anonymous_namespace_::OtherType_::getObject_ (int64_t arg1) { | int64_t var_ch; | int64_t var_10h; | int64_t var_18h; | int64_t var_20h; | rdi = arg1; | /* BloombergLP::bdlcc::ObjectPool<(anonymous namespace)::OtherType, bsl::function, BloombergLP::bdlcc::ObjectPoolFunctors::Nil<(anonymous namespace)::OtherType> >::getObject() */ 0x00410af0 push rbp | 0x00410af1 push r15 | 0x00410af3 push r14 | 0x00410af5 push r13 | 0x00410af7 push r12 | 0x00410af9 push rbx | 0x00410afa sub rsp, 0x28 | 0x00410afe mov r13, rdi | r13 = rdi; 0x00410b01 lea r14, [rdi + 0x90] | r14 = rdi + 0x90; 0x00410b08 lea r15, [rdi + 0x78] | r15 = rdi + 0x78; 0x00410b0c lea r12, [rdi + 0x10] | r12 = rdi + 0x10; | label_1: 0x00410b10 mov rbx, qword [r13 + 8] | rbx = *((r13 + 8)); 0x00410b14 test rbx, rbx | | if (rbx == 0) { 0x00410b17 je 0x410b82 | goto label_4; | } | label_2: 0x00410b19 mov eax, 2 | eax = 2; 0x00410b1e lock xadd dword [rbx + 8], eax | __asm ("lock xadd dword [rbx + 8], eax"); 0x00410b23 test eax, eax | | if (eax != 0) { 0x00410b25 jne 0x410ba0 | goto label_5; | } | label_3: 0x00410b27 mov rax, qword [r13 + 8] | rax = *((r13 + 8)); 0x00410b2b mov qword [rsp + 0x10], rax | *((rsp + 0x10)) = rax; 0x00410b30 mov rax, qword [rsp + 0x10] | rax = *((rsp + 0x10)); 0x00410b35 cmp rax, rbx | | if (rax != rbx) { 0x00410b38 jne 0x410b6a | goto label_0; | } 0x00410b3a mov rax, qword [rsp + 0x10] | rax = *((rsp + 0x10)); 0x00410b3f mov rcx, qword [rax] | rcx = *(rax); 0x00410b42 mov rax, rbx | rax = rbx; 0x00410b45 lock cmpxchg qword [r13 + 8], rcx | __asm ("lock cmpxchg qword [r13 + 8], rcx"); 0x00410b4b cmp rbx, rax | | if (rbx == rax) { 0x00410b4e je 0x410c9f | goto label_6; | } 0x00410b54 jmp 0x410b6a | | while ((cl & 1) != 0) { 0x00410b56 mov edx, ecx | edx = ecx; 0x00410b58 xor edx, 1 | edx ^= 1; 0x00410b5b mov eax, ecx | eax = ecx; 0x00410b5d lock cmpxchg dword [rbx + 8], edx | __asm ("lock cmpxchg dword [rbx + 8], edx"); 0x00410b62 cmp ecx, eax | | if (ecx == eax) { 0x00410b64 je 0x410c9f | goto label_6; | } | label_0: 0x00410b6a mov ecx, dword [rbx + 8] | ecx = *((rbx + 8)); 0x00410b6d test cl, 1 | 0x00410b70 jne 0x410b56 | | } 0x00410b72 lea edx, [rcx - 2] | edx = rcx - 2; 0x00410b75 mov eax, ecx | eax = ecx; 0x00410b77 lock cmpxchg dword [rbx + 8], edx | __asm ("lock cmpxchg dword [rbx + 8], edx"); 0x00410b7c cmp ecx, eax | | if (ecx != eax) { 0x00410b7e jne 0x410b6a | goto label_0; | } 0x00410b80 jmp 0x410b10 | goto label_1; | label_4: 0x00410b82 mov rdi, r14 | rdi = r14; 0x00410b85 call 0x4042b0 | pthread_mutex_lock (); 0x00410b8a mov rbx, qword [r13 + 8] | rbx = *((r13 + 8)); 0x00410b8e test rbx, rbx | | if (rbx == 0) { 0x00410b91 je 0x410bc3 | goto label_7; | } 0x00410b93 mov rdi, r14 | rdi = r14; 0x00410b96 call 0x404380 | pthread_mutex_unlock (); 0x00410b9b jmp 0x410b19 | goto label_2; | label_5: 0x00410ba0 mov rax, qword [r13 + 8] | rax = *((r13 + 8)); 0x00410ba4 cmp rbx, rax | | if (rbx != rax) { 0x00410ba7 jne 0x410b27 | goto label_3; | } 0x00410bad mov rax, qword [r13 + 8] | rax = *((r13 + 8)); 0x00410bb1 cmp rbx, rax | | if (rbx != rax) { 0x00410bb4 jne 0x410b27 | goto label_3; | } 0x00410bba mov rax, qword [r13 + 8] | rax = *((r13 + 8)); 0x00410bbe jmp 0x410b27 | goto label_3; | label_7: 0x00410bc3 mov ebp, dword [r13 + 0x64] | ebp = *((r13 + 0x64)); 0x00410bc7 mov ebx, ebp | ebx = *((r13 + 0x64)); 0x00410bc9 neg ebx | ebx = -ebx; | if (rbx < rax) { 0x00410bcb cmovl ebx, ebp | ebx = ebp; | } 0x00410bce mov eax, ebx | eax = ebx; 0x00410bd0 shl eax, 5 | eax <<= 5; 0x00410bd3 or eax, 0x10 | eax |= 0x10; 0x00410bd6 movsxd rsi, eax | rsi = (int64_t) eax; 0x00410bd9 mov rdi, r15 | 0x00410bdc call 0x416a30 | BloombergLP::bdlma::InfrequentDeleteBlockList::allocate(unsigned long) (r15, rsi); 0x00410be1 mov rcx, qword [r13 + 0x70] | rcx = *((r13 + 0x70)); 0x00410be5 mov qword [rax], rcx | *(rax) = rcx; 0x00410be8 mov dword [rsp + 0xc], ebx | *((rsp + 0xc)) = ebx; 0x00410bec mov dword [rax + 8], ebx | *((rax + 8)) = ebx; 0x00410bef lea rbx, [rax + 0x10] | rbx = rax + 0x10; 0x00410bf3 mov qword [rsp + 0x20], rbx | *((rsp + 0x20)) = rbx; 0x00410bf8 test ebp, ebp | | if (ebp == 0) { 0x00410bfa je 0x410c45 | goto label_8; | } 0x00410bfc mov qword [rsp + 0x18], rax | *((rsp + 0x18)) = rax; 0x00410c01 mov rbx, rax | rbx = rax; 0x00410c04 add rbx, 0x30 | rbx += 0x30; 0x00410c08 mov ebp, dword [rsp + 0xc] | ebp = *((rsp + 0xc)); | do { 0x00410c0c mov qword [rbx - 0x20], rbx | *((rbx - 0x20)) = rbx; 0x00410c10 mov dword [rbx - 0x18], 0 | *((rbx - 0x18)) = 0; 0x00410c17 mov rax, qword [r13 + 0x50] | rax = *((r13 + 0x50)); 0x00410c1b test rax, rax | | if (rax == 0) { 0x00410c1e je 0x410cc1 | goto label_9; | } 0x00410c24 mov rdx, qword [r13 + 0x88] | rdx = *((r13 + 0x88)); 0x00410c2b lea rsi, [rbx - 0x10] | rsi = rbx - 0x10; 0x00410c2f mov rdi, r12 | rdi = r12; 0x00410c32 call rax | void (*rax)() (); 0x00410c34 add rbx, 0x20 | rbx += 0x20; 0x00410c38 dec ebp | ebp--; 0x00410c3a jne 0x410c0c | | } while (ebp != 0); 0x00410c3c add rbx, 0xffffffffffffffe0 | rbx += 0xffffffffffffffe0; 0x00410c40 mov rax, qword [rsp + 0x18] | rax = *((rsp + 0x18)); | label_8: 0x00410c45 mov dword [rbx - 0x18], 0 | *((rbx - 0x18)) = 0; 0x00410c4c mov qword [r13 + 0x70], rax | *((r13 + 0x70)) = rax; 0x00410c50 mov rdx, qword [rsp + 0x20] | rdx = *((rsp + 0x20)); | do { 0x00410c55 mov rcx, qword [r13 + 8] | rcx = *((r13 + 8)); 0x00410c59 mov qword [rbx - 0x20], rcx | *((rbx - 0x20)) = rcx; 0x00410c5d mov rax, rcx | rax = rcx; 0x00410c60 lock cmpxchg qword [r13 + 8], rdx | __asm ("lock cmpxchg qword [r13 + 8], rdx"); 0x00410c66 cmp rcx, rax | 0x00410c69 jne 0x410c55 | | } while (rcx != rax); 0x00410c6b mov eax, dword [rsp + 0xc] | eax = *((rsp + 0xc)); 0x00410c6f lock add dword [r13 + 0x6c], eax | *((r13 + 0x6c)) += eax; 0x00410c74 lock add dword [r13 + 0x68], eax | *((r13 + 0x68)) += eax; 0x00410c79 mov eax, dword [r13 + 0x64] | eax = *((r13 + 0x64)); 0x00410c7d test eax, eax | | if (eax < 0) { 0x00410c7f jns 0x410c92 | 0x00410c81 mov ecx, eax | ecx = eax; 0x00410c83 neg ecx | ecx = -ecx; 0x00410c85 lea edx, [rax + rax] | edx = rax + rax; 0x00410c88 cmp eax, 0xffffffe0 | | if (eax <= 0xffffffe0) { 0x00410c8b cmovle edx, ecx | edx = ecx; | } 0x00410c8e mov dword [r13 + 0x64], edx | *((r13 + 0x64)) = edx; | } 0x00410c92 mov rdi, r14 | rdi = r14; 0x00410c95 call 0x404380 | pthread_mutex_unlock (); 0x00410c9a jmp 0x410b10 | goto label_1; | label_6: 0x00410c9f mov qword [rbx], 0 | *(rbx) = 0; 0x00410ca6 lock dec dword [r13 + 0x68] | *((r13 + 0x68))--; 0x00410cab add rbx, 0x10 | rbx += 0x10; 0x00410caf mov rax, rbx | rax = rbx; 0x00410cb2 add rsp, 0x28 | 0x00410cb6 pop rbx | 0x00410cb7 pop r12 | 0x00410cb9 pop r13 | 0x00410cbb pop r14 | 0x00410cbd pop r15 | 0x00410cbf pop rbp | 0x00410cc0 ret | return rax; | label_9: 0x00410cc1 mov edi, 8 | edi = 8; 0x00410cc6 call 0x403e40 | cxa_allocate_exception (); 0x00410ccb mov qword [rax], 0x4417f0 | *(rax) = fcn.004041c0; 0x00410cd2 mov esi, 0x4417c8 | 0x00410cd7 mov edx, 0x4041c0 | 0x00410cdc mov rdi, rax | 0x00410cdf call 0x403f10 | return cxa_throw (rax, obj.typeinfo_for_std::__1::bad_function_call, fcn.004041c0); | }