Здравствуйте, koandrew, Вы писали:
K>У меня есть ещё бонусное задание — придумать, как обернуть похожим образом нестатические методы классов this класса (указатель на нативное представление JS-объекта) можно вытянуть из const FunctionCallbackInfo<Value>& info, которая передаётся в переходник. Есть какие-нить мысли на этот счёт?
Практически так же. Гуглите C++ method pointers. Там используется какой-то зубодробительный синтаксис, но сути — это тот же indirect call, только сбоку: добавляем шаблонный аргумент для типа класса и передаем в объект 2 вещи: указатель на this и указатель на метод.
K>P.S. Здесь правда есть ещё один очень тонкий момент, связанный с особенностью поведения this в JavaScript (он в принципе может указывать на что угодно) — но с этим в принципе несложно справиться, проверив имя класса объекта, который к нам попал.
тут можно воспользоваться RTTI, думаю.
Здравствуйте, koandrew, Вы писали:
Эх, не выдержу, влезу, поделюсь списком граблей по которым прошел
B>>Глюк, судя по-всему, здесь:
K>Вы правы — поправил у себя. Теперь компилятор молчит, как партизанен
VariantConverter должен уметь сообщать из/в какой тип он конвертирует, чтобы знать какой тип возвращать из GetArg(). См
v8pp/convert.hpp
B>>Меня самого любопытство одолело и я решил распотрошить std::bind()
B>>P.S. При желании этот код можно упростить, выкинув:
B>>1. Копирование в промежуточный vector
B>>2. Создание Invokable-объекта. Вместо этого методы можно сделать static и передавать туда явно указатель на вызываемую функцию, которую shim вытащит из info.Data().
K>Это уже на завтра — мне ещё надо будет завтра как следует разобраться к текущем коде — а то в 10:30 вечера голова что-то туго соображает %)
Вероятно придешь к нескольким перегрузкам DoInvoke(..), т.к. Invokable-объект с одним аргументом FunctionCallbackInfo будет полезен, если на JS стороне требуется вызывать функцию с разным кол-вом или типами аргументов. Или иметь в С++ функции v8::Isolate* (который есть в FunctionCallbackInfo). Для этого нужно выбрать на этапе компиляции какую из перегруженных DoInvoke() вызывать. См.
v8pp/call_from_v8.hpp
K>У меня есть ещё бонусное задание — придумать, как обернуть похожим образом нестатические методы классов this класса (указатель на нативное представление JS-объекта) можно вытянуть из const FunctionCallbackInfo<Value>& info, которая передаётся в переходник. Есть какие-нить мысли на этот счёт?
Главное помнить, что указатель на class member function может быть не указателем, а смещением в VMT и его размер в военное время достигает до 4* sizeof(void*) в зависимости от компилятора и виртуальности базовых классов.
Есть v8::Object::SetAlignedPointerInInternalField(), с его помощью в JS объекте хранят указатель на С++ объект. При создании только функции-конструкора класса нужно указать кол-во внутренних полей для этого типа объектов используя SetInternalFieldCount()
См.
wrap_external_object() unwrap_object().
Если хочешь использовать свои классы как аргументы/результат оборачиваемых функций, не забудь добавить поддержу для них в VariantConverter. Чтобы работал VariantConverter::ToVariant() я использую
unordered_map<object*, v8::Handle>
Еще более тонкий момент — использование полиморфных классов, если в JS объекте хранить укзатель на С++ объект. Для этого я ничего лучше н епридумал, как сделать небольшой аналог RTTI чтобы знать про типы базовых и производных классов и уметь преобразовывать указатель на объект между этими типами для корректного вызова функции-члена, см.
v8pp/class.hpp
Здравствуйте, bazis1, Вы писали:
B>Практически так же. Гуглите C++ method pointers. Там используется какой-то зубодробительный синтаксис, но сути — это тот же indirect call, только сбоку: добавляем шаблонный аргумент для типа класса и передаем в объект 2 вещи: указатель на this и указатель на метод.
Вообще в С/С++ синтаксис указателей на функцию явно придумывали под тяжёлыми наркотиками — сколько я не работаю с языком, так до сих пор не могу запомнить, как писать сигнатуру, каждый раз ищу какой-нить пример, дабы напомнить себе, как это надо правильно писать
B>тут можно воспользоваться RTTI, думаю.
Возможно.
Здравствуйте, koandrew, Вы писали:
https://sourceforge.net/projects/pybind/
там можно посмотреть как решается данная проблема
если что спрашуй