Hi. I've working on big game based on cocos2d engine. I think that I found 
optimization bug, but I can't found test case yet. When I try to extract 
problem code to new project it's works. I think that bug is not in game, 
because I've checked all memory access with vallgrind and it's ok, moreover 
ASSERTION=2, SAFE_HEAP=1 also does not reports any error. So, I try to 
explain what code does. Basically cocos2d have node loader, that parse 
files, and build game gui. During this process node loader assing callbacks 
for gui elements, for example it set handlers for onclick events and etc. 

Target is gui element (like menu button), selectorName is name of callback, 
and onResolveCCBCCMenuItemSelector should find callback:
//...
                    CCBSelectorResolver * targetAsCCBSelectorResolver = 
dynamic_cast<CCBSelectorResolver *>(target);
                    
                    if(targetAsCCBSelectorResolver != NULL) {
                        selMenuHandler = 
targetAsCCBSelectorResolver->onResolveCCBCCMenuItemSelector(target, 
selectorName.c_str());
                    }
                    
                    if(selMenuHandler == 0) {
                        CCLOG("Skipping selector '%s' since no 
CCBSelectorResolver is present.", selectorName.c_str());
                        abort(); // BAD CASE
                    } else {
//...


onResolveCCBCCMenuItemSelector implementation is simple, just compare 
strings and return pointer:

SEL_MenuHandler MainMenuLayer::onResolveCCBCCMenuItemSelector(CCObject * 
pTarget, const char* pSelectorName)
{
    if (strcmp(pSelectorName, "achievementsPressed:") == 0)
    {
        return (SEL_MenuHandler) MainMenuLayer::achievementsPressed;
    }
    else if (strcmp(pSelectorName, "missionsPressed:") == 0)
    {
        return  (SEL_MenuHandler) MainMenuLayer::missionsPressed;
    }
    else if (strcmp(pSelectorName, "clonesPressed:") == 0)
    {
        return  (SEL_MenuHandler) MainMenuLayer::clonesPressed;
    }
...
   return 0;
}

In normal execution abort() never calls, but if I optimize game with -O2, 
abort() happens. But even in -O2  onResolveCCBCCMenuItemSelector returns 
non zero value (pointer) (I've checked with printf before return), but 
abort() happens!
To solve this, I move all onResolveCCBCCMenuItemSelector impls into 
handlers.cpp, and compile it with -O3 --js-opts 1 --llvm-opts 1 and game 
works fine, but if I switch optimizations to --lvm-opts 2 abort occurs. 
How I can figure out what happens? handlers.cpp is very small file, with 
couple of funcs, but if I optimize it game wan't work.

Thank you!


-- 
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