; assembly | /* r2dec pseudo code output */ | /* bdlde_charconvertutf16.t/none @ 0x42de30 */ | #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__unsigned_long__char__BloombergLP::bdlde::ByteOrder::Enum_ () | int64_t method_BloombergLP::bdlde::CharConvertUtf16_utf16ToUtf8_bsl::basic_string_char_std::_1::char_traits_char_bsl::allocator_char_unsigned_short_const_unsigned_long_unsigned_long_char_BloombergLP::bdlde::ByteOrder::Enum_ (int64_t arg6, int64_t arg5, char * arg4, char * arg3, uint32_t arg2, char * arg1) { | int64_t var_8h; | r9 = arg6; | r8 = arg5; | rcx = arg4; | rdx = arg3; | rsi = arg2; | rdi = arg1; | /* BloombergLP::bdlde::CharConvertUtf16::utf16ToUtf8(bsl::basic_string, bsl::allocator >*, unsigned short const*, unsigned long, unsigned long*, char, BloombergLP::bdlde::ByteOrder::Enum) */ 0x0042de30 push rbp | 0x0042de31 push r15 | 0x0042de33 push r14 | 0x0042de35 push r12 | 0x0042de37 push rbx | 0x0042de38 sub rsp, 0x10 | 0x0042de3c mov ebp, r8d | 0x0042de3f mov r14, rcx | r14 = rcx; 0x0042de42 mov r15, rsi | r15 = rsi; 0x0042de45 mov r12, rdi | r12 = rdi; 0x0042de48 lea rbx, [rsi + rdx*2] | rbx = rsi + rdx*2; 0x0042de4c xor esi, esi | esi = 0; 0x0042de4e test r9d, r9d | | if (r9d == 0) { 0x0042de51 je 0x42df1c | goto label_6; | } 0x0042de57 test rdx, rdx | | if (rdx <= 0) { 0x0042de5a jle 0x42deea | goto label_7; | } 0x0042de60 mov rax, r15 | rax = r15; 0x0042de63 jmp 0x42de86 | goto label_8; | label_0: 0x0042de70 cmp edx, 0x800 | 0x0042de76 sbb rsi, 0 | 0x0042de7a add rsi, 3 | rsi += 3; | do { | label_2: 0x0042de7e mov rax, rcx | rax = rcx; 0x0042de81 cmp rcx, rbx | | if (rcx >= rbx) { 0x0042de84 jae 0x42deea | goto label_7; | } | label_8: 0x0042de86 movzx ecx, word [rax] | ecx = *(rax); 0x0042de89 rol cx, 8 | cx = rotate_left16 (cx, 8); 0x0042de8d cmp cx, 0x7f | | if (cx > 0x7f) { 0x0042de91 ja 0x42dea0 | goto label_9; | } 0x0042de93 add rax, 2 | rax += 2; 0x0042de97 inc rsi | rsi++; | label_1: 0x0042de9a mov rcx, rax | rcx = rax; 0x0042de9d jmp 0x42de7e | | } while (1); | label_9: 0x0042dea0 movzx edx, cx | edx = (int32_t) cx; 0x0042dea3 mov edi, edx | edi = edx; 0x0042dea5 and edi, 0xf800 | edi &= 0xf800; 0x0042deab lea rcx, [rax + 2] | rcx = rax + 2; 0x0042deaf cmp edi, 0xd800 | | if (edi != 0xd800) { 0x0042deb5 jne 0x42de70 | goto label_0; | } 0x0042deb7 cmp rcx, rbx | | if (rcx < rbx) { 0x0042deba jae 0x42dee5 | 0x0042debc and edx, 0xfc00 | edx &= 0xfc00; 0x0042dec2 cmp edx, 0xd800 | | if (edx != 0xd800) { 0x0042dec8 jne 0x42dee5 | goto label_10; | } 0x0042deca movzx edx, word [rcx] | edx = *(rcx); 0x0042decd and edx, 0xfc | edx &= 0xfc; 0x0042ded3 cmp edx, 0xdc | | if (edx != 0xdc) { 0x0042ded9 jne 0x42dee5 | goto label_10; | } 0x0042dedb add rax, 4 | rax += 4; 0x0042dedf add rsi, 4 | rsi += 4; 0x0042dee3 jmp 0x42de9a | goto label_1; | } | label_10: 0x0042dee5 inc rsi | rsi++; 0x0042dee8 jmp 0x42de7e | goto label_2; | label_7: 0x0042deea inc rsi | rsi++; 0x0042deed cmp rsi, qword [r12 + 0x18] | | if (rsi > *((r12 + 0x18))) { 0x0042def2 jbe 0x42df08 | 0x0042def4 cmp rsi, 0xffffffffffffffff | | if (rsi == -1) { 0x0042def8 je 0x42e02e | goto label_11; | } 0x0042defe mov rdi, r12 | 0x0042df01 xor edx, edx | 0x0042df03 call 0x437b80 | bsl::basic_string,bsl::allocator>::privateResizeRaw(unsigned long,char) (r12, rsi, 0); | } 0x0042df08 cmp qword [r12 + 0x20], 0x17 | | if (*((r12 + 0x20)) != 0x17) { 0x0042df0e jne 0x42dfce | goto label_12; | } 0x0042df14 mov rdi, r12 | rdi = r12; 0x0042df17 jmp 0x42dfd2 | goto label_13; | label_6: 0x0042df1c test rdx, rdx | | if (rdx <= 0) { 0x0042df1f jle 0x42dfa7 | goto label_14; | } 0x0042df25 mov rax, r15 | rax = r15; 0x0042df28 jmp 0x42df46 | goto label_15; | label_3: 0x0042df30 cmp edx, 0x800 | 0x0042df36 sbb rsi, 0 | 0x0042df3a add rsi, 3 | rsi += 3; | do { | label_5: 0x0042df3e mov rax, rcx | rax = rcx; 0x0042df41 cmp rcx, rbx | | if (rcx >= rbx) { 0x0042df44 jae 0x42dfa7 | goto label_14; | } | label_15: 0x0042df46 movzx edx, word [rax] | edx = *(rax); 0x0042df49 cmp edx, 0x7f | | if (edx > 0x7f) { 0x0042df4c ja 0x42df60 | goto label_16; | } 0x0042df4e add rax, 2 | rax += 2; 0x0042df52 inc rsi | rsi++; | label_4: 0x0042df55 mov rcx, rax | rcx = rax; 0x0042df58 jmp 0x42df3e | | } while (1); | label_16: 0x0042df60 mov edi, edx | edi = edx; 0x0042df62 and edi, 0xf800 | edi &= 0xf800; 0x0042df68 lea rcx, [rax + 2] | rcx = rax + 2; 0x0042df6c cmp edi, 0xd800 | | if (edi != 0xd800) { 0x0042df72 jne 0x42df30 | goto label_3; | } 0x0042df74 cmp rcx, rbx | | if (rcx < rbx) { 0x0042df77 jae 0x42dfa2 | 0x0042df79 and edx, 0xfc00 | edx &= 0xfc00; 0x0042df7f cmp edx, 0xd800 | | if (edx != 0xd800) { 0x0042df85 jne 0x42dfa2 | goto label_17; | } 0x0042df87 movzx edx, word [rcx] | edx = *(rcx); 0x0042df8a and edx, 0xfc00 | edx &= 0xfc00; 0x0042df90 cmp edx, 0xdc00 | | if (edx != 0xdc00) { 0x0042df96 jne 0x42dfa2 | goto label_17; | } 0x0042df98 add rax, 4 | rax += 4; 0x0042df9c add rsi, 4 | rsi += 4; 0x0042dfa0 jmp 0x42df55 | goto label_4; | } | label_17: 0x0042dfa2 inc rsi | rsi++; 0x0042dfa5 jmp 0x42df3e | goto label_5; | label_14: 0x0042dfa7 inc rsi | rsi++; 0x0042dfaa cmp rsi, qword [r12 + 0x18] | | if (rsi > *((r12 + 0x18))) { 0x0042dfaf jbe 0x42dfc1 | 0x0042dfb1 cmp rsi, 0xffffffffffffffff | | if (rsi == -1) { 0x0042dfb5 je 0x42e02e | goto label_11; | } 0x0042dfb7 mov rdi, r12 | 0x0042dfba xor edx, edx | 0x0042dfbc call 0x437b80 | bsl::basic_string,bsl::allocator>::privateResizeRaw(unsigned long,char) (r12, rsi, 0); | } 0x0042dfc1 cmp qword [r12 + 0x20], 0x17 | | if (*((r12 + 0x20)) == 0x17) { 0x0042dfc7 jne 0x42dfeb | 0x0042dfc9 mov rdi, r12 | rdi = r12; 0x0042dfcc jmp 0x42dfef | goto label_18; | label_12: 0x0042dfce mov rdi, qword [r12] | rdi = *(r12); | label_13: 0x0042dfd2 movsx r9d, bpl | r9d = (int32_t) bpl; 0x0042dfd6 lea r8, [rsp + 8] | r8 = rsp + 8; 0x0042dfdb mov rsi, r15 | rsi = r15; 0x0042dfde mov rdx, rbx | rdx = rbx; 0x0042dfe1 mov rcx, r14 | rcx = r14; 0x0042dfe4 call 0x433060 | int(anonymousnamespace)::localUtf16ToUtf8,(anonymousnamespace)::Swapper>(char*,(anonymousnamespace)::NoOpCapacity,unsignedshortconst*,(anonymousnamespace)::Utf16::PtrBasedEnd,(anonymousnamespace)::Swapper,unsigned long*,unsigned long*,char) (); 0x0042dfe9 jmp 0x42e006 | | } else { 0x0042dfeb mov rdi, qword [r12] | rdi = *(r12); | label_18: 0x0042dfef movsx r9d, bpl | r9d = (int32_t) bpl; 0x0042dff3 lea r8, [rsp + 8] | r8 = rsp + 8; 0x0042dff8 mov rsi, r15 | rsi = r15; 0x0042dffb mov rdx, rbx | rdx = rbx; 0x0042dffe mov rcx, r14 | rcx = r14; 0x0042e001 call 0x432ed0 | eax = int(anonymousnamespace)::localUtf16ToUtf8,(anonymousnamespace)::NoOpSwapper>(char*,(anonymousnamespace)::NoOpCapacity,unsignedshortconst*,(anonymousnamespace)::Utf16::PtrBasedEnd,(anonymousnamespace)::NoOpSwapper,unsigned long*,unsigned long*,char) (); | } 0x0042e006 mov rsi, qword [rsp + 8] | rsi = *((rsp + 8)); 0x0042e00b test rsi, rsi | | if (rsi != 0) { 0x0042e00e je 0x42e02e | 0x0042e010 mov ebx, eax | ebx = eax; 0x0042e012 dec rsi | rsi--; 0x0042e015 mov rdi, r12 | 0x0042e018 xor edx, edx | 0x0042e01a call 0x437b80 | bsl::basic_string,bsl::allocator>::privateResizeRaw(unsigned long,char) (r12, rsi, 0); 0x0042e01f mov eax, ebx | eax = ebx; 0x0042e021 add rsp, 0x10 | 0x0042e025 pop rbx | 0x0042e026 pop r12 | 0x0042e028 pop r14 | 0x0042e02a pop r15 | 0x0042e02c pop rbp | 0x0042e02d ret | return rax; | } | label_11: 0x0042e02e mov edi, 0x45f3de | 0x0042e033 call 0x435240 | return BloombergLP::bslstl::StdExceptUtil::throwLengthError(char const*) ("string<...>::resize(n): string too long"); | }