本文整理汇总了C++中QScriptContext::pushScope方法的典型用法代码示例。如果您正苦于以下问题:C++ QScriptContext::pushScope方法的具体用法?C++ QScriptContext::pushScope怎么用?C++ QScriptContext::pushScope使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类QScriptContext
的用法示例。
在下文中一共展示了QScriptContext::pushScope方法的9个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: scriptValue
QScriptValue QDeclarativeExpressionPrivate::scriptValue(QObject *secondaryScope, bool *isUndefined)
{
if (!expressionFunctionValid) {
QDeclarativeEngine *engine = context()->engine;
QDeclarativeEnginePrivate *ep = QDeclarativeEnginePrivate::get(engine);
QScriptEngine *scriptEngine = QDeclarativeEnginePrivate::getScriptEngine(engine);
QScriptContext *scriptContext = QScriptDeclarativeClass::pushCleanContext(scriptEngine);
expressionContext = ep->contextClass->newContext(context(), scopeObject);
scriptContext->pushScope(expressionContext);
scriptContext->pushScope(ep->globalClass->staticGlobalObject());
QDeclarativeRewrite::RewriteBinding rewriteBinding;
rewriteBinding.setName(name);
bool ok = true;
const QString code = rewriteBinding(expression, &ok);
if (ok)
expressionFunction = scriptEngine->evaluate(code, url, line);
scriptEngine->popContext();
expressionFunctionMode = ExplicitContext;
expressionFunctionValid = true;
}
return QDeclarativeQtScriptExpression::scriptValue(secondaryScope, isUndefined);
}
示例2: worker_include
QScriptValue QDeclarativeInclude::worker_include(QScriptContext *ctxt, QScriptEngine *engine)
{
if (ctxt->argumentCount() == 0)
return engine->undefinedValue();
QString urlString = ctxt->argument(0).toString();
QUrl url(ctxt->argument(0).toString());
if (url.isRelative()) {
QString contextUrl = QScriptDeclarativeClass::scopeChainValue(ctxt, -3).data().toString();
Q_ASSERT(!contextUrl.isEmpty());
url = QUrl(contextUrl).resolved(url);
urlString = url.toString();
}
QString localFile = QDeclarativeEnginePrivate::urlToLocalFileOrQrc(url);
QScriptValue func = ctxt->argument(1);
if (!func.isFunction())
func = QScriptValue();
QScriptValue result;
if (!localFile.isEmpty()) {
QFile f(localFile);
if (f.open(QIODevice::ReadOnly)) {
QByteArray data = f.readAll();
QString code = QString::fromUtf8(data);
QScriptContext *scriptContext = QScriptDeclarativeClass::pushCleanContext(engine);
QScriptValue urlContext = engine->newObject();
urlContext.setData(QScriptValue(engine, urlString));
scriptContext->pushScope(urlContext);
QScriptValue scope = QScriptDeclarativeClass::scopeChainValue(ctxt, -4);
scriptContext->pushScope(scope);
scriptContext->setActivationObject(scope);
QDeclarativeScriptParser::extractPragmas(code);
engine->evaluate(code, urlString, 1);
engine->popContext();
if (engine->hasUncaughtException()) {
result = resultValue(engine, Exception);
result.setProperty(QLatin1String("exception"), engine->uncaughtException());
engine->clearExceptions();
} else {
result = resultValue(engine, Ok);
}
callback(engine, func, result);
} else {
result = resultValue(engine, NetworkError);
callback(engine, func, result);
}
}
return result;
}
示例3: finished
void QDeclarativeInclude::finished()
{
m_redirectCount++;
if (m_redirectCount < INCLUDE_MAXIMUM_REDIRECT_RECURSION) {
QVariant redirect = m_reply->attribute(QNetworkRequest::RedirectionTargetAttribute);
if (redirect.isValid()) {
m_url = m_url.resolved(redirect.toUrl());
delete m_reply;
QNetworkRequest request;
request.setUrl(m_url);
m_reply = m_network->get(request);
QObject::connect(m_reply, SIGNAL(finished()), this, SLOT(finished()));
return;
}
}
if (m_reply->error() == QNetworkReply::NoError) {
QDeclarativeEnginePrivate *ep = QDeclarativeEnginePrivate::get(m_engine);
QByteArray data = m_reply->readAll();
QString code = QString::fromUtf8(data);
QString urlString = m_url.toString();
QScriptContext *scriptContext = QScriptDeclarativeClass::pushCleanContext(m_scriptEngine);
scriptContext->pushScope(ep->contextClass->newUrlContext(m_context, 0, urlString));
scriptContext->pushScope(m_scope[0]);
scriptContext->pushScope(m_scope[1]);
scriptContext->setActivationObject(m_scope[1]);
QDeclarativeScriptParser::extractPragmas(code);
m_scriptEngine->evaluate(code, urlString, 1);
m_scriptEngine->popContext();
if (m_scriptEngine->hasUncaughtException()) {
m_result.setProperty(QLatin1String("status"), QScriptValue(m_scriptEngine, Exception));
m_result.setProperty(QLatin1String("exception"), m_scriptEngine->uncaughtException());
m_scriptEngine->clearExceptions();
} else {
m_result.setProperty(QLatin1String("status"), QScriptValue(m_scriptEngine, Ok));
}
} else {
m_result.setProperty(QLatin1String("status"), QScriptValue(m_scriptEngine, NetworkError));
}
callback(m_scriptEngine, m_callback, m_result);
disconnect();
deleteLater();
}
示例4: init
void QDeclarativeExpressionPrivate::init(QDeclarativeContextData *ctxt, void *expr,
QDeclarativeRefCount *rc,
QObject *me, const QString &srcUrl, int lineNumber)
{
url = srcUrl;
line = lineNumber;
if (dataRef) dataRef->release();
dataRef = rc;
if (dataRef) dataRef->addref();
quint32 *exprData = (quint32 *)expr;
QDeclarativeCompiledData *dd = (QDeclarativeCompiledData *)rc;
expression = QString::fromRawData((QChar *)(exprData + 2), exprData[1]);
int progIdx = *(exprData);
bool isSharedProgram = progIdx & 0x80000000;
progIdx &= 0x7FFFFFFF;
QDeclarativeEngine *engine = ctxt->engine;
QDeclarativeEnginePrivate *ep = QDeclarativeEnginePrivate::get(engine);
QScriptEngine *scriptEngine = QDeclarativeEnginePrivate::getScriptEngine(engine);
if (isSharedProgram) {
if (!dd->cachedClosures.at(progIdx)) {
QScriptContext *scriptContext = QScriptDeclarativeClass::pushCleanContext(scriptEngine);
scriptContext->pushScope(ep->contextClass->newSharedContext());
scriptContext->pushScope(ep->globalClass->staticGlobalObject());
dd->cachedClosures[progIdx] = new QScriptValue(scriptEngine->evaluate(expression, url, line));
scriptEngine->popContext();
}
expressionFunction = *dd->cachedClosures.at(progIdx);
expressionFunctionMode = SharedContext;
expressionFunctionValid = true;
} else {
if (!dd->cachedPrograms.at(progIdx)) {
dd->cachedPrograms[progIdx] = new QScriptProgram(expression, url, line);
}
expressionFunction = evalInObjectScope(ctxt, me, *dd->cachedPrograms.at(progIdx),
&expressionContext);
expressionFunctionMode = ExplicitContext;
expressionFunctionValid = true;
}
QDeclarativeAbstractExpression::setContext(ctxt);
scopeObject = me;
}
示例5: doStart
void doStart(const JavaScriptCommand *cmd, Transformer *transformer)
{
m_result.success = true;
m_result.errorMessage.clear();
ScriptEngine * const scriptEngine = provideScriptEngine();
QScriptValue scope = scriptEngine->newObject();
PrepareScriptObserver observer(scriptEngine);
setupScriptEngineForFile(scriptEngine, transformer->rule->prepareScript->fileContext, scope);
setupScriptEngineForProduct(scriptEngine, transformer->product(), transformer->rule->module, scope,
&observer);
transformer->setupInputs(scope);
transformer->setupOutputs(scriptEngine, scope);
for (QVariantMap::const_iterator it = cmd->properties().constBegin();
it != cmd->properties().constEnd(); ++it) {
scope.setProperty(it.key(), scriptEngine->toScriptValue(it.value()));
}
QScriptContext *ctx = scriptEngine->currentContext();
ctx->pushScope(scope);
scriptEngine->evaluate(cmd->sourceCode());
ctx->popScope();
transformer->propertiesRequestedInCommands
+= scriptEngine->propertiesRequestedInScript();
scriptEngine->clearRequestedProperties();
if (scriptEngine->hasUncaughtException()) {
// ### We don't know the line number of the command's sourceCode property assignment.
setError(scriptEngine->uncaughtException().toString(), cmd->codeLocation());
}
}
示例6: popNativeContextScope
void tst_QScriptContext::popNativeContextScope()
{
QScriptEngine eng;
QScriptContext *ctx = eng.pushContext();
QVERIFY(ctx->popScope().isObject()); // the activation object
QCOMPARE(ctx->scopeChain().size(), 1);
QVERIFY(ctx->scopeChain().at(0).strictlyEquals(eng.globalObject()));
// This was different in 4.5: scope and activation were decoupled
QVERIFY(ctx->activationObject().strictlyEquals(eng.globalObject()));
QVERIFY(!eng.evaluate("var foo = 123; function bar() {}").isError());
QVERIFY(eng.globalObject().property("foo").isNumber());
QVERIFY(eng.globalObject().property("bar").isFunction());
QScriptValue customScope = eng.newObject();
ctx->pushScope(customScope);
QCOMPARE(ctx->scopeChain().size(), 2);
QVERIFY(ctx->scopeChain().at(0).strictlyEquals(customScope));
QVERIFY(ctx->scopeChain().at(1).strictlyEquals(eng.globalObject()));
QVERIFY(ctx->activationObject().strictlyEquals(eng.globalObject()));
ctx->setActivationObject(customScope);
QVERIFY(ctx->activationObject().strictlyEquals(customScope));
QCOMPARE(ctx->scopeChain().size(), 2);
QVERIFY(ctx->scopeChain().at(0).strictlyEquals(customScope));
QEXPECT_FAIL("", "QTBUG-11012", Continue);
QVERIFY(ctx->scopeChain().at(1).strictlyEquals(eng.globalObject()));
QVERIFY(!eng.evaluate("baz = 456; var foo = 789; function barbar() {}").isError());
QEXPECT_FAIL("", "QTBUG-11012", Continue);
QVERIFY(eng.globalObject().property("baz").isNumber());
QVERIFY(customScope.property("foo").isNumber());
QVERIFY(customScope.property("barbar").isFunction());
QVERIFY(ctx->popScope().strictlyEquals(customScope));
QCOMPARE(ctx->scopeChain().size(), 1);
QEXPECT_FAIL("", "QTBUG-11012", Continue);
QVERIFY(ctx->scopeChain().at(0).strictlyEquals(eng.globalObject()));
// Need to push another object, otherwise we crash in popContext() (QTBUG-11012)
ctx->pushScope(customScope);
eng.popContext();
}
示例7: addImportedScript
void QDeclarativeContextData::addImportedScript(const QDeclarativeParser::Object::ScriptBlock &script)
{
if (!engine)
return;
QDeclarativeEnginePrivate *enginePriv = QDeclarativeEnginePrivate::get(engine);
QScriptEngine *scriptEngine = QDeclarativeEnginePrivate::getScriptEngine(engine);
const QString &code = script.code;
const QString &url = script.file;
const QDeclarativeParser::Object::ScriptBlock::Pragmas &pragmas = script.pragmas;
Q_ASSERT(!url.isEmpty());
if (pragmas & QDeclarativeParser::Object::ScriptBlock::Shared) {
QHash<QString, QScriptValue>::Iterator iter = enginePriv->m_sharedScriptImports.find(url);
if (iter == enginePriv->m_sharedScriptImports.end()) {
QScriptContext *scriptContext = QScriptDeclarativeClass::pushCleanContext(scriptEngine);
scriptContext->pushScope(enginePriv->contextClass->newUrlContext(url));
scriptContext->pushScope(enginePriv->globalClass->staticGlobalObject());
QScriptValue scope = QScriptDeclarativeClass::newStaticScopeObject(scriptEngine);
scriptContext->pushScope(scope);
scriptEngine->evaluate(code, url, 1);
if (scriptEngine->hasUncaughtException()) {
QDeclarativeError error;
QDeclarativeExpressionPrivate::exceptionToError(scriptEngine, error);
enginePriv->warning(error);
}
scriptEngine->popContext();
iter = enginePriv->m_sharedScriptImports.insert(url, scope);
}
importedScripts.append(*iter);
} else {
QScriptContext *scriptContext = QScriptDeclarativeClass::pushCleanContext(scriptEngine);
scriptContext->pushScope(enginePriv->contextClass->newUrlContext(this, 0, url));
scriptContext->pushScope(enginePriv->globalClass->staticGlobalObject());
QScriptValue scope = QScriptDeclarativeClass::newStaticScopeObject(scriptEngine);
scriptContext->pushScope(scope);
scriptEngine->evaluate(code, url, 1);
if (scriptEngine->hasUncaughtException()) {
QDeclarativeError error;
QDeclarativeExpressionPrivate::exceptionToError(scriptEngine, error);
enginePriv->warning(error);
}
scriptEngine->popContext();
importedScripts.append(scope);
}
}
示例8: QCOMPARE
void tst_QScriptContext::pushAndPopScope()
{
QScriptEngine eng;
QScriptContext *ctx = eng.currentContext();
QCOMPARE(ctx->scopeChain().size(), 1);
QVERIFY(ctx->scopeChain().at(0).strictlyEquals(eng.globalObject()));
QVERIFY(ctx->popScope().strictlyEquals(eng.globalObject()));
ctx->pushScope(eng.globalObject());
QCOMPARE(ctx->scopeChain().size(), 1);
QVERIFY(ctx->scopeChain().at(0).strictlyEquals(eng.globalObject()));
QScriptValue obj = eng.newObject();
ctx->pushScope(obj);
QCOMPARE(ctx->scopeChain().size(), 2);
QVERIFY(ctx->scopeChain().at(0).strictlyEquals(obj));
QVERIFY(ctx->scopeChain().at(1).strictlyEquals(eng.globalObject()));
QVERIFY(ctx->popScope().strictlyEquals(obj));
QCOMPARE(ctx->scopeChain().size(), 1);
QVERIFY(ctx->scopeChain().at(0).strictlyEquals(eng.globalObject()));
{
QScriptValue ret = eng.evaluate("x");
QVERIFY(ret.isError());
eng.clearExceptions();
}
QCOMPARE(ctx->scopeChain().size(), 1);
QVERIFY(ctx->scopeChain().at(0).strictlyEquals(eng.globalObject()));
// task 236685
QScriptValue qobj = eng.newQObject(this, QScriptEngine::QtOwnership, QScriptEngine::AutoCreateDynamicProperties);
ctx->pushScope(qobj);
QCOMPARE(ctx->scopeChain().size(), 2);
QVERIFY(ctx->scopeChain().at(0).strictlyEquals(qobj));
QVERIFY(ctx->scopeChain().at(1).strictlyEquals(eng.globalObject()));
{
QScriptValue ret = eng.evaluate("print");
QVERIFY(ret.isFunction());
}
ctx->popScope();
ctx->pushScope(obj);
QCOMPARE(ctx->scopeChain().size(), 2);
QVERIFY(ctx->scopeChain().at(0).strictlyEquals(obj));
obj.setProperty("x", 123);
{
QScriptValue ret = eng.evaluate("x");
QVERIFY(ret.isNumber());
QCOMPARE(ret.toInt32(), 123);
}
QVERIFY(ctx->popScope().strictlyEquals(obj));
QCOMPARE(ctx->scopeChain().size(), 1);
QVERIFY(ctx->scopeChain().at(0).strictlyEquals(eng.globalObject()));
ctx->pushScope(QScriptValue());
QCOMPARE(ctx->scopeChain().size(), 1);
QVERIFY(ctx->popScope().strictlyEquals(eng.globalObject()));
QVERIFY(ctx->scopeChain().isEmpty());
// Used to work with old back-end, doesn't with new one because JSC requires that the last object in
// a scope chain is the Global Object.
QTest::ignoreMessage(QtWarningMsg, "QScriptContext::pushScope() failed: initial object in scope chain has to be the Global Object");
ctx->pushScope(obj);
QCOMPARE(ctx->scopeChain().size(), 0);
QScriptEngine eng2;
QScriptValue obj2 = eng2.newObject();
QTest::ignoreMessage(QtWarningMsg, "QScriptContext::pushScope() failed: cannot push an object created in a different engine");
ctx->pushScope(obj2);
QVERIFY(ctx->scopeChain().isEmpty());
QVERIFY(!ctx->popScope().isValid());
}
示例9: include
/*
Documented in qdeclarativeengine.cpp
*/
QScriptValue QDeclarativeInclude::include(QScriptContext *ctxt, QScriptEngine *engine)
{
if (ctxt->argumentCount() == 0)
return engine->undefinedValue();
QDeclarativeEnginePrivate *ep = QDeclarativeEnginePrivate::get(engine);
QUrl contextUrl = ep->contextClass->urlFromValue(QScriptDeclarativeClass::scopeChainValue(ctxt, -3));
if (contextUrl.isEmpty())
return ctxt->throwError(QLatin1String("Qt.include(): Can only be called from JavaScript files"));
QString urlString = ctxt->argument(0).toString();
QUrl url(urlString);
if (url.isRelative()) {
url = QUrl(contextUrl).resolved(url);
urlString = url.toString();
}
QString localFile = QDeclarativeEnginePrivate::urlToLocalFileOrQrc(url);
QScriptValue func = ctxt->argument(1);
if (!func.isFunction())
func = QScriptValue();
QScriptValue result;
if (localFile.isEmpty()) {
QDeclarativeInclude *i =
new QDeclarativeInclude(url, QDeclarativeEnginePrivate::getEngine(engine), ctxt);
if (func.isValid())
i->setCallback(func);
result = i->result();
} else {
QFile f(localFile);
if (f.open(QIODevice::ReadOnly)) {
QByteArray data = f.readAll();
QString code = QString::fromUtf8(data);
QDeclarativeContextData *context =
ep->contextClass->contextFromValue(QScriptDeclarativeClass::scopeChainValue(ctxt, -3));
QScriptContext *scriptContext = QScriptDeclarativeClass::pushCleanContext(engine);
scriptContext->pushScope(ep->contextClass->newUrlContext(context, 0, urlString));
scriptContext->pushScope(ep->globalClass->staticGlobalObject());
QScriptValue scope = QScriptDeclarativeClass::scopeChainValue(ctxt, -5);
scriptContext->pushScope(scope);
scriptContext->setActivationObject(scope);
QDeclarativeScriptParser::extractPragmas(code);
engine->evaluate(code, urlString, 1);
engine->popContext();
if (engine->hasUncaughtException()) {
result = resultValue(engine, Exception);
result.setProperty(QLatin1String("exception"), engine->uncaughtException());
engine->clearExceptions();
} else {
result = resultValue(engine, Ok);
}
callback(engine, func, result);
} else {
result = resultValue(engine, NetworkError);
callback(engine, func, result);
}
}
return result;
}