| 998 | |
| 999 | |
| 1000 | void genVariantValueTemp0(int inOffset, const JitVal &inDest, ExprType destType) HXCPP_OVERRIDE |
| 1001 | { |
| 1002 | std::vector<JumpId> jumpDone; |
| 1003 | |
| 1004 | move(sJitTemp1, sJitTemp0.star(jtInt, inOffset + (int)offsetof(cpp::Variant,type) ) ); |
| 1005 | switch(destType) |
| 1006 | { |
| 1007 | case etObject: |
| 1008 | { |
| 1009 | JumpId isObject = compare(cmpI_EQUAL, sJitTemp1.as(jtInt), (int)cpp::Variant::typeObject, 0); |
| 1010 | |
| 1011 | // Not object ... |
| 1012 | add( sJitArg0, sJitTemp0.as(jtPointer), inOffset ); |
| 1013 | callNative( (void *)variantToObject, sJitArg0 ); |
| 1014 | if (inDest!=sJitReturnReg) |
| 1015 | move(inDest, sJitReturnReg.as(jtPointer)); |
| 1016 | |
| 1017 | jumpDone.push_back( jump() ); |
| 1018 | |
| 1019 | comeFrom(isObject); |
| 1020 | move( inDest, sJitTemp0.star(jtPointer, inOffset + (int)offsetof(cpp::Variant,valObject) ) ); |
| 1021 | } |
| 1022 | break; |
| 1023 | case etString: |
| 1024 | { |
| 1025 | JumpId isString = compare(cmpI_EQUAL, sJitTemp1.as(jtInt), (int)cpp::Variant::typeString, 0); |
| 1026 | |
| 1027 | // Not string ... |
| 1028 | add( sJitArg0, sJitTemp0.as(jtPointer), inOffset ); |
| 1029 | callNative( (void *)variantToString, sJitArg0, inDest.as(jtString) ); |
| 1030 | jumpDone.push_back( jump() ); |
| 1031 | |
| 1032 | comeFrom(isString); |
| 1033 | move( inDest.as(jtInt), sJitTemp0.star(jtInt, inOffset + (int)offsetof(cpp::Variant,valStringLen) ) ); |
| 1034 | move( inDest.as(jtPointer) + StringOffset::Ptr, sJitTemp0.star(jtPointer, inOffset + (int)offsetof(cpp::Variant,valStringPtr) ) ); |
| 1035 | } |
| 1036 | break; |
| 1037 | |
| 1038 | case etFloat: |
| 1039 | { |
| 1040 | JumpId isFloat = compare(cmpI_EQUAL, sJitTemp1.as(jtInt), (int)cpp::Variant::typeDouble, 0); |
| 1041 | |
| 1042 | JumpId notInt = compare(cmpI_NOT_EQUAL, sJitTemp1.as(jtInt), (int)cpp::Variant::typeInt, 0); |
| 1043 | // Is int... |
| 1044 | convert( sJitTemp0.star(jtInt, inOffset + (int)offsetof(cpp::Variant,valInt) ), etInt, inDest, destType ); |
| 1045 | jumpDone.push_back( jump() ); |
| 1046 | |
| 1047 | comeFrom(notInt); |
| 1048 | // Not Int/Float ... |
| 1049 | add( sJitArg0, sJitTemp0.as(jtPointer), inOffset ); |
| 1050 | callNative( (void *)variantToFloat, sJitArg0, inDest.as(jtFloat) ); |
| 1051 | jumpDone.push_back( jump() ); |
| 1052 | |
| 1053 | comeFrom(isFloat); |
| 1054 | move( inDest.as(jtFloat), sJitTemp0.star(jtFloat, inOffset + (int)offsetof(cpp::Variant,valDouble) ) ); |
| 1055 | } |
| 1056 | break; |
| 1057 | |