LINUX.ORG.RU

Зело странного хочешь ты

 , ,


0

2

В общем, жил да был в одной С++ проге «компактный!»(ТМ) js-движок, который позволял сравнительно легко заменить объект по ссылке This(), например, если он содержит строку - другой строкой, сохранив привычную семантику вызова, но не парясь с вытаскиванием класса Message в жабоскрипт:

 
var msg = "какое-то форматированное сообщение";
msg.set(tag, value); //на самом деле делает что-то вроде msg = newMsg; 
//c новыми тегами
msg.send(); //посылает отредактированное сообщение по какому-то протоколу

Время шло, старый движок заболел своими достоинствами («компактный же!») и вообще умер и протух где-то на сорцфорже. Решили добры молодцы заменить это дело на v8, чтоб все было глобально и надежно. Контексты, хэндлы и Arguments::This() - это все конешно очень блааародно... Вот незадача: в старом движке можно было лукапить переменные вызовами FindChild(«varName»); или FindOrCreate(«varName») и находу подменять объект, на который указывает This(), благо встроенный ссылочный тип дозволяет - куда положили, туда и лежит. Есть в v8 что-то похожее на лукап или ССЗБ и нет пути? Конкретно интересует возможность узнать имя переменной, хэндл на которую получается через Arguments::This(). (Тогда есть надежда выполнить тупой скрипт msg = newMsg; и довись оно конем.)

П.С. Очень не охота править кучу унаследованных скриптов. Пионеры и так уже вместо приделывания через плюсы функций с семантикой метода (хоть бы и через v8convert, хотя и без него нормально) наворотили два слоя оберток в JS через Object.prototype... Которые с Arguments::This() нафиг не нужны.

★★★★★

Последнее исправление: cetjs2 (всего исправлений: 2)
Ответ на: комментарий от Pavval

Дык, может, гляну :) Еще б знать, куда смотреть - может, у разрабов Qt5 не было необходимости на ходу менять значение, хранящееся в This() (ну или как-то обходным путем - в старом движке имя переменной было доступно через интерфейс - потому и лукапы по списку «детей» вызова были возможны.

В v8 ничего похожего нет «ибо ненужно»(ТМ) или я «не понял сути v8» - либо придется велосипет городить с SetHiddenValue() и libastral.a :)) У подручных пионеров руки чешутся менять семантику - хотя, они не поностью понимают, как и зачем рабoтают скрипты. Их главным образом клинит на «в v8 строки иммутабельны!!!111» - типа, не. Не взлетит. А по-моему выражению «msg = msgNew;» по-хорошему наплевать на иммутабельность (строку же не меняем): вот, мол, новая строка, а старая - не колыхает. Осталось только накатить где-то снаружи вызова set() новое значение на ту же ссылку. Или протащить в вызов msg.set() контекст, в котором исполнить «msg = strNew;» (метод-то забиндился на отличненько :))

slackwarrior ★★★★★
() автор топика

Оказалось, если очень хочется - то okay. Фокус-покус, который позволяет заменить «немутабельную строку» за один проход (пионеры вчера божились, что невозможно ни в коем случае, и семантику вызова надо обязательно менять... Им же пионерыпогромисты жабоскрипта сказали!!!111):

 _с = args.This(); //исходная строка
 thisImpostor = _c;
if (_selfLookUpKey() == v8::Undefined()) //ключ для привязки к контексту _c
{
v8::Handle<v8::Value> _selfLookUpKey = contextLookupByValue(v8::Handle<v8::Object>::Cast(_c)->CreationContext(), _c);
}
else
{
  thisImpostor = _selfLookUpKey; //тут теперь имя переменной, его больше не надо искать, дальше можно лукапить через него
}
 v8::Handle<v8::Object>::Cast(thisImpostor)->CreationContext()->Enter();
v8::Handle<v8::Object>::Cast(thisImpostor)->CreationContext()->Global()->ForceSet(_selfLookUpKey, _ret);
//_ret - новое значение строки

slackwarrior ★★★★★
() автор топика
Ответ на: комментарий от slackwarrior

ОМГ... Должно быть так, конечно же:

_selfLookUpKey = contextLookupByValue(v8::Handle<v8::Object>::Cast(_c)->CreationContext(), _c);

slackwarrior ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.