; assembly | /* r2dec pseudo code output */ | /* bdlde_charconvertutf16.t/assume @ 0x42db20 */ | #include | | uint16_t rotate_left16 (uint16_t value, uint32_t count) { | const uint16_t mask = (CHAR_BIT * sizeof (value)) - 1; | count &= mask; | return (value << count) | (value >> (-count & mask)); | } | ; (fcn) method.BloombergLP::bdlde::CharConvertUtf16.utf16ToUtf8_bsl::basic_string_char__std::__1::char_traits_char___bsl::allocator_char_____unsigned_short_const__unsigned_long__char__BloombergLP::bdlde::ByteOrder::Enum_ () | uint32_t method_BloombergLP::bdlde::CharConvertUtf16_utf16ToUtf8_bsl::basic_string_char_std::_1::char_traits_char_bsl::allocator_char_unsigned_short_const_unsigned_long_char_BloombergLP::bdlde::ByteOrder::Enum_ (int64_t arg5, uint32_t arg4, char * arg3, char * arg2, char * arg1) { | r8 = arg5; | rcx = arg4; | rdx = arg3; | rsi = arg2; | rdi = arg1; | /* BloombergLP::bdlde::CharConvertUtf16::utf16ToUtf8(bsl::basic_string, bsl::allocator >*, unsigned short const*, unsigned long*, char, BloombergLP::bdlde::ByteOrder::Enum) */ 0x0042db20 push rbp | 0x0042db21 push r15 | 0x0042db23 push r14 | 0x0042db25 push r13 | 0x0042db27 push r12 | 0x0042db29 push rbx | 0x0042db2a push rax | 0x0042db2b mov r12d, ecx | r12d = ecx; 0x0042db2e mov r14, rdx | r14 = rdx; 0x0042db31 mov r15, rsi | r15 = rsi; 0x0042db34 mov r13, rdi | r13 = rdi; 0x0042db37 movzx eax, word [rsi] | eax = *(rsi); 0x0042db3a xor ebp, ebp | ebp = 0; 0x0042db3c test r8d, r8d | | if (r8d == 0) { 0x0042db3f je 0x42dbf7 | goto label_4; | } 0x0042db45 test ax, ax | | if (ax == 0) { 0x0042db48 je 0x42dbc4 | goto label_5; | } 0x0042db4a mov rcx, r15 | rcx = r15; 0x0042db4d jmp 0x42db68 | goto label_6; | label_0: 0x0042db50 cmp eax, 0x800 | 0x0042db55 sbb rbp, 0 | 0x0042db59 add rbp, 3 | rbp += 3; | do { | label_2: 0x0042db5d movzx eax, word [rdx] | eax = *(rdx); 0x0042db60 mov rcx, rdx | rcx = rdx; 0x0042db63 test ax, ax | | if (ax == 0) { 0x0042db66 je 0x42dbc4 | goto label_5; | } | label_6: 0x0042db68 rol ax, 8 | ax = rotate_left16 (ax, 8); 0x0042db6c cmp ax, 0x7f | | if (ax > 0x7f) { 0x0042db70 ja 0x42db80 | goto label_7; | } 0x0042db72 add rcx, 2 | rcx += 2; 0x0042db76 inc rbp | rbp++; | label_1: 0x0042db79 mov rdx, rcx | rdx = rcx; 0x0042db7c jmp 0x42db5d | | } while (1); | label_7: 0x0042db80 movzx eax, ax | eax = (int32_t) ax; 0x0042db83 mov esi, eax | esi = eax; 0x0042db85 and esi, 0xf800 | esi &= 0xf800; 0x0042db8b lea rdx, [rcx + 2] | rdx = rcx + 2; 0x0042db8f cmp esi, 0xd800 | | if (esi != 0xd800) { 0x0042db95 jne 0x42db50 | goto label_0; | } 0x0042db97 and eax, 0xfc00 | eax &= 0xfc00; 0x0042db9c cmp eax, 0xd800 | | if (eax == 0xd800) { 0x0042dba1 jne 0x42dbbf | 0x0042dba3 movzx eax, word [rdx] | eax = *(rdx); 0x0042dba6 and eax, 0xfc | eax &= 0xfc; 0x0042dbab movzx eax, ax | eax = (int32_t) ax; 0x0042dbae cmp eax, 0xdc | | if (eax != 0xdc) { 0x0042dbb3 jne 0x42dbbf | goto label_8; | } 0x0042dbb5 add rcx, 4 | rcx += 4; 0x0042dbb9 add rbp, 4 | rbp += 4; 0x0042dbbd jmp 0x42db79 | goto label_1; | } | label_8: 0x0042dbbf inc rbp | rbp++; 0x0042dbc2 jmp 0x42db5d | goto label_2; | label_5: 0x0042dbc4 inc rbp | rbp++; 0x0042dbc7 cmp rbp, qword [r13 + 0x18] | | if (rbp > *((r13 + 0x18))) { 0x0042dbcb jbe 0x42dbe4 | 0x0042dbcd cmp rbp, 0xffffffffffffffff | | if (rbp == -1) { 0x0042dbd1 je 0x42dd0c | goto label_9; | } 0x0042dbd7 mov rdi, r13 | 0x0042dbda mov rsi, rbp | 0x0042dbdd xor edx, edx | 0x0042dbdf call 0x437da0 | ax = bsl::basic_string,bsl::allocator>::privateResizeRaw(unsigned long,char) (r13, rbp, 0); | } 0x0042dbe4 cmp qword [r13 + 0x20], 0x17 | | if (*((r13 + 0x20)) != 0x17) { 0x0042dbe9 jne 0x42dcb2 | goto label_10; | } 0x0042dbef mov rdi, r13 | rdi = r13; 0x0042dbf2 jmp 0x42dcb6 | goto label_11; | label_4: 0x0042dbf7 test ax, ax | | if (ax == 0) { 0x0042dbfa je 0x42dc8a | goto label_12; | } 0x0042dc00 mov rcx, r15 | rcx = r15; 0x0042dc03 jmp 0x42dc28 | | while (esi != 0xd800) { 0x0042dc10 cmp eax, 0x800 | 0x0042dc15 sbb rbp, 0 | 0x0042dc19 add rbp, 3 | rbp += 3; | label_3: 0x0042dc1d movzx eax, word [rdx] | eax = *(rdx); 0x0042dc20 mov rcx, rdx | rcx = rdx; 0x0042dc23 test ax, ax | | if (ax == 0) { 0x0042dc26 je 0x42dc8a | goto label_12; | } 0x0042dc28 cmp ax, 0x7f | | if (ax <= 0x7f) { 0x0042dc2c ja 0x42dc40 | 0x0042dc2e add rcx, 2 | rcx += 2; 0x0042dc32 inc rbp | rbp++; 0x0042dc35 jmp 0x42dc80 | goto label_13; | } 0x0042dc40 movzx eax, ax | eax = (int32_t) ax; 0x0042dc43 mov esi, eax | esi = eax; 0x0042dc45 and esi, 0xf800 | esi &= 0xf800; 0x0042dc4b lea rdx, [rcx + 2] | rdx = rcx + 2; 0x0042dc4f cmp esi, 0xd800 | 0x0042dc55 jne 0x42dc10 | | } 0x0042dc57 and eax, 0xfc00 | eax &= 0xfc00; 0x0042dc5c cmp eax, 0xd800 | | if (eax == 0xd800) { 0x0042dc61 jne 0x42dc85 | 0x0042dc63 movzx eax, word [rdx] | eax = *(rdx); 0x0042dc66 and eax, 0xfc00 | eax &= 0xfc00; 0x0042dc6b movzx eax, ax | eax = (int32_t) ax; 0x0042dc6e cmp eax, 0xdc00 | | if (eax != 0xdc00) { 0x0042dc73 jne 0x42dc85 | goto label_14; | } 0x0042dc75 add rcx, 4 | rcx += 4; 0x0042dc79 add rbp, 4 | rbp += 4; 0x0042dc7d nop dword [rax] | | label_13: 0x0042dc80 mov rdx, rcx | rdx = rcx; 0x0042dc83 jmp 0x42dc1d | goto label_3; | } | label_14: 0x0042dc85 inc rbp | rbp++; 0x0042dc88 jmp 0x42dc1d | goto label_3; | label_12: 0x0042dc8a inc rbp | rbp++; 0x0042dc8d cmp rbp, qword [r13 + 0x18] | | if (rbp > *((r13 + 0x18))) { 0x0042dc91 jbe 0x42dca6 | 0x0042dc93 cmp rbp, 0xffffffffffffffff | | if (rbp == -1) { 0x0042dc97 je 0x42dd0c | goto label_9; | } 0x0042dc99 mov rdi, r13 | 0x0042dc9c mov rsi, rbp | 0x0042dc9f xor edx, edx | 0x0042dca1 call 0x437da0 | bsl::basic_string,bsl::allocator>::privateResizeRaw(unsigned long,char) (r13, rbp, 0); | } 0x0042dca6 cmp qword [r13 + 0x20], 0x17 | | if (*((r13 + 0x20)) == 0x17) { 0x0042dcab jne 0x42dcca | 0x0042dcad mov rdi, r13 | rdi = r13; 0x0042dcb0 jmp 0x42dcce | goto label_15; | label_10: 0x0042dcb2 mov rdi, qword [r13] | rdi = *(r13); | label_11: 0x0042dcb6 movsx r8d, r12b | r8d = (int32_t) r12b; 0x0042dcba mov rcx, rsp | rcx = rsp; 0x0042dcbd mov rsi, r15 | rsi = r15; 0x0042dcc0 mov rdx, r14 | rdx = r14; 0x0042dcc3 call 0x432f50 | int(anonymousnamespace)::localUtf16ToUtf8,(anonymousnamespace)::Swapper>(char*,(anonymousnamespace)::NoOpCapacity,unsignedshortconst*,(anonymousnamespace)::Utf16::ZeroBasedEnd,(anonymousnamespace)::Swapper,unsigned long*,unsigned long*,char) (); 0x0042dcc8 jmp 0x42dce0 | | } else { 0x0042dcca mov rdi, qword [r13] | rdi = *(r13); | label_15: 0x0042dcce movsx r8d, r12b | r8d = (int32_t) r12b; 0x0042dcd2 mov rcx, rsp | rcx = rsp; 0x0042dcd5 mov rsi, r15 | rsi = r15; 0x0042dcd8 mov rdx, r14 | rdx = r14; 0x0042dcdb call 0x432dc0 | eax = int(anonymousnamespace)::localUtf16ToUtf8,(anonymousnamespace)::NoOpSwapper>(char*,(anonymousnamespace)::NoOpCapacity,unsignedshortconst*,(anonymousnamespace)::Utf16::ZeroBasedEnd,(anonymousnamespace)::NoOpSwapper,unsigned long*,unsigned long*,char) (); | } 0x0042dce0 mov ebx, eax | ebx = eax; 0x0042dce2 mov rsi, qword [rsp] | rsi = *(rsp); 0x0042dce6 cmp rsi, rbp | 0x0042dce9 test rsi, rsi | | if (rsi != 0) { 0x0042dcec je 0x42dd0c | 0x0042dcee dec rsi | rsi--; 0x0042dcf1 mov rdi, r13 | 0x0042dcf4 xor edx, edx | 0x0042dcf6 call 0x437da0 | bsl::basic_string,bsl::allocator>::privateResizeRaw(unsigned long,char) (r13, rsi, 0); 0x0042dcfb mov eax, ebx | eax = ebx; 0x0042dcfd add rsp, 8 | 0x0042dd01 pop rbx | 0x0042dd02 pop r12 | 0x0042dd04 pop r13 | 0x0042dd06 pop r14 | 0x0042dd08 pop r15 | 0x0042dd0a pop rbp | 0x0042dd0b ret | return eax; | } | label_9: 0x0042dd0c mov edi, 0x45f5e2 | 0x0042dd11 call 0x435460 | return BloombergLP::bslstl::StdExceptUtil::throwLengthError(char const*) ("string<...>::resize(n): string too long"); | }