QScriptValue QDeclarativeObjectScriptClass::newQObject(QObject *object, int type) { QScriptEngine *scriptEngine = QDeclarativeEnginePrivate::getScriptEngine(engine); if (!object) return newObject(scriptEngine, this, new ObjectData(object, type)); if (QObjectPrivate::get(object)->wasDeleted) return scriptEngine->undefinedValue(); QDeclarativeData *ddata = QDeclarativeData::get(object, true); if (!ddata) { return scriptEngine->undefinedValue(); } else if (!ddata->indestructible && !object->parent()) { return newObject(scriptEngine, this, new ObjectData(object, type)); } else if (!ddata->scriptValue) { ddata->scriptValue = new QScriptValue(newObject(scriptEngine, this, new ObjectData(object, type))); return *ddata->scriptValue; } else if (ddata->scriptValue->engine() == QDeclarativeEnginePrivate::getScriptEngine(engine)) { return *ddata->scriptValue; } else { return newObject(scriptEngine, this, new ObjectData(object, type)); } }
void MetaCallArgument::initAsType(int callType, QDeclarativeEngine *e) { if (type != 0) { cleanup(); type = 0; } if (callType == 0) return; QScriptEngine *engine = QDeclarativeEnginePrivate::getScriptEngine(e); if (callType == qMetaTypeId<QScriptValue>()) { new (&data) QScriptValue(engine->undefinedValue()); type = callType; } else if (callType == QMetaType::Int || callType == QMetaType::UInt || callType == QMetaType::Bool || callType == QMetaType::Double || callType == QMetaType::Float) { type = callType; } else if (callType == QMetaType::QObjectStar) { *((QObject **)&data) = 0; type = callType; } else if (callType == QMetaType::QString) { new (&data) QString(); type = callType; } else if (callType == qMetaTypeId<QVariant>()) { type = callType; new (&data) QVariant(); } else if (callType == qMetaTypeId<QList<QObject *> >()) { type = callType; new (&data) QList<QObject *>(); } else { type = -1; new (&data) QVariant(callType, (void *)0); } }
//! [37] QScriptValue Employee_ctor(QScriptContext *context, QScriptEngine *engine) { QScriptValue super = context->callee().property("prototype").property("constructor"); super.call(context->thisObject(), QScriptValueList() << context->argument(0)); context->thisObject().setProperty("salary", context->argument(1)); return engine->undefinedValue(); }
QScriptValue QPointF_prototype_setX(QScriptContext *context, QScriptEngine *engine) { // Cast to a pointer to be able to modify the underlying C++ value QPointF *point = qscriptvalue_cast<QPointF*>(context->thisObject()); if (!point) return context->throwError(QScriptContext::TypeError, "QPointF.prototype.setX: this object is not a QPointF"); point->setX(context->argument(0).toNumber()); return engine->undefinedValue(); }
//! [45] QScriptValue myPrintFunction(QScriptContext *context, QScriptEngine *engine) { QString result; for (int i = 0; i < context->argumentCount(); ++i) { if (i > 0) result.append(" "); result.append(context->argument(i).toString()); } QScriptValue calleeData = context->callee().data(); QPlainTextEdit *edit = qobject_cast<QPlainTextEdit*>(calleeData.toQObject()); edit->appendPlainText(result); return engine->undefinedValue(); }
QScriptValue FlatListModel::get(int index) const { QScriptEngine *scriptEngine = m_scriptEngine ? m_scriptEngine : QDeclarativeEnginePrivate::getScriptEngine(qmlEngine(m_listModel)); if (!scriptEngine) return 0; if (index < 0 || index >= m_values.count()) return scriptEngine->undefinedValue(); QScriptValue rv = scriptEngine->newObject(); QHash<int, QVariant> row = m_values.at(index); for (QHash<int, QVariant>::ConstIterator iter = row.begin(); iter != row.end(); ++iter) rv.setProperty(m_roles.value(iter.key()), qScriptValueFromValue(scriptEngine, iter.value())); return rv; }
QScriptValue NestedListModel::get(int index) const { QDeclarativeEngine *eng = qmlEngine(m_listModel); if (!eng) return 0; if (index < 0 || index >= count()) { QScriptEngine *seng = QDeclarativeEnginePrivate::getScriptEngine(eng); if (seng) return seng->undefinedValue(); return 0; } ModelNode *node = qvariant_cast<ModelNode *>(_root->values.at(index)); if (!node) return 0; return QDeclarativeEnginePrivate::qmlScriptObject(node->object(this), eng); }
void tst_QScriptContext::argumentsObjectInNative() { { QScriptEngine eng; QScriptValue fun = eng.newFunction(argumentsObjectInNative_test1); QScriptValueList args; args << QScriptValue(&eng, 123.0); args << QScriptValue(&eng, QString::fromLatin1("456")); QScriptValue result = fun.call(eng.undefinedValue(), args); QVERIFY(!eng.hasUncaughtException()); QCOMPARE(result.toString(), QString::fromLatin1("success")); } { QScriptEngine eng; QScriptValue fun = eng.newFunction(argumentsObjectInNative_test1); eng.globalObject().setProperty("func", fun); QScriptValue result = eng.evaluate("func(123.0 , 456);"); QVERIFY(!eng.hasUncaughtException()); QCOMPARE(result.toString(), QString::fromLatin1("success")); } }
QScriptValue FlatListModel::get(int index) const { QScriptEngine *scriptEngine = m_scriptEngine ? m_scriptEngine : QDeclarativeEnginePrivate::getScriptEngine(qmlEngine(m_listModel)); if (!scriptEngine) return 0; if (index < 0 || index >= m_values.count()) return scriptEngine->undefinedValue(); FlatListModel *that = const_cast<FlatListModel*>(this); if (!m_scriptClass) that->m_scriptClass = new FlatListScriptClass(that, scriptEngine); FlatNodeData *data = m_nodeData.value(index); if (!data) { data = new FlatNodeData(index); that->m_nodeData.replace(index, data); } return QScriptDeclarativeClass::newObject(scriptEngine, m_scriptClass, new FlatNodeObjectData(data)); }
void MetaCallArgument::initAsType(int callType, QDeclarativeEngine *e) { if (type != 0) { cleanup(); type = 0; } if (callType == 0) return; QScriptEngine *engine = QDeclarativeEnginePrivate::getScriptEngine(e); if (callType == qMetaTypeId<QScriptValue>()) { qscriptValuePtr = new (&allocData) QScriptValue(engine->undefinedValue()); type = callType; } else if (callType == QMetaType::Int || callType == QMetaType::UInt || callType == QMetaType::Bool || callType == QMetaType::Double || callType == QMetaType::Float) { type = callType; } else if (callType == QMetaType::QObjectStar) { qobjectPtr = 0; type = callType; } else if (callType == QMetaType::QString) { qstringPtr = new (&allocData) QString(); type = callType; } else if (callType == qMetaTypeId<QVariant>()) { type = callType; qvariantPtr = new (&allocData) QVariant(); } else if (callType == qMetaTypeId<QList<QObject *> >()) { type = callType; qlistPtr = new (&allocData) QList<QObject *>(); } else if (callType == QMetaType::Void) { // In Qt4 QMetaType::Void and QMetaType::UnknownType were both equals to 0 so QtQuick1 // doesn't always recognize the difference return; } else { type = -1; qvariantPtr = new (&allocData) QVariant(callType, (void *)0); } }