ywkaras commented on issue #8003:
URL: https://github.com/apache/trafficserver/issues/8003#issuecomment-882973667


   If you're doing a dynamic cast of a pointer, and checking that the result is 
not zero with an assert, you can use this instead:
   
https://github.com/apache/trafficserver/blob/ea5be6f04c2a087f0581f4cb2c67f693c7ff71f6/include/tscore/ink_assert.h#L72
   
   If you're doing a dynamic cast of a reference, and not catching any 
exception it might throw, you can use this instead:
   
https://github.com/apache/trafficserver/blob/ea5be6f04c2a087f0581f4cb2c67f693c7ff71f6/include/tscore/ink_assert.h#L90
   
   But TS will get into a corrupt state, rather than abort, in a release build 
if the cast is invalid.
   
   If you're actually using dynamic_cast for runtime type detection, you can 
instead keep track of the type in a member variable, or use typeid:
   ```
   enum class T { B, C };
   
   struct A
   {
     A(T t_) : t(t_) {}
     virtual ~A();
   
     T t;
   };
   
   struct B : public A
   {
     B() : A(T::B) {}
   };
   
   struct C : public A
   {
     C() : A(T::C) {}
   };
   
   B * a_to_b1(A *a)
   {
     return a->t == T::B ? static_cast<B *>(a) : nullptr;
   }
   
   B * a_to_b2(A *a)
   {
     return dynamic_cast<B *>(a);
   }
   
   #include <typeinfo>
   
   B * a_to_b3(A *a)
   {
     return typeid(*a) == typeid(B) ? static_cast<B *>(a) : nullptr;
   }
   ```
   Here is the resulting assembler (compiled with O3)
   ```
        .section        __TEXT,__text,regular,pure_instructions
        .build_version macos, 10, 15, 4 sdk_version 10, 15, 4
        .globl  __Z7a_to_b1P1A          ## -- Begin function _Z7a_to_b1P1A
        .p2align        4, 0x90
   __Z7a_to_b1P1A:                         ## @_Z7a_to_b1P1A
        .cfi_startproc
   ## %bb.0:
        pushq   %rbp
        .cfi_def_cfa_offset 16
        .cfi_offset %rbp, -16
        movq    %rsp, %rbp
        .cfi_def_cfa_register %rbp
        xorl    %eax, %eax
        cmpl    $0, 8(%rdi)
        cmoveq  %rdi, %rax
        popq    %rbp
        retq
        .cfi_endproc
                                           ## -- End function
        .globl  __Z7a_to_b2P1A          ## -- Begin function _Z7a_to_b2P1A
        .p2align        4, 0x90
   __Z7a_to_b2P1A:                         ## @_Z7a_to_b2P1A
        .cfi_startproc
   ## %bb.0:
        testq   %rdi, %rdi
        je      LBB1_1
   ## %bb.2:
        pushq   %rbp
        .cfi_def_cfa_offset 16
        .cfi_offset %rbp, -16
        movq    %rsp, %rbp
        .cfi_def_cfa_register %rbp
        movq    __ZTI1A@GOTPCREL(%rip), %rsi
        movq    __ZTI1B@GOTPCREL(%rip), %rdx
        xorl    %ecx, %ecx
        popq    %rbp
        jmp     ___dynamic_cast         ## TAILCALL
   LBB1_1:
        xorl    %eax, %eax
        retq
        .cfi_endproc
                                           ## -- End function
        .globl  __Z7a_to_b3P1A          ## -- Begin function _Z7a_to_b3P1A
        .p2align        4, 0x90
   __Z7a_to_b3P1A:                         ## @_Z7a_to_b3P1A
        .cfi_startproc
   ## %bb.0:
        pushq   %rbp
        .cfi_def_cfa_offset 16
        .cfi_offset %rbp, -16
        movq    %rsp, %rbp
        .cfi_def_cfa_register %rbp
        pushq   %rbx
        pushq   %rax
        .cfi_offset %rbx, -24
        testq   %rdi, %rdi
        je      LBB2_5
   ## %bb.1:
        movq    %rdi, %rbx
        movq    (%rdi), %rax
        movq    -8(%rax), %rax
        movq    8(%rax), %rdi
        cmpq    __ZTS1B@GOTPCREL(%rip), %rdi
        je      LBB2_4
   ## %bb.2:
        movq    __ZTS1B@GOTPCREL(%rip), %rsi
        callq   _strcmp
        testl   %eax, %eax
        je      LBB2_4
   ## %bb.3:
        xorl    %ebx, %ebx
   LBB2_4:
        movq    %rbx, %rax
        addq    $8, %rsp
        popq    %rbx
        popq    %rbp
        retq
   LBB2_5:
        callq   ___cxa_bad_typeid
        .cfi_endproc
                                           ## -- End function
        .section        __TEXT,__const
        .globl  __ZTS1B                 ## @_ZTS1B
        .weak_definition        __ZTS1B
   __ZTS1B:
        .asciz  "1B"
   
        .section        __DATA,__const
        .globl  __ZTI1B                 ## @_ZTI1B
        .weak_definition        __ZTI1B
        .p2align        3
   __ZTI1B:
        .quad   __ZTVN10__cxxabiv120__si_class_type_infoE+16
        .quad   __ZTS1B
        .quad   __ZTI1A
   ```
   Explicitly keeping track of the type looks like it would probably be faster. 
 Not clear if using typeid would be any faster.


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]


Reply via email to