Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2014 PDFium Authors. All rights reserved. | 1 // Copyright 2014 PDFium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com | 5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com |
| 6 | 6 |
| 7 #include "xfa/fxfa/fm2js/xfa_fm2jscontext.h" | 7 #include "xfa/fxfa/fm2js/xfa_fm2jscontext.h" |
| 8 | 8 |
| 9 #include <time.h> | 9 #include <time.h> |
| 10 | 10 |
| (...skipping 778 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 789 void CXFA_FM2JSContext::Min(CFXJSE_Value* pThis, | 789 void CXFA_FM2JSContext::Min(CFXJSE_Value* pThis, |
| 790 const CFX_ByteStringC& szFuncName, | 790 const CFX_ByteStringC& szFuncName, |
| 791 CFXJSE_Arguments& args) { | 791 CFXJSE_Arguments& args) { |
| 792 CXFA_FM2JSContext* pContext = | 792 CXFA_FM2JSContext* pContext = |
| 793 static_cast<CXFA_FM2JSContext*>(FXJSE_Value_ToObject(pThis, nullptr)); | 793 static_cast<CXFA_FM2JSContext*>(FXJSE_Value_ToObject(pThis, nullptr)); |
| 794 v8::Isolate* pIsolate = pContext->GetScriptRuntime(); | 794 v8::Isolate* pIsolate = pContext->GetScriptRuntime(); |
| 795 uint32_t uCount = 0; | 795 uint32_t uCount = 0; |
| 796 FX_DOUBLE dMinValue = 0.0; | 796 FX_DOUBLE dMinValue = 0.0; |
| 797 for (int32_t i = 0; i < args.GetLength(); i++) { | 797 for (int32_t i = 0; i < args.GetLength(); i++) { |
| 798 std::unique_ptr<CFXJSE_Value> argValue = args.GetValue(i); | 798 std::unique_ptr<CFXJSE_Value> argValue = args.GetValue(i); |
| 799 if (FXJSE_Value_IsNull(argValue.get())) { | 799 if (FXJSE_Value_IsNull(argValue.get())) |
| 800 continue; | 800 continue; |
| 801 } else if (FXJSE_Value_IsArray(argValue.get())) { | 801 |
| 802 if (FXJSE_Value_IsArray(argValue.get())) { | |
| 802 std::unique_ptr<CFXJSE_Value> lengthValue(new CFXJSE_Value(pIsolate)); | 803 std::unique_ptr<CFXJSE_Value> lengthValue(new CFXJSE_Value(pIsolate)); |
| 803 FXJSE_Value_GetObjectProp(argValue.get(), "length", lengthValue.get()); | 804 FXJSE_Value_GetObjectProp(argValue.get(), "length", lengthValue.get()); |
| 804 int32_t iLength = FXJSE_Value_ToInteger(lengthValue.get()); | 805 int32_t iLength = FXJSE_Value_ToInteger(lengthValue.get()); |
| 805 if (iLength > 2) { | 806 if (iLength <= 2) { |
| 806 std::unique_ptr<CFXJSE_Value> propertyValue(new CFXJSE_Value(pIsolate)); | 807 pContext->ThrowScriptErrorMessage(XFA_IDS_ARGUMENT_MISMATCH); |
| 807 std::unique_ptr<CFXJSE_Value> jsObjectValue(new CFXJSE_Value(pIsolate)); | 808 return; |
|
dsinclair
2016/06/01 14:02:01
Added return due to throw.
| |
| 808 std::unique_ptr<CFXJSE_Value> newPropertyValue( | 809 } |
| 809 new CFXJSE_Value(pIsolate)); | 810 |
| 810 FXJSE_Value_GetObjectPropByIdx(argValue.get(), 1, propertyValue.get()); | 811 std::unique_ptr<CFXJSE_Value> propertyValue(new CFXJSE_Value(pIsolate)); |
| 811 FXJSE_Value_GetObjectPropByIdx(argValue.get(), 2, jsObjectValue.get()); | 812 std::unique_ptr<CFXJSE_Value> jsObjectValue(new CFXJSE_Value(pIsolate)); |
| 812 if (FXJSE_Value_IsNull(propertyValue.get())) { | 813 std::unique_ptr<CFXJSE_Value> newPropertyValue( |
| 813 for (int32_t i = 2; i < iLength; i++) { | 814 new CFXJSE_Value(pIsolate)); |
| 814 FXJSE_Value_GetObjectPropByIdx(argValue.get(), i, | 815 FXJSE_Value_GetObjectPropByIdx(argValue.get(), 1, propertyValue.get()); |
| 815 jsObjectValue.get()); | 816 FXJSE_Value_GetObjectPropByIdx(argValue.get(), 2, jsObjectValue.get()); |
| 816 GetObjectDefaultValue(jsObjectValue.get(), newPropertyValue.get()); | 817 if (FXJSE_Value_IsNull(propertyValue.get())) { |
| 817 if (!FXJSE_Value_IsNull(newPropertyValue.get())) { | 818 for (int32_t i = 2; i < iLength; i++) { |
| 818 uCount++; | 819 FXJSE_Value_GetObjectPropByIdx(argValue.get(), i, |
| 819 if (uCount == 1) { | 820 jsObjectValue.get()); |
| 820 dMinValue = ValueToDouble(pThis, newPropertyValue.get()); | 821 GetObjectDefaultValue(jsObjectValue.get(), newPropertyValue.get()); |
| 821 } else { | 822 if (FXJSE_Value_IsNull(newPropertyValue.get())) |
| 822 FX_DOUBLE dValue = ValueToDouble(pThis, newPropertyValue.get()); | 823 continue; |
| 823 if (dMinValue > dValue) { | 824 |
| 824 dMinValue = dValue; | 825 uCount++; |
| 825 } | 826 FX_DOUBLE dValue = ValueToDouble(pThis, newPropertyValue.get()); |
| 826 } | 827 dMinValue = uCount == 1 ? dValue : std::min(dMinValue, dValue); |
| 827 } | |
| 828 } | |
| 829 } else { | |
| 830 CFX_ByteString propertyStr; | |
| 831 FXJSE_Value_ToUTF8String(propertyValue.get(), propertyStr); | |
| 832 for (int32_t i = 2; i < iLength; i++) { | |
| 833 FXJSE_Value_GetObjectPropByIdx(argValue.get(), i, | |
| 834 jsObjectValue.get()); | |
| 835 FXJSE_Value_GetObjectProp(jsObjectValue.get(), | |
| 836 propertyStr.AsStringC(), | |
| 837 newPropertyValue.get()); | |
| 838 if (!FXJSE_Value_IsNull(newPropertyValue.get())) { | |
| 839 uCount++; | |
| 840 if (uCount == 1) { | |
| 841 dMinValue = ValueToDouble(pThis, newPropertyValue.get()); | |
| 842 } else { | |
| 843 FX_DOUBLE dValue = ValueToDouble(pThis, newPropertyValue.get()); | |
| 844 if (dMinValue > dValue) { | |
| 845 dMinValue = dValue; | |
| 846 } | |
| 847 } | |
| 848 } | |
| 849 } | |
| 850 } | 828 } |
| 851 } else { | 829 } else { |
| 852 pContext->ThrowScriptErrorMessage(XFA_IDS_ARGUMENT_MISMATCH); | 830 CFX_ByteString propertyStr; |
| 831 FXJSE_Value_ToUTF8String(propertyValue.get(), propertyStr); | |
| 832 for (int32_t i = 2; i < iLength; i++) { | |
| 833 FXJSE_Value_GetObjectPropByIdx(argValue.get(), i, | |
| 834 jsObjectValue.get()); | |
| 835 FXJSE_Value_GetObjectProp(jsObjectValue.get(), | |
| 836 propertyStr.AsStringC(), | |
| 837 newPropertyValue.get()); | |
| 838 if (FXJSE_Value_IsNull(newPropertyValue.get())) | |
| 839 continue; | |
| 840 | |
| 841 uCount++; | |
| 842 FX_DOUBLE dValue = ValueToDouble(pThis, newPropertyValue.get()); | |
| 843 dMinValue = uCount == 1 ? dValue : std::min(dMinValue, dValue); | |
| 844 } | |
| 853 } | 845 } |
| 854 } else if (FXJSE_Value_IsObject(argValue.get())) { | 846 } else if (FXJSE_Value_IsObject(argValue.get())) { |
| 855 std::unique_ptr<CFXJSE_Value> newPropertyValue( | 847 std::unique_ptr<CFXJSE_Value> newPropertyValue( |
| 856 new CFXJSE_Value(pIsolate)); | 848 new CFXJSE_Value(pIsolate)); |
| 857 GetObjectDefaultValue(argValue.get(), newPropertyValue.get()); | 849 GetObjectDefaultValue(argValue.get(), newPropertyValue.get()); |
| 858 if (!FXJSE_Value_IsNull(newPropertyValue.get())) { | 850 if (FXJSE_Value_IsNull(newPropertyValue.get())) |
| 859 uCount++; | 851 continue; |
| 860 if (uCount == 1) { | 852 |
| 861 dMinValue = ValueToDouble(pThis, newPropertyValue.get()); | 853 uCount++; |
| 862 } else { | 854 FX_DOUBLE dValue = ValueToDouble(pThis, newPropertyValue.get()); |
| 863 FX_DOUBLE dValue = ValueToDouble(pThis, newPropertyValue.get()); | 855 dMinValue = uCount == 1 ? dValue : std::min(dMinValue, dValue); |
| 864 if (dMinValue > dValue) { | |
| 865 dMinValue = dValue; | |
| 866 } | |
| 867 } | |
| 868 } | |
| 869 } else { | 856 } else { |
| 870 uCount++; | 857 uCount++; |
|
Lei Zhang
2016/06/01 19:50:46
We seem to repeat this a lot.
dsinclair
2016/06/02 02:16:22
Yea, the problem is some bits of it are inside inn
| |
| 871 if (uCount == 1) { | 858 FX_DOUBLE dValue = ValueToDouble(pThis, argValue.get()); |
| 872 dMinValue = ValueToDouble(pThis, argValue.get()); | 859 dMinValue = uCount == 1 ? dValue : std::min(dMinValue, dValue); |
| 873 } else { | |
| 874 FX_DOUBLE dValue = ValueToDouble(pThis, argValue.get()); | |
| 875 if (dMinValue > dValue) { | |
| 876 dMinValue = dValue; | |
| 877 } | |
| 878 } | |
| 879 } | 860 } |
| 880 } | 861 } |
| 862 if (uCount == 0) { | |
| 863 FXJSE_Value_SetNull(args.GetReturnValue()); | |
| 864 return; | |
| 865 } | |
| 881 | 866 |
| 882 if (uCount) { | 867 FXJSE_Value_SetDouble(args.GetReturnValue(), dMinValue); |
| 883 FXJSE_Value_SetDouble(args.GetReturnValue(), dMinValue); | |
| 884 } else { | |
| 885 FXJSE_Value_SetNull(args.GetReturnValue()); | |
| 886 } | |
| 887 } | 868 } |
| 888 | 869 |
| 889 // static | 870 // static |
| 890 void CXFA_FM2JSContext::Mod(CFXJSE_Value* pThis, | 871 void CXFA_FM2JSContext::Mod(CFXJSE_Value* pThis, |
| 891 const CFX_ByteStringC& szFuncName, | 872 const CFX_ByteStringC& szFuncName, |
| 892 CFXJSE_Arguments& args) { | 873 CFXJSE_Arguments& args) { |
| 893 CXFA_FM2JSContext* pContext = | 874 CXFA_FM2JSContext* pContext = |
| 894 static_cast<CXFA_FM2JSContext*>(FXJSE_Value_ToObject(pThis, nullptr)); | 875 static_cast<CXFA_FM2JSContext*>(FXJSE_Value_ToObject(pThis, nullptr)); |
| 895 v8::Isolate* pIsolate = pContext->GetScriptRuntime(); | 876 v8::Isolate* pIsolate = pContext->GetScriptRuntime(); |
| 896 if (args.GetLength() == 2) { | 877 if (args.GetLength() != 2) { |
| 897 std::unique_ptr<CFXJSE_Value> argOne = args.GetValue(0); | 878 pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, |
| 898 std::unique_ptr<CFXJSE_Value> argTwo = args.GetValue(1); | 879 L"Mod"); |
| 899 if (FXJSE_Value_IsNull(argOne.get()) || FXJSE_Value_IsNull(argTwo.get())) { | 880 return; |
| 900 FXJSE_Value_SetNull(args.GetReturnValue()); | 881 } |
| 882 | |
| 883 std::unique_ptr<CFXJSE_Value> argOne = args.GetValue(0); | |
| 884 std::unique_ptr<CFXJSE_Value> argTwo = args.GetValue(1); | |
| 885 if (FXJSE_Value_IsNull(argOne.get()) || FXJSE_Value_IsNull(argTwo.get())) { | |
| 886 FXJSE_Value_SetNull(args.GetReturnValue()); | |
| 887 return; | |
| 888 } | |
| 889 | |
| 890 FX_DOUBLE dDividend = 0.0; | |
| 891 FX_DOUBLE dDividor = 0.0; | |
|
Lei Zhang
2016/06/01 20:00:43
divisor, not dividor
Tom Sepez
2016/06/01 20:07:12
Either way, initializing dividor to 0.0 seems like
dsinclair
2016/06/02 02:16:22
We do check if it == 0 before usage, but changed t
dsinclair
2016/06/02 02:16:22
Done.
| |
| 892 if (FXJSE_Value_IsArray(argOne.get())) { | |
| 893 std::unique_ptr<CFXJSE_Value> lengthValue(new CFXJSE_Value(pIsolate)); | |
| 894 FXJSE_Value_GetObjectProp(argOne.get(), "length", lengthValue.get()); | |
| 895 int32_t iLength = FXJSE_Value_ToInteger(lengthValue.get()); | |
| 896 if (iLength <= 2) { | |
| 897 pContext->ThrowScriptErrorMessage(XFA_IDS_ARGUMENT_MISMATCH); | |
| 898 return; | |
| 899 } | |
| 900 | |
| 901 std::unique_ptr<CFXJSE_Value> propertyValue(new CFXJSE_Value(pIsolate)); | |
| 902 std::unique_ptr<CFXJSE_Value> jsObjectValue(new CFXJSE_Value(pIsolate)); | |
| 903 FXJSE_Value_GetObjectPropByIdx(argOne.get(), 1, propertyValue.get()); | |
| 904 FXJSE_Value_GetObjectPropByIdx(argOne.get(), 2, jsObjectValue.get()); | |
| 905 if (FXJSE_Value_IsNull(propertyValue.get())) { | |
| 906 dDividend = ValueToDouble(pThis, jsObjectValue.get()); | |
| 901 } else { | 907 } else { |
| 902 FX_DOUBLE dDividend = 0.0; | 908 CFX_ByteString propertyStr; |
| 903 FX_DOUBLE dDividor = 0.0; | 909 FXJSE_Value_ToUTF8String(propertyValue.get(), propertyStr); |
| 904 if (FXJSE_Value_IsArray(argOne.get())) { | 910 std::unique_ptr<CFXJSE_Value> newPropertyValue( |
| 905 std::unique_ptr<CFXJSE_Value> lengthValue(new CFXJSE_Value(pIsolate)); | 911 new CFXJSE_Value(pIsolate)); |
| 906 FXJSE_Value_GetObjectProp(argOne.get(), "length", lengthValue.get()); | 912 FXJSE_Value_GetObjectProp(jsObjectValue.get(), propertyStr.AsStringC(), |
| 907 int32_t iLength = FXJSE_Value_ToInteger(lengthValue.get()); | 913 newPropertyValue.get()); |
| 908 if (iLength > 2) { | 914 dDividend = ValueToDouble(pThis, newPropertyValue.get()); |
| 909 std::unique_ptr<CFXJSE_Value> propertyValue( | |
| 910 new CFXJSE_Value(pIsolate)); | |
| 911 std::unique_ptr<CFXJSE_Value> jsObjectValue( | |
| 912 new CFXJSE_Value(pIsolate)); | |
| 913 FXJSE_Value_GetObjectPropByIdx(argOne.get(), 1, propertyValue.get()); | |
| 914 FXJSE_Value_GetObjectPropByIdx(argOne.get(), 2, jsObjectValue.get()); | |
| 915 if (FXJSE_Value_IsNull(propertyValue.get())) { | |
| 916 dDividend = ValueToDouble(pThis, jsObjectValue.get()); | |
| 917 } else { | |
| 918 CFX_ByteString propertyStr; | |
| 919 FXJSE_Value_ToUTF8String(propertyValue.get(), propertyStr); | |
| 920 std::unique_ptr<CFXJSE_Value> newPropertyValue( | |
| 921 new CFXJSE_Value(pIsolate)); | |
| 922 FXJSE_Value_GetObjectProp(jsObjectValue.get(), | |
| 923 propertyStr.AsStringC(), | |
| 924 newPropertyValue.get()); | |
| 925 dDividend = ValueToDouble(pThis, newPropertyValue.get()); | |
| 926 } | |
| 927 } else { | |
| 928 pContext->ThrowScriptErrorMessage(XFA_IDS_ARGUMENT_MISMATCH); | |
| 929 } | |
| 930 } else { | |
| 931 dDividend = ValueToDouble(pThis, argOne.get()); | |
| 932 } | |
| 933 if (FXJSE_Value_IsArray(argTwo.get())) { | |
| 934 std::unique_ptr<CFXJSE_Value> lengthValue(new CFXJSE_Value(pIsolate)); | |
| 935 FXJSE_Value_GetObjectProp(argTwo.get(), "length", lengthValue.get()); | |
| 936 int32_t iLength = FXJSE_Value_ToInteger(lengthValue.get()); | |
| 937 if (iLength > 2) { | |
| 938 std::unique_ptr<CFXJSE_Value> propertyValue( | |
| 939 new CFXJSE_Value(pIsolate)); | |
| 940 std::unique_ptr<CFXJSE_Value> jsObjectValue( | |
| 941 new CFXJSE_Value(pIsolate)); | |
| 942 FXJSE_Value_GetObjectPropByIdx(argTwo.get(), 1, propertyValue.get()); | |
| 943 FXJSE_Value_GetObjectPropByIdx(argTwo.get(), 2, jsObjectValue.get()); | |
| 944 if (FXJSE_Value_IsNull(propertyValue.get())) { | |
| 945 dDividor = ValueToDouble(pThis, jsObjectValue.get()); | |
| 946 } else { | |
| 947 CFX_ByteString propertyStr; | |
| 948 FXJSE_Value_ToUTF8String(propertyValue.get(), propertyStr); | |
| 949 std::unique_ptr<CFXJSE_Value> newPropertyValue( | |
| 950 new CFXJSE_Value(pIsolate)); | |
| 951 FXJSE_Value_GetObjectProp(jsObjectValue.get(), | |
| 952 propertyStr.AsStringC(), | |
| 953 newPropertyValue.get()); | |
| 954 dDividor = ValueToDouble(pThis, newPropertyValue.get()); | |
| 955 } | |
| 956 } else { | |
| 957 pContext->ThrowScriptErrorMessage(XFA_IDS_ARGUMENT_MISMATCH); | |
| 958 } | |
| 959 } else { | |
| 960 dDividor = ValueToDouble(pThis, argTwo.get()); | |
| 961 } | |
| 962 if (dDividor) { | |
| 963 FXJSE_Value_SetDouble( | |
| 964 args.GetReturnValue(), | |
| 965 dDividend - dDividor * (int32_t)(dDividend / dDividor)); | |
| 966 } else { | |
| 967 pContext->ThrowScriptErrorMessage(XFA_IDS_DIVIDE_ZERO); | |
| 968 } | |
| 969 } | 915 } |
| 970 } else { | 916 } else { |
| 971 pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, | 917 dDividend = ValueToDouble(pThis, argOne.get()); |
| 972 L"Mod"); | |
| 973 } | 918 } |
| 919 | |
| 920 if (FXJSE_Value_IsArray(argTwo.get())) { | |
|
Lei Zhang
2016/06/01 19:50:46
This look almost identical to the |argOne| block s
dsinclair
2016/06/02 02:16:21
Done.
| |
| 921 std::unique_ptr<CFXJSE_Value> lengthValue(new CFXJSE_Value(pIsolate)); | |
| 922 FXJSE_Value_GetObjectProp(argTwo.get(), "length", lengthValue.get()); | |
| 923 int32_t iLength = FXJSE_Value_ToInteger(lengthValue.get()); | |
| 924 if (iLength <= 2) { | |
| 925 pContext->ThrowScriptErrorMessage(XFA_IDS_ARGUMENT_MISMATCH); | |
| 926 return; | |
| 927 } | |
| 928 | |
| 929 std::unique_ptr<CFXJSE_Value> propertyValue(new CFXJSE_Value(pIsolate)); | |
| 930 std::unique_ptr<CFXJSE_Value> jsObjectValue(new CFXJSE_Value(pIsolate)); | |
| 931 FXJSE_Value_GetObjectPropByIdx(argTwo.get(), 1, propertyValue.get()); | |
| 932 FXJSE_Value_GetObjectPropByIdx(argTwo.get(), 2, jsObjectValue.get()); | |
| 933 if (FXJSE_Value_IsNull(propertyValue.get())) { | |
| 934 dDividor = ValueToDouble(pThis, jsObjectValue.get()); | |
| 935 } else { | |
| 936 CFX_ByteString propertyStr; | |
| 937 FXJSE_Value_ToUTF8String(propertyValue.get(), propertyStr); | |
| 938 std::unique_ptr<CFXJSE_Value> newPropertyValue( | |
| 939 new CFXJSE_Value(pIsolate)); | |
| 940 FXJSE_Value_GetObjectProp(jsObjectValue.get(), propertyStr.AsStringC(), | |
| 941 newPropertyValue.get()); | |
| 942 dDividor = ValueToDouble(pThis, newPropertyValue.get()); | |
| 943 } | |
| 944 } else { | |
| 945 dDividor = ValueToDouble(pThis, argTwo.get()); | |
| 946 } | |
| 947 | |
| 948 if (dDividor == 0) { | |
| 949 pContext->ThrowScriptErrorMessage(XFA_IDS_DIVIDE_ZERO); | |
| 950 return; | |
| 951 } | |
| 952 | |
| 953 FXJSE_Value_SetDouble(args.GetReturnValue(), | |
| 954 dDividend - dDividor * (int32_t)(dDividend / dDividor)); | |
| 974 } | 955 } |
| 975 | 956 |
| 976 // static | 957 // static |
| 977 void CXFA_FM2JSContext::Round(CFXJSE_Value* pThis, | 958 void CXFA_FM2JSContext::Round(CFXJSE_Value* pThis, |
| 978 const CFX_ByteStringC& szFuncName, | 959 const CFX_ByteStringC& szFuncName, |
| 979 CFXJSE_Arguments& args) { | 960 CFXJSE_Arguments& args) { |
| 980 CXFA_FM2JSContext* pContext = | 961 CXFA_FM2JSContext* pContext = |
| 981 static_cast<CXFA_FM2JSContext*>(FXJSE_Value_ToObject(pThis, nullptr)); | 962 static_cast<CXFA_FM2JSContext*>(FXJSE_Value_ToObject(pThis, nullptr)); |
| 982 v8::Isolate* pIsolate = pContext->GetScriptRuntime(); | 963 v8::Isolate* pIsolate = pContext->GetScriptRuntime(); |
| 983 int32_t argc = args.GetLength(); | 964 int32_t argc = args.GetLength(); |
| 984 uint8_t uPrecision = 0; | 965 uint8_t uPrecision = 0; |
| 966 | |
| 967 if (argc != 1 && argc != 2) { | |
| 968 pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, | |
| 969 L"Round"); | |
| 970 return; | |
| 971 } | |
| 972 | |
| 985 if (argc == 1) { | 973 if (argc == 1) { |
| 986 std::unique_ptr<CFXJSE_Value> argOne = args.GetValue(0); | 974 std::unique_ptr<CFXJSE_Value> argOne = args.GetValue(0); |
| 987 if (FXJSE_Value_IsNull(argOne.get())) { | 975 if (FXJSE_Value_IsNull(argOne.get())) { |
| 988 FXJSE_Value_SetNull(args.GetReturnValue()); | 976 FXJSE_Value_SetNull(args.GetReturnValue()); |
| 977 return; | |
| 978 } | |
| 979 | |
| 980 FX_DOUBLE dValue = 0.0; | |
| 981 if (FXJSE_Value_IsArray(argOne.get())) { | |
| 982 std::unique_ptr<CFXJSE_Value> propertyValue(new CFXJSE_Value(pIsolate)); | |
| 983 std::unique_ptr<CFXJSE_Value> jsObjectValue(new CFXJSE_Value(pIsolate)); | |
| 984 FXJSE_Value_GetObjectPropByIdx(argOne.get(), 1, propertyValue.get()); | |
| 985 FXJSE_Value_GetObjectPropByIdx(argOne.get(), 2, jsObjectValue.get()); | |
| 986 if (FXJSE_Value_IsNull(propertyValue.get())) { | |
|
Lei Zhang
2016/06/01 20:00:43
This if-else block looks identical to code that de
dsinclair
2016/06/02 02:16:22
Done.
| |
| 987 dValue = ValueToDouble(pThis, jsObjectValue.get()); | |
| 988 } else { | |
| 989 CFX_ByteString propertyStr; | |
| 990 FXJSE_Value_ToUTF8String(propertyValue.get(), propertyStr); | |
| 991 std::unique_ptr<CFXJSE_Value> newPropertyValue( | |
| 992 new CFXJSE_Value(pIsolate)); | |
| 993 FXJSE_Value_GetObjectProp(jsObjectValue.get(), propertyStr.AsStringC(), | |
| 994 newPropertyValue.get()); | |
| 995 dValue = ValueToDouble(pThis, newPropertyValue.get()); | |
| 996 } | |
| 989 } else { | 997 } else { |
| 990 FX_DOUBLE dValue = 0.0; | 998 dValue = ValueToDouble(pThis, argOne.get()); |
| 991 if (FXJSE_Value_IsArray(argOne.get())) { | |
| 992 std::unique_ptr<CFXJSE_Value> propertyValue(new CFXJSE_Value(pIsolate)); | |
| 993 std::unique_ptr<CFXJSE_Value> jsObjectValue(new CFXJSE_Value(pIsolate)); | |
| 994 FXJSE_Value_GetObjectPropByIdx(argOne.get(), 1, propertyValue.get()); | |
| 995 FXJSE_Value_GetObjectPropByIdx(argOne.get(), 2, jsObjectValue.get()); | |
| 996 if (FXJSE_Value_IsNull(propertyValue.get())) { | |
| 997 dValue = ValueToDouble(pThis, jsObjectValue.get()); | |
| 998 } else { | |
| 999 CFX_ByteString propertyStr; | |
| 1000 FXJSE_Value_ToUTF8String(propertyValue.get(), propertyStr); | |
| 1001 std::unique_ptr<CFXJSE_Value> newPropertyValue( | |
| 1002 new CFXJSE_Value(pIsolate)); | |
| 1003 FXJSE_Value_GetObjectProp(jsObjectValue.get(), | |
| 1004 propertyStr.AsStringC(), | |
| 1005 newPropertyValue.get()); | |
| 1006 dValue = ValueToDouble(pThis, newPropertyValue.get()); | |
| 1007 } | |
| 1008 } else { | |
| 1009 dValue = ValueToDouble(pThis, argOne.get()); | |
| 1010 } | |
| 1011 CFX_Decimal decimalValue((FX_FLOAT)dValue, uPrecision); | |
| 1012 CFX_WideString wsValue = decimalValue; | |
| 1013 FXJSE_Value_SetUTF8String(args.GetReturnValue(), | |
| 1014 wsValue.UTF8Encode().AsStringC()); | |
| 1015 } | 999 } |
| 1000 CFX_Decimal decimalValue((FX_FLOAT)dValue, uPrecision); | |
| 1001 CFX_WideString wsValue = decimalValue; | |
| 1002 FXJSE_Value_SetUTF8String(args.GetReturnValue(), | |
| 1003 wsValue.UTF8Encode().AsStringC()); | |
| 1016 } else if (argc == 2) { | 1004 } else if (argc == 2) { |
|
Lei Zhang
2016/06/01 20:00:42
Just return in the argc == 1 block, assert argc ==
dsinclair
2016/06/02 02:16:22
Rewrote it as argc == 1 and argc == 2 duplicated a
| |
| 1017 std::unique_ptr<CFXJSE_Value> argOne = args.GetValue(0); | 1005 std::unique_ptr<CFXJSE_Value> argOne = args.GetValue(0); |
| 1018 std::unique_ptr<CFXJSE_Value> argTwo = args.GetValue(1); | 1006 std::unique_ptr<CFXJSE_Value> argTwo = args.GetValue(1); |
| 1019 if (FXJSE_Value_IsNull(argOne.get()) || FXJSE_Value_IsNull(argTwo.get())) { | 1007 if (FXJSE_Value_IsNull(argOne.get()) || FXJSE_Value_IsNull(argTwo.get())) { |
| 1020 FXJSE_Value_SetNull(args.GetReturnValue()); | 1008 FXJSE_Value_SetNull(args.GetReturnValue()); |
| 1009 return; | |
| 1010 } | |
| 1011 | |
| 1012 FX_DOUBLE dValue = 0.0; | |
| 1013 if (FXJSE_Value_IsArray(argOne.get())) { | |
|
Lei Zhang
2016/06/01 20:00:42
More similar looking code here and on line 1033.
dsinclair
2016/06/02 02:16:22
Done.
| |
| 1014 std::unique_ptr<CFXJSE_Value> propertyValue(new CFXJSE_Value(pIsolate)); | |
| 1015 std::unique_ptr<CFXJSE_Value> jsObjectValue(new CFXJSE_Value(pIsolate)); | |
| 1016 FXJSE_Value_GetObjectPropByIdx(argOne.get(), 1, propertyValue.get()); | |
| 1017 FXJSE_Value_GetObjectPropByIdx(argOne.get(), 2, jsObjectValue.get()); | |
| 1018 if (FXJSE_Value_IsNull(propertyValue.get())) { | |
| 1019 dValue = ValueToDouble(pThis, jsObjectValue.get()); | |
| 1020 } else { | |
| 1021 CFX_ByteString propertyStr; | |
| 1022 FXJSE_Value_ToUTF8String(propertyValue.get(), propertyStr); | |
| 1023 std::unique_ptr<CFXJSE_Value> newPropertyValue( | |
| 1024 new CFXJSE_Value(pIsolate)); | |
| 1025 FXJSE_Value_GetObjectProp(jsObjectValue.get(), propertyStr.AsStringC(), | |
| 1026 newPropertyValue.get()); | |
| 1027 dValue = ValueToDouble(pThis, newPropertyValue.get()); | |
| 1028 } | |
| 1021 } else { | 1029 } else { |
| 1022 FX_DOUBLE dValue = 0.0; | 1030 dValue = ValueToDouble(pThis, argOne.get()); |
| 1023 if (FXJSE_Value_IsArray(argOne.get())) { | 1031 } |
| 1024 std::unique_ptr<CFXJSE_Value> propertyValue(new CFXJSE_Value(pIsolate)); | 1032 FX_DOUBLE dPrecision = 0.0; |
| 1025 std::unique_ptr<CFXJSE_Value> jsObjectValue(new CFXJSE_Value(pIsolate)); | 1033 if (FXJSE_Value_IsArray(argTwo.get())) { |
| 1026 FXJSE_Value_GetObjectPropByIdx(argOne.get(), 1, propertyValue.get()); | 1034 std::unique_ptr<CFXJSE_Value> propertyValue(new CFXJSE_Value(pIsolate)); |
| 1027 FXJSE_Value_GetObjectPropByIdx(argOne.get(), 2, jsObjectValue.get()); | 1035 std::unique_ptr<CFXJSE_Value> jsObjectValue(new CFXJSE_Value(pIsolate)); |
| 1028 if (FXJSE_Value_IsNull(propertyValue.get())) { | 1036 FXJSE_Value_GetObjectPropByIdx(argTwo.get(), 1, propertyValue.get()); |
| 1029 dValue = ValueToDouble(pThis, jsObjectValue.get()); | 1037 FXJSE_Value_GetObjectPropByIdx(argTwo.get(), 2, jsObjectValue.get()); |
| 1030 } else { | 1038 if (FXJSE_Value_IsNull(propertyValue.get())) { |
| 1031 CFX_ByteString propertyStr; | 1039 dPrecision = ValueToDouble(pThis, jsObjectValue.get()); |
| 1032 FXJSE_Value_ToUTF8String(propertyValue.get(), propertyStr); | |
| 1033 std::unique_ptr<CFXJSE_Value> newPropertyValue( | |
| 1034 new CFXJSE_Value(pIsolate)); | |
| 1035 FXJSE_Value_GetObjectProp(jsObjectValue.get(), | |
| 1036 propertyStr.AsStringC(), | |
| 1037 newPropertyValue.get()); | |
| 1038 dValue = ValueToDouble(pThis, newPropertyValue.get()); | |
| 1039 } | |
| 1040 } else { | 1040 } else { |
| 1041 dValue = ValueToDouble(pThis, argOne.get()); | 1041 CFX_ByteString propertyStr; |
| 1042 FXJSE_Value_ToUTF8String(propertyValue.get(), propertyStr); | |
| 1043 std::unique_ptr<CFXJSE_Value> newPropertyValue( | |
| 1044 new CFXJSE_Value(pIsolate)); | |
| 1045 FXJSE_Value_GetObjectProp(jsObjectValue.get(), propertyStr.AsStringC(), | |
| 1046 newPropertyValue.get()); | |
| 1047 dPrecision = ValueToDouble(pThis, newPropertyValue.get()); | |
| 1042 } | 1048 } |
| 1043 FX_DOUBLE dPrecision = 0.0; | 1049 } else { |
| 1044 if (FXJSE_Value_IsArray(argTwo.get())) { | 1050 dPrecision = ValueToDouble(pThis, argTwo.get()); |
| 1045 std::unique_ptr<CFXJSE_Value> propertyValue(new CFXJSE_Value(pIsolate)); | |
| 1046 std::unique_ptr<CFXJSE_Value> jsObjectValue(new CFXJSE_Value(pIsolate)); | |
| 1047 FXJSE_Value_GetObjectPropByIdx(argTwo.get(), 1, propertyValue.get()); | |
| 1048 FXJSE_Value_GetObjectPropByIdx(argTwo.get(), 2, jsObjectValue.get()); | |
| 1049 if (FXJSE_Value_IsNull(propertyValue.get())) { | |
| 1050 dPrecision = ValueToDouble(pThis, jsObjectValue.get()); | |
| 1051 } else { | |
| 1052 CFX_ByteString propertyStr; | |
| 1053 FXJSE_Value_ToUTF8String(propertyValue.get(), propertyStr); | |
| 1054 std::unique_ptr<CFXJSE_Value> newPropertyValue( | |
| 1055 new CFXJSE_Value(pIsolate)); | |
| 1056 FXJSE_Value_GetObjectProp(jsObjectValue.get(), | |
| 1057 propertyStr.AsStringC(), | |
| 1058 newPropertyValue.get()); | |
| 1059 dPrecision = ValueToDouble(pThis, newPropertyValue.get()); | |
| 1060 } | |
| 1061 } else { | |
| 1062 dPrecision = ValueToDouble(pThis, argTwo.get()); | |
| 1063 } | |
| 1064 if (dPrecision < 0) { | |
| 1065 uPrecision = 0; | |
| 1066 } else if (dPrecision > 12.0) { | |
| 1067 uPrecision = 12; | |
| 1068 } else { | |
| 1069 uPrecision = (uint8_t)dPrecision; | |
| 1070 } | |
| 1071 CFX_Decimal decimalValue((FX_FLOAT)dValue, uPrecision); | |
| 1072 CFX_WideString wsValue = decimalValue; | |
| 1073 FXJSE_Value_SetUTF8String(args.GetReturnValue(), | |
| 1074 wsValue.UTF8Encode().AsStringC()); | |
| 1075 } | 1051 } |
| 1076 } else { | 1052 if (dPrecision < 0) |
|
Lei Zhang
2016/06/01 20:00:42
static_cast<uint8_t>(std::min(std::max(dPrecision,
dsinclair
2016/06/02 02:16:22
Done.
| |
| 1077 pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, | 1053 uPrecision = 0; |
| 1078 L"Round"); | 1054 else if (dPrecision > 12.0) |
| 1055 uPrecision = 12; | |
| 1056 else | |
| 1057 uPrecision = (uint8_t)dPrecision; | |
| 1058 | |
| 1059 CFX_Decimal decimalValue((FX_FLOAT)dValue, uPrecision); | |
| 1060 CFX_WideString wsValue = decimalValue; | |
| 1061 FXJSE_Value_SetUTF8String(args.GetReturnValue(), | |
| 1062 wsValue.UTF8Encode().AsStringC()); | |
| 1079 } | 1063 } |
| 1080 } | 1064 } |
| 1081 | 1065 |
| 1082 // static | 1066 // static |
| 1083 void CXFA_FM2JSContext::Sum(CFXJSE_Value* pThis, | 1067 void CXFA_FM2JSContext::Sum(CFXJSE_Value* pThis, |
| 1084 const CFX_ByteStringC& szFuncName, | 1068 const CFX_ByteStringC& szFuncName, |
| 1085 CFXJSE_Arguments& args) { | 1069 CFXJSE_Arguments& args) { |
| 1070 int32_t argc = args.GetLength(); | |
| 1071 if (argc == 0) { | |
| 1072 FXJSE_Value_SetNull(args.GetReturnValue()); | |
| 1073 return; | |
| 1074 } | |
| 1075 | |
| 1086 CXFA_FM2JSContext* pContext = | 1076 CXFA_FM2JSContext* pContext = |
| 1087 static_cast<CXFA_FM2JSContext*>(FXJSE_Value_ToObject(pThis, nullptr)); | 1077 static_cast<CXFA_FM2JSContext*>(FXJSE_Value_ToObject(pThis, nullptr)); |
| 1088 v8::Isolate* pIsolate = pContext->GetScriptRuntime(); | 1078 v8::Isolate* pIsolate = pContext->GetScriptRuntime(); |
| 1089 int32_t argc = args.GetLength(); | |
| 1090 uint32_t uCount = 0; | 1079 uint32_t uCount = 0; |
| 1091 FX_DOUBLE dSum = 0.0; | 1080 FX_DOUBLE dSum = 0.0; |
| 1092 if (argc) { | 1081 for (int32_t i = 0; i < argc; i++) { |
| 1093 for (int32_t i = 0; i < argc; i++) { | 1082 std::unique_ptr<CFXJSE_Value> argValue = args.GetValue(i); |
| 1094 std::unique_ptr<CFXJSE_Value> argValue = args.GetValue(i); | 1083 if (FXJSE_Value_IsNull(argValue.get())) |
| 1095 if (FXJSE_Value_IsNull(argValue.get())) { | 1084 continue; |
| 1096 continue; | 1085 |
| 1097 } else if (FXJSE_Value_IsArray(argValue.get())) { | 1086 if (FXJSE_Value_IsArray(argValue.get())) { |
| 1098 std::unique_ptr<CFXJSE_Value> lengthValue(new CFXJSE_Value(pIsolate)); | 1087 std::unique_ptr<CFXJSE_Value> lengthValue(new CFXJSE_Value(pIsolate)); |
| 1099 FXJSE_Value_GetObjectProp(argValue.get(), "length", lengthValue.get()); | 1088 FXJSE_Value_GetObjectProp(argValue.get(), "length", lengthValue.get()); |
| 1100 int32_t iLength = FXJSE_Value_ToInteger(lengthValue.get()); | 1089 int32_t iLength = FXJSE_Value_ToInteger(lengthValue.get()); |
| 1101 if (iLength > 2) { | 1090 if (iLength <= 2) { |
| 1102 std::unique_ptr<CFXJSE_Value> propertyValue( | 1091 pContext->ThrowScriptErrorMessage(XFA_IDS_ARGUMENT_MISMATCH); |
| 1103 new CFXJSE_Value(pIsolate)); | 1092 return; |
|
dsinclair
2016/06/01 14:02:00
Added return due to throw.
| |
| 1104 FXJSE_Value_GetObjectPropByIdx(argValue.get(), 1, | 1093 } |
| 1105 propertyValue.get()); | 1094 |
| 1106 std::unique_ptr<CFXJSE_Value> jsObjectValue( | 1095 std::unique_ptr<CFXJSE_Value> propertyValue(new CFXJSE_Value(pIsolate)); |
| 1107 new CFXJSE_Value(pIsolate)); | 1096 FXJSE_Value_GetObjectPropByIdx(argValue.get(), 1, propertyValue.get()); |
| 1108 std::unique_ptr<CFXJSE_Value> newPropertyValue( | 1097 std::unique_ptr<CFXJSE_Value> jsObjectValue(new CFXJSE_Value(pIsolate)); |
| 1109 new CFXJSE_Value(pIsolate)); | 1098 std::unique_ptr<CFXJSE_Value> newPropertyValue( |
| 1110 if (FXJSE_Value_IsNull(propertyValue.get())) { | 1099 new CFXJSE_Value(pIsolate)); |
| 1111 for (int32_t j = 2; j < iLength; j++) { | 1100 if (FXJSE_Value_IsNull(propertyValue.get())) { |
| 1112 FXJSE_Value_GetObjectPropByIdx(argValue.get(), j, | 1101 for (int32_t j = 2; j < iLength; j++) { |
| 1113 jsObjectValue.get()); | 1102 FXJSE_Value_GetObjectPropByIdx(argValue.get(), j, |
| 1114 GetObjectDefaultValue(jsObjectValue.get(), | 1103 jsObjectValue.get()); |
| 1115 newPropertyValue.get()); | 1104 GetObjectDefaultValue(jsObjectValue.get(), newPropertyValue.get()); |
| 1116 if (!FXJSE_Value_IsNull(newPropertyValue.get())) { | 1105 if (FXJSE_Value_IsNull(newPropertyValue.get())) |
| 1117 dSum += ValueToDouble(pThis, jsObjectValue.get()); | 1106 continue; |
| 1118 uCount++; | 1107 |
| 1119 } | 1108 dSum += ValueToDouble(pThis, jsObjectValue.get()); |
| 1120 } | |
| 1121 } else { | |
| 1122 CFX_ByteString propertyStr; | |
| 1123 FXJSE_Value_ToUTF8String(propertyValue.get(), propertyStr); | |
| 1124 for (int32_t j = 2; j < iLength; j++) { | |
| 1125 FXJSE_Value_GetObjectPropByIdx(argValue.get(), j, | |
| 1126 jsObjectValue.get()); | |
| 1127 FXJSE_Value_GetObjectProp(jsObjectValue.get(), | |
| 1128 propertyStr.AsStringC(), | |
| 1129 newPropertyValue.get()); | |
| 1130 if (!FXJSE_Value_IsNull(newPropertyValue.get())) { | |
| 1131 dSum += ValueToDouble(pThis, newPropertyValue.get()); | |
| 1132 uCount++; | |
| 1133 } | |
| 1134 } | |
| 1135 } | |
| 1136 } else { | |
| 1137 pContext->ThrowScriptErrorMessage(XFA_IDS_ARGUMENT_MISMATCH); | |
| 1138 } | |
| 1139 } else if (FXJSE_Value_IsObject(argValue.get())) { | |
| 1140 std::unique_ptr<CFXJSE_Value> newPropertyValue( | |
| 1141 new CFXJSE_Value(pIsolate)); | |
| 1142 GetObjectDefaultValue(argValue.get(), newPropertyValue.get()); | |
| 1143 if (!FXJSE_Value_IsNull(newPropertyValue.get())) { | |
| 1144 dSum += ValueToDouble(pThis, argValue.get()); | |
| 1145 uCount++; | 1109 uCount++; |
| 1146 } | 1110 } |
| 1147 } else { | 1111 } else { |
| 1148 dSum += ValueToDouble(pThis, argValue.get()); | 1112 CFX_ByteString propertyStr; |
| 1149 uCount++; | 1113 FXJSE_Value_ToUTF8String(propertyValue.get(), propertyStr); |
| 1114 for (int32_t j = 2; j < iLength; j++) { | |
| 1115 FXJSE_Value_GetObjectPropByIdx(argValue.get(), j, | |
| 1116 jsObjectValue.get()); | |
| 1117 FXJSE_Value_GetObjectProp(jsObjectValue.get(), | |
| 1118 propertyStr.AsStringC(), | |
| 1119 newPropertyValue.get()); | |
| 1120 if (FXJSE_Value_IsNull(newPropertyValue.get())) | |
| 1121 continue; | |
| 1122 | |
| 1123 dSum += ValueToDouble(pThis, newPropertyValue.get()); | |
| 1124 uCount++; | |
| 1125 } | |
| 1150 } | 1126 } |
| 1127 } else if (FXJSE_Value_IsObject(argValue.get())) { | |
| 1128 std::unique_ptr<CFXJSE_Value> newPropertyValue( | |
| 1129 new CFXJSE_Value(pIsolate)); | |
| 1130 GetObjectDefaultValue(argValue.get(), newPropertyValue.get()); | |
| 1131 if (FXJSE_Value_IsNull(newPropertyValue.get())) | |
| 1132 continue; | |
| 1133 | |
| 1134 dSum += ValueToDouble(pThis, argValue.get()); | |
| 1135 uCount++; | |
| 1136 } else { | |
| 1137 dSum += ValueToDouble(pThis, argValue.get()); | |
| 1138 uCount++; | |
| 1151 } | 1139 } |
| 1152 } | 1140 } |
| 1153 if (uCount < 1) { | 1141 if (uCount == 0) { |
| 1154 FXJSE_Value_SetNull(args.GetReturnValue()); | 1142 FXJSE_Value_SetNull(args.GetReturnValue()); |
| 1155 } else { | 1143 return; |
| 1156 FXJSE_Value_SetDouble(args.GetReturnValue(), dSum); | |
| 1157 } | 1144 } |
| 1145 | |
| 1146 FXJSE_Value_SetDouble(args.GetReturnValue(), dSum); | |
| 1158 } | 1147 } |
| 1159 | 1148 |
| 1160 // static | 1149 // static |
| 1161 void CXFA_FM2JSContext::Date(CFXJSE_Value* pThis, | 1150 void CXFA_FM2JSContext::Date(CFXJSE_Value* pThis, |
| 1162 const CFX_ByteStringC& szFuncName, | 1151 const CFX_ByteStringC& szFuncName, |
| 1163 CFXJSE_Arguments& args) { | 1152 CFXJSE_Arguments& args) { |
| 1164 if (args.GetLength() == 0) { | 1153 if (args.GetLength() != 0) { |
| 1165 struct tm* pTmStruct = 0; | |
| 1166 time_t currentTime; | |
| 1167 time(¤tTime); | |
| 1168 pTmStruct = gmtime(¤tTime); | |
| 1169 CFX_ByteString bufferYear; | |
| 1170 CFX_ByteString bufferMon; | |
| 1171 CFX_ByteString bufferDay; | |
| 1172 bufferYear.Format("%d", pTmStruct->tm_year + 1900); | |
| 1173 bufferMon.Format("%02d", pTmStruct->tm_mon + 1); | |
| 1174 bufferDay.Format("%02d", pTmStruct->tm_mday); | |
| 1175 CFX_ByteString bufferCurrent = bufferYear + bufferMon + bufferDay; | |
| 1176 int32_t dDays = DateString2Num(bufferCurrent.AsStringC()); | |
| 1177 FXJSE_Value_SetInteger(args.GetReturnValue(), dDays); | |
| 1178 } else { | |
| 1179 CXFA_FM2JSContext* pContext = | 1154 CXFA_FM2JSContext* pContext = |
| 1180 static_cast<CXFA_FM2JSContext*>(FXJSE_Value_ToObject(pThis, nullptr)); | 1155 static_cast<CXFA_FM2JSContext*>(FXJSE_Value_ToObject(pThis, nullptr)); |
| 1181 pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, | 1156 pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, |
| 1182 L"Date"); | 1157 L"Date"); |
| 1158 return; | |
| 1183 } | 1159 } |
| 1160 | |
| 1161 time_t currentTime; | |
| 1162 time(¤tTime); | |
| 1163 struct tm* pTmStruct = gmtime(¤tTime); | |
| 1164 | |
| 1165 CFX_ByteString bufferYear; | |
| 1166 CFX_ByteString bufferMon; | |
| 1167 CFX_ByteString bufferDay; | |
| 1168 bufferYear.Format("%d", pTmStruct->tm_year + 1900); | |
| 1169 bufferMon.Format("%02d", pTmStruct->tm_mon + 1); | |
| 1170 bufferDay.Format("%02d", pTmStruct->tm_mday); | |
| 1171 | |
| 1172 CFX_ByteString bufferCurrent = bufferYear + bufferMon + bufferDay; | |
| 1173 FXJSE_Value_SetInteger(args.GetReturnValue(), | |
| 1174 DateString2Num(bufferCurrent.AsStringC())); | |
| 1184 } | 1175 } |
| 1185 | 1176 |
| 1186 // static | 1177 // static |
| 1187 void CXFA_FM2JSContext::Date2Num(CFXJSE_Value* pThis, | 1178 void CXFA_FM2JSContext::Date2Num(CFXJSE_Value* pThis, |
| 1188 const CFX_ByteStringC& szFuncName, | 1179 const CFX_ByteStringC& szFuncName, |
| 1189 CFXJSE_Arguments& args) { | 1180 CFXJSE_Arguments& args) { |
| 1190 int32_t argc = args.GetLength(); | 1181 int32_t argc = args.GetLength(); |
| 1191 if ((argc > 0) && (argc < 4)) { | 1182 if ((argc <= 0) || (argc >= 4)) { |
|
Lei Zhang
2016/06/01 20:00:43
extra parenthesis
dsinclair
2016/06/02 02:16:22
Done.
| |
| 1192 FX_BOOL bFlags = FALSE; | |
| 1193 CFX_ByteString dateString; | |
| 1194 CFX_ByteString formatString; | |
| 1195 CFX_ByteString localString; | |
| 1196 std::unique_ptr<CFXJSE_Value> dateValue = GetSimpleValue(pThis, args, 0); | |
| 1197 if (ValueIsNull(pThis, dateValue.get())) { | |
| 1198 bFlags = TRUE; | |
| 1199 } else { | |
| 1200 ValueToUTF8String(dateValue.get(), dateString); | |
| 1201 } | |
| 1202 if (argc > 1) { | |
| 1203 std::unique_ptr<CFXJSE_Value> formatValue = | |
| 1204 GetSimpleValue(pThis, args, 1); | |
| 1205 if (ValueIsNull(pThis, formatValue.get())) { | |
| 1206 bFlags = TRUE; | |
| 1207 } else { | |
| 1208 ValueToUTF8String(formatValue.get(), formatString); | |
| 1209 } | |
| 1210 } | |
| 1211 if (argc == 3) { | |
| 1212 std::unique_ptr<CFXJSE_Value> localValue = GetSimpleValue(pThis, args, 2); | |
| 1213 if (ValueIsNull(pThis, localValue.get())) { | |
| 1214 bFlags = TRUE; | |
| 1215 } else { | |
| 1216 ValueToUTF8String(localValue.get(), localString); | |
| 1217 } | |
| 1218 } | |
| 1219 if (!bFlags) { | |
| 1220 CFX_ByteString szIsoDateString; | |
| 1221 FX_BOOL bRet = | |
| 1222 Local2IsoDate(pThis, dateString.AsStringC(), formatString.AsStringC(), | |
| 1223 localString.AsStringC(), szIsoDateString); | |
| 1224 if (bRet) { | |
| 1225 FXJSE_Value_SetInteger(args.GetReturnValue(), | |
| 1226 DateString2Num(szIsoDateString.AsStringC())); | |
| 1227 } else { | |
| 1228 FXJSE_Value_SetInteger(args.GetReturnValue(), 0); | |
| 1229 } | |
| 1230 } else { | |
| 1231 FXJSE_Value_SetNull(args.GetReturnValue()); | |
| 1232 } | |
| 1233 } else { | |
| 1234 CXFA_FM2JSContext* pContext = | 1183 CXFA_FM2JSContext* pContext = |
| 1235 static_cast<CXFA_FM2JSContext*>(FXJSE_Value_ToObject(pThis, nullptr)); | 1184 static_cast<CXFA_FM2JSContext*>(FXJSE_Value_ToObject(pThis, nullptr)); |
| 1236 pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, | 1185 pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, |
| 1237 L"Date2Num"); | 1186 L"Date2Num"); |
| 1187 return; | |
| 1238 } | 1188 } |
| 1189 | |
| 1190 std::unique_ptr<CFXJSE_Value> dateValue = GetSimpleValue(pThis, args, 0); | |
| 1191 if (ValueIsNull(pThis, dateValue.get())) { | |
| 1192 FXJSE_Value_SetNull(args.GetReturnValue()); | |
| 1193 return; | |
| 1194 } | |
| 1195 | |
| 1196 CFX_ByteString dateString; | |
| 1197 ValueToUTF8String(dateValue.get(), dateString); | |
| 1198 | |
| 1199 CFX_ByteString formatString; | |
| 1200 if (argc > 1) { | |
| 1201 std::unique_ptr<CFXJSE_Value> formatValue = GetSimpleValue(pThis, args, 1); | |
| 1202 if (ValueIsNull(pThis, formatValue.get())) { | |
| 1203 FXJSE_Value_SetNull(args.GetReturnValue()); | |
| 1204 return; | |
| 1205 } | |
| 1206 ValueToUTF8String(formatValue.get(), formatString); | |
| 1207 } | |
| 1208 | |
| 1209 CFX_ByteString localString; | |
| 1210 if (argc == 3) { | |
| 1211 std::unique_ptr<CFXJSE_Value> localValue = GetSimpleValue(pThis, args, 2); | |
| 1212 if (ValueIsNull(pThis, localValue.get())) { | |
| 1213 FXJSE_Value_SetNull(args.GetReturnValue()); | |
| 1214 return; | |
| 1215 } | |
| 1216 ValueToUTF8String(localValue.get(), localString); | |
| 1217 } | |
| 1218 | |
| 1219 CFX_ByteString szIsoDateString; | |
| 1220 if (!Local2IsoDate(pThis, dateString.AsStringC(), formatString.AsStringC(), | |
| 1221 localString.AsStringC(), szIsoDateString)) { | |
| 1222 FXJSE_Value_SetInteger(args.GetReturnValue(), 0); | |
| 1223 return; | |
| 1224 } | |
| 1225 | |
| 1226 FXJSE_Value_SetInteger(args.GetReturnValue(), | |
| 1227 DateString2Num(szIsoDateString.AsStringC())); | |
| 1239 } | 1228 } |
| 1240 | 1229 |
| 1241 // static | 1230 // static |
| 1242 void CXFA_FM2JSContext::DateFmt(CFXJSE_Value* pThis, | 1231 void CXFA_FM2JSContext::DateFmt(CFXJSE_Value* pThis, |
| 1243 const CFX_ByteStringC& szFuncName, | 1232 const CFX_ByteStringC& szFuncName, |
| 1244 CFXJSE_Arguments& args) { | 1233 CFXJSE_Arguments& args) { |
| 1245 int32_t argc = args.GetLength(); | 1234 int32_t argc = args.GetLength(); |
| 1246 if (argc < 3) { | 1235 if (argc >= 3) { |
| 1247 FX_BOOL bFlags = FALSE; | |
| 1248 int32_t iStyle = 0; | |
| 1249 CFX_ByteString szLocal; | |
| 1250 if (argc > 0) { | |
| 1251 std::unique_ptr<CFXJSE_Value> argStyle = GetSimpleValue(pThis, args, 0); | |
| 1252 if (FXJSE_Value_IsNull(argStyle.get())) { | |
| 1253 bFlags = TRUE; | |
| 1254 } | |
| 1255 iStyle = (int32_t)ValueToFloat(pThis, argStyle.get()); | |
| 1256 if (iStyle > 4 || iStyle < 0) { | |
| 1257 iStyle = 0; | |
| 1258 } | |
| 1259 } | |
| 1260 if (argc == 2) { | |
| 1261 std::unique_ptr<CFXJSE_Value> argLocal = GetSimpleValue(pThis, args, 1); | |
| 1262 if (FXJSE_Value_IsNull(argLocal.get())) { | |
| 1263 bFlags = TRUE; | |
| 1264 } else { | |
| 1265 ValueToUTF8String(argLocal.get(), szLocal); | |
| 1266 } | |
| 1267 } | |
| 1268 if (!bFlags) { | |
| 1269 CFX_ByteString formatStr; | |
| 1270 GetStandardDateFormat(pThis, iStyle, szLocal.AsStringC(), formatStr); | |
| 1271 if (formatStr.IsEmpty()) { | |
| 1272 formatStr = ""; | |
| 1273 } | |
| 1274 FXJSE_Value_SetUTF8String(args.GetReturnValue(), formatStr.AsStringC()); | |
| 1275 } else { | |
| 1276 FXJSE_Value_SetNull(args.GetReturnValue()); | |
| 1277 } | |
| 1278 } else { | |
| 1279 CXFA_FM2JSContext* pContext = | 1236 CXFA_FM2JSContext* pContext = |
| 1280 static_cast<CXFA_FM2JSContext*>(FXJSE_Value_ToObject(pThis, nullptr)); | 1237 static_cast<CXFA_FM2JSContext*>(FXJSE_Value_ToObject(pThis, nullptr)); |
| 1281 pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, | 1238 pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, |
| 1282 L"Date2Num"); | 1239 L"Date2Num"); |
| 1240 return; | |
| 1283 } | 1241 } |
| 1242 | |
| 1243 int32_t iStyle = 0; | |
| 1244 if (argc > 0) { | |
| 1245 std::unique_ptr<CFXJSE_Value> argStyle = GetSimpleValue(pThis, args, 0); | |
| 1246 if (FXJSE_Value_IsNull(argStyle.get())) { | |
| 1247 FXJSE_Value_SetNull(args.GetReturnValue()); | |
| 1248 return; | |
| 1249 } | |
| 1250 | |
| 1251 iStyle = (int32_t)ValueToFloat(pThis, argStyle.get()); | |
| 1252 if (iStyle < 0 || iStyle > 4) | |
| 1253 iStyle = 0; | |
| 1254 } | |
| 1255 | |
| 1256 CFX_ByteString szLocal; | |
| 1257 if (argc == 2) { | |
| 1258 std::unique_ptr<CFXJSE_Value> argLocal = GetSimpleValue(pThis, args, 1); | |
| 1259 if (FXJSE_Value_IsNull(argLocal.get())) { | |
| 1260 FXJSE_Value_SetNull(args.GetReturnValue()); | |
| 1261 return; | |
| 1262 } | |
| 1263 ValueToUTF8String(argLocal.get(), szLocal); | |
| 1264 } | |
| 1265 | |
| 1266 CFX_ByteString formatStr; | |
| 1267 GetStandardDateFormat(pThis, iStyle, szLocal.AsStringC(), formatStr); | |
| 1268 if (formatStr.IsEmpty()) | |
|
Lei Zhang
2016/06/01 20:00:43
Is this necessary?
dsinclair
2016/06/02 02:16:22
Wasn't sure, so I left it. I don't think it makes
| |
| 1269 formatStr = ""; | |
| 1270 | |
| 1271 FXJSE_Value_SetUTF8String(args.GetReturnValue(), formatStr.AsStringC()); | |
| 1284 } | 1272 } |
| 1285 | 1273 |
| 1286 // static | 1274 // static |
| 1287 void CXFA_FM2JSContext::IsoDate2Num(CFXJSE_Value* pThis, | 1275 void CXFA_FM2JSContext::IsoDate2Num(CFXJSE_Value* pThis, |
| 1288 const CFX_ByteStringC& szFuncName, | 1276 const CFX_ByteStringC& szFuncName, |
| 1289 CFXJSE_Arguments& args) { | 1277 CFXJSE_Arguments& args) { |
| 1290 if (args.GetLength() == 1) { | 1278 if (args.GetLength() != 1) { |
| 1291 std::unique_ptr<CFXJSE_Value> argOne = GetSimpleValue(pThis, args, 0); | |
| 1292 if (FXJSE_Value_IsNull(argOne.get())) { | |
| 1293 FXJSE_Value_SetNull(args.GetReturnValue()); | |
| 1294 } else { | |
| 1295 CFX_ByteString szArgString; | |
| 1296 ValueToUTF8String(argOne.get(), szArgString); | |
| 1297 int32_t dDays = DateString2Num(szArgString.AsStringC()); | |
| 1298 FXJSE_Value_SetInteger(args.GetReturnValue(), (int32_t)dDays); | |
| 1299 } | |
| 1300 } else { | |
| 1301 CXFA_FM2JSContext* pContext = | 1279 CXFA_FM2JSContext* pContext = |
| 1302 static_cast<CXFA_FM2JSContext*>(FXJSE_Value_ToObject(pThis, nullptr)); | 1280 static_cast<CXFA_FM2JSContext*>(FXJSE_Value_ToObject(pThis, nullptr)); |
| 1303 pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, | 1281 pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, |
| 1304 L"IsoDate2Num"); | 1282 L"IsoDate2Num"); |
| 1283 return; | |
| 1305 } | 1284 } |
| 1285 | |
| 1286 std::unique_ptr<CFXJSE_Value> argOne = GetSimpleValue(pThis, args, 0); | |
| 1287 if (FXJSE_Value_IsNull(argOne.get())) { | |
| 1288 FXJSE_Value_SetNull(args.GetReturnValue()); | |
| 1289 return; | |
| 1290 } | |
| 1291 | |
| 1292 CFX_ByteString szArgString; | |
| 1293 ValueToUTF8String(argOne.get(), szArgString); | |
| 1294 FXJSE_Value_SetInteger(args.GetReturnValue(), | |
| 1295 DateString2Num(szArgString.AsStringC())); | |
| 1306 } | 1296 } |
| 1307 | 1297 |
| 1308 // static | 1298 // static |
| 1309 void CXFA_FM2JSContext::IsoTime2Num(CFXJSE_Value* pThis, | 1299 void CXFA_FM2JSContext::IsoTime2Num(CFXJSE_Value* pThis, |
| 1310 const CFX_ByteStringC& szFuncName, | 1300 const CFX_ByteStringC& szFuncName, |
| 1311 CFXJSE_Arguments& args) { | 1301 CFXJSE_Arguments& args) { |
| 1312 CXFA_FM2JSContext* pContext = | 1302 CXFA_FM2JSContext* pContext = |
| 1313 static_cast<CXFA_FM2JSContext*>(FXJSE_Value_ToObject(pThis, nullptr)); | 1303 static_cast<CXFA_FM2JSContext*>(FXJSE_Value_ToObject(pThis, nullptr)); |
| 1314 if (args.GetLength() == 1) { | 1304 if (args.GetLength() != 1) { |
| 1315 std::unique_ptr<CFXJSE_Value> argOne = GetSimpleValue(pThis, args, 0); | |
| 1316 if (ValueIsNull(pThis, argOne.get())) { | |
| 1317 FXJSE_Value_SetNull(args.GetReturnValue()); | |
| 1318 } else { | |
| 1319 CXFA_Document* pDoc = pContext->GetDocument(); | |
| 1320 ASSERT(pDoc); | |
| 1321 IFX_LocaleMgr* pMgr = (IFX_LocaleMgr*)pDoc->GetLocalMgr(); | |
| 1322 CFX_ByteString szArgString; | |
| 1323 ValueToUTF8String(argOne.get(), szArgString); | |
| 1324 szArgString = szArgString.Mid(szArgString.Find('T', 0) + 1); | |
| 1325 if (szArgString.IsEmpty()) { | |
| 1326 FXJSE_Value_SetInteger(args.GetReturnValue(), 0); | |
| 1327 return; | |
| 1328 } | |
| 1329 CXFA_LocaleValue timeValue( | |
| 1330 XFA_VT_TIME, CFX_WideString::FromUTF8(szArgString.AsStringC()), | |
| 1331 (CXFA_LocaleMgr*)pMgr); | |
| 1332 if (timeValue.IsValid()) { | |
| 1333 CFX_Unitime uniTime = timeValue.GetTime(); | |
| 1334 int32_t hour = uniTime.GetHour(); | |
| 1335 int32_t min = uniTime.GetMinute(); | |
| 1336 int32_t second = uniTime.GetSecond(); | |
| 1337 int32_t milSecond = uniTime.GetMillisecond(); | |
| 1338 IFX_Locale* pDefLocale = pMgr->GetDefLocale(); | |
| 1339 ASSERT(pDefLocale); | |
| 1340 FX_TIMEZONE tzLocale; | |
| 1341 pDefLocale->GetTimeZone(tzLocale); | |
| 1342 int32_t mins = hour * 60 + min; | |
| 1343 mins -= (tzLocale.tzHour * 60); | |
| 1344 while (mins > 1440) { | |
| 1345 mins -= 1440; | |
| 1346 } | |
| 1347 while (mins < 0) { | |
| 1348 mins += 1440; | |
| 1349 } | |
| 1350 hour = mins / 60; | |
| 1351 min = mins % 60; | |
| 1352 int32_t iResult = | |
| 1353 hour * 3600000 + min * 60000 + second * 1000 + milSecond + 1; | |
| 1354 FXJSE_Value_SetInteger(args.GetReturnValue(), iResult); | |
| 1355 } else { | |
| 1356 FXJSE_Value_SetInteger(args.GetReturnValue(), 0); | |
| 1357 } | |
| 1358 } | |
| 1359 } else { | |
| 1360 pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, | 1305 pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, |
| 1361 L"IsoTime2Num"); | 1306 L"IsoTime2Num"); |
| 1307 return; | |
| 1362 } | 1308 } |
| 1309 | |
| 1310 std::unique_ptr<CFXJSE_Value> argOne = GetSimpleValue(pThis, args, 0); | |
| 1311 if (ValueIsNull(pThis, argOne.get())) { | |
| 1312 FXJSE_Value_SetNull(args.GetReturnValue()); | |
| 1313 return; | |
| 1314 } | |
| 1315 | |
| 1316 CXFA_Document* pDoc = pContext->GetDocument(); | |
| 1317 CXFA_LocaleMgr* pMgr = pDoc->GetLocalMgr(); | |
|
dsinclair
2016/06/01 14:02:00
We just casted this to CXFA_LocalMgr on the old li
| |
| 1318 | |
| 1319 CFX_ByteString szArgString; | |
| 1320 ValueToUTF8String(argOne.get(), szArgString); | |
| 1321 szArgString = szArgString.Mid(szArgString.Find('T', 0) + 1); | |
| 1322 if (szArgString.IsEmpty()) { | |
| 1323 FXJSE_Value_SetInteger(args.GetReturnValue(), 0); | |
| 1324 return; | |
| 1325 } | |
| 1326 | |
| 1327 CXFA_LocaleValue timeValue( | |
| 1328 XFA_VT_TIME, CFX_WideString::FromUTF8(szArgString.AsStringC()), pMgr); | |
| 1329 if (!timeValue.IsValid()) { | |
| 1330 FXJSE_Value_SetInteger(args.GetReturnValue(), 0); | |
| 1331 return; | |
| 1332 } | |
| 1333 | |
| 1334 CFX_Unitime uniTime = timeValue.GetTime(); | |
| 1335 int32_t hour = uniTime.GetHour(); | |
| 1336 int32_t min = uniTime.GetMinute(); | |
| 1337 int32_t second = uniTime.GetSecond(); | |
| 1338 int32_t milSecond = uniTime.GetMillisecond(); | |
| 1339 | |
| 1340 IFX_Locale* pDefLocale = pMgr->GetDefLocale(); | |
|
Lei Zhang
2016/06/01 20:00:43
Don't bother with the extra local variable?
dsinclair
2016/06/02 02:16:22
Done.
| |
| 1341 FX_TIMEZONE tzLocale; | |
| 1342 pDefLocale->GetTimeZone(tzLocale); | |
| 1343 | |
| 1344 int32_t mins = hour * 60 + min; | |
|
Lei Zhang
2016/06/01 20:00:43
I wonder if we have some other time conversion cod
dsinclair
2016/06/02 02:16:22
Done.
| |
| 1345 mins -= (tzLocale.tzHour * 60); | |
| 1346 while (mins > 1440) | |
| 1347 mins -= 1440; | |
| 1348 while (mins < 0) | |
| 1349 mins += 1440; | |
| 1350 hour = mins / 60; | |
| 1351 min = mins % 60; | |
| 1352 int32_t iResult = | |
| 1353 hour * 3600000 + min * 60000 + second * 1000 + milSecond + 1; | |
| 1354 FXJSE_Value_SetInteger(args.GetReturnValue(), iResult); | |
| 1363 } | 1355 } |
| 1364 | 1356 |
| 1365 // static | 1357 // static |
| 1366 void CXFA_FM2JSContext::LocalDateFmt(CFXJSE_Value* pThis, | 1358 void CXFA_FM2JSContext::LocalDateFmt(CFXJSE_Value* pThis, |
| 1367 const CFX_ByteStringC& szFuncName, | 1359 const CFX_ByteStringC& szFuncName, |
| 1368 CFXJSE_Arguments& args) { | 1360 CFXJSE_Arguments& args) { |
| 1369 int32_t argc = args.GetLength(); | 1361 int32_t argc = args.GetLength(); |
| 1370 if (argc < 3) { | 1362 if (argc < 3) { |
| 1371 FX_BOOL bFlags = FALSE; | 1363 FX_BOOL bFlags = FALSE; |
| 1372 int32_t iStyle = 0; | 1364 int32_t iStyle = 0; |
| (...skipping 5798 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 7171 CFX_WideString wsFormat; | 7163 CFX_WideString wsFormat; |
| 7172 pAppProvider->LoadString(iStringID, wsFormat); | 7164 pAppProvider->LoadString(iStringID, wsFormat); |
| 7173 CFX_WideString wsMessage; | 7165 CFX_WideString wsMessage; |
| 7174 va_list arg_ptr; | 7166 va_list arg_ptr; |
| 7175 va_start(arg_ptr, iStringID); | 7167 va_start(arg_ptr, iStringID); |
| 7176 wsMessage.FormatV(wsFormat.c_str(), arg_ptr); | 7168 wsMessage.FormatV(wsFormat.c_str(), arg_ptr); |
| 7177 va_end(arg_ptr); | 7169 va_end(arg_ptr); |
| 7178 FXJSE_ThrowMessage( | 7170 FXJSE_ThrowMessage( |
| 7179 "", FX_UTF8Encode(wsMessage.c_str(), wsMessage.GetLength()).AsStringC()); | 7171 "", FX_UTF8Encode(wsMessage.c_str(), wsMessage.GetLength()).AsStringC()); |
| 7180 } | 7172 } |
| OLD | NEW |