Skip to content

Instantly share code, notes, and snippets.

@xaxxon
Last active November 26, 2015 06:27
Show Gist options
  • Save xaxxon/f7dda06e5dfc0393648c to your computer and use it in GitHub Desktop.
Save xaxxon/f7dda06e5dfc0393648c to your computer and use it in GitHub Desktop.
segfaults on line 10
void subscribe(const std::string subject, std::function<void(Message *)> callback);
template<typename T>
void subscribe(std::function<void(T *)> callback) {
this->subscribe(T::subject, [&](Message * message){
printf("In wrapping callback\n");
T * specific_message = dynamic_cast<T *>(message);
if (specific_message != nullptr) {
printf("About to call actual callback from wrapper\n");
callback(specific_message);
} else {
printf("Skipping calling actual callback from wrapper because message type mismatch\n");
}
});
}
// this is the caller:
this->subscribe<Message_FindObjectsAtPoint>([&](Message_FindObjectsAtPoint * message) {
...
});
@xaxxon
Copy link
Author

xaxxon commented Nov 26, 2015

(lldb) down
frame #0: 0x000000010005c046 game`std::__1::function<void (Message_FindObjectsAtPoint*)>::operator(this=0x00007fff5fbfe760, _arg=0x00007fff5fbff828)(Message_FindObjectsAtPoint) const + 134 at functional:1793
1790 if (_f == 0)
1791 throw bad_function_call();
1792 #endif // _LIBCPP_NO_EXCEPTIONS
-> 1793 return (__f)(_VSTD::forward<_ArgTypes>(__arg)...);
1794 }
1795
1796 #ifndef _LIBCPP_NO_RTTI
(lldb) bt

  • thread #1: tid = 0x63f304, 0x000000010005c046 game`std::__1::function<void (Message_FindObjectsAtPoint*)>::operator(this=0x00007fff5fbfe760, __arg=0x00007fff5fbff828)(Message_FindObjectsAtPoint*) const + 134 at functional:1793, queue = 'com.apple.main-thread', stop reason = EXC_BAD_ACCESS (code=EXC_I386_GPFLT)
    • frame #0: 0x000000010005c046 gamestd::__1::function<void (Message_FindObjectsAtPoint*)>::operator(this=0x00007fff5fbfe760, __arg=0x00007fff5fbff828)(Message_FindObjectsAtPoint*) const + 134 at functional:1793 frame #1: 0x000000010005bf97 gamevoid Subscriber::subscribe<Message_FindObjectsAtPoint>(this=0x000000010045def8, message=0x00007fff5fbff828)>)::'lambda'(Message_)::operator()(Message_) const + 183 at messager.h:76
      frame #2: 0x000000010005bed0 gamevoid std::__1::__invoke_void_return_wrapper<void>::__call<void Subscriber::subscribe<Message_FindObjectsAtPoint>(std::__1::function<void (Message_FindObjectsAtPoint*)>)::'lambda'(Message*)&, Message*>(void Subscriber::subscribe<Message_FindObjectsAtPoint>(std::__1::function<void (Message_FindObjectsAtPoint*)>)::'lambda'(Message*)&&&, Message*&&) [inlined] decltype(__f=0x000000010045def8, __args=0x00007fff5fbff268)(std::__1::forward<Message*>(fp0))) std::__1::__invoke<void Subscriber::subscribe<Message_FindObjectsAtPoint>(std::__1::function<void (Message_FindObjectsAtPoint*)>)::'lambda'(Message*)&, Message*>(Message_FindObjectsAtPoint&&, Message*&&) + 80 at __functional_base:415 frame #3: 0x000000010005beb0 gamevoid std::__1::__invoke_void_return_wrapper::__call<void Subscriber::subscribe<Message_FindObjectsAtPoint>(__args=0x000000010045def8, args=0x00007fff5fbff268)>)::'lambda'(Message)&, Message>(void Subscriber::subscribe<Message_FindObjectsAtPoint>(std::1::function<void (Message_FindObjectsAtPoint*)>)::'lambda'(Message)&&&, Message&&) + 48 at __functional_base:440

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment