Работаю с C API JavaScriptCore, и у меня есть эта подпись указателя функции C:
typedef void
(*JSObjectInitializeCallback) (JSContextRef ctx, JSObjectRef object);
А вот проблемное использование:
JSClassDefinition def = kJSClassDefinitionEmpty;
// This is that previously typed out signature being used
def.initialize = [](JSContextRef ctx, JSObjectRef obj){
CAMLlocal2(init_context, init_obj);
init_context = caml_alloc(sizeof(JSContextRef), Abstract_tag);
init_obj = caml_alloc(sizeof(JSObjectRef), Abstract_tag);
Store_field(init_context, 0, (value)ctx);
Store_field(init_obj, 0, (value)obj);
// Need to call this but can't because class_def is
// from the outside and can't be put in the capture list
//caml_callback2(Field(class_def, 5), init_context, init_obj);
};
Поэтому я не уверен, что это правильный способ обойти это. Я не хочу начинать определять функции C повсюду, потому что мне нужно динамически создавать эти обратные вызовы, и я не уверен, как правильно решить глобальное состояние, потому что это вызовет больше проблем с правильной блокировкой и т. д. Я' m также открыт для использования блоков Objective-C, только блоков, без Objective-C. Видел некоторые упоминания о std::function
, но я недостаточно хорошо понимаю C++, чтобы использовать этот API.
Просматривая слой Apple Objective-C поверх JSC, чтобы увидеть, как они это сделали...
EDIT1: нашел эту ссылку как возможное решение, http://p-nand-q.com/programming/cplusplus/using_member_functions_with_c_function_pointers .html, но это довольно глубокое знание C++, в котором мои знания ограничены.
EDIT2: Думаю, мне нужно что-то, чтобы шаблонная магия сгенерировала для меня код?
luabind
илиluabridge
, которые оборачивают более сложные вызовы функций C++ и преобразовывают их в делегаты, соответствующие требуемому typedef. Существует множество способов реализовать эту упаковку. Один хакерский способ состоит в том, чтобы создать своего рода глобальный менеджер ресурсов и оценивать делегаты простого типа указателя функции, обращаясь к глобальному синглтону и вызывая более сложную функцию. Я не знаю деталей привязки JS, YMMV - person Chris Beck   schedule 28.06.2016