// Puts 'object' into 'variant', moving ownership without copying any data. // If 'pointerId' is not zero, then the pointer to the object will be stored // instead. void putObjectIntoVariant (QVariant &variant, void *object, int typeId, int pointerId) { if (pointerId) { variant = QVariant (pointerId, &object, true); return; } // variant.clear (); QVariant::DataPtr &data = variant.data_ptr (); data.is_shared = true; data.is_null = false; data.type = typeId; data.data.shared = new QVariant::PrivateShared (object); }
/*! \internal convert \a value to \a type, store the result in \a ptr */ bool QJSEngine::convertV2(const QJSValue &value, int type, void *ptr) { QV4::ExecutionEngine *v4 = QJSValuePrivate::engine(&value); QV4::Value scratch; QV4::Value *val = QJSValuePrivate::valueForData(&value, &scratch); if (v4) { QV4::Scope scope(v4); QV4::ScopedValue v(scope, *val); return scope.engine->metaTypeFromJS(v, type, ptr); } if (!val) { QVariant *variant = QJSValuePrivate::getVariant(&value); Q_ASSERT(variant); if (variant->userType() == QMetaType::QString) { QString string = variant->toString(); // have a string based value without engine. Do conversion manually if (type == QMetaType::Bool) { *reinterpret_cast<bool*>(ptr) = string.length() != 0; return true; } if (type == QMetaType::QString) { *reinterpret_cast<QString*>(ptr) = string; return true; } double d = QV4::RuntimeHelpers::stringToNumber(string); switch (type) { case QMetaType::Int: *reinterpret_cast<int*>(ptr) = QV4::Primitive::toInt32(d); return true; case QMetaType::UInt: *reinterpret_cast<uint*>(ptr) = QV4::Primitive::toUInt32(d); return true; case QMetaType::LongLong: *reinterpret_cast<qlonglong*>(ptr) = QV4::Primitive::toInteger(d); return true; case QMetaType::ULongLong: *reinterpret_cast<qulonglong*>(ptr) = QV4::Primitive::toInteger(d); return true; case QMetaType::Double: *reinterpret_cast<double*>(ptr) = d; return true; case QMetaType::Float: *reinterpret_cast<float*>(ptr) = d; return true; case QMetaType::Short: *reinterpret_cast<short*>(ptr) = QV4::Primitive::toInt32(d); return true; case QMetaType::UShort: *reinterpret_cast<unsigned short*>(ptr) = QV4::Primitive::toUInt32(d); return true; case QMetaType::Char: *reinterpret_cast<char*>(ptr) = QV4::Primitive::toInt32(d); return true; case QMetaType::UChar: *reinterpret_cast<unsigned char*>(ptr) = QV4::Primitive::toUInt32(d); return true; case QMetaType::QChar: *reinterpret_cast<QChar*>(ptr) = QV4::Primitive::toUInt32(d); return true; default: return false; } } else { return QMetaType::convert(&variant->data_ptr(), variant->userType(), ptr, type); } } Q_ASSERT(val); switch (type) { case QMetaType::Bool: *reinterpret_cast<bool*>(ptr) = val->toBoolean(); return true; case QMetaType::Int: *reinterpret_cast<int*>(ptr) = val->toInt32(); return true; case QMetaType::UInt: *reinterpret_cast<uint*>(ptr) = val->toUInt32(); return true; case QMetaType::LongLong: *reinterpret_cast<qlonglong*>(ptr) = val->toInteger(); return true; case QMetaType::ULongLong: *reinterpret_cast<qulonglong*>(ptr) = val->toInteger(); return true; case QMetaType::Double: *reinterpret_cast<double*>(ptr) = val->toNumber(); return true; case QMetaType::QString: *reinterpret_cast<QString*>(ptr) = val->toQStringNoThrow(); return true; case QMetaType::Float: *reinterpret_cast<float*>(ptr) = val->toNumber(); return true; case QMetaType::Short: *reinterpret_cast<short*>(ptr) = val->toInt32(); return true; case QMetaType::UShort: *reinterpret_cast<unsigned short*>(ptr) = val->toUInt16(); return true; case QMetaType::Char: *reinterpret_cast<char*>(ptr) = val->toInt32(); return true; case QMetaType::UChar: *reinterpret_cast<unsigned char*>(ptr) = val->toUInt16(); return true; case QMetaType::QChar: *reinterpret_cast<QChar*>(ptr) = val->toUInt16(); return true; default: return false; } }