Advertisement
Wyrd

boost shared_ptr move semantics test ASM: f

Feb 22nd, 2012
338
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. ; boost::shared_ptr< CBase > f()
  2. ;    25:    {
  3. 01041050  push        0FFFFFFFFh  
  4. 01041052  push        offset __ehhandler$?f@?A0xa61281ce@@YA?AV?$shared_ptr@VCBase@@@boost@@XZ (1041E81h)  
  5. 01041057  mov         eax,dword ptr fs:[00000000h]  
  6. 0104105D  push        eax  
  7. 0104105E  mov         dword ptr fs:[0],esp  
  8. 01041065  sub         esp,1Ch  
  9. 01041068  push        esi  
  10. 01041069  push        edi  
  11. 0104106A  mov         edi,dword ptr [esp+34h]  
  12. ;    26:        auto pRes = boost::static_pointer_cast< CBase >( boost::make_shared< CDerived >() );
  13. 0104106E  lea         eax,[esp+18h]  
  14. 01041072  push        eax  
  15. 01041073  mov         dword ptr [esp+10h],0  
  16. 0104107B  call        boost::make_shared<CDerived> (10411C0h)  
  17. 01041080  mov         ecx,eax  
  18. 01041082  add         esp,4  
  19. 01041085  lea         eax,[esp+10h]  
  20. 01041089  call        boost::static_pointer_cast<CBase,CDerived> (10412E0h)  
  21. 0104108E  mov         dword ptr [esp+2Ch],1  
  22. 01041096  mov         eax,dword ptr [esp+1Ch]  
  23. 0104109A  test        eax,eax  
  24. 0104109C  je          `anonymous namespace`::f+7Ah (10410CAh) ; <----------- NO JUMP
  25. 0104109E  mov         esi,eax  
  26. 010410A0  add         eax,4  
  27. 010410A3  or          ecx,0FFFFFFFFh  
  28. 010410A6  lock xadd   dword ptr [eax],ecx  ; <-------------- CALLED (decref after temp ptr destruction)
  29. 010410AA  jne         `anonymous namespace`::f+7Ah (10410CAh)  ; <--------------- JUMP OCCURS
  30. 010410AC  mov         edx,dword ptr [esi]  
  31. 010410AE  mov         eax,dword ptr [edx+4]  
  32. 010410B1  mov         ecx,esi  
  33. 010410B3  call        eax  
  34. 010410B5  lea         ecx,[esi+8]  
  35. 010410B8  or          edx,0FFFFFFFFh  
  36. 010410BB  lock xadd   dword ptr [ecx],edx  
  37. 010410BF  jne         `anonymous namespace`::f+7Ah (10410CAh)  
  38. 010410C1  mov         eax,dword ptr [esi]  
  39. 010410C3  mov         edx,dword ptr [eax+8]  
  40. 010410C6  mov         ecx,esi  
  41. 010410C8  call        edx  
  42. ;    27:        // ... Doing something with pRes
  43. ;    28:        return std::move( pRes );
  44. 010410CA  mov         eax,dword ptr [esp+10h]  
  45. 010410CE  mov         dword ptr [edi],eax  
  46. 010410D0  mov         eax,dword ptr [esp+14h]  
  47. 010410D4  mov         dword ptr [edi+4],0  
  48. 010410DB  mov         esi,dword ptr [edi+4]  
  49. 010410DE  mov         dword ptr [edi+4],eax  
  50. 010410E1  mov         dword ptr [esp+0Ch],1  
  51. 010410E9  mov         byte ptr [esp+2Ch],0  
  52. 010410EE  test        esi,esi  
  53. 010410F0  je          `anonymous namespace`::f+0CCh (104111Ch) ; <-------------- JUMP OCCURS
  54. 010410F2  lea         ecx,[esi+4]  
  55. 010410F5  or          edx,0FFFFFFFFh  
  56. 010410F8  lock xadd   dword ptr [ecx],edx  
  57. 010410FC  jne         `anonymous namespace`::f+0CCh (104111Ch)  
  58. 010410FE  mov         eax,dword ptr [esi]  
  59. 01041100  mov         edx,dword ptr [eax+4]  
  60. 01041103  mov         ecx,esi  
  61. 01041105  call        edx  
  62. 01041107  lea         eax,[esi+8]  
  63. 0104110A  or          ecx,0FFFFFFFFh  
  64. 0104110D  lock xadd   dword ptr [eax],ecx  
  65. 01041111  jne         `anonymous namespace`::f+0CCh (104111Ch)  
  66. 01041113  mov         edx,dword ptr [esi]  
  67. 01041115  mov         eax,dword ptr [edx+8]  
  68. 01041118  mov         ecx,esi  
  69. 0104111A  call        eax  
  70. ;    29:    }
  71. 0104111C  mov         ecx,dword ptr [esp+24h]  
  72. 01041120  mov         eax,edi  
  73. 01041122  pop         edi  
  74. 01041123  mov         dword ptr fs:[0],ecx  
  75. 0104112A  pop         esi  
  76. 0104112B  add         esp,28h  
  77. 0104112E  ret
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement