// File: /workspace/github_cpp_makefile_star2_O3/tdv[P]boss/boss/include/common/string.h
// Function: Boss::String::IsEqual(Boss::IString*) const
virtual RetCode BOSS_CALL IsEqual(IString *str) const
    {
      if (!str)
        return Status::InvalidArgument;
      if (str == this)
        return Status::Ok;
      try
      {
        std::lock_guard<std::recursive_mutex> Lock(Mtx);
        UInt StrType = UnknownStringType;
        if (str->GetType(&StrType) != Status::Ok)
          return Status::Fail;
        if (StrType != Type)
          return Status::False;
        if (Type == UnknownStringType)
          return Status::Ok;
        UInt StrLength = 0;
        if (str->GetLength(&StrLength) != Status::Ok)
          return Status::Fail;
        if (StrLength != Length)
          return Status::False;
        RefObjPtr<IBuffer> Buf;
        if (str->GetString(StrType, Buf.GetPPtr()) != Status::Ok)
          return Status::Fail;
        void const *StrBufData = 0;
        UInt StrBufSize = 0;
        if (Buf->GetSize(&StrBufSize) != Status::Ok || Buf->GetData(&StrBufData) != Status::Ok)
          return Status::Fail;
        void const *BufData = 0;
        UInt BufSize = 0;
        if (Data->GetSize(&BufSize) != Status::Ok || Data->GetData(&BufData) != Status::Ok)
          return Status::Fail;
        return StrBufSize == BufSize && !std::memcmp(StrBufData, BufData, StrBufSize);
      }
      catch (std::exception const &)
      {
      }
      return Status::Fail;
    }

// Assembly:
pushq %rbp
pushq %r15
pushq %r14
pushq %rbx
subq $0x38, %rsp
testq %rsi, %rsi
je 0x18751
movq %rsi, %r15
movq %rdi, %r14
leaq 0x8(%rdi), %rax
cmpq %rsi, %rax
je 0x18758
leaq 0x18(%r14), %rbx
movq %rbx, %rdi
callq 0x145d0
testl %eax, %eax
jne 0x18773
leaq 0xc(%rsp), %rsi
movl $0x0, (%rsi)
movq (%r15), %rax
movq %r15, %rdi
callq *0x30(%rax)
movl $0x2, %ebp
testl %eax, %eax
jne 0x1875e
movl 0xc(%rsp), %eax
movl $0x1, %ebp
cmpl 0x40(%r14), %eax
jne 0x1875e
testl %eax, %eax
je 0x1875c
leaq 0x24(%rsp), %rsi
movl $0x0, (%rsi)
movq (%r15), %rax
movq %r15, %rdi
callq *0x28(%rax)
movl $0x2, %ebp
testl %eax, %eax
jne 0x1875e
movl 0x24(%rsp), %eax
movl $0x1, %ebp
cmpl 0x44(%r14), %eax
jne 0x1875e
leaq 0x10(%rsp), %rdx
movq $0x0, (%rdx)
movl 0xc(%rsp), %esi
movq (%r15), %rax
movq %r15, %rdi
callq *0x38(%rax)
movl $0x2, %ebp
testl %eax, %eax
jne 0x1873f
movq $0x0, 0x30(%rsp)
leaq 0x20(%rsp), %rsi
movl $0x0, (%rsi)
movq 0x10(%rsp), %rdi
movq (%rdi), %rax
callq *0x30(%rax)
movl $0x2, %ebp
testl %eax, %eax
jne 0x1873f
movq 0x10(%rsp), %rdi
movq (%rdi), %rax
leaq 0x30(%rsp), %rsi
callq *0x28(%rax)
testl %eax, %eax
jne 0x1873f
movq $0x0, 0x28(%rsp)
leaq 0x1c(%rsp), %rsi
movl $0x0, (%rsi)
movq 0x48(%r14), %rdi
movq (%rdi), %rax
callq *0x30(%rax)
movl $0x2, %ebp
testl %eax, %eax
jne 0x1873f
movq 0x48(%r14), %rdi
movq (%rdi), %rax
leaq 0x28(%rsp), %rsi
callq *0x28(%rax)
testl %eax, %eax
jne 0x1873f
movl 0x20(%rsp), %edx
xorl %ebp, %ebp
cmpl 0x1c(%rsp), %edx
jne 0x1873f
movq 0x30(%rsp), %rdi
movq 0x28(%rsp), %rsi
callq 0x143c0
xorl %ebp, %ebp
testl %eax, %eax
sete %bpl
movq 0x10(%rsp), %rdi
testq %rdi, %rdi
je 0x1875e
movq (%rdi), %rax
callq *0x18(%rax)
jmp 0x1875e
movl $0x5, %ebp
jmp 0x18766
xorl %ebp, %ebp
jmp 0x18766
xorl %ebp, %ebp
movq %rbx, %rdi
callq 0x14630
movl %ebp, %eax
addq $0x38, %rsp
popq %rbx
popq %r14
popq %r15
popq %rbp
retq
movl %eax, %edi
callq 0x16169
jmp 0x18786
jmp 0x18786
movq %rax, %rdi
callq 0x17887
movq %rdx, %r15
movq %rax, %r14
movq 0x10(%rsp), %rdi
testq %rdi, %rdi
je 0x187a8
movq (%rdi), %rax
callq *0x18(%rax)
jmp 0x187a8
jmp 0x1877e
jmp 0x187a2
movq %rdx, %r15
movq %rax, %r14
movq %rbx, %rdi
callq 0x14630
jmp 0x187b8
movq %rdx, %r15
movq %rax, %r14
movq %r14, %rdi
cmpl $0x1, %r15d
jne 0x187d2
callq 0x19f30
callq 0x19fa0
movl $0x2, %ebp
jmp 0x18766
callq 0xba430
nop