QVariant QuickInterpreter::call(QObject *ctx, const QString &func, const QVariantList &args) { QSList l; for (int i=0; i<args.size(); ++i) { const QVariant &v = args.at(i); switch (v.type()) { case QMetaType::QObjectStar: l.append(wrap(qvariant_cast<QObject *>(v))); break; case QMetaType::VoidStar: qWarning("QuickInterpreter::call: don't know what to do with a " "QVariant::VoidPointer here..."); break; default: { QuickScriptVariant qsvar(this, v); if (qsvar.isNative()) l.append(qsvar.toNative()); else l.append(qsvar); break; } } } return call(ctx, func, l); }
QSArgument QuickInterpreter::call( QObject *ctx, const QString &func, const QSArgumentList &args ) { QSList l; for ( QSArgumentList::ConstIterator it = args.begin(); it != args.end(); ++it ) { switch ( (*it).type() ) { case QSArgument::Variant: { QuickScriptVariant qsvar(this, (*it).variant()); if (qsvar.isNative()) l.append(qsvar.toNative()); else l.append(qsvar); break; } case QSArgument::QObjectPtr: l.append( wrap( (*it).qobject() ) ); break; case QSArgument::VoidPointer: qWarning( "QuickInterpreter::call: don't know what to do with a " "QSArgument::VoidPointer here..." ); break; default: break; } } return call( ctx, func, l ); }
void qsa_slot_callback(QObject *_this, int callId, int paramCount, const QMetaType::Type *types, const QByteArray *typeNames, void *argumentList[]) { // printf("qsa_slot_callback, id=%d\n", callId); QuickInterpreter *ip = static_cast<QuickInterpreter *>(_this); QSAConnection connection = ip->scriptSlot(callId); Q_ASSERT(connection.sender); Q_ASSERT(connection.signal.length()); Q_ASSERT(connection.function_ref.isValid()); QSEnv *env = ip->env(); QSList arguments; for (int i=1; i<paramCount; ++i) { QSATypeInfo info; info.name = typeNames[i]; info.id = types[i]; QSObject val = convert_qt2qsa(env, argumentList[i], info, _this); Q_ASSERT(val.isValid()); arguments.append(val); } QSObject func_base = QSFuncRefClass::refBase(connection.function_ref); QString func_name = QSFuncRefClass::refMember(connection.function_ref).name(); ip->call(func_base, func_name, arguments); }
QSList *QSList::copy() const { QSList *newList = new QSList(); QSListIterator e = end(); QSListIterator it = begin(); while( it != e ) { newList->append( *it ); ++it; } return newList; }
void QuickInterpreter::timerEvent(QTimerEvent *e) { int id = e->timerId(); QSObject function = m_timers[id]; Q_ASSERT(function.isValid()); Q_ASSERT(function.isFunction()); QSList arguments; arguments.append(env()->createNumber(id)); QSObject func_base = QSFuncRefClass::refBase(function); QString func_name = QSFuncRefClass::refMember(function).name(); call(func_base, func_name, arguments); }