**************************************************************************** **** **************************************************************************** **** **************************************************************************** **** int main( int /*argc*/, char * * /*argv*/ ) { 0124112E push ebp 0124112F mov ebp,esp 01241131 and esp,0FFFFFFF8h 01241134 push 0FFFFFFFFh 01241136 push offset __ehhandler$_main (124210Ah) 0124113B mov eax,dword ptr fs:[00000000h] 01241141 push eax 01241142 mov dword ptr fs:[0],esp 01241149 sub esp,50h using namespace boost; X x; function foof( boost::bind( &X::foo, &x, _1 ) ); 0124114C lea eax,[esp] 0124114F mov dword ptr [esp+8],eax 01241153 lea eax,[esp+4] 01241157 push ebx 01241158 mov ecx,offset X::foo (1241125h) 0124115D push eax 0124115E mov dword ptr [esp+0Ch],ecx 01241162 call boost::detail::function::has_empty_target (1241122h) 01241167 xor ebx,ebx 01241169 pop ecx 0124116A test al,al 0124116C jne main+5Eh (124118Ch) 0124116E mov eax,dword ptr [esp+8] 01241172 mov dword ptr [esp+18h],eax 01241176 mov eax,dword ptr [esp+0Ch] 0124117A mov dword ptr [esp+1Ch],eax 0124117E mov eax,offset `boost::function1::assign_to,boost::_bi::list2,boost::arg<1> > > >'::`2'::stored_vtable (12441C0h) 01241183 or eax,1 01241186 mov dword ptr [esp+10h],eax 0124118A jmp main+62h (1241190h) 0124118C mov dword ptr [esp+10h],ebx foof( 0 ); 01241190 push ebx 01241191 lea ecx,[esp+14h] 01241195 mov dword ptr [esp+60h],ebx 01241199 call boost::function1::operator() (12413A4h) function barf; 0124119E mov dword ptr [esp+30h],ebx barf = foof; 012411A2 lea eax,[esp+30h] 012411A6 push eax 012411A7 lea ecx,[esp+14h] 012411AB mov byte ptr [esp+60h],1 012411B0 call boost::function::operator= (124123Bh) barf( 1 ); 012411B5 push 1 012411B7 lea ecx,[esp+34h] 012411BB call boost::function1::operator() (12413A4h) return 0; 012411C0 mov byte ptr [esp+5Ch],bl 012411C4 mov eax,dword ptr [esp+30h] 012411C8 cmp eax,ebx 012411CA je main+0BCh (12411EAh) 012411CC test al,1 012411CE jne main+0B8h (12411E6h) 012411D0 and eax,0FFFFFFFEh 012411D3 mov eax,dword ptr [eax] 012411D5 cmp eax,ebx 012411D7 je main+0B8h (12411E6h) 012411D9 lea ecx,[esp+38h] 012411DD push 2 012411DF push ecx 012411E0 push ecx 012411E1 call eax 012411E3 add esp,0Ch 012411E6 mov dword ptr [esp+30h],ebx 012411EA or dword ptr [esp+5Ch],0FFFFFFFFh 012411EF mov eax,dword ptr [esp+10h] 012411F3 cmp eax,ebx 012411F5 je main+0E3h (1241211h) 012411F7 test al,1 012411F9 jne main+0E3h (1241211h) 012411FB and eax,0FFFFFFFEh 012411FE mov eax,dword ptr [eax] 01241200 cmp eax,ebx 01241202 je main+0E3h (1241211h) 01241204 lea ecx,[esp+18h] 01241208 push 2 0124120A push ecx 0124120B push ecx 0124120C call eax 0124120E add esp,0Ch } 01241211 mov ecx,dword ptr [esp+54h] 01241215 xor eax,eax 01241217 mov dword ptr fs:[0],ecx 0124121E pop ebx 0124121F mov esp,ebp 01241221 pop ebp 01241222 ret **************************************************************************** **** **************************************************************************** **** **************************************************************************** **** "other side/invoker code for the foof( 0 ) call: 00C716B2 mov eax,dword ptr [esp+4] 00C716B6 push dword ptr [esp+8] 00C716BA mov ecx,dword ptr [eax+4] 00C716BD call dword ptr [eax] 00C716BF ret **************************************************************************** **** **************************************************************************** **** **************************************************************************** **** ::operator()(BOOST_FUNCTION_PARMS) const { 008C13A4 mov eax,offset __ehhandler$??R?$function1@HH@boost@@QBEHH@Z (8C20F0h) 008C13A9 call __EH_prolog (8C2038h) if (this->empty()) 008C13AE mov eax,dword ptr [ecx] 008C13B0 sub esp,50h 008C13B3 test eax,eax 008C13B5 jne $LN29 (8C1401h) boost::throw_exception(bad_function_call()); 008C13B7 lea eax,[a0] 008C13BA push eax 008C13BB lea ecx,[ebp-18h] 008C13BE mov dword ptr [a0],offset string "call to empty boost::function" (8C311Ch) 008C13C5 call dword ptr [__imp_std::exception::exception (8C30B4h)] 008C13CB mov dword ptr [ebp-18h],offset boost::bad_function_call::`vftable' (8C3164h) 008C13D2 and dword ptr [ebp-4],0 008C13D6 lea eax,[ebp-18h] 008C13D9 push eax 008C13DA lea esi,[ebp-38h] 008C13DD call boost::enable_error_info (8C15D9h) 008C13E2 lea ecx,[ebp-5Ch] 008C13E5 push ecx 008C13E6 mov ecx,eax 008C13E8 mov byte ptr [ebp-4],1 008C13EC call boost::enable_current_exception > (8C1614h) 008C13F1 pop ecx 008C13F2 pop ecx 008C13F3 push offset __TI7?AV?$clone_impl@U?$error_info_injector@Vbad_function_call@boost@@@excep tion_detail@boost@@@exception_detail@boost@@ (8C36E8h) 008C13F8 lea eax,[ebp-5Ch] 008C13FB push eax 008C13FC call _CxxThrowException (8C2058h) return get_vtable()->invoker (this->functor BOOST_FUNCTION_COMMA BOOST_FUNCTION_ARGS); 008C1401 push dword ptr [a0] 008C1404 add ecx,8 008C1407 and eax,0FFFFFFFEh 008C140A push ecx 008C140B call dword ptr [eax+4] 008C140E pop ecx 008C140F pop ecx } 008C1410 mov ecx,dword ptr [ebp-0Ch] 008C1413 mov dword ptr fs:[0],ecx 008C141A leave 008C141B ret 4 **************************************************************************** **** **************************************************************************** **** **************************************************************************** **** self_type& operator=(const self_type& f) { 008C123B mov eax,offset __ehhandler$??4?$function@$$A6AHH@Z@boost@@QAEAAV01@ABV01@@Z (8C20A4h) 008C1240 call __EH_prolog (8C2038h) 008C1245 sub esp,44h self_type(f).swap(*this); 008C1248 mov eax,dword ptr [ecx] 008C124A push ebx 008C124B xor ebx,ebx 008C124D push esi 008C124E push edi 008C124F mov dword ptr [ebp-30h],ebx 008C1252 cmp eax,ebx 008C1254 je boost::function::operator=+40h (8C127Bh) 008C1256 mov dword ptr [ebp-30h],eax 008C1259 test al,1 008C125B je boost::function::operator=+2Fh (8C126Ah) 008C125D lea esi,[ecx+8] 008C1260 push 6 008C1262 pop ecx 008C1263 lea edi,[ebp-28h] 008C1266 rep movs dword ptr es:[edi],dword ptr [esi] 008C1268 jmp boost::function::operator=+40h (8C127Bh) 008C126A push ebx 008C126B lea edx,[ebp-28h] 008C126E push edx 008C126F add ecx,8 008C1272 and eax,0FFFFFFFEh 008C1275 push ecx 008C1276 call dword ptr [eax] 008C1278 add esp,0Ch 008C127B mov esi,dword ptr [this] 008C127E lea eax,[ebp-30h] 008C1281 mov dword ptr [ebp-4],ebx 008C1284 cmp esi,eax 008C1286 je boost::function::operator=+9Ah (8C12D5h) 008C1288 mov dword ptr [ebp-50h],ebx 008C128B lea eax,[ebp-50h] 008C128E push eax 008C128F lea ecx,[ebp-30h] 008C1292 mov byte ptr [ebp-4],1 008C1296 call boost::function1::move_assign (8C132Fh) 008C129B lea eax,[ebp-30h] 008C129E push eax 008C129F mov ecx,esi 008C12A1 call boost::function1::move_assign (8C132Fh) 008C12A6 push esi 008C12A7 lea ecx,[ebp-50h] 008C12AA call boost::function1::move_assign (8C132Fh) 008C12AF mov byte ptr [ebp-4],bl 008C12B2 mov eax,dword ptr [ebp-50h] 008C12B5 cmp eax,ebx 008C12B7 je boost::function::operator=+9Ah (8C12D5h) 008C12B9 test al,1 008C12BB jne boost::function::operator=+97h (8C12D2h) 008C12BD and eax,0FFFFFFFEh 008C12C0 mov eax,dword ptr [eax] 008C12C2 cmp eax,ebx 008C12C4 je boost::function::operator=+97h (8C12D2h) 008C12C6 lea ecx,[ebp-48h] 008C12C9 push 2 008C12CB push ecx 008C12CC push ecx 008C12CD call eax 008C12CF add esp,0Ch 008C12D2 mov dword ptr [ebp-50h],ebx 008C12D5 or dword ptr [ebp-4],0FFFFFFFFh 008C12D9 mov eax,dword ptr [ebp-30h] 008C12DC cmp eax,ebx 008C12DE je boost::function::operator=+0BEh (8C12F9h) 008C12E0 test al,1 008C12E2 jne boost::function::operator=+0BEh (8C12F9h) 008C12E4 and eax,0FFFFFFFEh 008C12E7 mov eax,dword ptr [eax] 008C12E9 cmp eax,ebx 008C12EB je boost::function::operator=+0BEh (8C12F9h) 008C12ED lea ecx,[ebp-28h] 008C12F0 push 2 008C12F2 push ecx 008C12F3 push ecx 008C12F4 call eax 008C12F6 add esp,0Ch return *this; } 008C12F9 mov ecx,dword ptr [ebp-0Ch] 008C12FC pop edi 008C12FD mov eax,esi 008C12FF pop esi 008C1300 mov dword ptr fs:[0],ecx 008C1307 pop ebx 008C1308 leave 008C1309 ret 4 **************************************************************************** **** **************************************************************************** **** **************************************************************************** **** void move_assign(BOOST_FUNCTION_FUNCTION& f) { 008C132F mov eax,offset __ehhandler$?move_assign@?$function1@HH@boost@@AAEXAAV12@@Z (8C208Ah) 008C1334 call __EH_prolog (8C2038h) 008C1339 push ecx 008C133A push ebx 008C133B mov ebx,ecx 008C133D mov ecx,dword ptr [ebp+8] 008C1340 push esi 008C1341 push edi 008C1342 mov dword ptr [ebp-10h],esp if (&f == this) 008C1345 cmp ebx,ecx 008C1347 je boost::function1::move_assign+4Ch (8C137Bh) return; BOOST_TRY { 008C1349 and dword ptr [ebp-4],0 if (!f.empty()) { 008C134D mov eax,dword ptr [ebx] 008C134F test eax,eax 008C1351 je boost::function1::move_assign+5Dh (8C138Ch) this->vtable = f.vtable; 008C1353 mov dword ptr [ecx],eax if (this->has_trivial_copy_and_destroy()) 008C1355 test al,1 008C1357 je boost::function1::move_assign+37h (8C1366h) this->functor = f.functor; 008C1359 lea edi,[ecx+8] 008C135C push 6 008C135E lea esi,[ebx+8] 008C1361 pop ecx 008C1362 rep movs dword ptr es:[edi],dword ptr [esi] else 008C1364 jmp boost::function1::move_assign+49h (8C1378h) get_vtable()->base.manager(f.functor, this->functor, boost::detail::function::move_functor_t ag); 008C1366 add ecx,8 008C1369 push 1 008C136B push ecx 008C136C lea ecx,[ebx+8] 008C136F and eax,0FFFFFFFEh 008C1372 push ecx 008C1373 call dword ptr [eax] 008C1375 add esp,0Ch f.vtable = 0; 008C1378 and dword ptr [ebx],0 } BOOST_CATCH_END } 008C137B mov ecx,dword ptr [ebp-0Ch] 008C137E pop edi 008C137F pop esi 008C1380 mov dword ptr fs:[0],ecx 008C1387 pop ebx 008C1388 leave 008C1389 ret 4 } else { clear(); 008C138C mov esi,ecx 008C138E call boost::function1::clear (8C130Ch)