Re[9]: упс...
От: bazis1 Канада  
Дата: 10.04.15 02:59
Оценка:
Здравствуйте, koandrew, Вы писали:

K>У меня есть ещё бонусное задание — придумать, как обернуть похожим образом нестатические методы классов this класса (указатель на нативное представление JS-объекта) можно вытянуть из const FunctionCallbackInfo<Value>& info, которая передаётся в переходник. Есть какие-нить мысли на этот счёт?

Практически так же. Гуглите C++ method pointers. Там используется какой-то зубодробительный синтаксис, но сути — это тот же indirect call, только сбоку: добавляем шаблонный аргумент для типа класса и передаем в объект 2 вещи: указатель на this и указатель на метод.

K>P.S. Здесь правда есть ещё один очень тонкий момент, связанный с особенностью поведения this в JavaScript (он в принципе может указывать на что угодно) — но с этим в принципе несложно справиться, проверив имя класса объекта, который к нам попал.

тут можно воспользоваться RTTI, думаю.
Re[9]: упс...
От: PM  
Дата: 10.04.15 07:40
Оценка: 6 (1)
Здравствуйте, 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&lt;object*, v8::Handle&gt;

Еще более тонкий момент — использование полиморфных классов, если в JS объекте хранить укзатель на С++ объект. Для этого я ничего лучше н епридумал, как сделать небольшой аналог RTTI чтобы знать про типы базовых и производных классов и уметь преобразовывать указатель на объект между этими типами для корректного вызова функции-члена, см. v8pp/class.hpp
Re[10]: упс...
От: koandrew Канада http://thingselectronic.blogspot.ca/
Дата: 10.04.15 15:06
Оценка:
Здравствуйте, bazis1, Вы писали:

B>Практически так же. Гуглите C++ method pointers. Там используется какой-то зубодробительный синтаксис, но сути — это тот же indirect call, только сбоку: добавляем шаблонный аргумент для типа класса и передаем в объект 2 вещи: указатель на this и указатель на метод.

Вообще в С/С++ синтаксис указателей на функцию явно придумывали под тяжёлыми наркотиками — сколько я не работаю с языком, так до сих пор не могу запомнить, как писать сигнатуру, каждый раз ищу какой-нить пример, дабы напомнить себе, как это надо правильно писать

B>тут можно воспользоваться RTTI, думаю.

Возможно.
[КУ] оккупировала армия.
Re: Интегрируем v8
От: IROV..  
Дата: 17.04.15 07:44
Оценка:
Здравствуйте, koandrew, Вы писали:

https://sourceforge.net/projects/pybind/
там можно посмотреть как решается данная проблема
если что спрашуй
я не волшебник, я только учусь!
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.