Hi! Cocos2d use special macro to cast different function pointers to 
universal handler format:

typedef void (Object::*SEL_MenuHandler)(Object*);
> #define menu_selector(_SELECTOR) (cocos2d::SEL_MenuHandler)(&_SELECTOR)



With this *menu_selector* macro I can cast many different function signatures 
to SEL_MenuHandler. 

For example:

void MyObject::soundOff1()
> void MyObject::soundOff2(Object* sender)
> void MyObject::soundOff3(MenuItemImage* sender) // MenuItemImage is 
> subclass of Object
> // ...
> menu_selector(myobj::soundOff1)
> menu_selector(myobj::soundOff2)
> menu_selector(myobj::soundOff3)


Casting like this widely used in cocos2d projects, and works fine in native 
environment. 

But when I use code like this under emscripten environment I have fatal errors 
like this:


Invalid function pointer '1551' called with signature 'vid'. Perhaps this 
> is an invalid value (e.g. caused by calling a virtual method on a NULL 
> pointer)? Or calling a function with an incorrect type, which will fail? 
> (it is worth building your source files with -Werror (warnings are errors), 
> as warnings can indicate undefined behavior which can cause this) 
> bin.html:1249:13
> This pointer might make sense in another type signature: vi: 
> __ZN13Choose_screen12lock_checkerEv vidd: 0 v: 0 viddi: 0 vidddd: 0 viid: 0 
> vii: 0 idd: 0 i: 0 ii: 0 di: 0 viii: 0 iiid: 0 iii: 0 dii: 0 viiii: 0 
> viiidi: 0 iiii: 0 diii: 0 viiiii: 0 iiiidd: 0 iiiiid: 0 iiiii: 0 viiiiii: 0 
> iiiiii: 0 iiiiiid: 0 iiiiddd: 0 iiiiiii: 0 viiiiiii: 0 iiiiiiid: 0 
> iiiiiiii: 0 viiiiiiii: undefined iiiiiiiii: 0 viiiiiiiii: 0 viiiiiiiiii: 0 
> iiiiiiiiiii: 0 iiiiiiiiiiii: 0 iiiiiiiiiiiii: 0 viiiiiiiiiiiiiii: 0 


To avoid this problems by replacing *menu_selector* macro with this:

#define menu_selector(_SELECTOR) 
> static_cast<cocos2d::SEL_MenuHandler>(&_SELECTOR)


and rewriting code, but usually in cocos2d projects a lot of places should 
be fixed to adapt new macros.
Can I solve this problem in other way (call this function by name and 
ignore signature)? I wonder how this managed in native compiler.

-- 
You received this message because you are subscribed to the Google Groups 
"emscripten-discuss" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
For more options, visit https://groups.google.com/d/optout.

Reply via email to