Мы разрабатываем приложение Cocoa для Mac OSX (10.8), которое должно использовать библиотеку JavaScript (длинная история, почему мы должны использовать JavaScript).Cocoa/Mac: JavaScript Core crash на 38-й вызов
В демонстрационном приложении все, казалось, было прекрасным, но при включении кода в наш проект мы можем вызывать функцию 37 раз без проблем, а затем сбой 38-го раза.
Для вызова кода JS мы используем JSWrappers.ms от Apple (из примера JavaScriptCoreHeadStart). Линия, которая выходит из строя (с EXC_BAD_ACCESS) является # 149:
JSObjectCallAsFunction(self.jsContext, jsFunction, NULL, argumentCount, arguments, NULL);
Как было сказано выше, он падает на 38-й раз -callStringJSFunction:withParameters:
не называется, независимо от того, что вход (он выходит из строя любой входной строки, и эта же строка работает, если используется в предыдущих предыдущих итерациях). EXC_BAD_ACCESS не вызван входной переменной, поскольку доступ к ним (например, вызов self.jsContext
непосредственно перед этой строкой) работает: это сам вызов функции вызывает сбои.
Мы понятия не имеем, что это может вызвать эту проблему, и не знаю, как отлаживать больше. У кого-нибудь есть намек? Спасибо.
// EDIT
я должен исправить себя: он не работает на «демо-приложение» тоже. Даже в этом случае код аварий 38-й раз, когда мы называем -callStringJSFunction:withParameters:
// EDIT2
Если мы заново создать объект в JSWrappers (и новый JSGlobalContext) каждый раз, когда вызывается функция, она не откажет больше. Однако это делает код намного медленнее (неудивительно, так как интерпретатор JS должен каждый раз читать скрипт - и он довольно большой).
// EDIT3
Еще одно открытие: создание приложения в 32 бита делает сбой кода. Вместо этого в 64-битном исполнении работает безупречно: код JS выполняется без проблем в любое время. Это странно: может ли это быть ошибкой в самой структуре JavaScript Core?
Я сталкиваюсь с чем-то похожим. У вас есть радар, который я могу дублировать? – Simon
@ Симон Извините, не знаю. Тем не менее, я уверен, что это ошибка с JavaScript Core, вероятно, связанная с памятью (моя библиотека JS была довольно большой). – Qualcuno