Index: xfa/fxfa/fm2js/xfa_fm2jscontext.cpp |
diff --git a/xfa/fxfa/fm2js/xfa_fm2jscontext.cpp b/xfa/fxfa/fm2js/xfa_fm2jscontext.cpp |
index 0aa0599f23b8ccf624236e8185623546c2e07536..41b2b93be2ed18254ebef649315c998f60502834 100644 |
--- a/xfa/fxfa/fm2js/xfa_fm2jscontext.cpp |
+++ b/xfa/fxfa/fm2js/xfa_fm2jscontext.cpp |
@@ -796,94 +796,75 @@ void CXFA_FM2JSContext::Min(CFXJSE_Value* pThis, |
FX_DOUBLE dMinValue = 0.0; |
for (int32_t i = 0; i < args.GetLength(); i++) { |
std::unique_ptr<CFXJSE_Value> argValue = args.GetValue(i); |
- if (FXJSE_Value_IsNull(argValue.get())) { |
+ if (FXJSE_Value_IsNull(argValue.get())) |
continue; |
- } else if (FXJSE_Value_IsArray(argValue.get())) { |
+ |
+ if (FXJSE_Value_IsArray(argValue.get())) { |
std::unique_ptr<CFXJSE_Value> lengthValue(new CFXJSE_Value(pIsolate)); |
FXJSE_Value_GetObjectProp(argValue.get(), "length", lengthValue.get()); |
int32_t iLength = FXJSE_Value_ToInteger(lengthValue.get()); |
- if (iLength > 2) { |
- 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(argValue.get(), 1, propertyValue.get()); |
- FXJSE_Value_GetObjectPropByIdx(argValue.get(), 2, jsObjectValue.get()); |
- if (FXJSE_Value_IsNull(propertyValue.get())) { |
- for (int32_t i = 2; i < iLength; i++) { |
- FXJSE_Value_GetObjectPropByIdx(argValue.get(), i, |
- jsObjectValue.get()); |
- GetObjectDefaultValue(jsObjectValue.get(), newPropertyValue.get()); |
- if (!FXJSE_Value_IsNull(newPropertyValue.get())) { |
- uCount++; |
- if (uCount == 1) { |
- dMinValue = ValueToDouble(pThis, newPropertyValue.get()); |
- } else { |
- FX_DOUBLE dValue = ValueToDouble(pThis, newPropertyValue.get()); |
- if (dMinValue > dValue) { |
- dMinValue = dValue; |
- } |
- } |
- } |
- } |
- } else { |
- CFX_ByteString propertyStr; |
- FXJSE_Value_ToUTF8String(propertyValue.get(), propertyStr); |
- for (int32_t i = 2; i < iLength; i++) { |
- FXJSE_Value_GetObjectPropByIdx(argValue.get(), i, |
- jsObjectValue.get()); |
- FXJSE_Value_GetObjectProp(jsObjectValue.get(), |
- propertyStr.AsStringC(), |
- newPropertyValue.get()); |
- if (!FXJSE_Value_IsNull(newPropertyValue.get())) { |
- uCount++; |
- if (uCount == 1) { |
- dMinValue = ValueToDouble(pThis, newPropertyValue.get()); |
- } else { |
- FX_DOUBLE dValue = ValueToDouble(pThis, newPropertyValue.get()); |
- if (dMinValue > dValue) { |
- dMinValue = dValue; |
- } |
- } |
- } |
- } |
- } |
- } else { |
+ if (iLength <= 2) { |
pContext->ThrowScriptErrorMessage(XFA_IDS_ARGUMENT_MISMATCH); |
+ return; |
} |
- } else if (FXJSE_Value_IsObject(argValue.get())) { |
+ |
+ 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)); |
- GetObjectDefaultValue(argValue.get(), newPropertyValue.get()); |
- if (!FXJSE_Value_IsNull(newPropertyValue.get())) { |
- uCount++; |
- if (uCount == 1) { |
- dMinValue = ValueToDouble(pThis, newPropertyValue.get()); |
- } else { |
+ FXJSE_Value_GetObjectPropByIdx(argValue.get(), 1, propertyValue.get()); |
+ FXJSE_Value_GetObjectPropByIdx(argValue.get(), 2, jsObjectValue.get()); |
+ if (FXJSE_Value_IsNull(propertyValue.get())) { |
+ for (int32_t i = 2; i < iLength; i++) { |
+ FXJSE_Value_GetObjectPropByIdx(argValue.get(), i, |
+ jsObjectValue.get()); |
+ GetObjectDefaultValue(jsObjectValue.get(), newPropertyValue.get()); |
+ if (FXJSE_Value_IsNull(newPropertyValue.get())) |
+ continue; |
+ |
+ uCount++; |
FX_DOUBLE dValue = ValueToDouble(pThis, newPropertyValue.get()); |
- if (dMinValue > dValue) { |
- dMinValue = dValue; |
- } |
+ dMinValue = uCount == 1 ? dValue : std::min(dMinValue, dValue); |
} |
- } |
- } else { |
- uCount++; |
- if (uCount == 1) { |
- dMinValue = ValueToDouble(pThis, argValue.get()); |
} else { |
- FX_DOUBLE dValue = ValueToDouble(pThis, argValue.get()); |
- if (dMinValue > dValue) { |
- dMinValue = dValue; |
+ CFX_ByteString propertyStr; |
+ FXJSE_Value_ToUTF8String(propertyValue.get(), propertyStr); |
+ for (int32_t i = 2; i < iLength; i++) { |
+ FXJSE_Value_GetObjectPropByIdx(argValue.get(), i, |
+ jsObjectValue.get()); |
+ FXJSE_Value_GetObjectProp(jsObjectValue.get(), |
+ propertyStr.AsStringC(), |
+ newPropertyValue.get()); |
+ if (FXJSE_Value_IsNull(newPropertyValue.get())) |
+ continue; |
+ |
+ uCount++; |
+ FX_DOUBLE dValue = ValueToDouble(pThis, newPropertyValue.get()); |
+ dMinValue = uCount == 1 ? dValue : std::min(dMinValue, dValue); |
} |
} |
+ } else if (FXJSE_Value_IsObject(argValue.get())) { |
+ std::unique_ptr<CFXJSE_Value> newPropertyValue( |
+ new CFXJSE_Value(pIsolate)); |
+ GetObjectDefaultValue(argValue.get(), newPropertyValue.get()); |
+ if (FXJSE_Value_IsNull(newPropertyValue.get())) |
+ continue; |
+ |
+ uCount++; |
+ FX_DOUBLE dValue = ValueToDouble(pThis, newPropertyValue.get()); |
+ dMinValue = uCount == 1 ? dValue : std::min(dMinValue, dValue); |
+ } else { |
+ uCount++; |
+ FX_DOUBLE dValue = ValueToDouble(pThis, argValue.get()); |
+ dMinValue = uCount == 1 ? dValue : std::min(dMinValue, dValue); |
} |
} |
- |
- if (uCount) { |
- FXJSE_Value_SetDouble(args.GetReturnValue(), dMinValue); |
- } else { |
+ if (uCount == 0) { |
FXJSE_Value_SetNull(args.GetReturnValue()); |
+ return; |
} |
+ |
+ FXJSE_Value_SetDouble(args.GetReturnValue(), dMinValue); |
} |
// static |
@@ -892,85 +873,35 @@ void CXFA_FM2JSContext::Mod(CFXJSE_Value* pThis, |
CFXJSE_Arguments& args) { |
CXFA_FM2JSContext* pContext = |
static_cast<CXFA_FM2JSContext*>(FXJSE_Value_ToObject(pThis, nullptr)); |
- v8::Isolate* pIsolate = pContext->GetScriptRuntime(); |
- if (args.GetLength() == 2) { |
- std::unique_ptr<CFXJSE_Value> argOne = args.GetValue(0); |
- std::unique_ptr<CFXJSE_Value> argTwo = args.GetValue(1); |
- if (FXJSE_Value_IsNull(argOne.get()) || FXJSE_Value_IsNull(argTwo.get())) { |
- FXJSE_Value_SetNull(args.GetReturnValue()); |
- } else { |
- FX_DOUBLE dDividend = 0.0; |
- FX_DOUBLE dDividor = 0.0; |
- if (FXJSE_Value_IsArray(argOne.get())) { |
- std::unique_ptr<CFXJSE_Value> lengthValue(new CFXJSE_Value(pIsolate)); |
- FXJSE_Value_GetObjectProp(argOne.get(), "length", lengthValue.get()); |
- int32_t iLength = FXJSE_Value_ToInteger(lengthValue.get()); |
- if (iLength > 2) { |
- std::unique_ptr<CFXJSE_Value> propertyValue( |
- new CFXJSE_Value(pIsolate)); |
- std::unique_ptr<CFXJSE_Value> jsObjectValue( |
- new CFXJSE_Value(pIsolate)); |
- FXJSE_Value_GetObjectPropByIdx(argOne.get(), 1, propertyValue.get()); |
- FXJSE_Value_GetObjectPropByIdx(argOne.get(), 2, jsObjectValue.get()); |
- if (FXJSE_Value_IsNull(propertyValue.get())) { |
- dDividend = ValueToDouble(pThis, jsObjectValue.get()); |
- } else { |
- CFX_ByteString propertyStr; |
- FXJSE_Value_ToUTF8String(propertyValue.get(), propertyStr); |
- std::unique_ptr<CFXJSE_Value> newPropertyValue( |
- new CFXJSE_Value(pIsolate)); |
- FXJSE_Value_GetObjectProp(jsObjectValue.get(), |
- propertyStr.AsStringC(), |
- newPropertyValue.get()); |
- dDividend = ValueToDouble(pThis, newPropertyValue.get()); |
- } |
- } else { |
- pContext->ThrowScriptErrorMessage(XFA_IDS_ARGUMENT_MISMATCH); |
- } |
- } else { |
- dDividend = ValueToDouble(pThis, argOne.get()); |
- } |
- if (FXJSE_Value_IsArray(argTwo.get())) { |
- std::unique_ptr<CFXJSE_Value> lengthValue(new CFXJSE_Value(pIsolate)); |
- FXJSE_Value_GetObjectProp(argTwo.get(), "length", lengthValue.get()); |
- int32_t iLength = FXJSE_Value_ToInteger(lengthValue.get()); |
- if (iLength > 2) { |
- std::unique_ptr<CFXJSE_Value> propertyValue( |
- new CFXJSE_Value(pIsolate)); |
- std::unique_ptr<CFXJSE_Value> jsObjectValue( |
- new CFXJSE_Value(pIsolate)); |
- FXJSE_Value_GetObjectPropByIdx(argTwo.get(), 1, propertyValue.get()); |
- FXJSE_Value_GetObjectPropByIdx(argTwo.get(), 2, jsObjectValue.get()); |
- if (FXJSE_Value_IsNull(propertyValue.get())) { |
- dDividor = ValueToDouble(pThis, jsObjectValue.get()); |
- } else { |
- CFX_ByteString propertyStr; |
- FXJSE_Value_ToUTF8String(propertyValue.get(), propertyStr); |
- std::unique_ptr<CFXJSE_Value> newPropertyValue( |
- new CFXJSE_Value(pIsolate)); |
- FXJSE_Value_GetObjectProp(jsObjectValue.get(), |
- propertyStr.AsStringC(), |
- newPropertyValue.get()); |
- dDividor = ValueToDouble(pThis, newPropertyValue.get()); |
- } |
- } else { |
- pContext->ThrowScriptErrorMessage(XFA_IDS_ARGUMENT_MISMATCH); |
- } |
- } else { |
- dDividor = ValueToDouble(pThis, argTwo.get()); |
- } |
- if (dDividor) { |
- FXJSE_Value_SetDouble( |
- args.GetReturnValue(), |
- dDividend - dDividor * (int32_t)(dDividend / dDividor)); |
- } else { |
- pContext->ThrowScriptErrorMessage(XFA_IDS_DIVIDE_ZERO); |
- } |
- } |
- } else { |
+ if (args.GetLength() != 2) { |
pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, |
L"Mod"); |
+ return; |
+ } |
+ |
+ std::unique_ptr<CFXJSE_Value> argOne = args.GetValue(0); |
+ std::unique_ptr<CFXJSE_Value> argTwo = args.GetValue(1); |
+ if (FXJSE_Value_IsNull(argOne.get()) || FXJSE_Value_IsNull(argTwo.get())) { |
+ FXJSE_Value_SetNull(args.GetReturnValue()); |
+ return; |
} |
+ |
+ bool argOneResult; |
+ FX_DOUBLE dDividend = ExtractDouble(pThis, argOne.get(), &argOneResult); |
+ bool argTwoResult; |
+ FX_DOUBLE dDivisor = ExtractDouble(pThis, argTwo.get(), &argTwoResult); |
+ if (!argOneResult || !argTwoResult) { |
+ pContext->ThrowScriptErrorMessage(XFA_IDS_ARGUMENT_MISMATCH); |
+ return; |
+ } |
+ |
+ if (dDivisor == 0.0) { |
+ pContext->ThrowScriptErrorMessage(XFA_IDS_DIVIDE_ZERO); |
+ return; |
+ } |
+ |
+ FXJSE_Value_SetDouble(args.GetReturnValue(), |
+ dDividend - dDivisor * (int32_t)(dDividend / dDivisor)); |
} |
// static |
@@ -979,208 +910,160 @@ void CXFA_FM2JSContext::Round(CFXJSE_Value* pThis, |
CFXJSE_Arguments& args) { |
CXFA_FM2JSContext* pContext = |
static_cast<CXFA_FM2JSContext*>(FXJSE_Value_ToObject(pThis, nullptr)); |
- v8::Isolate* pIsolate = pContext->GetScriptRuntime(); |
int32_t argc = args.GetLength(); |
+ if (argc != 1 && argc != 2) { |
+ pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, |
+ L"Round"); |
+ return; |
+ } |
+ |
+ std::unique_ptr<CFXJSE_Value> argOne = args.GetValue(0); |
+ if (FXJSE_Value_IsNull(argOne.get())) { |
+ FXJSE_Value_SetNull(args.GetReturnValue()); |
+ return; |
+ } |
+ |
+ bool dValueRet; |
+ FX_DOUBLE dValue = ExtractDouble(pThis, argOne.get(), &dValueRet); |
+ if (!dValueRet) { |
+ pContext->ThrowScriptErrorMessage(XFA_IDS_ARGUMENT_MISMATCH); |
+ return; |
+ } |
+ |
uint8_t uPrecision = 0; |
- if (argc == 1) { |
- std::unique_ptr<CFXJSE_Value> argOne = args.GetValue(0); |
- if (FXJSE_Value_IsNull(argOne.get())) { |
- FXJSE_Value_SetNull(args.GetReturnValue()); |
- } else { |
- FX_DOUBLE dValue = 0.0; |
- if (FXJSE_Value_IsArray(argOne.get())) { |
- std::unique_ptr<CFXJSE_Value> propertyValue(new CFXJSE_Value(pIsolate)); |
- std::unique_ptr<CFXJSE_Value> jsObjectValue(new CFXJSE_Value(pIsolate)); |
- FXJSE_Value_GetObjectPropByIdx(argOne.get(), 1, propertyValue.get()); |
- FXJSE_Value_GetObjectPropByIdx(argOne.get(), 2, jsObjectValue.get()); |
- if (FXJSE_Value_IsNull(propertyValue.get())) { |
- dValue = ValueToDouble(pThis, jsObjectValue.get()); |
- } else { |
- CFX_ByteString propertyStr; |
- FXJSE_Value_ToUTF8String(propertyValue.get(), propertyStr); |
- std::unique_ptr<CFXJSE_Value> newPropertyValue( |
- new CFXJSE_Value(pIsolate)); |
- FXJSE_Value_GetObjectProp(jsObjectValue.get(), |
- propertyStr.AsStringC(), |
- newPropertyValue.get()); |
- dValue = ValueToDouble(pThis, newPropertyValue.get()); |
- } |
- } else { |
- dValue = ValueToDouble(pThis, argOne.get()); |
- } |
- CFX_Decimal decimalValue((FX_FLOAT)dValue, uPrecision); |
- CFX_WideString wsValue = decimalValue; |
- FXJSE_Value_SetUTF8String(args.GetReturnValue(), |
- wsValue.UTF8Encode().AsStringC()); |
- } |
- } else if (argc == 2) { |
- std::unique_ptr<CFXJSE_Value> argOne = args.GetValue(0); |
+ if (argc == 2) { |
std::unique_ptr<CFXJSE_Value> argTwo = args.GetValue(1); |
- if (FXJSE_Value_IsNull(argOne.get()) || FXJSE_Value_IsNull(argTwo.get())) { |
+ if (FXJSE_Value_IsNull(argTwo.get())) { |
FXJSE_Value_SetNull(args.GetReturnValue()); |
- } else { |
- FX_DOUBLE dValue = 0.0; |
- if (FXJSE_Value_IsArray(argOne.get())) { |
- std::unique_ptr<CFXJSE_Value> propertyValue(new CFXJSE_Value(pIsolate)); |
- std::unique_ptr<CFXJSE_Value> jsObjectValue(new CFXJSE_Value(pIsolate)); |
- FXJSE_Value_GetObjectPropByIdx(argOne.get(), 1, propertyValue.get()); |
- FXJSE_Value_GetObjectPropByIdx(argOne.get(), 2, jsObjectValue.get()); |
- if (FXJSE_Value_IsNull(propertyValue.get())) { |
- dValue = ValueToDouble(pThis, jsObjectValue.get()); |
- } else { |
- CFX_ByteString propertyStr; |
- FXJSE_Value_ToUTF8String(propertyValue.get(), propertyStr); |
- std::unique_ptr<CFXJSE_Value> newPropertyValue( |
- new CFXJSE_Value(pIsolate)); |
- FXJSE_Value_GetObjectProp(jsObjectValue.get(), |
- propertyStr.AsStringC(), |
- newPropertyValue.get()); |
- dValue = ValueToDouble(pThis, newPropertyValue.get()); |
- } |
- } else { |
- dValue = ValueToDouble(pThis, argOne.get()); |
- } |
- FX_DOUBLE dPrecision = 0.0; |
- if (FXJSE_Value_IsArray(argTwo.get())) { |
- std::unique_ptr<CFXJSE_Value> propertyValue(new CFXJSE_Value(pIsolate)); |
- std::unique_ptr<CFXJSE_Value> jsObjectValue(new CFXJSE_Value(pIsolate)); |
- FXJSE_Value_GetObjectPropByIdx(argTwo.get(), 1, propertyValue.get()); |
- FXJSE_Value_GetObjectPropByIdx(argTwo.get(), 2, jsObjectValue.get()); |
- if (FXJSE_Value_IsNull(propertyValue.get())) { |
- dPrecision = ValueToDouble(pThis, jsObjectValue.get()); |
- } else { |
- CFX_ByteString propertyStr; |
- FXJSE_Value_ToUTF8String(propertyValue.get(), propertyStr); |
- std::unique_ptr<CFXJSE_Value> newPropertyValue( |
- new CFXJSE_Value(pIsolate)); |
- FXJSE_Value_GetObjectProp(jsObjectValue.get(), |
- propertyStr.AsStringC(), |
- newPropertyValue.get()); |
- dPrecision = ValueToDouble(pThis, newPropertyValue.get()); |
- } |
- } else { |
- dPrecision = ValueToDouble(pThis, argTwo.get()); |
- } |
- if (dPrecision < 0) { |
- uPrecision = 0; |
- } else if (dPrecision > 12.0) { |
- uPrecision = 12; |
- } else { |
- uPrecision = (uint8_t)dPrecision; |
- } |
- CFX_Decimal decimalValue((FX_FLOAT)dValue, uPrecision); |
- CFX_WideString wsValue = decimalValue; |
- FXJSE_Value_SetUTF8String(args.GetReturnValue(), |
- wsValue.UTF8Encode().AsStringC()); |
+ return; |
} |
- } else { |
- pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, |
- L"Round"); |
+ |
+ bool dPrecisionRet; |
+ FX_DOUBLE dPrecision = ExtractDouble(pThis, argTwo.get(), &dPrecisionRet); |
+ if (!dPrecisionRet) { |
+ pContext->ThrowScriptErrorMessage(XFA_IDS_ARGUMENT_MISMATCH); |
+ return; |
+ } |
+ |
+ uPrecision = |
+ static_cast<uint8_t>(std::min(std::max(dPrecision, 0.0), 12.0)); |
} |
+ |
+ CFX_Decimal decimalValue((FX_FLOAT)dValue, uPrecision); |
+ CFX_WideString wsValue = decimalValue; |
+ FXJSE_Value_SetUTF8String(args.GetReturnValue(), |
+ wsValue.UTF8Encode().AsStringC()); |
} |
// static |
void CXFA_FM2JSContext::Sum(CFXJSE_Value* pThis, |
const CFX_ByteStringC& szFuncName, |
CFXJSE_Arguments& args) { |
+ int32_t argc = args.GetLength(); |
+ if (argc == 0) { |
+ FXJSE_Value_SetNull(args.GetReturnValue()); |
+ return; |
+ } |
+ |
CXFA_FM2JSContext* pContext = |
static_cast<CXFA_FM2JSContext*>(FXJSE_Value_ToObject(pThis, nullptr)); |
v8::Isolate* pIsolate = pContext->GetScriptRuntime(); |
- int32_t argc = args.GetLength(); |
uint32_t uCount = 0; |
FX_DOUBLE dSum = 0.0; |
- if (argc) { |
- for (int32_t i = 0; i < argc; i++) { |
- std::unique_ptr<CFXJSE_Value> argValue = args.GetValue(i); |
- if (FXJSE_Value_IsNull(argValue.get())) { |
- continue; |
- } else if (FXJSE_Value_IsArray(argValue.get())) { |
- std::unique_ptr<CFXJSE_Value> lengthValue(new CFXJSE_Value(pIsolate)); |
- FXJSE_Value_GetObjectProp(argValue.get(), "length", lengthValue.get()); |
- int32_t iLength = FXJSE_Value_ToInteger(lengthValue.get()); |
- if (iLength > 2) { |
- std::unique_ptr<CFXJSE_Value> propertyValue( |
- new CFXJSE_Value(pIsolate)); |
- FXJSE_Value_GetObjectPropByIdx(argValue.get(), 1, |
- propertyValue.get()); |
- std::unique_ptr<CFXJSE_Value> jsObjectValue( |
- new CFXJSE_Value(pIsolate)); |
- std::unique_ptr<CFXJSE_Value> newPropertyValue( |
- new CFXJSE_Value(pIsolate)); |
- if (FXJSE_Value_IsNull(propertyValue.get())) { |
- for (int32_t j = 2; j < iLength; j++) { |
- FXJSE_Value_GetObjectPropByIdx(argValue.get(), j, |
- jsObjectValue.get()); |
- GetObjectDefaultValue(jsObjectValue.get(), |
- newPropertyValue.get()); |
- if (!FXJSE_Value_IsNull(newPropertyValue.get())) { |
- dSum += ValueToDouble(pThis, jsObjectValue.get()); |
- uCount++; |
- } |
- } |
- } else { |
- CFX_ByteString propertyStr; |
- FXJSE_Value_ToUTF8String(propertyValue.get(), propertyStr); |
- for (int32_t j = 2; j < iLength; j++) { |
- FXJSE_Value_GetObjectPropByIdx(argValue.get(), j, |
- jsObjectValue.get()); |
- FXJSE_Value_GetObjectProp(jsObjectValue.get(), |
- propertyStr.AsStringC(), |
- newPropertyValue.get()); |
- if (!FXJSE_Value_IsNull(newPropertyValue.get())) { |
- dSum += ValueToDouble(pThis, newPropertyValue.get()); |
- uCount++; |
- } |
- } |
- } |
- } else { |
- pContext->ThrowScriptErrorMessage(XFA_IDS_ARGUMENT_MISMATCH); |
- } |
- } else if (FXJSE_Value_IsObject(argValue.get())) { |
- std::unique_ptr<CFXJSE_Value> newPropertyValue( |
- new CFXJSE_Value(pIsolate)); |
- GetObjectDefaultValue(argValue.get(), newPropertyValue.get()); |
- if (!FXJSE_Value_IsNull(newPropertyValue.get())) { |
- dSum += ValueToDouble(pThis, argValue.get()); |
+ for (int32_t i = 0; i < argc; i++) { |
+ std::unique_ptr<CFXJSE_Value> argValue = args.GetValue(i); |
+ if (FXJSE_Value_IsNull(argValue.get())) |
+ continue; |
+ |
+ if (FXJSE_Value_IsArray(argValue.get())) { |
+ std::unique_ptr<CFXJSE_Value> lengthValue(new CFXJSE_Value(pIsolate)); |
+ FXJSE_Value_GetObjectProp(argValue.get(), "length", lengthValue.get()); |
+ int32_t iLength = FXJSE_Value_ToInteger(lengthValue.get()); |
+ if (iLength <= 2) { |
+ pContext->ThrowScriptErrorMessage(XFA_IDS_ARGUMENT_MISMATCH); |
+ return; |
+ } |
+ |
+ std::unique_ptr<CFXJSE_Value> propertyValue(new CFXJSE_Value(pIsolate)); |
+ FXJSE_Value_GetObjectPropByIdx(argValue.get(), 1, propertyValue.get()); |
+ std::unique_ptr<CFXJSE_Value> jsObjectValue(new CFXJSE_Value(pIsolate)); |
+ std::unique_ptr<CFXJSE_Value> newPropertyValue( |
+ new CFXJSE_Value(pIsolate)); |
+ if (FXJSE_Value_IsNull(propertyValue.get())) { |
+ for (int32_t j = 2; j < iLength; j++) { |
+ FXJSE_Value_GetObjectPropByIdx(argValue.get(), j, |
+ jsObjectValue.get()); |
+ GetObjectDefaultValue(jsObjectValue.get(), newPropertyValue.get()); |
+ if (FXJSE_Value_IsNull(newPropertyValue.get())) |
+ continue; |
+ |
+ dSum += ValueToDouble(pThis, jsObjectValue.get()); |
uCount++; |
} |
} else { |
- dSum += ValueToDouble(pThis, argValue.get()); |
- uCount++; |
+ CFX_ByteString propertyStr; |
+ FXJSE_Value_ToUTF8String(propertyValue.get(), propertyStr); |
+ for (int32_t j = 2; j < iLength; j++) { |
+ FXJSE_Value_GetObjectPropByIdx(argValue.get(), j, |
+ jsObjectValue.get()); |
+ FXJSE_Value_GetObjectProp(jsObjectValue.get(), |
+ propertyStr.AsStringC(), |
+ newPropertyValue.get()); |
+ if (FXJSE_Value_IsNull(newPropertyValue.get())) |
+ continue; |
+ |
+ dSum += ValueToDouble(pThis, newPropertyValue.get()); |
+ uCount++; |
+ } |
} |
+ } else if (FXJSE_Value_IsObject(argValue.get())) { |
+ std::unique_ptr<CFXJSE_Value> newPropertyValue( |
+ new CFXJSE_Value(pIsolate)); |
+ GetObjectDefaultValue(argValue.get(), newPropertyValue.get()); |
+ if (FXJSE_Value_IsNull(newPropertyValue.get())) |
+ continue; |
+ |
+ dSum += ValueToDouble(pThis, argValue.get()); |
+ uCount++; |
+ } else { |
+ dSum += ValueToDouble(pThis, argValue.get()); |
+ uCount++; |
} |
} |
- if (uCount < 1) { |
+ if (uCount == 0) { |
FXJSE_Value_SetNull(args.GetReturnValue()); |
- } else { |
- FXJSE_Value_SetDouble(args.GetReturnValue(), dSum); |
+ return; |
} |
+ |
+ FXJSE_Value_SetDouble(args.GetReturnValue(), dSum); |
} |
// static |
void CXFA_FM2JSContext::Date(CFXJSE_Value* pThis, |
const CFX_ByteStringC& szFuncName, |
CFXJSE_Arguments& args) { |
- if (args.GetLength() == 0) { |
- struct tm* pTmStruct = 0; |
- time_t currentTime; |
- time(¤tTime); |
- pTmStruct = gmtime(¤tTime); |
- CFX_ByteString bufferYear; |
- CFX_ByteString bufferMon; |
- CFX_ByteString bufferDay; |
- bufferYear.Format("%d", pTmStruct->tm_year + 1900); |
- bufferMon.Format("%02d", pTmStruct->tm_mon + 1); |
- bufferDay.Format("%02d", pTmStruct->tm_mday); |
- CFX_ByteString bufferCurrent = bufferYear + bufferMon + bufferDay; |
- int32_t dDays = DateString2Num(bufferCurrent.AsStringC()); |
- FXJSE_Value_SetInteger(args.GetReturnValue(), dDays); |
- } else { |
+ if (args.GetLength() != 0) { |
CXFA_FM2JSContext* pContext = |
static_cast<CXFA_FM2JSContext*>(FXJSE_Value_ToObject(pThis, nullptr)); |
pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, |
L"Date"); |
+ return; |
} |
+ |
+ time_t currentTime; |
+ time(¤tTime); |
+ struct tm* pTmStruct = gmtime(¤tTime); |
+ |
+ CFX_ByteString bufferYear; |
+ CFX_ByteString bufferMon; |
+ CFX_ByteString bufferDay; |
+ bufferYear.Format("%d", pTmStruct->tm_year + 1900); |
+ bufferMon.Format("%02d", pTmStruct->tm_mon + 1); |
+ bufferDay.Format("%02d", pTmStruct->tm_mday); |
+ |
+ CFX_ByteString bufferCurrent = bufferYear + bufferMon + bufferDay; |
+ FXJSE_Value_SetInteger(args.GetReturnValue(), |
+ DateString2Num(bufferCurrent.AsStringC())); |
} |
// static |
@@ -1188,54 +1071,52 @@ void CXFA_FM2JSContext::Date2Num(CFXJSE_Value* pThis, |
const CFX_ByteStringC& szFuncName, |
CFXJSE_Arguments& args) { |
int32_t argc = args.GetLength(); |
- if ((argc > 0) && (argc < 4)) { |
- FX_BOOL bFlags = FALSE; |
- CFX_ByteString dateString; |
- CFX_ByteString formatString; |
- CFX_ByteString localString; |
- std::unique_ptr<CFXJSE_Value> dateValue = GetSimpleValue(pThis, args, 0); |
- if (ValueIsNull(pThis, dateValue.get())) { |
- bFlags = TRUE; |
- } else { |
- ValueToUTF8String(dateValue.get(), dateString); |
- } |
- if (argc > 1) { |
- std::unique_ptr<CFXJSE_Value> formatValue = |
- GetSimpleValue(pThis, args, 1); |
- if (ValueIsNull(pThis, formatValue.get())) { |
- bFlags = TRUE; |
- } else { |
- ValueToUTF8String(formatValue.get(), formatString); |
- } |
- } |
- if (argc == 3) { |
- std::unique_ptr<CFXJSE_Value> localValue = GetSimpleValue(pThis, args, 2); |
- if (ValueIsNull(pThis, localValue.get())) { |
- bFlags = TRUE; |
- } else { |
- ValueToUTF8String(localValue.get(), localString); |
- } |
- } |
- if (!bFlags) { |
- CFX_ByteString szIsoDateString; |
- FX_BOOL bRet = |
- Local2IsoDate(pThis, dateString.AsStringC(), formatString.AsStringC(), |
- localString.AsStringC(), szIsoDateString); |
- if (bRet) { |
- FXJSE_Value_SetInteger(args.GetReturnValue(), |
- DateString2Num(szIsoDateString.AsStringC())); |
- } else { |
- FXJSE_Value_SetInteger(args.GetReturnValue(), 0); |
- } |
- } else { |
- FXJSE_Value_SetNull(args.GetReturnValue()); |
- } |
- } else { |
+ if (argc <= 0 || argc >= 4) { |
CXFA_FM2JSContext* pContext = |
static_cast<CXFA_FM2JSContext*>(FXJSE_Value_ToObject(pThis, nullptr)); |
pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, |
L"Date2Num"); |
+ return; |
+ } |
+ |
+ std::unique_ptr<CFXJSE_Value> dateValue = GetSimpleValue(pThis, args, 0); |
+ if (ValueIsNull(pThis, dateValue.get())) { |
+ FXJSE_Value_SetNull(args.GetReturnValue()); |
+ return; |
+ } |
+ |
+ CFX_ByteString dateString; |
+ ValueToUTF8String(dateValue.get(), dateString); |
+ |
+ CFX_ByteString formatString; |
+ if (argc > 1) { |
+ std::unique_ptr<CFXJSE_Value> formatValue = GetSimpleValue(pThis, args, 1); |
+ if (ValueIsNull(pThis, formatValue.get())) { |
+ FXJSE_Value_SetNull(args.GetReturnValue()); |
+ return; |
+ } |
+ ValueToUTF8String(formatValue.get(), formatString); |
} |
+ |
+ CFX_ByteString localString; |
+ if (argc == 3) { |
+ std::unique_ptr<CFXJSE_Value> localValue = GetSimpleValue(pThis, args, 2); |
+ if (ValueIsNull(pThis, localValue.get())) { |
+ FXJSE_Value_SetNull(args.GetReturnValue()); |
+ return; |
+ } |
+ ValueToUTF8String(localValue.get(), localString); |
+ } |
+ |
+ CFX_ByteString szIsoDateString; |
+ if (!Local2IsoDate(pThis, dateString.AsStringC(), formatString.AsStringC(), |
+ localString.AsStringC(), szIsoDateString)) { |
+ FXJSE_Value_SetInteger(args.GetReturnValue(), 0); |
+ return; |
+ } |
+ |
+ FXJSE_Value_SetInteger(args.GetReturnValue(), |
+ DateString2Num(szIsoDateString.AsStringC())); |
} |
// static |
@@ -1243,66 +1124,64 @@ void CXFA_FM2JSContext::DateFmt(CFXJSE_Value* pThis, |
const CFX_ByteStringC& szFuncName, |
CFXJSE_Arguments& args) { |
int32_t argc = args.GetLength(); |
- if (argc < 3) { |
- FX_BOOL bFlags = FALSE; |
- int32_t iStyle = 0; |
- CFX_ByteString szLocal; |
- if (argc > 0) { |
- std::unique_ptr<CFXJSE_Value> argStyle = GetSimpleValue(pThis, args, 0); |
- if (FXJSE_Value_IsNull(argStyle.get())) { |
- bFlags = TRUE; |
- } |
- iStyle = (int32_t)ValueToFloat(pThis, argStyle.get()); |
- if (iStyle > 4 || iStyle < 0) { |
- iStyle = 0; |
- } |
- } |
- if (argc == 2) { |
- std::unique_ptr<CFXJSE_Value> argLocal = GetSimpleValue(pThis, args, 1); |
- if (FXJSE_Value_IsNull(argLocal.get())) { |
- bFlags = TRUE; |
- } else { |
- ValueToUTF8String(argLocal.get(), szLocal); |
- } |
- } |
- if (!bFlags) { |
- CFX_ByteString formatStr; |
- GetStandardDateFormat(pThis, iStyle, szLocal.AsStringC(), formatStr); |
- if (formatStr.IsEmpty()) { |
- formatStr = ""; |
- } |
- FXJSE_Value_SetUTF8String(args.GetReturnValue(), formatStr.AsStringC()); |
- } else { |
- FXJSE_Value_SetNull(args.GetReturnValue()); |
- } |
- } else { |
+ if (argc >= 3) { |
CXFA_FM2JSContext* pContext = |
static_cast<CXFA_FM2JSContext*>(FXJSE_Value_ToObject(pThis, nullptr)); |
pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, |
L"Date2Num"); |
+ return; |
+ } |
+ |
+ int32_t iStyle = 0; |
+ if (argc > 0) { |
+ std::unique_ptr<CFXJSE_Value> argStyle = GetSimpleValue(pThis, args, 0); |
+ if (FXJSE_Value_IsNull(argStyle.get())) { |
+ FXJSE_Value_SetNull(args.GetReturnValue()); |
+ return; |
+ } |
+ |
+ iStyle = (int32_t)ValueToFloat(pThis, argStyle.get()); |
+ if (iStyle < 0 || iStyle > 4) |
+ iStyle = 0; |
} |
+ |
+ CFX_ByteString szLocal; |
+ if (argc == 2) { |
+ std::unique_ptr<CFXJSE_Value> argLocal = GetSimpleValue(pThis, args, 1); |
+ if (FXJSE_Value_IsNull(argLocal.get())) { |
+ FXJSE_Value_SetNull(args.GetReturnValue()); |
+ return; |
+ } |
+ ValueToUTF8String(argLocal.get(), szLocal); |
+ } |
+ |
+ CFX_ByteString formatStr; |
+ GetStandardDateFormat(pThis, iStyle, szLocal.AsStringC(), formatStr); |
+ FXJSE_Value_SetUTF8String(args.GetReturnValue(), formatStr.AsStringC()); |
} |
// static |
void CXFA_FM2JSContext::IsoDate2Num(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_IsNull(argOne.get())) { |
- FXJSE_Value_SetNull(args.GetReturnValue()); |
- } else { |
- CFX_ByteString szArgString; |
- ValueToUTF8String(argOne.get(), szArgString); |
- int32_t dDays = DateString2Num(szArgString.AsStringC()); |
- FXJSE_Value_SetInteger(args.GetReturnValue(), (int32_t)dDays); |
- } |
- } else { |
+ if (args.GetLength() != 1) { |
CXFA_FM2JSContext* pContext = |
static_cast<CXFA_FM2JSContext*>(FXJSE_Value_ToObject(pThis, nullptr)); |
pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, |
L"IsoDate2Num"); |
+ return; |
+ } |
+ |
+ std::unique_ptr<CFXJSE_Value> argOne = GetSimpleValue(pThis, args, 0); |
+ if (FXJSE_Value_IsNull(argOne.get())) { |
+ FXJSE_Value_SetNull(args.GetReturnValue()); |
+ return; |
} |
+ |
+ CFX_ByteString szArgString; |
+ ValueToUTF8String(argOne.get(), szArgString); |
+ FXJSE_Value_SetInteger(args.GetReturnValue(), |
+ DateString2Num(szArgString.AsStringC())); |
} |
// static |
@@ -1311,55 +1190,58 @@ void CXFA_FM2JSContext::IsoTime2Num(CFXJSE_Value* pThis, |
CFXJSE_Arguments& args) { |
CXFA_FM2JSContext* pContext = |
static_cast<CXFA_FM2JSContext*>(FXJSE_Value_ToObject(pThis, nullptr)); |
- if (args.GetLength() == 1) { |
- std::unique_ptr<CFXJSE_Value> argOne = GetSimpleValue(pThis, args, 0); |
- if (ValueIsNull(pThis, argOne.get())) { |
- FXJSE_Value_SetNull(args.GetReturnValue()); |
- } else { |
- CXFA_Document* pDoc = pContext->GetDocument(); |
- ASSERT(pDoc); |
- IFX_LocaleMgr* pMgr = (IFX_LocaleMgr*)pDoc->GetLocalMgr(); |
- CFX_ByteString szArgString; |
- ValueToUTF8String(argOne.get(), szArgString); |
- szArgString = szArgString.Mid(szArgString.Find('T', 0) + 1); |
- if (szArgString.IsEmpty()) { |
- FXJSE_Value_SetInteger(args.GetReturnValue(), 0); |
- return; |
- } |
- CXFA_LocaleValue timeValue( |
- XFA_VT_TIME, CFX_WideString::FromUTF8(szArgString.AsStringC()), |
- (CXFA_LocaleMgr*)pMgr); |
- if (timeValue.IsValid()) { |
- CFX_Unitime uniTime = timeValue.GetTime(); |
- int32_t hour = uniTime.GetHour(); |
- int32_t min = uniTime.GetMinute(); |
- int32_t second = uniTime.GetSecond(); |
- int32_t milSecond = uniTime.GetMillisecond(); |
- IFX_Locale* pDefLocale = pMgr->GetDefLocale(); |
- ASSERT(pDefLocale); |
- FX_TIMEZONE tzLocale; |
- pDefLocale->GetTimeZone(tzLocale); |
- int32_t mins = hour * 60 + min; |
- mins -= (tzLocale.tzHour * 60); |
- while (mins > 1440) { |
- mins -= 1440; |
- } |
- while (mins < 0) { |
- mins += 1440; |
- } |
- hour = mins / 60; |
- min = mins % 60; |
- int32_t iResult = |
- hour * 3600000 + min * 60000 + second * 1000 + milSecond + 1; |
- FXJSE_Value_SetInteger(args.GetReturnValue(), iResult); |
- } else { |
- FXJSE_Value_SetInteger(args.GetReturnValue(), 0); |
- } |
- } |
- } else { |
+ if (args.GetLength() != 1) { |
pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, |
L"IsoTime2Num"); |
+ return; |
+ } |
+ |
+ std::unique_ptr<CFXJSE_Value> argOne = GetSimpleValue(pThis, args, 0); |
+ if (ValueIsNull(pThis, argOne.get())) { |
+ FXJSE_Value_SetNull(args.GetReturnValue()); |
+ return; |
} |
+ |
+ CXFA_Document* pDoc = pContext->GetDocument(); |
+ CXFA_LocaleMgr* pMgr = pDoc->GetLocalMgr(); |
+ |
+ CFX_ByteString szArgString; |
+ ValueToUTF8String(argOne.get(), szArgString); |
+ szArgString = szArgString.Mid(szArgString.Find('T', 0) + 1); |
+ if (szArgString.IsEmpty()) { |
+ FXJSE_Value_SetInteger(args.GetReturnValue(), 0); |
+ return; |
+ } |
+ |
+ CXFA_LocaleValue timeValue( |
+ XFA_VT_TIME, CFX_WideString::FromUTF8(szArgString.AsStringC()), pMgr); |
+ if (!timeValue.IsValid()) { |
+ FXJSE_Value_SetInteger(args.GetReturnValue(), 0); |
+ return; |
+ } |
+ |
+ CFX_Unitime uniTime = timeValue.GetTime(); |
+ int32_t hour = uniTime.GetHour(); |
+ int32_t min = uniTime.GetMinute(); |
+ int32_t second = uniTime.GetSecond(); |
+ int32_t milSecond = uniTime.GetMillisecond(); |
+ |
+ FX_TIMEZONE tzLocale; |
+ pMgr->GetDefLocale()->GetTimeZone(tzLocale); |
+ |
+ // TODO(dsinclair): See if there is other time conversion code in pdfium and |
+ // consolidate. |
+ int32_t mins = hour * 60 + min; |
+ mins -= (tzLocale.tzHour * 60); |
+ while (mins > 1440) |
+ mins -= 1440; |
+ while (mins < 0) |
+ mins += 1440; |
+ hour = mins / 60; |
+ min = mins % 60; |
+ int32_t iResult = |
+ hour * 3600000 + min * 60000 + second * 1000 + milSecond + 1; |
+ FXJSE_Value_SetInteger(args.GetReturnValue(), iResult); |
} |
// static |
@@ -7110,6 +6992,44 @@ FX_DOUBLE CXFA_FM2JSContext::ValueToDouble(CFXJSE_Value* pThis, |
return dRet; |
} |
+// static. |
+double CXFA_FM2JSContext::ExtractDouble(CFXJSE_Value* pThis, |
+ CFXJSE_Value* src, |
+ bool* ret) { |
+ ASSERT(ret); |
+ |
+ CXFA_FM2JSContext* pContext = |
+ static_cast<CXFA_FM2JSContext*>(FXJSE_Value_ToObject(pThis, nullptr)); |
+ v8::Isolate* pIsolate = pContext->GetScriptRuntime(); |
+ |
+ *ret = true; |
+ |
+ if (FXJSE_Value_IsArray(src)) { |
+ std::unique_ptr<CFXJSE_Value> lengthValue(new CFXJSE_Value(pIsolate)); |
+ FXJSE_Value_GetObjectProp(src, "length", lengthValue.get()); |
+ int32_t iLength = FXJSE_Value_ToInteger(lengthValue.get()); |
+ if (iLength <= 2) { |
+ *ret = false; |
+ return 0.0; |
+ } |
+ |
+ std::unique_ptr<CFXJSE_Value> propertyValue(new CFXJSE_Value(pIsolate)); |
+ std::unique_ptr<CFXJSE_Value> jsObjectValue(new CFXJSE_Value(pIsolate)); |
+ FXJSE_Value_GetObjectPropByIdx(src, 1, propertyValue.get()); |
+ FXJSE_Value_GetObjectPropByIdx(src, 2, jsObjectValue.get()); |
+ if (FXJSE_Value_IsNull(propertyValue.get())) |
+ return ValueToDouble(pThis, jsObjectValue.get()); |
+ |
+ CFX_ByteString propertyStr; |
+ FXJSE_Value_ToUTF8String(propertyValue.get(), propertyStr); |
+ std::unique_ptr<CFXJSE_Value> newPropertyValue(new CFXJSE_Value(pIsolate)); |
+ FXJSE_Value_GetObjectProp(jsObjectValue.get(), propertyStr.AsStringC(), |
+ newPropertyValue.get()); |
+ return ValueToDouble(pThis, newPropertyValue.get()); |
+ } |
+ return ValueToDouble(pThis, src); |
+} |
+ |
// static |
void CXFA_FM2JSContext::ValueToUTF8String(CFXJSE_Value* arg, |
CFX_ByteString& szOutputString) { |