; assembly | /* r2dec pseudo code output */ | /* baljsn_decoder.t/assume @ 0x48c330 */ | #include | ; (fcn) method.BloombergLP::bdlde::Utf8CheckingInStreamBufWrapper.xsgetn_char__long_ () | int64_t method_BloombergLP::bdlde::Utf8CheckingInStreamBufWrapper_xsgetn_char_long_ (int64_t arg3, int64_t arg2, uint32_t arg1) { | rdx = arg3; | rsi = arg2; | rdi = arg1; | /* BloombergLP::bdlde::Utf8CheckingInStreamBufWrapper::xsgetn(char*, long) */ 0x0048c330 push r15 | 0x0048c332 push r14 | 0x0048c334 push r13 | 0x0048c336 push r12 | 0x0048c338 push rbx | 0x0048c339 cmp qword [rdi + 0x40], 0 | | if (*((rdi + 0x40)) != 0) { 0x0048c33e je 0x48c349 | 0x0048c340 mov r13, rdi | r13 = rdi; 0x0048c343 cmp dword [rdi + 0x48], 1 | | if (*((rdi + 0x48)) != 1) { 0x0048c347 jne 0x48c34e | goto label_1; | } | } 0x0048c349 xor r12d, r12d | r12d = 0; 0x0048c34c jmp 0x48c3cc | goto label_2; | label_1: 0x0048c34e mov r15, rdx | r15 = rdx; 0x0048c351 mov r14, rsi | r14 = rsi; 0x0048c354 mov rbx, rdx | rbx = rdx; 0x0048c357 shl rbx, 0x20 | rbx <<= 0x20; 0x0048c35b mov r12, rsi | r12 = rsi; 0x0048c35e test rbx, rbx | | if (rbx <= 0) { 0x0048c361 jle 0x48c3c9 | goto label_3; | } 0x0048c363 add r15, r14 | r15 += r14; 0x0048c366 mov r12, r14 | r12 = r14; 0x0048c369 jmp 0x48c38e | | while (rax <= 0) { 0x0048c370 mov rax, qword [r13] | rax = *(r13); 0x0048c374 mov rdi, r13 | rdi = r13; 0x0048c377 call qword [rax + 0x48] | eax = uint64_t (*rax + 0x48)() (); 0x0048c37a cmp eax, 0xffffffff | | if (eax == 0xffffffff) { 0x0048c37d je 0x48c3c9 | goto label_3; | } | label_0: 0x0048c37f mov ebx, r15d | ebx = r15d; 0x0048c382 sub ebx, r12d | ebx -= r12d; 0x0048c385 shl rbx, 0x20 | rbx <<= 0x20; 0x0048c389 test rbx, rbx | | if (rbx <= 0) { 0x0048c38c jle 0x48c3c9 | goto label_3; | } 0x0048c38e mov rsi, qword [r13 + 0x18] | rsi = *((r13 + 0x18)); 0x0048c392 mov rax, qword [r13 + 0x20] | rax = *((r13 + 0x20)); 0x0048c396 sub rax, rsi | rax -= rsi; 0x0048c399 test rax, rax | 0x0048c39c jle 0x48c370 | | } 0x0048c39e shr rbx, 0x20 | rbx >>= 0x20; 0x0048c3a2 cmp rax, rbx | | if (rax < rbx) { 0x0048c3a5 cmovl rbx, rax | rbx = rax; | } 0x0048c3a9 test rbx, rbx | | if (rbx != 0) { 0x0048c3ac je 0x48c3bd | 0x0048c3ae mov rdi, r12 | 0x0048c3b1 mov rdx, rbx | 0x0048c3b4 call 0x406620 | memcpy (r12, rsi, rbx); 0x0048c3b9 mov rsi, qword [r13 + 0x18] | rsi = *((r13 + 0x18)); | } 0x0048c3bd add r12, rbx | r12 += rbx; 0x0048c3c0 add rsi, rbx | rsi += rbx; 0x0048c3c3 mov qword [r13 + 0x18], rsi | *((r13 + 0x18)) = rsi; 0x0048c3c7 jmp 0x48c37f | goto label_0; | label_3: 0x0048c3c9 sub r12, r14 | r12 -= r14; | label_2: 0x0048c3cc mov rax, r12 | rax = r12; 0x0048c3cf pop rbx | 0x0048c3d0 pop r12 | 0x0048c3d2 pop r13 | 0x0048c3d4 pop r14 | 0x0048c3d6 pop r15 | 0x0048c3d8 ret | return rax; | }