ошибки утверждения при сборке мусора

Я встраиваю SpiderMonkey в приложение iOS и получаю ошибки утверждения при выполнении JS_GC и JS_MaybeGC. Чаще это происходит при тестировании на моем iPhone, но и в симуляторе бывает. В частности, ошибка утверждения была:

Assertion failure: kind == GetGCThingTraceKind(*thingp), at /Users/rquesada/progs/Spidermonkey/js/src/gc/Marking.cpp:366

Я не слишком хорошо знаком с внедрением SpiderMonkey. Где я должен искать, чтобы начать выяснять и исправлять эту ошибку? У меня есть только один глобальный объект, одна среда выполнения и один контекст в моем приложении, и все они выполняются из основного потока.


person Claudiu    schedule 14.10.2013    source источник


Ответы (1)


Причина заключалась в том, что я передал переменную __block в JS_AddValueRoot. Функции JS_Add*Root работают с адресами памяти, и реализация такая что:

Переменные __block изначально размещаются в стеке, но если какой-либо блок, который на них ссылается, копируется, они перемещаются в кучу (распределяются).

Это привело к тому, что GCer подумал, что есть что-то, чего не было, что привело к сбою.

person Claudiu    schedule 14.10.2013