Consolidate logic in CFXJSE_FormCalcContext, part 1.

Change-Id: Ie4abc033fd7052273b87417938a0b2e318bcea0a
Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/76130
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 ae89811..2544258 100644
--- a/fxjs/xfa/cfxjse_formcalc_context.cpp
+++ b/fxjs/xfa/cfxjse_formcalc_context.cpp
@@ -1343,93 +1343,58 @@
   return true;
 }
 
-std::unique_ptr<CFXJSE_Value> GetSimpleValue(
-    const v8::FunctionCallbackInfo<v8::Value>& info,
-    uint32_t index) {
-  ASSERT(index < (uint32_t)info.Length());
-
-  auto argIndex =
-      std::make_unique<CFXJSE_Value>(info.GetIsolate(), info[index]);
-  if (!argIndex->IsArray(info.GetIsolate()) &&
-      !argIndex->IsObject(info.GetIsolate()))
-    return argIndex;
-
-  if (argIndex->IsArray(info.GetIsolate())) {
+std::unique_ptr<CFXJSE_Value> GetExtractedValue(v8::Isolate* pIsolate,
+                                                CFXJSE_Value* pValue) {
+  if (pValue->IsArray(pIsolate)) {
     auto lengthValue = std::make_unique<CFXJSE_Value>();
-    argIndex->GetObjectProperty(info.GetIsolate(), "length", lengthValue.get());
-    int32_t iLength = lengthValue->ToInteger(info.GetIsolate());
+    pValue->GetObjectProperty(pIsolate, "length", lengthValue.get());
+    int32_t iLength = lengthValue->ToInteger(pIsolate);
     auto simpleValue = std::make_unique<CFXJSE_Value>();
     if (iLength < 3) {
-      simpleValue.get()->SetUndefined(info.GetIsolate());
+      simpleValue.get()->SetUndefined(pIsolate);
       return simpleValue;
     }
 
     auto propertyValue = std::make_unique<CFXJSE_Value>();
     auto jsObjectValue = std::make_unique<CFXJSE_Value>();
-    argIndex->GetObjectPropertyByIdx(info.GetIsolate(), 1, propertyValue.get());
-    argIndex->GetObjectPropertyByIdx(info.GetIsolate(), 2, jsObjectValue.get());
-    if (propertyValue->IsNull(info.GetIsolate())) {
-      GetObjectDefaultValue(info.GetIsolate(), jsObjectValue.get(),
-                            simpleValue.get());
+    pValue->GetObjectPropertyByIdx(pIsolate, 1, propertyValue.get());
+    pValue->GetObjectPropertyByIdx(pIsolate, 2, jsObjectValue.get());
+    if (propertyValue->IsNull(pIsolate)) {
+      GetObjectDefaultValue(pIsolate, jsObjectValue.get(), simpleValue.get());
       return simpleValue;
     }
 
     jsObjectValue->GetObjectProperty(
-        info.GetIsolate(),
-        propertyValue->ToString(info.GetIsolate()).AsStringView(),
+        pIsolate, propertyValue->ToString(pIsolate).AsStringView(),
         simpleValue.get());
     return simpleValue;
   }
 
-  auto defaultValue = std::make_unique<CFXJSE_Value>();
-  GetObjectDefaultValue(info.GetIsolate(), argIndex.get(), defaultValue.get());
-  return defaultValue;
+  if (pValue->IsObject(pIsolate)) {
+    auto defaultValue = std::make_unique<CFXJSE_Value>();
+    GetObjectDefaultValue(pIsolate, pValue, defaultValue.get());
+    return defaultValue;
+  }
+
+  return std::make_unique<CFXJSE_Value>(pIsolate, pValue->GetValue(pIsolate));
 }
 
-int32_t GetValueArrayLength(CFXJSE_HostObject* pHostObject, CFXJSE_Value* arg) {
-  v8::Isolate* pIsolate = ToFormCalcContext(pHostObject)->GetIsolate();
-  if (!arg || !arg->IsArray(pIsolate))
-    return 0;
-
-  auto lengthValue = std::make_unique<CFXJSE_Value>();
-  arg->GetObjectProperty(pIsolate, "length", lengthValue.get());
-  return lengthValue->ToInteger(pIsolate);
+std::unique_ptr<CFXJSE_Value> GetSimpleValue(
+    const v8::FunctionCallbackInfo<v8::Value>& info,
+    uint32_t index) {
+  ASSERT(index < static_cast<uint32_t>(info.Length()));
+  auto value = std::make_unique<CFXJSE_Value>(info.GetIsolate(), info[index]);
+  return GetExtractedValue(info.GetIsolate(), value.get());
 }
 
 bool ValueIsNull(v8::Isolate* pIsolate,
                  CFXJSE_HostObject* pHostObject,
                  CFXJSE_Value* arg) {
-  if (!arg || arg->IsNull(pIsolate))
+  if (!arg)
     return true;
 
-  if (!arg->IsArray(pIsolate) && !arg->IsObject(pIsolate))
-    return false;
-
-  if (arg->IsArray(pIsolate)) {
-    int32_t iLength = GetValueArrayLength(pHostObject, arg);
-    if (iLength < 3)
-      return true;
-
-    auto propertyValue = std::make_unique<CFXJSE_Value>();
-    auto jsObjectValue = std::make_unique<CFXJSE_Value>();
-    arg->GetObjectPropertyByIdx(pIsolate, 1, propertyValue.get());
-    arg->GetObjectPropertyByIdx(pIsolate, 2, jsObjectValue.get());
-    if (propertyValue->IsNull(pIsolate)) {
-      auto defaultValue = std::make_unique<CFXJSE_Value>();
-      GetObjectDefaultValue(pIsolate, jsObjectValue.get(), defaultValue.get());
-      return defaultValue->IsNull(pIsolate);
-    }
-
-    auto newPropertyValue = std::make_unique<CFXJSE_Value>();
-    jsObjectValue->GetObjectProperty(
-        pIsolate, propertyValue->ToString(pIsolate).AsStringView(),
-        newPropertyValue.get());
-    return newPropertyValue->IsNull(pIsolate);
-  }
-
-  auto defaultValue = std::make_unique<CFXJSE_Value>();
-  GetObjectDefaultValue(pIsolate, arg, defaultValue.get());
-  return defaultValue->IsNull(pIsolate);
+  std::unique_ptr<CFXJSE_Value> extracted = GetExtractedValue(pIsolate, arg);
+  return !extracted || extracted->IsNull(pIsolate);
 }
 
 int32_t ValueToInteger(CFXJSE_HostObject* pHostObject, CFXJSE_Value* pValue) {