| 767 | |
| 768 | |
| 769 | void 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. |
no test coverage detected