Split up CFXJSE_FormCalcContext::ApplyToExpansion() It is simpler to understand if we put some of the nested loops into subordinate methods, for example. Change-Id: Iddd5da92184cbdee2e86961bd25720bc43239106 Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/76292 Commit-Queue: Tom Sepez <tsepez@chromium.org> Reviewed-by: Daniel Hosseinian <dhoss@chromium.org>
diff --git a/fxjs/xfa/cfxjse_formcalc_context.cpp b/fxjs/xfa/cfxjse_formcalc_context.cpp index 3b0d235..4caaa9d 100644 --- a/fxjs/xfa/cfxjse_formcalc_context.cpp +++ b/fxjs/xfa/cfxjse_formcalc_context.cpp
@@ -5559,69 +5559,73 @@ v8::Isolate* pIsolate = info.GetIsolate(); for (int32_t i = 0; i < info.Length(); i++) { auto argValue = std::make_unique<CFXJSE_Value>(pIsolate, info[i]); - if (argValue->IsNull(pIsolate)) - continue; - if (argValue->IsArray(pIsolate)) { - auto lengthValue = std::make_unique<CFXJSE_Value>(); - argValue->GetObjectProperty(pIsolate, "length", lengthValue.get()); - - int32_t iLength = lengthValue->ToInteger(pIsolate); - if (iLength <= 2) { - if (!bStrict) - continue; - + if (!ApplyToArray(pIsolate, fn, argValue.get()) && bStrict) { ThrowArgumentMismatchException(); return false; } - - auto propertyValue = std::make_unique<CFXJSE_Value>(); - auto jsObjectValue = std::make_unique<CFXJSE_Value>(); - auto newPropertyValue = std::make_unique<CFXJSE_Value>(); - argValue->GetObjectPropertyByIdx(pIsolate, 1, propertyValue.get()); - argValue->GetObjectPropertyByIdx(pIsolate, 2, jsObjectValue.get()); - if (propertyValue->IsNull(pIsolate)) { - for (int32_t j = 2; j < iLength; j++) { - argValue->GetObjectPropertyByIdx(pIsolate, j, jsObjectValue.get()); - if (!jsObjectValue->IsObject(pIsolate)) - continue; - - newPropertyValue->ForceSetValue( - pIsolate, - GetObjectDefaultValue( - pIsolate, - jsObjectValue->GetValue(pIsolate).As<v8::Object>())); - if (!newPropertyValue->IsNull(pIsolate)) - fn(pIsolate, newPropertyValue.get()); - } - } else { - for (int32_t j = 2; j < iLength; j++) { - argValue->GetObjectPropertyByIdx(pIsolate, j, jsObjectValue.get()); - jsObjectValue->GetObjectProperty( - pIsolate, propertyValue->ToString(pIsolate).AsStringView(), - newPropertyValue.get()); - if (!newPropertyValue->IsNull(pIsolate)) - fn(pIsolate, newPropertyValue.get()); - } - } - continue; + } else if (argValue->IsObject(pIsolate)) { + ApplyToObject(pIsolate, fn, argValue.get()); + } else if (!argValue->IsNull(pIsolate)) { + fn(pIsolate, argValue.get()); } - - if (argValue->IsObject(pIsolate)) { - auto newPropertyValue = std::make_unique<CFXJSE_Value>( - pIsolate, - GetObjectDefaultValue(pIsolate, - argValue->GetValue(pIsolate).As<v8::Object>())); - if (!newPropertyValue->IsNull(pIsolate)) - fn(pIsolate, newPropertyValue.get()); - continue; - } - - fn(pIsolate, argValue.get()); } return true; } +bool CFXJSE_FormCalcContext::ApplyToArray( + v8::Isolate* pIsolate, + std::function<void(v8::Isolate*, CFXJSE_Value*)> fn, + CFXJSE_Value* pArray) { + auto lengthValue = std::make_unique<CFXJSE_Value>(); + pArray->GetObjectProperty(pIsolate, "length", lengthValue.get()); + + int32_t iLength = lengthValue->ToInteger(pIsolate); + if (iLength < 3) + return false; + + auto propertyValue = std::make_unique<CFXJSE_Value>(); + auto jsObjectValue = std::make_unique<CFXJSE_Value>(); + auto newPropertyValue = std::make_unique<CFXJSE_Value>(); + pArray->GetObjectPropertyByIdx(pIsolate, 1, propertyValue.get()); + pArray->GetObjectPropertyByIdx(pIsolate, 2, jsObjectValue.get()); + if (propertyValue->IsNull(pIsolate)) { + for (int32_t j = 2; j < iLength; j++) { + pArray->GetObjectPropertyByIdx(pIsolate, j, jsObjectValue.get()); + if (!jsObjectValue->IsObject(pIsolate)) + continue; + + newPropertyValue->ForceSetValue( + pIsolate, + GetObjectDefaultValue( + pIsolate, jsObjectValue->GetValue(pIsolate).As<v8::Object>())); + if (!newPropertyValue->IsNull(pIsolate)) + fn(pIsolate, newPropertyValue.get()); + } + } else { + for (int32_t j = 2; j < iLength; j++) { + pArray->GetObjectPropertyByIdx(pIsolate, j, jsObjectValue.get()); + jsObjectValue->GetObjectProperty( + pIsolate, propertyValue->ToString(pIsolate).AsStringView(), + newPropertyValue.get()); + if (!newPropertyValue->IsNull(pIsolate)) + fn(pIsolate, newPropertyValue.get()); + } + } + return true; +} + +void CFXJSE_FormCalcContext::ApplyToObject( + v8::Isolate* pIsolate, + std::function<void(v8::Isolate*, CFXJSE_Value*)> fn, + CFXJSE_Value* pObject) { + auto newPropertyValue = std::make_unique<CFXJSE_Value>( + pIsolate, GetObjectDefaultValue( + pIsolate, pObject->GetValue(pIsolate).As<v8::Object>())); + if (!newPropertyValue->IsNull(pIsolate)) + fn(pIsolate, newPropertyValue.get()); +} + void CFXJSE_FormCalcContext::ThrowNoDefaultPropertyException( ByteStringView name) const { ThrowException(WideString::FromUTF8(name) +
diff --git a/fxjs/xfa/cfxjse_formcalc_context.h b/fxjs/xfa/cfxjse_formcalc_context.h index 79fb2ee..517ca9b 100644 --- a/fxjs/xfa/cfxjse_formcalc_context.h +++ b/fxjs/xfa/cfxjse_formcalc_context.h
@@ -277,15 +277,23 @@ v8::Isolate* GetIsolate() const { return m_pIsolate.Get(); } CXFA_Document* GetDocument() const { return m_pDocument.Get(); } - bool ApplyToExpansion(std::function<void(v8::Isolate*, CFXJSE_Value*)> fn, - const v8::FunctionCallbackInfo<v8::Value>& info, - bool bStrict); - private: static void DotAccessorCommon(CFXJSE_HostObject* pThis, const v8::FunctionCallbackInfo<v8::Value>& info, bool bDotAccessor); + bool ApplyToExpansion(std::function<void(v8::Isolate*, CFXJSE_Value*)> fn, + const v8::FunctionCallbackInfo<v8::Value>& info, + bool bStrict); + + bool ApplyToArray(v8::Isolate* pIsolate, + std::function<void(v8::Isolate*, CFXJSE_Value*)> fn, + CFXJSE_Value* pArray); + + void ApplyToObject(v8::Isolate* pIsolate, + std::function<void(v8::Isolate*, CFXJSE_Value*)> fn, + CFXJSE_Value* pObject); + void ThrowArgumentMismatchException() const; void ThrowNoDefaultPropertyException(ByteStringView name) const; void ThrowCompilerErrorException() const;