; assembly | /* r2dec pseudo code output */ | /* balber_berdecoder.t/assume @ 0x43af90 */ | #include | ; (fcn) method.int_BloombergLP::balber::BerDecoder::decode_BloombergLP::s_baltst.MyChoiceWithDefaultValues__std::__1::basic_streambuf_char__std::__1::char_traits_char_____BloombergLP::s_baltst::MyChoiceWithDefaultValues_ () | int64_t method_int_BloombergLP::balber::BerDecoder::decode_BloombergLP::s_baltst_MyChoiceWithDefaultValues_std::_1::basic_streambuf_char_std::_1::char_traits_char_BloombergLP::s_baltst::MyChoiceWithDefaultValues_ (uint32_t arg3, uint32_t arg2, int64_t arg1) { | int64_t var_8h; | int64_t var_10h; | uint32_t var_18h; | uint32_t var_20h; | int64_t var_28h; | int64_t var_2ch; | int64_t var_30h; | int64_t var_34h; | int64_t var_38h; | int64_t var_40h; | int64_t var_44h; | int64_t var_48h; | int64_t var_4ch; | int64_t var_4dh; | rdx = arg3; | rsi = arg2; | rdi = arg1; | /* int BloombergLP::balber::BerDecoder::decode(std::__1::basic_streambuf >*, BloombergLP::s_baltst::MyChoiceWithDefaultValues*) */ 0x0043af90 push r15 | 0x0043af92 push r14 | 0x0043af94 push rbx | 0x0043af95 sub rsp, 0x50 | 0x0043af99 mov r14, rdx | r14 = rdx; 0x0043af9c mov r15, rdi | r15 = rdi; 0x0043af9f mov qword [rdi + 0x108], rsi | *((rdi + 0x108)) = rsi; 0x0043afa6 mov qword [rdi + 0x110], 0 | *((rdi + 0x110)) = 0; 0x0043afb1 mov dword [rdi + 0x100], 0 | *((rdi + 0x100)) = 0; 0x0043afbb mov rbx, qword [rdi + 0xf8] | rbx = *((rdi + 0xf8)); 0x0043afc2 test rbx, rbx | | if (rbx != 0) { 0x0043afc5 je 0x43afe4 | 0x0043afc7 mov rsi, qword [rbx + 0x30] | rsi = *((rbx + 0x30)); 0x0043afcb mov rdi, qword [rbx + 0x48] | rdi = *((rbx + 0x48)); 0x0043afcf mov rax, qword [rdi] | rax = *(rdi); 0x0043afd2 call qword [rax + 0x18] | uint64_t (*rax + 0x18)() (); 0x0043afd5 xorps xmm0, xmm0 | __asm ("xorps xmm0, xmm0"); 0x0043afd8 movups xmmword [rbx + 0x30], xmm0 | __asm ("movups xmmword [rbx + 0x30], xmm0"); 0x0043afdc mov qword [rbx + 0x40], 0 | *((rbx + 0x40)) = 0; | } 0x0043afe4 mov qword [r15 + 0x118], 0 | *((r15 + 0x118)) = 0; 0x0043afef mov eax, dword [r14 + 0x30] | eax = *((r14 + 0x30)); 0x0043aff3 test eax, eax | | if (eax != 0) { 0x0043aff5 je 0x43b01d | 0x0043aff7 cmp eax, 2 | | if (eax == 2) { 0x0043affa je 0x43b01d | goto label_0; | } 0x0043affc cmp eax, 1 | | if (eax != 1) { 0x0043afff jne 0x43b01d | goto label_0; | } 0x0043b001 cmp qword [r14 + 0x20], 0x17 | | if (*((r14 + 0x20)) != 0x17) { 0x0043b006 je 0x43b015 | 0x0043b008 mov rsi, qword [r14] | rsi = *(r14); 0x0043b00b mov rdi, qword [r14 + 0x28] | rdi = *((r14 + 0x28)); 0x0043b00f mov rax, qword [rdi] | rax = *(rdi); 0x0043b012 call qword [rax + 0x18] | uint64_t (*rax + 0x18)() (); | } 0x0043b015 mov qword [r14 + 0x18], 0xffffffffffffffff | *((r14 + 0x18)) = 0xffffffffffffffff; | } | label_0: 0x0043b01d mov dword [r14 + 0x30], 0xffffffff | *((r14 + 0x30)) = 0xffffffff; 0x0043b025 cmp qword [r15], 0 | | if (*(r15) != 0) { 0x0043b029 je 0x43b09f | 0x0043b02b mov qword [rsp + 8], r15 | *((rsp + 8)) = r15; 0x0043b030 mov rax, qword [r15 + 0x118] | rax = *((r15 + 0x118)); 0x0043b037 mov qword [rsp + 0x10], rax | *((rsp + 0x10)) = rax; 0x0043b03c xorps xmm0, xmm0 | __asm ("xorps xmm0, xmm0"); 0x0043b03f movups xmmword [rsp + 0x18], xmm0 | __asm ("movups xmmword [rsp + 0x18], xmm0"); 0x0043b044 movups xmmword [rsp + 0x28], xmm0 | __asm ("movups xmmword [rsp + 0x28], xmm0"); 0x0043b049 mov qword [rsp + 0x38], 0 | *((rsp + 0x38)) = 0; 0x0043b052 inc dword [r15 + 0x110] | *((r15 + 0x110))++; 0x0043b059 test rax, rax | | if (rax != 0) { 0x0043b05c je 0x43b065 | 0x0043b05e mov eax, dword [rax + 0x2c] | eax = *((rax + 0x2c)); 0x0043b061 mov dword [rsp + 0x34], eax | *((rsp + 0x34)) = eax; | } 0x0043b065 lea rdi, [rsp + 8] | 0x0043b06a mov qword [r15 + 0x118], rdi | *((r15 + 0x118)) = rdi; 0x0043b071 call 0x4509e0 | eax = BloombergLP::balber::BerDecoder_Node::readTagHeader() (rsp + 8); 0x0043b076 mov ecx, eax | ecx = eax; 0x0043b078 test eax, eax | | if (eax != 0) { 0x0043b07a jne 0x43b1a6 | goto label_1; | } 0x0043b080 cmp dword [rsp + 0x18], 0 | | if (*((rsp + 0x18)) != 0) { 0x0043b085 je 0x43b149 | 0x0043b08b lea rdi, [rsp + 8] | 0x0043b090 mov esi, 0x49a4cc | 0x0043b095 call 0x450280 | BloombergLP::balber::BerDecoder_Node::logError(char const*) (rsp + 8, "Expected UNIVERSAL tag class"); 0x0043b09a jmp 0x43b1a4 | | } else { 0x0043b09f mov eax, dword [rip + 0x60107] | eax = BloombergLP::balber::BerDecoderOptions::DEFAULT_MAX_DEPTH; 0x0043b0a5 mov dword [rsp + 0x40], eax | *((rsp + 0x40)) = eax; 0x0043b0a9 mov eax, dword [rip + 0x60105] | eax = BloombergLP::balber::BerDecoderOptions::DEFAULT_TRACE_LEVEL; 0x0043b0af mov dword [rsp + 0x44], eax | *((rsp + 0x44)) = eax; 0x0043b0b3 mov eax, dword [rip + 0x600ff] | eax = BloombergLP::balber::BerDecoderOptions::DEFAULT_MAX_SEQUENCE_SIZE; 0x0043b0b9 mov dword [rsp + 0x48], eax | *((rsp + 0x48)) = eax; 0x0043b0bd mov al, byte [rip + 0x600ed] | al = BloombergLP::balber::BerDecoderOptions::DEFAULT_SKIP_UNKNOWN_ELEMENTS; 0x0043b0c3 mov byte [rsp + 0x4c], al | *((rsp + 0x4c)) = al; 0x0043b0c7 mov al, byte [rip + 0x600ef] | al = BloombergLP::balber::BerDecoderOptions::DEFAULT_DEFAULT_EMPTY_STRINGS; 0x0043b0cd mov byte [rsp + 0x4d], al | *((rsp + 0x4d)) = al; 0x0043b0d1 lea rax, [rsp + 0x40] | rax = rsp + 0x40; 0x0043b0d6 mov qword [r15], rax | *(r15) = rax; 0x0043b0d9 mov qword [rsp + 8], r15 | *((rsp + 8)) = r15; 0x0043b0de mov rax, qword [r15 + 0x118] | rax = *((r15 + 0x118)); 0x0043b0e5 mov qword [rsp + 0x10], rax | *((rsp + 0x10)) = rax; 0x0043b0ea xorps xmm0, xmm0 | __asm ("xorps xmm0, xmm0"); 0x0043b0ed movups xmmword [rsp + 0x18], xmm0 | __asm ("movups xmmword [rsp + 0x18], xmm0"); 0x0043b0f2 movups xmmword [rsp + 0x28], xmm0 | __asm ("movups xmmword [rsp + 0x28], xmm0"); 0x0043b0f7 mov qword [rsp + 0x38], 0 | *((rsp + 0x38)) = 0; 0x0043b100 inc dword [r15 + 0x110] | *((r15 + 0x110))++; 0x0043b107 test rax, rax | | if (rax != 0) { 0x0043b10a je 0x43b113 | 0x0043b10c mov eax, dword [rax + 0x2c] | eax = *((rax + 0x2c)); 0x0043b10f mov dword [rsp + 0x34], eax | *((rsp + 0x34)) = eax; | } 0x0043b113 lea rdi, [rsp + 8] | 0x0043b118 mov qword [r15 + 0x118], rdi | *((r15 + 0x118)) = rdi; 0x0043b11f call 0x4509e0 | eax = BloombergLP::balber::BerDecoder_Node::readTagHeader() (rsp + 8); 0x0043b124 mov ecx, eax | ecx = eax; 0x0043b126 test eax, eax | | if (eax != 0) { 0x0043b128 jne 0x43b1e4 | goto label_2; | } 0x0043b12e cmp dword [rsp + 0x18], 0 | | if (*((rsp + 0x18)) == 0) { 0x0043b133 je 0x43b16f | goto label_3; | } 0x0043b135 lea rdi, [rsp + 8] | 0x0043b13a mov esi, 0x49a4cc | 0x0043b13f call 0x450280 | BloombergLP::balber::BerDecoder_Node::logError(char const*) (rsp + 8, "Expected UNIVERSAL tag class"); 0x0043b144 jmp 0x43b1e2 | goto label_4; | } 0x0043b149 cmp dword [rsp + 0x20], 0x10 | | if (*((rsp + 0x20)) == 0x10) { 0x0043b14e jne 0x43b195 | 0x0043b150 lea rdi, [rsp + 8] | 0x0043b155 mov rsi, r14 | 0x0043b158 call 0x445770 | eax = intBloombergLP::balber::BerDecoder_Node::decode(BloombergLP::s_baltst::MyChoiceWithDefaultValues*,BloombergLP::bdlat_TypeCategory::Choice) (rsp + 8, r14); 0x0043b15d mov ecx, eax | ecx = eax; 0x0043b15f test eax, eax | | if (eax != 0) { 0x0043b161 jne 0x43b1a6 | goto label_1; | } 0x0043b163 lea rdi, [rsp + 8] | 0x0043b168 call 0x450c20 | BloombergLP::balber::BerDecoder_Node::readTagTrailer() (rsp + 8); 0x0043b16d jmp 0x43b1a4 | goto label_5; | label_3: 0x0043b16f cmp dword [rsp + 0x20], 0x10 | | if (*((rsp + 0x20)) != 0x10) { 0x0043b174 jne 0x43b1d3 | goto label_6; | } 0x0043b176 lea rdi, [rsp + 8] | 0x0043b17b mov rsi, r14 | 0x0043b17e call 0x445770 | eax = intBloombergLP::balber::BerDecoder_Node::decode(BloombergLP::s_baltst::MyChoiceWithDefaultValues*,BloombergLP::bdlat_TypeCategory::Choice) (rsp + 8, r14); 0x0043b183 mov ecx, eax | ecx = eax; 0x0043b185 test eax, eax | | if (eax != 0) { 0x0043b187 jne 0x43b1e4 | goto label_2; | } 0x0043b189 lea rdi, [rsp + 8] | 0x0043b18e call 0x450c20 | BloombergLP::balber::BerDecoder_Node::readTagTrailer() (rsp + 8); 0x0043b193 jmp 0x43b1e2 | goto label_4; | } 0x0043b195 lea rdi, [rsp + 8] | 0x0043b19a mov esi, 0x49a4e9 | 0x0043b19f call 0x450280 | eax = BloombergLP::balber::BerDecoder_Node::logError(char const*) (rsp + 8, "Unexpected tag number"); | } | label_5: 0x0043b1a4 mov ecx, eax | ecx = eax; | label_1: 0x0043b1a6 mov rax, qword [rsp + 0x10] | rax = *((rsp + 0x10)); 0x0043b1ab test rax, rax | | if (rax != 0) { 0x0043b1ae je 0x43b1bf | 0x0043b1b0 mov edx, dword [rsp + 0x2c] | edx = *((rsp + 0x2c)); 0x0043b1b4 add edx, dword [rsp + 0x28] | edx += *((rsp + 0x28)); 0x0043b1b8 add edx, dword [rsp + 0x30] | edx += *((rsp + 0x30)); 0x0043b1bc add dword [rax + 0x24], edx | *((rax + 0x24)) += edx; | } 0x0043b1bf mov rdx, qword [rsp + 8] | rdx = *((rsp + 8)); 0x0043b1c4 mov qword [rdx + 0x118], rax | *((rdx + 0x118)) = rax; 0x0043b1cb dec dword [rdx + 0x110] | *((rdx + 0x110))--; 0x0043b1d1 jmp 0x43b216 | goto label_7; | label_6: 0x0043b1d3 lea rdi, [rsp + 8] | 0x0043b1d8 mov esi, 0x49a4e9 | 0x0043b1dd call 0x450280 | eax = BloombergLP::balber::BerDecoder_Node::logError(char const*) (rsp + 8, "Unexpected tag number"); | label_4: 0x0043b1e2 mov ecx, eax | ecx = eax; | label_2: 0x0043b1e4 mov rax, qword [rsp + 0x10] | rax = *((rsp + 0x10)); 0x0043b1e9 test rax, rax | | if (rax != 0) { 0x0043b1ec je 0x43b1fd | 0x0043b1ee mov edx, dword [rsp + 0x2c] | edx = *((rsp + 0x2c)); 0x0043b1f2 add edx, dword [rsp + 0x28] | edx += *((rsp + 0x28)); 0x0043b1f6 add edx, dword [rsp + 0x30] | edx += *((rsp + 0x30)); 0x0043b1fa add dword [rax + 0x24], edx | *((rax + 0x24)) += edx; | } 0x0043b1fd mov rdx, qword [rsp + 8] | rdx = *((rsp + 8)); 0x0043b202 mov qword [rdx + 0x118], rax | *((rdx + 0x118)) = rax; 0x0043b209 dec dword [rdx + 0x110] | *((rdx + 0x110))--; 0x0043b20f mov qword [r15], 0 | *(r15) = 0; | label_7: 0x0043b216 mov qword [r15 + 0x108], 0 | *((r15 + 0x108)) = 0; 0x0043b221 mov eax, ecx | eax = ecx; 0x0043b223 add rsp, 0x50 | 0x0043b227 pop rbx | 0x0043b228 pop r14 | 0x0043b22a pop r15 | 0x0043b22c ret | return rax; | }