Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(769)

Side by Side Diff: xfa/fxfa/fm2js/xfa_fm2jscontext.cpp

Issue 2046123004: xfa_fm2jscontext method cleanup - pt VIII (Closed) Base URL: https://pdfium.googlesource.com/pdfium.git@master
Patch Set: Created 4 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 4762 matching lines...) Expand 10 before | Expand all | Expand 10 after
4773 "five", "six", "seven", "eight", "nine"}; 4773 "five", "six", "seven", "eight", "nine"};
4774 CFX_ByteStringC pCapUnits[] = {"Zero", "One", "Two", "Three", "Four", 4774 CFX_ByteStringC pCapUnits[] = {"Zero", "One", "Two", "Three", "Four",
4775 "Five", "Six", "Seven", "Eight", "Nine"}; 4775 "Five", "Six", "Seven", "Eight", "Nine"};
4776 CFX_ByteStringC pTens[] = {"Ten", "Eleven", "Twelve", "Thirteen", 4776 CFX_ByteStringC pTens[] = {"Ten", "Eleven", "Twelve", "Thirteen",
4777 "Fourteen", "Fifteen", "Sixteen", "Seventeen", 4777 "Fourteen", "Fifteen", "Sixteen", "Seventeen",
4778 "Eighteen", "Nineteen"}; 4778 "Eighteen", "Nineteen"};
4779 CFX_ByteStringC pLastTens[] = {"Twenty", "Thirty", "Forty", "Fifty", 4779 CFX_ByteStringC pLastTens[] = {"Twenty", "Thirty", "Forty", "Fifty",
4780 "Sixty", "Seventy", "Eighty", "Ninety"}; 4780 "Sixty", "Seventy", "Eighty", "Ninety"};
4781 CFX_ByteStringC pComm[] = {" Hundred ", " Thousand ", " Million ", 4781 CFX_ByteStringC pComm[] = {" Hundred ", " Thousand ", " Million ",
4782 " Billion ", "Trillion"}; 4782 " Billion ", "Trillion"};
4783 int32_t iComm = 0;
4784 const FX_CHAR* pData = szData.c_str(); 4783 const FX_CHAR* pData = szData.c_str();
4785 int32_t iLength = szData.GetLength(); 4784 int32_t iLength = szData.GetLength();
4786 if (iLength > 12) { 4785 int32_t iComm = 0;
4786 if (iLength > 12)
4787 iComm = 4; 4787 iComm = 4;
4788 } else if (iLength > 9) { 4788 else if (iLength > 9)
4789 iComm = 3; 4789 iComm = 3;
4790 } else if (iLength > 6) { 4790 else if (iLength > 6)
4791 iComm = 2; 4791 iComm = 2;
4792 } else if (iLength > 3) { 4792 else if (iLength > 3)
4793 iComm = 1; 4793 iComm = 1;
4794 } 4794
4795 int32_t iFirstCount = iLength % 3;
4796 if (iFirstCount == 0)
4797 iFirstCount = 3;
4798
4795 int32_t iIndex = 0; 4799 int32_t iIndex = 0;
4796 int32_t iFirstCount = iLength % 3;
4797 if (iFirstCount == 0) {
4798 iFirstCount = 3;
4799 }
4800 if (iFirstCount == 3) { 4800 if (iFirstCount == 3) {
4801 if (pData[iIndex] != '0') { 4801 if (pData[iIndex] != '0') {
4802 strBuf << pCapUnits[pData[iIndex] - '0']; 4802 strBuf << pCapUnits[pData[iIndex] - '0'];
4803 strBuf << pComm[0]; 4803 strBuf << pComm[0];
4804 } 4804 }
4805 if (pData[iIndex + 1] == '0') { 4805 if (pData[iIndex + 1] == '0') {
4806 strBuf << pCapUnits[pData[iIndex + 2] - '0']; 4806 strBuf << pCapUnits[pData[iIndex + 2] - '0'];
4807 } else { 4807 } else {
4808 if (pData[iIndex + 1] > '1') { 4808 if (pData[iIndex + 1] > '1') {
4809 strBuf << pLastTens[pData[iIndex + 1] - '2']; 4809 strBuf << pLastTens[pData[iIndex + 1] - '2'];
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after
4864 iIndex += 3; 4864 iIndex += 3;
4865 } 4865 }
4866 } 4866 }
4867 4867
4868 // static 4868 // static
4869 void CXFA_FM2JSContext::WordUS(const CFX_ByteStringC& szData, 4869 void CXFA_FM2JSContext::WordUS(const CFX_ByteStringC& szData,
4870 int32_t iStyle, 4870 int32_t iStyle,
4871 CFX_ByteTextBuf& strBuf) { 4871 CFX_ByteTextBuf& strBuf) {
4872 const FX_CHAR* pData = szData.c_str(); 4872 const FX_CHAR* pData = szData.c_str();
4873 int32_t iLength = szData.GetLength(); 4873 int32_t iLength = szData.GetLength();
4874 switch (iStyle) { 4874 if (iStyle < 0 || iStyle > 2) {
4875 case 0: { 4875 return;
4876 int32_t iIndex = 0; 4876 }
4877 while (iIndex < iLength) { 4877
4878 if (pData[iIndex] == '.') { 4878 int32_t iIndex = 0;
4879 break; 4879 while (iIndex < iLength) {
4880 } 4880 if (pData[iIndex] == '.')
4881 ++iIndex;
4882 }
4883 iLength = iIndex;
4884 iIndex = 0;
4885 int32_t iCount = 0;
4886 while (iIndex < iLength) {
4887 iCount = (iLength - iIndex) % 12;
4888 if (!iCount && iLength - iIndex > 0) {
4889 iCount = 12;
4890 }
4891 TrillionUS(CFX_ByteStringC(pData + iIndex, iCount), strBuf);
4892 iIndex += iCount;
4893 if (iIndex < iLength) {
4894 strBuf << " Trillion ";
4895 }
4896 }
4897 } break;
4898 case 1: {
4899 int32_t iIndex = 0;
4900 while (iIndex < iLength) {
4901 if (pData[iIndex] == '.') {
4902 break;
4903 }
4904 ++iIndex;
4905 }
4906 iLength = iIndex;
4907 iIndex = 0;
4908 int32_t iCount = 0;
4909 while (iIndex < iLength) {
4910 iCount = (iLength - iIndex) % 12;
4911 if (!iCount && iLength - iIndex > 0) {
4912 iCount = 12;
4913 }
4914 TrillionUS(CFX_ByteStringC(pData + iIndex, iCount), strBuf);
4915 iIndex += iCount;
4916 if (iIndex < iLength) {
4917 strBuf << " Trillion ";
4918 }
4919 }
4920 strBuf << " Dollars";
4921 } break;
4922 case 2: {
4923 int32_t iIndex = 0;
4924 while (iIndex < iLength) {
4925 if (pData[iIndex] == '.') {
4926 break;
4927 }
4928 ++iIndex;
4929 }
4930 int32_t iInteger = iIndex;
4931 iIndex = 0;
4932 int32_t iCount = 0;
4933 while (iIndex < iInteger) {
4934 iCount = (iInteger - iIndex) % 12;
4935 if (!iCount && iLength - iIndex > 0) {
4936 iCount = 12;
4937 }
4938 TrillionUS(CFX_ByteStringC(pData + iIndex, iCount), strBuf);
4939 iIndex += iCount;
4940 if (iIndex < iInteger) {
4941 strBuf << " Trillion ";
4942 }
4943 }
4944 strBuf << " Dollars";
4945 if (iInteger < iLength) {
4946 strBuf << " And ";
4947 iIndex = iInteger + 1;
4948 while (iIndex < iLength) {
4949 int32_t iSize = (iLength - iIndex) % 12;
4950 if (!iSize && iLength - iIndex > 0)
4951 iSize = 12;
4952 TrillionUS(CFX_ByteStringC(pData + iIndex, iSize), strBuf);
4953 iIndex += iSize;
4954 if (iIndex < iLength) {
4955 strBuf << " Trillion ";
4956 }
4957 }
4958 strBuf << " Cents";
4959 }
4960 } break;
4961 default:
4962 break; 4881 break;
4882 ++iIndex;
4883 }
4884 int32_t iInteger = iIndex;
4885 iIndex = 0;
4886 while (iIndex < iInteger) {
4887 int32_t iCount = (iInteger - iIndex) % 12;
4888 if (!iCount && iInteger - iIndex > 0)
4889 iCount = 12;
4890
4891 TrillionUS(CFX_ByteStringC(pData + iIndex, iCount), strBuf);
4892 iIndex += iCount;
4893 if (iIndex < iInteger)
4894 strBuf << " Trillion ";
4895 }
4896
4897 if (iStyle > 0)
4898 strBuf << " Dollars";
4899
4900 if (iStyle > 1 && iInteger < iLength) {
4901 strBuf << " And ";
4902 iIndex = iInteger + 1;
4903 while (iIndex < iLength) {
4904 int32_t iCount = (iLength - iIndex) % 12;
4905 if (!iCount && iLength - iIndex > 0)
4906 iCount = 12;
4907
4908 TrillionUS(CFX_ByteStringC(pData + iIndex, iCount), strBuf);
4909 iIndex += iCount;
4910 if (iIndex < iLength)
4911 strBuf << " Trillion ";
4912 }
4913 strBuf << " Cents";
4963 } 4914 }
4964 } 4915 }
4965 4916
4966 // static 4917 // static
4967 void CXFA_FM2JSContext::Get(CFXJSE_Value* pThis, 4918 void CXFA_FM2JSContext::Get(CFXJSE_Value* pThis,
4968 const CFX_ByteStringC& szFuncName, 4919 const CFX_ByteStringC& szFuncName,
4969 CFXJSE_Arguments& args) { 4920 CFXJSE_Arguments& args) {
4970 CXFA_FM2JSContext* pContext = ToJSContext(pThis, nullptr); 4921 CXFA_FM2JSContext* pContext = ToJSContext(pThis, nullptr);
4971 if (args.GetLength() == 1) { 4922 if (args.GetLength() != 1) {
4972 CXFA_Document* pDoc = pContext->GetDocument();
4973 if (!pDoc) {
4974 return;
4975 }
4976 IXFA_AppProvider* pAppProvider =
4977 pDoc->GetParser()->GetNotify()->GetAppProvider();
4978 if (!pAppProvider) {
4979 return;
4980 }
4981 std::unique_ptr<CFXJSE_Value> argOne = GetSimpleValue(pThis, args, 0);
4982 CFX_ByteString urlString;
4983 ValueToUTF8String(argOne.get(), urlString);
4984 IFX_FileRead* pFile = pAppProvider->DownloadURL(
4985 CFX_WideString::FromUTF8(urlString.AsStringC()));
4986 if (pFile) {
4987 int32_t size = pFile->GetSize();
4988 uint8_t* pData = FX_Alloc(uint8_t, size);
4989 pFile->ReadBlock(pData, size);
4990 args.GetReturnValue()->SetString(CFX_ByteStringC(pData, size));
4991 FX_Free(pData);
4992 pFile->Release();
4993 }
4994 } else {
4995 pContext->ThrowException(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"Get"); 4923 pContext->ThrowException(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"Get");
4924 return;
4996 } 4925 }
4926
4927 CXFA_Document* pDoc = pContext->GetDocument();
4928 if (!pDoc)
4929 return;
4930
4931 IXFA_AppProvider* pAppProvider =
4932 pDoc->GetParser()->GetNotify()->GetAppProvider();
4933 if (!pAppProvider)
4934 return;
4935
4936 std::unique_ptr<CFXJSE_Value> argOne = GetSimpleValue(pThis, args, 0);
4937 CFX_ByteString urlString;
4938 ValueToUTF8String(argOne.get(), urlString);
4939 IFX_FileRead* pFile = pAppProvider->DownloadURL(
4940 CFX_WideString::FromUTF8(urlString.AsStringC()));
4941 if (!pFile)
4942 return;
4943
4944 int32_t size = pFile->GetSize();
4945 std::unique_ptr<uint8_t> pData(FX_Alloc(uint8_t, size));
4946 pFile->ReadBlock(pData.get(), size);
4947 args.GetReturnValue()->SetString(CFX_ByteStringC(pData.get(), size));
4948 pFile->Release();
4997 } 4949 }
4998 4950
4999 // static 4951 // static
5000 void CXFA_FM2JSContext::Post(CFXJSE_Value* pThis, 4952 void CXFA_FM2JSContext::Post(CFXJSE_Value* pThis,
5001 const CFX_ByteStringC& szFuncName, 4953 const CFX_ByteStringC& szFuncName,
5002 CFXJSE_Arguments& args) { 4954 CFXJSE_Arguments& args) {
5003 CXFA_FM2JSContext* pContext = ToJSContext(pThis, nullptr); 4955 CXFA_FM2JSContext* pContext = ToJSContext(pThis, nullptr);
5004 int32_t argc = args.GetLength(); 4956 int32_t argc = args.GetLength();
5005 if ((argc >= 2) && (argc <= 5)) { 4957 if (argc < 2 || argc > 5) {
5006 CXFA_Document* pDoc = pContext->GetDocument();
5007 if (!pDoc) {
5008 return;
5009 }
5010 IXFA_AppProvider* pAppProvider =
5011 pDoc->GetParser()->GetNotify()->GetAppProvider();
5012 if (!pAppProvider) {
5013 return;
5014 }
5015 CFX_ByteString bsURL;
5016 CFX_ByteString bsData;
5017 CFX_ByteString bsContentType;
5018 CFX_ByteString bsEncode;
5019 CFX_ByteString bsHeader;
5020 std::unique_ptr<CFXJSE_Value> argOne = GetSimpleValue(pThis, args, 0);
5021 ValueToUTF8String(argOne.get(), bsURL);
5022 std::unique_ptr<CFXJSE_Value> argTwo = GetSimpleValue(pThis, args, 1);
5023 ValueToUTF8String(argTwo.get(), bsData);
5024 if (argc > 2) {
5025 std::unique_ptr<CFXJSE_Value> argThree = GetSimpleValue(pThis, args, 2);
5026 ValueToUTF8String(argThree.get(), bsContentType);
5027 }
5028 if (argc > 3) {
5029 std::unique_ptr<CFXJSE_Value> argFour = GetSimpleValue(pThis, args, 3);
5030 ValueToUTF8String(argFour.get(), bsEncode);
5031 }
5032 if (argc > 4) {
5033 std::unique_ptr<CFXJSE_Value> argFive = GetSimpleValue(pThis, args, 4);
5034 ValueToUTF8String(argFive.get(), bsHeader);
5035 }
5036 CFX_WideString decodedResponse;
5037 FX_BOOL bFlags = pAppProvider->PostRequestURL(
5038 CFX_WideString::FromUTF8(bsURL.AsStringC()),
5039 CFX_WideString::FromUTF8(bsData.AsStringC()),
5040 CFX_WideString::FromUTF8(bsContentType.AsStringC()),
5041 CFX_WideString::FromUTF8(bsEncode.AsStringC()),
5042 CFX_WideString::FromUTF8(bsHeader.AsStringC()), decodedResponse);
5043 if (bFlags) {
5044 args.GetReturnValue()->SetString(
5045 FX_UTF8Encode(decodedResponse.c_str(), decodedResponse.GetLength())
5046 .AsStringC());
5047 } else {
5048 pContext->ThrowException(XFA_IDS_SERVER_DENY);
5049 }
5050 } else {
5051 pContext->ThrowException(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"Post"); 4958 pContext->ThrowException(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"Post");
4959 return;
5052 } 4960 }
4961
4962 CXFA_Document* pDoc = pContext->GetDocument();
4963 if (!pDoc)
4964 return;
4965
4966 IXFA_AppProvider* pAppProvider =
4967 pDoc->GetParser()->GetNotify()->GetAppProvider();
4968 if (!pAppProvider)
4969 return;
4970
4971 CFX_ByteString bsURL;
4972 std::unique_ptr<CFXJSE_Value> argOne = GetSimpleValue(pThis, args, 0);
4973 ValueToUTF8String(argOne.get(), bsURL);
4974
4975 CFX_ByteString bsData;
4976 std::unique_ptr<CFXJSE_Value> argTwo = GetSimpleValue(pThis, args, 1);
4977 ValueToUTF8String(argTwo.get(), bsData);
4978
4979 CFX_ByteString bsContentType;
4980 if (argc > 2) {
4981 std::unique_ptr<CFXJSE_Value> argThree = GetSimpleValue(pThis, args, 2);
4982 ValueToUTF8String(argThree.get(), bsContentType);
4983 }
4984
4985 CFX_ByteString bsEncode;
4986 if (argc > 3) {
4987 std::unique_ptr<CFXJSE_Value> argFour = GetSimpleValue(pThis, args, 3);
4988 ValueToUTF8String(argFour.get(), bsEncode);
4989 }
4990
4991 CFX_ByteString bsHeader;
4992 if (argc > 4) {
4993 std::unique_ptr<CFXJSE_Value> argFive = GetSimpleValue(pThis, args, 4);
4994 ValueToUTF8String(argFive.get(), bsHeader);
4995 }
4996
4997 CFX_WideString decodedResponse;
4998 if (!pAppProvider->PostRequestURL(
4999 CFX_WideString::FromUTF8(bsURL.AsStringC()),
5000 CFX_WideString::FromUTF8(bsData.AsStringC()),
5001 CFX_WideString::FromUTF8(bsContentType.AsStringC()),
5002 CFX_WideString::FromUTF8(bsEncode.AsStringC()),
5003 CFX_WideString::FromUTF8(bsHeader.AsStringC()), decodedResponse)) {
5004 pContext->ThrowException(XFA_IDS_SERVER_DENY);
5005 return;
5006 }
5007
5008 args.GetReturnValue()->SetString(
5009 FX_UTF8Encode(decodedResponse.c_str(), decodedResponse.GetLength())
5010 .AsStringC());
5053 } 5011 }
5054 5012
5055 // static 5013 // static
5056 void CXFA_FM2JSContext::Put(CFXJSE_Value* pThis, 5014 void CXFA_FM2JSContext::Put(CFXJSE_Value* pThis,
5057 const CFX_ByteStringC& szFuncName, 5015 const CFX_ByteStringC& szFuncName,
5058 CFXJSE_Arguments& args) { 5016 CFXJSE_Arguments& args) {
5059 CXFA_FM2JSContext* pContext = ToJSContext(pThis, nullptr); 5017 CXFA_FM2JSContext* pContext = ToJSContext(pThis, nullptr);
5060 int32_t argc = args.GetLength(); 5018 int32_t argc = args.GetLength();
5061 if ((argc == 2) || (argc == 3)) { 5019 if (argc < 2 || argc > 3) {
5062 CXFA_Document* pDoc = pContext->GetDocument();
5063 if (!pDoc) {
5064 return;
5065 }
5066 IXFA_AppProvider* pAppProvider =
5067 pDoc->GetParser()->GetNotify()->GetAppProvider();
5068 if (!pAppProvider) {
5069 return;
5070 }
5071 CFX_ByteString bsURL;
5072 CFX_ByteString bsData;
5073 CFX_ByteString bsEncode;
5074 std::unique_ptr<CFXJSE_Value> argOne = GetSimpleValue(pThis, args, 0);
5075 ValueToUTF8String(argOne.get(), bsURL);
5076 std::unique_ptr<CFXJSE_Value> argTwo = GetSimpleValue(pThis, args, 1);
5077 ValueToUTF8String(argTwo.get(), bsData);
5078 if (argc > 2) {
5079 std::unique_ptr<CFXJSE_Value> argThree = GetSimpleValue(pThis, args, 2);
5080 ValueToUTF8String(argThree.get(), bsEncode);
5081 }
5082 FX_BOOL bFlags = pAppProvider->PutRequestURL(
5083 CFX_WideString::FromUTF8(bsURL.AsStringC()),
5084 CFX_WideString::FromUTF8(bsData.AsStringC()),
5085 CFX_WideString::FromUTF8(bsEncode.AsStringC()));
5086 if (bFlags) {
5087 args.GetReturnValue()->SetString("");
5088 } else {
5089 pContext->ThrowException(XFA_IDS_SERVER_DENY);
5090 }
5091 } else {
5092 pContext->ThrowException(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"Put"); 5020 pContext->ThrowException(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"Put");
5021 return;
5093 } 5022 }
5023
5024 CXFA_Document* pDoc = pContext->GetDocument();
5025 if (!pDoc)
5026 return;
5027
5028 IXFA_AppProvider* pAppProvider =
5029 pDoc->GetParser()->GetNotify()->GetAppProvider();
5030 if (!pAppProvider)
5031 return;
5032
5033 CFX_ByteString bsURL;
5034 std::unique_ptr<CFXJSE_Value> argOne = GetSimpleValue(pThis, args, 0);
5035 ValueToUTF8String(argOne.get(), bsURL);
5036
5037 CFX_ByteString bsData;
5038 std::unique_ptr<CFXJSE_Value> argTwo = GetSimpleValue(pThis, args, 1);
5039 ValueToUTF8String(argTwo.get(), bsData);
5040
5041 CFX_ByteString bsEncode;
5042 if (argc > 2) {
5043 std::unique_ptr<CFXJSE_Value> argThree = GetSimpleValue(pThis, args, 2);
5044 ValueToUTF8String(argThree.get(), bsEncode);
5045 }
5046
5047 if (!pAppProvider->PutRequestURL(
5048 CFX_WideString::FromUTF8(bsURL.AsStringC()),
5049 CFX_WideString::FromUTF8(bsData.AsStringC()),
5050 CFX_WideString::FromUTF8(bsEncode.AsStringC()))) {
5051 pContext->ThrowException(XFA_IDS_SERVER_DENY);
5052 return;
5053 }
5054
5055 args.GetReturnValue()->SetString("");
5094 } 5056 }
5095 5057
5096 // static 5058 // static
5097 void CXFA_FM2JSContext::assign_value_operator(CFXJSE_Value* pThis, 5059 void CXFA_FM2JSContext::assign_value_operator(CFXJSE_Value* pThis,
5098 const CFX_ByteStringC& szFuncName, 5060 const CFX_ByteStringC& szFuncName,
5099 CFXJSE_Arguments& args) { 5061 CFXJSE_Arguments& args) {
5100 CXFA_FM2JSContext* pContext = ToJSContext(pThis, nullptr); 5062 CXFA_FM2JSContext* pContext = ToJSContext(pThis, nullptr);
5101 v8::Isolate* pIsolate = pContext->GetScriptRuntime(); 5063 if (args.GetLength() != 2) {
5102 if (args.GetLength() == 2) { 5064 pContext->ThrowException(XFA_IDS_COMPILER_ERROR);
5103 std::unique_ptr<CFXJSE_Value> lValue = args.GetValue(0); 5065 return;
5104 std::unique_ptr<CFXJSE_Value> rValue = GetSimpleValue(pThis, args, 1); 5066 }
5105 FX_BOOL bSetStatus = TRUE; 5067
5106 if (lValue->IsArray()) { 5068 std::unique_ptr<CFXJSE_Value> lValue = args.GetValue(0);
5107 std::unique_ptr<CFXJSE_Value> leftLengthValue(new CFXJSE_Value(pIsolate)); 5069 std::unique_ptr<CFXJSE_Value> rValue = GetSimpleValue(pThis, args, 1);
5108 lValue->GetObjectProperty("length", leftLengthValue.get()); 5070 if (lValue->IsArray()) {
5109 int32_t iLeftLength = leftLengthValue->ToInteger(); 5071 v8::Isolate* pIsolate = pContext->GetScriptRuntime();
5110 std::unique_ptr<CFXJSE_Value> jsObjectValue(new CFXJSE_Value(pIsolate)); 5072 std::unique_ptr<CFXJSE_Value> leftLengthValue(new CFXJSE_Value(pIsolate));
5111 std::unique_ptr<CFXJSE_Value> propertyValue(new CFXJSE_Value(pIsolate)); 5073 lValue->GetObjectProperty("length", leftLengthValue.get());
5112 lValue->GetObjectPropertyByIdx(1, propertyValue.get()); 5074 int32_t iLeftLength = leftLengthValue->ToInteger();
5113 if (propertyValue->IsNull()) { 5075 std::unique_ptr<CFXJSE_Value> jsObjectValue(new CFXJSE_Value(pIsolate));
5114 for (int32_t i = 2; i < iLeftLength; i++) { 5076 std::unique_ptr<CFXJSE_Value> propertyValue(new CFXJSE_Value(pIsolate));
5115 lValue->GetObjectPropertyByIdx(i, jsObjectValue.get()); 5077 lValue->GetObjectPropertyByIdx(1, propertyValue.get());
5116 bSetStatus = SetObjectDefaultValue(jsObjectValue.get(), rValue.get()); 5078 if (propertyValue->IsNull()) {
5117 if (!bSetStatus) { 5079 for (int32_t i = 2; i < iLeftLength; i++) {
5118 pContext->ThrowException(XFA_IDS_NOT_DEFAUL_VALUE); 5080 lValue->GetObjectPropertyByIdx(i, jsObjectValue.get());
5119 break; 5081 if (!SetObjectDefaultValue(jsObjectValue.get(), rValue.get())) {
5120 } 5082 pContext->ThrowException(XFA_IDS_NOT_DEFAUL_VALUE);
5121 } 5083 return;
5122 } else {
5123 CFX_ByteString propertyStr;
5124 propertyValue->ToString(propertyStr);
5125 for (int32_t i = 2; i < iLeftLength; i++) {
5126 lValue->GetObjectPropertyByIdx(i, jsObjectValue.get());
5127 jsObjectValue->SetObjectProperty(propertyStr.AsStringC(),
5128 rValue.get());
5129 } 5084 }
5130 } 5085 }
5131 } else if (lValue->IsObject()) { 5086 } else {
5132 bSetStatus = SetObjectDefaultValue(lValue.get(), rValue.get()); 5087 CFX_ByteString propertyStr;
5133 if (!bSetStatus) { 5088 propertyValue->ToString(propertyStr);
5134 pContext->ThrowException(XFA_IDS_NOT_DEFAUL_VALUE); 5089 for (int32_t i = 2; i < iLeftLength; i++) {
5090 lValue->GetObjectPropertyByIdx(i, jsObjectValue.get());
5091 jsObjectValue->SetObjectProperty(propertyStr.AsStringC(), rValue.get());
5135 } 5092 }
5136 } 5093 }
5137 args.GetReturnValue()->Assign(rValue.get()); 5094 } else if (lValue->IsObject()) {
5138 } else { 5095 if (!SetObjectDefaultValue(lValue.get(), rValue.get())) {
5139 pContext->ThrowException(XFA_IDS_COMPILER_ERROR); 5096 pContext->ThrowException(XFA_IDS_NOT_DEFAUL_VALUE);
5140 } 5097 return;
5098 }
5099 }
5100 args.GetReturnValue()->Assign(rValue.get());
5141 } 5101 }
5142 5102
5143 // static 5103 // static
5144 void CXFA_FM2JSContext::logical_or_operator(CFXJSE_Value* pThis, 5104 void CXFA_FM2JSContext::logical_or_operator(CFXJSE_Value* pThis,
5145 const CFX_ByteStringC& szFuncName, 5105 const CFX_ByteStringC& szFuncName,
5146 CFXJSE_Arguments& args) { 5106 CFXJSE_Arguments& args) {
5147 if (args.GetLength() == 2) { 5107 if (args.GetLength() != 2) {
5148 std::unique_ptr<CFXJSE_Value> argFirst = GetSimpleValue(pThis, args, 0); 5108 ToJSContext(pThis, nullptr)->ThrowException(XFA_IDS_COMPILER_ERROR);
5149 std::unique_ptr<CFXJSE_Value> argSecond = GetSimpleValue(pThis, args, 1); 5109 return;
5150 if (argFirst->IsNull() && argSecond->IsNull()) { 5110 }
5151 args.GetReturnValue()->SetNull(); 5111
5152 } else { 5112 std::unique_ptr<CFXJSE_Value> argFirst = GetSimpleValue(pThis, args, 0);
5153 FX_FLOAT first = ValueToFloat(pThis, argFirst.get()); 5113 std::unique_ptr<CFXJSE_Value> argSecond = GetSimpleValue(pThis, args, 1);
5154 FX_FLOAT second = ValueToFloat(pThis, argSecond.get()); 5114 if (argFirst->IsNull() && argSecond->IsNull()) {
5155 args.GetReturnValue()->SetInteger((first || second) ? 1 : 0); 5115 args.GetReturnValue()->SetNull();
5156 } 5116 return;
5157 } else { 5117 }
5158 ToJSContext(pThis, nullptr)->ThrowException(XFA_IDS_COMPILER_ERROR); 5118
5159 } 5119 FX_FLOAT first = ValueToFloat(pThis, argFirst.get());
5120 FX_FLOAT second = ValueToFloat(pThis, argSecond.get());
5121 args.GetReturnValue()->SetInteger((first || second) ? 1 : 0);
5160 } 5122 }
5161 5123
5162 // static 5124 // static
5163 void CXFA_FM2JSContext::logical_and_operator(CFXJSE_Value* pThis, 5125 void CXFA_FM2JSContext::logical_and_operator(CFXJSE_Value* pThis,
5164 const CFX_ByteStringC& szFuncName, 5126 const CFX_ByteStringC& szFuncName,
5165 CFXJSE_Arguments& args) { 5127 CFXJSE_Arguments& args) {
5166 if (args.GetLength() == 2) { 5128 if (args.GetLength() != 2) {
5167 std::unique_ptr<CFXJSE_Value> argFirst = GetSimpleValue(pThis, args, 0); 5129 ToJSContext(pThis, nullptr)->ThrowException(XFA_IDS_COMPILER_ERROR);
5168 std::unique_ptr<CFXJSE_Value> argSecond = GetSimpleValue(pThis, args, 1); 5130 return;
5169 if (argFirst->IsNull() && argSecond->IsNull()) { 5131 }
5170 args.GetReturnValue()->SetNull(); 5132
5171 } else { 5133 std::unique_ptr<CFXJSE_Value> argFirst = GetSimpleValue(pThis, args, 0);
5172 FX_FLOAT first = ValueToFloat(pThis, argFirst.get()); 5134 std::unique_ptr<CFXJSE_Value> argSecond = GetSimpleValue(pThis, args, 1);
5173 FX_FLOAT second = ValueToFloat(pThis, argSecond.get()); 5135 if (argFirst->IsNull() && argSecond->IsNull()) {
5174 args.GetReturnValue()->SetInteger((first && second) ? 1 : 0); 5136 args.GetReturnValue()->SetNull();
5175 } 5137 return;
5176 } else { 5138 }
5177 ToJSContext(pThis, nullptr)->ThrowException(XFA_IDS_COMPILER_ERROR); 5139
5178 } 5140 FX_FLOAT first = ValueToFloat(pThis, argFirst.get());
5141 FX_FLOAT second = ValueToFloat(pThis, argSecond.get());
5142 args.GetReturnValue()->SetInteger((first && second) ? 1 : 0);
5179 } 5143 }
5180 5144
5181 // static 5145 // static
5182 void CXFA_FM2JSContext::equality_operator(CFXJSE_Value* pThis, 5146 void CXFA_FM2JSContext::equality_operator(CFXJSE_Value* pThis,
5183 const CFX_ByteStringC& szFuncName, 5147 const CFX_ByteStringC& szFuncName,
5184 CFXJSE_Arguments& args) { 5148 CFXJSE_Arguments& args) {
5185 if (args.GetLength() == 2) { 5149 if (args.GetLength() != 2) {
5186 if (fm_ref_equal(pThis, args)) { 5150 ToJSContext(pThis, nullptr)->ThrowException(XFA_IDS_COMPILER_ERROR);
5187 args.GetReturnValue()->SetInteger(1); 5151 return;
5188 } else { 5152 }
5189 std::unique_ptr<CFXJSE_Value> argFirst = GetSimpleValue(pThis, args, 0); 5153
5190 std::unique_ptr<CFXJSE_Value> argSecond = GetSimpleValue(pThis, args, 1); 5154 if (fm_ref_equal(pThis, args)) {
5191 if (argFirst->IsNull() || argSecond->IsNull()) { 5155 args.GetReturnValue()->SetInteger(1);
5192 args.GetReturnValue()->SetInteger( 5156 return;
5193 (argFirst->IsNull() && argSecond->IsNull()) ? 1 : 0); 5157 }
5194 } else if (argFirst->IsString() && argSecond->IsString()) { 5158
5195 CFX_ByteString firstOutput; 5159 std::unique_ptr<CFXJSE_Value> argFirst = GetSimpleValue(pThis, args, 0);
5196 CFX_ByteString secondOutput; 5160 std::unique_ptr<CFXJSE_Value> argSecond = GetSimpleValue(pThis, args, 1);
5197 argFirst->ToString(firstOutput); 5161 if (argFirst->IsNull() || argSecond->IsNull()) {
5198 argSecond->ToString(secondOutput); 5162 args.GetReturnValue()->SetInteger(
5199 args.GetReturnValue()->SetInteger(firstOutput == secondOutput); 5163 (argFirst->IsNull() && argSecond->IsNull()) ? 1 : 0);
5200 } else { 5164 return;
5201 FX_DOUBLE first = ValueToDouble(pThis, argFirst.get()); 5165 }
5202 FX_DOUBLE second = ValueToDouble(pThis, argSecond.get()); 5166
5203 args.GetReturnValue()->SetInteger((first == second) ? 1 : 0); 5167 if (argFirst->IsString() && argSecond->IsString()) {
5204 } 5168 CFX_ByteString firstOutput;
5205 } 5169 CFX_ByteString secondOutput;
5206 } else { 5170 argFirst->ToString(firstOutput);
5207 ToJSContext(pThis, nullptr)->ThrowException(XFA_IDS_COMPILER_ERROR); 5171 argSecond->ToString(secondOutput);
5208 } 5172 args.GetReturnValue()->SetInteger(firstOutput == secondOutput);
5173 return;
5174 }
5175
5176 FX_DOUBLE first = ValueToDouble(pThis, argFirst.get());
5177 FX_DOUBLE second = ValueToDouble(pThis, argSecond.get());
5178 args.GetReturnValue()->SetInteger((first == second) ? 1 : 0);
5209 } 5179 }
5210 5180
5211 // static 5181 // static
5212 void CXFA_FM2JSContext::notequality_operator(CFXJSE_Value* pThis, 5182 void CXFA_FM2JSContext::notequality_operator(CFXJSE_Value* pThis,
5213 const CFX_ByteStringC& szFuncName, 5183 const CFX_ByteStringC& szFuncName,
5214 CFXJSE_Arguments& args) { 5184 CFXJSE_Arguments& args) {
5215 if (args.GetLength() == 2) { 5185 if (args.GetLength() != 2) {
5216 if (fm_ref_equal(pThis, args)) { 5186 ToJSContext(pThis, nullptr)->ThrowException(XFA_IDS_COMPILER_ERROR);
5217 args.GetReturnValue()->SetInteger(0); 5187 return;
5218 } else { 5188 }
5219 std::unique_ptr<CFXJSE_Value> argFirst = GetSimpleValue(pThis, args, 0); 5189
5220 std::unique_ptr<CFXJSE_Value> argSecond = GetSimpleValue(pThis, args, 1); 5190 if (fm_ref_equal(pThis, args)) {
5221 if (argFirst->IsNull() || argSecond->IsNull()) { 5191 args.GetReturnValue()->SetInteger(0);
5222 args.GetReturnValue()->SetInteger( 5192 return;
5223 (argFirst->IsNull() && argSecond->IsNull()) ? 0 : 1); 5193 }
5224 } else if (argFirst->IsString() && argSecond->IsString()) { 5194
5225 CFX_ByteString firstOutput; 5195 std::unique_ptr<CFXJSE_Value> argFirst = GetSimpleValue(pThis, args, 0);
5226 CFX_ByteString secondOutput; 5196 std::unique_ptr<CFXJSE_Value> argSecond = GetSimpleValue(pThis, args, 1);
5227 argFirst->ToString(firstOutput); 5197 if (argFirst->IsNull() || argSecond->IsNull()) {
5228 argSecond->ToString(secondOutput); 5198 args.GetReturnValue()->SetInteger(
5229 args.GetReturnValue()->SetInteger(firstOutput != secondOutput); 5199 (argFirst->IsNull() && argSecond->IsNull()) ? 0 : 1);
5230 } else { 5200 return;
5231 FX_DOUBLE first = ValueToDouble(pThis, argFirst.get()); 5201 }
5232 FX_DOUBLE second = ValueToDouble(pThis, argSecond.get()); 5202
5233 args.GetReturnValue()->SetInteger(first != second); 5203 if (argFirst->IsString() && argSecond->IsString()) {
5234 } 5204 CFX_ByteString firstOutput;
5235 } 5205 CFX_ByteString secondOutput;
5236 } else { 5206 argFirst->ToString(firstOutput);
5237 ToJSContext(pThis, nullptr)->ThrowException(XFA_IDS_COMPILER_ERROR); 5207 argSecond->ToString(secondOutput);
5238 } 5208 args.GetReturnValue()->SetInteger(firstOutput != secondOutput);
5209 return;
5210 }
5211
5212 FX_DOUBLE first = ValueToDouble(pThis, argFirst.get());
5213 FX_DOUBLE second = ValueToDouble(pThis, argSecond.get());
5214 args.GetReturnValue()->SetInteger(first != second);
5239 } 5215 }
5240 5216
5241 // static 5217 // static
5242 FX_BOOL CXFA_FM2JSContext::fm_ref_equal(CFXJSE_Value* pThis, 5218 FX_BOOL CXFA_FM2JSContext::fm_ref_equal(CFXJSE_Value* pThis,
5243 CFXJSE_Arguments& args) { 5219 CFXJSE_Arguments& args) {
5244 FX_BOOL bRet = FALSE;
5245 v8::Isolate* pIsolate = ToJSContext(pThis, nullptr)->GetScriptRuntime();
5246 std::unique_ptr<CFXJSE_Value> argFirst = args.GetValue(0); 5220 std::unique_ptr<CFXJSE_Value> argFirst = args.GetValue(0);
5247 std::unique_ptr<CFXJSE_Value> argSecond = args.GetValue(1); 5221 std::unique_ptr<CFXJSE_Value> argSecond = args.GetValue(1);
5248 if (argFirst->IsArray() && argSecond->IsArray()) { 5222 if (!argFirst->IsArray() || !argSecond->IsArray())
5249 std::unique_ptr<CFXJSE_Value> firstFlagValue(new CFXJSE_Value(pIsolate)); 5223 return FALSE;
5250 std::unique_ptr<CFXJSE_Value> secondFlagValue(new CFXJSE_Value(pIsolate)); 5224
5251 argFirst->GetObjectPropertyByIdx(0, firstFlagValue.get()); 5225 v8::Isolate* pIsolate = ToJSContext(pThis, nullptr)->GetScriptRuntime();
5252 argSecond->GetObjectPropertyByIdx(0, secondFlagValue.get()); 5226 std::unique_ptr<CFXJSE_Value> firstFlagValue(new CFXJSE_Value(pIsolate));
5253 if (firstFlagValue->ToInteger() == 3 && secondFlagValue->ToInteger() == 3) { 5227 std::unique_ptr<CFXJSE_Value> secondFlagValue(new CFXJSE_Value(pIsolate));
5254 std::unique_ptr<CFXJSE_Value> firstJSObject(new CFXJSE_Value(pIsolate)); 5228 argFirst->GetObjectPropertyByIdx(0, firstFlagValue.get());
5255 std::unique_ptr<CFXJSE_Value> secondJSObject(new CFXJSE_Value(pIsolate)); 5229 argSecond->GetObjectPropertyByIdx(0, secondFlagValue.get());
5256 argFirst->GetObjectPropertyByIdx(2, firstJSObject.get()); 5230 if (firstFlagValue->ToInteger() != 3 || secondFlagValue->ToInteger() != 3)
5257 argSecond->GetObjectPropertyByIdx(2, secondJSObject.get()); 5231 return FALSE;
5258 if (!firstJSObject->IsNull() && !secondJSObject->IsNull()) { 5232
5259 bRet = (firstJSObject->ToHostObject(nullptr) == 5233 std::unique_ptr<CFXJSE_Value> firstJSObject(new CFXJSE_Value(pIsolate));
5260 secondJSObject->ToHostObject(nullptr)); 5234 std::unique_ptr<CFXJSE_Value> secondJSObject(new CFXJSE_Value(pIsolate));
5261 } 5235 argFirst->GetObjectPropertyByIdx(2, firstJSObject.get());
5262 } 5236 argSecond->GetObjectPropertyByIdx(2, secondJSObject.get());
5263 } 5237 if (firstJSObject->IsNull() || secondJSObject->IsNull())
5264 return bRet; 5238 return FALSE;
5239
5240 return (firstJSObject->ToHostObject(nullptr) ==
5241 secondJSObject->ToHostObject(nullptr));
5265 } 5242 }
5266 5243
5267 // static 5244 // static
5268 void CXFA_FM2JSContext::less_operator(CFXJSE_Value* pThis, 5245 void CXFA_FM2JSContext::less_operator(CFXJSE_Value* pThis,
5269 const CFX_ByteStringC& szFuncName, 5246 const CFX_ByteStringC& szFuncName,
5270 CFXJSE_Arguments& args) { 5247 CFXJSE_Arguments& args) {
5271 if (args.GetLength() == 2) { 5248 if (args.GetLength() != 2) {
5272 std::unique_ptr<CFXJSE_Value> argFirst = GetSimpleValue(pThis, args, 0); 5249 ToJSContext(pThis, nullptr)->ThrowException(XFA_IDS_COMPILER_ERROR);
5273 std::unique_ptr<CFXJSE_Value> argSecond = GetSimpleValue(pThis, args, 1); 5250 return;
5274 if (argFirst->IsNull() || argSecond->IsNull()) { 5251 }
5275 args.GetReturnValue()->SetInteger(0); 5252
5276 } else if (argFirst->IsString() && argSecond->IsString()) { 5253 std::unique_ptr<CFXJSE_Value> argFirst = GetSimpleValue(pThis, args, 0);
5277 CFX_ByteString firstOutput; 5254 std::unique_ptr<CFXJSE_Value> argSecond = GetSimpleValue(pThis, args, 1);
5278 CFX_ByteString secondOutput; 5255 if (argFirst->IsNull() || argSecond->IsNull()) {
5279 argFirst->ToString(firstOutput); 5256 args.GetReturnValue()->SetInteger(0);
5280 argSecond->ToString(secondOutput); 5257 return;
5281 args.GetReturnValue()->SetInteger( 5258 }
5282 firstOutput.Compare(secondOutput.AsStringC()) == -1); 5259
5283 } else { 5260 if (argFirst->IsString() && argSecond->IsString()) {
5284 FX_DOUBLE first = ValueToDouble(pThis, argFirst.get()); 5261 CFX_ByteString firstOutput;
5285 FX_DOUBLE second = ValueToDouble(pThis, argSecond.get()); 5262 CFX_ByteString secondOutput;
5286 args.GetReturnValue()->SetInteger((first < second) ? 1 : 0); 5263 argFirst->ToString(firstOutput);
5287 } 5264 argSecond->ToString(secondOutput);
5288 } else { 5265 args.GetReturnValue()->SetInteger(
5289 ToJSContext(pThis, nullptr)->ThrowException(XFA_IDS_COMPILER_ERROR); 5266 firstOutput.Compare(secondOutput.AsStringC()) == -1);
5290 } 5267 return;
5268 }
5269
5270 FX_DOUBLE first = ValueToDouble(pThis, argFirst.get());
5271 FX_DOUBLE second = ValueToDouble(pThis, argSecond.get());
5272 args.GetReturnValue()->SetInteger((first < second) ? 1 : 0);
5291 } 5273 }
5292 5274
5293 // static 5275 // static
5294 void CXFA_FM2JSContext::lessequal_operator(CFXJSE_Value* pThis, 5276 void CXFA_FM2JSContext::lessequal_operator(CFXJSE_Value* pThis,
5295 const CFX_ByteStringC& szFuncName, 5277 const CFX_ByteStringC& szFuncName,
5296 CFXJSE_Arguments& args) { 5278 CFXJSE_Arguments& args) {
5297 if (args.GetLength() == 2) { 5279 if (args.GetLength() != 2) {
5298 std::unique_ptr<CFXJSE_Value> argFirst = GetSimpleValue(pThis, args, 0); 5280 ToJSContext(pThis, nullptr)->ThrowException(XFA_IDS_COMPILER_ERROR);
5299 std::unique_ptr<CFXJSE_Value> argSecond = GetSimpleValue(pThis, args, 1); 5281 return;
5300 if (argFirst->IsNull() || argSecond->IsNull()) { 5282 }
5301 args.GetReturnValue()->SetInteger( 5283
5302 (argFirst->IsNull() && argSecond->IsNull()) ? 1 : 0); 5284 std::unique_ptr<CFXJSE_Value> argFirst = GetSimpleValue(pThis, args, 0);
5303 } else if (argFirst->IsString() && argSecond->IsString()) { 5285 std::unique_ptr<CFXJSE_Value> argSecond = GetSimpleValue(pThis, args, 1);
5304 CFX_ByteString firstOutput; 5286 if (argFirst->IsNull() || argSecond->IsNull()) {
5305 CFX_ByteString secondOutput; 5287 args.GetReturnValue()->SetInteger(
5306 argFirst->ToString(firstOutput); 5288 (argFirst->IsNull() && argSecond->IsNull()) ? 1 : 0);
5307 argSecond->ToString(secondOutput); 5289 return;
5308 args.GetReturnValue()->SetInteger( 5290 }
5309 firstOutput.Compare(secondOutput.AsStringC()) != 1); 5291
5310 } else { 5292 if (argFirst->IsString() && argSecond->IsString()) {
5311 FX_DOUBLE first = ValueToDouble(pThis, argFirst.get()); 5293 CFX_ByteString firstOutput;
5312 FX_DOUBLE second = ValueToDouble(pThis, argSecond.get()); 5294 CFX_ByteString secondOutput;
5313 args.GetReturnValue()->SetInteger((first <= second) ? 1 : 0); 5295 argFirst->ToString(firstOutput);
5314 } 5296 argSecond->ToString(secondOutput);
5315 } else { 5297 args.GetReturnValue()->SetInteger(
5316 ToJSContext(pThis, nullptr)->ThrowException(XFA_IDS_COMPILER_ERROR); 5298 firstOutput.Compare(secondOutput.AsStringC()) != 1);
5317 } 5299 return;
5300 }
5301
5302 FX_DOUBLE first = ValueToDouble(pThis, argFirst.get());
5303 FX_DOUBLE second = ValueToDouble(pThis, argSecond.get());
5304 args.GetReturnValue()->SetInteger((first <= second) ? 1 : 0);
5318 } 5305 }
5319 5306
5320 // static 5307 // static
5321 void CXFA_FM2JSContext::greater_operator(CFXJSE_Value* pThis, 5308 void CXFA_FM2JSContext::greater_operator(CFXJSE_Value* pThis,
5322 const CFX_ByteStringC& szFuncName, 5309 const CFX_ByteStringC& szFuncName,
5323 CFXJSE_Arguments& args) { 5310 CFXJSE_Arguments& args) {
5324 if (args.GetLength() == 2) { 5311 if (args.GetLength() != 2) {
5325 std::unique_ptr<CFXJSE_Value> argFirst = GetSimpleValue(pThis, args, 0); 5312 ToJSContext(pThis, nullptr)->ThrowException(XFA_IDS_COMPILER_ERROR);
5326 std::unique_ptr<CFXJSE_Value> argSecond = GetSimpleValue(pThis, args, 1); 5313 return;
5327 if (argFirst->IsNull() || argSecond->IsNull()) { 5314 }
5328 args.GetReturnValue()->SetInteger(0); 5315
5329 } else if (argFirst->IsString() && argSecond->IsString()) { 5316 std::unique_ptr<CFXJSE_Value> argFirst = GetSimpleValue(pThis, args, 0);
5330 CFX_ByteString firstOutput; 5317 std::unique_ptr<CFXJSE_Value> argSecond = GetSimpleValue(pThis, args, 1);
5331 CFX_ByteString secondOutput; 5318 if (argFirst->IsNull() || argSecond->IsNull()) {
5332 argFirst->ToString(firstOutput); 5319 args.GetReturnValue()->SetInteger(0);
5333 argSecond->ToString(secondOutput); 5320 return;
5334 args.GetReturnValue()->SetInteger( 5321 }
5335 firstOutput.Compare(secondOutput.AsStringC()) == 1); 5322
5336 } else { 5323 if (argFirst->IsString() && argSecond->IsString()) {
5337 FX_DOUBLE first = ValueToDouble(pThis, argFirst.get()); 5324 CFX_ByteString firstOutput;
5338 FX_DOUBLE second = ValueToDouble(pThis, argSecond.get()); 5325 CFX_ByteString secondOutput;
5339 args.GetReturnValue()->SetInteger((first > second) ? 1 : 0); 5326 argFirst->ToString(firstOutput);
5340 } 5327 argSecond->ToString(secondOutput);
5341 } else { 5328 args.GetReturnValue()->SetInteger(
5342 ToJSContext(pThis, nullptr)->ThrowException(XFA_IDS_COMPILER_ERROR); 5329 firstOutput.Compare(secondOutput.AsStringC()) == 1);
5343 } 5330 return;
5331 }
5332
5333 FX_DOUBLE first = ValueToDouble(pThis, argFirst.get());
5334 FX_DOUBLE second = ValueToDouble(pThis, argSecond.get());
5335 args.GetReturnValue()->SetInteger((first > second) ? 1 : 0);
5344 } 5336 }
5345 5337
5346 // static 5338 // static
5347 void CXFA_FM2JSContext::greaterequal_operator(CFXJSE_Value* pThis, 5339 void CXFA_FM2JSContext::greaterequal_operator(CFXJSE_Value* pThis,
5348 const CFX_ByteStringC& szFuncName, 5340 const CFX_ByteStringC& szFuncName,
5349 CFXJSE_Arguments& args) { 5341 CFXJSE_Arguments& args) {
5350 if (args.GetLength() == 2) { 5342 if (args.GetLength() != 2) {
5351 std::unique_ptr<CFXJSE_Value> argFirst = GetSimpleValue(pThis, args, 0); 5343 ToJSContext(pThis, nullptr)->ThrowException(XFA_IDS_COMPILER_ERROR);
5352 std::unique_ptr<CFXJSE_Value> argSecond = GetSimpleValue(pThis, args, 1); 5344 return;
5353 if (argFirst->IsNull() || argSecond->IsNull()) { 5345 }
5354 args.GetReturnValue()->SetInteger( 5346
5355 (argFirst->IsNull() && argSecond->IsNull()) ? 1 : 0); 5347 std::unique_ptr<CFXJSE_Value> argFirst = GetSimpleValue(pThis, args, 0);
5356 } else if (argFirst->IsString() && argSecond->IsString()) { 5348 std::unique_ptr<CFXJSE_Value> argSecond = GetSimpleValue(pThis, args, 1);
5357 CFX_ByteString firstOutput; 5349 if (argFirst->IsNull() || argSecond->IsNull()) {
5358 CFX_ByteString secondOutput; 5350 args.GetReturnValue()->SetInteger(
5359 argFirst->ToString(firstOutput); 5351 (argFirst->IsNull() && argSecond->IsNull()) ? 1 : 0);
5360 argSecond->ToString(secondOutput); 5352 return;
5361 args.GetReturnValue()->SetInteger( 5353 }
5362 firstOutput.Compare(secondOutput.AsStringC()) != -1); 5354
5363 } else { 5355 if (argFirst->IsString() && argSecond->IsString()) {
5364 FX_DOUBLE first = ValueToDouble(pThis, argFirst.get()); 5356 CFX_ByteString firstOutput;
5365 FX_DOUBLE second = ValueToDouble(pThis, argSecond.get()); 5357 CFX_ByteString secondOutput;
5366 args.GetReturnValue()->SetInteger((first >= second) ? 1 : 0); 5358 argFirst->ToString(firstOutput);
5367 } 5359 argSecond->ToString(secondOutput);
5368 } else { 5360 args.GetReturnValue()->SetInteger(
5369 ToJSContext(pThis, nullptr)->ThrowException(XFA_IDS_COMPILER_ERROR); 5361 firstOutput.Compare(secondOutput.AsStringC()) != -1);
5370 } 5362 return;
5363 }
5364
5365 FX_DOUBLE first = ValueToDouble(pThis, argFirst.get());
5366 FX_DOUBLE second = ValueToDouble(pThis, argSecond.get());
5367 args.GetReturnValue()->SetInteger((first >= second) ? 1 : 0);
5371 } 5368 }
5372 5369
5373 // static 5370 // static
5374 void CXFA_FM2JSContext::plus_operator(CFXJSE_Value* pThis, 5371 void CXFA_FM2JSContext::plus_operator(CFXJSE_Value* pThis,
5375 const CFX_ByteStringC& szFuncName, 5372 const CFX_ByteStringC& szFuncName,
5376 CFXJSE_Arguments& args) { 5373 CFXJSE_Arguments& args) {
5377 if (args.GetLength() == 2) { 5374 if (args.GetLength() != 2) {
5378 std::unique_ptr<CFXJSE_Value> argFirst = args.GetValue(0); 5375 ToJSContext(pThis, nullptr)->ThrowException(XFA_IDS_COMPILER_ERROR);
5379 std::unique_ptr<CFXJSE_Value> argSecond = args.GetValue(1); 5376 return;
5380 if (ValueIsNull(pThis, argFirst.get()) && 5377 }
5381 ValueIsNull(pThis, argSecond.get())) { 5378
5382 args.GetReturnValue()->SetNull(); 5379 std::unique_ptr<CFXJSE_Value> argFirst = args.GetValue(0);
5383 } else { 5380 std::unique_ptr<CFXJSE_Value> argSecond = args.GetValue(1);
5384 FX_DOUBLE first = ValueToDouble(pThis, argFirst.get()); 5381 if (ValueIsNull(pThis, argFirst.get()) &&
5385 FX_DOUBLE second = ValueToDouble(pThis, argSecond.get()); 5382 ValueIsNull(pThis, argSecond.get())) {
5386 args.GetReturnValue()->SetDouble(first + second); 5383 args.GetReturnValue()->SetNull();
5387 } 5384 return;
5388 } else { 5385 }
5389 ToJSContext(pThis, nullptr)->ThrowException(XFA_IDS_COMPILER_ERROR); 5386
5390 } 5387 FX_DOUBLE first = ValueToDouble(pThis, argFirst.get());
5388 FX_DOUBLE second = ValueToDouble(pThis, argSecond.get());
5389 args.GetReturnValue()->SetDouble(first + second);
5391 } 5390 }
5392 5391
5393 // static 5392 // static
5394 void CXFA_FM2JSContext::minus_operator(CFXJSE_Value* pThis, 5393 void CXFA_FM2JSContext::minus_operator(CFXJSE_Value* pThis,
5395 const CFX_ByteStringC& szFuncName, 5394 const CFX_ByteStringC& szFuncName,
5396 CFXJSE_Arguments& args) { 5395 CFXJSE_Arguments& args) {
5397 if (args.GetLength() == 2) { 5396 if (args.GetLength() != 2) {
5398 std::unique_ptr<CFXJSE_Value> argFirst = GetSimpleValue(pThis, args, 0); 5397 ToJSContext(pThis, nullptr)->ThrowException(XFA_IDS_COMPILER_ERROR);
5399 std::unique_ptr<CFXJSE_Value> argSecond = GetSimpleValue(pThis, args, 1); 5398 return;
5400 if (argFirst->IsNull() && argSecond->IsNull()) { 5399 }
5401 args.GetReturnValue()->SetNull(); 5400
5402 } else { 5401 std::unique_ptr<CFXJSE_Value> argFirst = GetSimpleValue(pThis, args, 0);
5403 FX_DOUBLE first = ValueToDouble(pThis, argFirst.get()); 5402 std::unique_ptr<CFXJSE_Value> argSecond = GetSimpleValue(pThis, args, 1);
5404 FX_DOUBLE second = ValueToDouble(pThis, argSecond.get()); 5403 if (argFirst->IsNull() && argSecond->IsNull()) {
5405 args.GetReturnValue()->SetDouble(first - second); 5404 args.GetReturnValue()->SetNull();
5406 } 5405 return;
5407 } else { 5406 }
5408 ToJSContext(pThis, nullptr)->ThrowException(XFA_IDS_COMPILER_ERROR); 5407
5409 } 5408 FX_DOUBLE first = ValueToDouble(pThis, argFirst.get());
5409 FX_DOUBLE second = ValueToDouble(pThis, argSecond.get());
5410 args.GetReturnValue()->SetDouble(first - second);
5410 } 5411 }
5411 5412
5412 // static 5413 // static
5413 void CXFA_FM2JSContext::multiple_operator(CFXJSE_Value* pThis, 5414 void CXFA_FM2JSContext::multiple_operator(CFXJSE_Value* pThis,
5414 const CFX_ByteStringC& szFuncName, 5415 const CFX_ByteStringC& szFuncName,
5415 CFXJSE_Arguments& args) { 5416 CFXJSE_Arguments& args) {
5416 if (args.GetLength() == 2) { 5417 if (args.GetLength() != 2) {
5417 std::unique_ptr<CFXJSE_Value> argFirst = GetSimpleValue(pThis, args, 0); 5418 ToJSContext(pThis, nullptr)->ThrowException(XFA_IDS_COMPILER_ERROR);
5418 std::unique_ptr<CFXJSE_Value> argSecond = GetSimpleValue(pThis, args, 1); 5419 return;
5419 if (argFirst->IsNull() && argSecond->IsNull()) { 5420 }
5420 args.GetReturnValue()->SetNull(); 5421
5421 } else { 5422 std::unique_ptr<CFXJSE_Value> argFirst = GetSimpleValue(pThis, args, 0);
5422 FX_DOUBLE first = ValueToDouble(pThis, argFirst.get()); 5423 std::unique_ptr<CFXJSE_Value> argSecond = GetSimpleValue(pThis, args, 1);
5423 FX_DOUBLE second = ValueToDouble(pThis, argSecond.get()); 5424 if (argFirst->IsNull() && argSecond->IsNull()) {
5424 args.GetReturnValue()->SetDouble(first * second); 5425 args.GetReturnValue()->SetNull();
5425 } 5426 return;
5426 } else { 5427 }
5427 ToJSContext(pThis, nullptr)->ThrowException(XFA_IDS_COMPILER_ERROR); 5428
5428 } 5429 FX_DOUBLE first = ValueToDouble(pThis, argFirst.get());
5429 } 5430 FX_DOUBLE second = ValueToDouble(pThis, argSecond.get());
5430 5431 args.GetReturnValue()->SetDouble(first * second);
5431 // static 5432 }
5433
5434 // static
5432 void CXFA_FM2JSContext::divide_operator(CFXJSE_Value* pThis, 5435 void CXFA_FM2JSContext::divide_operator(CFXJSE_Value* pThis,
5433 const CFX_ByteStringC& szFuncName, 5436 const CFX_ByteStringC& szFuncName,
5434 CFXJSE_Arguments& args) { 5437 CFXJSE_Arguments& args) {
5435 CXFA_FM2JSContext* pContext = ToJSContext(pThis, nullptr); 5438 CXFA_FM2JSContext* pContext = ToJSContext(pThis, nullptr);
5436 if (args.GetLength() == 2) { 5439 if (args.GetLength() != 2) {
5437 std::unique_ptr<CFXJSE_Value> argFirst = GetSimpleValue(pThis, args, 0);
5438 std::unique_ptr<CFXJSE_Value> argSecond = GetSimpleValue(pThis, args, 1);
5439 if (argFirst->IsNull() && argSecond->IsNull()) {
5440 args.GetReturnValue()->SetNull();
5441 } else {
5442 FX_DOUBLE first = ValueToDouble(pThis, argFirst.get());
5443 FX_DOUBLE second = ValueToDouble(pThis, argSecond.get());
5444 if (second == 0.0) {
5445 pContext->ThrowException(XFA_IDS_DIVIDE_ZERO);
5446 } else {
5447 args.GetReturnValue()->SetDouble(first / second);
5448 }
5449 }
5450 } else {
5451 pContext->ThrowException(XFA_IDS_COMPILER_ERROR); 5440 pContext->ThrowException(XFA_IDS_COMPILER_ERROR);
5441 return;
5452 } 5442 }
5443
5444 std::unique_ptr<CFXJSE_Value> argFirst = GetSimpleValue(pThis, args, 0);
5445 std::unique_ptr<CFXJSE_Value> argSecond = GetSimpleValue(pThis, args, 1);
5446 if (argFirst->IsNull() && argSecond->IsNull()) {
5447 args.GetReturnValue()->SetNull();
5448 return;
5449 }
5450
5451 FX_DOUBLE second = ValueToDouble(pThis, argSecond.get());
5452 if (second == 0.0) {
5453 pContext->ThrowException(XFA_IDS_DIVIDE_ZERO);
5454 return;
5455 }
5456
5457 FX_DOUBLE first = ValueToDouble(pThis, argFirst.get());
5458 args.GetReturnValue()->SetDouble(first / second);
5453 } 5459 }
5454 5460
5455 // static 5461 // static
5456 void CXFA_FM2JSContext::positive_operator(CFXJSE_Value* pThis, 5462 void CXFA_FM2JSContext::positive_operator(CFXJSE_Value* pThis,
5457 const CFX_ByteStringC& szFuncName, 5463 const CFX_ByteStringC& szFuncName,
5458 CFXJSE_Arguments& args) { 5464 CFXJSE_Arguments& args) {
5459 if (args.GetLength() == 1) { 5465 if (args.GetLength() != 1) {
5460 std::unique_ptr<CFXJSE_Value> argOne = GetSimpleValue(pThis, args, 0);
5461 if (argOne->IsNull()) {
5462 args.GetReturnValue()->SetNull();
5463 } else {
5464 args.GetReturnValue()->SetDouble(0.0 +
5465 ValueToDouble(pThis, argOne.get()));
5466 }
5467 } else {
5468 ToJSContext(pThis, nullptr)->ThrowException(XFA_IDS_COMPILER_ERROR); 5466 ToJSContext(pThis, nullptr)->ThrowException(XFA_IDS_COMPILER_ERROR);
5467 return;
5469 } 5468 }
5469
5470 std::unique_ptr<CFXJSE_Value> argOne = GetSimpleValue(pThis, args, 0);
5471 if (argOne->IsNull()) {
5472 args.GetReturnValue()->SetNull();
5473 return;
5474 }
5475 args.GetReturnValue()->SetDouble(0.0 + ValueToDouble(pThis, argOne.get()));
5470 } 5476 }
5471 5477
5472 // static 5478 // static
5473 void CXFA_FM2JSContext::negative_operator(CFXJSE_Value* pThis, 5479 void CXFA_FM2JSContext::negative_operator(CFXJSE_Value* pThis,
5474 const CFX_ByteStringC& szFuncName, 5480 const CFX_ByteStringC& szFuncName,
5475 CFXJSE_Arguments& args) { 5481 CFXJSE_Arguments& args) {
5476 if (args.GetLength() == 1) { 5482 if (args.GetLength() != 1) {
5477 std::unique_ptr<CFXJSE_Value> argOne = GetSimpleValue(pThis, args, 0);
5478 if (argOne->IsNull()) {
5479 args.GetReturnValue()->SetNull();
5480 } else {
5481 args.GetReturnValue()->SetDouble(0.0 -
5482 ValueToDouble(pThis, argOne.get()));
5483 }
5484 } else {
5485 ToJSContext(pThis, nullptr)->ThrowException(XFA_IDS_COMPILER_ERROR); 5483 ToJSContext(pThis, nullptr)->ThrowException(XFA_IDS_COMPILER_ERROR);
5484 return;
5486 } 5485 }
5486
5487 std::unique_ptr<CFXJSE_Value> argOne = GetSimpleValue(pThis, args, 0);
5488 if (argOne->IsNull()) {
5489 args.GetReturnValue()->SetNull();
5490 return;
5491 }
5492 args.GetReturnValue()->SetDouble(0.0 - ValueToDouble(pThis, argOne.get()));
5487 } 5493 }
5488 5494
5489 // static 5495 // static
5490 void CXFA_FM2JSContext::logical_not_operator(CFXJSE_Value* pThis, 5496 void CXFA_FM2JSContext::logical_not_operator(CFXJSE_Value* pThis,
5491 const CFX_ByteStringC& szFuncName, 5497 const CFX_ByteStringC& szFuncName,
5492 CFXJSE_Arguments& args) { 5498 CFXJSE_Arguments& args) {
5493 if (args.GetLength() == 1) { 5499 if (args.GetLength() != 1) {
5494 std::unique_ptr<CFXJSE_Value> argOne = GetSimpleValue(pThis, args, 0);
5495 if (argOne->IsNull()) {
5496 args.GetReturnValue()->SetNull();
5497 } else {
5498 FX_DOUBLE first = ValueToDouble(pThis, argOne.get());
5499 args.GetReturnValue()->SetInteger((first == 0.0) ? 1 : 0);
5500 }
5501 } else {
5502 ToJSContext(pThis, nullptr)->ThrowException(XFA_IDS_COMPILER_ERROR); 5500 ToJSContext(pThis, nullptr)->ThrowException(XFA_IDS_COMPILER_ERROR);
5501 return;
5503 } 5502 }
5503
5504 std::unique_ptr<CFXJSE_Value> argOne = GetSimpleValue(pThis, args, 0);
5505 if (argOne->IsNull()) {
5506 args.GetReturnValue()->SetNull();
5507 return;
5508 }
5509
5510 FX_DOUBLE first = ValueToDouble(pThis, argOne.get());
5511 args.GetReturnValue()->SetInteger((first == 0.0) ? 1 : 0);
5504 } 5512 }
5505 5513
5506 // static 5514 // static
5507 void CXFA_FM2JSContext::dot_accessor(CFXJSE_Value* pThis, 5515 void CXFA_FM2JSContext::dot_accessor(CFXJSE_Value* pThis,
5508 const CFX_ByteStringC& szFuncName, 5516 const CFX_ByteStringC& szFuncName,
5509 CFXJSE_Arguments& args) { 5517 CFXJSE_Arguments& args) {
5510 CXFA_FM2JSContext* pContext = ToJSContext(pThis, nullptr); 5518 CXFA_FM2JSContext* pContext = ToJSContext(pThis, nullptr);
5511 v8::Isolate* pIsolate = pContext->GetScriptRuntime(); 5519 v8::Isolate* pIsolate = pContext->GetScriptRuntime();
5512 int32_t argc = args.GetLength(); 5520 int32_t argc = args.GetLength();
5513 if ((argc == 4) || (argc == 5)) { 5521 if ((argc == 4) || (argc == 5)) {
(...skipping 1056 matching lines...) Expand 10 before | Expand all | Expand 10 after
6570 CFX_WideString wsFormat; 6578 CFX_WideString wsFormat;
6571 pAppProvider->LoadString(iStringID, wsFormat); 6579 pAppProvider->LoadString(iStringID, wsFormat);
6572 CFX_WideString wsMessage; 6580 CFX_WideString wsMessage;
6573 va_list arg_ptr; 6581 va_list arg_ptr;
6574 va_start(arg_ptr, iStringID); 6582 va_start(arg_ptr, iStringID);
6575 wsMessage.FormatV(wsFormat.c_str(), arg_ptr); 6583 wsMessage.FormatV(wsFormat.c_str(), arg_ptr);
6576 va_end(arg_ptr); 6584 va_end(arg_ptr);
6577 FXJSE_ThrowMessage( 6585 FXJSE_ThrowMessage(
6578 FX_UTF8Encode(wsMessage.c_str(), wsMessage.GetLength()).AsStringC()); 6586 FX_UTF8Encode(wsMessage.c_str(), wsMessage.GetLength()).AsStringC());
6579 } 6587 }
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698