Я работаю над созданием некоторых дополнительных привязок для Cocos2D-JavaScript, и мне нужно узнать, как все это работает. Что делает SpiderMonkey’s JS_WrapObject()
определяется в jsapi.h
делать? Я не могу найти хорошие документы на него, и он не появляется в JSAPI Ссылка. Например, он используется следующим образом:
JSObject* JSB_NewGlobalObject(JSContext* cx, bool empty)
{
JSObject* glob = JS_NewGlobalObject(cx, &global_class, NULL);
...
JS_WrapObject(cx, &glob);
return glob;
}
Этот вопрос довольно старый, но, возможно, ответ кому-нибудь поможет.
Эта функция создает упаковку для нескольких частей для данного объекта JS. Учитывая, что объект JS, созданный для одного отделения, не может использоваться совместно с другим отделом напрямую, существует концепция оболочки, которая должна быть подготовлена для совместного использования одного и того же экземпляра объекта JS между различными отделами.
Отсек можно рассматривать как контейнер, который имеет свой собственный GC и разделяет ряд связанных объектов. Например, каждый глобальный объект в SpiderMonkey имеет свое собственное отделение.
Допустим, у вас есть два независимых глобальных объекта в контексте JS. Вы можете оценить один сценарий в контексте первого глобального объекта, затем вы можете использовать значение результата в качестве аргумента для второго сценария, который будет оцениваться с использованием второго глобального объекта. Но для того, чтобы сделать это, вы должны обернуть его с помощью обертки с поперечным отсеком.
Важным моментом здесь является тот факт, что JS_WrapObject готовит оболочку для активного отделения, поэтому может потребоваться сделать ожидаемое отделение активным с использованием, например, класса JSAutoCompartment.
Других решений пока нет …