MCPcopy Create free account
hub / github.com/AutoHotkey/AutoHotkey / TokenToVariant

Function TokenToVariant

source/script_com.cpp:769–848  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

767
768
769void TokenToVariant(ExprTokenType &aToken, VARIANT &aVar, TTVArgType *aVarIsArg)
770{
771 if (aVarIsArg)
772 *aVarIsArg = VariantIsValue;
773
774 if (aToken.symbol == SYM_VAR)
775 aToken.var->ToTokenSkipAddRef(aToken);
776
777 switch(aToken.symbol)
778 {
779 case SYM_STRING:
780 aVar.vt = VT_BSTR;
781 aVar.bstrVal = SysAllocString(CStringWCharFromTCharIfNeeded(aToken.marker));
782 if (aVarIsArg)
783 *aVarIsArg = VariantIsAllocatedString;
784 break;
785 case SYM_INTEGER:
786 {
787 __int64 val = aToken.value_int64;
788 if (val == (int)val)
789 {
790 aVar.vt = VT_I4;
791 aVar.lVal = (int)val;
792 }
793 else
794 {
795 aVar.vt = VT_R8;
796 aVar.dblVal = (double)val;
797 }
798 }
799 break;
800 case SYM_FLOAT:
801 aVar.vt = VT_R8;
802 aVar.dblVal = aToken.value_double;
803 break;
804 case SYM_OBJECT:
805 if (ComObject *obj = dynamic_cast<ComObject *>(aToken.object))
806 {
807 obj->ToVariant(aVar);
808 if (!aVarIsArg)
809 {
810 if (aVar.vt == VT_DISPATCH || aVar.vt == VT_UNKNOWN)
811 {
812 if (aVar.punkVal)
813 aVar.punkVal->AddRef();
814 }
815 else if ((aVar.vt & ~VT_TYPEMASK) == VT_ARRAY && (obj->mFlags & ComObject::F_OWNVALUE))
816 {
817 // Copy array since both sides will call Destroy().
818 if (FAILED(SafeArrayCopy(aVar.parray, &aVar.parray)))
819 aVar.vt = VT_EMPTY;
820 }
821 }
822 break;
823 }
824 if (aVarIsArg)
825 {
826 // Caller is equipped to marshal VT_BYREF|VT_VARIANT back to VarRef, so check for that.

Callers 2

TokenToVarTypeFunction · 0.85
InvokeMethod · 0.85

Calls 3

ToTokenSkipAddRefMethod · 0.80
ToVariantMethod · 0.80
AddRefMethod · 0.45

Tested by

no test coverage detected