GScriptValue doCreateScriptValueFromVariant( const GContextPointer & context, const GVariant & value, const GMetaType & type, const bool transferOwnership ) { const GVariantType vt = static_cast<GVariantType>((GVtType)value.getType() & ~(GVtType)GVariantType::maskByReference); if(! type.isEmpty() && type.getPointerDimension() <= 1) { GScopedInterface<IMetaTypedItem> typedItem(context->getService()->findTypedItemByName(type.getBaseName())); if(typedItem) { GASSERT_MSG(!! metaIsClass(typedItem->getCategory()), "Unknown type"); return GScriptValue::fromObject(value, gdynamic_cast<IMetaClass *>(typedItem.get()), transferOwnership, metaTypeToCV(type)); } else { if(vtIsInterface(vt)) { IObject * obj = fromVariant<IObject *>(value); if(IMetaClass * metaClass = dynamic_cast<IMetaClass *>(obj)) { return GScriptValue::fromClass(metaClass); } } } } return GScriptValue::fromPrimary(value); }
unsigned int getVariantTypeSize(GVariantType type) { switch(static_cast<int>(type)) { case vtEmpty: case vtVoid: return 0; case vtBool: return sizeof(bool); case vtChar: return sizeof(char); case vtWchar: return sizeof(wchar_t); case vtSignedChar: return sizeof(signed char); case vtUnsignedChar: return sizeof(unsigned char); case vtSignedShort: return sizeof(signed short); case vtUnsignedShort: return sizeof(unsigned short); case vtSignedInt: return sizeof(signed int); case vtUnsignedInt: return sizeof(unsigned int); case vtSignedLong: return sizeof(signed long); case vtUnsignedLong: return sizeof(unsigned long); case vtSignedLongLong: return sizeof(signed long long); case vtUnsignedLongLong: return sizeof(unsigned long long); case vtFloat: return sizeof(float); case vtDouble: return sizeof(double); case vtLongDouble: return 0; // sizeof(long double); on iOS, long double is 16 bytes which is too big. case vtShadow: case vtObject: case vtPointer: case vtString: case vtWideString: case vtInterface: case vtTypedVar: return sizeof(void *); default: if(vtIsByPointer(type) || vtIsByReference(type)) { return sizeof(void *); } } GASSERT_MSG(false, "Can't detect variant type size."); return 0; }