У меня есть программа, использующая QtScript для некоторой автоматизации. Я добавил несколько функций и классов C ++ в глобальную область действия механизма сценариев, чтобы сценарии могли получить к ним доступ, например:
QScriptValue fun = engine->newFunction( systemFunc );
engine->globalObject().setProperty( "system", fun );
Я хотел бы иметь возможность запускать несколько сценариев подряд, каждый со свежим глобальным состоянием. Так что, если один скрипт устанавливает глобальную переменную, например
myGlobalVar = "stuff";
Я хочу, чтобы эта переменная была удалена до запуска следующего скрипта. Мой способ сделать это состоит в том, чтобы сделать глубокую копию глобального объекта обработчика сценариев, а затем восстановить его, когда сценарий завершит работу. Но глубокие копии не работают, так как моя функция system
неожиданно перестает работать с ошибкой:
TypeError: Result of expression 'system' [[object Object]] is not a function.
Вот моя функция глубокого копирования, адаптированная с:
http://qt.gitorious.org/qt-labs/scxml/blobs/master/src/qscxml.cpp
QScriptValue copyObject( const QScriptValue& obj, QString level = "" )
{
if( obj.isObject() || obj.isArray() ) {
QScriptValue copy = obj.isArray() ? obj.engine()->newArray() : obj.engine()->newObject();
copy.setData( obj.data() );
QScriptValueIterator it(obj);
while(it.hasNext()) {
it.next();
qDebug() << "copying" + level + "." + it.name();
if( it.flags() & QScriptValue::SkipInEnumeration )
continue;
copy.setProperty( it.name(), copyObject(it.value(), level + "." + it.name()) );
}
return copy;
}
return obj;
}
(SkipInEnumeration
был вставлен, чтобы избежать бесконечного цикла)
РЕДАКТИРОВАТЬ: Часть проблемы, я думаю, заключается в том, что в отладчике (QScriptEngineDebugger) добавленные мной функции и конструкторы должны отображаться как тип Function
, но после копирования они отображаются как тип Object
. Я еще не нашел хорошего способа создания новой функции, которая дублирует существующую функцию (QScriptEngine :: newFunction принимает фактический указатель на функцию).