static QScriptValue run(QScriptEngine* engine, const QString& fileName, bool recursive) { QFile file(fileName); if (file.open(QIODevice::ReadOnly)) { QTextStream stream(&file); const QString sourceCode = stream.readAll(); if ( recursive ) { // A script context is pushed by the include function call. // Link that context to the one of the script that called include // Only do that, however, when called from the scipt QScriptContext *context = engine->currentContext(); QScriptContext *parent=context->parentContext(); context->setActivationObject(parent->activationObject()); context->setThisObject(parent->thisObject()); } QScriptValue result = engine->evaluate(sourceCode, fileName); if (engine->hasUncaughtException() && errorFileName.isNull() ) errorFileName = fileName; return result; } else { Core::MessageManager::instance()->printToOutputPane(QObject::tr("Error: %1 doesn't exist.\n").arg(fileName), Core::MessageManager::Flash); engine->abortEvaluation(); return QScriptValue(); } }
void ScriptInterface::PushThis( QString thisName ) { // Find our object, then set it as 'this' in our new context auto thisObject = m_global.property( thisName ); QScriptContext* context = m_scriptEngine.pushContext( ); context->setThisObject( thisObject ); }
void ScriptInterface::RunScript( QObject* obj, QString filename ) { QScriptContext* context = m_scriptEngine.pushContext( ); context->setThisObject( m_scriptEngine.toScriptValue( obj ) ); RunScript( filename ); PopThis( ); }
/*! Executes the pending evaluate, if any. */ void QScriptDebuggerBackend::doPendingEvaluate(bool postEvent) { Q_D(QScriptDebuggerBackend); QString program = d->pendingEvaluateProgram; if (program.isEmpty()) return; int contextIndex = d->pendingEvaluateContextIndex; QScriptContext *ctx = context(contextIndex); Q_ASSERT(ctx != 0); QString fileName = d->pendingEvaluateFileName; int lineNumber = d->pendingEvaluateLineNumber; d->pendingEvaluateProgram = QString(); d->pendingEvaluateFileName = QString(); d->pendingEvaluateLineNumber = -1; d->pendingEvaluateContextIndex = -1; // push a new context and initialize its scope chain etc. { QScriptContext *evalContext = engine()->pushContext(); QScriptValueList scopeChain = ctx->scopeChain(); if (scopeChain.isEmpty()) scopeChain.append(engine()->globalObject()); while (!scopeChain.isEmpty()) evalContext->pushScope(scopeChain.takeLast()); evalContext->setActivationObject(ctx->activationObject()); evalContext->setThisObject(ctx->thisObject()); } d->agent->enterContinueMode(); // set a flag so that any exception that happens in // the evaluate() is not sent to the debugger d->ignoreExceptions = true; bool hadException = engine()->hasUncaughtException(); QScriptValue ret = engine()->evaluate(program, fileName, lineNumber); d->ignoreExceptions = false; if (!hadException && engine()->hasUncaughtException()) engine()->clearExceptions(); engine()->popContext(); QScriptDebuggerValue retret(ret); QScriptDebuggerEvent e(QScriptDebuggerEvent::InlineEvalFinished); e.setScriptValue(retret); if (!ret.isUndefined()) e.setMessage(ret.toString()); // for convenience -- we always need it e.setNestedEvaluate(engine()->isEvaluating()); if (postEvent) { QScriptDebuggerEventEvent *de = new QScriptDebuggerEventEvent(e); d->postEvent(de); } else { event(e); } }
void JavascriptInstance::IncludeFile(const QString &path) { for(uint i = 0; i < includedFiles.size(); ++i) if (includedFiles[i].toLower() == path.toLower()) { LogDebug("JavascriptInstance::IncludeFile: Not including already included file " + path); return; } QString script = LoadScript(path); QScriptContext *context = engine_->currentContext(); assert(context); if (!context) { LogError("JavascriptInstance::IncludeFile: QScriptEngine::currentContext() returned null!"); return; } QScriptContext *parent = context->parentContext(); if (!parent) { LogError("JavascriptInstance::IncludeFile: QScriptEngine::parentContext() returned null!"); return; } context->setActivationObject(context->parentContext()->activationObject()); context->setThisObject(context->parentContext()->thisObject()); QScriptSyntaxCheckResult syntaxResult = engine_->checkSyntax(script); if(syntaxResult.state() != QScriptSyntaxCheckResult::Valid) { LogError("JavascriptInstance::IncludeFile: Syntax error in " + path + ". " + syntaxResult.errorMessage() + " In line:" + QString::number(syntaxResult.errorLineNumber())); return; } QScriptValue result = engine_->evaluate(script, path); includedFiles.push_back(path); if (engine_->hasUncaughtException()) LogError(result.toString()); }
bool HttpHandlerQtScriptFile::handleRequest(Pillow::HttpConnection *request) { if (!_lastModified.isValid() || (_autoReload && QFileInfo(_fileName).lastModified() > _lastModified)) { // Time to (re)load the script. qDebug() << "HttpHandlerQtScriptFile::handleRequest: (re)loading" << _fileName; QFile file(_fileName); if (!file.open(QIODevice::ReadOnly)) { request->writeResponseString(500, HttpHeaderCollection(), QString("HttpHandlerQtScriptFile::handleRequest: Could not read file %1").arg(_fileName)); return true; } QScriptEngine* engine = _scriptObject.engine(); _scriptObject = engine->newObject(); QScriptContext* context = engine->pushContext(); context->setActivationObject(_scriptObject); context->setThisObject(_scriptObject); QScriptValue result = engine->evaluate(file.readAll(), _fileName); engine->popContext(); if (result.isError()) { request->writeResponseString(500, HttpHeaderCollection(), QString("HttpHandlerQtScriptFile::handleRequest: Error while evaluating script %1: %2").arg(_fileName).arg(objectToString(result))); return true; } QScriptValue scriptFunction = _scriptObject.property(_functionName); if (!scriptFunction.isFunction()) { request->writeResponseString(500, HttpHeaderCollection(), QString("HttpHandlerQtScriptFile::handleRequest: Error while evaluating script %1: '%2' is not a function defined in the script").arg(_fileName).arg(_functionName)); return true; } _lastModified = QFileInfo(_fileName).lastModified(); setScriptFunction(scriptFunction); } return HttpHandlerQtScript::handleRequest(request); }