Здравствуйте, yxiie, Вы писали:
E>>Так вот и я об этом же. Что из скрипта будет вызываться некий Invoke, а уже в Invoke будет код, который приведен выше. Так?
Y>зачем? в байнд-объекте мы уже имеем адрес метода и информацию о параметрах. единственное, что нужно — обработать и преобразовать переданные Y>скриптом параметры в подходящие для этого метода и сделать вызов.
Но КАК? (Торможу я что-то). Приведи, пожалуйста код по организации вызова метода, сигнатура которого заранее была неизвестна.
E>>Так вот, если объекты, которые ты делаешь доступными для скрипта и методы этих объектов заранее определены, то зачем огород с reflection?
E>>Почему просто не сделать BindedMethod->Invoke оберткой сразу над конкретным C++ классом/интерфейсом? А уже нужные тебе C++ классы/интерфейсы инстанциировать посредством фабрики?
Y>потому, что если мы обойдемся только байндом, то из скрипта мы сможем оперировать объектами С++, а из С++ оперировать объектами скрипта — нет.
Ну это ты зря. Это уж как напишешь.
... << RSDN@Home 1.1.4 beta 3 rev. 185>>
SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Здравствуйте, eao197, Вы писали:
E>Здравствуйте, yxiie, Вы писали:
E>>>Так вот и я об этом же. Что из скрипта будет вызываться некий Invoke, а уже в Invoke будет код, который приведен выше. Так?
Y>>зачем? в байнд-объекте мы уже имеем адрес метода и информацию о параметрах. единственное, что нужно — обработать и преобразовать переданные Y>>скриптом параметры в подходящие для этого метода и сделать вызов.
E>Но КАК? (Торможу я что-то). Приведи, пожалуйста код по организации вызова метода, сигнатура которого заранее была неизвестна.
почему же неизвестна? посмотри в исходниках Batiskaf-a как у него сделана регистрация метода — BindMethod. если все-равно будет неясно, тогда попробую объяснить.
E>>>Так вот, если объекты, которые ты делаешь доступными для скрипта и методы этих объектов заранее определены, то зачем огород с reflection?
E>>>Почему просто не сделать BindedMethod->Invoke оберткой сразу над конкретным C++ классом/интерфейсом? А уже нужные тебе C++ классы/интерфейсы инстанциировать посредством фабрики?
Y>>потому, что если мы обойдемся только байндом, то из скрипта мы сможем оперировать объектами С++, а из С++ оперировать объектами скрипта — нет.
E>Ну это ты зря. Это уж как напишешь.
ну и какая тогда будет разница между такими наворотами продвинутого байнда и рефлексией?
Здравствуйте, yxiie, Вы писали:
E>>Но КАК? (Торможу я что-то). Приведи, пожалуйста код по организации вызова метода, сигнатура которого заранее была неизвестна.
Y>почему же неизвестна? посмотри в исходниках Batiskaf-a как у него сделана регистрация метода — BindMethod. если все-равно будет неясно, тогда попробую объяснить.
Объясняй сразу. Ведь мне не интересны внутренности регистрации метода через BindMethod. Мне интересно, как ты будешь через reflection вызывать метод, сигнатуру которого ты до этого не знал. Ведь в примере, который привел Batiskaf показано, что сигнатура должна быть известна (привел бы оттуда фрагмент с GetMethod, но у того метода простая сигнатура):
typedef TYPELIST_4( const std_string&,
unsigned char,
const std_string&,
unsigned int ) ConstructorParamList;
typedef Loki::Functor< TheObject*,
ConstructorParamList > Constructor;
//В случае отстутствия конструктора с таким прототипом будет выброшено исключение
//подобная стратегия применяется для всех запросов к метаклассу
Constructor ctor =
pClass->GetConstructor< ConstructorParamList>();
//Создание экземпляра обьекта с вызовом полученного конструктора
TheObject* pObj = ctor("Vasya", 27, "London", 12 );
... << RSDN@Home 1.1.4 beta 3 rev. 185>>
SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Здравствуйте, eao197, Вы писали:
E>Объясняй сразу. Ведь мне не интересны внутренности регистрации метода через BindMethod. Мне интересно, как ты будешь через reflection вызывать метод, сигнатуру которого ты до этого не знал. Ведь в примере, который привел Batiskaf показано, что сигнатура должна быть известна (привел бы оттуда фрагмент с GetMethod, но у того метода простая сигнатура):
...
лучше бы ты посмотрел. там у него BindMethod — это переопрделенное имя:
таким образом мы знаем сигнатуру и можем сгенерировать соответствующий объект, который будет принимать
параметры из скрипта и на основе их делать вызов.
Здравствуйте, eao197, Вы писали:
E>>>ИМХО, создание таких proxy -- это не есть механизм reflection.
Y>>не понял, объясни, что ты хочешь сказать.
E>Ok. Но мне нужно некоторое время, чтобы восстановить в памяти информацию по reflection в Java. Тогда попробую объяснить.
Просто, как я понял твою задачу, тебе нужна только одна возможность из reflection -- вызов метода. Все остальное ты проигнорируешь.
... << RSDN@Home 1.1.4 beta 3 rev. 185>>
SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Здравствуйте, eao197, Вы писали:
E>Просто, как я понял твою задачу, тебе нужна только одна возможность из reflection -- вызов метода. Все остальное ты проигнорируешь.
опиши мне все возможности reflection и я скажу, какие я проигнорирую, какие нет.
Здравствуйте, yxiie, Вы писали:
Y>Здравствуйте, eao197, Вы писали:
E>>Объясняй сразу. Ведь мне не интересны внутренности регистрации метода через BindMethod. Мне интересно, как ты будешь через reflection вызывать метод, сигнатуру которого ты до этого не знал. Ведь в примере, который привел Batiskaf показано, что сигнатура должна быть известна (привел бы оттуда фрагмент с GetMethod, но у того метода простая сигнатура):
Y>...
Y>лучше бы ты посмотрел. там у него BindMethod — это переопрделенное имя:
Y>
Да понимаю я это, ты мне вот что покажи:
Y>таким образом мы знаем сигнатуру и можем сгенерировать соответствующий объект, который будет принимать Y>параметры из скрипта и на основе их делать вызов.
Как???
... << RSDN@Home 1.1.4 beta 3 rev. 185>>
SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Здравствуйте, eao197, Вы писали:
E>Да понимаю я это, ты мне вот что покажи:
Y>>таким образом мы знаем сигнатуру и можем сгенерировать соответствующий объект, который будет принимать Y>>параметры из скрипта и на основе их делать вызов.
E>Как???
Здравствуйте, sch, Вы писали:
E>>Так вот и я о том же! sch>Интересно, а вот так получится? Только придется варианты использовать, а это уже медленно...
<...>
Здравствуйте, sch, Вы писали:
SS>>Получится. А чем variant медленно? sch>Это мой маленький пунктик, если я где вижу лишний malloc() то меня тут же начинает передергивать
Здравствуйте, yxiie, Вы писали:
Y>Здравствуйте, eao197, Вы писали:
E>>Да понимаю я это, ты мне вот что покажи:
Y>>>таким образом мы знаем сигнатуру и можем сгенерировать соответствующий объект, который будет принимать Y>>>параметры из скрипта и на основе их делать вызов.
E>>Как???
Y>
...
Y>
Y>конечно это все быстрый набросок, но надеюсь идея ясна.
Да, что-то такое я предполагал с самого начала.
ИМХО, в системе интеграции Ruby с C гораздо проще все сделано. "Чего только русские не придумают, чтобы нормальные дороги не строить"
... << RSDN@Home 1.1.4 beta 3 rev. 185>>
SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Здравствуйте, yxiie, Вы писали:
Y>Здравствуйте, eao197, Вы писали:
E>>Просто, как я понял твою задачу, тебе нужна только одна возможность из reflection -- вызов метода. Все остальное ты проигнорируешь.
Y>опиши мне все возможности reflection и я скажу, какие я проигнорирую, какие нет.
Reflection enables Java code to discover information about the fields, methods and constructors of loaded classes, and to use reflected fields, methods, and constructors to operate on their underlying counterparts on objects, within security restrictions. The API accommodates applications that need access to either the public members of a target object (based on its runtime class) or the members declared by a given class.
ИМХО, доступ к атрибутам тебе не потребуется.
Кстати, можешь посмотреть там еще и Dynamic Proxy. Вся мошь этого в Java проявляется из-за того, что в классе Method есть метод invoke, который получает список аргументов в виде Object[] (нетипизированный!). Как в C++ этого достичь портабильным способом?
... << RSDN@Home 1.1.4 beta 3 rev. 185>>
SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Здравствуйте, eao197, Вы писали:
Y>>опиши мне все возможности reflection и я скажу, какие я проигнорирую, какие нет.
E>Вот, коротко, что об этом говорится в JDK: E>
E>Reflection enables Java code to discover information about the fields, methods and constructors of loaded classes, and to use reflected fields, methods, and constructors to operate on their underlying counterparts on objects, within security restrictions. The API accommodates applications that need access to either the public members of a target object (based on its runtime class) or the members declared by a given class.
E>ИМХО, доступ к атрибутам тебе не потребуется.
почему? по крайней мере не помешает. особенно при отладке не выходя в IDE-debugger.
E>Кстати, можешь посмотреть там еще и Dynamic Proxy. Вся мошь этого в Java проявляется из-за того, что в классе Method есть метод invoke, который получает список аргументов в виде Object[] (нетипизированный!). Как в C++ этого достичь портабильным способом?
я с жавой близко не знаком, так что ничего сказать не могу.
имхо вы хотите того чего не нужно никому и никогда.
зачем тут нужна рефлексия?
чтобы скрипт вызвал нужный метод достаточно зарегистрировать в виртуальной машине как его вызывать.
Самый простой способ — автоматическая регистрация : те
*при компиляции с++ создаются заглушки, которые преобразовывают аргументы пришедшие из скрипта в нормальный вызов с++ метода
*при компиляции с++ создается код который регистрирует заглушки в скрипте при старте vm
после этого юзер может скриптить сколько угодно.
Главная проблема — интерфейсы менять уже будет нельзя или скрипты придется выкинуть и писать наново.
wbr
зы поделитесь идеями vm а то уже интересно ради чего весь сыр-бор