diff --git a/fxjs/BUILD.gn b/fxjs/BUILD.gn
index 2fb819c..f4fbe5f 100644
--- a/fxjs/BUILD.gn
+++ b/fxjs/BUILD.gn
@@ -112,8 +112,6 @@
 
     if (pdf_enable_xfa) {
       sources += [
-        "xfa/cfxjse_arguments.cpp",
-        "xfa/cfxjse_arguments.h",
         "xfa/cfxjse_class.cpp",
         "xfa/cfxjse_class.h",
         "xfa/cfxjse_context.cpp",
diff --git a/fxjs/cfx_v8.h b/fxjs/cfx_v8.h
index d46c368..210df7e 100644
--- a/fxjs/cfx_v8.h
+++ b/fxjs/cfx_v8.h
@@ -15,6 +15,17 @@
 
 class CFX_V8 {
  public:
+  static int ReentrantToInt32Helper(v8::Isolate* pIsolate,
+                                    v8::Local<v8::Value> pValue);
+  static bool ReentrantToBooleanHelper(v8::Isolate* pIsolate,
+                                       v8::Local<v8::Value> pValue);
+  static double ReentrantToDoubleHelper(v8::Isolate* pIsolate,
+                                        v8::Local<v8::Value> pValue);
+  static WideString ReentrantToWideStringHelper(v8::Isolate* pIsolate,
+                                                v8::Local<v8::Value> pValue);
+  static ByteString ReentrantToByteStringHelper(v8::Isolate* pIsolate,
+                                                v8::Local<v8::Value> pValue);
+
   explicit CFX_V8(v8::Isolate* pIsolate);
   virtual ~CFX_V8();
 
@@ -61,20 +72,6 @@
   void DisposeIsolate();
 
  private:
-  friend class CFXJSE_Arguments;
-  friend class CFXJSE_Value;
-
-  static int ReentrantToInt32Helper(v8::Isolate* pIsolate,
-                                    v8::Local<v8::Value> pValue);
-  static bool ReentrantToBooleanHelper(v8::Isolate* pIsolate,
-                                       v8::Local<v8::Value> pValue);
-  static double ReentrantToDoubleHelper(v8::Isolate* pIsolate,
-                                        v8::Local<v8::Value> pValue);
-  static WideString ReentrantToWideStringHelper(v8::Isolate* pIsolate,
-                                                v8::Local<v8::Value> pValue);
-  static ByteString ReentrantToByteStringHelper(v8::Isolate* pIsolate,
-                                                v8::Local<v8::Value> pValue);
-
   UnownedPtr<v8::Isolate> m_pIsolate;
 };
 
diff --git a/fxjs/xfa/cfxjse_arguments.cpp b/fxjs/xfa/cfxjse_arguments.cpp
deleted file mode 100644
index f878154..0000000
--- a/fxjs/xfa/cfxjse_arguments.cpp
+++ /dev/null
@@ -1,53 +0,0 @@
-// Copyright 2016 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "fxjs/xfa/cfxjse_arguments.h"
-
-#include "fxjs/cfx_v8.h"
-#include "fxjs/xfa/cfxjse_context.h"
-#include "fxjs/xfa/cfxjse_value.h"
-#include "third_party/base/ptr_util.h"
-
-CFXJSE_Arguments::CFXJSE_Arguments(
-    const v8::FunctionCallbackInfo<v8::Value>* pInfo,
-    CFXJSE_Value* pRetValue)
-    : m_pInfo(pInfo), m_pRetValue(pRetValue) {}
-
-CFXJSE_Arguments::~CFXJSE_Arguments() {}
-
-int32_t CFXJSE_Arguments::GetLength() const {
-  return m_pInfo->Length();
-}
-
-std::unique_ptr<CFXJSE_Value> CFXJSE_Arguments::GetValue(int32_t index) const {
-  auto pArgValue = pdfium::MakeUnique<CFXJSE_Value>(v8::Isolate::GetCurrent());
-  pArgValue->ForceSetValue((*m_pInfo)[index]);
-  return pArgValue;
-}
-
-bool CFXJSE_Arguments::GetBoolean(int32_t index) const {
-  return CFX_V8::ReentrantToBooleanHelper(m_pInfo->GetIsolate(),
-                                          (*m_pInfo)[index]);
-}
-
-int32_t CFXJSE_Arguments::GetInt32(int32_t index) const {
-  return CFX_V8::ReentrantToInt32Helper(m_pInfo->GetIsolate(),
-                                        (*m_pInfo)[index]);
-}
-
-float CFXJSE_Arguments::GetFloat(int32_t index) const {
-  return static_cast<float>(CFX_V8::ReentrantToDoubleHelper(
-      m_pInfo->GetIsolate(), (*m_pInfo)[index]));
-}
-
-ByteString CFXJSE_Arguments::GetUTF8String(int32_t index) const {
-  return CFX_V8::ReentrantToByteStringHelper(m_pInfo->GetIsolate(),
-                                             (*m_pInfo)[index]);
-}
-
-CFXJSE_Value* CFXJSE_Arguments::GetReturnValue() const {
-  return m_pRetValue.Get();
-}
diff --git a/fxjs/xfa/cfxjse_arguments.h b/fxjs/xfa/cfxjse_arguments.h
deleted file mode 100644
index e048bc2..0000000
--- a/fxjs/xfa/cfxjse_arguments.h
+++ /dev/null
@@ -1,37 +0,0 @@
-// Copyright 2016 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef FXJS_XFA_CFXJSE_ARGUMENTS_H_
-#define FXJS_XFA_CFXJSE_ARGUMENTS_H_
-
-#include <memory>
-
-#include "core/fxcrt/fx_string.h"
-#include "core/fxcrt/unowned_ptr.h"
-#include "v8/include/v8.h"
-
-class CFXJSE_Value;
-
-class CFXJSE_Arguments {
- public:
-  CFXJSE_Arguments(const v8::FunctionCallbackInfo<v8::Value>* pInfo,
-                   CFXJSE_Value* pRetValue);
-  ~CFXJSE_Arguments();
-
-  int32_t GetLength() const;
-  std::unique_ptr<CFXJSE_Value> GetValue(int32_t index) const;
-  bool GetBoolean(int32_t index) const;
-  int32_t GetInt32(int32_t index) const;
-  float GetFloat(int32_t index) const;
-  ByteString GetUTF8String(int32_t index) const;
-  CFXJSE_Value* GetReturnValue() const;
-
- private:
-  UnownedPtr<const v8::FunctionCallbackInfo<v8::Value>> const m_pInfo;
-  UnownedPtr<CFXJSE_Value> const m_pRetValue;
-};
-
-#endif  // FXJS_XFA_CFXJSE_ARGUMENTS_H_
diff --git a/fxjs/xfa/cfxjse_class.cpp b/fxjs/xfa/cfxjse_class.cpp
index 2934a85..d3a83be 100644
--- a/fxjs/xfa/cfxjse_class.cpp
+++ b/fxjs/xfa/cfxjse_class.cpp
@@ -11,7 +11,6 @@
 
 #include "fxjs/cjs_result.h"
 #include "fxjs/js_resources.h"
-#include "fxjs/xfa/cfxjse_arguments.h"
 #include "fxjs/xfa/cfxjse_context.h"
 #include "fxjs/xfa/cfxjse_isolatetracker.h"
 #include "fxjs/xfa/cfxjse_value.h"
@@ -43,8 +42,8 @@
   auto lpThisValue = pdfium::MakeUnique<CFXJSE_Value>(info.GetIsolate());
   lpThisValue->ForceSetValue(info.Holder());
   auto lpRetValue = pdfium::MakeUnique<CFXJSE_Value>(info.GetIsolate());
-  CFXJSE_Arguments impl(&info, lpRetValue.get());
-  lpFunctionInfo->callbackProc(lpThisValue.get(), szFunctionName, impl);
+  lpFunctionInfo->callbackProc(lpThisValue.get(), szFunctionName, info,
+                               lpRetValue.get());
   if (!lpRetValue->DirectGetValue().IsEmpty())
     info.GetReturnValue().Set(lpRetValue->DirectGetValue());
 }
diff --git a/fxjs/xfa/cfxjse_formcalc_context.cpp b/fxjs/xfa/cfxjse_formcalc_context.cpp
index 604f679..f436c9a 100644
--- a/fxjs/xfa/cfxjse_formcalc_context.cpp
+++ b/fxjs/xfa/cfxjse_formcalc_context.cpp
@@ -14,7 +14,6 @@
 #include "core/fxcrt/cfx_widetextbuf.h"
 #include "core/fxcrt/fx_extension.h"
 #include "core/fxcrt/fx_random.h"
-#include "fxjs/xfa/cfxjse_arguments.h"
 #include "fxjs/xfa/cfxjse_class.h"
 #include "fxjs/xfa/cfxjse_context.h"
 #include "fxjs/xfa/cfxjse_engine.h"
@@ -1360,17 +1359,19 @@
 };
 
 // static
-void CFXJSE_FormCalcContext::Abs(CFXJSE_Value* pThis,
-                                 ByteStringView bsFuncName,
-                                 CFXJSE_Arguments& args) {
-  if (args.GetLength() != 1) {
+void CFXJSE_FormCalcContext::Abs(
+    CFXJSE_Value* pThis,
+    ByteStringView bsFuncName,
+    const v8::FunctionCallbackInfo<v8::Value>& info,
+    CFXJSE_Value* pRetValue) {
+  if (info.Length() != 1) {
     ToFormCalcContext(pThis)->ThrowParamCountMismatchException(L"Abs");
     return;
   }
 
-  std::unique_ptr<CFXJSE_Value> argOne = args.GetValue(0);
+  auto argOne = pdfium::MakeUnique<CFXJSE_Value>(info.GetIsolate(), info[0]);
   if (ValueIsNull(pThis, argOne.get())) {
-    args.GetReturnValue()->SetNull();
+    pRetValue->SetNull();
     return;
   }
 
@@ -1378,16 +1379,18 @@
   if (dValue < 0)
     dValue = -dValue;
 
-  args.GetReturnValue()->SetDouble(dValue);
+  pRetValue->SetDouble(dValue);
 }
 
 // static
-void CFXJSE_FormCalcContext::Avg(CFXJSE_Value* pThis,
-                                 ByteStringView bsFuncName,
-                                 CFXJSE_Arguments& args) {
-  int32_t argc = args.GetLength();
+void CFXJSE_FormCalcContext::Avg(
+    CFXJSE_Value* pThis,
+    ByteStringView bsFuncName,
+    const v8::FunctionCallbackInfo<v8::Value>& info,
+    CFXJSE_Value* pRetValue) {
+  int32_t argc = info.Length();
   if (argc < 1) {
-    args.GetReturnValue()->SetNull();
+    pRetValue->SetNull();
     return;
   }
 
@@ -1395,7 +1398,8 @@
   uint32_t uCount = 0;
   double dSum = 0.0;
   for (int32_t i = 0; i < argc; i++) {
-    std::unique_ptr<CFXJSE_Value> argValue = args.GetValue(i);
+    auto argValue =
+        pdfium::MakeUnique<CFXJSE_Value>(info.GetIsolate(), info[i]);
     if (argValue->IsNull())
       continue;
 
@@ -1441,40 +1445,45 @@
     }
   }
   if (uCount == 0) {
-    args.GetReturnValue()->SetNull();
+    pRetValue->SetNull();
     return;
   }
 
-  args.GetReturnValue()->SetDouble(dSum / uCount);
+  pRetValue->SetDouble(dSum / uCount);
 }
 
 // static
-void CFXJSE_FormCalcContext::Ceil(CFXJSE_Value* pThis,
-                                  ByteStringView bsFuncName,
-                                  CFXJSE_Arguments& args) {
-  if (args.GetLength() != 1) {
+void CFXJSE_FormCalcContext::Ceil(
+    CFXJSE_Value* pThis,
+    ByteStringView bsFuncName,
+    const v8::FunctionCallbackInfo<v8::Value>& info,
+    CFXJSE_Value* pRetValue) {
+  if (info.Length() != 1) {
     ToFormCalcContext(pThis)->ThrowParamCountMismatchException(L"Ceil");
     return;
   }
 
-  std::unique_ptr<CFXJSE_Value> argValue = GetSimpleValue(pThis, args, 0);
+  std::unique_ptr<CFXJSE_Value> argValue = GetSimpleValue(pThis, info, 0);
   if (ValueIsNull(pThis, argValue.get())) {
-    args.GetReturnValue()->SetNull();
+    pRetValue->SetNull();
     return;
   }
 
-  args.GetReturnValue()->SetFloat(ceil(ValueToFloat(pThis, argValue.get())));
+  pRetValue->SetFloat(ceil(ValueToFloat(pThis, argValue.get())));
 }
 
 // static
-void CFXJSE_FormCalcContext::Count(CFXJSE_Value* pThis,
-                                   ByteStringView bsFuncName,
-                                   CFXJSE_Arguments& args) {
+void CFXJSE_FormCalcContext::Count(
+    CFXJSE_Value* pThis,
+    ByteStringView bsFuncName,
+    const v8::FunctionCallbackInfo<v8::Value>& info,
+    CFXJSE_Value* pRetValue) {
   CFXJSE_FormCalcContext* pContext = ToFormCalcContext(pThis);
   v8::Isolate* pIsolate = pContext->GetScriptRuntime();
   int32_t iCount = 0;
-  for (int32_t i = 0; i < args.GetLength(); i++) {
-    std::unique_ptr<CFXJSE_Value> argValue = args.GetValue(i);
+  for (int32_t i = 0; i < info.Length(); i++) {
+    auto argValue =
+        pdfium::MakeUnique<CFXJSE_Value>(info.GetIsolate(), info[i]);
     if (argValue->IsNull())
       continue;
 
@@ -1517,37 +1526,42 @@
       iCount++;
     }
   }
-  args.GetReturnValue()->SetInteger(iCount);
+  pRetValue->SetInteger(iCount);
 }
 
 // static
-void CFXJSE_FormCalcContext::Floor(CFXJSE_Value* pThis,
-                                   ByteStringView bsFuncName,
-                                   CFXJSE_Arguments& args) {
-  if (args.GetLength() != 1) {
+void CFXJSE_FormCalcContext::Floor(
+    CFXJSE_Value* pThis,
+    ByteStringView bsFuncName,
+    const v8::FunctionCallbackInfo<v8::Value>& info,
+    CFXJSE_Value* pRetValue) {
+  if (info.Length() != 1) {
     ToFormCalcContext(pThis)->ThrowParamCountMismatchException(L"Floor");
     return;
   }
 
-  std::unique_ptr<CFXJSE_Value> argValue = GetSimpleValue(pThis, args, 0);
+  std::unique_ptr<CFXJSE_Value> argValue = GetSimpleValue(pThis, info, 0);
   if (ValueIsNull(pThis, argValue.get())) {
-    args.GetReturnValue()->SetNull();
+    pRetValue->SetNull();
     return;
   }
 
-  args.GetReturnValue()->SetFloat(floor(ValueToFloat(pThis, argValue.get())));
+  pRetValue->SetFloat(floor(ValueToFloat(pThis, argValue.get())));
 }
 
 // static
-void CFXJSE_FormCalcContext::Max(CFXJSE_Value* pThis,
-                                 ByteStringView bsFuncName,
-                                 CFXJSE_Arguments& args) {
+void CFXJSE_FormCalcContext::Max(
+    CFXJSE_Value* pThis,
+    ByteStringView bsFuncName,
+    const v8::FunctionCallbackInfo<v8::Value>& info,
+    CFXJSE_Value* pRetValue) {
   CFXJSE_FormCalcContext* pContext = ToFormCalcContext(pThis);
   v8::Isolate* pIsolate = pContext->GetScriptRuntime();
   uint32_t uCount = 0;
   double dMaxValue = 0.0;
-  for (int32_t i = 0; i < args.GetLength(); i++) {
-    std::unique_ptr<CFXJSE_Value> argValue = args.GetValue(i);
+  for (int32_t i = 0; i < info.Length(); i++) {
+    auto argValue =
+        pdfium::MakeUnique<CFXJSE_Value>(info.GetIsolate(), info[i]);
     if (argValue->IsNull())
       continue;
 
@@ -1605,23 +1619,26 @@
     }
   }
   if (uCount == 0) {
-    args.GetReturnValue()->SetNull();
+    pRetValue->SetNull();
     return;
   }
 
-  args.GetReturnValue()->SetDouble(dMaxValue);
+  pRetValue->SetDouble(dMaxValue);
 }
 
 // static
-void CFXJSE_FormCalcContext::Min(CFXJSE_Value* pThis,
-                                 ByteStringView bsFuncName,
-                                 CFXJSE_Arguments& args) {
+void CFXJSE_FormCalcContext::Min(
+    CFXJSE_Value* pThis,
+    ByteStringView bsFuncName,
+    const v8::FunctionCallbackInfo<v8::Value>& info,
+    CFXJSE_Value* pRetValue) {
   CFXJSE_FormCalcContext* pContext = ToFormCalcContext(pThis);
   v8::Isolate* pIsolate = pContext->GetScriptRuntime();
   uint32_t uCount = 0;
   double dMinValue = 0.0;
-  for (int32_t i = 0; i < args.GetLength(); i++) {
-    std::unique_ptr<CFXJSE_Value> argValue = args.GetValue(i);
+  for (int32_t i = 0; i < info.Length(); i++) {
+    auto argValue =
+        pdfium::MakeUnique<CFXJSE_Value>(info.GetIsolate(), info[i]);
     if (argValue->IsNull())
       continue;
 
@@ -1679,27 +1696,29 @@
     }
   }
   if (uCount == 0) {
-    args.GetReturnValue()->SetNull();
+    pRetValue->SetNull();
     return;
   }
 
-  args.GetReturnValue()->SetDouble(dMinValue);
+  pRetValue->SetDouble(dMinValue);
 }
 
 // static
-void CFXJSE_FormCalcContext::Mod(CFXJSE_Value* pThis,
-                                 ByteStringView bsFuncName,
-                                 CFXJSE_Arguments& args) {
+void CFXJSE_FormCalcContext::Mod(
+    CFXJSE_Value* pThis,
+    ByteStringView bsFuncName,
+    const v8::FunctionCallbackInfo<v8::Value>& info,
+    CFXJSE_Value* pRetValue) {
   CFXJSE_FormCalcContext* pContext = ToFormCalcContext(pThis);
-  if (args.GetLength() != 2) {
+  if (info.Length() != 2) {
     pContext->ThrowParamCountMismatchException(L"Mod");
     return;
   }
 
-  std::unique_ptr<CFXJSE_Value> argOne = args.GetValue(0);
-  std::unique_ptr<CFXJSE_Value> argTwo = args.GetValue(1);
+  auto argOne = pdfium::MakeUnique<CFXJSE_Value>(info.GetIsolate(), info[0]);
+  auto argTwo = pdfium::MakeUnique<CFXJSE_Value>(info.GetIsolate(), info[1]);
   if (argOne->IsNull() || argTwo->IsNull()) {
-    args.GetReturnValue()->SetNull();
+    pRetValue->SetNull();
     return;
   }
 
@@ -1717,24 +1736,25 @@
     return;
   }
 
-  args.GetReturnValue()->SetDouble(dDividend -
-                                   dDivisor * (int32_t)(dDividend / dDivisor));
+  pRetValue->SetDouble(dDividend - dDivisor * (int32_t)(dDividend / dDivisor));
 }
 
 // static
-void CFXJSE_FormCalcContext::Round(CFXJSE_Value* pThis,
-                                   ByteStringView bsFuncName,
-                                   CFXJSE_Arguments& args) {
+void CFXJSE_FormCalcContext::Round(
+    CFXJSE_Value* pThis,
+    ByteStringView bsFuncName,
+    const v8::FunctionCallbackInfo<v8::Value>& info,
+    CFXJSE_Value* pRetValue) {
   CFXJSE_FormCalcContext* pContext = ToFormCalcContext(pThis);
-  int32_t argc = args.GetLength();
+  int32_t argc = info.Length();
   if (argc < 1 || argc > 2) {
     pContext->ThrowParamCountMismatchException(L"Round");
     return;
   }
 
-  std::unique_ptr<CFXJSE_Value> argOne = args.GetValue(0);
+  auto argOne = pdfium::MakeUnique<CFXJSE_Value>(info.GetIsolate(), info[0]);
   if (argOne->IsNull()) {
-    args.GetReturnValue()->SetNull();
+    pRetValue->SetNull();
     return;
   }
 
@@ -1747,9 +1767,9 @@
 
   uint8_t uPrecision = 0;
   if (argc > 1) {
-    std::unique_ptr<CFXJSE_Value> argTwo = args.GetValue(1);
+    auto argTwo = pdfium::MakeUnique<CFXJSE_Value>(info.GetIsolate(), info[1]);
     if (argTwo->IsNull()) {
-      args.GetReturnValue()->SetNull();
+      pRetValue->SetNull();
       return;
     }
 
@@ -1764,16 +1784,18 @@
   }
 
   CFGAS_Decimal decimalValue(static_cast<float>(dValue), uPrecision);
-  args.GetReturnValue()->SetDouble(decimalValue.ToDouble());
+  pRetValue->SetDouble(decimalValue.ToDouble());
 }
 
 // static
-void CFXJSE_FormCalcContext::Sum(CFXJSE_Value* pThis,
-                                 ByteStringView bsFuncName,
-                                 CFXJSE_Arguments& args) {
-  int32_t argc = args.GetLength();
+void CFXJSE_FormCalcContext::Sum(
+    CFXJSE_Value* pThis,
+    ByteStringView bsFuncName,
+    const v8::FunctionCallbackInfo<v8::Value>& info,
+    CFXJSE_Value* pRetValue) {
+  int32_t argc = info.Length();
   if (argc == 0) {
-    args.GetReturnValue()->SetNull();
+    pRetValue->SetNull();
     return;
   }
 
@@ -1782,7 +1804,8 @@
   uint32_t uCount = 0;
   double dSum = 0.0;
   for (int32_t i = 0; i < argc; i++) {
-    std::unique_ptr<CFXJSE_Value> argValue = args.GetValue(i);
+    auto argValue =
+        pdfium::MakeUnique<CFXJSE_Value>(info.GetIsolate(), info[i]);
     if (argValue->IsNull())
       continue;
 
@@ -1835,18 +1858,20 @@
     }
   }
   if (uCount == 0) {
-    args.GetReturnValue()->SetNull();
+    pRetValue->SetNull();
     return;
   }
 
-  args.GetReturnValue()->SetDouble(dSum);
+  pRetValue->SetDouble(dSum);
 }
 
 // static
-void CFXJSE_FormCalcContext::Date(CFXJSE_Value* pThis,
-                                  ByteStringView bsFuncName,
-                                  CFXJSE_Arguments& args) {
-  if (args.GetLength() != 0) {
+void CFXJSE_FormCalcContext::Date(
+    CFXJSE_Value* pThis,
+    ByteStringView bsFuncName,
+    const v8::FunctionCallbackInfo<v8::Value>& info,
+    CFXJSE_Value* pRetValue) {
+  if (info.Length() != 0) {
     ToFormCalcContext(pThis)->ThrowParamCountMismatchException(L"Date");
     return;
   }
@@ -1855,34 +1880,36 @@
   FXSYS_time(&currentTime);
   struct tm* pTmStruct = gmtime(&currentTime);
 
-  args.GetReturnValue()->SetInteger(DateString2Num(
+  pRetValue->SetInteger(DateString2Num(
       ByteString::Format("%d%02d%02d", pTmStruct->tm_year + 1900,
                          pTmStruct->tm_mon + 1, pTmStruct->tm_mday)
           .AsStringView()));
 }
 
 // static
-void CFXJSE_FormCalcContext::Date2Num(CFXJSE_Value* pThis,
-                                      ByteStringView bsFuncName,
-                                      CFXJSE_Arguments& args) {
-  int32_t argc = args.GetLength();
+void CFXJSE_FormCalcContext::Date2Num(
+    CFXJSE_Value* pThis,
+    ByteStringView bsFuncName,
+    const v8::FunctionCallbackInfo<v8::Value>& info,
+    CFXJSE_Value* pRetValue) {
+  int32_t argc = info.Length();
   if (argc < 1 || argc > 3) {
     ToFormCalcContext(pThis)->ThrowParamCountMismatchException(L"Date2Num");
     return;
   }
 
-  std::unique_ptr<CFXJSE_Value> dateValue = GetSimpleValue(pThis, args, 0);
+  std::unique_ptr<CFXJSE_Value> dateValue = GetSimpleValue(pThis, info, 0);
   if (ValueIsNull(pThis, dateValue.get())) {
-    args.GetReturnValue()->SetNull();
+    pRetValue->SetNull();
     return;
   }
 
   ByteString bsDate = ValueToUTF8String(dateValue.get());
   ByteString bsFormat;
   if (argc > 1) {
-    std::unique_ptr<CFXJSE_Value> formatValue = GetSimpleValue(pThis, args, 1);
+    std::unique_ptr<CFXJSE_Value> formatValue = GetSimpleValue(pThis, info, 1);
     if (ValueIsNull(pThis, formatValue.get())) {
-      args.GetReturnValue()->SetNull();
+      pRetValue->SetNull();
       return;
     }
     bsFormat = ValueToUTF8String(formatValue.get());
@@ -1890,9 +1917,9 @@
 
   ByteString bsLocale;
   if (argc > 2) {
-    std::unique_ptr<CFXJSE_Value> localeValue = GetSimpleValue(pThis, args, 2);
+    std::unique_ptr<CFXJSE_Value> localeValue = GetSimpleValue(pThis, info, 2);
     if (ValueIsNull(pThis, localeValue.get())) {
-      args.GetReturnValue()->SetNull();
+      pRetValue->SetNull();
       return;
     }
     bsLocale = ValueToUTF8String(localeValue.get());
@@ -1901,14 +1928,16 @@
   ByteString bsIsoDate =
       Local2IsoDate(pThis, bsDate.AsStringView(), bsFormat.AsStringView(),
                     bsLocale.AsStringView());
-  args.GetReturnValue()->SetInteger(DateString2Num(bsIsoDate.AsStringView()));
+  pRetValue->SetInteger(DateString2Num(bsIsoDate.AsStringView()));
 }
 
 // static
-void CFXJSE_FormCalcContext::DateFmt(CFXJSE_Value* pThis,
-                                     ByteStringView bsFuncName,
-                                     CFXJSE_Arguments& args) {
-  int32_t argc = args.GetLength();
+void CFXJSE_FormCalcContext::DateFmt(
+    CFXJSE_Value* pThis,
+    ByteStringView bsFuncName,
+    const v8::FunctionCallbackInfo<v8::Value>& info,
+    CFXJSE_Value* pRetValue) {
+  int32_t argc = info.Length();
   if (argc > 2) {
     ToFormCalcContext(pThis)->ThrowParamCountMismatchException(L"Date2Num");
     return;
@@ -1916,22 +1945,22 @@
 
   int32_t iStyle = 0;
   if (argc > 0) {
-    std::unique_ptr<CFXJSE_Value> argStyle = GetSimpleValue(pThis, args, 0);
-    if (argStyle->IsNull()) {
-      args.GetReturnValue()->SetNull();
+    std::unique_ptr<CFXJSE_Value> infotyle = GetSimpleValue(pThis, info, 0);
+    if (infotyle->IsNull()) {
+      pRetValue->SetNull();
       return;
     }
 
-    iStyle = (int32_t)ValueToFloat(pThis, argStyle.get());
+    iStyle = (int32_t)ValueToFloat(pThis, infotyle.get());
     if (iStyle < 0 || iStyle > 4)
       iStyle = 0;
   }
 
   ByteString bsLocale;
   if (argc > 1) {
-    std::unique_ptr<CFXJSE_Value> argLocale = GetSimpleValue(pThis, args, 1);
+    std::unique_ptr<CFXJSE_Value> argLocale = GetSimpleValue(pThis, info, 1);
     if (argLocale->IsNull()) {
-      args.GetReturnValue()->SetNull();
+      pRetValue->SetNull();
       return;
     }
     bsLocale = ValueToUTF8String(argLocale.get());
@@ -1939,39 +1968,43 @@
 
   ByteString bsFormat =
       GetStandardDateFormat(pThis, iStyle, bsLocale.AsStringView());
-  args.GetReturnValue()->SetString(bsFormat.AsStringView());
+  pRetValue->SetString(bsFormat.AsStringView());
 }
 
 // static
-void CFXJSE_FormCalcContext::IsoDate2Num(CFXJSE_Value* pThis,
-                                         ByteStringView bsFuncName,
-                                         CFXJSE_Arguments& args) {
-  if (args.GetLength() != 1) {
+void CFXJSE_FormCalcContext::IsoDate2Num(
+    CFXJSE_Value* pThis,
+    ByteStringView bsFuncName,
+    const v8::FunctionCallbackInfo<v8::Value>& info,
+    CFXJSE_Value* pRetValue) {
+  if (info.Length() != 1) {
     ToFormCalcContext(pThis)->ThrowParamCountMismatchException(L"IsoDate2Num");
     return;
   }
-  std::unique_ptr<CFXJSE_Value> argOne = GetSimpleValue(pThis, args, 0);
+  std::unique_ptr<CFXJSE_Value> argOne = GetSimpleValue(pThis, info, 0);
   if (argOne->IsNull()) {
-    args.GetReturnValue()->SetNull();
+    pRetValue->SetNull();
     return;
   }
   ByteString bsArg = ValueToUTF8String(argOne.get());
-  args.GetReturnValue()->SetInteger(DateString2Num(bsArg.AsStringView()));
+  pRetValue->SetInteger(DateString2Num(bsArg.AsStringView()));
 }
 
 // static
-void CFXJSE_FormCalcContext::IsoTime2Num(CFXJSE_Value* pThis,
-                                         ByteStringView bsFuncName,
-                                         CFXJSE_Arguments& args) {
+void CFXJSE_FormCalcContext::IsoTime2Num(
+    CFXJSE_Value* pThis,
+    ByteStringView bsFuncName,
+    const v8::FunctionCallbackInfo<v8::Value>& info,
+    CFXJSE_Value* pRetValue) {
   CFXJSE_FormCalcContext* pContext = ToFormCalcContext(pThis);
-  if (args.GetLength() != 1) {
+  if (info.Length() != 1) {
     pContext->ThrowParamCountMismatchException(L"IsoTime2Num");
     return;
   }
 
-  std::unique_ptr<CFXJSE_Value> argOne = GetSimpleValue(pThis, args, 0);
+  std::unique_ptr<CFXJSE_Value> argOne = GetSimpleValue(pThis, info, 0);
   if (ValueIsNull(pThis, argOne.get())) {
-    args.GetReturnValue()->SetNull();
+    pRetValue->SetNull();
     return;
   }
 
@@ -1980,7 +2013,7 @@
   ByteString bsArg = ValueToUTF8String(argOne.get());
   auto pos = bsArg.Find('T', 0);
   if (!pos.has_value() || pos.value() == bsArg.GetLength() - 1) {
-    args.GetReturnValue()->SetInteger(0);
+    pRetValue->SetInteger(0);
     return;
   }
   bsArg = bsArg.Last(bsArg.GetLength() - (pos.value() + 1));
@@ -1988,7 +2021,7 @@
   CXFA_LocaleValue timeValue(XFA_VT_TIME,
                              WideString::FromUTF8(bsArg.AsStringView()), pMgr);
   if (!timeValue.IsValid()) {
-    args.GetReturnValue()->SetInteger(0);
+    pRetValue->SetInteger(0);
     return;
   }
 
@@ -2009,15 +2042,17 @@
   hour = mins / 60;
   min = mins % 60;
 
-  args.GetReturnValue()->SetInteger(hour * 3600000 + min * 60000 +
-                                    second * 1000 + milSecond + 1);
+  pRetValue->SetInteger(hour * 3600000 + min * 60000 + second * 1000 +
+                        milSecond + 1);
 }
 
 // static
-void CFXJSE_FormCalcContext::LocalDateFmt(CFXJSE_Value* pThis,
-                                          ByteStringView bsFuncName,
-                                          CFXJSE_Arguments& args) {
-  int32_t argc = args.GetLength();
+void CFXJSE_FormCalcContext::LocalDateFmt(
+    CFXJSE_Value* pThis,
+    ByteStringView bsFuncName,
+    const v8::FunctionCallbackInfo<v8::Value>& info,
+    CFXJSE_Value* pRetValue) {
+  int32_t argc = info.Length();
   if (argc > 2) {
     ToFormCalcContext(pThis)->ThrowParamCountMismatchException(L"LocalDateFmt");
     return;
@@ -2025,21 +2060,21 @@
 
   int32_t iStyle = 0;
   if (argc > 0) {
-    std::unique_ptr<CFXJSE_Value> argStyle = GetSimpleValue(pThis, args, 0);
-    if (argStyle->IsNull()) {
-      args.GetReturnValue()->SetNull();
+    std::unique_ptr<CFXJSE_Value> infotyle = GetSimpleValue(pThis, info, 0);
+    if (infotyle->IsNull()) {
+      pRetValue->SetNull();
       return;
     }
-    iStyle = (int32_t)ValueToFloat(pThis, argStyle.get());
+    iStyle = (int32_t)ValueToFloat(pThis, infotyle.get());
     if (iStyle > 4 || iStyle < 0)
       iStyle = 0;
   }
 
   ByteString bsLocale;
   if (argc > 1) {
-    std::unique_ptr<CFXJSE_Value> argLocale = GetSimpleValue(pThis, args, 1);
+    std::unique_ptr<CFXJSE_Value> argLocale = GetSimpleValue(pThis, info, 1);
     if (argLocale->IsNull()) {
-      args.GetReturnValue()->SetNull();
+      pRetValue->SetNull();
       return;
     }
     bsLocale = ValueToUTF8String(argLocale.get());
@@ -2047,14 +2082,16 @@
 
   ByteString bsFormat =
       GetLocalDateFormat(pThis, iStyle, bsLocale.AsStringView(), false);
-  args.GetReturnValue()->SetString(bsFormat.AsStringView());
+  pRetValue->SetString(bsFormat.AsStringView());
 }
 
 // static
-void CFXJSE_FormCalcContext::LocalTimeFmt(CFXJSE_Value* pThis,
-                                          ByteStringView bsFuncName,
-                                          CFXJSE_Arguments& args) {
-  int32_t argc = args.GetLength();
+void CFXJSE_FormCalcContext::LocalTimeFmt(
+    CFXJSE_Value* pThis,
+    ByteStringView bsFuncName,
+    const v8::FunctionCallbackInfo<v8::Value>& info,
+    CFXJSE_Value* pRetValue) {
+  int32_t argc = info.Length();
   if (argc > 2) {
     ToFormCalcContext(pThis)->ThrowParamCountMismatchException(L"LocalTimeFmt");
     return;
@@ -2062,21 +2099,21 @@
 
   int32_t iStyle = 0;
   if (argc > 0) {
-    std::unique_ptr<CFXJSE_Value> argStyle = GetSimpleValue(pThis, args, 0);
-    if (argStyle->IsNull()) {
-      args.GetReturnValue()->SetNull();
+    std::unique_ptr<CFXJSE_Value> infotyle = GetSimpleValue(pThis, info, 0);
+    if (infotyle->IsNull()) {
+      pRetValue->SetNull();
       return;
     }
-    iStyle = (int32_t)ValueToFloat(pThis, argStyle.get());
+    iStyle = (int32_t)ValueToFloat(pThis, infotyle.get());
     if (iStyle > 4 || iStyle < 0)
       iStyle = 0;
   }
 
   ByteString bsLocale;
   if (argc > 1) {
-    std::unique_ptr<CFXJSE_Value> argLocale = GetSimpleValue(pThis, args, 1);
+    std::unique_ptr<CFXJSE_Value> argLocale = GetSimpleValue(pThis, info, 1);
     if (argLocale->IsNull()) {
-      args.GetReturnValue()->SetNull();
+      pRetValue->SetNull();
       return;
     }
     bsLocale = ValueToUTF8String(argLocale.get());
@@ -2084,35 +2121,37 @@
 
   ByteString bsFormat =
       GetLocalTimeFormat(pThis, iStyle, bsLocale.AsStringView(), false);
-  args.GetReturnValue()->SetString(bsFormat.AsStringView());
+  pRetValue->SetString(bsFormat.AsStringView());
 }
 
 // static
-void CFXJSE_FormCalcContext::Num2Date(CFXJSE_Value* pThis,
-                                      ByteStringView bsFuncName,
-                                      CFXJSE_Arguments& args) {
-  int32_t argc = args.GetLength();
+void CFXJSE_FormCalcContext::Num2Date(
+    CFXJSE_Value* pThis,
+    ByteStringView bsFuncName,
+    const v8::FunctionCallbackInfo<v8::Value>& info,
+    CFXJSE_Value* pRetValue) {
+  int32_t argc = info.Length();
   if (argc < 1 || argc > 3) {
     ToFormCalcContext(pThis)->ThrowParamCountMismatchException(L"Num2Date");
     return;
   }
 
-  std::unique_ptr<CFXJSE_Value> dateValue = GetSimpleValue(pThis, args, 0);
+  std::unique_ptr<CFXJSE_Value> dateValue = GetSimpleValue(pThis, info, 0);
   if (ValueIsNull(pThis, dateValue.get())) {
-    args.GetReturnValue()->SetNull();
+    pRetValue->SetNull();
     return;
   }
   int32_t dDate = (int32_t)ValueToFloat(pThis, dateValue.get());
   if (dDate < 1) {
-    args.GetReturnValue()->SetNull();
+    pRetValue->SetNull();
     return;
   }
 
   ByteString bsFormat;
   if (argc > 1) {
-    std::unique_ptr<CFXJSE_Value> formatValue = GetSimpleValue(pThis, args, 1);
+    std::unique_ptr<CFXJSE_Value> formatValue = GetSimpleValue(pThis, info, 1);
     if (ValueIsNull(pThis, formatValue.get())) {
-      args.GetReturnValue()->SetNull();
+      pRetValue->SetNull();
       return;
     }
     bsFormat = ValueToUTF8String(formatValue.get());
@@ -2120,9 +2159,9 @@
 
   ByteString bsLocale;
   if (argc > 2) {
-    std::unique_ptr<CFXJSE_Value> localeValue = GetSimpleValue(pThis, args, 2);
+    std::unique_ptr<CFXJSE_Value> localeValue = GetSimpleValue(pThis, info, 2);
     if (ValueIsNull(pThis, localeValue.get())) {
-      args.GetReturnValue()->SetNull();
+      pRetValue->SetNull();
       return;
     }
     bsLocale = ValueToUTF8String(localeValue.get());
@@ -2224,35 +2263,37 @@
       pThis,
       ByteString::Format("%d%02d%02d", iYear + i, iMonth, iDay).AsStringView(),
       bsFormat.AsStringView(), bsLocale.AsStringView());
-  args.GetReturnValue()->SetString(bsLocalDate.AsStringView());
+  pRetValue->SetString(bsLocalDate.AsStringView());
 }
 
 // static
-void CFXJSE_FormCalcContext::Num2GMTime(CFXJSE_Value* pThis,
-                                        ByteStringView bsFuncName,
-                                        CFXJSE_Arguments& args) {
-  int32_t argc = args.GetLength();
+void CFXJSE_FormCalcContext::Num2GMTime(
+    CFXJSE_Value* pThis,
+    ByteStringView bsFuncName,
+    const v8::FunctionCallbackInfo<v8::Value>& info,
+    CFXJSE_Value* pRetValue) {
+  int32_t argc = info.Length();
   if (argc < 1 || argc > 3) {
     ToFormCalcContext(pThis)->ThrowParamCountMismatchException(L"Num2GMTime");
     return;
   }
 
-  std::unique_ptr<CFXJSE_Value> timeValue = GetSimpleValue(pThis, args, 0);
+  std::unique_ptr<CFXJSE_Value> timeValue = GetSimpleValue(pThis, info, 0);
   if (timeValue->IsNull()) {
-    args.GetReturnValue()->SetNull();
+    pRetValue->SetNull();
     return;
   }
   int32_t iTime = (int32_t)ValueToFloat(pThis, timeValue.get());
   if (abs(iTime) < 1.0) {
-    args.GetReturnValue()->SetNull();
+    pRetValue->SetNull();
     return;
   }
 
   ByteString bsFormat;
   if (argc > 1) {
-    std::unique_ptr<CFXJSE_Value> formatValue = GetSimpleValue(pThis, args, 1);
+    std::unique_ptr<CFXJSE_Value> formatValue = GetSimpleValue(pThis, info, 1);
     if (formatValue->IsNull()) {
-      args.GetReturnValue()->SetNull();
+      pRetValue->SetNull();
       return;
     }
     bsFormat = ValueToUTF8String(formatValue.get());
@@ -2260,9 +2301,9 @@
 
   ByteString bsLocale;
   if (argc > 2) {
-    std::unique_ptr<CFXJSE_Value> localeValue = GetSimpleValue(pThis, args, 2);
+    std::unique_ptr<CFXJSE_Value> localeValue = GetSimpleValue(pThis, info, 2);
     if (localeValue->IsNull()) {
-      args.GetReturnValue()->SetNull();
+      pRetValue->SetNull();
       return;
     }
     bsLocale = ValueToUTF8String(localeValue.get());
@@ -2270,35 +2311,37 @@
 
   ByteString bsGMTTime = Num2AllTime(pThis, iTime, bsFormat.AsStringView(),
                                      bsLocale.AsStringView(), true);
-  args.GetReturnValue()->SetString(bsGMTTime.AsStringView());
+  pRetValue->SetString(bsGMTTime.AsStringView());
 }
 
 // static
-void CFXJSE_FormCalcContext::Num2Time(CFXJSE_Value* pThis,
-                                      ByteStringView bsFuncName,
-                                      CFXJSE_Arguments& args) {
-  int32_t argc = args.GetLength();
+void CFXJSE_FormCalcContext::Num2Time(
+    CFXJSE_Value* pThis,
+    ByteStringView bsFuncName,
+    const v8::FunctionCallbackInfo<v8::Value>& info,
+    CFXJSE_Value* pRetValue) {
+  int32_t argc = info.Length();
   if (argc < 1 || argc > 3) {
     ToFormCalcContext(pThis)->ThrowParamCountMismatchException(L"Num2Time");
     return;
   }
 
-  std::unique_ptr<CFXJSE_Value> timeValue = GetSimpleValue(pThis, args, 0);
+  std::unique_ptr<CFXJSE_Value> timeValue = GetSimpleValue(pThis, info, 0);
   if (timeValue->IsNull()) {
-    args.GetReturnValue()->SetNull();
+    pRetValue->SetNull();
     return;
   }
   float fTime = ValueToFloat(pThis, timeValue.get());
   if (fabs(fTime) < 1.0) {
-    args.GetReturnValue()->SetNull();
+    pRetValue->SetNull();
     return;
   }
 
   ByteString bsFormat;
   if (argc > 1) {
-    std::unique_ptr<CFXJSE_Value> formatValue = GetSimpleValue(pThis, args, 1);
+    std::unique_ptr<CFXJSE_Value> formatValue = GetSimpleValue(pThis, info, 1);
     if (formatValue->IsNull()) {
-      args.GetReturnValue()->SetNull();
+      pRetValue->SetNull();
       return;
     }
     bsFormat = ValueToUTF8String(formatValue.get());
@@ -2306,9 +2349,9 @@
 
   ByteString bsLocale;
   if (argc > 2) {
-    std::unique_ptr<CFXJSE_Value> localeValue = GetSimpleValue(pThis, args, 2);
+    std::unique_ptr<CFXJSE_Value> localeValue = GetSimpleValue(pThis, info, 2);
     if (localeValue->IsNull()) {
-      args.GetReturnValue()->SetNull();
+      pRetValue->SetNull();
       return;
     }
     bsLocale = ValueToUTF8String(localeValue.get());
@@ -2317,49 +2360,52 @@
   ByteString bsLocalTime =
       Num2AllTime(pThis, static_cast<int32_t>(fTime), bsFormat.AsStringView(),
                   bsLocale.AsStringView(), false);
-  args.GetReturnValue()->SetString(bsLocalTime.AsStringView());
+  pRetValue->SetString(bsLocalTime.AsStringView());
 }
 
 // static
-void CFXJSE_FormCalcContext::Time(CFXJSE_Value* pThis,
-                                  ByteStringView bsFuncName,
-                                  CFXJSE_Arguments& args) {
-  if (args.GetLength() != 0) {
+void CFXJSE_FormCalcContext::Time(
+    CFXJSE_Value* pThis,
+    ByteStringView bsFuncName,
+    const v8::FunctionCallbackInfo<v8::Value>& info,
+    CFXJSE_Value* pRetValue) {
+  if (info.Length() != 0) {
     ToFormCalcContext(pThis)->ThrowParamCountMismatchException(L"Time");
     return;
   }
 
   time_t now;
   FXSYS_time(&now);
-
   struct tm* pGmt = gmtime(&now);
-  args.GetReturnValue()->SetInteger(
+  pRetValue->SetInteger(
       (pGmt->tm_hour * 3600 + pGmt->tm_min * 60 + pGmt->tm_sec) * 1000);
 }
 
 // static
-void CFXJSE_FormCalcContext::Time2Num(CFXJSE_Value* pThis,
-                                      ByteStringView bsFuncName,
-                                      CFXJSE_Arguments& args) {
-  int32_t argc = args.GetLength();
+void CFXJSE_FormCalcContext::Time2Num(
+    CFXJSE_Value* pThis,
+    ByteStringView bsFuncName,
+    const v8::FunctionCallbackInfo<v8::Value>& info,
+    CFXJSE_Value* pRetValue) {
+  int32_t argc = info.Length();
   if (argc < 1 || argc > 3) {
     ToFormCalcContext(pThis)->ThrowParamCountMismatchException(L"Time2Num");
     return;
   }
 
   ByteString bsTime;
-  std::unique_ptr<CFXJSE_Value> timeValue = GetSimpleValue(pThis, args, 0);
+  std::unique_ptr<CFXJSE_Value> timeValue = GetSimpleValue(pThis, info, 0);
   if (ValueIsNull(pThis, timeValue.get())) {
-    args.GetReturnValue()->SetNull();
+    pRetValue->SetNull();
     return;
   }
   bsTime = ValueToUTF8String(timeValue.get());
 
   ByteString bsFormat;
   if (argc > 1) {
-    std::unique_ptr<CFXJSE_Value> formatValue = GetSimpleValue(pThis, args, 1);
+    std::unique_ptr<CFXJSE_Value> formatValue = GetSimpleValue(pThis, info, 1);
     if (ValueIsNull(pThis, formatValue.get())) {
-      args.GetReturnValue()->SetNull();
+      pRetValue->SetNull();
       return;
     }
     bsFormat = ValueToUTF8String(formatValue.get());
@@ -2367,9 +2413,9 @@
 
   ByteString bsLocale;
   if (argc > 2) {
-    std::unique_ptr<CFXJSE_Value> localeValue = GetSimpleValue(pThis, args, 2);
+    std::unique_ptr<CFXJSE_Value> localeValue = GetSimpleValue(pThis, info, 2);
     if (ValueIsNull(pThis, localeValue.get())) {
-      args.GetReturnValue()->SetNull();
+      pRetValue->SetNull();
       return;
     }
     bsLocale = ValueToUTF8String(localeValue.get());
@@ -2397,7 +2443,7 @@
                                WideString::FromUTF8(bsTime.AsStringView()),
                                wsFormat, pLocale, pMgr);
   if (!localeValue.IsValid()) {
-    args.GetReturnValue()->SetInteger(0);
+    pRetValue->SetInteger(0);
     return;
   }
 
@@ -2417,15 +2463,17 @@
 
   hour = mins / 60;
   min = mins % 60;
-  args.GetReturnValue()->SetInteger(hour * 3600000 + min * 60000 +
-                                    second * 1000 + milSecond + 1);
+  pRetValue->SetInteger(hour * 3600000 + min * 60000 + second * 1000 +
+                        milSecond + 1);
 }
 
 // static
-void CFXJSE_FormCalcContext::TimeFmt(CFXJSE_Value* pThis,
-                                     ByteStringView bsFuncName,
-                                     CFXJSE_Arguments& args) {
-  int32_t argc = args.GetLength();
+void CFXJSE_FormCalcContext::TimeFmt(
+    CFXJSE_Value* pThis,
+    ByteStringView bsFuncName,
+    const v8::FunctionCallbackInfo<v8::Value>& info,
+    CFXJSE_Value* pRetValue) {
+  int32_t argc = info.Length();
   if (argc > 2) {
     ToFormCalcContext(pThis)->ThrowParamCountMismatchException(L"TimeFmt");
     return;
@@ -2433,21 +2481,21 @@
 
   int32_t iStyle = 0;
   if (argc > 0) {
-    std::unique_ptr<CFXJSE_Value> argStyle = GetSimpleValue(pThis, args, 0);
-    if (argStyle->IsNull()) {
-      args.GetReturnValue()->SetNull();
+    std::unique_ptr<CFXJSE_Value> infotyle = GetSimpleValue(pThis, info, 0);
+    if (infotyle->IsNull()) {
+      pRetValue->SetNull();
       return;
     }
-    iStyle = (int32_t)ValueToFloat(pThis, argStyle.get());
+    iStyle = (int32_t)ValueToFloat(pThis, infotyle.get());
     if (iStyle > 4 || iStyle < 0)
       iStyle = 0;
   }
 
   ByteString bsLocale;
   if (argc > 1) {
-    std::unique_ptr<CFXJSE_Value> argLocale = GetSimpleValue(pThis, args, 1);
+    std::unique_ptr<CFXJSE_Value> argLocale = GetSimpleValue(pThis, info, 1);
     if (argLocale->IsNull()) {
-      args.GetReturnValue()->SetNull();
+      pRetValue->SetNull();
       return;
     }
     bsLocale = ValueToUTF8String(argLocale.get());
@@ -2455,7 +2503,7 @@
 
   ByteString bsFormat =
       GetStandardTimeFormat(pThis, iStyle, bsLocale.AsStringView());
-  args.GetReturnValue()->SetString(bsFormat.AsStringView());
+  pRetValue->SetString(bsFormat.AsStringView());
 }
 
 // static
@@ -2597,21 +2645,23 @@
 }
 
 // static
-void CFXJSE_FormCalcContext::Apr(CFXJSE_Value* pThis,
-                                 ByteStringView bsFuncName,
-                                 CFXJSE_Arguments& args) {
+void CFXJSE_FormCalcContext::Apr(
+    CFXJSE_Value* pThis,
+    ByteStringView bsFuncName,
+    const v8::FunctionCallbackInfo<v8::Value>& info,
+    CFXJSE_Value* pRetValue) {
   CFXJSE_FormCalcContext* pContext = ToFormCalcContext(pThis);
-  if (args.GetLength() != 3) {
+  if (info.Length() != 3) {
     pContext->ThrowParamCountMismatchException(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);
+  std::unique_ptr<CFXJSE_Value> argOne = GetSimpleValue(pThis, info, 0);
+  std::unique_ptr<CFXJSE_Value> argTwo = GetSimpleValue(pThis, info, 1);
+  std::unique_ptr<CFXJSE_Value> argThree = GetSimpleValue(pThis, info, 2);
   if (ValueIsNull(pThis, argOne.get()) || ValueIsNull(pThis, argTwo.get()) ||
       ValueIsNull(pThis, argThree.get())) {
-    args.GetReturnValue()->SetNull();
+    pRetValue->SetNull();
     return;
   }
 
@@ -2635,7 +2685,7 @@
          (r * nTemp * nPeriods * (nTemp / (1 + r)))) /
         ((nTemp - 1) * (nTemp - 1));
     if (nDerivative == 0) {
-      args.GetReturnValue()->SetNull();
+      pRetValue->SetNull();
       return;
     }
 
@@ -2646,25 +2696,27 @@
     }
     nRet = r * nTemp / (nTemp - 1) - nPayment / nPrincipal;
   }
-  args.GetReturnValue()->SetDouble(r * 12);
+  pRetValue->SetDouble(r * 12);
 }
 
 // static
-void CFXJSE_FormCalcContext::CTerm(CFXJSE_Value* pThis,
-                                   ByteStringView bsFuncName,
-                                   CFXJSE_Arguments& args) {
+void CFXJSE_FormCalcContext::CTerm(
+    CFXJSE_Value* pThis,
+    ByteStringView bsFuncName,
+    const v8::FunctionCallbackInfo<v8::Value>& info,
+    CFXJSE_Value* pRetValue) {
   CFXJSE_FormCalcContext* pContext = ToFormCalcContext(pThis);
-  if (args.GetLength() != 3) {
+  if (info.Length() != 3) {
     pContext->ThrowParamCountMismatchException(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);
+  std::unique_ptr<CFXJSE_Value> argOne = GetSimpleValue(pThis, info, 0);
+  std::unique_ptr<CFXJSE_Value> argTwo = GetSimpleValue(pThis, info, 1);
+  std::unique_ptr<CFXJSE_Value> argThree = GetSimpleValue(pThis, info, 2);
   if (ValueIsNull(pThis, argOne.get()) || ValueIsNull(pThis, argTwo.get()) ||
       ValueIsNull(pThis, argThree.get())) {
-    args.GetReturnValue()->SetNull();
+    pRetValue->SetNull();
     return;
   }
 
@@ -2676,26 +2728,27 @@
     return;
   }
 
-  args.GetReturnValue()->SetFloat(log((float)(nFutureValue / nInitAmount)) /
-                                  log((float)(1 + nRate)));
+  pRetValue->SetFloat(log((float)(nFutureValue / nInitAmount)) /
+                      log((float)(1 + nRate)));
 }
 
 // static
 void CFXJSE_FormCalcContext::FV(CFXJSE_Value* pThis,
                                 ByteStringView bsFuncName,
-                                CFXJSE_Arguments& args) {
+                                const v8::FunctionCallbackInfo<v8::Value>& info,
+                                CFXJSE_Value* pRetValue) {
   CFXJSE_FormCalcContext* pContext = ToFormCalcContext(pThis);
-  if (args.GetLength() != 3) {
+  if (info.Length() != 3) {
     pContext->ThrowParamCountMismatchException(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);
+  std::unique_ptr<CFXJSE_Value> argOne = GetSimpleValue(pThis, info, 0);
+  std::unique_ptr<CFXJSE_Value> argTwo = GetSimpleValue(pThis, info, 1);
+  std::unique_ptr<CFXJSE_Value> argThree = GetSimpleValue(pThis, info, 2);
   if (ValueIsNull(pThis, argOne.get()) || ValueIsNull(pThis, argTwo.get()) ||
       ValueIsNull(pThis, argThree.get())) {
-    args.GetReturnValue()->SetNull();
+    pRetValue->SetNull();
     return;
   }
 
@@ -2718,28 +2771,30 @@
     dResult = nAmount * nPeriod;
   }
 
-  args.GetReturnValue()->SetDouble(dResult);
+  pRetValue->SetDouble(dResult);
 }
 
 // static
-void CFXJSE_FormCalcContext::IPmt(CFXJSE_Value* pThis,
-                                  ByteStringView bsFuncName,
-                                  CFXJSE_Arguments& args) {
+void CFXJSE_FormCalcContext::IPmt(
+    CFXJSE_Value* pThis,
+    ByteStringView bsFuncName,
+    const v8::FunctionCallbackInfo<v8::Value>& info,
+    CFXJSE_Value* pRetValue) {
   CFXJSE_FormCalcContext* pContext = ToFormCalcContext(pThis);
-  if (args.GetLength() != 5) {
+  if (info.Length() != 5) {
     pContext->ThrowParamCountMismatchException(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);
+  std::unique_ptr<CFXJSE_Value> argOne = GetSimpleValue(pThis, info, 0);
+  std::unique_ptr<CFXJSE_Value> argTwo = GetSimpleValue(pThis, info, 1);
+  std::unique_ptr<CFXJSE_Value> argThree = GetSimpleValue(pThis, info, 2);
+  std::unique_ptr<CFXJSE_Value> argFour = GetSimpleValue(pThis, info, 3);
+  std::unique_ptr<CFXJSE_Value> argFive = GetSimpleValue(pThis, info, 4);
   if (ValueIsNull(pThis, argOne.get()) || ValueIsNull(pThis, argTwo.get()) ||
       ValueIsNull(pThis, argThree.get()) || ValueIsNull(pThis, argFour.get()) ||
       ValueIsNull(pThis, argFive.get())) {
-    args.GetReturnValue()->SetNull();
+    pRetValue->SetNull();
     return;
   }
 
@@ -2762,7 +2817,7 @@
   int32_t iEnd = std::min((int32_t)(nFirstMonth + nNumberOfMonths - 1), iNums);
 
   if (nPayment < nPrincipalAmount * nRateOfMonth) {
-    args.GetReturnValue()->SetFloat(0);
+    pRetValue->SetFloat(0);
     return;
   }
 
@@ -2775,15 +2830,17 @@
     nSum += nPrincipalAmount * nRateOfMonth;
     nPrincipalAmount -= nPayment - nPrincipalAmount * nRateOfMonth;
   }
-  args.GetReturnValue()->SetFloat(nSum);
+  pRetValue->SetFloat(nSum);
 }
 
 // static
-void CFXJSE_FormCalcContext::NPV(CFXJSE_Value* pThis,
-                                 ByteStringView bsFuncName,
-                                 CFXJSE_Arguments& args) {
+void CFXJSE_FormCalcContext::NPV(
+    CFXJSE_Value* pThis,
+    ByteStringView bsFuncName,
+    const v8::FunctionCallbackInfo<v8::Value>& info,
+    CFXJSE_Value* pRetValue) {
   CFXJSE_FormCalcContext* pContext = ToFormCalcContext(pThis);
-  int32_t argc = args.GetLength();
+  int32_t argc = info.Length();
   if (argc < 3) {
     pContext->ThrowParamCountMismatchException(L"NPV");
     return;
@@ -2791,9 +2848,9 @@
 
   std::vector<std::unique_ptr<CFXJSE_Value>> argValues;
   for (int32_t i = 0; i < argc; i++) {
-    argValues.push_back(GetSimpleValue(pThis, args, i));
+    argValues.push_back(GetSimpleValue(pThis, info, i));
     if (ValueIsNull(pThis, argValues[i].get())) {
-      args.GetReturnValue()->SetNull();
+      pRetValue->SetNull();
       return;
     }
   }
@@ -2818,25 +2875,27 @@
     double nNum = data[iIndex++];
     nSum += nNum / nTemp;
   }
-  args.GetReturnValue()->SetDouble(nSum);
+  pRetValue->SetDouble(nSum);
 }
 
 // static
-void CFXJSE_FormCalcContext::Pmt(CFXJSE_Value* pThis,
-                                 ByteStringView bsFuncName,
-                                 CFXJSE_Arguments& args) {
+void CFXJSE_FormCalcContext::Pmt(
+    CFXJSE_Value* pThis,
+    ByteStringView bsFuncName,
+    const v8::FunctionCallbackInfo<v8::Value>& info,
+    CFXJSE_Value* pRetValue) {
   CFXJSE_FormCalcContext* pContext = ToFormCalcContext(pThis);
-  if (args.GetLength() != 3) {
+  if (info.Length() != 3) {
     pContext->ThrowParamCountMismatchException(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);
+  std::unique_ptr<CFXJSE_Value> argOne = GetSimpleValue(pThis, info, 0);
+  std::unique_ptr<CFXJSE_Value> argTwo = GetSimpleValue(pThis, info, 1);
+  std::unique_ptr<CFXJSE_Value> argThree = GetSimpleValue(pThis, info, 2);
   if (ValueIsNull(pThis, argOne.get()) || ValueIsNull(pThis, argTwo.get()) ||
       ValueIsNull(pThis, argThree.get())) {
-    args.GetReturnValue()->SetNull();
+    pRetValue->SetNull();
     return;
   }
 
@@ -2853,28 +2912,30 @@
   for (int32_t i = 0; i < nPeriods - 1; ++i)
     nSum *= nTmp;
 
-  args.GetReturnValue()->SetFloat((nPrincipal * nRate * nSum) / (nSum - 1));
+  pRetValue->SetFloat((nPrincipal * nRate * nSum) / (nSum - 1));
 }
 
 // static
-void CFXJSE_FormCalcContext::PPmt(CFXJSE_Value* pThis,
-                                  ByteStringView bsFuncName,
-                                  CFXJSE_Arguments& args) {
+void CFXJSE_FormCalcContext::PPmt(
+    CFXJSE_Value* pThis,
+    ByteStringView bsFuncName,
+    const v8::FunctionCallbackInfo<v8::Value>& info,
+    CFXJSE_Value* pRetValue) {
   CFXJSE_FormCalcContext* pContext = ToFormCalcContext(pThis);
-  if (args.GetLength() != 5) {
+  if (info.Length() != 5) {
     pContext->ThrowParamCountMismatchException(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);
+  std::unique_ptr<CFXJSE_Value> argOne = GetSimpleValue(pThis, info, 0);
+  std::unique_ptr<CFXJSE_Value> argTwo = GetSimpleValue(pThis, info, 1);
+  std::unique_ptr<CFXJSE_Value> argThree = GetSimpleValue(pThis, info, 2);
+  std::unique_ptr<CFXJSE_Value> argFour = GetSimpleValue(pThis, info, 3);
+  std::unique_ptr<CFXJSE_Value> argFive = GetSimpleValue(pThis, info, 4);
   if (ValueIsNull(pThis, argOne.get()) || ValueIsNull(pThis, argTwo.get()) ||
       ValueIsNull(pThis, argThree.get()) || ValueIsNull(pThis, argFour.get()) ||
       ValueIsNull(pThis, argFive.get())) {
-    args.GetReturnValue()->SetNull();
+    pRetValue->SetNull();
     return;
   }
 
@@ -2911,25 +2972,26 @@
     nSum += nTemp;
     nPrincipalAmount -= nTemp;
   }
-  args.GetReturnValue()->SetFloat(nSum);
+  pRetValue->SetFloat(nSum);
 }
 
 // static
 void CFXJSE_FormCalcContext::PV(CFXJSE_Value* pThis,
                                 ByteStringView bsFuncName,
-                                CFXJSE_Arguments& args) {
+                                const v8::FunctionCallbackInfo<v8::Value>& info,
+                                CFXJSE_Value* pRetValue) {
   CFXJSE_FormCalcContext* pContext = ToFormCalcContext(pThis);
-  if (args.GetLength() != 3) {
+  if (info.Length() != 3) {
     pContext->ThrowParamCountMismatchException(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);
+  std::unique_ptr<CFXJSE_Value> argOne = GetSimpleValue(pThis, info, 0);
+  std::unique_ptr<CFXJSE_Value> argTwo = GetSimpleValue(pThis, info, 1);
+  std::unique_ptr<CFXJSE_Value> argThree = GetSimpleValue(pThis, info, 2);
   if (ValueIsNull(pThis, argOne.get()) || ValueIsNull(pThis, argTwo.get()) ||
       ValueIsNull(pThis, argThree.get())) {
-    args.GetReturnValue()->SetNull();
+    pRetValue->SetNull();
     return;
   }
 
@@ -2946,25 +3008,27 @@
     nTemp *= 1 + nRate;
 
   nTemp = 1 / nTemp;
-  args.GetReturnValue()->SetDouble(nAmount * ((1 - nTemp) / nRate));
+  pRetValue->SetDouble(nAmount * ((1 - nTemp) / nRate));
 }
 
 // static
-void CFXJSE_FormCalcContext::Rate(CFXJSE_Value* pThis,
-                                  ByteStringView bsFuncName,
-                                  CFXJSE_Arguments& args) {
+void CFXJSE_FormCalcContext::Rate(
+    CFXJSE_Value* pThis,
+    ByteStringView bsFuncName,
+    const v8::FunctionCallbackInfo<v8::Value>& info,
+    CFXJSE_Value* pRetValue) {
   CFXJSE_FormCalcContext* pContext = ToFormCalcContext(pThis);
-  if (args.GetLength() != 3) {
+  if (info.Length() != 3) {
     pContext->ThrowParamCountMismatchException(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);
+  std::unique_ptr<CFXJSE_Value> argOne = GetSimpleValue(pThis, info, 0);
+  std::unique_ptr<CFXJSE_Value> argTwo = GetSimpleValue(pThis, info, 1);
+  std::unique_ptr<CFXJSE_Value> argThree = GetSimpleValue(pThis, info, 2);
   if (ValueIsNull(pThis, argOne.get()) || ValueIsNull(pThis, argTwo.get()) ||
       ValueIsNull(pThis, argThree.get())) {
-    args.GetReturnValue()->SetNull();
+    pRetValue->SetNull();
     return;
   }
 
@@ -2976,26 +3040,28 @@
     return;
   }
 
-  args.GetReturnValue()->SetFloat(
+  pRetValue->SetFloat(
       FXSYS_pow((float)(nFuture / nPresent), (float)(1 / nTotalNumber)) - 1);
 }
 
 // static
-void CFXJSE_FormCalcContext::Term(CFXJSE_Value* pThis,
-                                  ByteStringView bsFuncName,
-                                  CFXJSE_Arguments& args) {
+void CFXJSE_FormCalcContext::Term(
+    CFXJSE_Value* pThis,
+    ByteStringView bsFuncName,
+    const v8::FunctionCallbackInfo<v8::Value>& info,
+    CFXJSE_Value* pRetValue) {
   CFXJSE_FormCalcContext* pContext = ToFormCalcContext(pThis);
-  if (args.GetLength() != 3) {
+  if (info.Length() != 3) {
     pContext->ThrowParamCountMismatchException(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);
+  std::unique_ptr<CFXJSE_Value> argOne = GetSimpleValue(pThis, info, 0);
+  std::unique_ptr<CFXJSE_Value> argTwo = GetSimpleValue(pThis, info, 1);
+  std::unique_ptr<CFXJSE_Value> argThree = GetSimpleValue(pThis, info, 2);
   if (ValueIsNull(pThis, argOne.get()) || ValueIsNull(pThis, argTwo.get()) ||
       ValueIsNull(pThis, argThree.get())) {
-    args.GetReturnValue()->SetNull();
+    pRetValue->SetNull();
     return;
   }
 
@@ -3007,30 +3073,32 @@
     return;
   }
 
-  args.GetReturnValue()->SetFloat(log((float)(nFuture / nMount * nRate) + 1) /
-                                  log((float)(1 + nRate)));
+  pRetValue->SetFloat(log((float)(nFuture / nMount * nRate) + 1) /
+                      log((float)(1 + nRate)));
 }
 
 // static
-void CFXJSE_FormCalcContext::Choose(CFXJSE_Value* pThis,
-                                    ByteStringView bsFuncName,
-                                    CFXJSE_Arguments& args) {
+void CFXJSE_FormCalcContext::Choose(
+    CFXJSE_Value* pThis,
+    ByteStringView bsFuncName,
+    const v8::FunctionCallbackInfo<v8::Value>& info,
+    CFXJSE_Value* pRetValue) {
   CFXJSE_FormCalcContext* pContext = ToFormCalcContext(pThis);
-  int32_t argc = args.GetLength();
+  int32_t argc = info.Length();
   if (argc < 2) {
     pContext->ThrowParamCountMismatchException(L"Choose");
     return;
   }
 
-  std::unique_ptr<CFXJSE_Value> argOne = args.GetValue(0);
+  auto argOne = pdfium::MakeUnique<CFXJSE_Value>(info.GetIsolate(), info[0]);
   if (ValueIsNull(pThis, argOne.get())) {
-    args.GetReturnValue()->SetNull();
+    pRetValue->SetNull();
     return;
   }
 
   int32_t iIndex = (int32_t)ValueToFloat(pThis, argOne.get());
   if (iIndex < 1) {
-    args.GetReturnValue()->SetString("");
+    pRetValue->SetString("");
     return;
   }
 
@@ -3040,7 +3108,8 @@
   int32_t iValueIndex = 0;
   v8::Isolate* pIsolate = pContext->GetScriptRuntime();
   while (!bFound && !bStopCounterFlags && (iArgIndex < argc)) {
-    std::unique_ptr<CFXJSE_Value> argIndexValue = args.GetValue(iArgIndex);
+    auto argIndexValue =
+        pdfium::MakeUnique<CFXJSE_Value>(info.GetIsolate(), info[iArgIndex]);
     if (argIndexValue->IsArray()) {
       auto lengthValue = pdfium::MakeUnique<CFXJSE_Value>(pIsolate);
       argIndexValue->GetObjectProperty("length", lengthValue.get());
@@ -3063,139 +3132,149 @@
               propertyValue->ToString().AsStringView(), newPropertyValue.get());
         }
         ByteString bsChosen = ValueToUTF8String(newPropertyValue.get());
-        args.GetReturnValue()->SetString(bsChosen.AsStringView());
+        pRetValue->SetString(bsChosen.AsStringView());
         bFound = true;
       }
     } else {
       iValueIndex++;
       if (iValueIndex == iIndex) {
         ByteString bsChosen = ValueToUTF8String(argIndexValue.get());
-        args.GetReturnValue()->SetString(bsChosen.AsStringView());
+        pRetValue->SetString(bsChosen.AsStringView());
         bFound = true;
       }
     }
     iArgIndex++;
   }
   if (!bFound)
-    args.GetReturnValue()->SetString("");
+    pRetValue->SetString("");
 }
 
 // static
-void CFXJSE_FormCalcContext::Exists(CFXJSE_Value* pThis,
-                                    ByteStringView bsFuncName,
-                                    CFXJSE_Arguments& args) {
-  if (args.GetLength() != 1) {
+void CFXJSE_FormCalcContext::Exists(
+    CFXJSE_Value* pThis,
+    ByteStringView bsFuncName,
+    const v8::FunctionCallbackInfo<v8::Value>& info,
+    CFXJSE_Value* pRetValue) {
+  if (info.Length() != 1) {
     ToFormCalcContext(pThis)->ThrowParamCountMismatchException(L"Exists");
     return;
   }
-  args.GetReturnValue()->SetInteger(args.GetValue(0)->IsObject());
+  auto temp = pdfium::MakeUnique<CFXJSE_Value>(info.GetIsolate(), info[0]);
+  pRetValue->SetInteger(temp->IsObject());
 }
 
 // static
-void CFXJSE_FormCalcContext::HasValue(CFXJSE_Value* pThis,
-                                      ByteStringView bsFuncName,
-                                      CFXJSE_Arguments& args) {
-  if (args.GetLength() != 1) {
+void CFXJSE_FormCalcContext::HasValue(
+    CFXJSE_Value* pThis,
+    ByteStringView bsFuncName,
+    const v8::FunctionCallbackInfo<v8::Value>& info,
+    CFXJSE_Value* pRetValue) {
+  if (info.Length() != 1) {
     ToFormCalcContext(pThis)->ThrowParamCountMismatchException(L"HasValue");
     return;
   }
 
-  std::unique_ptr<CFXJSE_Value> argOne = GetSimpleValue(pThis, args, 0);
+  std::unique_ptr<CFXJSE_Value> argOne = GetSimpleValue(pThis, info, 0);
   if (!argOne->IsString()) {
-    args.GetReturnValue()->SetInteger(argOne->IsNumber() ||
-                                      argOne->IsBoolean());
+    pRetValue->SetInteger(argOne->IsNumber() || argOne->IsBoolean());
     return;
   }
 
   ByteString bsValue = argOne->ToString();
   bsValue.TrimLeft();
-  args.GetReturnValue()->SetInteger(!bsValue.IsEmpty());
+  pRetValue->SetInteger(!bsValue.IsEmpty());
 }
 
 // static
-void CFXJSE_FormCalcContext::Oneof(CFXJSE_Value* pThis,
-                                   ByteStringView bsFuncName,
-                                   CFXJSE_Arguments& args) {
-  if (args.GetLength() < 2) {
+void CFXJSE_FormCalcContext::Oneof(
+    CFXJSE_Value* pThis,
+    ByteStringView bsFuncName,
+    const v8::FunctionCallbackInfo<v8::Value>& info,
+    CFXJSE_Value* pRetValue) {
+  if (info.Length() < 2) {
     ToFormCalcContext(pThis)->ThrowParamCountMismatchException(L"Oneof");
     return;
   }
 
   bool bFlags = false;
-  std::unique_ptr<CFXJSE_Value> argOne = GetSimpleValue(pThis, args, 0);
-  for (const auto& value : unfoldArgs(pThis, args)) {
+  std::unique_ptr<CFXJSE_Value> argOne = GetSimpleValue(pThis, info, 0);
+  for (const auto& value : unfoldArgs(pThis, info)) {
     if (simpleValueCompare(pThis, argOne.get(), value.get())) {
       bFlags = true;
       break;
     }
   }
 
-  args.GetReturnValue()->SetInteger(bFlags);
+  pRetValue->SetInteger(bFlags);
 }
 
 // static
-void CFXJSE_FormCalcContext::Within(CFXJSE_Value* pThis,
-                                    ByteStringView bsFuncName,
-                                    CFXJSE_Arguments& args) {
-  if (args.GetLength() != 3) {
+void CFXJSE_FormCalcContext::Within(
+    CFXJSE_Value* pThis,
+    ByteStringView bsFuncName,
+    const v8::FunctionCallbackInfo<v8::Value>& info,
+    CFXJSE_Value* pRetValue) {
+  if (info.Length() != 3) {
     ToFormCalcContext(pThis)->ThrowParamCountMismatchException(L"Within");
     return;
   }
 
-  std::unique_ptr<CFXJSE_Value> argOne = GetSimpleValue(pThis, args, 0);
+  std::unique_ptr<CFXJSE_Value> argOne = GetSimpleValue(pThis, info, 0);
   if (argOne->IsNull()) {
-    args.GetReturnValue()->SetUndefined();
+    pRetValue->SetUndefined();
     return;
   }
 
-  std::unique_ptr<CFXJSE_Value> argLow = GetSimpleValue(pThis, args, 1);
-  std::unique_ptr<CFXJSE_Value> argHigh = GetSimpleValue(pThis, args, 2);
+  std::unique_ptr<CFXJSE_Value> argLow = GetSimpleValue(pThis, info, 1);
+  std::unique_ptr<CFXJSE_Value> argHigh = GetSimpleValue(pThis, info, 2);
   if (argOne->IsNumber()) {
     float oneNumber = ValueToFloat(pThis, argOne.get());
     float lowNumber = ValueToFloat(pThis, argLow.get());
     float heightNumber = ValueToFloat(pThis, argHigh.get());
-    args.GetReturnValue()->SetInteger((oneNumber >= lowNumber) &&
-                                      (oneNumber <= heightNumber));
+    pRetValue->SetInteger((oneNumber >= lowNumber) &&
+                          (oneNumber <= heightNumber));
     return;
   }
 
   ByteString bsOne = ValueToUTF8String(argOne.get());
   ByteString bsLow = ValueToUTF8String(argLow.get());
   ByteString bsHeight = ValueToUTF8String(argHigh.get());
-  args.GetReturnValue()->SetInteger(
-      (bsOne.Compare(bsLow.AsStringView()) >= 0) &&
-      (bsOne.Compare(bsHeight.AsStringView()) <= 0));
+  pRetValue->SetInteger((bsOne.Compare(bsLow.AsStringView()) >= 0) &&
+                        (bsOne.Compare(bsHeight.AsStringView()) <= 0));
 }
 
 // static
 void CFXJSE_FormCalcContext::If(CFXJSE_Value* pThis,
                                 ByteStringView bsFuncName,
-                                CFXJSE_Arguments& args) {
-  if (args.GetLength() != 3) {
+                                const v8::FunctionCallbackInfo<v8::Value>& info,
+                                CFXJSE_Value* pRetValue) {
+  if (info.Length() != 3) {
     ToFormCalcContext(pThis)->ThrowParamCountMismatchException(L"If");
     return;
   }
 
-  args.GetReturnValue()->Assign(GetSimpleValue(pThis, args, 0)->ToBoolean()
-                                    ? GetSimpleValue(pThis, args, 1).get()
-                                    : GetSimpleValue(pThis, args, 2).get());
+  pRetValue->Assign(GetSimpleValue(pThis, info, 0)->ToBoolean()
+                        ? GetSimpleValue(pThis, info, 1).get()
+                        : GetSimpleValue(pThis, info, 2).get());
 }
 
 // static
-void CFXJSE_FormCalcContext::Eval(CFXJSE_Value* pThis,
-                                  ByteStringView bsFuncName,
-                                  CFXJSE_Arguments& args) {
+void CFXJSE_FormCalcContext::Eval(
+    CFXJSE_Value* pThis,
+    ByteStringView bsFuncName,
+    const v8::FunctionCallbackInfo<v8::Value>& info,
+    CFXJSE_Value* pRetValue) {
   CFXJSE_FormCalcContext* pContext = ToFormCalcContext(pThis);
-  if (args.GetLength() != 1) {
+  if (info.Length() != 1) {
     pContext->ThrowParamCountMismatchException(L"Eval");
     return;
   }
 
   v8::Isolate* pIsolate = pContext->GetScriptRuntime();
-  std::unique_ptr<CFXJSE_Value> scriptValue = GetSimpleValue(pThis, args, 0);
+  std::unique_ptr<CFXJSE_Value> scriptValue = GetSimpleValue(pThis, info, 0);
   ByteString bsUtf8Script = ValueToUTF8String(scriptValue.get());
   if (bsUtf8Script.IsEmpty()) {
-    args.GetReturnValue()->SetNull();
+    pRetValue->SetNull();
     return;
   }
 
@@ -3215,21 +3294,23 @@
       FX_UTF8Encode(wsJavaScriptBuf.AsStringView()).c_str(), returnValue.get(),
       nullptr);
 
-  args.GetReturnValue()->Assign(returnValue.get());
+  pRetValue->Assign(returnValue.get());
 }
 
 // static
-void CFXJSE_FormCalcContext::Ref(CFXJSE_Value* pThis,
-                                 ByteStringView bsFuncName,
-                                 CFXJSE_Arguments& args) {
+void CFXJSE_FormCalcContext::Ref(
+    CFXJSE_Value* pThis,
+    ByteStringView bsFuncName,
+    const v8::FunctionCallbackInfo<v8::Value>& info,
+    CFXJSE_Value* pRetValue) {
   CFXJSE_FormCalcContext* pContext = ToFormCalcContext(pThis);
   v8::Isolate* pIsolate = pContext->GetScriptRuntime();
-  if (args.GetLength() != 1) {
+  if (info.Length() != 1) {
     pContext->ThrowParamCountMismatchException(L"Ref");
     return;
   }
 
-  std::unique_ptr<CFXJSE_Value> argOne = args.GetValue(0);
+  auto argOne = pdfium::MakeUnique<CFXJSE_Value>(info.GetIsolate(), info[0]);
   if (!argOne->IsArray() && !argOne->IsObject() && !argOne->IsBoolean() &&
       !argOne->IsString() && !argOne->IsNull() && !argOne->IsNumber()) {
     pContext->ThrowArgumentMismatchException();
@@ -3237,7 +3318,7 @@
   }
 
   if (argOne->IsBoolean() || argOne->IsString() || argOne->IsNumber()) {
-    args.GetReturnValue()->Assign(argOne.get());
+    pRetValue->Assign(argOne.get());
     return;
   }
 
@@ -3273,27 +3354,29 @@
 
   values[0]->SetInteger(intVal);
   values[1]->SetNull();
-  args.GetReturnValue()->SetArray(values);
+  pRetValue->SetArray(values);
 }
 
 // static
-void CFXJSE_FormCalcContext::UnitType(CFXJSE_Value* pThis,
-                                      ByteStringView bsFuncName,
-                                      CFXJSE_Arguments& args) {
-  if (args.GetLength() != 1) {
+void CFXJSE_FormCalcContext::UnitType(
+    CFXJSE_Value* pThis,
+    ByteStringView bsFuncName,
+    const v8::FunctionCallbackInfo<v8::Value>& info,
+    CFXJSE_Value* pRetValue) {
+  if (info.Length() != 1) {
     ToFormCalcContext(pThis)->ThrowParamCountMismatchException(L"UnitType");
     return;
   }
 
-  std::unique_ptr<CFXJSE_Value> unitspanValue = GetSimpleValue(pThis, args, 0);
+  std::unique_ptr<CFXJSE_Value> unitspanValue = GetSimpleValue(pThis, info, 0);
   if (unitspanValue->IsNull()) {
-    args.GetReturnValue()->SetNull();
+    pRetValue->SetNull();
     return;
   }
 
   ByteString bsUnitspan = ValueToUTF8String(unitspanValue.get());
   if (bsUnitspan.IsEmpty()) {
-    args.GetReturnValue()->SetString("in");
+    pRetValue->SetString("in");
     return;
   }
 
@@ -3366,43 +3449,45 @@
   }
   switch (eParserStatus) {
     case VALUETYPE_ISCM:
-      args.GetReturnValue()->SetString("cm");
+      pRetValue->SetString("cm");
       break;
     case VALUETYPE_ISMM:
-      args.GetReturnValue()->SetString("mm");
+      pRetValue->SetString("mm");
       break;
     case VALUETYPE_ISPT:
-      args.GetReturnValue()->SetString("pt");
+      pRetValue->SetString("pt");
       break;
     case VALUETYPE_ISMP:
-      args.GetReturnValue()->SetString("mp");
+      pRetValue->SetString("mp");
       break;
     default:
-      args.GetReturnValue()->SetString("in");
+      pRetValue->SetString("in");
       break;
   }
 }
 
 // static
-void CFXJSE_FormCalcContext::UnitValue(CFXJSE_Value* pThis,
-                                       ByteStringView bsFuncName,
-                                       CFXJSE_Arguments& args) {
-  int32_t argc = args.GetLength();
+void CFXJSE_FormCalcContext::UnitValue(
+    CFXJSE_Value* pThis,
+    ByteStringView bsFuncName,
+    const v8::FunctionCallbackInfo<v8::Value>& info,
+    CFXJSE_Value* pRetValue) {
+  int32_t argc = info.Length();
   if (argc < 1 || argc > 2) {
     ToFormCalcContext(pThis)->ThrowParamCountMismatchException(L"UnitValue");
     return;
   }
 
-  std::unique_ptr<CFXJSE_Value> unitspanValue = GetSimpleValue(pThis, args, 0);
+  std::unique_ptr<CFXJSE_Value> unitspanValue = GetSimpleValue(pThis, info, 0);
   if (unitspanValue->IsNull()) {
-    args.GetReturnValue()->SetNull();
+    pRetValue->SetNull();
     return;
   }
 
   ByteString bsUnitspan = ValueToUTF8String(unitspanValue.get());
   const char* pData = bsUnitspan.c_str();
   if (!pData) {
-    args.GetReturnValue()->SetInteger(0);
+    pRetValue->SetInteger(0);
     return;
   }
 
@@ -3434,7 +3519,7 @@
 
   ByteString bsUnit;
   if (argc > 1) {
-    std::unique_ptr<CFXJSE_Value> unitValue = GetSimpleValue(pThis, args, 1);
+    std::unique_ptr<CFXJSE_Value> unitValue = GetSimpleValue(pThis, info, 1);
     ByteString bsUnitTemp = ValueToUTF8String(unitValue.get());
     const char* pChar = bsUnitTemp.c_str();
     size_t uVal = 0;
@@ -3519,41 +3604,44 @@
     else
       dResult = dFirstNumber / 72000;
   }
-  args.GetReturnValue()->SetDouble(dResult);
+  pRetValue->SetDouble(dResult);
 }
 
 // static
 void CFXJSE_FormCalcContext::At(CFXJSE_Value* pThis,
                                 ByteStringView bsFuncName,
-                                CFXJSE_Arguments& args) {
-  if (args.GetLength() != 2) {
+                                const v8::FunctionCallbackInfo<v8::Value>& info,
+                                CFXJSE_Value* pRetValue) {
+  if (info.Length() != 2) {
     ToFormCalcContext(pThis)->ThrowParamCountMismatchException(L"At");
     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> argOne = GetSimpleValue(pThis, info, 0);
+  std::unique_ptr<CFXJSE_Value> argTwo = GetSimpleValue(pThis, info, 1);
   if (ValueIsNull(pThis, argOne.get()) || ValueIsNull(pThis, argTwo.get())) {
-    args.GetReturnValue()->SetNull();
+    pRetValue->SetNull();
     return;
   }
 
   ByteString stringTwo = ValueToUTF8String(argTwo.get());
   if (stringTwo.IsEmpty()) {
-    args.GetReturnValue()->SetInteger(1);
+    pRetValue->SetInteger(1);
     return;
   }
 
   ByteString stringOne = ValueToUTF8String(argOne.get());
   auto pos = stringOne.Find(stringTwo.AsStringView());
-  args.GetReturnValue()->SetInteger(pos.has_value() ? pos.value() + 1 : 0);
+  pRetValue->SetInteger(pos.has_value() ? pos.value() + 1 : 0);
 }
 
 // static
-void CFXJSE_FormCalcContext::Concat(CFXJSE_Value* pThis,
-                                    ByteStringView bsFuncName,
-                                    CFXJSE_Arguments& args) {
-  int32_t argc = args.GetLength();
+void CFXJSE_FormCalcContext::Concat(
+    CFXJSE_Value* pThis,
+    ByteStringView bsFuncName,
+    const v8::FunctionCallbackInfo<v8::Value>& info,
+    CFXJSE_Value* pRetValue) {
+  int32_t argc = info.Length();
   if (argc < 1) {
     ToFormCalcContext(pThis)->ThrowParamCountMismatchException(L"Concat");
     return;
@@ -3562,7 +3650,7 @@
   ByteString bsResult;
   bool bAllNull = true;
   for (int32_t i = 0; i < argc; i++) {
-    std::unique_ptr<CFXJSE_Value> value = GetSimpleValue(pThis, args, i);
+    std::unique_ptr<CFXJSE_Value> value = GetSimpleValue(pThis, info, i);
     if (ValueIsNull(pThis, value.get()))
       continue;
 
@@ -3571,42 +3659,43 @@
   }
 
   if (bAllNull) {
-    args.GetReturnValue()->SetNull();
+    pRetValue->SetNull();
     return;
   }
 
-  args.GetReturnValue()->SetString(bsResult.AsStringView());
+  pRetValue->SetString(bsResult.AsStringView());
 }
 
 // static
-void CFXJSE_FormCalcContext::Decode(CFXJSE_Value* pThis,
-                                    ByteStringView bsFuncName,
-                                    CFXJSE_Arguments& args) {
-  int32_t argc = args.GetLength();
+void CFXJSE_FormCalcContext::Decode(
+    CFXJSE_Value* pThis,
+    ByteStringView bsFuncName,
+    const v8::FunctionCallbackInfo<v8::Value>& info,
+    CFXJSE_Value* pRetValue) {
+  int32_t argc = info.Length();
   if (argc < 1 || argc > 2) {
     ToFormCalcContext(pThis)->ThrowParamCountMismatchException(L"Decode");
     return;
   }
 
   if (argc == 1) {
-    std::unique_ptr<CFXJSE_Value> argOne = GetSimpleValue(pThis, args, 0);
+    std::unique_ptr<CFXJSE_Value> argOne = GetSimpleValue(pThis, info, 0);
     if (ValueIsNull(pThis, argOne.get())) {
-      args.GetReturnValue()->SetNull();
+      pRetValue->SetNull();
       return;
     }
 
     WideString decoded = DecodeURL(
         WideString::FromUTF8(ValueToUTF8String(argOne.get()).AsStringView()));
 
-    args.GetReturnValue()->SetString(
-        FX_UTF8Encode(decoded.AsStringView()).AsStringView());
+    pRetValue->SetString(FX_UTF8Encode(decoded.AsStringView()).AsStringView());
     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> argOne = GetSimpleValue(pThis, info, 0);
+  std::unique_ptr<CFXJSE_Value> argTwo = GetSimpleValue(pThis, info, 1);
   if (ValueIsNull(pThis, argOne.get()) || ValueIsNull(pThis, argTwo.get())) {
-    args.GetReturnValue()->SetNull();
+    pRetValue->SetNull();
     return;
   }
 
@@ -3623,37 +3712,37 @@
   else
     decoded = DecodeURL(wsToDecode);
 
-  args.GetReturnValue()->SetString(
-      FX_UTF8Encode(decoded.AsStringView()).AsStringView());
+  pRetValue->SetString(FX_UTF8Encode(decoded.AsStringView()).AsStringView());
 }
 
 // static
-void CFXJSE_FormCalcContext::Encode(CFXJSE_Value* pThis,
-                                    ByteStringView bsFuncName,
-                                    CFXJSE_Arguments& args) {
-  int32_t argc = args.GetLength();
+void CFXJSE_FormCalcContext::Encode(
+    CFXJSE_Value* pThis,
+    ByteStringView bsFuncName,
+    const v8::FunctionCallbackInfo<v8::Value>& info,
+    CFXJSE_Value* pRetValue) {
+  int32_t argc = info.Length();
   if (argc < 1 || argc > 2) {
     ToFormCalcContext(pThis)->ThrowParamCountMismatchException(L"Encode");
     return;
   }
 
   if (argc == 1) {
-    std::unique_ptr<CFXJSE_Value> argOne = GetSimpleValue(pThis, args, 0);
+    std::unique_ptr<CFXJSE_Value> argOne = GetSimpleValue(pThis, info, 0);
     if (ValueIsNull(pThis, argOne.get())) {
-      args.GetReturnValue()->SetNull();
+      pRetValue->SetNull();
       return;
     }
 
     WideString encoded = EncodeURL(ValueToUTF8String(argOne.get()));
-    args.GetReturnValue()->SetString(
-        FX_UTF8Encode(encoded.AsStringView()).AsStringView());
+    pRetValue->SetString(FX_UTF8Encode(encoded.AsStringView()).AsStringView());
     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> argOne = GetSimpleValue(pThis, info, 0);
+  std::unique_ptr<CFXJSE_Value> argTwo = GetSimpleValue(pThis, info, 1);
   if (ValueIsNull(pThis, argOne.get()) || ValueIsNull(pThis, argTwo.get())) {
-    args.GetReturnValue()->SetNull();
+    pRetValue->SetNull();
     return;
   }
 
@@ -3667,24 +3756,25 @@
   else
     encoded = EncodeURL(bsToEncode);
 
-  args.GetReturnValue()->SetString(
-      FX_UTF8Encode(encoded.AsStringView()).AsStringView());
+  pRetValue->SetString(FX_UTF8Encode(encoded.AsStringView()).AsStringView());
 }
 
 // static
-void CFXJSE_FormCalcContext::Format(CFXJSE_Value* pThis,
-                                    ByteStringView bsFuncName,
-                                    CFXJSE_Arguments& args) {
+void CFXJSE_FormCalcContext::Format(
+    CFXJSE_Value* pThis,
+    ByteStringView bsFuncName,
+    const v8::FunctionCallbackInfo<v8::Value>& info,
+    CFXJSE_Value* pRetValue) {
   CFXJSE_FormCalcContext* pContext = ToFormCalcContext(pThis);
-  if (args.GetLength() < 2) {
+  if (info.Length() < 2) {
     pContext->ThrowParamCountMismatchException(L"Format");
     return;
   }
 
-  std::unique_ptr<CFXJSE_Value> argOne = GetSimpleValue(pThis, args, 0);
+  std::unique_ptr<CFXJSE_Value> argOne = GetSimpleValue(pThis, info, 0);
   ByteString bsPattern = ValueToUTF8String(argOne.get());
 
-  std::unique_ptr<CFXJSE_Value> argTwo = GetSimpleValue(pThis, args, 1);
+  std::unique_ptr<CFXJSE_Value> argTwo = GetSimpleValue(pThis, info, 1);
   ByteString bsValue = ValueToUTF8String(argTwo.get());
 
   CXFA_Document* pDoc = pContext->GetDocument();
@@ -3702,7 +3792,7 @@
       case XFA_VT_DATETIME: {
         auto iTChar = wsPattern.Find(L'T');
         if (!iTChar.has_value()) {
-          args.GetReturnValue()->SetString("");
+          pRetValue->SetString("");
           return;
         }
         WideString wsDatePattern(L"date{");
@@ -3744,67 +3834,73 @@
   WideString wsRet;
   if (!localeValue.FormatPatterns(wsRet, wsPattern, pLocale,
                                   XFA_VALUEPICTURE_Display)) {
-    args.GetReturnValue()->SetString("");
+    pRetValue->SetString("");
     return;
   }
 
-  args.GetReturnValue()->SetString(wsRet.ToUTF8().AsStringView());
+  pRetValue->SetString(wsRet.ToUTF8().AsStringView());
 }
 
 // static
-void CFXJSE_FormCalcContext::Left(CFXJSE_Value* pThis,
-                                  ByteStringView bsFuncName,
-                                  CFXJSE_Arguments& args) {
-  if (args.GetLength() != 2) {
+void CFXJSE_FormCalcContext::Left(
+    CFXJSE_Value* pThis,
+    ByteStringView bsFuncName,
+    const v8::FunctionCallbackInfo<v8::Value>& info,
+    CFXJSE_Value* pRetValue) {
+  if (info.Length() != 2) {
     ToFormCalcContext(pThis)->ThrowParamCountMismatchException(L"Left");
     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> argOne = GetSimpleValue(pThis, info, 0);
+  std::unique_ptr<CFXJSE_Value> argTwo = GetSimpleValue(pThis, info, 1);
   if ((ValueIsNull(pThis, argOne.get())) ||
       (ValueIsNull(pThis, argTwo.get()))) {
-    args.GetReturnValue()->SetNull();
+    pRetValue->SetNull();
     return;
   }
 
   ByteString bsSource = ValueToUTF8String(argOne.get());
   int32_t count = std::max(0, ValueToInteger(pThis, argTwo.get()));
-  args.GetReturnValue()->SetString(bsSource.First(count).AsStringView());
+  pRetValue->SetString(bsSource.First(count).AsStringView());
 }
 
 // static
-void CFXJSE_FormCalcContext::Len(CFXJSE_Value* pThis,
-                                 ByteStringView bsFuncName,
-                                 CFXJSE_Arguments& args) {
-  if (args.GetLength() != 1) {
+void CFXJSE_FormCalcContext::Len(
+    CFXJSE_Value* pThis,
+    ByteStringView bsFuncName,
+    const v8::FunctionCallbackInfo<v8::Value>& info,
+    CFXJSE_Value* pRetValue) {
+  if (info.Length() != 1) {
     ToFormCalcContext(pThis)->ThrowParamCountMismatchException(L"Len");
     return;
   }
 
-  std::unique_ptr<CFXJSE_Value> argOne = GetSimpleValue(pThis, args, 0);
+  std::unique_ptr<CFXJSE_Value> argOne = GetSimpleValue(pThis, info, 0);
   if (ValueIsNull(pThis, argOne.get())) {
-    args.GetReturnValue()->SetNull();
+    pRetValue->SetNull();
     return;
   }
 
   ByteString bsSource = ValueToUTF8String(argOne.get());
-  args.GetReturnValue()->SetInteger(bsSource.GetLength());
+  pRetValue->SetInteger(bsSource.GetLength());
 }
 
 // static
-void CFXJSE_FormCalcContext::Lower(CFXJSE_Value* pThis,
-                                   ByteStringView bsFuncName,
-                                   CFXJSE_Arguments& args) {
-  int32_t argc = args.GetLength();
+void CFXJSE_FormCalcContext::Lower(
+    CFXJSE_Value* pThis,
+    ByteStringView bsFuncName,
+    const v8::FunctionCallbackInfo<v8::Value>& info,
+    CFXJSE_Value* pRetValue) {
+  int32_t argc = info.Length();
   if (argc < 1 || argc > 2) {
     ToFormCalcContext(pThis)->ThrowParamCountMismatchException(L"Lower");
     return;
   }
 
-  std::unique_ptr<CFXJSE_Value> argOne = GetSimpleValue(pThis, args, 0);
+  std::unique_ptr<CFXJSE_Value> argOne = GetSimpleValue(pThis, info, 0);
   if (ValueIsNull(pThis, argOne.get())) {
-    args.GetReturnValue()->SetNull();
+    pRetValue->SetNull();
     return;
   }
 
@@ -3820,44 +3916,47 @@
   }
   szLowBuf.AppendChar(0);
 
-  args.GetReturnValue()->SetString(
-      FX_UTF8Encode(szLowBuf.AsStringView()).AsStringView());
+  pRetValue->SetString(FX_UTF8Encode(szLowBuf.AsStringView()).AsStringView());
 }
 
 // static
-void CFXJSE_FormCalcContext::Ltrim(CFXJSE_Value* pThis,
-                                   ByteStringView bsFuncName,
-                                   CFXJSE_Arguments& args) {
-  if (args.GetLength() != 1) {
+void CFXJSE_FormCalcContext::Ltrim(
+    CFXJSE_Value* pThis,
+    ByteStringView bsFuncName,
+    const v8::FunctionCallbackInfo<v8::Value>& info,
+    CFXJSE_Value* pRetValue) {
+  if (info.Length() != 1) {
     ToFormCalcContext(pThis)->ThrowParamCountMismatchException(L"Ltrim");
     return;
   }
 
-  std::unique_ptr<CFXJSE_Value> argOne = GetSimpleValue(pThis, args, 0);
+  std::unique_ptr<CFXJSE_Value> argOne = GetSimpleValue(pThis, info, 0);
   if (ValueIsNull(pThis, argOne.get())) {
-    args.GetReturnValue()->SetNull();
+    pRetValue->SetNull();
     return;
   }
 
   ByteString bsSource = ValueToUTF8String(argOne.get());
   bsSource.TrimLeft();
-  args.GetReturnValue()->SetString(bsSource.AsStringView());
+  pRetValue->SetString(bsSource.AsStringView());
 }
 
 // static
-void CFXJSE_FormCalcContext::Parse(CFXJSE_Value* pThis,
-                                   ByteStringView bsFuncName,
-                                   CFXJSE_Arguments& args) {
+void CFXJSE_FormCalcContext::Parse(
+    CFXJSE_Value* pThis,
+    ByteStringView bsFuncName,
+    const v8::FunctionCallbackInfo<v8::Value>& info,
+    CFXJSE_Value* pRetValue) {
   CFXJSE_FormCalcContext* pContext = ToFormCalcContext(pThis);
-  if (args.GetLength() != 2) {
+  if (info.Length() != 2) {
     pContext->ThrowParamCountMismatchException(L"Parse");
     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> argOne = GetSimpleValue(pThis, info, 0);
+  std::unique_ptr<CFXJSE_Value> argTwo = GetSimpleValue(pThis, info, 1);
   if (ValueIsNull(pThis, argTwo.get())) {
-    args.GetReturnValue()->SetNull();
+    pRetValue->SetNull();
     return;
   }
 
@@ -3877,11 +3976,10 @@
     CXFA_LocaleValue localeValue(dwPatternType, wsValue, wsPattern, pLocale,
                                  pMgr);
     if (!localeValue.IsValid()) {
-      args.GetReturnValue()->SetString("");
+      pRetValue->SetString("");
       return;
     }
-    args.GetReturnValue()->SetString(
-        localeValue.GetValue().ToUTF8().AsStringView());
+    pRetValue->SetString(localeValue.GetValue().ToUTF8().AsStringView());
     return;
   }
 
@@ -3889,7 +3987,7 @@
     case XFA_VT_DATETIME: {
       auto iTChar = wsPattern.Find(L'T');
       if (!iTChar.has_value()) {
-        args.GetReturnValue()->SetString("");
+        pRetValue->SetString("");
         return;
       }
       WideString wsDatePattern(L"date{" + wsPattern.First(iTChar.value()) +
@@ -3901,11 +3999,10 @@
       CXFA_LocaleValue localeValue(dwPatternType, wsValue, wsPattern, pLocale,
                                    pMgr);
       if (!localeValue.IsValid()) {
-        args.GetReturnValue()->SetString("");
+        pRetValue->SetString("");
         return;
       }
-      args.GetReturnValue()->SetString(
-          localeValue.GetValue().ToUTF8().AsStringView());
+      pRetValue->SetString(localeValue.GetValue().ToUTF8().AsStringView());
       return;
     }
     case XFA_VT_DATE: {
@@ -3913,11 +4010,10 @@
       CXFA_LocaleValue localeValue(dwPatternType, wsValue, wsPattern, pLocale,
                                    pMgr);
       if (!localeValue.IsValid()) {
-        args.GetReturnValue()->SetString("");
+        pRetValue->SetString("");
         return;
       }
-      args.GetReturnValue()->SetString(
-          localeValue.GetValue().ToUTF8().AsStringView());
+      pRetValue->SetString(localeValue.GetValue().ToUTF8().AsStringView());
       return;
     }
     case XFA_VT_TIME: {
@@ -3925,11 +4021,10 @@
       CXFA_LocaleValue localeValue(dwPatternType, wsValue, wsPattern, pLocale,
                                    pMgr);
       if (!localeValue.IsValid()) {
-        args.GetReturnValue()->SetString("");
+        pRetValue->SetString("");
         return;
       }
-      args.GetReturnValue()->SetString(
-          localeValue.GetValue().ToUTF8().AsStringView());
+      pRetValue->SetString(localeValue.GetValue().ToUTF8().AsStringView());
       return;
     }
     case XFA_VT_TEXT: {
@@ -3937,11 +4032,10 @@
       CXFA_LocaleValue localeValue(XFA_VT_TEXT, wsValue, wsPattern, pLocale,
                                    pMgr);
       if (!localeValue.IsValid()) {
-        args.GetReturnValue()->SetString("");
+        pRetValue->SetString("");
         return;
       }
-      args.GetReturnValue()->SetString(
-          localeValue.GetValue().ToUTF8().AsStringView());
+      pRetValue->SetString(localeValue.GetValue().ToUTF8().AsStringView());
       return;
     }
     case XFA_VT_FLOAT: {
@@ -3949,10 +4043,10 @@
       CXFA_LocaleValue localeValue(XFA_VT_FLOAT, wsValue, wsPattern, pLocale,
                                    pMgr);
       if (!localeValue.IsValid()) {
-        args.GetReturnValue()->SetString("");
+        pRetValue->SetString("");
         return;
       }
-      args.GetReturnValue()->SetDouble(localeValue.GetDoubleNum());
+      pRetValue->SetDouble(localeValue.GetDoubleNum());
       return;
     }
     default: {
@@ -3961,7 +4055,7 @@
         CXFA_LocaleValue localeValue(XFA_VT_FLOAT, wsValue, wsTestPattern,
                                      pLocale, pMgr);
         if (localeValue.IsValid()) {
-          args.GetReturnValue()->SetDouble(localeValue.GetDoubleNum());
+          pRetValue->SetDouble(localeValue.GetDoubleNum());
           return;
         }
       }
@@ -3971,29 +4065,30 @@
         CXFA_LocaleValue localeValue(XFA_VT_TEXT, wsValue, wsTestPattern,
                                      pLocale, pMgr);
         if (localeValue.IsValid()) {
-          args.GetReturnValue()->SetString(
-              localeValue.GetValue().ToUTF8().AsStringView());
+          pRetValue->SetString(localeValue.GetValue().ToUTF8().AsStringView());
           return;
         }
       }
-      args.GetReturnValue()->SetString("");
+      pRetValue->SetString("");
       return;
     }
   }
 }
 
 // static
-void CFXJSE_FormCalcContext::Replace(CFXJSE_Value* pThis,
-                                     ByteStringView bsFuncName,
-                                     CFXJSE_Arguments& args) {
-  int32_t argc = args.GetLength();
+void CFXJSE_FormCalcContext::Replace(
+    CFXJSE_Value* pThis,
+    ByteStringView bsFuncName,
+    const v8::FunctionCallbackInfo<v8::Value>& info,
+    CFXJSE_Value* pRetValue) {
+  int32_t argc = info.Length();
   if (argc < 2 || argc > 3) {
     ToFormCalcContext(pThis)->ThrowParamCountMismatchException(L"Replace");
     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> argOne = GetSimpleValue(pThis, info, 0);
+  std::unique_ptr<CFXJSE_Value> argTwo = GetSimpleValue(pThis, info, 1);
   ByteString bsOne;
   ByteString bsTwo;
   if (!ValueIsNull(pThis, argOne.get()) && !ValueIsNull(pThis, argTwo.get())) {
@@ -4003,7 +4098,7 @@
 
   ByteString bsThree;
   if (argc > 2) {
-    std::unique_ptr<CFXJSE_Value> argThree = GetSimpleValue(pThis, args, 2);
+    std::unique_ptr<CFXJSE_Value> argThree = GetSimpleValue(pThis, info, 2);
     bsThree = ValueToUTF8String(argThree.get());
   }
 
@@ -4038,63 +4133,69 @@
     }
   }
   szResult << '\0';
-  args.GetReturnValue()->SetString(ByteStringView(szResult.str().c_str()));
+  pRetValue->SetString(ByteStringView(szResult.str().c_str()));
 }
 
 // static
-void CFXJSE_FormCalcContext::Right(CFXJSE_Value* pThis,
-                                   ByteStringView bsFuncName,
-                                   CFXJSE_Arguments& args) {
-  if (args.GetLength() != 2) {
+void CFXJSE_FormCalcContext::Right(
+    CFXJSE_Value* pThis,
+    ByteStringView bsFuncName,
+    const v8::FunctionCallbackInfo<v8::Value>& info,
+    CFXJSE_Value* pRetValue) {
+  if (info.Length() != 2) {
     ToFormCalcContext(pThis)->ThrowParamCountMismatchException(L"Right");
     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> argOne = GetSimpleValue(pThis, info, 0);
+  std::unique_ptr<CFXJSE_Value> argTwo = GetSimpleValue(pThis, info, 1);
   if ((ValueIsNull(pThis, argOne.get())) ||
       (ValueIsNull(pThis, argTwo.get()))) {
-    args.GetReturnValue()->SetNull();
+    pRetValue->SetNull();
     return;
   }
 
   ByteString bsSource = ValueToUTF8String(argOne.get());
   int32_t count = std::max(0, ValueToInteger(pThis, argTwo.get()));
-  args.GetReturnValue()->SetString(bsSource.Last(count).AsStringView());
+  pRetValue->SetString(bsSource.Last(count).AsStringView());
 }
 
 // static
-void CFXJSE_FormCalcContext::Rtrim(CFXJSE_Value* pThis,
-                                   ByteStringView bsFuncName,
-                                   CFXJSE_Arguments& args) {
-  if (args.GetLength() != 1) {
+void CFXJSE_FormCalcContext::Rtrim(
+    CFXJSE_Value* pThis,
+    ByteStringView bsFuncName,
+    const v8::FunctionCallbackInfo<v8::Value>& info,
+    CFXJSE_Value* pRetValue) {
+  if (info.Length() != 1) {
     ToFormCalcContext(pThis)->ThrowParamCountMismatchException(L"Rtrim");
     return;
   }
 
-  std::unique_ptr<CFXJSE_Value> argOne = GetSimpleValue(pThis, args, 0);
+  std::unique_ptr<CFXJSE_Value> argOne = GetSimpleValue(pThis, info, 0);
   if (ValueIsNull(pThis, argOne.get())) {
-    args.GetReturnValue()->SetNull();
+    pRetValue->SetNull();
     return;
   }
 
   ByteString bsSource = ValueToUTF8String(argOne.get());
   bsSource.TrimRight();
-  args.GetReturnValue()->SetString(bsSource.AsStringView());
+  pRetValue->SetString(bsSource.AsStringView());
 }
 
 // static
-void CFXJSE_FormCalcContext::Space(CFXJSE_Value* pThis,
-                                   ByteStringView bsFuncName,
-                                   CFXJSE_Arguments& args) {
-  if (args.GetLength() != 1) {
+void CFXJSE_FormCalcContext::Space(
+    CFXJSE_Value* pThis,
+    ByteStringView bsFuncName,
+    const v8::FunctionCallbackInfo<v8::Value>& info,
+    CFXJSE_Value* pRetValue) {
+  if (info.Length() != 1) {
     ToFormCalcContext(pThis)->ThrowParamCountMismatchException(L"Space");
     return;
   }
 
-  std::unique_ptr<CFXJSE_Value> argOne = GetSimpleValue(pThis, args, 0);
+  std::unique_ptr<CFXJSE_Value> argOne = GetSimpleValue(pThis, info, 0);
   if (argOne->IsNull()) {
-    args.GetReturnValue()->SetNull();
+    pRetValue->SetNull();
     return;
   }
 
@@ -4106,36 +4207,38 @@
     index++;
   }
   spaceString << '\0';
-  args.GetReturnValue()->SetString(ByteStringView(spaceString.str().c_str()));
+  pRetValue->SetString(ByteStringView(spaceString.str().c_str()));
 }
 
 // static
-void CFXJSE_FormCalcContext::Str(CFXJSE_Value* pThis,
-                                 ByteStringView bsFuncName,
-                                 CFXJSE_Arguments& args) {
-  int32_t argc = args.GetLength();
+void CFXJSE_FormCalcContext::Str(
+    CFXJSE_Value* pThis,
+    ByteStringView bsFuncName,
+    const v8::FunctionCallbackInfo<v8::Value>& info,
+    CFXJSE_Value* pRetValue) {
+  int32_t argc = info.Length();
   if (argc < 1 || argc > 3) {
     ToFormCalcContext(pThis)->ThrowParamCountMismatchException(L"Str");
     return;
   }
 
-  std::unique_ptr<CFXJSE_Value> numberValue = GetSimpleValue(pThis, args, 0);
+  std::unique_ptr<CFXJSE_Value> numberValue = GetSimpleValue(pThis, info, 0);
   if (numberValue->IsNull()) {
-    args.GetReturnValue()->SetNull();
+    pRetValue->SetNull();
     return;
   }
   float fNumber = ValueToFloat(pThis, numberValue.get());
 
   int32_t iWidth = 10;
   if (argc > 1) {
-    std::unique_ptr<CFXJSE_Value> widthValue = GetSimpleValue(pThis, args, 1);
+    std::unique_ptr<CFXJSE_Value> widthValue = GetSimpleValue(pThis, info, 1);
     iWidth = static_cast<int32_t>(ValueToFloat(pThis, widthValue.get()));
   }
 
   int32_t iPrecision = 0;
   if (argc > 2) {
     std::unique_ptr<CFXJSE_Value> precisionValue =
-        GetSimpleValue(pThis, args, 2);
+        GetSimpleValue(pThis, info, 2);
     iPrecision = std::max(
         0, static_cast<int32_t>(ValueToFloat(pThis, precisionValue.get())));
   }
@@ -4166,7 +4269,7 @@
       ++i;
     }
     resultBuf << '\0';
-    args.GetReturnValue()->SetString(ByteStringView(resultBuf.str().c_str()));
+    pRetValue->SetString(ByteStringView(resultBuf.str().c_str()));
     return;
   }
 
@@ -4185,7 +4288,7 @@
       }
       resultBuf << pData;
     }
-    args.GetReturnValue()->SetString(ByteStringView(resultBuf.str().c_str()));
+    pRetValue->SetString(ByteStringView(resultBuf.str().c_str()));
     return;
   }
 
@@ -4221,14 +4324,16 @@
     ++i;
   }
   resultBuf << '\0';
-  args.GetReturnValue()->SetString(ByteStringView(resultBuf.str().c_str()));
+  pRetValue->SetString(ByteStringView(resultBuf.str().c_str()));
 }
 
 // static
-void CFXJSE_FormCalcContext::Stuff(CFXJSE_Value* pThis,
-                                   ByteStringView bsFuncName,
-                                   CFXJSE_Arguments& args) {
-  int32_t argc = args.GetLength();
+void CFXJSE_FormCalcContext::Stuff(
+    CFXJSE_Value* pThis,
+    ByteStringView bsFuncName,
+    const v8::FunctionCallbackInfo<v8::Value>& info,
+    CFXJSE_Value* pRetValue) {
+  int32_t argc = info.Length();
   if (argc < 3 || argc > 4) {
     ToFormCalcContext(pThis)->ThrowParamCountMismatchException(L"Stuff");
     return;
@@ -4239,9 +4344,9 @@
   int32_t iLength = 0;
   int32_t iStart = 0;
   int32_t iDelete = 0;
-  std::unique_ptr<CFXJSE_Value> sourceValue = GetSimpleValue(pThis, args, 0);
-  std::unique_ptr<CFXJSE_Value> startValue = GetSimpleValue(pThis, args, 1);
-  std::unique_ptr<CFXJSE_Value> deleteValue = GetSimpleValue(pThis, args, 2);
+  std::unique_ptr<CFXJSE_Value> sourceValue = GetSimpleValue(pThis, info, 0);
+  std::unique_ptr<CFXJSE_Value> startValue = GetSimpleValue(pThis, info, 1);
+  std::unique_ptr<CFXJSE_Value> deleteValue = GetSimpleValue(pThis, info, 2);
   if (!sourceValue->IsNull() && !startValue->IsNull() &&
       !deleteValue->IsNull()) {
     bsSource = ValueToUTF8String(sourceValue.get());
@@ -4254,7 +4359,7 @@
   }
 
   if (argc > 3) {
-    std::unique_ptr<CFXJSE_Value> insertValue = GetSimpleValue(pThis, args, 3);
+    std::unique_ptr<CFXJSE_Value> insertValue = GetSimpleValue(pThis, info, 3);
     bsInsert = ValueToUTF8String(insertValue.get());
   }
 
@@ -4272,32 +4377,34 @@
     ++i;
   }
   szResult << '\0';
-  args.GetReturnValue()->SetString(ByteStringView(szResult.str().c_str()));
+  pRetValue->SetString(ByteStringView(szResult.str().c_str()));
 }
 
 // static
-void CFXJSE_FormCalcContext::Substr(CFXJSE_Value* pThis,
-                                    ByteStringView bsFuncName,
-                                    CFXJSE_Arguments& args) {
-  if (args.GetLength() != 3) {
+void CFXJSE_FormCalcContext::Substr(
+    CFXJSE_Value* pThis,
+    ByteStringView bsFuncName,
+    const v8::FunctionCallbackInfo<v8::Value>& info,
+    CFXJSE_Value* pRetValue) {
+  if (info.Length() != 3) {
     ToFormCalcContext(pThis)->ThrowParamCountMismatchException(L"Substr");
     return;
   }
 
-  std::unique_ptr<CFXJSE_Value> string_value = GetSimpleValue(pThis, args, 0);
-  std::unique_ptr<CFXJSE_Value> start_value = GetSimpleValue(pThis, args, 1);
-  std::unique_ptr<CFXJSE_Value> end_value = GetSimpleValue(pThis, args, 2);
+  std::unique_ptr<CFXJSE_Value> string_value = GetSimpleValue(pThis, info, 0);
+  std::unique_ptr<CFXJSE_Value> start_value = GetSimpleValue(pThis, info, 1);
+  std::unique_ptr<CFXJSE_Value> end_value = GetSimpleValue(pThis, info, 2);
   if (ValueIsNull(pThis, string_value.get()) ||
       ValueIsNull(pThis, start_value.get()) ||
       ValueIsNull(pThis, end_value.get())) {
-    args.GetReturnValue()->SetNull();
+    pRetValue->SetNull();
     return;
   }
 
   ByteString bsSource = ValueToUTF8String(string_value.get());
   size_t iLength = bsSource.GetLength();
   if (iLength == 0) {
-    args.GetReturnValue()->SetString("");
+    pRetValue->SetString("");
     return;
   }
 
@@ -4305,22 +4412,23 @@
   // than 1, per spec. Subtract 1 since |iStart| is 0-based.
   size_t iStart = std::max(ValueToInteger(pThis, start_value.get()), 1) - 1;
   if (iStart >= iLength) {
-    args.GetReturnValue()->SetString("");
+    pRetValue->SetString("");
     return;
   }
 
   // Negative values are treated as 0. Can't clamp() due to sign mismatches.
   size_t iCount = std::max(ValueToInteger(pThis, end_value.get()), 0);
   iCount = std::min(iCount, iLength - iStart);
-  args.GetReturnValue()->SetString(
-      bsSource.Substr(iStart, iCount).AsStringView());
+  pRetValue->SetString(bsSource.Substr(iStart, iCount).AsStringView());
 }
 
 // static
-void CFXJSE_FormCalcContext::Uuid(CFXJSE_Value* pThis,
-                                  ByteStringView bsFuncName,
-                                  CFXJSE_Arguments& args) {
-  int32_t argc = args.GetLength();
+void CFXJSE_FormCalcContext::Uuid(
+    CFXJSE_Value* pThis,
+    ByteStringView bsFuncName,
+    const v8::FunctionCallbackInfo<v8::Value>& info,
+    CFXJSE_Value* pRetValue) {
+  int32_t argc = info.Length();
   if (argc < 0 || argc > 1) {
     ToFormCalcContext(pThis)->ThrowParamCountMismatchException(L"Uuid");
     return;
@@ -4328,25 +4436,27 @@
 
   int32_t iNum = 0;
   if (argc > 0) {
-    std::unique_ptr<CFXJSE_Value> argOne = GetSimpleValue(pThis, args, 0);
+    std::unique_ptr<CFXJSE_Value> argOne = GetSimpleValue(pThis, info, 0);
     iNum = static_cast<int32_t>(ValueToFloat(pThis, argOne.get()));
   }
-  args.GetReturnValue()->SetString(GUIDString(!!iNum).AsStringView());
+  pRetValue->SetString(GUIDString(!!iNum).AsStringView());
 }
 
 // static
-void CFXJSE_FormCalcContext::Upper(CFXJSE_Value* pThis,
-                                   ByteStringView bsFuncName,
-                                   CFXJSE_Arguments& args) {
-  int32_t argc = args.GetLength();
+void CFXJSE_FormCalcContext::Upper(
+    CFXJSE_Value* pThis,
+    ByteStringView bsFuncName,
+    const v8::FunctionCallbackInfo<v8::Value>& info,
+    CFXJSE_Value* pRetValue) {
+  int32_t argc = info.Length();
   if (argc < 1 || argc > 2) {
     ToFormCalcContext(pThis)->ThrowParamCountMismatchException(L"Upper");
     return;
   }
 
-  std::unique_ptr<CFXJSE_Value> argOne = GetSimpleValue(pThis, args, 0);
+  std::unique_ptr<CFXJSE_Value> argOne = GetSimpleValue(pThis, info, 0);
   if (ValueIsNull(pThis, argOne.get())) {
-    args.GetReturnValue()->SetNull();
+    pRetValue->SetNull();
     return;
   }
 
@@ -4367,23 +4477,25 @@
   }
   upperStringBuf.AppendChar(0);
 
-  args.GetReturnValue()->SetString(
+  pRetValue->SetString(
       FX_UTF8Encode(upperStringBuf.AsStringView()).AsStringView());
 }
 
 // static
-void CFXJSE_FormCalcContext::WordNum(CFXJSE_Value* pThis,
-                                     ByteStringView bsFuncName,
-                                     CFXJSE_Arguments& args) {
-  int32_t argc = args.GetLength();
+void CFXJSE_FormCalcContext::WordNum(
+    CFXJSE_Value* pThis,
+    ByteStringView bsFuncName,
+    const v8::FunctionCallbackInfo<v8::Value>& info,
+    CFXJSE_Value* pRetValue) {
+  int32_t argc = info.Length();
   if (argc < 1 || argc > 3) {
     ToFormCalcContext(pThis)->ThrowParamCountMismatchException(L"WordNum");
     return;
   }
 
-  std::unique_ptr<CFXJSE_Value> numberValue = GetSimpleValue(pThis, args, 0);
+  std::unique_ptr<CFXJSE_Value> numberValue = GetSimpleValue(pThis, info, 0);
   if (numberValue->IsNull()) {
-    args.GetReturnValue()->SetNull();
+    pRetValue->SetNull();
     return;
   }
   float fNumber = ValueToFloat(pThis, numberValue.get());
@@ -4391,9 +4503,9 @@
   int32_t iIdentifier = 0;
   if (argc > 1) {
     std::unique_ptr<CFXJSE_Value> identifierValue =
-        GetSimpleValue(pThis, args, 1);
+        GetSimpleValue(pThis, info, 1);
     if (identifierValue->IsNull()) {
-      args.GetReturnValue()->SetNull();
+      pRetValue->SetNull();
       return;
     }
     iIdentifier =
@@ -4402,9 +4514,9 @@
 
   ByteString bsLocale;
   if (argc > 2) {
-    std::unique_ptr<CFXJSE_Value> localeValue = GetSimpleValue(pThis, args, 2);
+    std::unique_ptr<CFXJSE_Value> localeValue = GetSimpleValue(pThis, info, 2);
     if (localeValue->IsNull()) {
-      args.GetReturnValue()->SetNull();
+      pRetValue->SetNull();
       return;
     }
     bsLocale = ValueToUTF8String(localeValue.get());
@@ -4412,20 +4524,22 @@
 
   if (std::isnan(fNumber) || fNumber < 0.0f ||
       fNumber > 922337203685477550.0f) {
-    args.GetReturnValue()->SetString("*");
+    pRetValue->SetString("*");
     return;
   }
 
-  args.GetReturnValue()->SetString(
+  pRetValue->SetString(
       WordUS(ByteString::Format("%.2f", fNumber), iIdentifier).AsStringView());
 }
 
 // static
-void CFXJSE_FormCalcContext::Get(CFXJSE_Value* pThis,
-                                 ByteStringView bsFuncName,
-                                 CFXJSE_Arguments& args) {
+void CFXJSE_FormCalcContext::Get(
+    CFXJSE_Value* pThis,
+    ByteStringView bsFuncName,
+    const v8::FunctionCallbackInfo<v8::Value>& info,
+    CFXJSE_Value* pRetValue) {
   CFXJSE_FormCalcContext* pContext = ToFormCalcContext(pThis);
-  if (args.GetLength() != 1) {
+  if (info.Length() != 1) {
     pContext->ThrowParamCountMismatchException(L"Get");
     return;
   }
@@ -4438,7 +4552,7 @@
   if (!pAppProvider)
     return;
 
-  std::unique_ptr<CFXJSE_Value> argOne = GetSimpleValue(pThis, args, 0);
+  std::unique_ptr<CFXJSE_Value> argOne = GetSimpleValue(pThis, info, 0);
   ByteString bsUrl = ValueToUTF8String(argOne.get());
   RetainPtr<IFX_SeekableReadStream> pFile =
       pAppProvider->DownloadURL(WideString::FromUTF8(bsUrl.AsStringView()));
@@ -4448,15 +4562,17 @@
   int32_t size = pFile->GetSize();
   std::vector<uint8_t> dataBuf(size);
   pFile->ReadBlock(dataBuf.data(), size);
-  args.GetReturnValue()->SetString(ByteStringView(dataBuf));
+  pRetValue->SetString(ByteStringView(dataBuf));
 }
 
 // static
-void CFXJSE_FormCalcContext::Post(CFXJSE_Value* pThis,
-                                  ByteStringView bsFuncName,
-                                  CFXJSE_Arguments& args) {
+void CFXJSE_FormCalcContext::Post(
+    CFXJSE_Value* pThis,
+    ByteStringView bsFuncName,
+    const v8::FunctionCallbackInfo<v8::Value>& info,
+    CFXJSE_Value* pRetValue) {
   CFXJSE_FormCalcContext* pContext = ToFormCalcContext(pThis);
-  int32_t argc = args.GetLength();
+  int32_t argc = info.Length();
   if (argc < 2 || argc > 5) {
     pContext->ThrowParamCountMismatchException(L"Post");
     return;
@@ -4470,27 +4586,27 @@
   if (!pAppProvider)
     return;
 
-  std::unique_ptr<CFXJSE_Value> argOne = GetSimpleValue(pThis, args, 0);
+  std::unique_ptr<CFXJSE_Value> argOne = GetSimpleValue(pThis, info, 0);
   ByteString bsURL = ValueToUTF8String(argOne.get());
 
-  std::unique_ptr<CFXJSE_Value> argTwo = GetSimpleValue(pThis, args, 1);
+  std::unique_ptr<CFXJSE_Value> argTwo = GetSimpleValue(pThis, info, 1);
   ByteString bsData = ValueToUTF8String(argTwo.get());
 
   ByteString bsContentType;
   if (argc > 2) {
-    std::unique_ptr<CFXJSE_Value> argThree = GetSimpleValue(pThis, args, 2);
+    std::unique_ptr<CFXJSE_Value> argThree = GetSimpleValue(pThis, info, 2);
     bsContentType = ValueToUTF8String(argThree.get());
   }
 
   ByteString bsEncode;
   if (argc > 3) {
-    std::unique_ptr<CFXJSE_Value> argFour = GetSimpleValue(pThis, args, 3);
+    std::unique_ptr<CFXJSE_Value> argFour = GetSimpleValue(pThis, info, 3);
     bsEncode = ValueToUTF8String(argFour.get());
   }
 
   ByteString bsHeader;
   if (argc > 4) {
-    std::unique_ptr<CFXJSE_Value> argFive = GetSimpleValue(pThis, args, 4);
+    std::unique_ptr<CFXJSE_Value> argFive = GetSimpleValue(pThis, info, 4);
     bsHeader = ValueToUTF8String(argFive.get());
   }
 
@@ -4504,15 +4620,17 @@
     pContext->ThrowServerDeniedException();
     return;
   }
-  args.GetReturnValue()->SetString(decodedResponse.ToUTF8().AsStringView());
+  pRetValue->SetString(decodedResponse.ToUTF8().AsStringView());
 }
 
 // static
-void CFXJSE_FormCalcContext::Put(CFXJSE_Value* pThis,
-                                 ByteStringView bsFuncName,
-                                 CFXJSE_Arguments& args) {
+void CFXJSE_FormCalcContext::Put(
+    CFXJSE_Value* pThis,
+    ByteStringView bsFuncName,
+    const v8::FunctionCallbackInfo<v8::Value>& info,
+    CFXJSE_Value* pRetValue) {
   CFXJSE_FormCalcContext* pContext = ToFormCalcContext(pThis);
-  int32_t argc = args.GetLength();
+  int32_t argc = info.Length();
   if (argc < 2 || argc > 3) {
     pContext->ThrowParamCountMismatchException(L"Put");
     return;
@@ -4526,15 +4644,15 @@
   if (!pAppProvider)
     return;
 
-  std::unique_ptr<CFXJSE_Value> argOne = GetSimpleValue(pThis, args, 0);
+  std::unique_ptr<CFXJSE_Value> argOne = GetSimpleValue(pThis, info, 0);
   ByteString bsURL = ValueToUTF8String(argOne.get());
 
-  std::unique_ptr<CFXJSE_Value> argTwo = GetSimpleValue(pThis, args, 1);
+  std::unique_ptr<CFXJSE_Value> argTwo = GetSimpleValue(pThis, info, 1);
   ByteString bsData = ValueToUTF8String(argTwo.get());
 
   ByteString bsEncode;
   if (argc > 2) {
-    std::unique_ptr<CFXJSE_Value> argThree = GetSimpleValue(pThis, args, 2);
+    std::unique_ptr<CFXJSE_Value> argThree = GetSimpleValue(pThis, info, 2);
     bsEncode = ValueToUTF8String(argThree.get());
   }
 
@@ -4546,21 +4664,23 @@
     return;
   }
 
-  args.GetReturnValue()->SetString("");
+  pRetValue->SetString("");
 }
 
 // static
-void CFXJSE_FormCalcContext::assign_value_operator(CFXJSE_Value* pThis,
-                                                   ByteStringView bsFuncName,
-                                                   CFXJSE_Arguments& args) {
+void CFXJSE_FormCalcContext::assign_value_operator(
+    CFXJSE_Value* pThis,
+    ByteStringView bsFuncName,
+    const v8::FunctionCallbackInfo<v8::Value>& info,
+    CFXJSE_Value* pRetValue) {
   CFXJSE_FormCalcContext* pContext = ToFormCalcContext(pThis);
-  if (args.GetLength() != 2) {
+  if (info.Length() != 2) {
     pContext->ThrowCompilerErrorException();
     return;
   }
 
-  std::unique_ptr<CFXJSE_Value> lValue = args.GetValue(0);
-  std::unique_ptr<CFXJSE_Value> rValue = GetSimpleValue(pThis, args, 1);
+  auto lValue = pdfium::MakeUnique<CFXJSE_Value>(info.GetIsolate(), info[0]);
+  std::unique_ptr<CFXJSE_Value> rValue = GetSimpleValue(pThis, info, 1);
   if (lValue->IsArray()) {
     v8::Isolate* pIsolate = pContext->GetScriptRuntime();
     auto leftLengthValue = pdfium::MakeUnique<CFXJSE_Value>(pIsolate);
@@ -4590,122 +4710,127 @@
       return;
     }
   }
-  args.GetReturnValue()->Assign(rValue.get());
+  pRetValue->Assign(rValue.get());
 }
 
 // static
-void CFXJSE_FormCalcContext::logical_or_operator(CFXJSE_Value* pThis,
-                                                 ByteStringView bsFuncName,
-                                                 CFXJSE_Arguments& args) {
-  if (args.GetLength() != 2) {
+void CFXJSE_FormCalcContext::logical_or_operator(
+    CFXJSE_Value* pThis,
+    ByteStringView bsFuncName,
+    const v8::FunctionCallbackInfo<v8::Value>& info,
+    CFXJSE_Value* pRetValue) {
+  if (info.Length() != 2) {
     ToFormCalcContext(pThis)->ThrowCompilerErrorException();
     return;
   }
 
-  std::unique_ptr<CFXJSE_Value> argFirst = GetSimpleValue(pThis, args, 0);
-  std::unique_ptr<CFXJSE_Value> argSecond = GetSimpleValue(pThis, args, 1);
-  if (argFirst->IsNull() && argSecond->IsNull()) {
-    args.GetReturnValue()->SetNull();
+  std::unique_ptr<CFXJSE_Value> argFirst = GetSimpleValue(pThis, info, 0);
+  std::unique_ptr<CFXJSE_Value> infoecond = GetSimpleValue(pThis, info, 1);
+  if (argFirst->IsNull() && infoecond->IsNull()) {
+    pRetValue->SetNull();
     return;
   }
 
   float first = ValueToFloat(pThis, argFirst.get());
-  float second = ValueToFloat(pThis, argSecond.get());
-  args.GetReturnValue()->SetInteger((first || second) ? 1 : 0);
+  float second = ValueToFloat(pThis, infoecond.get());
+  pRetValue->SetInteger((first || second) ? 1 : 0);
 }
 
 // static
-void CFXJSE_FormCalcContext::logical_and_operator(CFXJSE_Value* pThis,
-                                                  ByteStringView bsFuncName,
-                                                  CFXJSE_Arguments& args) {
-  if (args.GetLength() != 2) {
+void CFXJSE_FormCalcContext::logical_and_operator(
+    CFXJSE_Value* pThis,
+    ByteStringView bsFuncName,
+    const v8::FunctionCallbackInfo<v8::Value>& info,
+    CFXJSE_Value* pRetValue) {
+  if (info.Length() != 2) {
     ToFormCalcContext(pThis)->ThrowCompilerErrorException();
     return;
   }
 
-  std::unique_ptr<CFXJSE_Value> argFirst = GetSimpleValue(pThis, args, 0);
-  std::unique_ptr<CFXJSE_Value> argSecond = GetSimpleValue(pThis, args, 1);
-  if (argFirst->IsNull() && argSecond->IsNull()) {
-    args.GetReturnValue()->SetNull();
+  std::unique_ptr<CFXJSE_Value> argFirst = GetSimpleValue(pThis, info, 0);
+  std::unique_ptr<CFXJSE_Value> infoecond = GetSimpleValue(pThis, info, 1);
+  if (argFirst->IsNull() && infoecond->IsNull()) {
+    pRetValue->SetNull();
     return;
   }
 
   float first = ValueToFloat(pThis, argFirst.get());
-  float second = ValueToFloat(pThis, argSecond.get());
-  args.GetReturnValue()->SetInteger((first && second) ? 1 : 0);
+  float second = ValueToFloat(pThis, infoecond.get());
+  pRetValue->SetInteger((first && second) ? 1 : 0);
 }
 
 // static
-void CFXJSE_FormCalcContext::equality_operator(CFXJSE_Value* pThis,
-                                               ByteStringView bsFuncName,
-                                               CFXJSE_Arguments& args) {
-  if (args.GetLength() != 2) {
+void CFXJSE_FormCalcContext::equality_operator(
+    CFXJSE_Value* pThis,
+    ByteStringView bsFuncName,
+    const v8::FunctionCallbackInfo<v8::Value>& info,
+    CFXJSE_Value* pRetValue) {
+  if (info.Length() != 2) {
     ToFormCalcContext(pThis)->ThrowCompilerErrorException();
     return;
   }
 
-  if (fm_ref_equal(pThis, args)) {
-    args.GetReturnValue()->SetInteger(1);
+  if (fm_ref_equal(pThis, info)) {
+    pRetValue->SetInteger(1);
     return;
   }
 
-  std::unique_ptr<CFXJSE_Value> argFirst = GetSimpleValue(pThis, args, 0);
-  std::unique_ptr<CFXJSE_Value> argSecond = GetSimpleValue(pThis, args, 1);
-  if (argFirst->IsNull() || argSecond->IsNull()) {
-    args.GetReturnValue()->SetInteger(
-        (argFirst->IsNull() && argSecond->IsNull()) ? 1 : 0);
+  std::unique_ptr<CFXJSE_Value> argFirst = GetSimpleValue(pThis, info, 0);
+  std::unique_ptr<CFXJSE_Value> infoecond = GetSimpleValue(pThis, info, 1);
+  if (argFirst->IsNull() || infoecond->IsNull()) {
+    pRetValue->SetInteger((argFirst->IsNull() && infoecond->IsNull()) ? 1 : 0);
     return;
   }
 
-  if (argFirst->IsString() && argSecond->IsString()) {
-    args.GetReturnValue()->SetInteger(argFirst->ToString() ==
-                                      argSecond->ToString());
+  if (argFirst->IsString() && infoecond->IsString()) {
+    pRetValue->SetInteger(argFirst->ToString() == infoecond->ToString());
     return;
   }
 
   double first = ValueToDouble(pThis, argFirst.get());
-  double second = ValueToDouble(pThis, argSecond.get());
-  args.GetReturnValue()->SetInteger((first == second) ? 1 : 0);
+  double second = ValueToDouble(pThis, infoecond.get());
+  pRetValue->SetInteger((first == second) ? 1 : 0);
 }
 
 // static
-void CFXJSE_FormCalcContext::notequality_operator(CFXJSE_Value* pThis,
-                                                  ByteStringView bsFuncName,
-                                                  CFXJSE_Arguments& args) {
-  if (args.GetLength() != 2) {
+void CFXJSE_FormCalcContext::notequality_operator(
+    CFXJSE_Value* pThis,
+    ByteStringView bsFuncName,
+    const v8::FunctionCallbackInfo<v8::Value>& info,
+    CFXJSE_Value* pRetValue) {
+  if (info.Length() != 2) {
     ToFormCalcContext(pThis)->ThrowCompilerErrorException();
     return;
   }
 
-  if (fm_ref_equal(pThis, args)) {
-    args.GetReturnValue()->SetInteger(0);
+  if (fm_ref_equal(pThis, info)) {
+    pRetValue->SetInteger(0);
     return;
   }
 
-  std::unique_ptr<CFXJSE_Value> argFirst = GetSimpleValue(pThis, args, 0);
-  std::unique_ptr<CFXJSE_Value> argSecond = GetSimpleValue(pThis, args, 1);
-  if (argFirst->IsNull() || argSecond->IsNull()) {
-    args.GetReturnValue()->SetInteger(
-        (argFirst->IsNull() && argSecond->IsNull()) ? 0 : 1);
+  std::unique_ptr<CFXJSE_Value> argFirst = GetSimpleValue(pThis, info, 0);
+  std::unique_ptr<CFXJSE_Value> infoecond = GetSimpleValue(pThis, info, 1);
+  if (argFirst->IsNull() || infoecond->IsNull()) {
+    pRetValue->SetInteger((argFirst->IsNull() && infoecond->IsNull()) ? 0 : 1);
     return;
   }
 
-  if (argFirst->IsString() && argSecond->IsString()) {
-    args.GetReturnValue()->SetInteger(argFirst->ToString() !=
-                                      argSecond->ToString());
+  if (argFirst->IsString() && infoecond->IsString()) {
+    pRetValue->SetInteger(argFirst->ToString() != infoecond->ToString());
     return;
   }
 
   double first = ValueToDouble(pThis, argFirst.get());
-  double second = ValueToDouble(pThis, argSecond.get());
-  args.GetReturnValue()->SetInteger(first != second);
+  double second = ValueToDouble(pThis, infoecond.get());
+  pRetValue->SetInteger(first != second);
 }
 
 // static
-bool CFXJSE_FormCalcContext::fm_ref_equal(CFXJSE_Value* pThis,
-                                          CFXJSE_Arguments& args) {
-  std::unique_ptr<CFXJSE_Value> argFirst = args.GetValue(0);
-  std::unique_ptr<CFXJSE_Value> argSecond = args.GetValue(1);
+bool CFXJSE_FormCalcContext::fm_ref_equal(
+    CFXJSE_Value* pThis,
+    const v8::FunctionCallbackInfo<v8::Value>& info) {
+  auto argFirst = pdfium::MakeUnique<CFXJSE_Value>(info.GetIsolate(), info[0]);
+  auto argSecond = pdfium::MakeUnique<CFXJSE_Value>(info.GetIsolate(), info[1]);
   if (!argFirst->IsArray() || !argSecond->IsArray())
     return false;
 
@@ -4728,197 +4853,211 @@
 }
 
 // static
-void CFXJSE_FormCalcContext::less_operator(CFXJSE_Value* pThis,
-                                           ByteStringView bsFuncName,
-                                           CFXJSE_Arguments& args) {
-  if (args.GetLength() != 2) {
+void CFXJSE_FormCalcContext::less_operator(
+    CFXJSE_Value* pThis,
+    ByteStringView bsFuncName,
+    const v8::FunctionCallbackInfo<v8::Value>& info,
+    CFXJSE_Value* pRetValue) {
+  if (info.Length() != 2) {
     ToFormCalcContext(pThis)->ThrowCompilerErrorException();
     return;
   }
 
-  std::unique_ptr<CFXJSE_Value> argFirst = GetSimpleValue(pThis, args, 0);
-  std::unique_ptr<CFXJSE_Value> argSecond = GetSimpleValue(pThis, args, 1);
+  std::unique_ptr<CFXJSE_Value> argFirst = GetSimpleValue(pThis, info, 0);
+  std::unique_ptr<CFXJSE_Value> argSecond = GetSimpleValue(pThis, info, 1);
   if (argFirst->IsNull() || argSecond->IsNull()) {
-    args.GetReturnValue()->SetInteger(0);
+    pRetValue->SetInteger(0);
     return;
   }
 
   if (argFirst->IsString() && argSecond->IsString()) {
     int result =
         argFirst->ToString().Compare(argSecond->ToString().AsStringView()) < 0;
-    args.GetReturnValue()->SetInteger(result);
+    pRetValue->SetInteger(result);
     return;
   }
 
   double first = ValueToDouble(pThis, argFirst.get());
   double second = ValueToDouble(pThis, argSecond.get());
-  args.GetReturnValue()->SetInteger((first < second) ? 1 : 0);
+  pRetValue->SetInteger((first < second) ? 1 : 0);
 }
 
 // static
-void CFXJSE_FormCalcContext::lessequal_operator(CFXJSE_Value* pThis,
-                                                ByteStringView bsFuncName,
-                                                CFXJSE_Arguments& args) {
-  if (args.GetLength() != 2) {
+void CFXJSE_FormCalcContext::lessequal_operator(
+    CFXJSE_Value* pThis,
+    ByteStringView bsFuncName,
+    const v8::FunctionCallbackInfo<v8::Value>& info,
+    CFXJSE_Value* pRetValue) {
+  if (info.Length() != 2) {
     ToFormCalcContext(pThis)->ThrowCompilerErrorException();
     return;
   }
 
-  std::unique_ptr<CFXJSE_Value> argFirst = GetSimpleValue(pThis, args, 0);
-  std::unique_ptr<CFXJSE_Value> argSecond = GetSimpleValue(pThis, args, 1);
+  std::unique_ptr<CFXJSE_Value> argFirst = GetSimpleValue(pThis, info, 0);
+  std::unique_ptr<CFXJSE_Value> argSecond = GetSimpleValue(pThis, info, 1);
   if (argFirst->IsNull() || argSecond->IsNull()) {
-    args.GetReturnValue()->SetInteger(
-        (argFirst->IsNull() && argSecond->IsNull()) ? 1 : 0);
+    pRetValue->SetInteger((argFirst->IsNull() && argSecond->IsNull()) ? 1 : 0);
     return;
   }
 
   if (argFirst->IsString() && argSecond->IsString()) {
     int result =
         argFirst->ToString().Compare(argSecond->ToString().AsStringView()) <= 0;
-    args.GetReturnValue()->SetInteger(result);
+    pRetValue->SetInteger(result);
     return;
   }
 
   double first = ValueToDouble(pThis, argFirst.get());
   double second = ValueToDouble(pThis, argSecond.get());
-  args.GetReturnValue()->SetInteger((first <= second) ? 1 : 0);
+  pRetValue->SetInteger((first <= second) ? 1 : 0);
 }
 
 // static
-void CFXJSE_FormCalcContext::greater_operator(CFXJSE_Value* pThis,
-                                              ByteStringView bsFuncName,
-                                              CFXJSE_Arguments& args) {
-  if (args.GetLength() != 2) {
+void CFXJSE_FormCalcContext::greater_operator(
+    CFXJSE_Value* pThis,
+    ByteStringView bsFuncName,
+    const v8::FunctionCallbackInfo<v8::Value>& info,
+    CFXJSE_Value* pRetValue) {
+  if (info.Length() != 2) {
     ToFormCalcContext(pThis)->ThrowCompilerErrorException();
     return;
   }
 
-  std::unique_ptr<CFXJSE_Value> argFirst = GetSimpleValue(pThis, args, 0);
-  std::unique_ptr<CFXJSE_Value> argSecond = GetSimpleValue(pThis, args, 1);
+  std::unique_ptr<CFXJSE_Value> argFirst = GetSimpleValue(pThis, info, 0);
+  std::unique_ptr<CFXJSE_Value> argSecond = GetSimpleValue(pThis, info, 1);
   if (argFirst->IsNull() || argSecond->IsNull()) {
-    args.GetReturnValue()->SetInteger(0);
+    pRetValue->SetInteger(0);
     return;
   }
 
   if (argFirst->IsString() && argSecond->IsString()) {
     int result =
         argFirst->ToString().Compare(argSecond->ToString().AsStringView()) > 0;
-    args.GetReturnValue()->SetInteger(result);
+    pRetValue->SetInteger(result);
     return;
   }
 
   double first = ValueToDouble(pThis, argFirst.get());
   double second = ValueToDouble(pThis, argSecond.get());
-  args.GetReturnValue()->SetInteger((first > second) ? 1 : 0);
+  pRetValue->SetInteger((first > second) ? 1 : 0);
 }
 
 // static
-void CFXJSE_FormCalcContext::greaterequal_operator(CFXJSE_Value* pThis,
-                                                   ByteStringView bsFuncName,
-                                                   CFXJSE_Arguments& args) {
-  if (args.GetLength() != 2) {
+void CFXJSE_FormCalcContext::greaterequal_operator(
+    CFXJSE_Value* pThis,
+    ByteStringView bsFuncName,
+    const v8::FunctionCallbackInfo<v8::Value>& info,
+    CFXJSE_Value* pRetValue) {
+  if (info.Length() != 2) {
     ToFormCalcContext(pThis)->ThrowCompilerErrorException();
     return;
   }
 
-  std::unique_ptr<CFXJSE_Value> argFirst = GetSimpleValue(pThis, args, 0);
-  std::unique_ptr<CFXJSE_Value> argSecond = GetSimpleValue(pThis, args, 1);
+  std::unique_ptr<CFXJSE_Value> argFirst = GetSimpleValue(pThis, info, 0);
+  std::unique_ptr<CFXJSE_Value> argSecond = GetSimpleValue(pThis, info, 1);
   if (argFirst->IsNull() || argSecond->IsNull()) {
-    args.GetReturnValue()->SetInteger(
-        (argFirst->IsNull() && argSecond->IsNull()) ? 1 : 0);
+    pRetValue->SetInteger((argFirst->IsNull() && argSecond->IsNull()) ? 1 : 0);
     return;
   }
 
   if (argFirst->IsString() && argSecond->IsString()) {
     int result =
         argFirst->ToString().Compare(argSecond->ToString().AsStringView()) >= 0;
-    args.GetReturnValue()->SetInteger(result);
+    pRetValue->SetInteger(result);
     return;
   }
 
   double first = ValueToDouble(pThis, argFirst.get());
   double second = ValueToDouble(pThis, argSecond.get());
-  args.GetReturnValue()->SetInteger((first >= second) ? 1 : 0);
+  pRetValue->SetInteger((first >= second) ? 1 : 0);
 }
 
 // static
-void CFXJSE_FormCalcContext::plus_operator(CFXJSE_Value* pThis,
-                                           ByteStringView bsFuncName,
-                                           CFXJSE_Arguments& args) {
-  if (args.GetLength() != 2) {
+void CFXJSE_FormCalcContext::plus_operator(
+    CFXJSE_Value* pThis,
+    ByteStringView bsFuncName,
+    const v8::FunctionCallbackInfo<v8::Value>& info,
+    CFXJSE_Value* pRetValue) {
+  if (info.Length() != 2) {
     ToFormCalcContext(pThis)->ThrowCompilerErrorException();
     return;
   }
 
-  std::unique_ptr<CFXJSE_Value> argFirst = args.GetValue(0);
-  std::unique_ptr<CFXJSE_Value> argSecond = args.GetValue(1);
+  auto argFirst = pdfium::MakeUnique<CFXJSE_Value>(info.GetIsolate(), info[0]);
+  auto argSecond = pdfium::MakeUnique<CFXJSE_Value>(info.GetIsolate(), info[1]);
   if (ValueIsNull(pThis, argFirst.get()) &&
       ValueIsNull(pThis, argSecond.get())) {
-    args.GetReturnValue()->SetNull();
+    pRetValue->SetNull();
     return;
   }
 
   double first = ValueToDouble(pThis, argFirst.get());
   double second = ValueToDouble(pThis, argSecond.get());
-  args.GetReturnValue()->SetDouble(first + second);
+  pRetValue->SetDouble(first + second);
 }
 
 // static
-void CFXJSE_FormCalcContext::minus_operator(CFXJSE_Value* pThis,
-                                            ByteStringView bsFuncName,
-                                            CFXJSE_Arguments& args) {
-  if (args.GetLength() != 2) {
+void CFXJSE_FormCalcContext::minus_operator(
+    CFXJSE_Value* pThis,
+    ByteStringView bsFuncName,
+    const v8::FunctionCallbackInfo<v8::Value>& info,
+    CFXJSE_Value* pRetValue) {
+  if (info.Length() != 2) {
     ToFormCalcContext(pThis)->ThrowCompilerErrorException();
     return;
   }
 
-  std::unique_ptr<CFXJSE_Value> argFirst = GetSimpleValue(pThis, args, 0);
-  std::unique_ptr<CFXJSE_Value> argSecond = GetSimpleValue(pThis, args, 1);
+  std::unique_ptr<CFXJSE_Value> argFirst = GetSimpleValue(pThis, info, 0);
+  std::unique_ptr<CFXJSE_Value> argSecond = GetSimpleValue(pThis, info, 1);
   if (argFirst->IsNull() && argSecond->IsNull()) {
-    args.GetReturnValue()->SetNull();
+    pRetValue->SetNull();
     return;
   }
 
   double first = ValueToDouble(pThis, argFirst.get());
   double second = ValueToDouble(pThis, argSecond.get());
-  args.GetReturnValue()->SetDouble(first - second);
+  pRetValue->SetDouble(first - second);
 }
 
 // static
-void CFXJSE_FormCalcContext::multiple_operator(CFXJSE_Value* pThis,
-                                               ByteStringView bsFuncName,
-                                               CFXJSE_Arguments& args) {
-  if (args.GetLength() != 2) {
+void CFXJSE_FormCalcContext::multiple_operator(
+    CFXJSE_Value* pThis,
+    ByteStringView bsFuncName,
+    const v8::FunctionCallbackInfo<v8::Value>& info,
+    CFXJSE_Value* pRetValue) {
+  if (info.Length() != 2) {
     ToFormCalcContext(pThis)->ThrowCompilerErrorException();
     return;
   }
 
-  std::unique_ptr<CFXJSE_Value> argFirst = GetSimpleValue(pThis, args, 0);
-  std::unique_ptr<CFXJSE_Value> argSecond = GetSimpleValue(pThis, args, 1);
+  std::unique_ptr<CFXJSE_Value> argFirst = GetSimpleValue(pThis, info, 0);
+  std::unique_ptr<CFXJSE_Value> argSecond = GetSimpleValue(pThis, info, 1);
   if (argFirst->IsNull() && argSecond->IsNull()) {
-    args.GetReturnValue()->SetNull();
+    pRetValue->SetNull();
     return;
   }
 
   double first = ValueToDouble(pThis, argFirst.get());
   double second = ValueToDouble(pThis, argSecond.get());
-  args.GetReturnValue()->SetDouble(first * second);
+  pRetValue->SetDouble(first * second);
 }
 
 // static
-void CFXJSE_FormCalcContext::divide_operator(CFXJSE_Value* pThis,
-                                             ByteStringView bsFuncName,
-                                             CFXJSE_Arguments& args) {
+void CFXJSE_FormCalcContext::divide_operator(
+    CFXJSE_Value* pThis,
+    ByteStringView bsFuncName,
+    const v8::FunctionCallbackInfo<v8::Value>& info,
+    CFXJSE_Value* pRetValue) {
   CFXJSE_FormCalcContext* pContext = ToFormCalcContext(pThis);
-  if (args.GetLength() != 2) {
+  if (info.Length() != 2) {
     pContext->ThrowCompilerErrorException();
     return;
   }
 
-  std::unique_ptr<CFXJSE_Value> argFirst = GetSimpleValue(pThis, args, 0);
-  std::unique_ptr<CFXJSE_Value> argSecond = GetSimpleValue(pThis, args, 1);
+  std::unique_ptr<CFXJSE_Value> argFirst = GetSimpleValue(pThis, info, 0);
+  std::unique_ptr<CFXJSE_Value> argSecond = GetSimpleValue(pThis, info, 1);
   if (argFirst->IsNull() && argSecond->IsNull()) {
-    args.GetReturnValue()->SetNull();
+    pRetValue->SetNull();
     return;
   }
 
@@ -4929,87 +5068,99 @@
   }
 
   double first = ValueToDouble(pThis, argFirst.get());
-  args.GetReturnValue()->SetDouble(first / second);
+  pRetValue->SetDouble(first / second);
 }
 
 // static
-void CFXJSE_FormCalcContext::positive_operator(CFXJSE_Value* pThis,
-                                               ByteStringView bsFuncName,
-                                               CFXJSE_Arguments& args) {
-  if (args.GetLength() != 1) {
+void CFXJSE_FormCalcContext::positive_operator(
+    CFXJSE_Value* pThis,
+    ByteStringView bsFuncName,
+    const v8::FunctionCallbackInfo<v8::Value>& info,
+    CFXJSE_Value* pRetValue) {
+  if (info.Length() != 1) {
     ToFormCalcContext(pThis)->ThrowCompilerErrorException();
     return;
   }
 
-  std::unique_ptr<CFXJSE_Value> argOne = GetSimpleValue(pThis, args, 0);
+  std::unique_ptr<CFXJSE_Value> argOne = GetSimpleValue(pThis, info, 0);
   if (argOne->IsNull()) {
-    args.GetReturnValue()->SetNull();
+    pRetValue->SetNull();
     return;
   }
-  args.GetReturnValue()->SetDouble(0.0 + ValueToDouble(pThis, argOne.get()));
+  pRetValue->SetDouble(0.0 + ValueToDouble(pThis, argOne.get()));
 }
 
 // static
-void CFXJSE_FormCalcContext::negative_operator(CFXJSE_Value* pThis,
-                                               ByteStringView bsFuncName,
-                                               CFXJSE_Arguments& args) {
-  if (args.GetLength() != 1) {
+void CFXJSE_FormCalcContext::negative_operator(
+    CFXJSE_Value* pThis,
+    ByteStringView bsFuncName,
+    const v8::FunctionCallbackInfo<v8::Value>& info,
+    CFXJSE_Value* pRetValue) {
+  if (info.Length() != 1) {
     ToFormCalcContext(pThis)->ThrowCompilerErrorException();
     return;
   }
 
-  std::unique_ptr<CFXJSE_Value> argOne = GetSimpleValue(pThis, args, 0);
+  std::unique_ptr<CFXJSE_Value> argOne = GetSimpleValue(pThis, info, 0);
   if (argOne->IsNull()) {
-    args.GetReturnValue()->SetNull();
+    pRetValue->SetNull();
     return;
   }
-  args.GetReturnValue()->SetDouble(0.0 - ValueToDouble(pThis, argOne.get()));
+  pRetValue->SetDouble(0.0 - ValueToDouble(pThis, argOne.get()));
 }
 
 // static
-void CFXJSE_FormCalcContext::logical_not_operator(CFXJSE_Value* pThis,
-                                                  ByteStringView bsFuncName,
-                                                  CFXJSE_Arguments& args) {
-  if (args.GetLength() != 1) {
+void CFXJSE_FormCalcContext::logical_not_operator(
+    CFXJSE_Value* pThis,
+    ByteStringView bsFuncName,
+    const v8::FunctionCallbackInfo<v8::Value>& info,
+    CFXJSE_Value* pRetValue) {
+  if (info.Length() != 1) {
     ToFormCalcContext(pThis)->ThrowCompilerErrorException();
     return;
   }
 
-  std::unique_ptr<CFXJSE_Value> argOne = GetSimpleValue(pThis, args, 0);
+  std::unique_ptr<CFXJSE_Value> argOne = GetSimpleValue(pThis, info, 0);
   if (argOne->IsNull()) {
-    args.GetReturnValue()->SetNull();
+    pRetValue->SetNull();
     return;
   }
 
   double first = ValueToDouble(pThis, argOne.get());
-  args.GetReturnValue()->SetInteger((first == 0.0) ? 1 : 0);
+  pRetValue->SetInteger((first == 0.0) ? 1 : 0);
 }
 
 // static
-void CFXJSE_FormCalcContext::dot_accessor(CFXJSE_Value* pThis,
-                                          ByteStringView bsFuncName,
-                                          CFXJSE_Arguments& args) {
-  DotAccessorCommon(pThis, bsFuncName, args, /*bDotAccessor=*/true);
+void CFXJSE_FormCalcContext::dot_accessor(
+    CFXJSE_Value* pThis,
+    ByteStringView bsFuncName,
+    const v8::FunctionCallbackInfo<v8::Value>& info,
+    CFXJSE_Value* pRetValue) {
+  DotAccessorCommon(pThis, bsFuncName, info, pRetValue, /*bDotAccessor=*/true);
 }
 
 // static
-void CFXJSE_FormCalcContext::dotdot_accessor(CFXJSE_Value* pThis,
-                                             ByteStringView bsFuncName,
-                                             CFXJSE_Arguments& args) {
-  DotAccessorCommon(pThis, bsFuncName, args, /*bDotAccessor=*/false);
+void CFXJSE_FormCalcContext::dotdot_accessor(
+    CFXJSE_Value* pThis,
+    ByteStringView bsFuncName,
+    const v8::FunctionCallbackInfo<v8::Value>& info,
+    CFXJSE_Value* pRetValue) {
+  DotAccessorCommon(pThis, bsFuncName, info, pRetValue, /*bDotAccessor=*/false);
 }
 
 // static
-void CFXJSE_FormCalcContext::eval_translation(CFXJSE_Value* pThis,
-                                              ByteStringView bsFuncName,
-                                              CFXJSE_Arguments& args) {
+void CFXJSE_FormCalcContext::eval_translation(
+    CFXJSE_Value* pThis,
+    ByteStringView bsFuncName,
+    const v8::FunctionCallbackInfo<v8::Value>& info,
+    CFXJSE_Value* pRetValue) {
   CFXJSE_FormCalcContext* pContext = ToFormCalcContext(pThis);
-  if (args.GetLength() != 1) {
+  if (info.Length() != 1) {
     pContext->ThrowParamCountMismatchException(L"Eval");
     return;
   }
 
-  std::unique_ptr<CFXJSE_Value> argOne = GetSimpleValue(pThis, args, 0);
+  std::unique_ptr<CFXJSE_Value> argOne = GetSimpleValue(pThis, info, 0);
   ByteString bsArg = ValueToUTF8String(argOne.get());
   if (bsArg.IsEmpty()) {
     pContext->ThrowArgumentMismatchException();
@@ -5024,47 +5175,53 @@
     return;
   }
 
-  args.GetReturnValue()->SetString(
+  pRetValue->SetString(
       FX_UTF8Encode(wsJavaScriptBuf.AsStringView()).AsStringView());
 }
 
 // static
-void CFXJSE_FormCalcContext::is_fm_object(CFXJSE_Value* pThis,
-                                          ByteStringView bsFuncName,
-                                          CFXJSE_Arguments& args) {
-  if (args.GetLength() != 1) {
-    args.GetReturnValue()->SetBoolean(false);
+void CFXJSE_FormCalcContext::is_fm_object(
+    CFXJSE_Value* pThis,
+    ByteStringView bsFuncName,
+    const v8::FunctionCallbackInfo<v8::Value>& info,
+    CFXJSE_Value* pRetValue) {
+  if (info.Length() != 1) {
+    pRetValue->SetBoolean(false);
     return;
   }
 
-  std::unique_ptr<CFXJSE_Value> argOne = args.GetValue(0);
-  args.GetReturnValue()->SetBoolean(argOne->IsObject());
+  auto argOne = pdfium::MakeUnique<CFXJSE_Value>(info.GetIsolate(), info[0]);
+  pRetValue->SetBoolean(argOne->IsObject());
 }
 
 // static
-void CFXJSE_FormCalcContext::is_fm_array(CFXJSE_Value* pThis,
-                                         ByteStringView bsFuncName,
-                                         CFXJSE_Arguments& args) {
-  if (args.GetLength() != 1) {
-    args.GetReturnValue()->SetBoolean(false);
+void CFXJSE_FormCalcContext::is_fm_array(
+    CFXJSE_Value* pThis,
+    ByteStringView bsFuncName,
+    const v8::FunctionCallbackInfo<v8::Value>& info,
+    CFXJSE_Value* pRetValue) {
+  if (info.Length() != 1) {
+    pRetValue->SetBoolean(false);
     return;
   }
 
-  std::unique_ptr<CFXJSE_Value> argOne = args.GetValue(0);
-  args.GetReturnValue()->SetBoolean(argOne->IsArray());
+  auto argOne = pdfium::MakeUnique<CFXJSE_Value>(info.GetIsolate(), info[0]);
+  pRetValue->SetBoolean(argOne->IsArray());
 }
 
 // static
-void CFXJSE_FormCalcContext::get_fm_value(CFXJSE_Value* pThis,
-                                          ByteStringView bsFuncName,
-                                          CFXJSE_Arguments& args) {
+void CFXJSE_FormCalcContext::get_fm_value(
+    CFXJSE_Value* pThis,
+    ByteStringView bsFuncName,
+    const v8::FunctionCallbackInfo<v8::Value>& info,
+    CFXJSE_Value* pRetValue) {
   CFXJSE_FormCalcContext* pContext = ToFormCalcContext(pThis);
-  if (args.GetLength() != 1) {
+  if (info.Length() != 1) {
     pContext->ThrowCompilerErrorException();
     return;
   }
 
-  std::unique_ptr<CFXJSE_Value> argOne = args.GetValue(0);
+  auto argOne = pdfium::MakeUnique<CFXJSE_Value>(info.GetIsolate(), info[0]);
   if (argOne->IsArray()) {
     v8::Isolate* pIsolate = pContext->GetScriptRuntime();
     auto propertyValue = pdfium::MakeUnique<CFXJSE_Value>(pIsolate);
@@ -5072,35 +5229,37 @@
     argOne->GetObjectPropertyByIdx(1, propertyValue.get());
     argOne->GetObjectPropertyByIdx(2, jsObjectValue.get());
     if (propertyValue->IsNull()) {
-      GetObjectDefaultValue(jsObjectValue.get(), args.GetReturnValue());
+      GetObjectDefaultValue(jsObjectValue.get(), pRetValue);
       return;
     }
 
     jsObjectValue->GetObjectProperty(propertyValue->ToString().AsStringView(),
-                                     args.GetReturnValue());
+                                     pRetValue);
     return;
   }
 
   if (argOne->IsObject()) {
-    GetObjectDefaultValue(argOne.get(), args.GetReturnValue());
+    GetObjectDefaultValue(argOne.get(), pRetValue);
     return;
   }
 
-  args.GetReturnValue()->Assign(argOne.get());
+  pRetValue->Assign(argOne.get());
 }
 
 // static
-void CFXJSE_FormCalcContext::get_fm_jsobj(CFXJSE_Value* pThis,
-                                          ByteStringView bsFuncName,
-                                          CFXJSE_Arguments& args) {
-  if (args.GetLength() != 1) {
+void CFXJSE_FormCalcContext::get_fm_jsobj(
+    CFXJSE_Value* pThis,
+    ByteStringView bsFuncName,
+    const v8::FunctionCallbackInfo<v8::Value>& info,
+    CFXJSE_Value* pRetValue) {
+  if (info.Length() != 1) {
     ToFormCalcContext(pThis)->ThrowCompilerErrorException();
     return;
   }
 
-  std::unique_ptr<CFXJSE_Value> argOne = args.GetValue(0);
+  auto argOne = pdfium::MakeUnique<CFXJSE_Value>(info.GetIsolate(), info[0]);
   if (!argOne->IsArray()) {
-    args.GetReturnValue()->Assign(argOne.get());
+    pRetValue->Assign(argOne.get());
     return;
   }
 
@@ -5112,24 +5271,26 @@
   ASSERT(lengthValue->ToInteger() >= 3);
 #endif
 
-  argOne->GetObjectPropertyByIdx(2, args.GetReturnValue());
+  argOne->GetObjectPropertyByIdx(2, pRetValue);
 }
 
 // static
-void CFXJSE_FormCalcContext::fm_var_filter(CFXJSE_Value* pThis,
-                                           ByteStringView bsFuncName,
-                                           CFXJSE_Arguments& args) {
+void CFXJSE_FormCalcContext::fm_var_filter(
+    CFXJSE_Value* pThis,
+    ByteStringView bsFuncName,
+    const v8::FunctionCallbackInfo<v8::Value>& info,
+    CFXJSE_Value* pRetValue) {
   CFXJSE_FormCalcContext* pContext = ToFormCalcContext(pThis);
-  if (args.GetLength() != 1) {
+  if (info.Length() != 1) {
     pContext->ThrowCompilerErrorException();
     return;
   }
 
   v8::Isolate* pIsolate = pContext->GetScriptRuntime();
-  std::unique_ptr<CFXJSE_Value> argOne = args.GetValue(0);
+  auto argOne = pdfium::MakeUnique<CFXJSE_Value>(info.GetIsolate(), info[0]);
   if (!argOne->IsArray()) {
-    std::unique_ptr<CFXJSE_Value> simpleValue = GetSimpleValue(pThis, args, 0);
-    args.GetReturnValue()->Assign(simpleValue.get());
+    std::unique_ptr<CFXJSE_Value> simpleValue = GetSimpleValue(pThis, info, 0);
+    pRetValue->Assign(simpleValue.get());
     return;
   }
 
@@ -5143,8 +5304,8 @@
   argOne->GetObjectPropertyByIdx(0, flagsValue.get());
   int32_t iFlags = flagsValue->ToInteger();
   if (iFlags != 3 && iFlags != 4) {
-    std::unique_ptr<CFXJSE_Value> simpleValue = GetSimpleValue(pThis, args, 0);
-    args.GetReturnValue()->Assign(simpleValue.get());
+    std::unique_ptr<CFXJSE_Value> simpleValue = GetSimpleValue(pThis, info, 0);
+    pRetValue->Assign(simpleValue.get());
     return;
   }
 
@@ -5156,7 +5317,7 @@
     values[0]->SetInteger(3);
     values[1]->SetNull();
     values[2]->SetNull();
-    args.GetReturnValue()->SetArray(values);
+    pRetValue->SetArray(values);
     return;
   }
 
@@ -5166,17 +5327,19 @@
     pContext->ThrowCompilerErrorException();
     return;
   }
-  args.GetReturnValue()->Assign(argOne.get());
+  pRetValue->Assign(argOne.get());
 }
 
 // static
-void CFXJSE_FormCalcContext::concat_fm_object(CFXJSE_Value* pThis,
-                                              ByteStringView bsFuncName,
-                                              CFXJSE_Arguments& args) {
+void CFXJSE_FormCalcContext::concat_fm_object(
+    CFXJSE_Value* pThis,
+    ByteStringView bsFuncName,
+    const v8::FunctionCallbackInfo<v8::Value>& info,
+    CFXJSE_Value* pRetValue) {
   v8::Isolate* pIsolate = ToFormCalcContext(pThis)->GetScriptRuntime();
   std::vector<std::unique_ptr<CFXJSE_Value>> returnValues;
-  for (int32_t i = 0; i < args.GetLength(); ++i) {
-    std::unique_ptr<CFXJSE_Value> argValue = args.GetValue(i);
+  for (int32_t i = 0; i < info.Length(); ++i) {
+    auto argValue = pdfium::MakeUnique<CFXJSE_Value>(pIsolate, info[i]);
     if (argValue->IsArray()) {
       auto lengthValue = pdfium::MakeUnique<CFXJSE_Value>(pIsolate);
       argValue->GetObjectProperty("length", lengthValue.get());
@@ -5189,18 +5352,19 @@
     returnValues.push_back(pdfium::MakeUnique<CFXJSE_Value>(pIsolate));
     returnValues.back()->Assign(argValue.get());
   }
-  args.GetReturnValue()->SetArray(returnValues);
+  pRetValue->SetArray(returnValues);
 }
 
 // static
 std::unique_ptr<CFXJSE_Value> CFXJSE_FormCalcContext::GetSimpleValue(
     CFXJSE_Value* pThis,
-    CFXJSE_Arguments& args,
+    const v8::FunctionCallbackInfo<v8::Value>& info,
     uint32_t index) {
   v8::Isolate* pIsolate = ToFormCalcContext(pThis)->GetScriptRuntime();
-  ASSERT(index < (uint32_t)args.GetLength());
+  ASSERT(index < (uint32_t)info.Length());
 
-  std::unique_ptr<CFXJSE_Value> argIndex = args.GetValue(index);
+  auto argIndex =
+      pdfium::MakeUnique<CFXJSE_Value>(info.GetIsolate(), info[index]);
   if (!argIndex->IsArray() && !argIndex->IsObject())
     return argIndex;
 
@@ -5307,11 +5471,11 @@
 // static
 std::vector<std::unique_ptr<CFXJSE_Value>> CFXJSE_FormCalcContext::unfoldArgs(
     CFXJSE_Value* pThis,
-    CFXJSE_Arguments& args) {
+    const v8::FunctionCallbackInfo<v8::Value>& info) {
   std::vector<std::unique_ptr<CFXJSE_Value>> results;
   v8::Isolate* pIsolate = ToFormCalcContext(pThis)->GetScriptRuntime();
-  for (int32_t i = 1; i < args.GetLength(); ++i) {
-    std::unique_ptr<CFXJSE_Value> arg = args.GetValue(i);
+  for (int32_t i = 1; i < info.Length(); ++i) {
+    auto arg = pdfium::MakeUnique<CFXJSE_Value>(pIsolate, info[i]);
     if (arg->IsArray()) {
       auto lengthValue = pdfium::MakeUnique<CFXJSE_Value>(pIsolate);
       arg->GetObjectProperty("length", lengthValue.get());
@@ -5682,13 +5846,15 @@
 }
 
 // static
-void CFXJSE_FormCalcContext::DotAccessorCommon(CFXJSE_Value* pThis,
-                                               ByteStringView bsFuncName,
-                                               CFXJSE_Arguments& args,
-                                               bool bDotAccessor) {
+void CFXJSE_FormCalcContext::DotAccessorCommon(
+    CFXJSE_Value* pThis,
+    ByteStringView bsFuncName,
+    const v8::FunctionCallbackInfo<v8::Value>& info,
+    CFXJSE_Value* pRetValue,
+    bool bDotAccessor) {
   CFXJSE_FormCalcContext* pContext = ToFormCalcContext(pThis);
   v8::Isolate* pIsolate = pContext->GetScriptRuntime();
-  int32_t argc = args.GetLength();
+  int32_t argc = info.Length();
   if (argc < 4 || argc > 5) {
     pContext->ThrowCompilerErrorException();
     return;
@@ -5698,15 +5864,20 @@
   int32_t iIndexValue = 0;
   if (argc > 4) {
     bIsStar = false;
-    iIndexValue = ValueToInteger(pThis, args.GetValue(4).get());
+    auto temp = pdfium::MakeUnique<CFXJSE_Value>(info.GetIsolate(), info[4]);
+    iIndexValue = ValueToInteger(pThis, temp.get());
   }
 
-  const ByteString bsName = args.GetUTF8String(2);
+  const ByteString bsName =
+      CFX_V8::ReentrantToByteStringHelper(info.GetIsolate(), info[2]);
   const bool bHasNoResolveName = bDotAccessor && bsName.IsEmpty();
   ByteString bsSomExp = GenerateSomExpression(
-      bsName.AsStringView(), args.GetInt32(3), iIndexValue, bIsStar);
+      bsName.AsStringView(),
+      CFX_V8::ReentrantToInt32Helper(info.GetIsolate(), info[3]), iIndexValue,
+      bIsStar);
 
-  std::unique_ptr<CFXJSE_Value> argAccessor = args.GetValue(0);
+  auto argAccessor =
+      pdfium::MakeUnique<CFXJSE_Value>(info.GetIsolate(), info[0]);
   if (argAccessor->IsArray()) {
     auto pLengthValue = pdfium::MakeUnique<CFXJSE_Value>(pIsolate);
     argAccessor->GetObjectProperty("length", pLengthValue.get());
@@ -5753,13 +5924,14 @@
         values.back()->Assign(resolveValues[i][j].get());
       }
     }
-    args.GetReturnValue()->SetArray(values);
+    pRetValue->SetArray(values);
     return;
   }
 
   XFA_RESOLVENODE_RS resolveNodeRS;
   bool bRet = false;
-  ByteString bsAccessorName = args.GetUTF8String(1);
+  ByteString bsAccessorName =
+      CFX_V8::ReentrantToByteStringHelper(info.GetIsolate(), info[1]);
   if (argAccessor->IsObject() ||
       (argAccessor->IsNull() && bsAccessorName.IsEmpty())) {
     bRet = ResolveObjects(pThis, argAccessor.get(), bsSomExp.AsStringView(),
@@ -5795,7 +5967,7 @@
   for (size_t i = 0; i < resolveValues.size(); i++)
     values[i + 2]->Assign(resolveValues[i].get());
 
-  args.GetReturnValue()->SetArray(values);
+  pRetValue->SetArray(values);
 }
 
 void CFXJSE_FormCalcContext::ThrowNoDefaultPropertyException(
diff --git a/fxjs/xfa/cfxjse_formcalc_context.h b/fxjs/xfa/cfxjse_formcalc_context.h
index d0c1dce..6d92b75 100644
--- a/fxjs/xfa/cfxjse_formcalc_context.h
+++ b/fxjs/xfa/cfxjse_formcalc_context.h
@@ -14,7 +14,6 @@
 #include "fxjs/xfa/fxjse.h"
 #include "xfa/fxfa/parser/xfa_resolvenode_rs.h"
 
-class CFXJSE_Arguments;
 class CFXJSE_Context;
 class CFX_WideTextBuf;
 class CXFA_Document;
@@ -31,73 +30,96 @@
 
   static void Abs(CFXJSE_Value* pThis,
                   ByteStringView bsFuncName,
-                  CFXJSE_Arguments& args);
+                  const v8::FunctionCallbackInfo<v8::Value>& info,
+                  CFXJSE_Value* pRetValue);
   static void Avg(CFXJSE_Value* pThis,
                   ByteStringView bsFuncName,
-                  CFXJSE_Arguments& args);
+                  const v8::FunctionCallbackInfo<v8::Value>& info,
+                  CFXJSE_Value* pRetValue);
   static void Ceil(CFXJSE_Value* pThis,
                    ByteStringView bsFuncName,
-                   CFXJSE_Arguments& args);
+                   const v8::FunctionCallbackInfo<v8::Value>& info,
+                   CFXJSE_Value* pRetValue);
   static void Count(CFXJSE_Value* pThis,
                     ByteStringView bsFuncName,
-                    CFXJSE_Arguments& args);
+                    const v8::FunctionCallbackInfo<v8::Value>& info,
+                    CFXJSE_Value* pRetValue);
   static void Floor(CFXJSE_Value* pThis,
                     ByteStringView bsFuncName,
-                    CFXJSE_Arguments& args);
+                    const v8::FunctionCallbackInfo<v8::Value>& info,
+                    CFXJSE_Value* pRetValue);
   static void Max(CFXJSE_Value* pThis,
                   ByteStringView bsFuncName,
-                  CFXJSE_Arguments& args);
+                  const v8::FunctionCallbackInfo<v8::Value>& info,
+                  CFXJSE_Value* pRetValue);
   static void Min(CFXJSE_Value* pThis,
                   ByteStringView bsFuncName,
-                  CFXJSE_Arguments& args);
+                  const v8::FunctionCallbackInfo<v8::Value>& info,
+                  CFXJSE_Value* pRetValue);
   static void Mod(CFXJSE_Value* pThis,
                   ByteStringView bsFuncName,
-                  CFXJSE_Arguments& args);
+                  const v8::FunctionCallbackInfo<v8::Value>& info,
+                  CFXJSE_Value* pRetValue);
   static void Round(CFXJSE_Value* pThis,
                     ByteStringView bsFuncName,
-                    CFXJSE_Arguments& args);
+                    const v8::FunctionCallbackInfo<v8::Value>& info,
+                    CFXJSE_Value* pRetValue);
   static void Sum(CFXJSE_Value* pThis,
                   ByteStringView bsFuncName,
-                  CFXJSE_Arguments& args);
+                  const v8::FunctionCallbackInfo<v8::Value>& info,
+                  CFXJSE_Value* pRetValue);
   static void Date(CFXJSE_Value* pThis,
                    ByteStringView bsFuncName,
-                   CFXJSE_Arguments& args);
+                   const v8::FunctionCallbackInfo<v8::Value>& info,
+                   CFXJSE_Value* pRetValue);
   static void Date2Num(CFXJSE_Value* pThis,
                        ByteStringView bsFuncName,
-                       CFXJSE_Arguments& args);
+                       const v8::FunctionCallbackInfo<v8::Value>& info,
+                       CFXJSE_Value* pRetValue);
   static void DateFmt(CFXJSE_Value* pThis,
                       ByteStringView bsFuncName,
-                      CFXJSE_Arguments& args);
+                      const v8::FunctionCallbackInfo<v8::Value>& info,
+                      CFXJSE_Value* pRetValue);
   static void IsoDate2Num(CFXJSE_Value* pThis,
                           ByteStringView bsFuncName,
-                          CFXJSE_Arguments& args);
+                          const v8::FunctionCallbackInfo<v8::Value>& info,
+                          CFXJSE_Value* pRetValue);
   static void IsoTime2Num(CFXJSE_Value* pThis,
                           ByteStringView bsFuncName,
-                          CFXJSE_Arguments& args);
+                          const v8::FunctionCallbackInfo<v8::Value>& info,
+                          CFXJSE_Value* pRetValue);
   static void LocalDateFmt(CFXJSE_Value* pThis,
                            ByteStringView bsFuncName,
-                           CFXJSE_Arguments& args);
+                           const v8::FunctionCallbackInfo<v8::Value>& info,
+                           CFXJSE_Value* pRetValue);
   static void LocalTimeFmt(CFXJSE_Value* pThis,
                            ByteStringView bsFuncName,
-                           CFXJSE_Arguments& args);
+                           const v8::FunctionCallbackInfo<v8::Value>& info,
+                           CFXJSE_Value* pRetValue);
   static void Num2Date(CFXJSE_Value* pThis,
                        ByteStringView bsFuncName,
-                       CFXJSE_Arguments& args);
+                       const v8::FunctionCallbackInfo<v8::Value>& info,
+                       CFXJSE_Value* pRetValue);
   static void Num2GMTime(CFXJSE_Value* pThis,
                          ByteStringView bsFuncName,
-                         CFXJSE_Arguments& args);
+                         const v8::FunctionCallbackInfo<v8::Value>& info,
+                         CFXJSE_Value* pRetValue);
   static void Num2Time(CFXJSE_Value* pThis,
                        ByteStringView bsFuncName,
-                       CFXJSE_Arguments& args);
+                       const v8::FunctionCallbackInfo<v8::Value>& info,
+                       CFXJSE_Value* pRetValue);
   static void Time(CFXJSE_Value* pThis,
                    ByteStringView bsFuncName,
-                   CFXJSE_Arguments& args);
+                   const v8::FunctionCallbackInfo<v8::Value>& info,
+                   CFXJSE_Value* pRetValue);
   static void Time2Num(CFXJSE_Value* pThis,
                        ByteStringView bsFuncName,
-                       CFXJSE_Arguments& args);
+                       const v8::FunctionCallbackInfo<v8::Value>& info,
+                       CFXJSE_Value* pRetValue);
   static void TimeFmt(CFXJSE_Value* pThis,
                       ByteStringView bsFuncName,
-                      CFXJSE_Arguments& args);
+                      const v8::FunctionCallbackInfo<v8::Value>& info,
+                      CFXJSE_Value* pRetValue);
 
   static ByteString Local2IsoDate(CFXJSE_Value* pThis,
                                   ByteStringView bsDate,
@@ -133,211 +155,287 @@
 
   static void Apr(CFXJSE_Value* pThis,
                   ByteStringView bsFuncName,
-                  CFXJSE_Arguments& args);
+                  const v8::FunctionCallbackInfo<v8::Value>& info,
+                  CFXJSE_Value* pRetValue);
   static void CTerm(CFXJSE_Value* pThis,
                     ByteStringView bsFuncName,
-                    CFXJSE_Arguments& args);
+                    const v8::FunctionCallbackInfo<v8::Value>& info,
+                    CFXJSE_Value* pRetValue);
   static void FV(CFXJSE_Value* pThis,
                  ByteStringView bsFuncName,
-                 CFXJSE_Arguments& args);
+                 const v8::FunctionCallbackInfo<v8::Value>& info,
+                 CFXJSE_Value* pRetValue);
   static void IPmt(CFXJSE_Value* pThis,
                    ByteStringView bsFuncName,
-                   CFXJSE_Arguments& args);
+                   const v8::FunctionCallbackInfo<v8::Value>& info,
+                   CFXJSE_Value* pRetValue);
   static void NPV(CFXJSE_Value* pThis,
                   ByteStringView bsFuncName,
-                  CFXJSE_Arguments& args);
+                  const v8::FunctionCallbackInfo<v8::Value>& info,
+                  CFXJSE_Value* pRetValue);
   static void Pmt(CFXJSE_Value* pThis,
                   ByteStringView bsFuncName,
-                  CFXJSE_Arguments& args);
+                  const v8::FunctionCallbackInfo<v8::Value>& info,
+                  CFXJSE_Value* pRetValue);
   static void PPmt(CFXJSE_Value* pThis,
                    ByteStringView bsFuncName,
-                   CFXJSE_Arguments& args);
+                   const v8::FunctionCallbackInfo<v8::Value>& info,
+                   CFXJSE_Value* pRetValue);
   static void PV(CFXJSE_Value* pThis,
                  ByteStringView bsFuncName,
-                 CFXJSE_Arguments& args);
+                 const v8::FunctionCallbackInfo<v8::Value>& info,
+                 CFXJSE_Value* pRetValue);
   static void Rate(CFXJSE_Value* pThis,
                    ByteStringView bsFuncName,
-                   CFXJSE_Arguments& args);
+                   const v8::FunctionCallbackInfo<v8::Value>& info,
+                   CFXJSE_Value* pRetValue);
   static void Term(CFXJSE_Value* pThis,
                    ByteStringView bsFuncName,
-                   CFXJSE_Arguments& args);
+                   const v8::FunctionCallbackInfo<v8::Value>& info,
+                   CFXJSE_Value* pRetValue);
   static void Choose(CFXJSE_Value* pThis,
                      ByteStringView bsFuncName,
-                     CFXJSE_Arguments& args);
+                     const v8::FunctionCallbackInfo<v8::Value>& info,
+                     CFXJSE_Value* pRetValue);
   static void Exists(CFXJSE_Value* pThis,
                      ByteStringView bsFuncName,
-                     CFXJSE_Arguments& args);
+                     const v8::FunctionCallbackInfo<v8::Value>& info,
+                     CFXJSE_Value* pRetValue);
   static void HasValue(CFXJSE_Value* pThis,
                        ByteStringView bsFuncName,
-                       CFXJSE_Arguments& args);
+                       const v8::FunctionCallbackInfo<v8::Value>& info,
+                       CFXJSE_Value* pRetValue);
   static void Oneof(CFXJSE_Value* pThis,
                     ByteStringView bsFuncName,
-                    CFXJSE_Arguments& args);
+                    const v8::FunctionCallbackInfo<v8::Value>& info,
+                    CFXJSE_Value* pRetValue);
   static void Within(CFXJSE_Value* pThis,
                      ByteStringView bsFuncName,
-                     CFXJSE_Arguments& args);
+                     const v8::FunctionCallbackInfo<v8::Value>& info,
+                     CFXJSE_Value* pRetValue);
   static void If(CFXJSE_Value* pThis,
                  ByteStringView bsFuncName,
-                 CFXJSE_Arguments& args);
+                 const v8::FunctionCallbackInfo<v8::Value>& info,
+                 CFXJSE_Value* pRetValue);
   static void Eval(CFXJSE_Value* pThis,
                    ByteStringView bsFuncName,
-                   CFXJSE_Arguments& args);
+                   const v8::FunctionCallbackInfo<v8::Value>& info,
+                   CFXJSE_Value* pRetValue);
   static void Ref(CFXJSE_Value* pThis,
                   ByteStringView bsFuncName,
-                  CFXJSE_Arguments& args);
+                  const v8::FunctionCallbackInfo<v8::Value>& info,
+                  CFXJSE_Value* pRetValue);
   static void UnitType(CFXJSE_Value* pThis,
                        ByteStringView bsFuncName,
-                       CFXJSE_Arguments& args);
+                       const v8::FunctionCallbackInfo<v8::Value>& info,
+                       CFXJSE_Value* pRetValue);
   static void UnitValue(CFXJSE_Value* pThis,
                         ByteStringView bsFuncName,
-                        CFXJSE_Arguments& args);
+                        const v8::FunctionCallbackInfo<v8::Value>& info,
+                        CFXJSE_Value* pRetValue);
 
   static void At(CFXJSE_Value* pThis,
                  ByteStringView bsFuncName,
-                 CFXJSE_Arguments& args);
+                 const v8::FunctionCallbackInfo<v8::Value>& info,
+                 CFXJSE_Value* pRetValue);
   static void Concat(CFXJSE_Value* pThis,
                      ByteStringView bsFuncName,
-                     CFXJSE_Arguments& args);
+                     const v8::FunctionCallbackInfo<v8::Value>& info,
+                     CFXJSE_Value* pRetValue);
   static void Decode(CFXJSE_Value* pThis,
                      ByteStringView bsFuncName,
-                     CFXJSE_Arguments& args);
+                     const v8::FunctionCallbackInfo<v8::Value>& info,
+                     CFXJSE_Value* pRetValue);
   static void Encode(CFXJSE_Value* pThis,
                      ByteStringView bsFuncName,
-                     CFXJSE_Arguments& args);
+                     const v8::FunctionCallbackInfo<v8::Value>& info,
+                     CFXJSE_Value* pRetValue);
   static void Format(CFXJSE_Value* pThis,
                      ByteStringView bsFuncName,
-                     CFXJSE_Arguments& args);
+                     const v8::FunctionCallbackInfo<v8::Value>& info,
+                     CFXJSE_Value* pRetValue);
   static void Left(CFXJSE_Value* pThis,
                    ByteStringView bsFuncName,
-                   CFXJSE_Arguments& args);
+                   const v8::FunctionCallbackInfo<v8::Value>& info,
+                   CFXJSE_Value* pRetValue);
   static void Len(CFXJSE_Value* pThis,
                   ByteStringView bsFuncName,
-                  CFXJSE_Arguments& args);
+                  const v8::FunctionCallbackInfo<v8::Value>& info,
+                  CFXJSE_Value* pRetValue);
   static void Lower(CFXJSE_Value* pThis,
                     ByteStringView bsFuncName,
-                    CFXJSE_Arguments& args);
+                    const v8::FunctionCallbackInfo<v8::Value>& info,
+                    CFXJSE_Value* pRetValue);
   static void Ltrim(CFXJSE_Value* pThis,
                     ByteStringView bsFuncName,
-                    CFXJSE_Arguments& args);
+                    const v8::FunctionCallbackInfo<v8::Value>& info,
+                    CFXJSE_Value* pRetValue);
   static void Parse(CFXJSE_Value* pThis,
                     ByteStringView bsFuncName,
-                    CFXJSE_Arguments& args);
+                    const v8::FunctionCallbackInfo<v8::Value>& info,
+                    CFXJSE_Value* pRetValue);
   static void Replace(CFXJSE_Value* pThis,
                       ByteStringView bsFuncName,
-                      CFXJSE_Arguments& args);
+                      const v8::FunctionCallbackInfo<v8::Value>& info,
+                      CFXJSE_Value* pRetValue);
   static void Right(CFXJSE_Value* pThis,
                     ByteStringView bsFuncName,
-                    CFXJSE_Arguments& args);
+                    const v8::FunctionCallbackInfo<v8::Value>& info,
+                    CFXJSE_Value* pRetValue);
   static void Rtrim(CFXJSE_Value* pThis,
                     ByteStringView bsFuncName,
-                    CFXJSE_Arguments& args);
+                    const v8::FunctionCallbackInfo<v8::Value>& info,
+                    CFXJSE_Value* pRetValue);
   static void Space(CFXJSE_Value* pThis,
                     ByteStringView bsFuncName,
-                    CFXJSE_Arguments& args);
+                    const v8::FunctionCallbackInfo<v8::Value>& info,
+                    CFXJSE_Value* pRetValue);
   static void Str(CFXJSE_Value* pThis,
                   ByteStringView bsFuncName,
-                  CFXJSE_Arguments& args);
+                  const v8::FunctionCallbackInfo<v8::Value>& info,
+                  CFXJSE_Value* pRetValue);
   static void Stuff(CFXJSE_Value* pThis,
                     ByteStringView bsFuncName,
-                    CFXJSE_Arguments& args);
+                    const v8::FunctionCallbackInfo<v8::Value>& info,
+                    CFXJSE_Value* pRetValue);
   static void Substr(CFXJSE_Value* pThis,
                      ByteStringView bsFuncName,
-                     CFXJSE_Arguments& args);
+                     const v8::FunctionCallbackInfo<v8::Value>& info,
+                     CFXJSE_Value* pRetValue);
   static void Uuid(CFXJSE_Value* pThis,
                    ByteStringView bsFuncName,
-                   CFXJSE_Arguments& args);
+                   const v8::FunctionCallbackInfo<v8::Value>& info,
+                   CFXJSE_Value* pRetValue);
   static void Upper(CFXJSE_Value* pThis,
                     ByteStringView bsFuncName,
-                    CFXJSE_Arguments& args);
+                    const v8::FunctionCallbackInfo<v8::Value>& info,
+                    CFXJSE_Value* pRetValue);
   static void WordNum(CFXJSE_Value* pThis,
                       ByteStringView bsFuncName,
-                      CFXJSE_Arguments& args);
+                      const v8::FunctionCallbackInfo<v8::Value>& info,
+                      CFXJSE_Value* pRetValue);
 
   static void Get(CFXJSE_Value* pThis,
                   ByteStringView bsFuncName,
-                  CFXJSE_Arguments& args);
+                  const v8::FunctionCallbackInfo<v8::Value>& info,
+                  CFXJSE_Value* pRetValue);
   static void Post(CFXJSE_Value* pThis,
                    ByteStringView bsFuncName,
-                   CFXJSE_Arguments& args);
+                   const v8::FunctionCallbackInfo<v8::Value>& info,
+                   CFXJSE_Value* pRetValue);
   static void Put(CFXJSE_Value* pThis,
                   ByteStringView bsFuncName,
-                  CFXJSE_Arguments& args);
-  static void assign_value_operator(CFXJSE_Value* pThis,
-                                    ByteStringView bsFuncName,
-                                    CFXJSE_Arguments& args);
-  static void logical_or_operator(CFXJSE_Value* pThis,
-                                  ByteStringView bsFuncName,
-                                  CFXJSE_Arguments& args);
-  static void logical_and_operator(CFXJSE_Value* pThis,
-                                   ByteStringView bsFuncName,
-                                   CFXJSE_Arguments& args);
+                  const v8::FunctionCallbackInfo<v8::Value>& info,
+                  CFXJSE_Value* pRetValue);
+  static void assign_value_operator(
+      CFXJSE_Value* pThis,
+      ByteStringView bsFuncName,
+      const v8::FunctionCallbackInfo<v8::Value>& info,
+      CFXJSE_Value* pRetValue);
+  static void logical_or_operator(
+      CFXJSE_Value* pThis,
+      ByteStringView bsFuncName,
+      const v8::FunctionCallbackInfo<v8::Value>& info,
+      CFXJSE_Value* pRetValue);
+  static void logical_and_operator(
+      CFXJSE_Value* pThis,
+      ByteStringView bsFuncName,
+      const v8::FunctionCallbackInfo<v8::Value>& info,
+      CFXJSE_Value* pRetValue);
   static void equality_operator(CFXJSE_Value* pThis,
                                 ByteStringView bsFuncName,
-                                CFXJSE_Arguments& args);
-  static void notequality_operator(CFXJSE_Value* pThis,
-                                   ByteStringView bsFuncName,
-                                   CFXJSE_Arguments& args);
-  static bool fm_ref_equal(CFXJSE_Value* pThis, CFXJSE_Arguments& args);
+                                const v8::FunctionCallbackInfo<v8::Value>& info,
+                                CFXJSE_Value* pRetValue);
+  static void notequality_operator(
+      CFXJSE_Value* pThis,
+      ByteStringView bsFuncName,
+      const v8::FunctionCallbackInfo<v8::Value>& info,
+      CFXJSE_Value* pRetValue);
+  static bool fm_ref_equal(CFXJSE_Value* pThis,
+                           const v8::FunctionCallbackInfo<v8::Value>& info);
   static void less_operator(CFXJSE_Value* pThis,
                             ByteStringView bsFuncName,
-                            CFXJSE_Arguments& args);
-  static void lessequal_operator(CFXJSE_Value* pThis,
-                                 ByteStringView bsFuncName,
-                                 CFXJSE_Arguments& args);
+                            const v8::FunctionCallbackInfo<v8::Value>& info,
+                            CFXJSE_Value* pRetValue);
+  static void lessequal_operator(
+      CFXJSE_Value* pThis,
+      ByteStringView bsFuncName,
+      const v8::FunctionCallbackInfo<v8::Value>& info,
+      CFXJSE_Value* pRetValue);
   static void greater_operator(CFXJSE_Value* pThis,
                                ByteStringView bsFuncName,
-                               CFXJSE_Arguments& args);
-  static void greaterequal_operator(CFXJSE_Value* pThis,
-                                    ByteStringView bsFuncName,
-                                    CFXJSE_Arguments& args);
+                               const v8::FunctionCallbackInfo<v8::Value>& info,
+                               CFXJSE_Value* pRetValue);
+  static void greaterequal_operator(
+      CFXJSE_Value* pThis,
+      ByteStringView bsFuncName,
+      const v8::FunctionCallbackInfo<v8::Value>& info,
+      CFXJSE_Value* pRetValue);
   static void plus_operator(CFXJSE_Value* pThis,
                             ByteStringView bsFuncName,
-                            CFXJSE_Arguments& args);
+                            const v8::FunctionCallbackInfo<v8::Value>& info,
+                            CFXJSE_Value* pRetValue);
   static void minus_operator(CFXJSE_Value* pThis,
                              ByteStringView bsFuncName,
-                             CFXJSE_Arguments& args);
+                             const v8::FunctionCallbackInfo<v8::Value>& info,
+                             CFXJSE_Value* pRetValue);
   static void multiple_operator(CFXJSE_Value* pThis,
                                 ByteStringView bsFuncName,
-                                CFXJSE_Arguments& args);
+                                const v8::FunctionCallbackInfo<v8::Value>& info,
+                                CFXJSE_Value* pRetValue);
   static void divide_operator(CFXJSE_Value* pThis,
                               ByteStringView bsFuncName,
-                              CFXJSE_Arguments& args);
+                              const v8::FunctionCallbackInfo<v8::Value>& info,
+                              CFXJSE_Value* pRetValue);
   static void positive_operator(CFXJSE_Value* pThis,
                                 ByteStringView bsFuncName,
-                                CFXJSE_Arguments& args);
+                                const v8::FunctionCallbackInfo<v8::Value>& info,
+                                CFXJSE_Value* pRetValue);
   static void negative_operator(CFXJSE_Value* pThis,
                                 ByteStringView bsFuncName,
-                                CFXJSE_Arguments& args);
-  static void logical_not_operator(CFXJSE_Value* pThis,
-                                   ByteStringView bsFuncName,
-                                   CFXJSE_Arguments& args);
+                                const v8::FunctionCallbackInfo<v8::Value>& info,
+                                CFXJSE_Value* pRetValue);
+  static void logical_not_operator(
+      CFXJSE_Value* pThis,
+      ByteStringView bsFuncName,
+      const v8::FunctionCallbackInfo<v8::Value>& info,
+      CFXJSE_Value* pRetValue);
   static void dot_accessor(CFXJSE_Value* pThis,
                            ByteStringView bsFuncName,
-                           CFXJSE_Arguments& args);
+                           const v8::FunctionCallbackInfo<v8::Value>& info,
+                           CFXJSE_Value* pRetValue);
   static void dotdot_accessor(CFXJSE_Value* pThis,
                               ByteStringView bsFuncName,
-                              CFXJSE_Arguments& args);
+                              const v8::FunctionCallbackInfo<v8::Value>& info,
+                              CFXJSE_Value* pRetValue);
   static void eval_translation(CFXJSE_Value* pThis,
                                ByteStringView bsFuncName,
-                               CFXJSE_Arguments& args);
+                               const v8::FunctionCallbackInfo<v8::Value>& info,
+                               CFXJSE_Value* pRetValue);
   static void is_fm_object(CFXJSE_Value* pThis,
                            ByteStringView bsFuncName,
-                           CFXJSE_Arguments& args);
+                           const v8::FunctionCallbackInfo<v8::Value>& info,
+                           CFXJSE_Value* pRetValue);
   static void is_fm_array(CFXJSE_Value* pThis,
                           ByteStringView bsFuncName,
-                          CFXJSE_Arguments& args);
+                          const v8::FunctionCallbackInfo<v8::Value>& info,
+                          CFXJSE_Value* pRetValue);
   static void get_fm_value(CFXJSE_Value* pThis,
                            ByteStringView bsFuncName,
-                           CFXJSE_Arguments& args);
+                           const v8::FunctionCallbackInfo<v8::Value>& info,
+                           CFXJSE_Value* pRetValue);
   static void get_fm_jsobj(CFXJSE_Value* pThis,
                            ByteStringView bsFuncName,
-                           CFXJSE_Arguments& args);
+                           const v8::FunctionCallbackInfo<v8::Value>& info,
+                           CFXJSE_Value* pRetValue);
   static void fm_var_filter(CFXJSE_Value* pThis,
                             ByteStringView bsFuncName,
-                            CFXJSE_Arguments& args);
+                            const v8::FunctionCallbackInfo<v8::Value>& info,
+                            CFXJSE_Value* pRetValue);
   static void concat_fm_object(CFXJSE_Value* pThis,
                                ByteStringView bsFuncName,
-                               CFXJSE_Arguments& args);
+                               const v8::FunctionCallbackInfo<v8::Value>& info,
+                               CFXJSE_Value* pRetValue);
 
   static int32_t hvalue_get_array_length(CFXJSE_Value* pThis,
                                          CFXJSE_Value* arg);
@@ -346,7 +444,7 @@
                                  CFXJSE_Value* secondValue);
   static std::vector<std::unique_ptr<CFXJSE_Value>> unfoldArgs(
       CFXJSE_Value* pThis,
-      CFXJSE_Arguments& args);
+      const v8::FunctionCallbackInfo<v8::Value>& info);
   static ByteString GenerateSomExpression(ByteStringView bsName,
                                           int32_t iIndexFlags,
                                           int32_t iIndexValue,
@@ -367,9 +465,10 @@
       std::vector<std::unique_ptr<CFXJSE_Value>>* resultValues,
       bool* bAttribute);
 
-  static std::unique_ptr<CFXJSE_Value> GetSimpleValue(CFXJSE_Value* pThis,
-                                                      CFXJSE_Arguments& args,
-                                                      uint32_t index);
+  static std::unique_ptr<CFXJSE_Value> GetSimpleValue(
+      CFXJSE_Value* pThis,
+      const v8::FunctionCallbackInfo<v8::Value>& info,
+      uint32_t index);
   static bool ValueIsNull(CFXJSE_Value* pThis, CFXJSE_Value* pValue);
   static int32_t ValueToInteger(CFXJSE_Value* pThis, CFXJSE_Value* pValue);
   static float ValueToFloat(CFXJSE_Value* pThis, CFXJSE_Value* pValue);
@@ -387,7 +486,8 @@
  private:
   static void DotAccessorCommon(CFXJSE_Value* pThis,
                                 ByteStringView bsFuncName,
-                                CFXJSE_Arguments& args,
+                                const v8::FunctionCallbackInfo<v8::Value>& info,
+                                CFXJSE_Value* pRetValue,
                                 bool bDotAccessor);
 
   v8::Isolate* GetScriptRuntime() const { return m_pIsolate.Get(); }
diff --git a/fxjs/xfa/cfxjse_value.cpp b/fxjs/xfa/cfxjse_value.cpp
index 41e64c1..d308d43 100644
--- a/fxjs/xfa/cfxjse_value.cpp
+++ b/fxjs/xfa/cfxjse_value.cpp
@@ -70,6 +70,11 @@
 
 CFXJSE_Value::CFXJSE_Value(v8::Isolate* pIsolate) : m_pIsolate(pIsolate) {}
 
+CFXJSE_Value::CFXJSE_Value(v8::Isolate* pIsolate, v8::Local<v8::Value> value)
+    : m_pIsolate(pIsolate) {
+  ForceSetValue(value);
+}
+
 CFXJSE_Value::~CFXJSE_Value() {}
 
 CFXJSE_HostObject* CFXJSE_Value::ToHostObject() const {
diff --git a/fxjs/xfa/cfxjse_value.h b/fxjs/xfa/cfxjse_value.h
index 4733dbd..5503c28 100644
--- a/fxjs/xfa/cfxjse_value.h
+++ b/fxjs/xfa/cfxjse_value.h
@@ -21,6 +21,7 @@
 class CFXJSE_Value {
  public:
   explicit CFXJSE_Value(v8::Isolate* pIsolate);
+  CFXJSE_Value(v8::Isolate* pIsolate, v8::Local<v8::Value> value);
   ~CFXJSE_Value();
 
   bool IsEmpty() const;
diff --git a/fxjs/xfa/fxjse.h b/fxjs/xfa/fxjse.h
index 5aa6b39..b9ba73a 100644
--- a/fxjs/xfa/fxjse.h
+++ b/fxjs/xfa/fxjse.h
@@ -20,7 +20,6 @@
 }  // namespace fxjse
 }  // namespace pdfium
 
-class CFXJSE_Arguments;
 class CFXJSE_FormCalcContext;
 class CFXJSE_Value;
 class CJS_Result;
@@ -42,9 +41,11 @@
 typedef CJS_Result (*FXJSE_MethodCallback)(
     const v8::FunctionCallbackInfo<v8::Value>& info,
     const WideString& functionName);
-typedef void (*FXJSE_FuncCallback)(CFXJSE_Value* pThis,
-                                   ByteStringView szFuncName,
-                                   CFXJSE_Arguments& args);
+typedef void (*FXJSE_FuncCallback)(
+    CFXJSE_Value* pThis,
+    ByteStringView szFuncName,
+    const v8::FunctionCallbackInfo<v8::Value>& info,
+    CFXJSE_Value* pRetValue);
 typedef void (*FXJSE_PropAccessor)(CFXJSE_Value* pObject,
                                    ByteStringView szPropName,
                                    CFXJSE_Value* pValue);
