| Index: xfa/fxfa/fm2js/xfa_fm2jscontext.cpp
|
| diff --git a/xfa/fxfa/fm2js/xfa_fm2jscontext.cpp b/xfa/fxfa/fm2js/xfa_fm2jscontext.cpp
|
| index 7ad252f8056a0ab34b258dcdd7eb678413446559..0ad2635c64f0ba87aff95590b2a30d25b11200de 100644
|
| --- a/xfa/fxfa/fm2js/xfa_fm2jscontext.cpp
|
| +++ b/xfa/fxfa/fm2js/xfa_fm2jscontext.cpp
|
| @@ -2396,62 +2396,53 @@ void CXFA_FM2JSContext::Apr(CFXJSE_Value* pThis,
|
| const CFX_ByteStringC& szFuncName,
|
| CFXJSE_Arguments& args) {
|
| CXFA_FM2JSContext* pContext = ToJSContext(pThis, nullptr);
|
| - if (args.GetLength() == 3) {
|
| - FX_BOOL bFlags = FALSE;
|
| - FX_DOUBLE nPrincipal = 0;
|
| - FX_DOUBLE nPayment = 0;
|
| - FX_DOUBLE nPeriods = 0;
|
| - std::unique_ptr<CFXJSE_Value> argOne = GetSimpleValue(pThis, args, 0);
|
| - std::unique_ptr<CFXJSE_Value> argTwo = GetSimpleValue(pThis, args, 1);
|
| - std::unique_ptr<CFXJSE_Value> argThree = GetSimpleValue(pThis, args, 2);
|
| - bFlags =
|
| - (ValueIsNull(pThis, argOne.get()) || ValueIsNull(pThis, argTwo.get()) ||
|
| - ValueIsNull(pThis, argThree.get()));
|
| - if (bFlags) {
|
| + if (args.GetLength() != 3) {
|
| + pContext->ThrowException(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"Apr");
|
| + return;
|
| + }
|
| +
|
| + std::unique_ptr<CFXJSE_Value> argOne = GetSimpleValue(pThis, args, 0);
|
| + std::unique_ptr<CFXJSE_Value> argTwo = GetSimpleValue(pThis, args, 1);
|
| + std::unique_ptr<CFXJSE_Value> argThree = GetSimpleValue(pThis, args, 2);
|
| + if (ValueIsNull(pThis, argOne.get()) || ValueIsNull(pThis, argTwo.get()) ||
|
| + ValueIsNull(pThis, argThree.get())) {
|
| + FXJSE_Value_SetNull(args.GetReturnValue());
|
| + return;
|
| + }
|
| +
|
| + FX_DOUBLE nPrincipal = ValueToDouble(pThis, argOne.get());
|
| + FX_DOUBLE nPayment = ValueToDouble(pThis, argTwo.get());
|
| + FX_DOUBLE nPeriods = ValueToDouble(pThis, argThree.get());
|
| + if (nPrincipal <= 0 || nPayment <= 0 || nPeriods <= 0) {
|
| + pContext->ThrowException(XFA_IDS_ARGUMENT_MISMATCH);
|
| + return;
|
| + }
|
| +
|
| + FX_DOUBLE r =
|
| + 2 * (nPeriods * nPayment - nPrincipal) / (nPeriods * nPrincipal);
|
| + FX_DOUBLE nTemp = 1;
|
| + for (int32_t i = 0; i < nPeriods; ++i)
|
| + nTemp *= (1 + r);
|
| +
|
| + FX_DOUBLE nRet = r * nTemp / (nTemp - 1) - nPayment / nPrincipal;
|
| + while (fabs(nRet) > kFinancialPrecision) {
|
| + FX_DOUBLE nDerivative =
|
| + ((nTemp + r * nPeriods * (nTemp / (1 + r))) * (nTemp - 1) -
|
| + (r * nTemp * nPeriods * (nTemp / (1 + r)))) /
|
| + ((nTemp - 1) * (nTemp - 1));
|
| + if (nDerivative == 0) {
|
| FXJSE_Value_SetNull(args.GetReturnValue());
|
| - } else {
|
| - nPrincipal = ValueToDouble(pThis, argOne.get());
|
| - nPayment = ValueToDouble(pThis, argTwo.get());
|
| - nPeriods = ValueToDouble(pThis, argThree.get());
|
| - bFlags = ((nPrincipal <= 0) || (nPayment <= 0) || (nPeriods <= 0));
|
| - if (bFlags) {
|
| - pContext->ThrowException(XFA_IDS_ARGUMENT_MISMATCH);
|
| - } else {
|
| - FX_DOUBLE r =
|
| - 2 * (nPeriods * nPayment - nPrincipal) / (nPeriods * nPrincipal);
|
| - FX_DOUBLE nTemp = 1;
|
| - for (int32_t i = 0; i < nPeriods; ++i) {
|
| - nTemp *= (1 + r);
|
| - }
|
| - FX_DOUBLE nRet = r * nTemp / (nTemp - 1) - nPayment / nPrincipal;
|
| - while (fabs(nRet) > kFinancialPrecision && !bFlags) {
|
| - FX_DOUBLE nDerivative = 0;
|
| - nDerivative =
|
| - ((nTemp + r * nPeriods * (nTemp / (1 + r))) * (nTemp - 1) -
|
| - (r * nTemp * nPeriods * (nTemp / (1 + r)))) /
|
| - ((nTemp - 1) * (nTemp - 1));
|
| - if (nDerivative == 0) {
|
| - bFlags = TRUE;
|
| - continue;
|
| - }
|
| - r = r - nRet / nDerivative;
|
| - nTemp = 1;
|
| - for (int32_t i = 0; i < nPeriods; ++i) {
|
| - nTemp *= (1 + r);
|
| - }
|
| - nRet = r * nTemp / (nTemp - 1) - nPayment / nPrincipal;
|
| - }
|
| - if (bFlags) {
|
| - FXJSE_Value_SetNull(args.GetReturnValue());
|
| - } else {
|
| - r = r * 12;
|
| - FXJSE_Value_SetDouble(args.GetReturnValue(), r);
|
| - }
|
| - }
|
| + return;
|
| }
|
| - } else {
|
| - pContext->ThrowException(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"Apr");
|
| +
|
| + r = r - nRet / nDerivative;
|
| + nTemp = 1;
|
| + for (int32_t i = 0; i < nPeriods; ++i) {
|
| + nTemp *= (1 + r);
|
| + }
|
| + nRet = r * nTemp / (nTemp - 1) - nPayment / nPrincipal;
|
| }
|
| + FXJSE_Value_SetDouble(args.GetReturnValue(), r * 12);
|
| }
|
|
|
| // static
|
| @@ -2459,35 +2450,31 @@ void CXFA_FM2JSContext::CTerm(CFXJSE_Value* pThis,
|
| const CFX_ByteStringC& szFuncName,
|
| CFXJSE_Arguments& args) {
|
| CXFA_FM2JSContext* pContext = ToJSContext(pThis, nullptr);
|
| - if (args.GetLength() == 3) {
|
| - FX_BOOL bFlags = FALSE;
|
| - FX_FLOAT nRate = 0;
|
| - FX_FLOAT nFutureValue = 0;
|
| - FX_FLOAT nInitAmount = 0;
|
| - std::unique_ptr<CFXJSE_Value> argOne = GetSimpleValue(pThis, args, 0);
|
| - std::unique_ptr<CFXJSE_Value> argTwo = GetSimpleValue(pThis, args, 1);
|
| - std::unique_ptr<CFXJSE_Value> argThree = GetSimpleValue(pThis, args, 2);
|
| - bFlags =
|
| - (ValueIsNull(pThis, argOne.get()) || ValueIsNull(pThis, argTwo.get()) ||
|
| - ValueIsNull(pThis, argThree.get()));
|
| - if (bFlags) {
|
| - FXJSE_Value_SetNull(args.GetReturnValue());
|
| - } else {
|
| - nRate = ValueToFloat(pThis, argOne.get());
|
| - nFutureValue = ValueToFloat(pThis, argTwo.get());
|
| - nInitAmount = ValueToFloat(pThis, argThree.get());
|
| - bFlags = ((nRate <= 0) || (nFutureValue <= 0) || (nInitAmount <= 0));
|
| - if (bFlags) {
|
| - pContext->ThrowException(XFA_IDS_ARGUMENT_MISMATCH);
|
| - } else {
|
| - FXJSE_Value_SetFloat(args.GetReturnValue(),
|
| - FXSYS_log((FX_FLOAT)(nFutureValue / nInitAmount)) /
|
| - FXSYS_log((FX_FLOAT)(1 + nRate)));
|
| - }
|
| - }
|
| - } else {
|
| + if (args.GetLength() != 3) {
|
| pContext->ThrowException(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"CTerm");
|
| + return;
|
| + }
|
| +
|
| + std::unique_ptr<CFXJSE_Value> argOne = GetSimpleValue(pThis, args, 0);
|
| + std::unique_ptr<CFXJSE_Value> argTwo = GetSimpleValue(pThis, args, 1);
|
| + std::unique_ptr<CFXJSE_Value> argThree = GetSimpleValue(pThis, args, 2);
|
| + if (ValueIsNull(pThis, argOne.get()) || ValueIsNull(pThis, argTwo.get()) ||
|
| + ValueIsNull(pThis, argThree.get())) {
|
| + FXJSE_Value_SetNull(args.GetReturnValue());
|
| + return;
|
| }
|
| +
|
| + FX_FLOAT nRate = ValueToFloat(pThis, argOne.get());
|
| + FX_FLOAT nFutureValue = ValueToFloat(pThis, argTwo.get());
|
| + FX_FLOAT nInitAmount = ValueToFloat(pThis, argThree.get());
|
| + if ((nRate <= 0) || (nFutureValue <= 0) || (nInitAmount <= 0)) {
|
| + pContext->ThrowException(XFA_IDS_ARGUMENT_MISMATCH);
|
| + return;
|
| + }
|
| +
|
| + FXJSE_Value_SetFloat(args.GetReturnValue(),
|
| + FXSYS_log((FX_FLOAT)(nFutureValue / nInitAmount)) /
|
| + FXSYS_log((FX_FLOAT)(1 + nRate)));
|
| }
|
|
|
| // static
|
| @@ -2495,43 +2482,40 @@ void CXFA_FM2JSContext::FV(CFXJSE_Value* pThis,
|
| const CFX_ByteStringC& szFuncName,
|
| CFXJSE_Arguments& args) {
|
| CXFA_FM2JSContext* pContext = ToJSContext(pThis, nullptr);
|
| - if (args.GetLength() == 3) {
|
| - FX_BOOL bFlags = FALSE;
|
| - FX_DOUBLE nAmount = 0;
|
| - FX_DOUBLE nRate = 0;
|
| - FX_DOUBLE nPeriod = 0;
|
| - std::unique_ptr<CFXJSE_Value> argOne = GetSimpleValue(pThis, args, 0);
|
| - std::unique_ptr<CFXJSE_Value> argTwo = GetSimpleValue(pThis, args, 1);
|
| - std::unique_ptr<CFXJSE_Value> argThree = GetSimpleValue(pThis, args, 2);
|
| - bFlags =
|
| - (ValueIsNull(pThis, argOne.get()) || ValueIsNull(pThis, argTwo.get()) ||
|
| - ValueIsNull(pThis, argThree.get()));
|
| - if (bFlags) {
|
| - FXJSE_Value_SetNull(args.GetReturnValue());
|
| - } else {
|
| - nAmount = ValueToDouble(pThis, argOne.get());
|
| - nRate = ValueToDouble(pThis, argTwo.get());
|
| - nPeriod = ValueToDouble(pThis, argThree.get());
|
| - bFlags = ((nRate < 0) || (nPeriod <= 0) || (nAmount <= 0));
|
| - if (bFlags) {
|
| - pContext->ThrowException(XFA_IDS_ARGUMENT_MISMATCH);
|
| - } else {
|
| - FX_DOUBLE dResult = 0;
|
| - if (!nRate) {
|
| - dResult = nAmount * nPeriod;
|
| - } else {
|
| - FX_DOUBLE nTemp = 1;
|
| - for (int i = 0; i < nPeriod; ++i) {
|
| - nTemp *= 1 + nRate;
|
| - }
|
| - dResult = nAmount * (nTemp - 1) / nRate;
|
| - }
|
| - FXJSE_Value_SetDouble(args.GetReturnValue(), dResult);
|
| - }
|
| + if (args.GetLength() != 3) {
|
| + pContext->ThrowException(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"FV");
|
| + return;
|
| + }
|
| +
|
| + std::unique_ptr<CFXJSE_Value> argOne = GetSimpleValue(pThis, args, 0);
|
| + std::unique_ptr<CFXJSE_Value> argTwo = GetSimpleValue(pThis, args, 1);
|
| + std::unique_ptr<CFXJSE_Value> argThree = GetSimpleValue(pThis, args, 2);
|
| + if (ValueIsNull(pThis, argOne.get()) || ValueIsNull(pThis, argTwo.get()) ||
|
| + ValueIsNull(pThis, argThree.get())) {
|
| + FXJSE_Value_SetNull(args.GetReturnValue());
|
| + return;
|
| + }
|
| +
|
| + FX_DOUBLE nAmount = ValueToDouble(pThis, argOne.get());
|
| + FX_DOUBLE nRate = ValueToDouble(pThis, argTwo.get());
|
| + FX_DOUBLE nPeriod = ValueToDouble(pThis, argThree.get());
|
| + if ((nRate < 0) || (nPeriod <= 0) || (nAmount <= 0)) {
|
| + pContext->ThrowException(XFA_IDS_ARGUMENT_MISMATCH);
|
| + return;
|
| + }
|
| +
|
| + FX_DOUBLE dResult = 0;
|
| + if (nRate) {
|
| + FX_DOUBLE nTemp = 1;
|
| + for (int i = 0; i < nPeriod; ++i) {
|
| + nTemp *= 1 + nRate;
|
| }
|
| + dResult = nAmount * (nTemp - 1) / nRate;
|
| } else {
|
| - pContext->ThrowException(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"FV");
|
| + dResult = nAmount * nPeriod;
|
| }
|
| +
|
| + FXJSE_Value_SetDouble(args.GetReturnValue(), dResult);
|
| }
|
|
|
| // static
|
| @@ -2539,69 +2523,56 @@ void CXFA_FM2JSContext::IPmt(CFXJSE_Value* pThis,
|
| const CFX_ByteStringC& szFuncName,
|
| CFXJSE_Arguments& args) {
|
| CXFA_FM2JSContext* pContext = ToJSContext(pThis, nullptr);
|
| - if (args.GetLength() == 5) {
|
| - FX_BOOL bFlags = FALSE;
|
| - FX_FLOAT nPrincpalAmount = 0;
|
| - FX_FLOAT nRate = 0;
|
| - FX_FLOAT nPayment = 0;
|
| - FX_FLOAT nFirstMonth = 0;
|
| - FX_FLOAT nNumberOfMonths = 0;
|
| - std::unique_ptr<CFXJSE_Value> argOne = GetSimpleValue(pThis, args, 0);
|
| - std::unique_ptr<CFXJSE_Value> argTwo = GetSimpleValue(pThis, args, 1);
|
| - std::unique_ptr<CFXJSE_Value> argThree = GetSimpleValue(pThis, args, 2);
|
| - std::unique_ptr<CFXJSE_Value> argFour = GetSimpleValue(pThis, args, 3);
|
| - std::unique_ptr<CFXJSE_Value> argFive = GetSimpleValue(pThis, args, 4);
|
| - bFlags =
|
| - (ValueIsNull(pThis, argOne.get()) || ValueIsNull(pThis, argTwo.get()) ||
|
| - ValueIsNull(pThis, argThree.get()) ||
|
| - ValueIsNull(pThis, argFour.get()) ||
|
| - ValueIsNull(pThis, argFive.get()));
|
| - if (bFlags) {
|
| - FXJSE_Value_SetNull(args.GetReturnValue());
|
| - } else {
|
| - nPrincpalAmount = ValueToFloat(pThis, argOne.get());
|
| - nRate = ValueToFloat(pThis, argTwo.get());
|
| - nPayment = ValueToFloat(pThis, argThree.get());
|
| - nFirstMonth = ValueToFloat(pThis, argFour.get());
|
| - nNumberOfMonths = ValueToFloat(pThis, argFive.get());
|
| - bFlags = ((nPrincpalAmount <= 0) || (nRate <= 0) || (nPayment <= 0) ||
|
| - (nFirstMonth < 0) || (nNumberOfMonths < 0));
|
| - if (bFlags) {
|
| - pContext->ThrowException(XFA_IDS_ARGUMENT_MISMATCH);
|
| - } else {
|
| - FX_FLOAT fResult = 0;
|
| - FX_FLOAT nRateOfMonth = nRate / 12;
|
| - int32_t iNums =
|
| - (int32_t)((FXSYS_log10((FX_FLOAT)(nPayment / nPrincpalAmount)) -
|
| - FXSYS_log10((FX_FLOAT)(nPayment / nPrincpalAmount -
|
| - nRateOfMonth))) /
|
| - FXSYS_log10((FX_FLOAT)(1 + nRateOfMonth)));
|
| - int32_t iEnd = (int32_t)(nFirstMonth + nNumberOfMonths - 1);
|
| - if (iEnd > iNums) {
|
| - iEnd = iNums;
|
| - }
|
| - FX_FLOAT nSum = 0;
|
| - if (nPayment < nPrincpalAmount * nRateOfMonth) {
|
| - bFlags = TRUE;
|
| - fResult = 0;
|
| - }
|
| - if (!bFlags) {
|
| - int32_t i = 0;
|
| - for (i = 0; i < nFirstMonth - 1; ++i) {
|
| - nPrincpalAmount -= nPayment - nPrincpalAmount * nRateOfMonth;
|
| - }
|
| - for (; i < iEnd; ++i) {
|
| - nSum += nPrincpalAmount * nRateOfMonth;
|
| - nPrincpalAmount -= nPayment - nPrincpalAmount * nRateOfMonth;
|
| - }
|
| - fResult = nSum;
|
| - }
|
| - FXJSE_Value_SetFloat(args.GetReturnValue(), fResult);
|
| - }
|
| - }
|
| - } else {
|
| + if (args.GetLength() != 5) {
|
| pContext->ThrowException(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"IPmt");
|
| + return;
|
| + }
|
| +
|
| + std::unique_ptr<CFXJSE_Value> argOne = GetSimpleValue(pThis, args, 0);
|
| + std::unique_ptr<CFXJSE_Value> argTwo = GetSimpleValue(pThis, args, 1);
|
| + std::unique_ptr<CFXJSE_Value> argThree = GetSimpleValue(pThis, args, 2);
|
| + std::unique_ptr<CFXJSE_Value> argFour = GetSimpleValue(pThis, args, 3);
|
| + std::unique_ptr<CFXJSE_Value> argFive = GetSimpleValue(pThis, args, 4);
|
| + if (ValueIsNull(pThis, argOne.get()) || ValueIsNull(pThis, argTwo.get()) ||
|
| + ValueIsNull(pThis, argThree.get()) || ValueIsNull(pThis, argFour.get()) ||
|
| + ValueIsNull(pThis, argFive.get())) {
|
| + FXJSE_Value_SetNull(args.GetReturnValue());
|
| + return;
|
| }
|
| +
|
| + FX_FLOAT nPrincipalAmount = ValueToFloat(pThis, argOne.get());
|
| + FX_FLOAT nRate = ValueToFloat(pThis, argTwo.get());
|
| + FX_FLOAT nPayment = ValueToFloat(pThis, argThree.get());
|
| + FX_FLOAT nFirstMonth = ValueToFloat(pThis, argFour.get());
|
| + FX_FLOAT nNumberOfMonths = ValueToFloat(pThis, argFive.get());
|
| + if ((nPrincipalAmount <= 0) || (nRate <= 0) || (nPayment <= 0) ||
|
| + (nFirstMonth < 0) || (nNumberOfMonths < 0)) {
|
| + pContext->ThrowException(XFA_IDS_ARGUMENT_MISMATCH);
|
| + return;
|
| + }
|
| +
|
| + FX_FLOAT nRateOfMonth = nRate / 12;
|
| + int32_t iNums = (int32_t)(
|
| + (FXSYS_log10((FX_FLOAT)(nPayment / nPrincipalAmount)) -
|
| + FXSYS_log10((FX_FLOAT)(nPayment / nPrincipalAmount - nRateOfMonth))) /
|
| + FXSYS_log10((FX_FLOAT)(1 + nRateOfMonth)));
|
| + int32_t iEnd = std::min((int32_t)(nFirstMonth + nNumberOfMonths - 1), iNums);
|
| +
|
| + if (nPayment < nPrincipalAmount * nRateOfMonth) {
|
| + FXJSE_Value_SetFloat(args.GetReturnValue(), 0);
|
| + return;
|
| + }
|
| +
|
| + int32_t i = 0;
|
| + for (i = 0; i < nFirstMonth - 1; ++i)
|
| + nPrincipalAmount -= nPayment - nPrincipalAmount * nRateOfMonth;
|
| +
|
| + FX_FLOAT nSum = 0;
|
| + for (; i < iEnd; ++i) {
|
| + nSum += nPrincipalAmount * nRateOfMonth;
|
| + nPrincipalAmount -= nPayment - nPrincipalAmount * nRateOfMonth;
|
| + }
|
| + FXJSE_Value_SetFloat(args.GetReturnValue(), nSum);
|
| }
|
|
|
| // static
|
| @@ -2610,45 +2581,41 @@ void CXFA_FM2JSContext::NPV(CFXJSE_Value* pThis,
|
| CFXJSE_Arguments& args) {
|
| CXFA_FM2JSContext* pContext = ToJSContext(pThis, nullptr);
|
| int32_t argc = args.GetLength();
|
| - if (argc > 2) {
|
| - FX_BOOL bFlags = FALSE;
|
| - std::vector<std::unique_ptr<CFXJSE_Value>> argValues;
|
| - for (int32_t i = 0; i < argc; i++) {
|
| - argValues.push_back(GetSimpleValue(pThis, args, i));
|
| - if (ValueIsNull(pThis, argValues[i].get())) {
|
| - bFlags = TRUE;
|
| - }
|
| - }
|
| - if (!bFlags && argc > 0) {
|
| - FX_DOUBLE nRate = 0;
|
| - nRate = ValueToDouble(pThis, argValues[0].get());
|
| - if (nRate <= 0) {
|
| - pContext->ThrowException(XFA_IDS_ARGUMENT_MISMATCH);
|
| - } else {
|
| - FX_DOUBLE* pData = FX_Alloc(FX_DOUBLE, argc - 1);
|
| - for (int32_t i = 1; i < argc; i++) {
|
| - pData[i - 1] = ValueToDouble(pThis, argValues[i].get());
|
| - }
|
| - FX_DOUBLE nSum = 0;
|
| - int32_t iIndex = 0;
|
| - for (int32_t i = 0; i < argc - 1; i++) {
|
| - FX_DOUBLE nTemp = 1;
|
| - for (int32_t j = 0; j <= i; j++) {
|
| - nTemp *= 1 + nRate;
|
| - }
|
| - FX_DOUBLE nNum = pData[iIndex++];
|
| - nSum += nNum / nTemp;
|
| - }
|
| - FXJSE_Value_SetDouble(args.GetReturnValue(), nSum);
|
| - FX_Free(pData);
|
| - pData = nullptr;
|
| - }
|
| - } else {
|
| + if (argc < 3) {
|
| + pContext->ThrowException(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"NPV");
|
| + return;
|
| + }
|
| +
|
| + std::vector<std::unique_ptr<CFXJSE_Value>> argValues;
|
| + for (int32_t i = 0; i < argc; i++) {
|
| + argValues.push_back(GetSimpleValue(pThis, args, i));
|
| + if (ValueIsNull(pThis, argValues[i].get())) {
|
| FXJSE_Value_SetNull(args.GetReturnValue());
|
| + return;
|
| }
|
| - } else {
|
| - pContext->ThrowException(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"NPV");
|
| }
|
| +
|
| + FX_DOUBLE nRate = ValueToDouble(pThis, argValues[0].get());
|
| + if (nRate <= 0) {
|
| + pContext->ThrowException(XFA_IDS_ARGUMENT_MISMATCH);
|
| + return;
|
| + }
|
| +
|
| + std::vector<FX_DOUBLE> data(argc - 1);
|
| + for (int32_t i = 1; i < argc; i++)
|
| + data.push_back(ValueToDouble(pThis, argValues[i].get()));
|
| +
|
| + FX_DOUBLE nSum = 0;
|
| + int32_t iIndex = 0;
|
| + for (int32_t i = 0; i < argc - 1; i++) {
|
| + FX_DOUBLE nTemp = 1;
|
| + for (int32_t j = 0; j <= i; j++)
|
| + nTemp *= 1 + nRate;
|
| +
|
| + FX_DOUBLE nNum = data[iIndex++];
|
| + nSum += nNum / nTemp;
|
| + }
|
| + FXJSE_Value_SetDouble(args.GetReturnValue(), nSum);
|
| }
|
|
|
| // static
|
| @@ -2656,40 +2623,35 @@ void CXFA_FM2JSContext::Pmt(CFXJSE_Value* pThis,
|
| const CFX_ByteStringC& szFuncName,
|
| CFXJSE_Arguments& args) {
|
| CXFA_FM2JSContext* pContext = ToJSContext(pThis, nullptr);
|
| - if (args.GetLength() == 3) {
|
| - FX_BOOL bFlags = FALSE;
|
| - FX_FLOAT nPrincipal = 0;
|
| - FX_FLOAT nRate = 0;
|
| - FX_FLOAT nPeriods = 0;
|
| - std::unique_ptr<CFXJSE_Value> argOne = GetSimpleValue(pThis, args, 0);
|
| - std::unique_ptr<CFXJSE_Value> argTwo = GetSimpleValue(pThis, args, 1);
|
| - std::unique_ptr<CFXJSE_Value> argThree = GetSimpleValue(pThis, args, 2);
|
| - bFlags =
|
| - (ValueIsNull(pThis, argOne.get()) || ValueIsNull(pThis, argTwo.get()) ||
|
| - ValueIsNull(pThis, argThree.get()));
|
| - if (bFlags) {
|
| - FXJSE_Value_SetNull(args.GetReturnValue());
|
| - } else {
|
| - nPrincipal = ValueToFloat(pThis, argOne.get());
|
| - nRate = ValueToFloat(pThis, argTwo.get());
|
| - nPeriods = ValueToFloat(pThis, argThree.get());
|
| - bFlags = ((nPrincipal <= 0) || (nRate <= 0) || (nPeriods <= 0));
|
| - if (bFlags) {
|
| - pContext->ThrowException(XFA_IDS_ARGUMENT_MISMATCH);
|
| - } else {
|
| - FX_FLOAT nSum = 0;
|
| - FX_FLOAT nTmp = 1 + nRate;
|
| - nSum = nTmp;
|
| - for (int32_t i = 0; i < nPeriods - 1; ++i) {
|
| - nSum *= nTmp;
|
| - }
|
| - FXJSE_Value_SetFloat(args.GetReturnValue(),
|
| - (nPrincipal * nRate * nSum) / (nSum - 1));
|
| - }
|
| - }
|
| - } else {
|
| + if (args.GetLength() != 3) {
|
| pContext->ThrowException(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"Pmt");
|
| + return;
|
| + }
|
| +
|
| + std::unique_ptr<CFXJSE_Value> argOne = GetSimpleValue(pThis, args, 0);
|
| + std::unique_ptr<CFXJSE_Value> argTwo = GetSimpleValue(pThis, args, 1);
|
| + std::unique_ptr<CFXJSE_Value> argThree = GetSimpleValue(pThis, args, 2);
|
| + if (ValueIsNull(pThis, argOne.get()) || ValueIsNull(pThis, argTwo.get()) ||
|
| + ValueIsNull(pThis, argThree.get())) {
|
| + FXJSE_Value_SetNull(args.GetReturnValue());
|
| + return;
|
| }
|
| +
|
| + FX_FLOAT nPrincipal = ValueToFloat(pThis, argOne.get());
|
| + FX_FLOAT nRate = ValueToFloat(pThis, argTwo.get());
|
| + FX_FLOAT nPeriods = ValueToFloat(pThis, argThree.get());
|
| + if ((nPrincipal <= 0) || (nRate <= 0) || (nPeriods <= 0)) {
|
| + pContext->ThrowException(XFA_IDS_ARGUMENT_MISMATCH);
|
| + return;
|
| + }
|
| +
|
| + FX_FLOAT nTmp = 1 + nRate;
|
| + FX_FLOAT nSum = nTmp;
|
| + for (int32_t i = 0; i < nPeriods - 1; ++i)
|
| + nSum *= nTmp;
|
| +
|
| + FXJSE_Value_SetFloat(args.GetReturnValue(),
|
| + (nPrincipal * nRate * nSum) / (nSum - 1));
|
| }
|
|
|
| // static
|
| @@ -2697,70 +2659,57 @@ void CXFA_FM2JSContext::PPmt(CFXJSE_Value* pThis,
|
| const CFX_ByteStringC& szFuncName,
|
| CFXJSE_Arguments& args) {
|
| CXFA_FM2JSContext* pContext = ToJSContext(pThis, nullptr);
|
| - if (args.GetLength() == 5) {
|
| - FX_BOOL bFlags = FALSE;
|
| - FX_FLOAT nPrincpalAmount = 0;
|
| - FX_FLOAT nRate = 0;
|
| - FX_FLOAT nPayment = 0;
|
| - FX_FLOAT nFirstMonth = 0;
|
| - FX_FLOAT nNumberOfMonths = 0;
|
| - std::unique_ptr<CFXJSE_Value> argOne = GetSimpleValue(pThis, args, 0);
|
| - std::unique_ptr<CFXJSE_Value> argTwo = GetSimpleValue(pThis, args, 1);
|
| - std::unique_ptr<CFXJSE_Value> argThree = GetSimpleValue(pThis, args, 2);
|
| - std::unique_ptr<CFXJSE_Value> argFour = GetSimpleValue(pThis, args, 3);
|
| - std::unique_ptr<CFXJSE_Value> argFive = GetSimpleValue(pThis, args, 4);
|
| - bFlags =
|
| - (ValueIsNull(pThis, argOne.get()) || ValueIsNull(pThis, argTwo.get()) ||
|
| - ValueIsNull(pThis, argThree.get()) ||
|
| - ValueIsNull(pThis, argFour.get()) ||
|
| - ValueIsNull(pThis, argFive.get()));
|
| - if (bFlags) {
|
| - FXJSE_Value_SetNull(args.GetReturnValue());
|
| - } else {
|
| - nPrincpalAmount = ValueToFloat(pThis, argOne.get());
|
| - nRate = ValueToFloat(pThis, argTwo.get());
|
| - nPayment = ValueToFloat(pThis, argThree.get());
|
| - nFirstMonth = ValueToFloat(pThis, argFour.get());
|
| - nNumberOfMonths = ValueToFloat(pThis, argFive.get());
|
| - bFlags = ((nPrincpalAmount <= 0) || (nRate <= 0) || (nPayment <= 0) ||
|
| - (nFirstMonth < 0) || (nNumberOfMonths < 0));
|
| - if (bFlags) {
|
| - pContext->ThrowException(XFA_IDS_ARGUMENT_MISMATCH);
|
| - } else {
|
| - int32_t iEnd = (int32_t)(nFirstMonth + nNumberOfMonths - 1);
|
| - FX_FLOAT nSum = 0;
|
| - FX_FLOAT nRateOfMonth = nRate / 12;
|
| - int32_t iNums =
|
| - (int32_t)((FXSYS_log10((FX_FLOAT)(nPayment / nPrincpalAmount)) -
|
| - FXSYS_log10((FX_FLOAT)(nPayment / nPrincpalAmount -
|
| - nRateOfMonth))) /
|
| - FXSYS_log10((FX_FLOAT)(1 + nRateOfMonth)));
|
| - if (iEnd > iNums) {
|
| - iEnd = iNums;
|
| - }
|
| - if (nPayment < nPrincpalAmount * nRateOfMonth) {
|
| - bFlags = TRUE;
|
| - }
|
| - if (!bFlags) {
|
| - int32_t i = 0;
|
| - for (i = 0; i < nFirstMonth - 1; ++i) {
|
| - nPrincpalAmount -= nPayment - nPrincpalAmount * nRateOfMonth;
|
| - }
|
| - FX_FLOAT nTemp = 0;
|
| - for (; i < iEnd; ++i) {
|
| - nTemp = nPayment - nPrincpalAmount * nRateOfMonth;
|
| - nSum += nTemp;
|
| - nPrincpalAmount -= nTemp;
|
| - }
|
| - FXJSE_Value_SetFloat(args.GetReturnValue(), nSum);
|
| - } else {
|
| - pContext->ThrowException(XFA_IDS_ARGUMENT_MISMATCH);
|
| - }
|
| - }
|
| - }
|
| - } else {
|
| + if (args.GetLength() != 5) {
|
| pContext->ThrowException(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"PPmt");
|
| + return;
|
| }
|
| +
|
| + std::unique_ptr<CFXJSE_Value> argOne = GetSimpleValue(pThis, args, 0);
|
| + std::unique_ptr<CFXJSE_Value> argTwo = GetSimpleValue(pThis, args, 1);
|
| + std::unique_ptr<CFXJSE_Value> argThree = GetSimpleValue(pThis, args, 2);
|
| + std::unique_ptr<CFXJSE_Value> argFour = GetSimpleValue(pThis, args, 3);
|
| + std::unique_ptr<CFXJSE_Value> argFive = GetSimpleValue(pThis, args, 4);
|
| + if (ValueIsNull(pThis, argOne.get()) || ValueIsNull(pThis, argTwo.get()) ||
|
| + ValueIsNull(pThis, argThree.get()) || ValueIsNull(pThis, argFour.get()) ||
|
| + ValueIsNull(pThis, argFive.get())) {
|
| + FXJSE_Value_SetNull(args.GetReturnValue());
|
| + return;
|
| + }
|
| +
|
| + FX_FLOAT nPrincipalAmount = ValueToFloat(pThis, argOne.get());
|
| + FX_FLOAT nRate = ValueToFloat(pThis, argTwo.get());
|
| + FX_FLOAT nPayment = ValueToFloat(pThis, argThree.get());
|
| + FX_FLOAT nFirstMonth = ValueToFloat(pThis, argFour.get());
|
| + FX_FLOAT nNumberOfMonths = ValueToFloat(pThis, argFive.get());
|
| + if ((nPrincipalAmount <= 0) || (nRate <= 0) || (nPayment <= 0) ||
|
| + (nFirstMonth < 0) || (nNumberOfMonths < 0)) {
|
| + pContext->ThrowException(XFA_IDS_ARGUMENT_MISMATCH);
|
| + return;
|
| + }
|
| +
|
| + FX_FLOAT nRateOfMonth = nRate / 12;
|
| + int32_t iNums = (int32_t)(
|
| + (FXSYS_log10((FX_FLOAT)(nPayment / nPrincipalAmount)) -
|
| + FXSYS_log10((FX_FLOAT)(nPayment / nPrincipalAmount - nRateOfMonth))) /
|
| + FXSYS_log10((FX_FLOAT)(1 + nRateOfMonth)));
|
| + int32_t iEnd = std::min((int32_t)(nFirstMonth + nNumberOfMonths - 1), iNums);
|
| + if (nPayment < nPrincipalAmount * nRateOfMonth) {
|
| + pContext->ThrowException(XFA_IDS_ARGUMENT_MISMATCH);
|
| + return;
|
| + }
|
| +
|
| + int32_t i = 0;
|
| + for (i = 0; i < nFirstMonth - 1; ++i)
|
| + nPrincipalAmount -= nPayment - nPrincipalAmount * nRateOfMonth;
|
| +
|
| + FX_FLOAT nTemp = 0;
|
| + FX_FLOAT nSum = 0;
|
| + for (; i < iEnd; ++i) {
|
| + nTemp = nPayment - nPrincipalAmount * nRateOfMonth;
|
| + nSum += nTemp;
|
| + nPrincipalAmount -= nTemp;
|
| + }
|
| + FXJSE_Value_SetFloat(args.GetReturnValue(), nSum);
|
| }
|
|
|
| // static
|
| @@ -2768,39 +2717,34 @@ void CXFA_FM2JSContext::PV(CFXJSE_Value* pThis,
|
| const CFX_ByteStringC& szFuncName,
|
| CFXJSE_Arguments& args) {
|
| CXFA_FM2JSContext* pContext = ToJSContext(pThis, nullptr);
|
| - if (args.GetLength() == 3) {
|
| - FX_BOOL bFlags = FALSE;
|
| - FX_DOUBLE nAmount = 0;
|
| - FX_DOUBLE nRate = 0;
|
| - FX_DOUBLE nPeriod = 0;
|
| - std::unique_ptr<CFXJSE_Value> argOne = GetSimpleValue(pThis, args, 0);
|
| - std::unique_ptr<CFXJSE_Value> argTwo = GetSimpleValue(pThis, args, 1);
|
| - std::unique_ptr<CFXJSE_Value> argThree = GetSimpleValue(pThis, args, 2);
|
| - bFlags =
|
| - (ValueIsNull(pThis, argOne.get()) || ValueIsNull(pThis, argTwo.get()) ||
|
| - ValueIsNull(pThis, argThree.get()));
|
| - if (bFlags) {
|
| - FXJSE_Value_SetNull(args.GetReturnValue());
|
| - } else {
|
| - nAmount = ValueToDouble(pThis, argOne.get());
|
| - nRate = ValueToDouble(pThis, argTwo.get());
|
| - nPeriod = ValueToDouble(pThis, argThree.get());
|
| - bFlags = ((nAmount <= 0) || (nRate < 0) || (nPeriod <= 0));
|
| - if (bFlags) {
|
| - pContext->ThrowException(XFA_IDS_ARGUMENT_MISMATCH);
|
| - } else {
|
| - FX_DOUBLE nTemp = 1;
|
| - for (int32_t i = 0; i < nPeriod; ++i) {
|
| - nTemp *= 1 + nRate;
|
| - }
|
| - nTemp = 1 / nTemp;
|
| - FXJSE_Value_SetDouble(args.GetReturnValue(),
|
| - nAmount * ((1 - nTemp) / nRate));
|
| - }
|
| - }
|
| - } else {
|
| + if (args.GetLength() != 3) {
|
| pContext->ThrowException(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"PV");
|
| + return;
|
| + }
|
| +
|
| + std::unique_ptr<CFXJSE_Value> argOne = GetSimpleValue(pThis, args, 0);
|
| + std::unique_ptr<CFXJSE_Value> argTwo = GetSimpleValue(pThis, args, 1);
|
| + std::unique_ptr<CFXJSE_Value> argThree = GetSimpleValue(pThis, args, 2);
|
| + if (ValueIsNull(pThis, argOne.get()) || ValueIsNull(pThis, argTwo.get()) ||
|
| + ValueIsNull(pThis, argThree.get())) {
|
| + FXJSE_Value_SetNull(args.GetReturnValue());
|
| + return;
|
| + }
|
| +
|
| + FX_DOUBLE nAmount = ValueToDouble(pThis, argOne.get());
|
| + FX_DOUBLE nRate = ValueToDouble(pThis, argTwo.get());
|
| + FX_DOUBLE nPeriod = ValueToDouble(pThis, argThree.get());
|
| + if ((nAmount <= 0) || (nRate < 0) || (nPeriod <= 0)) {
|
| + pContext->ThrowException(XFA_IDS_ARGUMENT_MISMATCH);
|
| + return;
|
| }
|
| +
|
| + FX_DOUBLE nTemp = 1;
|
| + for (int32_t i = 0; i < nPeriod; ++i)
|
| + nTemp *= 1 + nRate;
|
| +
|
| + nTemp = 1 / nTemp;
|
| + FXJSE_Value_SetDouble(args.GetReturnValue(), nAmount * ((1 - nTemp) / nRate));
|
| }
|
|
|
| // static
|
| @@ -2808,36 +2752,32 @@ void CXFA_FM2JSContext::Rate(CFXJSE_Value* pThis,
|
| const CFX_ByteStringC& szFuncName,
|
| CFXJSE_Arguments& args) {
|
| CXFA_FM2JSContext* pContext = ToJSContext(pThis, nullptr);
|
| - if (args.GetLength() == 3) {
|
| - FX_BOOL bFlags = FALSE;
|
| - FX_FLOAT nFuture = 0;
|
| - FX_FLOAT nPresent = 0;
|
| - FX_FLOAT nTotalNumber = 0;
|
| - std::unique_ptr<CFXJSE_Value> argOne = GetSimpleValue(pThis, args, 0);
|
| - std::unique_ptr<CFXJSE_Value> argTwo = GetSimpleValue(pThis, args, 1);
|
| - std::unique_ptr<CFXJSE_Value> argThree = GetSimpleValue(pThis, args, 2);
|
| - bFlags =
|
| - (ValueIsNull(pThis, argOne.get()) || ValueIsNull(pThis, argTwo.get()) ||
|
| - ValueIsNull(pThis, argThree.get()));
|
| - if (bFlags) {
|
| - FXJSE_Value_SetNull(args.GetReturnValue());
|
| - } else {
|
| - nFuture = ValueToFloat(pThis, argOne.get());
|
| - nPresent = ValueToFloat(pThis, argTwo.get());
|
| - nTotalNumber = ValueToFloat(pThis, argThree.get());
|
| - bFlags = ((nFuture <= 0) || (nPresent < 0) || (nTotalNumber <= 0));
|
| - if (bFlags) {
|
| - pContext->ThrowException(XFA_IDS_ARGUMENT_MISMATCH);
|
| - } else {
|
| - FXJSE_Value_SetFloat(args.GetReturnValue(),
|
| - (FXSYS_pow((FX_FLOAT)(nFuture / nPresent),
|
| - (FX_FLOAT)(1 / nTotalNumber)) -
|
| - 1));
|
| - }
|
| - }
|
| - } else {
|
| + if (args.GetLength() != 3) {
|
| pContext->ThrowException(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"Rate");
|
| + return;
|
| }
|
| +
|
| + std::unique_ptr<CFXJSE_Value> argOne = GetSimpleValue(pThis, args, 0);
|
| + std::unique_ptr<CFXJSE_Value> argTwo = GetSimpleValue(pThis, args, 1);
|
| + std::unique_ptr<CFXJSE_Value> argThree = GetSimpleValue(pThis, args, 2);
|
| + if (ValueIsNull(pThis, argOne.get()) || ValueIsNull(pThis, argTwo.get()) ||
|
| + ValueIsNull(pThis, argThree.get())) {
|
| + FXJSE_Value_SetNull(args.GetReturnValue());
|
| + return;
|
| + }
|
| +
|
| + FX_FLOAT nFuture = ValueToFloat(pThis, argOne.get());
|
| + FX_FLOAT nPresent = ValueToFloat(pThis, argTwo.get());
|
| + FX_FLOAT nTotalNumber = ValueToFloat(pThis, argThree.get());
|
| + if ((nFuture <= 0) || (nPresent < 0) || (nTotalNumber <= 0)) {
|
| + pContext->ThrowException(XFA_IDS_ARGUMENT_MISMATCH);
|
| + return;
|
| + }
|
| +
|
| + FXJSE_Value_SetFloat(
|
| + args.GetReturnValue(),
|
| + (FXSYS_pow((FX_FLOAT)(nFuture / nPresent), (FX_FLOAT)(1 / nTotalNumber)) -
|
| + 1));
|
| }
|
|
|
| // static
|
| @@ -2845,36 +2785,31 @@ void CXFA_FM2JSContext::Term(CFXJSE_Value* pThis,
|
| const CFX_ByteStringC& szFuncName,
|
| CFXJSE_Arguments& args) {
|
| CXFA_FM2JSContext* pContext = ToJSContext(pThis, nullptr);
|
| - if (args.GetLength() == 3) {
|
| - FX_BOOL bFlags = FALSE;
|
| - FX_FLOAT nMount = 0;
|
| - FX_FLOAT nRate = 0;
|
| - FX_FLOAT nFuture = 0;
|
| - std::unique_ptr<CFXJSE_Value> argOne = GetSimpleValue(pThis, args, 0);
|
| - std::unique_ptr<CFXJSE_Value> argTwo = GetSimpleValue(pThis, args, 1);
|
| - std::unique_ptr<CFXJSE_Value> argThree = GetSimpleValue(pThis, args, 2);
|
| - bFlags =
|
| - (ValueIsNull(pThis, argOne.get()) || ValueIsNull(pThis, argTwo.get()) ||
|
| - ValueIsNull(pThis, argThree.get()));
|
| - if (bFlags) {
|
| - FXJSE_Value_SetNull(args.GetReturnValue());
|
| - } else {
|
| - nMount = ValueToFloat(pThis, argOne.get());
|
| - nRate = ValueToFloat(pThis, argTwo.get());
|
| - nFuture = ValueToFloat(pThis, argThree.get());
|
| - bFlags = ((nMount <= 0) || (nRate <= 0) || (nFuture <= 0));
|
| - if (bFlags) {
|
| - pContext->ThrowException(XFA_IDS_ARGUMENT_MISMATCH);
|
| - } else {
|
| - FXJSE_Value_SetFloat(
|
| - args.GetReturnValue(),
|
| - (FXSYS_log((FX_FLOAT)(nFuture / nMount * nRate) + 1) /
|
| - FXSYS_log((FX_FLOAT)(1 + nRate))));
|
| - }
|
| - }
|
| - } else {
|
| + if (args.GetLength() != 3) {
|
| pContext->ThrowException(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"Term");
|
| + return;
|
| + }
|
| +
|
| + std::unique_ptr<CFXJSE_Value> argOne = GetSimpleValue(pThis, args, 0);
|
| + std::unique_ptr<CFXJSE_Value> argTwo = GetSimpleValue(pThis, args, 1);
|
| + std::unique_ptr<CFXJSE_Value> argThree = GetSimpleValue(pThis, args, 2);
|
| + if (ValueIsNull(pThis, argOne.get()) || ValueIsNull(pThis, argTwo.get()) ||
|
| + ValueIsNull(pThis, argThree.get())) {
|
| + FXJSE_Value_SetNull(args.GetReturnValue());
|
| + return;
|
| + }
|
| +
|
| + FX_FLOAT nMount = ValueToFloat(pThis, argOne.get());
|
| + FX_FLOAT nRate = ValueToFloat(pThis, argTwo.get());
|
| + FX_FLOAT nFuture = ValueToFloat(pThis, argThree.get());
|
| + if ((nMount <= 0) || (nRate <= 0) || (nFuture <= 0)) {
|
| + pContext->ThrowException(XFA_IDS_ARGUMENT_MISMATCH);
|
| + return;
|
| }
|
| +
|
| + FXJSE_Value_SetFloat(args.GetReturnValue(),
|
| + (FXSYS_log((FX_FLOAT)(nFuture / nMount * nRate) + 1) /
|
| + FXSYS_log((FX_FLOAT)(1 + nRate))));
|
| }
|
|
|
| // static
|
| @@ -2883,146 +2818,141 @@ void CXFA_FM2JSContext::Choose(CFXJSE_Value* pThis,
|
| CFXJSE_Arguments& args) {
|
| CXFA_FM2JSContext* pContext = ToJSContext(pThis, nullptr);
|
| int32_t argc = args.GetLength();
|
| - if (argc > 1) {
|
| - v8::Isolate* pIsolate = pContext->GetScriptRuntime();
|
| - std::unique_ptr<CFXJSE_Value> argOne = args.GetValue(0);
|
| - FX_BOOL argOneIsNull = FALSE;
|
| - int32_t iIndex = 0;
|
| - argOneIsNull = ValueIsNull(pThis, argOne.get());
|
| - if (!argOneIsNull) {
|
| - iIndex = (int32_t)ValueToFloat(pThis, argOne.get());
|
| - }
|
| - if (argOneIsNull) {
|
| - FXJSE_Value_SetNull(args.GetReturnValue());
|
| - } else if (iIndex < 1) {
|
| - FXJSE_Value_SetUTF8String(args.GetReturnValue(), "");
|
| - } else {
|
| - FX_BOOL bFound = FALSE;
|
| - FX_BOOL bStopCounterFlags = FALSE;
|
| - int32_t iArgIndex = 1;
|
| - int32_t iValueIndex = 0;
|
| - while (!bFound && !bStopCounterFlags && (iArgIndex < argc)) {
|
| - std::unique_ptr<CFXJSE_Value> argIndexValue = args.GetValue(iArgIndex);
|
| - if (FXJSE_Value_IsArray(argIndexValue.get())) {
|
| - std::unique_ptr<CFXJSE_Value> lengthValue(new CFXJSE_Value(pIsolate));
|
| - FXJSE_Value_GetObjectProp(argIndexValue.get(), "length",
|
| - lengthValue.get());
|
| - int32_t iLength = FXJSE_Value_ToInteger(lengthValue.get());
|
| - if (iLength > 3) {
|
| - bStopCounterFlags = TRUE;
|
| - }
|
| - iValueIndex += (iLength - 2);
|
| - if (iValueIndex >= iIndex) {
|
| - std::unique_ptr<CFXJSE_Value> propertyValue(
|
| - new CFXJSE_Value(pIsolate));
|
| - std::unique_ptr<CFXJSE_Value> jsObjectValue(
|
| - new CFXJSE_Value(pIsolate));
|
| - std::unique_ptr<CFXJSE_Value> newPropertyValue(
|
| - new CFXJSE_Value(pIsolate));
|
| - FXJSE_Value_GetObjectPropByIdx(argIndexValue.get(), 1,
|
| - propertyValue.get());
|
| - FXJSE_Value_GetObjectPropByIdx(
|
| - argIndexValue.get(), ((iLength - 1) - (iValueIndex - iIndex)),
|
| - jsObjectValue.get());
|
| - if (FXJSE_Value_IsNull(propertyValue.get())) {
|
| - GetObjectDefaultValue(jsObjectValue.get(),
|
| - newPropertyValue.get());
|
| - } else {
|
| - CFX_ByteString propStr;
|
| - FXJSE_Value_ToUTF8String(propertyValue.get(), propStr);
|
| - FXJSE_Value_GetObjectProp(jsObjectValue.get(),
|
| - propStr.AsStringC(),
|
| - newPropertyValue.get());
|
| - }
|
| - CFX_ByteString bsChoosed;
|
| - ValueToUTF8String(newPropertyValue.get(), bsChoosed);
|
| - FXJSE_Value_SetUTF8String(args.GetReturnValue(),
|
| - bsChoosed.AsStringC());
|
| - bFound = TRUE;
|
| - }
|
| + if (argc < 2) {
|
| + pContext->ThrowException(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"Choose");
|
| + return;
|
| + }
|
| +
|
| + std::unique_ptr<CFXJSE_Value> argOne = args.GetValue(0);
|
| + if (ValueIsNull(pThis, argOne.get())) {
|
| + FXJSE_Value_SetNull(args.GetReturnValue());
|
| + return;
|
| + }
|
| +
|
| + int32_t iIndex = (int32_t)ValueToFloat(pThis, argOne.get());
|
| + if (iIndex < 1) {
|
| + FXJSE_Value_SetUTF8String(args.GetReturnValue(), "");
|
| + return;
|
| + }
|
| +
|
| + FX_BOOL bFound = FALSE;
|
| + FX_BOOL bStopCounterFlags = FALSE;
|
| + int32_t iArgIndex = 1;
|
| + int32_t iValueIndex = 0;
|
| + v8::Isolate* pIsolate = pContext->GetScriptRuntime();
|
| + while (!bFound && !bStopCounterFlags && (iArgIndex < argc)) {
|
| + std::unique_ptr<CFXJSE_Value> argIndexValue = args.GetValue(iArgIndex);
|
| + if (FXJSE_Value_IsArray(argIndexValue.get())) {
|
| + std::unique_ptr<CFXJSE_Value> lengthValue(new CFXJSE_Value(pIsolate));
|
| + FXJSE_Value_GetObjectProp(argIndexValue.get(), "length",
|
| + lengthValue.get());
|
| + int32_t iLength = FXJSE_Value_ToInteger(lengthValue.get());
|
| + if (iLength > 3)
|
| + bStopCounterFlags = TRUE;
|
| +
|
| + iValueIndex += (iLength - 2);
|
| + if (iValueIndex >= iIndex) {
|
| + std::unique_ptr<CFXJSE_Value> propertyValue(new CFXJSE_Value(pIsolate));
|
| + std::unique_ptr<CFXJSE_Value> jsObjectValue(new CFXJSE_Value(pIsolate));
|
| + std::unique_ptr<CFXJSE_Value> newPropertyValue(
|
| + new CFXJSE_Value(pIsolate));
|
| + FXJSE_Value_GetObjectPropByIdx(argIndexValue.get(), 1,
|
| + propertyValue.get());
|
| + FXJSE_Value_GetObjectPropByIdx(argIndexValue.get(),
|
| + ((iLength - 1) - (iValueIndex - iIndex)),
|
| + jsObjectValue.get());
|
| + if (FXJSE_Value_IsNull(propertyValue.get())) {
|
| + GetObjectDefaultValue(jsObjectValue.get(), newPropertyValue.get());
|
| } else {
|
| - iValueIndex++;
|
| - if (iValueIndex == iIndex) {
|
| - CFX_ByteString bsChoosed;
|
| - ValueToUTF8String(argIndexValue.get(), bsChoosed);
|
| - FXJSE_Value_SetUTF8String(args.GetReturnValue(),
|
| - bsChoosed.AsStringC());
|
| - bFound = TRUE;
|
| - }
|
| + CFX_ByteString propStr;
|
| + FXJSE_Value_ToUTF8String(propertyValue.get(), propStr);
|
| + FXJSE_Value_GetObjectProp(jsObjectValue.get(), propStr.AsStringC(),
|
| + newPropertyValue.get());
|
| }
|
| - iArgIndex++;
|
| + CFX_ByteString bsChoosed;
|
| + ValueToUTF8String(newPropertyValue.get(), bsChoosed);
|
| + FXJSE_Value_SetUTF8String(args.GetReturnValue(), bsChoosed.AsStringC());
|
| + bFound = TRUE;
|
| }
|
| - if (!bFound) {
|
| - FXJSE_Value_SetUTF8String(args.GetReturnValue(), "");
|
| + } else {
|
| + iValueIndex++;
|
| + if (iValueIndex == iIndex) {
|
| + CFX_ByteString bsChoosed;
|
| + ValueToUTF8String(argIndexValue.get(), bsChoosed);
|
| + FXJSE_Value_SetUTF8String(args.GetReturnValue(), bsChoosed.AsStringC());
|
| + bFound = TRUE;
|
| }
|
| }
|
| - } else {
|
| - pContext->ThrowException(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"Choose");
|
| + iArgIndex++;
|
| }
|
| + if (!bFound)
|
| + FXJSE_Value_SetUTF8String(args.GetReturnValue(), "");
|
| }
|
|
|
| // static
|
| void CXFA_FM2JSContext::Exists(CFXJSE_Value* pThis,
|
| const CFX_ByteStringC& szFuncName,
|
| CFXJSE_Arguments& args) {
|
| - if (args.GetLength() == 1) {
|
| - std::unique_ptr<CFXJSE_Value> argOne = args.GetValue(0);
|
| - FXJSE_Value_SetInteger(args.GetReturnValue(),
|
| - FXJSE_Value_IsObject(argOne.get()));
|
| - } else {
|
| + if (args.GetLength() != 1) {
|
| ToJSContext(pThis, nullptr)
|
| ->ThrowException(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"Exists");
|
| + return;
|
| }
|
| +
|
| + FXJSE_Value_SetInteger(args.GetReturnValue(),
|
| + FXJSE_Value_IsObject(args.GetValue(0).get()));
|
| }
|
|
|
| // static
|
| void CXFA_FM2JSContext::HasValue(CFXJSE_Value* pThis,
|
| const CFX_ByteStringC& szFuncName,
|
| CFXJSE_Arguments& args) {
|
| - if (args.GetLength() == 1) {
|
| - std::unique_ptr<CFXJSE_Value> argOne = GetSimpleValue(pThis, args, 0);
|
| - if (FXJSE_Value_IsUTF8String(argOne.get())) {
|
| - CFX_ByteString valueStr;
|
| - FXJSE_Value_ToUTF8String(argOne.get(), valueStr);
|
| - valueStr.TrimLeft();
|
| - FXJSE_Value_SetInteger(args.GetReturnValue(), (!valueStr.IsEmpty()));
|
| - } else if (FXJSE_Value_IsNumber(argOne.get()) ||
|
| - FXJSE_Value_IsBoolean(argOne.get())) {
|
| - FXJSE_Value_SetInteger(args.GetReturnValue(), TRUE);
|
| - } else {
|
| - FXJSE_Value_SetInteger(args.GetReturnValue(), FALSE);
|
| - }
|
| - } else {
|
| + if (args.GetLength() != 1) {
|
| ToJSContext(pThis, nullptr)
|
| ->ThrowException(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"HasValue");
|
| + return;
|
| }
|
| +
|
| + std::unique_ptr<CFXJSE_Value> argOne = GetSimpleValue(pThis, args, 0);
|
| + if (!FXJSE_Value_IsUTF8String(argOne.get())) {
|
| + FXJSE_Value_SetInteger(args.GetReturnValue(),
|
| + FXJSE_Value_IsNumber(argOne.get()) ||
|
| + FXJSE_Value_IsBoolean(argOne.get()));
|
| + return;
|
| + }
|
| +
|
| + CFX_ByteString valueStr;
|
| + FXJSE_Value_ToUTF8String(argOne.get(), valueStr);
|
| + valueStr.TrimLeft();
|
| + FXJSE_Value_SetInteger(args.GetReturnValue(), (!valueStr.IsEmpty()));
|
| }
|
|
|
| // static
|
| void CXFA_FM2JSContext::Oneof(CFXJSE_Value* pThis,
|
| const CFX_ByteStringC& szFuncName,
|
| CFXJSE_Arguments& args) {
|
| - if (args.GetLength() > 1) {
|
| - FX_BOOL bFlags = FALSE;
|
| - std::unique_ptr<CFXJSE_Value> argOne = GetSimpleValue(pThis, args, 0);
|
| - CFXJSE_Value** parametersValue = nullptr;
|
| - int32_t iCount = 0;
|
| - unfoldArgs(pThis, args, parametersValue, iCount, 1);
|
| - for (int32_t i = 0; i < iCount; i++) {
|
| - if (simpleValueCompare(pThis, argOne.get(), parametersValue[i])) {
|
| - bFlags = TRUE;
|
| - break;
|
| - }
|
| - }
|
| - FXJSE_Value_SetInteger(args.GetReturnValue(), bFlags);
|
| - for (int32_t i = 0; i < iCount; i++) {
|
| - delete parametersValue[i];
|
| - }
|
| - FX_Free(parametersValue);
|
| - } else {
|
| + if (args.GetLength() < 2) {
|
| ToJSContext(pThis, nullptr)
|
| ->ThrowException(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"Oneof");
|
| + return;
|
| }
|
| +
|
| + FX_BOOL bFlags = FALSE;
|
| + std::unique_ptr<CFXJSE_Value> argOne = GetSimpleValue(pThis, args, 0);
|
| + CFXJSE_Value** parametersValue = nullptr;
|
| + int32_t iCount = 0;
|
| + unfoldArgs(pThis, args, parametersValue, iCount, 1);
|
| + for (int32_t i = 0; i < iCount; i++) {
|
| + if (simpleValueCompare(pThis, argOne.get(), parametersValue[i])) {
|
| + bFlags = TRUE;
|
| + break;
|
| + }
|
| + }
|
| + for (int32_t i = 0; i < iCount; i++)
|
| + delete parametersValue[i];
|
| + FX_Free(parametersValue);
|
| +
|
| + FXJSE_Value_SetInteger(args.GetReturnValue(), bFlags);
|
| }
|
|
|
| // static
|
|
|