Tengo un programa que usa QtScript para algunas automatizaciones. He añadido un montón de funciones y clases de C++ para el alcance global del motor de scripts para que los scripts pueden acceder a ellos, así:Copia en profundidad de QScriptValue como objeto global
QScriptValue fun = engine->newFunction(systemFunc);
engine->globalObject().setProperty("system", fun);
me gustaría ser capaz de ejecutar varias secuencias de comandos en la serie, cada uno con un nuevo estado global. Así que si uno secuencia de comandos establece una variable global, como
myGlobalVar = "stuff";
quiero esa variable a ser borrado antes de que acabe la siguiente secuencia de comandos. Mi método para hacer esto es hacer una copia profunda del Objeto Global del motor de script, y luego restaurarlo cuando un script termina de ejecutarse. Pero las copias profundas no están funcionando, ya que mi función system
rompe repentinamente con el error:
TypeError: Result of expression 'system' [[object Object]] is not a function.
Aquí está mi función de copia profunda, adaptado de:
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;
}
(el SkipInEnumeration
se poner en para evitar un bucle infinito)
EDITAR: Parte del problema, creo, es que en el depurador (QScriptEngineDebugger), se supone que las funciones y constructores que he agregado para que aparezca como tipo Function
, pero después de copiar aparecen como tipo Object
. Todavía no he encontrado una buena manera de crear una nueva Función que duplique una existente (QScriptEngine :: newFunction toma un puntero de función real).
En mi caso 'isVariant()' devuelve falso al menos para los números. Tuve que agregar un caso 'isNumber()' (y todas las otras primitivas para precaución) también. – Olivetree