diff --git a/fxjs/cfx_v8.cpp b/fxjs/cfx_v8.cpp
index ad5d25e..ec18cda 100644
--- a/fxjs/cfx_v8.cpp
+++ b/fxjs/cfx_v8.cpp
@@ -110,9 +110,7 @@
 
 v8::Local<v8::String> CFX_V8::NewString(ByteStringView str) {
   v8::Isolate* pIsolate = m_pIsolate ? GetIsolate() : v8::Isolate::GetCurrent();
-  return v8::String::NewFromUtf8(pIsolate, str.unterminated_c_str(),
-                                 v8::NewStringType::kNormal, str.GetLength())
-      .ToLocalChecked();
+  return NewStringHelper(pIsolate, str);
 }
 
 v8::Local<v8::String> CFX_V8::NewString(WideStringView str) {
@@ -171,6 +169,14 @@
 }
 
 // static
+v8::Local<v8::String> CFX_V8::NewStringHelper(v8::Isolate* pIsolate,
+                                              ByteStringView str) {
+  return v8::String::NewFromUtf8(pIsolate, str.unterminated_c_str(),
+                                 v8::NewStringType::kNormal, str.GetLength())
+      .ToLocalChecked();
+}
+
+// static
 int CFX_V8::ReentrantToInt32Helper(v8::Isolate* pIsolate,
                                    v8::Local<v8::Value> pValue) {
   if (pValue.IsEmpty())
diff --git a/fxjs/cfx_v8.h b/fxjs/cfx_v8.h
index 210df7e..cce64e3 100644
--- a/fxjs/cfx_v8.h
+++ b/fxjs/cfx_v8.h
@@ -15,6 +15,9 @@
 
 class CFX_V8 {
  public:
+  static v8::Local<v8::String> NewStringHelper(v8::Isolate* pIsolate,
+                                               ByteStringView str);
+
   static int ReentrantToInt32Helper(v8::Isolate* pIsolate,
                                     v8::Local<v8::Value> pValue);
   static bool ReentrantToBooleanHelper(v8::Isolate* pIsolate,
diff --git a/fxjs/xfa/cfxjse_class.cpp b/fxjs/xfa/cfxjse_class.cpp
index ae6d8cb..f00cbed 100644
--- a/fxjs/xfa/cfxjse_class.cpp
+++ b/fxjs/xfa/cfxjse_class.cpp
@@ -40,10 +40,7 @@
 
   auto lpThisValue =
       pdfium::MakeUnique<CFXJSE_Value>(info.GetIsolate(), info.Holder());
-  auto lpRetValue = pdfium::MakeUnique<CFXJSE_Value>(info.GetIsolate());
-  lpFunctionInfo->callbackProc(lpThisValue.get(), info, lpRetValue.get());
-  if (!lpRetValue->DirectGetValue().IsEmpty())
-    info.GetReturnValue().Set(lpRetValue->DirectGetValue());
+  lpFunctionInfo->callbackProc(lpThisValue.get(), info);
 }
 
 void V8ConstructorCallback_Wrapper(
diff --git a/fxjs/xfa/cfxjse_formcalc_context.cpp b/fxjs/xfa/cfxjse_formcalc_context.cpp
index 1a4df5d..4b85ebb 100644
--- a/fxjs/xfa/cfxjse_formcalc_context.cpp
+++ b/fxjs/xfa/cfxjse_formcalc_context.cpp
@@ -1361,8 +1361,7 @@
 // static
 void CFXJSE_FormCalcContext::Abs(
     CFXJSE_Value* pThis,
-    const v8::FunctionCallbackInfo<v8::Value>& info,
-    CFXJSE_Value* pRetValue) {
+    const v8::FunctionCallbackInfo<v8::Value>& info) {
   if (info.Length() != 1) {
     ToFormCalcContext(pThis)->ThrowParamCountMismatchException(L"Abs");
     return;
@@ -1370,25 +1369,23 @@
 
   auto argOne = pdfium::MakeUnique<CFXJSE_Value>(info.GetIsolate(), info[0]);
   if (ValueIsNull(pThis, argOne.get())) {
-    pRetValue->SetNull();
+    info.GetReturnValue().SetNull();
     return;
   }
-
   double dValue = ValueToDouble(pThis, argOne.get());
   if (dValue < 0)
     dValue = -dValue;
 
-  pRetValue->SetDouble(dValue);
+  info.GetReturnValue().Set(dValue);
 }
 
 // static
 void CFXJSE_FormCalcContext::Avg(
     CFXJSE_Value* pThis,
-    const v8::FunctionCallbackInfo<v8::Value>& info,
-    CFXJSE_Value* pRetValue) {
+    const v8::FunctionCallbackInfo<v8::Value>& info) {
   int32_t argc = info.Length();
   if (argc < 1) {
-    pRetValue->SetNull();
+    info.GetReturnValue().SetNull();
     return;
   }
 
@@ -1443,18 +1440,17 @@
     }
   }
   if (uCount == 0) {
-    pRetValue->SetNull();
+    info.GetReturnValue().SetNull();
     return;
   }
 
-  pRetValue->SetDouble(dSum / uCount);
+  info.GetReturnValue().Set(dSum / uCount);
 }
 
 // static
 void CFXJSE_FormCalcContext::Ceil(
     CFXJSE_Value* pThis,
-    const v8::FunctionCallbackInfo<v8::Value>& info,
-    CFXJSE_Value* pRetValue) {
+    const v8::FunctionCallbackInfo<v8::Value>& info) {
   if (info.Length() != 1) {
     ToFormCalcContext(pThis)->ThrowParamCountMismatchException(L"Ceil");
     return;
@@ -1462,18 +1458,17 @@
 
   std::unique_ptr<CFXJSE_Value> argValue = GetSimpleValue(pThis, info, 0);
   if (ValueIsNull(pThis, argValue.get())) {
-    pRetValue->SetNull();
+    info.GetReturnValue().SetNull();
     return;
   }
 
-  pRetValue->SetFloat(ceil(ValueToFloat(pThis, argValue.get())));
+  info.GetReturnValue().Set(ceil(ValueToFloat(pThis, argValue.get())));
 }
 
 // static
 void CFXJSE_FormCalcContext::Count(
     CFXJSE_Value* pThis,
-    const v8::FunctionCallbackInfo<v8::Value>& info,
-    CFXJSE_Value* pRetValue) {
+    const v8::FunctionCallbackInfo<v8::Value>& info) {
   CFXJSE_FormCalcContext* pContext = ToFormCalcContext(pThis);
   v8::Isolate* pIsolate = pContext->GetScriptRuntime();
   int32_t iCount = 0;
@@ -1522,14 +1517,13 @@
       iCount++;
     }
   }
-  pRetValue->SetInteger(iCount);
+  info.GetReturnValue().Set(iCount);
 }
 
 // static
 void CFXJSE_FormCalcContext::Floor(
     CFXJSE_Value* pThis,
-    const v8::FunctionCallbackInfo<v8::Value>& info,
-    CFXJSE_Value* pRetValue) {
+    const v8::FunctionCallbackInfo<v8::Value>& info) {
   if (info.Length() != 1) {
     ToFormCalcContext(pThis)->ThrowParamCountMismatchException(L"Floor");
     return;
@@ -1537,18 +1531,17 @@
 
   std::unique_ptr<CFXJSE_Value> argValue = GetSimpleValue(pThis, info, 0);
   if (ValueIsNull(pThis, argValue.get())) {
-    pRetValue->SetNull();
+    info.GetReturnValue().SetNull();
     return;
   }
 
-  pRetValue->SetFloat(floor(ValueToFloat(pThis, argValue.get())));
+  info.GetReturnValue().Set(floor(ValueToFloat(pThis, argValue.get())));
 }
 
 // static
 void CFXJSE_FormCalcContext::Max(
     CFXJSE_Value* pThis,
-    const v8::FunctionCallbackInfo<v8::Value>& info,
-    CFXJSE_Value* pRetValue) {
+    const v8::FunctionCallbackInfo<v8::Value>& info) {
   CFXJSE_FormCalcContext* pContext = ToFormCalcContext(pThis);
   v8::Isolate* pIsolate = pContext->GetScriptRuntime();
   uint32_t uCount = 0;
@@ -1613,18 +1606,16 @@
     }
   }
   if (uCount == 0) {
-    pRetValue->SetNull();
+    info.GetReturnValue().SetNull();
     return;
   }
-
-  pRetValue->SetDouble(dMaxValue);
+  info.GetReturnValue().Set(dMaxValue);
 }
 
 // static
 void CFXJSE_FormCalcContext::Min(
     CFXJSE_Value* pThis,
-    const v8::FunctionCallbackInfo<v8::Value>& info,
-    CFXJSE_Value* pRetValue) {
+    const v8::FunctionCallbackInfo<v8::Value>& info) {
   CFXJSE_FormCalcContext* pContext = ToFormCalcContext(pThis);
   v8::Isolate* pIsolate = pContext->GetScriptRuntime();
   uint32_t uCount = 0;
@@ -1689,18 +1680,17 @@
     }
   }
   if (uCount == 0) {
-    pRetValue->SetNull();
+    info.GetReturnValue().SetNull();
     return;
   }
 
-  pRetValue->SetDouble(dMinValue);
+  info.GetReturnValue().Set(dMinValue);
 }
 
 // static
 void CFXJSE_FormCalcContext::Mod(
     CFXJSE_Value* pThis,
-    const v8::FunctionCallbackInfo<v8::Value>& info,
-    CFXJSE_Value* pRetValue) {
+    const v8::FunctionCallbackInfo<v8::Value>& info) {
   CFXJSE_FormCalcContext* pContext = ToFormCalcContext(pThis);
   if (info.Length() != 2) {
     pContext->ThrowParamCountMismatchException(L"Mod");
@@ -1710,7 +1700,7 @@
   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()) {
-    pRetValue->SetNull();
+    info.GetReturnValue().SetNull();
     return;
   }
 
@@ -1728,14 +1718,14 @@
     return;
   }
 
-  pRetValue->SetDouble(dDividend - dDivisor * (int32_t)(dDividend / dDivisor));
+  info.GetReturnValue().Set(dDividend -
+                            dDivisor * (int32_t)(dDividend / dDivisor));
 }
 
 // static
 void CFXJSE_FormCalcContext::Round(
     CFXJSE_Value* pThis,
-    const v8::FunctionCallbackInfo<v8::Value>& info,
-    CFXJSE_Value* pRetValue) {
+    const v8::FunctionCallbackInfo<v8::Value>& info) {
   CFXJSE_FormCalcContext* pContext = ToFormCalcContext(pThis);
   int32_t argc = info.Length();
   if (argc < 1 || argc > 2) {
@@ -1745,7 +1735,7 @@
 
   auto argOne = pdfium::MakeUnique<CFXJSE_Value>(info.GetIsolate(), info[0]);
   if (argOne->IsNull()) {
-    pRetValue->SetNull();
+    info.GetReturnValue().SetNull();
     return;
   }
 
@@ -1760,7 +1750,7 @@
   if (argc > 1) {
     auto argTwo = pdfium::MakeUnique<CFXJSE_Value>(info.GetIsolate(), info[1]);
     if (argTwo->IsNull()) {
-      pRetValue->SetNull();
+      info.GetReturnValue().SetNull();
       return;
     }
 
@@ -1775,17 +1765,16 @@
   }
 
   CFGAS_Decimal decimalValue(static_cast<float>(dValue), uPrecision);
-  pRetValue->SetDouble(decimalValue.ToDouble());
+  info.GetReturnValue().Set(decimalValue.ToDouble());
 }
 
 // static
 void CFXJSE_FormCalcContext::Sum(
     CFXJSE_Value* pThis,
-    const v8::FunctionCallbackInfo<v8::Value>& info,
-    CFXJSE_Value* pRetValue) {
+    const v8::FunctionCallbackInfo<v8::Value>& info) {
   int32_t argc = info.Length();
   if (argc == 0) {
-    pRetValue->SetNull();
+    info.GetReturnValue().SetNull();
     return;
   }
 
@@ -1848,18 +1837,17 @@
     }
   }
   if (uCount == 0) {
-    pRetValue->SetNull();
+    info.GetReturnValue().SetNull();
     return;
   }
 
-  pRetValue->SetDouble(dSum);
+  info.GetReturnValue().Set(dSum);
 }
 
 // static
 void CFXJSE_FormCalcContext::Date(
     CFXJSE_Value* pThis,
-    const v8::FunctionCallbackInfo<v8::Value>& info,
-    CFXJSE_Value* pRetValue) {
+    const v8::FunctionCallbackInfo<v8::Value>& info) {
   if (info.Length() != 0) {
     ToFormCalcContext(pThis)->ThrowParamCountMismatchException(L"Date");
     return;
@@ -1869,7 +1857,7 @@
   FXSYS_time(&currentTime);
   struct tm* pTmStruct = gmtime(&currentTime);
 
-  pRetValue->SetInteger(DateString2Num(
+  info.GetReturnValue().Set(DateString2Num(
       ByteString::Format("%d%02d%02d", pTmStruct->tm_year + 1900,
                          pTmStruct->tm_mon + 1, pTmStruct->tm_mday)
           .AsStringView()));
@@ -1878,8 +1866,7 @@
 // static
 void CFXJSE_FormCalcContext::Date2Num(
     CFXJSE_Value* pThis,
-    const v8::FunctionCallbackInfo<v8::Value>& info,
-    CFXJSE_Value* pRetValue) {
+    const v8::FunctionCallbackInfo<v8::Value>& info) {
   int32_t argc = info.Length();
   if (argc < 1 || argc > 3) {
     ToFormCalcContext(pThis)->ThrowParamCountMismatchException(L"Date2Num");
@@ -1888,7 +1875,7 @@
 
   std::unique_ptr<CFXJSE_Value> dateValue = GetSimpleValue(pThis, info, 0);
   if (ValueIsNull(pThis, dateValue.get())) {
-    pRetValue->SetNull();
+    info.GetReturnValue().SetNull();
     return;
   }
 
@@ -1897,7 +1884,7 @@
   if (argc > 1) {
     std::unique_ptr<CFXJSE_Value> formatValue = GetSimpleValue(pThis, info, 1);
     if (ValueIsNull(pThis, formatValue.get())) {
-      pRetValue->SetNull();
+      info.GetReturnValue().SetNull();
       return;
     }
     bsFormat = ValueToUTF8String(formatValue.get());
@@ -1907,7 +1894,7 @@
   if (argc > 2) {
     std::unique_ptr<CFXJSE_Value> localeValue = GetSimpleValue(pThis, info, 2);
     if (ValueIsNull(pThis, localeValue.get())) {
-      pRetValue->SetNull();
+      info.GetReturnValue().SetNull();
       return;
     }
     bsLocale = ValueToUTF8String(localeValue.get());
@@ -1916,14 +1903,13 @@
   ByteString bsIsoDate =
       Local2IsoDate(pThis, bsDate.AsStringView(), bsFormat.AsStringView(),
                     bsLocale.AsStringView());
-  pRetValue->SetInteger(DateString2Num(bsIsoDate.AsStringView()));
+  info.GetReturnValue().Set(DateString2Num(bsIsoDate.AsStringView()));
 }
 
 // static
 void CFXJSE_FormCalcContext::DateFmt(
     CFXJSE_Value* pThis,
-    const v8::FunctionCallbackInfo<v8::Value>& info,
-    CFXJSE_Value* pRetValue) {
+    const v8::FunctionCallbackInfo<v8::Value>& info) {
   int32_t argc = info.Length();
   if (argc > 2) {
     ToFormCalcContext(pThis)->ThrowParamCountMismatchException(L"Date2Num");
@@ -1934,7 +1920,7 @@
   if (argc > 0) {
     std::unique_ptr<CFXJSE_Value> infotyle = GetSimpleValue(pThis, info, 0);
     if (infotyle->IsNull()) {
-      pRetValue->SetNull();
+      info.GetReturnValue().SetNull();
       return;
     }
 
@@ -1947,7 +1933,7 @@
   if (argc > 1) {
     std::unique_ptr<CFXJSE_Value> argLocale = GetSimpleValue(pThis, info, 1);
     if (argLocale->IsNull()) {
-      pRetValue->SetNull();
+      info.GetReturnValue().SetNull();
       return;
     }
     bsLocale = ValueToUTF8String(argLocale.get());
@@ -1955,32 +1941,31 @@
 
   ByteString bsFormat =
       GetStandardDateFormat(pThis, iStyle, bsLocale.AsStringView());
-  pRetValue->SetString(bsFormat.AsStringView());
+  info.GetReturnValue().Set(
+      CFX_V8::NewStringHelper(info.GetIsolate(), bsFormat.AsStringView()));
 }
 
 // static
 void CFXJSE_FormCalcContext::IsoDate2Num(
     CFXJSE_Value* pThis,
-    const v8::FunctionCallbackInfo<v8::Value>& info,
-    CFXJSE_Value* pRetValue) {
+    const v8::FunctionCallbackInfo<v8::Value>& info) {
   if (info.Length() != 1) {
     ToFormCalcContext(pThis)->ThrowParamCountMismatchException(L"IsoDate2Num");
     return;
   }
   std::unique_ptr<CFXJSE_Value> argOne = GetSimpleValue(pThis, info, 0);
   if (argOne->IsNull()) {
-    pRetValue->SetNull();
+    info.GetReturnValue().SetNull();
     return;
   }
   ByteString bsArg = ValueToUTF8String(argOne.get());
-  pRetValue->SetInteger(DateString2Num(bsArg.AsStringView()));
+  info.GetReturnValue().Set(DateString2Num(bsArg.AsStringView()));
 }
 
 // static
 void CFXJSE_FormCalcContext::IsoTime2Num(
     CFXJSE_Value* pThis,
-    const v8::FunctionCallbackInfo<v8::Value>& info,
-    CFXJSE_Value* pRetValue) {
+    const v8::FunctionCallbackInfo<v8::Value>& info) {
   CFXJSE_FormCalcContext* pContext = ToFormCalcContext(pThis);
   if (info.Length() != 1) {
     pContext->ThrowParamCountMismatchException(L"IsoTime2Num");
@@ -1989,7 +1974,7 @@
 
   std::unique_ptr<CFXJSE_Value> argOne = GetSimpleValue(pThis, info, 0);
   if (ValueIsNull(pThis, argOne.get())) {
-    pRetValue->SetNull();
+    info.GetReturnValue().SetNull();
     return;
   }
 
@@ -1998,7 +1983,7 @@
   ByteString bsArg = ValueToUTF8String(argOne.get());
   auto pos = bsArg.Find('T', 0);
   if (!pos.has_value() || pos.value() == bsArg.GetLength() - 1) {
-    pRetValue->SetInteger(0);
+    info.GetReturnValue().Set(0);
     return;
   }
   bsArg = bsArg.Last(bsArg.GetLength() - (pos.value() + 1));
@@ -2006,7 +1991,7 @@
   CXFA_LocaleValue timeValue(XFA_VT_TIME,
                              WideString::FromUTF8(bsArg.AsStringView()), pMgr);
   if (!timeValue.IsValid()) {
-    pRetValue->SetInteger(0);
+    info.GetReturnValue().Set(0);
     return;
   }
 
@@ -2027,15 +2012,14 @@
   hour = mins / 60;
   min = mins % 60;
 
-  pRetValue->SetInteger(hour * 3600000 + min * 60000 + second * 1000 +
-                        milSecond + 1);
+  info.GetReturnValue().Set(hour * 3600000 + min * 60000 + second * 1000 +
+                            milSecond + 1);
 }
 
 // static
 void CFXJSE_FormCalcContext::LocalDateFmt(
     CFXJSE_Value* pThis,
-    const v8::FunctionCallbackInfo<v8::Value>& info,
-    CFXJSE_Value* pRetValue) {
+    const v8::FunctionCallbackInfo<v8::Value>& info) {
   int32_t argc = info.Length();
   if (argc > 2) {
     ToFormCalcContext(pThis)->ThrowParamCountMismatchException(L"LocalDateFmt");
@@ -2046,7 +2030,7 @@
   if (argc > 0) {
     std::unique_ptr<CFXJSE_Value> infotyle = GetSimpleValue(pThis, info, 0);
     if (infotyle->IsNull()) {
-      pRetValue->SetNull();
+      info.GetReturnValue().SetNull();
       return;
     }
     iStyle = (int32_t)ValueToFloat(pThis, infotyle.get());
@@ -2058,7 +2042,7 @@
   if (argc > 1) {
     std::unique_ptr<CFXJSE_Value> argLocale = GetSimpleValue(pThis, info, 1);
     if (argLocale->IsNull()) {
-      pRetValue->SetNull();
+      info.GetReturnValue().SetNull();
       return;
     }
     bsLocale = ValueToUTF8String(argLocale.get());
@@ -2066,14 +2050,14 @@
 
   ByteString bsFormat =
       GetLocalDateFormat(pThis, iStyle, bsLocale.AsStringView(), false);
-  pRetValue->SetString(bsFormat.AsStringView());
+  info.GetReturnValue().Set(
+      CFX_V8::NewStringHelper(info.GetIsolate(), bsFormat.AsStringView()));
 }
 
 // static
 void CFXJSE_FormCalcContext::LocalTimeFmt(
     CFXJSE_Value* pThis,
-    const v8::FunctionCallbackInfo<v8::Value>& info,
-    CFXJSE_Value* pRetValue) {
+    const v8::FunctionCallbackInfo<v8::Value>& info) {
   int32_t argc = info.Length();
   if (argc > 2) {
     ToFormCalcContext(pThis)->ThrowParamCountMismatchException(L"LocalTimeFmt");
@@ -2084,7 +2068,7 @@
   if (argc > 0) {
     std::unique_ptr<CFXJSE_Value> infotyle = GetSimpleValue(pThis, info, 0);
     if (infotyle->IsNull()) {
-      pRetValue->SetNull();
+      info.GetReturnValue().SetNull();
       return;
     }
     iStyle = (int32_t)ValueToFloat(pThis, infotyle.get());
@@ -2096,7 +2080,7 @@
   if (argc > 1) {
     std::unique_ptr<CFXJSE_Value> argLocale = GetSimpleValue(pThis, info, 1);
     if (argLocale->IsNull()) {
-      pRetValue->SetNull();
+      info.GetReturnValue().SetNull();
       return;
     }
     bsLocale = ValueToUTF8String(argLocale.get());
@@ -2104,14 +2088,14 @@
 
   ByteString bsFormat =
       GetLocalTimeFormat(pThis, iStyle, bsLocale.AsStringView(), false);
-  pRetValue->SetString(bsFormat.AsStringView());
+  info.GetReturnValue().Set(
+      CFX_V8::NewStringHelper(info.GetIsolate(), bsFormat.AsStringView()));
 }
 
 // static
 void CFXJSE_FormCalcContext::Num2Date(
     CFXJSE_Value* pThis,
-    const v8::FunctionCallbackInfo<v8::Value>& info,
-    CFXJSE_Value* pRetValue) {
+    const v8::FunctionCallbackInfo<v8::Value>& info) {
   int32_t argc = info.Length();
   if (argc < 1 || argc > 3) {
     ToFormCalcContext(pThis)->ThrowParamCountMismatchException(L"Num2Date");
@@ -2120,12 +2104,12 @@
 
   std::unique_ptr<CFXJSE_Value> dateValue = GetSimpleValue(pThis, info, 0);
   if (ValueIsNull(pThis, dateValue.get())) {
-    pRetValue->SetNull();
+    info.GetReturnValue().SetNull();
     return;
   }
   int32_t dDate = (int32_t)ValueToFloat(pThis, dateValue.get());
   if (dDate < 1) {
-    pRetValue->SetNull();
+    info.GetReturnValue().SetNull();
     return;
   }
 
@@ -2133,7 +2117,7 @@
   if (argc > 1) {
     std::unique_ptr<CFXJSE_Value> formatValue = GetSimpleValue(pThis, info, 1);
     if (ValueIsNull(pThis, formatValue.get())) {
-      pRetValue->SetNull();
+      info.GetReturnValue().SetNull();
       return;
     }
     bsFormat = ValueToUTF8String(formatValue.get());
@@ -2143,7 +2127,7 @@
   if (argc > 2) {
     std::unique_ptr<CFXJSE_Value> localeValue = GetSimpleValue(pThis, info, 2);
     if (ValueIsNull(pThis, localeValue.get())) {
-      pRetValue->SetNull();
+      info.GetReturnValue().SetNull();
       return;
     }
     bsLocale = ValueToUTF8String(localeValue.get());
@@ -2245,14 +2229,14 @@
       pThis,
       ByteString::Format("%d%02d%02d", iYear + i, iMonth, iDay).AsStringView(),
       bsFormat.AsStringView(), bsLocale.AsStringView());
-  pRetValue->SetString(bsLocalDate.AsStringView());
+  info.GetReturnValue().Set(
+      CFX_V8::NewStringHelper(info.GetIsolate(), bsLocalDate.AsStringView()));
 }
 
 // static
 void CFXJSE_FormCalcContext::Num2GMTime(
     CFXJSE_Value* pThis,
-    const v8::FunctionCallbackInfo<v8::Value>& info,
-    CFXJSE_Value* pRetValue) {
+    const v8::FunctionCallbackInfo<v8::Value>& info) {
   int32_t argc = info.Length();
   if (argc < 1 || argc > 3) {
     ToFormCalcContext(pThis)->ThrowParamCountMismatchException(L"Num2GMTime");
@@ -2261,12 +2245,12 @@
 
   std::unique_ptr<CFXJSE_Value> timeValue = GetSimpleValue(pThis, info, 0);
   if (timeValue->IsNull()) {
-    pRetValue->SetNull();
+    info.GetReturnValue().SetNull();
     return;
   }
   int32_t iTime = (int32_t)ValueToFloat(pThis, timeValue.get());
   if (abs(iTime) < 1.0) {
-    pRetValue->SetNull();
+    info.GetReturnValue().SetNull();
     return;
   }
 
@@ -2274,7 +2258,7 @@
   if (argc > 1) {
     std::unique_ptr<CFXJSE_Value> formatValue = GetSimpleValue(pThis, info, 1);
     if (formatValue->IsNull()) {
-      pRetValue->SetNull();
+      info.GetReturnValue().SetNull();
       return;
     }
     bsFormat = ValueToUTF8String(formatValue.get());
@@ -2284,7 +2268,7 @@
   if (argc > 2) {
     std::unique_ptr<CFXJSE_Value> localeValue = GetSimpleValue(pThis, info, 2);
     if (localeValue->IsNull()) {
-      pRetValue->SetNull();
+      info.GetReturnValue().SetNull();
       return;
     }
     bsLocale = ValueToUTF8String(localeValue.get());
@@ -2292,14 +2276,14 @@
 
   ByteString bsGMTTime = Num2AllTime(pThis, iTime, bsFormat.AsStringView(),
                                      bsLocale.AsStringView(), true);
-  pRetValue->SetString(bsGMTTime.AsStringView());
+  info.GetReturnValue().Set(
+      CFX_V8::NewStringHelper(info.GetIsolate(), bsGMTTime.AsStringView()));
 }
 
 // static
 void CFXJSE_FormCalcContext::Num2Time(
     CFXJSE_Value* pThis,
-    const v8::FunctionCallbackInfo<v8::Value>& info,
-    CFXJSE_Value* pRetValue) {
+    const v8::FunctionCallbackInfo<v8::Value>& info) {
   int32_t argc = info.Length();
   if (argc < 1 || argc > 3) {
     ToFormCalcContext(pThis)->ThrowParamCountMismatchException(L"Num2Time");
@@ -2308,12 +2292,12 @@
 
   std::unique_ptr<CFXJSE_Value> timeValue = GetSimpleValue(pThis, info, 0);
   if (timeValue->IsNull()) {
-    pRetValue->SetNull();
+    info.GetReturnValue().SetNull();
     return;
   }
   float fTime = ValueToFloat(pThis, timeValue.get());
   if (fabs(fTime) < 1.0) {
-    pRetValue->SetNull();
+    info.GetReturnValue().SetNull();
     return;
   }
 
@@ -2321,7 +2305,7 @@
   if (argc > 1) {
     std::unique_ptr<CFXJSE_Value> formatValue = GetSimpleValue(pThis, info, 1);
     if (formatValue->IsNull()) {
-      pRetValue->SetNull();
+      info.GetReturnValue().SetNull();
       return;
     }
     bsFormat = ValueToUTF8String(formatValue.get());
@@ -2331,7 +2315,7 @@
   if (argc > 2) {
     std::unique_ptr<CFXJSE_Value> localeValue = GetSimpleValue(pThis, info, 2);
     if (localeValue->IsNull()) {
-      pRetValue->SetNull();
+      info.GetReturnValue().SetNull();
       return;
     }
     bsLocale = ValueToUTF8String(localeValue.get());
@@ -2340,14 +2324,14 @@
   ByteString bsLocalTime =
       Num2AllTime(pThis, static_cast<int32_t>(fTime), bsFormat.AsStringView(),
                   bsLocale.AsStringView(), false);
-  pRetValue->SetString(bsLocalTime.AsStringView());
+  info.GetReturnValue().Set(
+      CFX_V8::NewStringHelper(info.GetIsolate(), bsLocalTime.AsStringView()));
 }
 
 // static
 void CFXJSE_FormCalcContext::Time(
     CFXJSE_Value* pThis,
-    const v8::FunctionCallbackInfo<v8::Value>& info,
-    CFXJSE_Value* pRetValue) {
+    const v8::FunctionCallbackInfo<v8::Value>& info) {
   if (info.Length() != 0) {
     ToFormCalcContext(pThis)->ThrowParamCountMismatchException(L"Time");
     return;
@@ -2356,15 +2340,14 @@
   time_t now;
   FXSYS_time(&now);
   struct tm* pGmt = gmtime(&now);
-  pRetValue->SetInteger(
+  info.GetReturnValue().Set(
       (pGmt->tm_hour * 3600 + pGmt->tm_min * 60 + pGmt->tm_sec) * 1000);
 }
 
 // static
 void CFXJSE_FormCalcContext::Time2Num(
     CFXJSE_Value* pThis,
-    const v8::FunctionCallbackInfo<v8::Value>& info,
-    CFXJSE_Value* pRetValue) {
+    const v8::FunctionCallbackInfo<v8::Value>& info) {
   int32_t argc = info.Length();
   if (argc < 1 || argc > 3) {
     ToFormCalcContext(pThis)->ThrowParamCountMismatchException(L"Time2Num");
@@ -2374,7 +2357,7 @@
   ByteString bsTime;
   std::unique_ptr<CFXJSE_Value> timeValue = GetSimpleValue(pThis, info, 0);
   if (ValueIsNull(pThis, timeValue.get())) {
-    pRetValue->SetNull();
+    info.GetReturnValue().SetNull();
     return;
   }
   bsTime = ValueToUTF8String(timeValue.get());
@@ -2383,7 +2366,7 @@
   if (argc > 1) {
     std::unique_ptr<CFXJSE_Value> formatValue = GetSimpleValue(pThis, info, 1);
     if (ValueIsNull(pThis, formatValue.get())) {
-      pRetValue->SetNull();
+      info.GetReturnValue().SetNull();
       return;
     }
     bsFormat = ValueToUTF8String(formatValue.get());
@@ -2393,7 +2376,7 @@
   if (argc > 2) {
     std::unique_ptr<CFXJSE_Value> localeValue = GetSimpleValue(pThis, info, 2);
     if (ValueIsNull(pThis, localeValue.get())) {
-      pRetValue->SetNull();
+      info.GetReturnValue().SetNull();
       return;
     }
     bsLocale = ValueToUTF8String(localeValue.get());
@@ -2421,7 +2404,7 @@
                                WideString::FromUTF8(bsTime.AsStringView()),
                                wsFormat, pLocale, pMgr);
   if (!localeValue.IsValid()) {
-    pRetValue->SetInteger(0);
+    info.GetReturnValue().Set(0);
     return;
   }
 
@@ -2441,15 +2424,14 @@
 
   hour = mins / 60;
   min = mins % 60;
-  pRetValue->SetInteger(hour * 3600000 + min * 60000 + second * 1000 +
-                        milSecond + 1);
+  info.GetReturnValue().Set(hour * 3600000 + min * 60000 + second * 1000 +
+                            milSecond + 1);
 }
 
 // static
 void CFXJSE_FormCalcContext::TimeFmt(
     CFXJSE_Value* pThis,
-    const v8::FunctionCallbackInfo<v8::Value>& info,
-    CFXJSE_Value* pRetValue) {
+    const v8::FunctionCallbackInfo<v8::Value>& info) {
   int32_t argc = info.Length();
   if (argc > 2) {
     ToFormCalcContext(pThis)->ThrowParamCountMismatchException(L"TimeFmt");
@@ -2460,7 +2442,7 @@
   if (argc > 0) {
     std::unique_ptr<CFXJSE_Value> infotyle = GetSimpleValue(pThis, info, 0);
     if (infotyle->IsNull()) {
-      pRetValue->SetNull();
+      info.GetReturnValue().SetNull();
       return;
     }
     iStyle = (int32_t)ValueToFloat(pThis, infotyle.get());
@@ -2472,7 +2454,7 @@
   if (argc > 1) {
     std::unique_ptr<CFXJSE_Value> argLocale = GetSimpleValue(pThis, info, 1);
     if (argLocale->IsNull()) {
-      pRetValue->SetNull();
+      info.GetReturnValue().SetNull();
       return;
     }
     bsLocale = ValueToUTF8String(argLocale.get());
@@ -2480,7 +2462,8 @@
 
   ByteString bsFormat =
       GetStandardTimeFormat(pThis, iStyle, bsLocale.AsStringView());
-  pRetValue->SetString(bsFormat.AsStringView());
+  info.GetReturnValue().Set(
+      CFX_V8::NewStringHelper(info.GetIsolate(), bsFormat.AsStringView()));
 }
 
 // static
@@ -2624,8 +2607,7 @@
 // static
 void CFXJSE_FormCalcContext::Apr(
     CFXJSE_Value* pThis,
-    const v8::FunctionCallbackInfo<v8::Value>& info,
-    CFXJSE_Value* pRetValue) {
+    const v8::FunctionCallbackInfo<v8::Value>& info) {
   CFXJSE_FormCalcContext* pContext = ToFormCalcContext(pThis);
   if (info.Length() != 3) {
     pContext->ThrowParamCountMismatchException(L"Apr");
@@ -2637,7 +2619,7 @@
   std::unique_ptr<CFXJSE_Value> argThree = GetSimpleValue(pThis, info, 2);
   if (ValueIsNull(pThis, argOne.get()) || ValueIsNull(pThis, argTwo.get()) ||
       ValueIsNull(pThis, argThree.get())) {
-    pRetValue->SetNull();
+    info.GetReturnValue().SetNull();
     return;
   }
 
@@ -2661,7 +2643,7 @@
          (r * nTemp * nPeriods * (nTemp / (1 + r)))) /
         ((nTemp - 1) * (nTemp - 1));
     if (nDerivative == 0) {
-      pRetValue->SetNull();
+      info.GetReturnValue().SetNull();
       return;
     }
 
@@ -2672,14 +2654,13 @@
     }
     nRet = r * nTemp / (nTemp - 1) - nPayment / nPrincipal;
   }
-  pRetValue->SetDouble(r * 12);
+  info.GetReturnValue().Set(r * 12);
 }
 
 // static
 void CFXJSE_FormCalcContext::CTerm(
     CFXJSE_Value* pThis,
-    const v8::FunctionCallbackInfo<v8::Value>& info,
-    CFXJSE_Value* pRetValue) {
+    const v8::FunctionCallbackInfo<v8::Value>& info) {
   CFXJSE_FormCalcContext* pContext = ToFormCalcContext(pThis);
   if (info.Length() != 3) {
     pContext->ThrowParamCountMismatchException(L"CTerm");
@@ -2691,7 +2672,7 @@
   std::unique_ptr<CFXJSE_Value> argThree = GetSimpleValue(pThis, info, 2);
   if (ValueIsNull(pThis, argOne.get()) || ValueIsNull(pThis, argTwo.get()) ||
       ValueIsNull(pThis, argThree.get())) {
-    pRetValue->SetNull();
+    info.GetReturnValue().SetNull();
     return;
   }
 
@@ -2703,14 +2684,14 @@
     return;
   }
 
-  pRetValue->SetFloat(log((float)(nFutureValue / nInitAmount)) /
-                      log((float)(1 + nRate)));
+  info.GetReturnValue().Set(log((float)(nFutureValue / nInitAmount)) /
+                            log((float)(1 + nRate)));
 }
 
 // static
-void CFXJSE_FormCalcContext::FV(CFXJSE_Value* pThis,
-                                const v8::FunctionCallbackInfo<v8::Value>& info,
-                                CFXJSE_Value* pRetValue) {
+void CFXJSE_FormCalcContext::FV(
+    CFXJSE_Value* pThis,
+    const v8::FunctionCallbackInfo<v8::Value>& info) {
   CFXJSE_FormCalcContext* pContext = ToFormCalcContext(pThis);
   if (info.Length() != 3) {
     pContext->ThrowParamCountMismatchException(L"FV");
@@ -2722,7 +2703,7 @@
   std::unique_ptr<CFXJSE_Value> argThree = GetSimpleValue(pThis, info, 2);
   if (ValueIsNull(pThis, argOne.get()) || ValueIsNull(pThis, argTwo.get()) ||
       ValueIsNull(pThis, argThree.get())) {
-    pRetValue->SetNull();
+    info.GetReturnValue().SetNull();
     return;
   }
 
@@ -2745,14 +2726,13 @@
     dResult = nAmount * nPeriod;
   }
 
-  pRetValue->SetDouble(dResult);
+  info.GetReturnValue().Set(dResult);
 }
 
 // static
 void CFXJSE_FormCalcContext::IPmt(
     CFXJSE_Value* pThis,
-    const v8::FunctionCallbackInfo<v8::Value>& info,
-    CFXJSE_Value* pRetValue) {
+    const v8::FunctionCallbackInfo<v8::Value>& info) {
   CFXJSE_FormCalcContext* pContext = ToFormCalcContext(pThis);
   if (info.Length() != 5) {
     pContext->ThrowParamCountMismatchException(L"IPmt");
@@ -2767,7 +2747,7 @@
   if (ValueIsNull(pThis, argOne.get()) || ValueIsNull(pThis, argTwo.get()) ||
       ValueIsNull(pThis, argThree.get()) || ValueIsNull(pThis, argFour.get()) ||
       ValueIsNull(pThis, argFive.get())) {
-    pRetValue->SetNull();
+    info.GetReturnValue().SetNull();
     return;
   }
 
@@ -2790,7 +2770,7 @@
   int32_t iEnd = std::min((int32_t)(nFirstMonth + nNumberOfMonths - 1), iNums);
 
   if (nPayment < nPrincipalAmount * nRateOfMonth) {
-    pRetValue->SetFloat(0);
+    info.GetReturnValue().Set(0);
     return;
   }
 
@@ -2803,14 +2783,13 @@
     nSum += nPrincipalAmount * nRateOfMonth;
     nPrincipalAmount -= nPayment - nPrincipalAmount * nRateOfMonth;
   }
-  pRetValue->SetFloat(nSum);
+  info.GetReturnValue().Set(nSum);
 }
 
 // static
 void CFXJSE_FormCalcContext::NPV(
     CFXJSE_Value* pThis,
-    const v8::FunctionCallbackInfo<v8::Value>& info,
-    CFXJSE_Value* pRetValue) {
+    const v8::FunctionCallbackInfo<v8::Value>& info) {
   CFXJSE_FormCalcContext* pContext = ToFormCalcContext(pThis);
   int32_t argc = info.Length();
   if (argc < 3) {
@@ -2822,7 +2801,7 @@
   for (int32_t i = 0; i < argc; i++) {
     argValues.push_back(GetSimpleValue(pThis, info, i));
     if (ValueIsNull(pThis, argValues[i].get())) {
-      pRetValue->SetNull();
+      info.GetReturnValue().SetNull();
       return;
     }
   }
@@ -2847,14 +2826,13 @@
     double nNum = data[iIndex++];
     nSum += nNum / nTemp;
   }
-  pRetValue->SetDouble(nSum);
+  info.GetReturnValue().Set(nSum);
 }
 
 // static
 void CFXJSE_FormCalcContext::Pmt(
     CFXJSE_Value* pThis,
-    const v8::FunctionCallbackInfo<v8::Value>& info,
-    CFXJSE_Value* pRetValue) {
+    const v8::FunctionCallbackInfo<v8::Value>& info) {
   CFXJSE_FormCalcContext* pContext = ToFormCalcContext(pThis);
   if (info.Length() != 3) {
     pContext->ThrowParamCountMismatchException(L"Pmt");
@@ -2866,7 +2844,7 @@
   std::unique_ptr<CFXJSE_Value> argThree = GetSimpleValue(pThis, info, 2);
   if (ValueIsNull(pThis, argOne.get()) || ValueIsNull(pThis, argTwo.get()) ||
       ValueIsNull(pThis, argThree.get())) {
-    pRetValue->SetNull();
+    info.GetReturnValue().SetNull();
     return;
   }
 
@@ -2883,14 +2861,13 @@
   for (int32_t i = 0; i < nPeriods - 1; ++i)
     nSum *= nTmp;
 
-  pRetValue->SetFloat((nPrincipal * nRate * nSum) / (nSum - 1));
+  info.GetReturnValue().Set((nPrincipal * nRate * nSum) / (nSum - 1));
 }
 
 // static
 void CFXJSE_FormCalcContext::PPmt(
     CFXJSE_Value* pThis,
-    const v8::FunctionCallbackInfo<v8::Value>& info,
-    CFXJSE_Value* pRetValue) {
+    const v8::FunctionCallbackInfo<v8::Value>& info) {
   CFXJSE_FormCalcContext* pContext = ToFormCalcContext(pThis);
   if (info.Length() != 5) {
     pContext->ThrowParamCountMismatchException(L"PPmt");
@@ -2905,7 +2882,7 @@
   if (ValueIsNull(pThis, argOne.get()) || ValueIsNull(pThis, argTwo.get()) ||
       ValueIsNull(pThis, argThree.get()) || ValueIsNull(pThis, argFour.get()) ||
       ValueIsNull(pThis, argFive.get())) {
-    pRetValue->SetNull();
+    info.GetReturnValue().SetNull();
     return;
   }
 
@@ -2942,13 +2919,13 @@
     nSum += nTemp;
     nPrincipalAmount -= nTemp;
   }
-  pRetValue->SetFloat(nSum);
+  info.GetReturnValue().Set(nSum);
 }
 
 // static
-void CFXJSE_FormCalcContext::PV(CFXJSE_Value* pThis,
-                                const v8::FunctionCallbackInfo<v8::Value>& info,
-                                CFXJSE_Value* pRetValue) {
+void CFXJSE_FormCalcContext::PV(
+    CFXJSE_Value* pThis,
+    const v8::FunctionCallbackInfo<v8::Value>& info) {
   CFXJSE_FormCalcContext* pContext = ToFormCalcContext(pThis);
   if (info.Length() != 3) {
     pContext->ThrowParamCountMismatchException(L"PV");
@@ -2960,7 +2937,7 @@
   std::unique_ptr<CFXJSE_Value> argThree = GetSimpleValue(pThis, info, 2);
   if (ValueIsNull(pThis, argOne.get()) || ValueIsNull(pThis, argTwo.get()) ||
       ValueIsNull(pThis, argThree.get())) {
-    pRetValue->SetNull();
+    info.GetReturnValue().SetNull();
     return;
   }
 
@@ -2977,14 +2954,13 @@
     nTemp *= 1 + nRate;
 
   nTemp = 1 / nTemp;
-  pRetValue->SetDouble(nAmount * ((1 - nTemp) / nRate));
+  info.GetReturnValue().Set(nAmount * ((1 - nTemp) / nRate));
 }
 
 // static
 void CFXJSE_FormCalcContext::Rate(
     CFXJSE_Value* pThis,
-    const v8::FunctionCallbackInfo<v8::Value>& info,
-    CFXJSE_Value* pRetValue) {
+    const v8::FunctionCallbackInfo<v8::Value>& info) {
   CFXJSE_FormCalcContext* pContext = ToFormCalcContext(pThis);
   if (info.Length() != 3) {
     pContext->ThrowParamCountMismatchException(L"Rate");
@@ -2996,7 +2972,7 @@
   std::unique_ptr<CFXJSE_Value> argThree = GetSimpleValue(pThis, info, 2);
   if (ValueIsNull(pThis, argOne.get()) || ValueIsNull(pThis, argTwo.get()) ||
       ValueIsNull(pThis, argThree.get())) {
-    pRetValue->SetNull();
+    info.GetReturnValue().SetNull();
     return;
   }
 
@@ -3008,15 +2984,14 @@
     return;
   }
 
-  pRetValue->SetFloat(
+  info.GetReturnValue().Set(
       FXSYS_pow((float)(nFuture / nPresent), (float)(1 / nTotalNumber)) - 1);
 }
 
 // static
 void CFXJSE_FormCalcContext::Term(
     CFXJSE_Value* pThis,
-    const v8::FunctionCallbackInfo<v8::Value>& info,
-    CFXJSE_Value* pRetValue) {
+    const v8::FunctionCallbackInfo<v8::Value>& info) {
   CFXJSE_FormCalcContext* pContext = ToFormCalcContext(pThis);
   if (info.Length() != 3) {
     pContext->ThrowParamCountMismatchException(L"Term");
@@ -3028,7 +3003,7 @@
   std::unique_ptr<CFXJSE_Value> argThree = GetSimpleValue(pThis, info, 2);
   if (ValueIsNull(pThis, argOne.get()) || ValueIsNull(pThis, argTwo.get()) ||
       ValueIsNull(pThis, argThree.get())) {
-    pRetValue->SetNull();
+    info.GetReturnValue().SetNull();
     return;
   }
 
@@ -3040,15 +3015,14 @@
     return;
   }
 
-  pRetValue->SetFloat(log((float)(nFuture / nMount * nRate) + 1) /
-                      log((float)(1 + nRate)));
+  info.GetReturnValue().Set(log((float)(nFuture / nMount * nRate) + 1) /
+                            log((float)(1 + nRate)));
 }
 
 // static
 void CFXJSE_FormCalcContext::Choose(
     CFXJSE_Value* pThis,
-    const v8::FunctionCallbackInfo<v8::Value>& info,
-    CFXJSE_Value* pRetValue) {
+    const v8::FunctionCallbackInfo<v8::Value>& info) {
   CFXJSE_FormCalcContext* pContext = ToFormCalcContext(pThis);
   int32_t argc = info.Length();
   if (argc < 2) {
@@ -3058,13 +3032,13 @@
 
   auto argOne = pdfium::MakeUnique<CFXJSE_Value>(info.GetIsolate(), info[0]);
   if (ValueIsNull(pThis, argOne.get())) {
-    pRetValue->SetNull();
+    info.GetReturnValue().SetNull();
     return;
   }
 
   int32_t iIndex = (int32_t)ValueToFloat(pThis, argOne.get());
   if (iIndex < 1) {
-    pRetValue->SetString("");
+    info.GetReturnValue().SetEmptyString();
     return;
   }
 
@@ -3098,41 +3072,41 @@
               propertyValue->ToString().AsStringView(), newPropertyValue.get());
         }
         ByteString bsChosen = ValueToUTF8String(newPropertyValue.get());
-        pRetValue->SetString(bsChosen.AsStringView());
+        info.GetReturnValue().Set(CFX_V8::NewStringHelper(
+            info.GetIsolate(), bsChosen.AsStringView()));
         bFound = true;
       }
     } else {
       iValueIndex++;
       if (iValueIndex == iIndex) {
         ByteString bsChosen = ValueToUTF8String(argIndexValue.get());
-        pRetValue->SetString(bsChosen.AsStringView());
+        info.GetReturnValue().Set(CFX_V8::NewStringHelper(
+            info.GetIsolate(), bsChosen.AsStringView()));
         bFound = true;
       }
     }
     iArgIndex++;
   }
   if (!bFound)
-    pRetValue->SetString("");
+    info.GetReturnValue().SetEmptyString();
 }
 
 // static
 void CFXJSE_FormCalcContext::Exists(
     CFXJSE_Value* pThis,
-    const v8::FunctionCallbackInfo<v8::Value>& info,
-    CFXJSE_Value* pRetValue) {
+    const v8::FunctionCallbackInfo<v8::Value>& info) {
   if (info.Length() != 1) {
     ToFormCalcContext(pThis)->ThrowParamCountMismatchException(L"Exists");
     return;
   }
   auto temp = pdfium::MakeUnique<CFXJSE_Value>(info.GetIsolate(), info[0]);
-  pRetValue->SetInteger(temp->IsObject());
+  info.GetReturnValue().Set(static_cast<int>(temp->IsObject()));
 }
 
 // static
 void CFXJSE_FormCalcContext::HasValue(
     CFXJSE_Value* pThis,
-    const v8::FunctionCallbackInfo<v8::Value>& info,
-    CFXJSE_Value* pRetValue) {
+    const v8::FunctionCallbackInfo<v8::Value>& info) {
   if (info.Length() != 1) {
     ToFormCalcContext(pThis)->ThrowParamCountMismatchException(L"HasValue");
     return;
@@ -3140,42 +3114,39 @@
 
   std::unique_ptr<CFXJSE_Value> argOne = GetSimpleValue(pThis, info, 0);
   if (!argOne->IsString()) {
-    pRetValue->SetInteger(argOne->IsNumber() || argOne->IsBoolean());
+    info.GetReturnValue().Set(
+        static_cast<int>(argOne->IsNumber() || argOne->IsBoolean()));
     return;
   }
 
   ByteString bsValue = argOne->ToString();
   bsValue.TrimLeft();
-  pRetValue->SetInteger(!bsValue.IsEmpty());
+  info.GetReturnValue().Set(static_cast<int>(!bsValue.IsEmpty()));
 }
 
 // static
 void CFXJSE_FormCalcContext::Oneof(
     CFXJSE_Value* pThis,
-    const v8::FunctionCallbackInfo<v8::Value>& info,
-    CFXJSE_Value* pRetValue) {
+    const v8::FunctionCallbackInfo<v8::Value>& info) {
   if (info.Length() < 2) {
     ToFormCalcContext(pThis)->ThrowParamCountMismatchException(L"Oneof");
     return;
   }
 
-  bool bFlags = false;
   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;
+      info.GetReturnValue().Set(1);
+      return;
     }
   }
-
-  pRetValue->SetInteger(bFlags);
+  info.GetReturnValue().Set(0);
 }
 
 // static
 void CFXJSE_FormCalcContext::Within(
     CFXJSE_Value* pThis,
-    const v8::FunctionCallbackInfo<v8::Value>& info,
-    CFXJSE_Value* pRetValue) {
+    const v8::FunctionCallbackInfo<v8::Value>& info) {
   if (info.Length() != 3) {
     ToFormCalcContext(pThis)->ThrowParamCountMismatchException(L"Within");
     return;
@@ -3183,7 +3154,7 @@
 
   std::unique_ptr<CFXJSE_Value> argOne = GetSimpleValue(pThis, info, 0);
   if (argOne->IsNull()) {
-    pRetValue->SetUndefined();
+    info.GetReturnValue().SetUndefined();
     return;
   }
 
@@ -3193,37 +3164,40 @@
     float oneNumber = ValueToFloat(pThis, argOne.get());
     float lowNumber = ValueToFloat(pThis, argLow.get());
     float heightNumber = ValueToFloat(pThis, argHigh.get());
-    pRetValue->SetInteger((oneNumber >= lowNumber) &&
-                          (oneNumber <= heightNumber));
+    info.GetReturnValue().Set(static_cast<int>((oneNumber >= lowNumber) &&
+                                               (oneNumber <= heightNumber)));
     return;
   }
 
   ByteString bsOne = ValueToUTF8String(argOne.get());
   ByteString bsLow = ValueToUTF8String(argLow.get());
   ByteString bsHeight = ValueToUTF8String(argHigh.get());
-  pRetValue->SetInteger((bsOne.Compare(bsLow.AsStringView()) >= 0) &&
-                        (bsOne.Compare(bsHeight.AsStringView()) <= 0));
+  info.GetReturnValue().Set(
+      static_cast<int>((bsOne.Compare(bsLow.AsStringView()) >= 0) &&
+                       (bsOne.Compare(bsHeight.AsStringView()) <= 0)));
 }
 
 // static
-void CFXJSE_FormCalcContext::If(CFXJSE_Value* pThis,
-                                const v8::FunctionCallbackInfo<v8::Value>& info,
-                                CFXJSE_Value* pRetValue) {
+void CFXJSE_FormCalcContext::If(
+    CFXJSE_Value* pThis,
+    const v8::FunctionCallbackInfo<v8::Value>& info) {
   if (info.Length() != 3) {
     ToFormCalcContext(pThis)->ThrowParamCountMismatchException(L"If");
     return;
   }
 
-  pRetValue->Assign(GetSimpleValue(pThis, info, 0)->ToBoolean()
-                        ? GetSimpleValue(pThis, info, 1).get()
-                        : GetSimpleValue(pThis, info, 2).get());
+  std::unique_ptr<CFXJSE_Value> value =
+      GetSimpleValue(pThis, info, 0)->ToBoolean()
+          ? GetSimpleValue(pThis, info, 1)
+          : GetSimpleValue(pThis, info, 2);
+
+  info.GetReturnValue().Set(value->DirectGetValue());
 }
 
 // static
 void CFXJSE_FormCalcContext::Eval(
     CFXJSE_Value* pThis,
-    const v8::FunctionCallbackInfo<v8::Value>& info,
-    CFXJSE_Value* pRetValue) {
+    const v8::FunctionCallbackInfo<v8::Value>& info) {
   CFXJSE_FormCalcContext* pContext = ToFormCalcContext(pThis);
   if (info.Length() != 1) {
     pContext->ThrowParamCountMismatchException(L"Eval");
@@ -3234,7 +3208,7 @@
   std::unique_ptr<CFXJSE_Value> scriptValue = GetSimpleValue(pThis, info, 0);
   ByteString bsUtf8Script = ValueToUTF8String(scriptValue.get());
   if (bsUtf8Script.IsEmpty()) {
-    pRetValue->SetNull();
+    info.GetReturnValue().SetNull();
     return;
   }
 
@@ -3254,14 +3228,13 @@
       FX_UTF8Encode(wsJavaScriptBuf.AsStringView()).c_str(), returnValue.get(),
       nullptr);
 
-  pRetValue->Assign(returnValue.get());
+  info.GetReturnValue().Set(returnValue->DirectGetValue());
 }
 
 // static
 void CFXJSE_FormCalcContext::Ref(
     CFXJSE_Value* pThis,
-    const v8::FunctionCallbackInfo<v8::Value>& info,
-    CFXJSE_Value* pRetValue) {
+    const v8::FunctionCallbackInfo<v8::Value>& info) {
   CFXJSE_FormCalcContext* pContext = ToFormCalcContext(pThis);
   v8::Isolate* pIsolate = pContext->GetScriptRuntime();
   if (info.Length() != 1) {
@@ -3277,7 +3250,7 @@
   }
 
   if (argOne->IsBoolean() || argOne->IsString() || argOne->IsNumber()) {
-    pRetValue->Assign(argOne.get());
+    info.GetReturnValue().Set(argOne->DirectGetValue());
     return;
   }
 
@@ -3313,14 +3286,16 @@
 
   values[0]->SetInteger(intVal);
   values[1]->SetNull();
-  pRetValue->SetArray(values);
+
+  auto temp = pdfium::MakeUnique<CFXJSE_Value>(info.GetIsolate());
+  temp->SetArray(values);
+  info.GetReturnValue().Set(temp->DirectGetValue());
 }
 
 // static
 void CFXJSE_FormCalcContext::UnitType(
     CFXJSE_Value* pThis,
-    const v8::FunctionCallbackInfo<v8::Value>& info,
-    CFXJSE_Value* pRetValue) {
+    const v8::FunctionCallbackInfo<v8::Value>& info) {
   if (info.Length() != 1) {
     ToFormCalcContext(pThis)->ThrowParamCountMismatchException(L"UnitType");
     return;
@@ -3328,13 +3303,13 @@
 
   std::unique_ptr<CFXJSE_Value> unitspanValue = GetSimpleValue(pThis, info, 0);
   if (unitspanValue->IsNull()) {
-    pRetValue->SetNull();
+    info.GetReturnValue().SetNull();
     return;
   }
 
   ByteString bsUnitspan = ValueToUTF8String(unitspanValue.get());
   if (bsUnitspan.IsEmpty()) {
-    pRetValue->SetString("in");
+    info.GetReturnValue().SetEmptyString();
     return;
   }
 
@@ -3407,19 +3382,24 @@
   }
   switch (eParserStatus) {
     case VALUETYPE_ISCM:
-      pRetValue->SetString("cm");
+      info.GetReturnValue().Set(
+          CFX_V8::NewStringHelper(info.GetIsolate(), "cm"));
       break;
     case VALUETYPE_ISMM:
-      pRetValue->SetString("mm");
+      info.GetReturnValue().Set(
+          CFX_V8::NewStringHelper(info.GetIsolate(), "mm"));
       break;
     case VALUETYPE_ISPT:
-      pRetValue->SetString("pt");
+      info.GetReturnValue().Set(
+          CFX_V8::NewStringHelper(info.GetIsolate(), "pt"));
       break;
     case VALUETYPE_ISMP:
-      pRetValue->SetString("mp");
+      info.GetReturnValue().Set(
+          CFX_V8::NewStringHelper(info.GetIsolate(), "mp"));
       break;
     default:
-      pRetValue->SetString("in");
+      info.GetReturnValue().Set(
+          CFX_V8::NewStringHelper(info.GetIsolate(), "in"));
       break;
   }
 }
@@ -3427,8 +3407,7 @@
 // static
 void CFXJSE_FormCalcContext::UnitValue(
     CFXJSE_Value* pThis,
-    const v8::FunctionCallbackInfo<v8::Value>& info,
-    CFXJSE_Value* pRetValue) {
+    const v8::FunctionCallbackInfo<v8::Value>& info) {
   int32_t argc = info.Length();
   if (argc < 1 || argc > 2) {
     ToFormCalcContext(pThis)->ThrowParamCountMismatchException(L"UnitValue");
@@ -3437,14 +3416,14 @@
 
   std::unique_ptr<CFXJSE_Value> unitspanValue = GetSimpleValue(pThis, info, 0);
   if (unitspanValue->IsNull()) {
-    pRetValue->SetNull();
+    info.GetReturnValue().SetNull();
     return;
   }
 
   ByteString bsUnitspan = ValueToUTF8String(unitspanValue.get());
   const char* pData = bsUnitspan.c_str();
   if (!pData) {
-    pRetValue->SetInteger(0);
+    info.GetReturnValue().Set(0);
     return;
   }
 
@@ -3561,13 +3540,13 @@
     else
       dResult = dFirstNumber / 72000;
   }
-  pRetValue->SetDouble(dResult);
+  info.GetReturnValue().Set(dResult);
 }
 
 // static
-void CFXJSE_FormCalcContext::At(CFXJSE_Value* pThis,
-                                const v8::FunctionCallbackInfo<v8::Value>& info,
-                                CFXJSE_Value* pRetValue) {
+void CFXJSE_FormCalcContext::At(
+    CFXJSE_Value* pThis,
+    const v8::FunctionCallbackInfo<v8::Value>& info) {
   if (info.Length() != 2) {
     ToFormCalcContext(pThis)->ThrowParamCountMismatchException(L"At");
     return;
@@ -3576,26 +3555,26 @@
   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())) {
-    pRetValue->SetNull();
+    info.GetReturnValue().SetNull();
     return;
   }
 
   ByteString stringTwo = ValueToUTF8String(argTwo.get());
   if (stringTwo.IsEmpty()) {
-    pRetValue->SetInteger(1);
+    info.GetReturnValue().Set(1);
     return;
   }
 
   ByteString stringOne = ValueToUTF8String(argOne.get());
   auto pos = stringOne.Find(stringTwo.AsStringView());
-  pRetValue->SetInteger(pos.has_value() ? pos.value() + 1 : 0);
+  info.GetReturnValue().Set(
+      static_cast<int>(pos.has_value() ? pos.value() + 1 : 0));
 }
 
 // static
 void CFXJSE_FormCalcContext::Concat(
     CFXJSE_Value* pThis,
-    const v8::FunctionCallbackInfo<v8::Value>& info,
-    CFXJSE_Value* pRetValue) {
+    const v8::FunctionCallbackInfo<v8::Value>& info) {
   int32_t argc = info.Length();
   if (argc < 1) {
     ToFormCalcContext(pThis)->ThrowParamCountMismatchException(L"Concat");
@@ -3614,18 +3593,17 @@
   }
 
   if (bAllNull) {
-    pRetValue->SetNull();
+    info.GetReturnValue().SetNull();
     return;
   }
-
-  pRetValue->SetString(bsResult.AsStringView());
+  info.GetReturnValue().Set(
+      CFX_V8::NewStringHelper(info.GetIsolate(), bsResult.AsStringView()));
 }
 
 // static
 void CFXJSE_FormCalcContext::Decode(
     CFXJSE_Value* pThis,
-    const v8::FunctionCallbackInfo<v8::Value>& info,
-    CFXJSE_Value* pRetValue) {
+    const v8::FunctionCallbackInfo<v8::Value>& info) {
   int32_t argc = info.Length();
   if (argc < 1 || argc > 2) {
     ToFormCalcContext(pThis)->ThrowParamCountMismatchException(L"Decode");
@@ -3635,21 +3613,22 @@
   if (argc == 1) {
     std::unique_ptr<CFXJSE_Value> argOne = GetSimpleValue(pThis, info, 0);
     if (ValueIsNull(pThis, argOne.get())) {
-      pRetValue->SetNull();
+      info.GetReturnValue().SetNull();
       return;
     }
 
     WideString decoded = DecodeURL(
         WideString::FromUTF8(ValueToUTF8String(argOne.get()).AsStringView()));
-
-    pRetValue->SetString(FX_UTF8Encode(decoded.AsStringView()).AsStringView());
+    auto result = FX_UTF8Encode(decoded.AsStringView());
+    info.GetReturnValue().Set(
+        CFX_V8::NewStringHelper(info.GetIsolate(), result.AsStringView()));
     return;
   }
 
   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())) {
-    pRetValue->SetNull();
+    info.GetReturnValue().SetNull();
     return;
   }
 
@@ -3666,14 +3645,15 @@
   else
     decoded = DecodeURL(wsToDecode);
 
-  pRetValue->SetString(FX_UTF8Encode(decoded.AsStringView()).AsStringView());
+  auto result = FX_UTF8Encode(decoded.AsStringView());
+  info.GetReturnValue().Set(
+      CFX_V8::NewStringHelper(info.GetIsolate(), result.AsStringView()));
 }
 
 // static
 void CFXJSE_FormCalcContext::Encode(
     CFXJSE_Value* pThis,
-    const v8::FunctionCallbackInfo<v8::Value>& info,
-    CFXJSE_Value* pRetValue) {
+    const v8::FunctionCallbackInfo<v8::Value>& info) {
   int32_t argc = info.Length();
   if (argc < 1 || argc > 2) {
     ToFormCalcContext(pThis)->ThrowParamCountMismatchException(L"Encode");
@@ -3683,19 +3663,20 @@
   if (argc == 1) {
     std::unique_ptr<CFXJSE_Value> argOne = GetSimpleValue(pThis, info, 0);
     if (ValueIsNull(pThis, argOne.get())) {
-      pRetValue->SetNull();
+      info.GetReturnValue().SetNull();
       return;
     }
-
     WideString encoded = EncodeURL(ValueToUTF8String(argOne.get()));
-    pRetValue->SetString(FX_UTF8Encode(encoded.AsStringView()).AsStringView());
+    auto result = FX_UTF8Encode(encoded.AsStringView());
+    info.GetReturnValue().Set(
+        CFX_V8::NewStringHelper(info.GetIsolate(), result.AsStringView()));
     return;
   }
 
   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())) {
-    pRetValue->SetNull();
+    info.GetReturnValue().SetNull();
     return;
   }
 
@@ -3709,14 +3690,15 @@
   else
     encoded = EncodeURL(bsToEncode);
 
-  pRetValue->SetString(FX_UTF8Encode(encoded.AsStringView()).AsStringView());
+  auto result = FX_UTF8Encode(encoded.AsStringView());
+  info.GetReturnValue().Set(
+      CFX_V8::NewStringHelper(info.GetIsolate(), result.AsStringView()));
 }
 
 // static
 void CFXJSE_FormCalcContext::Format(
     CFXJSE_Value* pThis,
-    const v8::FunctionCallbackInfo<v8::Value>& info,
-    CFXJSE_Value* pRetValue) {
+    const v8::FunctionCallbackInfo<v8::Value>& info) {
   CFXJSE_FormCalcContext* pContext = ToFormCalcContext(pThis);
   if (info.Length() < 2) {
     pContext->ThrowParamCountMismatchException(L"Format");
@@ -3744,7 +3726,7 @@
       case XFA_VT_DATETIME: {
         auto iTChar = wsPattern.Find(L'T');
         if (!iTChar.has_value()) {
-          pRetValue->SetString("");
+          info.GetReturnValue().SetEmptyString();
           return;
         }
         WideString wsDatePattern(L"date{");
@@ -3786,18 +3768,17 @@
   WideString wsRet;
   if (!localeValue.FormatPatterns(wsRet, wsPattern, pLocale,
                                   XFA_VALUEPICTURE_Display)) {
-    pRetValue->SetString("");
+    info.GetReturnValue().SetEmptyString();
     return;
   }
-
-  pRetValue->SetString(wsRet.ToUTF8().AsStringView());
+  info.GetReturnValue().Set(CFX_V8::NewStringHelper(
+      info.GetIsolate(), wsRet.ToUTF8().AsStringView()));
 }
 
 // static
 void CFXJSE_FormCalcContext::Left(
     CFXJSE_Value* pThis,
-    const v8::FunctionCallbackInfo<v8::Value>& info,
-    CFXJSE_Value* pRetValue) {
+    const v8::FunctionCallbackInfo<v8::Value>& info) {
   if (info.Length() != 2) {
     ToFormCalcContext(pThis)->ThrowParamCountMismatchException(L"Left");
     return;
@@ -3807,20 +3788,20 @@
   std::unique_ptr<CFXJSE_Value> argTwo = GetSimpleValue(pThis, info, 1);
   if ((ValueIsNull(pThis, argOne.get())) ||
       (ValueIsNull(pThis, argTwo.get()))) {
-    pRetValue->SetNull();
+    info.GetReturnValue().SetNull();
     return;
   }
 
   ByteString bsSource = ValueToUTF8String(argOne.get());
   int32_t count = std::max(0, ValueToInteger(pThis, argTwo.get()));
-  pRetValue->SetString(bsSource.First(count).AsStringView());
+  info.GetReturnValue().Set(CFX_V8::NewStringHelper(
+      info.GetIsolate(), bsSource.First(count).AsStringView()));
 }
 
 // static
 void CFXJSE_FormCalcContext::Len(
     CFXJSE_Value* pThis,
-    const v8::FunctionCallbackInfo<v8::Value>& info,
-    CFXJSE_Value* pRetValue) {
+    const v8::FunctionCallbackInfo<v8::Value>& info) {
   if (info.Length() != 1) {
     ToFormCalcContext(pThis)->ThrowParamCountMismatchException(L"Len");
     return;
@@ -3828,19 +3809,18 @@
 
   std::unique_ptr<CFXJSE_Value> argOne = GetSimpleValue(pThis, info, 0);
   if (ValueIsNull(pThis, argOne.get())) {
-    pRetValue->SetNull();
+    info.GetReturnValue().SetNull();
     return;
   }
 
   ByteString bsSource = ValueToUTF8String(argOne.get());
-  pRetValue->SetInteger(bsSource.GetLength());
+  info.GetReturnValue().Set(static_cast<int>(bsSource.GetLength()));
 }
 
 // static
 void CFXJSE_FormCalcContext::Lower(
     CFXJSE_Value* pThis,
-    const v8::FunctionCallbackInfo<v8::Value>& info,
-    CFXJSE_Value* pRetValue) {
+    const v8::FunctionCallbackInfo<v8::Value>& info) {
   int32_t argc = info.Length();
   if (argc < 1 || argc > 2) {
     ToFormCalcContext(pThis)->ThrowParamCountMismatchException(L"Lower");
@@ -3849,7 +3829,7 @@
 
   std::unique_ptr<CFXJSE_Value> argOne = GetSimpleValue(pThis, info, 0);
   if (ValueIsNull(pThis, argOne.get())) {
-    pRetValue->SetNull();
+    info.GetReturnValue().SetNull();
     return;
   }
 
@@ -3865,14 +3845,15 @@
   }
   szLowBuf.AppendChar(0);
 
-  pRetValue->SetString(FX_UTF8Encode(szLowBuf.AsStringView()).AsStringView());
+  auto result = FX_UTF8Encode(szLowBuf.AsStringView());
+  info.GetReturnValue().Set(
+      CFX_V8::NewStringHelper(info.GetIsolate(), result.AsStringView()));
 }
 
 // static
 void CFXJSE_FormCalcContext::Ltrim(
     CFXJSE_Value* pThis,
-    const v8::FunctionCallbackInfo<v8::Value>& info,
-    CFXJSE_Value* pRetValue) {
+    const v8::FunctionCallbackInfo<v8::Value>& info) {
   if (info.Length() != 1) {
     ToFormCalcContext(pThis)->ThrowParamCountMismatchException(L"Ltrim");
     return;
@@ -3880,20 +3861,20 @@
 
   std::unique_ptr<CFXJSE_Value> argOne = GetSimpleValue(pThis, info, 0);
   if (ValueIsNull(pThis, argOne.get())) {
-    pRetValue->SetNull();
+    info.GetReturnValue().SetNull();
     return;
   }
 
   ByteString bsSource = ValueToUTF8String(argOne.get());
   bsSource.TrimLeft();
-  pRetValue->SetString(bsSource.AsStringView());
+  info.GetReturnValue().Set(
+      CFX_V8::NewStringHelper(info.GetIsolate(), bsSource.AsStringView()));
 }
 
 // static
 void CFXJSE_FormCalcContext::Parse(
     CFXJSE_Value* pThis,
-    const v8::FunctionCallbackInfo<v8::Value>& info,
-    CFXJSE_Value* pRetValue) {
+    const v8::FunctionCallbackInfo<v8::Value>& info) {
   CFXJSE_FormCalcContext* pContext = ToFormCalcContext(pThis);
   if (info.Length() != 2) {
     pContext->ThrowParamCountMismatchException(L"Parse");
@@ -3903,7 +3884,7 @@
   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())) {
-    pRetValue->SetNull();
+    info.GetReturnValue().SetNull();
     return;
   }
 
@@ -3923,10 +3904,12 @@
     CXFA_LocaleValue localeValue(dwPatternType, wsValue, wsPattern, pLocale,
                                  pMgr);
     if (!localeValue.IsValid()) {
-      pRetValue->SetString("");
+      info.GetReturnValue().SetEmptyString();
       return;
     }
-    pRetValue->SetString(localeValue.GetValue().ToUTF8().AsStringView());
+    auto result = localeValue.GetValue().ToUTF8();
+    info.GetReturnValue().Set(
+        CFX_V8::NewStringHelper(info.GetIsolate(), result.AsStringView()));
     return;
   }
 
@@ -3934,7 +3917,7 @@
     case XFA_VT_DATETIME: {
       auto iTChar = wsPattern.Find(L'T');
       if (!iTChar.has_value()) {
-        pRetValue->SetString("");
+        info.GetReturnValue().SetEmptyString();
         return;
       }
       WideString wsDatePattern(L"date{" + wsPattern.First(iTChar.value()) +
@@ -3946,10 +3929,12 @@
       CXFA_LocaleValue localeValue(dwPatternType, wsValue, wsPattern, pLocale,
                                    pMgr);
       if (!localeValue.IsValid()) {
-        pRetValue->SetString("");
+        info.GetReturnValue().SetEmptyString();
         return;
       }
-      pRetValue->SetString(localeValue.GetValue().ToUTF8().AsStringView());
+      auto result = localeValue.GetValue().ToUTF8();
+      info.GetReturnValue().Set(
+          CFX_V8::NewStringHelper(info.GetIsolate(), result.AsStringView()));
       return;
     }
     case XFA_VT_DATE: {
@@ -3957,10 +3942,12 @@
       CXFA_LocaleValue localeValue(dwPatternType, wsValue, wsPattern, pLocale,
                                    pMgr);
       if (!localeValue.IsValid()) {
-        pRetValue->SetString("");
+        info.GetReturnValue().SetEmptyString();
         return;
       }
-      pRetValue->SetString(localeValue.GetValue().ToUTF8().AsStringView());
+      auto result = localeValue.GetValue().ToUTF8();
+      info.GetReturnValue().Set(
+          CFX_V8::NewStringHelper(info.GetIsolate(), result.AsStringView()));
       return;
     }
     case XFA_VT_TIME: {
@@ -3968,10 +3955,12 @@
       CXFA_LocaleValue localeValue(dwPatternType, wsValue, wsPattern, pLocale,
                                    pMgr);
       if (!localeValue.IsValid()) {
-        pRetValue->SetString("");
+        info.GetReturnValue().SetEmptyString();
         return;
       }
-      pRetValue->SetString(localeValue.GetValue().ToUTF8().AsStringView());
+      auto result = localeValue.GetValue().ToUTF8();
+      info.GetReturnValue().Set(
+          CFX_V8::NewStringHelper(info.GetIsolate(), result.AsStringView()));
       return;
     }
     case XFA_VT_TEXT: {
@@ -3979,10 +3968,12 @@
       CXFA_LocaleValue localeValue(XFA_VT_TEXT, wsValue, wsPattern, pLocale,
                                    pMgr);
       if (!localeValue.IsValid()) {
-        pRetValue->SetString("");
+        info.GetReturnValue().SetEmptyString();
         return;
       }
-      pRetValue->SetString(localeValue.GetValue().ToUTF8().AsStringView());
+      auto result = localeValue.GetValue().ToUTF8();
+      info.GetReturnValue().Set(
+          CFX_V8::NewStringHelper(info.GetIsolate(), result.AsStringView()));
       return;
     }
     case XFA_VT_FLOAT: {
@@ -3990,10 +3981,10 @@
       CXFA_LocaleValue localeValue(XFA_VT_FLOAT, wsValue, wsPattern, pLocale,
                                    pMgr);
       if (!localeValue.IsValid()) {
-        pRetValue->SetString("");
+        info.GetReturnValue().SetEmptyString();
         return;
       }
-      pRetValue->SetDouble(localeValue.GetDoubleNum());
+      info.GetReturnValue().Set(localeValue.GetDoubleNum());
       return;
     }
     default: {
@@ -4002,7 +3993,7 @@
         CXFA_LocaleValue localeValue(XFA_VT_FLOAT, wsValue, wsTestPattern,
                                      pLocale, pMgr);
         if (localeValue.IsValid()) {
-          pRetValue->SetDouble(localeValue.GetDoubleNum());
+          info.GetReturnValue().Set(localeValue.GetDoubleNum());
           return;
         }
       }
@@ -4012,11 +4003,13 @@
         CXFA_LocaleValue localeValue(XFA_VT_TEXT, wsValue, wsTestPattern,
                                      pLocale, pMgr);
         if (localeValue.IsValid()) {
-          pRetValue->SetString(localeValue.GetValue().ToUTF8().AsStringView());
+          auto result = localeValue.GetValue().ToUTF8();
+          info.GetReturnValue().Set(CFX_V8::NewStringHelper(
+              info.GetIsolate(), result.AsStringView()));
           return;
         }
       }
-      pRetValue->SetString("");
+      info.GetReturnValue().SetEmptyString();
       return;
     }
   }
@@ -4025,8 +4018,7 @@
 // static
 void CFXJSE_FormCalcContext::Replace(
     CFXJSE_Value* pThis,
-    const v8::FunctionCallbackInfo<v8::Value>& info,
-    CFXJSE_Value* pRetValue) {
+    const v8::FunctionCallbackInfo<v8::Value>& info) {
   int32_t argc = info.Length();
   if (argc < 2 || argc > 3) {
     ToFormCalcContext(pThis)->ThrowParamCountMismatchException(L"Replace");
@@ -4079,14 +4071,14 @@
     }
   }
   szResult << '\0';
-  pRetValue->SetString(ByteStringView(szResult.str().c_str()));
+  info.GetReturnValue().Set(CFX_V8::NewStringHelper(
+      info.GetIsolate(), ByteStringView(szResult.str().c_str())));
 }
 
 // static
 void CFXJSE_FormCalcContext::Right(
     CFXJSE_Value* pThis,
-    const v8::FunctionCallbackInfo<v8::Value>& info,
-    CFXJSE_Value* pRetValue) {
+    const v8::FunctionCallbackInfo<v8::Value>& info) {
   if (info.Length() != 2) {
     ToFormCalcContext(pThis)->ThrowParamCountMismatchException(L"Right");
     return;
@@ -4096,20 +4088,20 @@
   std::unique_ptr<CFXJSE_Value> argTwo = GetSimpleValue(pThis, info, 1);
   if ((ValueIsNull(pThis, argOne.get())) ||
       (ValueIsNull(pThis, argTwo.get()))) {
-    pRetValue->SetNull();
+    info.GetReturnValue().SetNull();
     return;
   }
 
   ByteString bsSource = ValueToUTF8String(argOne.get());
   int32_t count = std::max(0, ValueToInteger(pThis, argTwo.get()));
-  pRetValue->SetString(bsSource.Last(count).AsStringView());
+  info.GetReturnValue().Set(CFX_V8::NewStringHelper(
+      info.GetIsolate(), bsSource.Last(count).AsStringView()));
 }
 
 // static
 void CFXJSE_FormCalcContext::Rtrim(
     CFXJSE_Value* pThis,
-    const v8::FunctionCallbackInfo<v8::Value>& info,
-    CFXJSE_Value* pRetValue) {
+    const v8::FunctionCallbackInfo<v8::Value>& info) {
   if (info.Length() != 1) {
     ToFormCalcContext(pThis)->ThrowParamCountMismatchException(L"Rtrim");
     return;
@@ -4117,20 +4109,20 @@
 
   std::unique_ptr<CFXJSE_Value> argOne = GetSimpleValue(pThis, info, 0);
   if (ValueIsNull(pThis, argOne.get())) {
-    pRetValue->SetNull();
+    info.GetReturnValue().SetNull();
     return;
   }
 
   ByteString bsSource = ValueToUTF8String(argOne.get());
   bsSource.TrimRight();
-  pRetValue->SetString(bsSource.AsStringView());
+  info.GetReturnValue().Set(
+      CFX_V8::NewStringHelper(info.GetIsolate(), bsSource.AsStringView()));
 }
 
 // static
 void CFXJSE_FormCalcContext::Space(
     CFXJSE_Value* pThis,
-    const v8::FunctionCallbackInfo<v8::Value>& info,
-    CFXJSE_Value* pRetValue) {
+    const v8::FunctionCallbackInfo<v8::Value>& info) {
   if (info.Length() != 1) {
     ToFormCalcContext(pThis)->ThrowParamCountMismatchException(L"Space");
     return;
@@ -4138,7 +4130,7 @@
 
   std::unique_ptr<CFXJSE_Value> argOne = GetSimpleValue(pThis, info, 0);
   if (argOne->IsNull()) {
-    pRetValue->SetNull();
+    info.GetReturnValue().SetNull();
     return;
   }
 
@@ -4150,14 +4142,14 @@
     index++;
   }
   spaceString << '\0';
-  pRetValue->SetString(ByteStringView(spaceString.str().c_str()));
+  info.GetReturnValue().Set(CFX_V8::NewStringHelper(
+      info.GetIsolate(), ByteStringView(spaceString.str().c_str())));
 }
 
 // static
 void CFXJSE_FormCalcContext::Str(
     CFXJSE_Value* pThis,
-    const v8::FunctionCallbackInfo<v8::Value>& info,
-    CFXJSE_Value* pRetValue) {
+    const v8::FunctionCallbackInfo<v8::Value>& info) {
   int32_t argc = info.Length();
   if (argc < 1 || argc > 3) {
     ToFormCalcContext(pThis)->ThrowParamCountMismatchException(L"Str");
@@ -4166,7 +4158,7 @@
 
   std::unique_ptr<CFXJSE_Value> numberValue = GetSimpleValue(pThis, info, 0);
   if (numberValue->IsNull()) {
-    pRetValue->SetNull();
+    info.GetReturnValue().SetNull();
     return;
   }
   float fNumber = ValueToFloat(pThis, numberValue.get());
@@ -4211,7 +4203,8 @@
       ++i;
     }
     resultBuf << '\0';
-    pRetValue->SetString(ByteStringView(resultBuf.str().c_str()));
+    info.GetReturnValue().Set(CFX_V8::NewStringHelper(
+        info.GetIsolate(), ByteStringView(resultBuf.str().c_str())));
     return;
   }
 
@@ -4230,7 +4223,8 @@
       }
       resultBuf << pData;
     }
-    pRetValue->SetString(ByteStringView(resultBuf.str().c_str()));
+    info.GetReturnValue().Set(CFX_V8::NewStringHelper(
+        info.GetIsolate(), ByteStringView(resultBuf.str().c_str())));
     return;
   }
 
@@ -4266,14 +4260,14 @@
     ++i;
   }
   resultBuf << '\0';
-  pRetValue->SetString(ByteStringView(resultBuf.str().c_str()));
+  info.GetReturnValue().Set(CFX_V8::NewStringHelper(
+      info.GetIsolate(), ByteStringView(resultBuf.str().c_str())));
 }
 
 // static
 void CFXJSE_FormCalcContext::Stuff(
     CFXJSE_Value* pThis,
-    const v8::FunctionCallbackInfo<v8::Value>& info,
-    CFXJSE_Value* pRetValue) {
+    const v8::FunctionCallbackInfo<v8::Value>& info) {
   int32_t argc = info.Length();
   if (argc < 3 || argc > 4) {
     ToFormCalcContext(pThis)->ThrowParamCountMismatchException(L"Stuff");
@@ -4318,14 +4312,15 @@
     ++i;
   }
   szResult << '\0';
-  pRetValue->SetString(ByteStringView(szResult.str().c_str()));
+  info.GetReturnValue().Set(CFX_V8::NewStringHelper(
+      info.GetIsolate(), ByteStringView(szResult.str().c_str())));
+  ;
 }
 
 // static
 void CFXJSE_FormCalcContext::Substr(
     CFXJSE_Value* pThis,
-    const v8::FunctionCallbackInfo<v8::Value>& info,
-    CFXJSE_Value* pRetValue) {
+    const v8::FunctionCallbackInfo<v8::Value>& info) {
   if (info.Length() != 3) {
     ToFormCalcContext(pThis)->ThrowParamCountMismatchException(L"Substr");
     return;
@@ -4337,14 +4332,14 @@
   if (ValueIsNull(pThis, string_value.get()) ||
       ValueIsNull(pThis, start_value.get()) ||
       ValueIsNull(pThis, end_value.get())) {
-    pRetValue->SetNull();
+    info.GetReturnValue().SetNull();
     return;
   }
 
   ByteString bsSource = ValueToUTF8String(string_value.get());
   size_t iLength = bsSource.GetLength();
   if (iLength == 0) {
-    pRetValue->SetString("");
+    info.GetReturnValue().SetEmptyString();
     return;
   }
 
@@ -4352,21 +4347,21 @@
   // 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) {
-    pRetValue->SetString("");
+    info.GetReturnValue().SetEmptyString();
     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);
-  pRetValue->SetString(bsSource.Substr(iStart, iCount).AsStringView());
+  info.GetReturnValue().Set(CFX_V8::NewStringHelper(
+      info.GetIsolate(), bsSource.Substr(iStart, iCount).AsStringView()));
 }
 
 // static
 void CFXJSE_FormCalcContext::Uuid(
     CFXJSE_Value* pThis,
-    const v8::FunctionCallbackInfo<v8::Value>& info,
-    CFXJSE_Value* pRetValue) {
+    const v8::FunctionCallbackInfo<v8::Value>& info) {
   int32_t argc = info.Length();
   if (argc < 0 || argc > 1) {
     ToFormCalcContext(pThis)->ThrowParamCountMismatchException(L"Uuid");
@@ -4378,14 +4373,14 @@
     std::unique_ptr<CFXJSE_Value> argOne = GetSimpleValue(pThis, info, 0);
     iNum = static_cast<int32_t>(ValueToFloat(pThis, argOne.get()));
   }
-  pRetValue->SetString(GUIDString(!!iNum).AsStringView());
+  info.GetReturnValue().Set(CFX_V8::NewStringHelper(
+      info.GetIsolate(), GUIDString(!!iNum).AsStringView()));
 }
 
 // static
 void CFXJSE_FormCalcContext::Upper(
     CFXJSE_Value* pThis,
-    const v8::FunctionCallbackInfo<v8::Value>& info,
-    CFXJSE_Value* pRetValue) {
+    const v8::FunctionCallbackInfo<v8::Value>& info) {
   int32_t argc = info.Length();
   if (argc < 1 || argc > 2) {
     ToFormCalcContext(pThis)->ThrowParamCountMismatchException(L"Upper");
@@ -4394,7 +4389,7 @@
 
   std::unique_ptr<CFXJSE_Value> argOne = GetSimpleValue(pThis, info, 0);
   if (ValueIsNull(pThis, argOne.get())) {
-    pRetValue->SetNull();
+    info.GetReturnValue().SetNull();
     return;
   }
 
@@ -4415,15 +4410,15 @@
   }
   upperStringBuf.AppendChar(0);
 
-  pRetValue->SetString(
-      FX_UTF8Encode(upperStringBuf.AsStringView()).AsStringView());
+  info.GetReturnValue().Set(CFX_V8::NewStringHelper(
+      info.GetIsolate(),
+      FX_UTF8Encode(upperStringBuf.AsStringView()).AsStringView()));
 }
 
 // static
 void CFXJSE_FormCalcContext::WordNum(
     CFXJSE_Value* pThis,
-    const v8::FunctionCallbackInfo<v8::Value>& info,
-    CFXJSE_Value* pRetValue) {
+    const v8::FunctionCallbackInfo<v8::Value>& info) {
   int32_t argc = info.Length();
   if (argc < 1 || argc > 3) {
     ToFormCalcContext(pThis)->ThrowParamCountMismatchException(L"WordNum");
@@ -4432,7 +4427,7 @@
 
   std::unique_ptr<CFXJSE_Value> numberValue = GetSimpleValue(pThis, info, 0);
   if (numberValue->IsNull()) {
-    pRetValue->SetNull();
+    info.GetReturnValue().SetNull();
     return;
   }
   float fNumber = ValueToFloat(pThis, numberValue.get());
@@ -4442,7 +4437,7 @@
     std::unique_ptr<CFXJSE_Value> identifierValue =
         GetSimpleValue(pThis, info, 1);
     if (identifierValue->IsNull()) {
-      pRetValue->SetNull();
+      info.GetReturnValue().SetNull();
       return;
     }
     iIdentifier =
@@ -4453,7 +4448,7 @@
   if (argc > 2) {
     std::unique_ptr<CFXJSE_Value> localeValue = GetSimpleValue(pThis, info, 2);
     if (localeValue->IsNull()) {
-      pRetValue->SetNull();
+      info.GetReturnValue().SetNull();
       return;
     }
     bsLocale = ValueToUTF8String(localeValue.get());
@@ -4461,19 +4456,19 @@
 
   if (std::isnan(fNumber) || fNumber < 0.0f ||
       fNumber > 922337203685477550.0f) {
-    pRetValue->SetString("*");
+    info.GetReturnValue().Set(CFX_V8::NewStringHelper(info.GetIsolate(), "*"));
     return;
   }
 
-  pRetValue->SetString(
-      WordUS(ByteString::Format("%.2f", fNumber), iIdentifier).AsStringView());
+  info.GetReturnValue().Set(CFX_V8::NewStringHelper(
+      info.GetIsolate(),
+      WordUS(ByteString::Format("%.2f", fNumber), iIdentifier).AsStringView()));
 }
 
 // static
 void CFXJSE_FormCalcContext::Get(
     CFXJSE_Value* pThis,
-    const v8::FunctionCallbackInfo<v8::Value>& info,
-    CFXJSE_Value* pRetValue) {
+    const v8::FunctionCallbackInfo<v8::Value>& info) {
   CFXJSE_FormCalcContext* pContext = ToFormCalcContext(pThis);
   if (info.Length() != 1) {
     pContext->ThrowParamCountMismatchException(L"Get");
@@ -4498,14 +4493,14 @@
   int32_t size = pFile->GetSize();
   std::vector<uint8_t> dataBuf(size);
   pFile->ReadBlock(dataBuf.data(), size);
-  pRetValue->SetString(ByteStringView(dataBuf));
+  info.GetReturnValue().Set(
+      CFX_V8::NewStringHelper(info.GetIsolate(), ByteStringView(dataBuf)));
 }
 
 // static
 void CFXJSE_FormCalcContext::Post(
     CFXJSE_Value* pThis,
-    const v8::FunctionCallbackInfo<v8::Value>& info,
-    CFXJSE_Value* pRetValue) {
+    const v8::FunctionCallbackInfo<v8::Value>& info) {
   CFXJSE_FormCalcContext* pContext = ToFormCalcContext(pThis);
   int32_t argc = info.Length();
   if (argc < 2 || argc > 5) {
@@ -4555,14 +4550,14 @@
     pContext->ThrowServerDeniedException();
     return;
   }
-  pRetValue->SetString(decodedResponse.ToUTF8().AsStringView());
+  info.GetReturnValue().Set(CFX_V8::NewStringHelper(
+      info.GetIsolate(), decodedResponse.ToUTF8().AsStringView()));
 }
 
 // static
 void CFXJSE_FormCalcContext::Put(
     CFXJSE_Value* pThis,
-    const v8::FunctionCallbackInfo<v8::Value>& info,
-    CFXJSE_Value* pRetValue) {
+    const v8::FunctionCallbackInfo<v8::Value>& info) {
   CFXJSE_FormCalcContext* pContext = ToFormCalcContext(pThis);
   int32_t argc = info.Length();
   if (argc < 2 || argc > 3) {
@@ -4589,7 +4584,6 @@
     std::unique_ptr<CFXJSE_Value> argThree = GetSimpleValue(pThis, info, 2);
     bsEncode = ValueToUTF8String(argThree.get());
   }
-
   if (!pAppProvider->PutRequestURL(
           WideString::FromUTF8(bsURL.AsStringView()),
           WideString::FromUTF8(bsData.AsStringView()),
@@ -4597,15 +4591,13 @@
     pContext->ThrowServerDeniedException();
     return;
   }
-
-  pRetValue->SetString("");
+  info.GetReturnValue().SetEmptyString();
 }
 
 // static
 void CFXJSE_FormCalcContext::assign_value_operator(
     CFXJSE_Value* pThis,
-    const v8::FunctionCallbackInfo<v8::Value>& info,
-    CFXJSE_Value* pRetValue) {
+    const v8::FunctionCallbackInfo<v8::Value>& info) {
   CFXJSE_FormCalcContext* pContext = ToFormCalcContext(pThis);
   if (info.Length() != 2) {
     pContext->ThrowCompilerErrorException();
@@ -4643,14 +4635,13 @@
       return;
     }
   }
-  pRetValue->Assign(rValue.get());
+  info.GetReturnValue().Set(rValue->DirectGetValue());
 }
 
 // static
 void CFXJSE_FormCalcContext::logical_or_operator(
     CFXJSE_Value* pThis,
-    const v8::FunctionCallbackInfo<v8::Value>& info,
-    CFXJSE_Value* pRetValue) {
+    const v8::FunctionCallbackInfo<v8::Value>& info) {
   if (info.Length() != 2) {
     ToFormCalcContext(pThis)->ThrowCompilerErrorException();
     return;
@@ -4659,20 +4650,19 @@
   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();
+    info.GetReturnValue().SetNull();
     return;
   }
 
   float first = ValueToFloat(pThis, argFirst.get());
   float second = ValueToFloat(pThis, infoecond.get());
-  pRetValue->SetInteger((first || second) ? 1 : 0);
+  info.GetReturnValue().Set(static_cast<int>(first || second));
 }
 
 // static
 void CFXJSE_FormCalcContext::logical_and_operator(
     CFXJSE_Value* pThis,
-    const v8::FunctionCallbackInfo<v8::Value>& info,
-    CFXJSE_Value* pRetValue) {
+    const v8::FunctionCallbackInfo<v8::Value>& info) {
   if (info.Length() != 2) {
     ToFormCalcContext(pThis)->ThrowCompilerErrorException();
     return;
@@ -4681,77 +4671,79 @@
   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();
+    info.GetReturnValue().SetNull();
     return;
   }
 
   float first = ValueToFloat(pThis, argFirst.get());
   float second = ValueToFloat(pThis, infoecond.get());
-  pRetValue->SetInteger((first && second) ? 1 : 0);
+  info.GetReturnValue().Set(static_cast<int>(first && second));
 }
 
 // static
 void CFXJSE_FormCalcContext::equality_operator(
     CFXJSE_Value* pThis,
-    const v8::FunctionCallbackInfo<v8::Value>& info,
-    CFXJSE_Value* pRetValue) {
+    const v8::FunctionCallbackInfo<v8::Value>& info) {
   if (info.Length() != 2) {
     ToFormCalcContext(pThis)->ThrowCompilerErrorException();
     return;
   }
 
   if (fm_ref_equal(pThis, info)) {
-    pRetValue->SetInteger(1);
+    info.GetReturnValue().Set(1);
     return;
   }
 
   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);
+    info.GetReturnValue().Set(
+        static_cast<int>(argFirst->IsNull() && infoecond->IsNull()));
     return;
   }
 
   if (argFirst->IsString() && infoecond->IsString()) {
-    pRetValue->SetInteger(argFirst->ToString() == infoecond->ToString());
+    info.GetReturnValue().Set(
+        static_cast<int>(argFirst->ToString() == infoecond->ToString()));
     return;
   }
 
   double first = ValueToDouble(pThis, argFirst.get());
   double second = ValueToDouble(pThis, infoecond.get());
-  pRetValue->SetInteger((first == second) ? 1 : 0);
+  info.GetReturnValue().Set(static_cast<int>(first == second));
 }
 
 // static
 void CFXJSE_FormCalcContext::notequality_operator(
     CFXJSE_Value* pThis,
-    const v8::FunctionCallbackInfo<v8::Value>& info,
-    CFXJSE_Value* pRetValue) {
+    const v8::FunctionCallbackInfo<v8::Value>& info) {
   if (info.Length() != 2) {
     ToFormCalcContext(pThis)->ThrowCompilerErrorException();
     return;
   }
 
   if (fm_ref_equal(pThis, info)) {
-    pRetValue->SetInteger(0);
+    info.GetReturnValue().Set(0);
     return;
   }
 
   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);
+    info.GetReturnValue().Set(
+        static_cast<int>(!argFirst->IsNull() || !infoecond->IsNull()));
     return;
   }
 
   if (argFirst->IsString() && infoecond->IsString()) {
-    pRetValue->SetInteger(argFirst->ToString() != infoecond->ToString());
+    info.GetReturnValue().Set(
+        static_cast<int>(argFirst->ToString() != infoecond->ToString()));
     return;
   }
 
   double first = ValueToDouble(pThis, argFirst.get());
   double second = ValueToDouble(pThis, infoecond.get());
-  pRetValue->SetInteger(first != second);
+  info.GetReturnValue().Set(static_cast<int>(first != second));
 }
 
 // static
@@ -4784,8 +4776,7 @@
 // static
 void CFXJSE_FormCalcContext::less_operator(
     CFXJSE_Value* pThis,
-    const v8::FunctionCallbackInfo<v8::Value>& info,
-    CFXJSE_Value* pRetValue) {
+    const v8::FunctionCallbackInfo<v8::Value>& info) {
   if (info.Length() != 2) {
     ToFormCalcContext(pThis)->ThrowCompilerErrorException();
     return;
@@ -4794,27 +4785,26 @@
   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()) {
-    pRetValue->SetInteger(0);
+    info.GetReturnValue().Set(0);
     return;
   }
 
   if (argFirst->IsString() && argSecond->IsString()) {
     int result =
         argFirst->ToString().Compare(argSecond->ToString().AsStringView()) < 0;
-    pRetValue->SetInteger(result);
+    info.GetReturnValue().Set(result);
     return;
   }
 
   double first = ValueToDouble(pThis, argFirst.get());
   double second = ValueToDouble(pThis, argSecond.get());
-  pRetValue->SetInteger((first < second) ? 1 : 0);
+  info.GetReturnValue().Set(static_cast<int>(first < second));
 }
 
 // static
 void CFXJSE_FormCalcContext::lessequal_operator(
     CFXJSE_Value* pThis,
-    const v8::FunctionCallbackInfo<v8::Value>& info,
-    CFXJSE_Value* pRetValue) {
+    const v8::FunctionCallbackInfo<v8::Value>& info) {
   if (info.Length() != 2) {
     ToFormCalcContext(pThis)->ThrowCompilerErrorException();
     return;
@@ -4823,27 +4813,27 @@
   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()) {
-    pRetValue->SetInteger((argFirst->IsNull() && argSecond->IsNull()) ? 1 : 0);
+    info.GetReturnValue().Set(
+        static_cast<int>(argFirst->IsNull() && argSecond->IsNull()));
     return;
   }
 
   if (argFirst->IsString() && argSecond->IsString()) {
     int result =
         argFirst->ToString().Compare(argSecond->ToString().AsStringView()) <= 0;
-    pRetValue->SetInteger(result);
+    info.GetReturnValue().Set(result);
     return;
   }
 
   double first = ValueToDouble(pThis, argFirst.get());
   double second = ValueToDouble(pThis, argSecond.get());
-  pRetValue->SetInteger((first <= second) ? 1 : 0);
+  info.GetReturnValue().Set(static_cast<int>(first <= second));
 }
 
 // static
 void CFXJSE_FormCalcContext::greater_operator(
     CFXJSE_Value* pThis,
-    const v8::FunctionCallbackInfo<v8::Value>& info,
-    CFXJSE_Value* pRetValue) {
+    const v8::FunctionCallbackInfo<v8::Value>& info) {
   if (info.Length() != 2) {
     ToFormCalcContext(pThis)->ThrowCompilerErrorException();
     return;
@@ -4852,27 +4842,26 @@
   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()) {
-    pRetValue->SetInteger(0);
+    info.GetReturnValue().Set(0);
     return;
   }
 
   if (argFirst->IsString() && argSecond->IsString()) {
     int result =
         argFirst->ToString().Compare(argSecond->ToString().AsStringView()) > 0;
-    pRetValue->SetInteger(result);
+    info.GetReturnValue().Set(result);
     return;
   }
 
   double first = ValueToDouble(pThis, argFirst.get());
   double second = ValueToDouble(pThis, argSecond.get());
-  pRetValue->SetInteger((first > second) ? 1 : 0);
+  info.GetReturnValue().Set(static_cast<int>(first > second));
 }
 
 // static
 void CFXJSE_FormCalcContext::greaterequal_operator(
     CFXJSE_Value* pThis,
-    const v8::FunctionCallbackInfo<v8::Value>& info,
-    CFXJSE_Value* pRetValue) {
+    const v8::FunctionCallbackInfo<v8::Value>& info) {
   if (info.Length() != 2) {
     ToFormCalcContext(pThis)->ThrowCompilerErrorException();
     return;
@@ -4881,27 +4870,27 @@
   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()) {
-    pRetValue->SetInteger((argFirst->IsNull() && argSecond->IsNull()) ? 1 : 0);
+    info.GetReturnValue().Set(
+        static_cast<int>(argFirst->IsNull() && argSecond->IsNull()));
     return;
   }
 
   if (argFirst->IsString() && argSecond->IsString()) {
     int result =
         argFirst->ToString().Compare(argSecond->ToString().AsStringView()) >= 0;
-    pRetValue->SetInteger(result);
+    info.GetReturnValue().Set(result);
     return;
   }
 
   double first = ValueToDouble(pThis, argFirst.get());
   double second = ValueToDouble(pThis, argSecond.get());
-  pRetValue->SetInteger((first >= second) ? 1 : 0);
+  info.GetReturnValue().Set(static_cast<int>(first >= second));
 }
 
 // static
 void CFXJSE_FormCalcContext::plus_operator(
     CFXJSE_Value* pThis,
-    const v8::FunctionCallbackInfo<v8::Value>& info,
-    CFXJSE_Value* pRetValue) {
+    const v8::FunctionCallbackInfo<v8::Value>& info) {
   if (info.Length() != 2) {
     ToFormCalcContext(pThis)->ThrowCompilerErrorException();
     return;
@@ -4911,20 +4900,19 @@
   auto argSecond = pdfium::MakeUnique<CFXJSE_Value>(info.GetIsolate(), info[1]);
   if (ValueIsNull(pThis, argFirst.get()) &&
       ValueIsNull(pThis, argSecond.get())) {
-    pRetValue->SetNull();
+    info.GetReturnValue().SetNull();
     return;
   }
 
   double first = ValueToDouble(pThis, argFirst.get());
   double second = ValueToDouble(pThis, argSecond.get());
-  pRetValue->SetDouble(first + second);
+  info.GetReturnValue().Set(first + second);
 }
 
 // static
 void CFXJSE_FormCalcContext::minus_operator(
     CFXJSE_Value* pThis,
-    const v8::FunctionCallbackInfo<v8::Value>& info,
-    CFXJSE_Value* pRetValue) {
+    const v8::FunctionCallbackInfo<v8::Value>& info) {
   if (info.Length() != 2) {
     ToFormCalcContext(pThis)->ThrowCompilerErrorException();
     return;
@@ -4933,20 +4921,19 @@
   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()) {
-    pRetValue->SetNull();
+    info.GetReturnValue().SetNull();
     return;
   }
 
   double first = ValueToDouble(pThis, argFirst.get());
   double second = ValueToDouble(pThis, argSecond.get());
-  pRetValue->SetDouble(first - second);
+  info.GetReturnValue().Set(first - second);
 }
 
 // static
 void CFXJSE_FormCalcContext::multiple_operator(
     CFXJSE_Value* pThis,
-    const v8::FunctionCallbackInfo<v8::Value>& info,
-    CFXJSE_Value* pRetValue) {
+    const v8::FunctionCallbackInfo<v8::Value>& info) {
   if (info.Length() != 2) {
     ToFormCalcContext(pThis)->ThrowCompilerErrorException();
     return;
@@ -4955,20 +4942,19 @@
   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()) {
-    pRetValue->SetNull();
+    info.GetReturnValue().SetNull();
     return;
   }
 
   double first = ValueToDouble(pThis, argFirst.get());
   double second = ValueToDouble(pThis, argSecond.get());
-  pRetValue->SetDouble(first * second);
+  info.GetReturnValue().Set(first * second);
 }
 
 // static
 void CFXJSE_FormCalcContext::divide_operator(
     CFXJSE_Value* pThis,
-    const v8::FunctionCallbackInfo<v8::Value>& info,
-    CFXJSE_Value* pRetValue) {
+    const v8::FunctionCallbackInfo<v8::Value>& info) {
   CFXJSE_FormCalcContext* pContext = ToFormCalcContext(pThis);
   if (info.Length() != 2) {
     pContext->ThrowCompilerErrorException();
@@ -4978,7 +4964,7 @@
   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()) {
-    pRetValue->SetNull();
+    info.GetReturnValue().SetNull();
     return;
   }
 
@@ -4989,14 +4975,13 @@
   }
 
   double first = ValueToDouble(pThis, argFirst.get());
-  pRetValue->SetDouble(first / second);
+  info.GetReturnValue().Set(first / second);
 }
 
 // static
 void CFXJSE_FormCalcContext::positive_operator(
     CFXJSE_Value* pThis,
-    const v8::FunctionCallbackInfo<v8::Value>& info,
-    CFXJSE_Value* pRetValue) {
+    const v8::FunctionCallbackInfo<v8::Value>& info) {
   if (info.Length() != 1) {
     ToFormCalcContext(pThis)->ThrowCompilerErrorException();
     return;
@@ -5004,17 +4989,16 @@
 
   std::unique_ptr<CFXJSE_Value> argOne = GetSimpleValue(pThis, info, 0);
   if (argOne->IsNull()) {
-    pRetValue->SetNull();
+    info.GetReturnValue().SetNull();
     return;
   }
-  pRetValue->SetDouble(0.0 + ValueToDouble(pThis, argOne.get()));
+  info.GetReturnValue().Set(0.0 + ValueToDouble(pThis, argOne.get()));
 }
 
 // static
 void CFXJSE_FormCalcContext::negative_operator(
     CFXJSE_Value* pThis,
-    const v8::FunctionCallbackInfo<v8::Value>& info,
-    CFXJSE_Value* pRetValue) {
+    const v8::FunctionCallbackInfo<v8::Value>& info) {
   if (info.Length() != 1) {
     ToFormCalcContext(pThis)->ThrowCompilerErrorException();
     return;
@@ -5022,17 +5006,16 @@
 
   std::unique_ptr<CFXJSE_Value> argOne = GetSimpleValue(pThis, info, 0);
   if (argOne->IsNull()) {
-    pRetValue->SetNull();
+    info.GetReturnValue().SetNull();
     return;
   }
-  pRetValue->SetDouble(0.0 - ValueToDouble(pThis, argOne.get()));
+  info.GetReturnValue().Set(0.0 - ValueToDouble(pThis, argOne.get()));
 }
 
 // static
 void CFXJSE_FormCalcContext::logical_not_operator(
     CFXJSE_Value* pThis,
-    const v8::FunctionCallbackInfo<v8::Value>& info,
-    CFXJSE_Value* pRetValue) {
+    const v8::FunctionCallbackInfo<v8::Value>& info) {
   if (info.Length() != 1) {
     ToFormCalcContext(pThis)->ThrowCompilerErrorException();
     return;
@@ -5040,35 +5023,32 @@
 
   std::unique_ptr<CFXJSE_Value> argOne = GetSimpleValue(pThis, info, 0);
   if (argOne->IsNull()) {
-    pRetValue->SetNull();
+    info.GetReturnValue().SetNull();
     return;
   }
 
   double first = ValueToDouble(pThis, argOne.get());
-  pRetValue->SetInteger((first == 0.0) ? 1 : 0);
+  info.GetReturnValue().Set((first == 0.0) ? 1 : 0);
 }
 
 // static
 void CFXJSE_FormCalcContext::dot_accessor(
     CFXJSE_Value* pThis,
-    const v8::FunctionCallbackInfo<v8::Value>& info,
-    CFXJSE_Value* pRetValue) {
-  DotAccessorCommon(pThis, info, pRetValue, /*bDotAccessor=*/true);
+    const v8::FunctionCallbackInfo<v8::Value>& info) {
+  DotAccessorCommon(pThis, info, /*bDotAccessor=*/true);
 }
 
 // static
 void CFXJSE_FormCalcContext::dotdot_accessor(
     CFXJSE_Value* pThis,
-    const v8::FunctionCallbackInfo<v8::Value>& info,
-    CFXJSE_Value* pRetValue) {
-  DotAccessorCommon(pThis, info, pRetValue, /*bDotAccessor=*/false);
+    const v8::FunctionCallbackInfo<v8::Value>& info) {
+  DotAccessorCommon(pThis, info, /*bDotAccessor=*/false);
 }
 
 // static
 void CFXJSE_FormCalcContext::eval_translation(
     CFXJSE_Value* pThis,
-    const v8::FunctionCallbackInfo<v8::Value>& info,
-    CFXJSE_Value* pRetValue) {
+    const v8::FunctionCallbackInfo<v8::Value>& info) {
   CFXJSE_FormCalcContext* pContext = ToFormCalcContext(pThis);
   if (info.Length() != 1) {
     pContext->ThrowParamCountMismatchException(L"Eval");
@@ -5089,44 +5069,41 @@
     pContext->ThrowCompilerErrorException();
     return;
   }
-
-  pRetValue->SetString(
-      FX_UTF8Encode(wsJavaScriptBuf.AsStringView()).AsStringView());
+  info.GetReturnValue().Set(CFX_V8::NewStringHelper(
+      info.GetIsolate(),
+      FX_UTF8Encode(wsJavaScriptBuf.AsStringView()).AsStringView()));
 }
 
 // static
 void CFXJSE_FormCalcContext::is_fm_object(
     CFXJSE_Value* pThis,
-    const v8::FunctionCallbackInfo<v8::Value>& info,
-    CFXJSE_Value* pRetValue) {
+    const v8::FunctionCallbackInfo<v8::Value>& info) {
   if (info.Length() != 1) {
-    pRetValue->SetBoolean(false);
+    info.GetReturnValue().Set(false);
     return;
   }
 
   auto argOne = pdfium::MakeUnique<CFXJSE_Value>(info.GetIsolate(), info[0]);
-  pRetValue->SetBoolean(argOne->IsObject());
+  info.GetReturnValue().Set(argOne->IsObject());
 }
 
 // static
 void CFXJSE_FormCalcContext::is_fm_array(
     CFXJSE_Value* pThis,
-    const v8::FunctionCallbackInfo<v8::Value>& info,
-    CFXJSE_Value* pRetValue) {
+    const v8::FunctionCallbackInfo<v8::Value>& info) {
   if (info.Length() != 1) {
-    pRetValue->SetBoolean(false);
+    info.GetReturnValue().Set(false);
     return;
   }
 
   auto argOne = pdfium::MakeUnique<CFXJSE_Value>(info.GetIsolate(), info[0]);
-  pRetValue->SetBoolean(argOne->IsArray());
+  info.GetReturnValue().Set(argOne->IsArray());
 }
 
 // static
 void CFXJSE_FormCalcContext::get_fm_value(
     CFXJSE_Value* pThis,
-    const v8::FunctionCallbackInfo<v8::Value>& info,
-    CFXJSE_Value* pRetValue) {
+    const v8::FunctionCallbackInfo<v8::Value>& info) {
   CFXJSE_FormCalcContext* pContext = ToFormCalcContext(pThis);
   if (info.Length() != 1) {
     pContext->ThrowCompilerErrorException();
@@ -5141,28 +5118,33 @@
     argOne->GetObjectPropertyByIdx(1, propertyValue.get());
     argOne->GetObjectPropertyByIdx(2, jsObjectValue.get());
     if (propertyValue->IsNull()) {
-      GetObjectDefaultValue(jsObjectValue.get(), pRetValue);
+      auto pReturn = pdfium::MakeUnique<CFXJSE_Value>(info.GetIsolate());
+      GetObjectDefaultValue(jsObjectValue.get(), pReturn.get());
+      info.GetReturnValue().Set(pReturn->DirectGetValue());
       return;
     }
 
+    auto pReturn = pdfium::MakeUnique<CFXJSE_Value>(info.GetIsolate());
     jsObjectValue->GetObjectProperty(propertyValue->ToString().AsStringView(),
-                                     pRetValue);
+                                     pReturn.get());
+    info.GetReturnValue().Set(pReturn->DirectGetValue());
     return;
   }
 
   if (argOne->IsObject()) {
-    GetObjectDefaultValue(argOne.get(), pRetValue);
+    auto pReturn = pdfium::MakeUnique<CFXJSE_Value>(info.GetIsolate());
+    GetObjectDefaultValue(argOne.get(), pReturn.get());
+    info.GetReturnValue().Set(pReturn->DirectGetValue());
     return;
   }
 
-  pRetValue->Assign(argOne.get());
+  info.GetReturnValue().Set(argOne->DirectGetValue());
 }
 
 // static
 void CFXJSE_FormCalcContext::get_fm_jsobj(
     CFXJSE_Value* pThis,
-    const v8::FunctionCallbackInfo<v8::Value>& info,
-    CFXJSE_Value* pRetValue) {
+    const v8::FunctionCallbackInfo<v8::Value>& info) {
   if (info.Length() != 1) {
     ToFormCalcContext(pThis)->ThrowCompilerErrorException();
     return;
@@ -5170,7 +5152,7 @@
 
   auto argOne = pdfium::MakeUnique<CFXJSE_Value>(info.GetIsolate(), info[0]);
   if (!argOne->IsArray()) {
-    pRetValue->Assign(argOne.get());
+    info.GetReturnValue().Set(argOne->DirectGetValue());
     return;
   }
 
@@ -5182,14 +5164,15 @@
   ASSERT(lengthValue->ToInteger() >= 3);
 #endif
 
-  argOne->GetObjectPropertyByIdx(2, pRetValue);
+  auto pReturn = pdfium::MakeUnique<CFXJSE_Value>(info.GetIsolate());
+  argOne->GetObjectPropertyByIdx(2, pReturn.get());
+  info.GetReturnValue().Set(pReturn->DirectGetValue());
 }
 
 // static
 void CFXJSE_FormCalcContext::fm_var_filter(
     CFXJSE_Value* pThis,
-    const v8::FunctionCallbackInfo<v8::Value>& info,
-    CFXJSE_Value* pRetValue) {
+    const v8::FunctionCallbackInfo<v8::Value>& info) {
   CFXJSE_FormCalcContext* pContext = ToFormCalcContext(pThis);
   if (info.Length() != 1) {
     pContext->ThrowCompilerErrorException();
@@ -5200,7 +5183,7 @@
   auto argOne = pdfium::MakeUnique<CFXJSE_Value>(info.GetIsolate(), info[0]);
   if (!argOne->IsArray()) {
     std::unique_ptr<CFXJSE_Value> simpleValue = GetSimpleValue(pThis, info, 0);
-    pRetValue->Assign(simpleValue.get());
+    info.GetReturnValue().Set(simpleValue->DirectGetValue());
     return;
   }
 
@@ -5215,7 +5198,7 @@
   int32_t iFlags = flagsValue->ToInteger();
   if (iFlags != 3 && iFlags != 4) {
     std::unique_ptr<CFXJSE_Value> simpleValue = GetSimpleValue(pThis, info, 0);
-    pRetValue->Assign(simpleValue.get());
+    info.GetReturnValue().Set(simpleValue->DirectGetValue());
     return;
   }
 
@@ -5227,7 +5210,9 @@
     values[0]->SetInteger(3);
     values[1]->SetNull();
     values[2]->SetNull();
-    pRetValue->SetArray(values);
+    auto pResult = pdfium::MakeUnique<CFXJSE_Value>(info.GetIsolate());
+    pResult->SetArray(values);
+    info.GetReturnValue().Set(pResult->DirectGetValue());
     return;
   }
 
@@ -5237,14 +5222,13 @@
     pContext->ThrowCompilerErrorException();
     return;
   }
-  pRetValue->Assign(argOne.get());
+  info.GetReturnValue().Set(argOne->DirectGetValue());
 }
 
 // static
 void CFXJSE_FormCalcContext::concat_fm_object(
     CFXJSE_Value* pThis,
-    const v8::FunctionCallbackInfo<v8::Value>& info,
-    CFXJSE_Value* pRetValue) {
+    const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Isolate* pIsolate = ToFormCalcContext(pThis)->GetScriptRuntime();
   std::vector<std::unique_ptr<CFXJSE_Value>> returnValues;
   for (int32_t i = 0; i < info.Length(); ++i) {
@@ -5261,7 +5245,9 @@
     returnValues.push_back(pdfium::MakeUnique<CFXJSE_Value>(pIsolate));
     returnValues.back()->Assign(argValue.get());
   }
-  pRetValue->SetArray(returnValues);
+  auto pReturn = pdfium::MakeUnique<CFXJSE_Value>(info.GetIsolate());
+  pReturn->SetArray(returnValues);
+  info.GetReturnValue().Set(pReturn->DirectGetValue());
 }
 
 // static
@@ -5758,7 +5744,6 @@
 void CFXJSE_FormCalcContext::DotAccessorCommon(
     CFXJSE_Value* pThis,
     const v8::FunctionCallbackInfo<v8::Value>& info,
-    CFXJSE_Value* pRetValue,
     bool bDotAccessor) {
   CFXJSE_FormCalcContext* pContext = ToFormCalcContext(pThis);
   v8::Isolate* pIsolate = pContext->GetScriptRuntime();
@@ -5832,7 +5817,9 @@
         values.back()->Assign(resolveValues[i][j].get());
       }
     }
-    pRetValue->SetArray(values);
+    auto pReturn = pdfium::MakeUnique<CFXJSE_Value>(info.GetIsolate());
+    pReturn->SetArray(values);
+    info.GetReturnValue().Set(pReturn->DirectGetValue());
     return;
   }
 
@@ -5875,7 +5862,9 @@
   for (size_t i = 0; i < resolveValues.size(); i++)
     values[i + 2]->Assign(resolveValues[i].get());
 
-  pRetValue->SetArray(values);
+  auto pReturn = pdfium::MakeUnique<CFXJSE_Value>(info.GetIsolate());
+  pReturn->SetArray(values);
+  info.GetReturnValue().Set(pReturn->DirectGetValue());
 }
 
 void CFXJSE_FormCalcContext::ThrowNoDefaultPropertyException(
diff --git a/fxjs/xfa/cfxjse_formcalc_context.h b/fxjs/xfa/cfxjse_formcalc_context.h
index d88b6e5..f06e1a7 100644
--- a/fxjs/xfa/cfxjse_formcalc_context.h
+++ b/fxjs/xfa/cfxjse_formcalc_context.h
@@ -29,74 +29,51 @@
   CFXJSE_FormCalcContext* AsFormCalcContext() override;
 
   static void Abs(CFXJSE_Value* pThis,
-                  const v8::FunctionCallbackInfo<v8::Value>& info,
-                  CFXJSE_Value* pRetValue);
+                  const v8::FunctionCallbackInfo<v8::Value>& info);
   static void Avg(CFXJSE_Value* pThis,
-                  const v8::FunctionCallbackInfo<v8::Value>& info,
-                  CFXJSE_Value* pRetValue);
+                  const v8::FunctionCallbackInfo<v8::Value>& info);
   static void Ceil(CFXJSE_Value* pThis,
-                   const v8::FunctionCallbackInfo<v8::Value>& info,
-                   CFXJSE_Value* pRetValue);
+                   const v8::FunctionCallbackInfo<v8::Value>& info);
   static void Count(CFXJSE_Value* pThis,
-                    const v8::FunctionCallbackInfo<v8::Value>& info,
-                    CFXJSE_Value* pRetValue);
+                    const v8::FunctionCallbackInfo<v8::Value>& info);
   static void Floor(CFXJSE_Value* pThis,
-                    const v8::FunctionCallbackInfo<v8::Value>& info,
-                    CFXJSE_Value* pRetValue);
+                    const v8::FunctionCallbackInfo<v8::Value>& info);
   static void Max(CFXJSE_Value* pThis,
-                  const v8::FunctionCallbackInfo<v8::Value>& info,
-                  CFXJSE_Value* pRetValue);
+                  const v8::FunctionCallbackInfo<v8::Value>& info);
   static void Min(CFXJSE_Value* pThis,
-                  const v8::FunctionCallbackInfo<v8::Value>& info,
-                  CFXJSE_Value* pRetValue);
+                  const v8::FunctionCallbackInfo<v8::Value>& info);
   static void Mod(CFXJSE_Value* pThis,
-                  const v8::FunctionCallbackInfo<v8::Value>& info,
-                  CFXJSE_Value* pRetValue);
+                  const v8::FunctionCallbackInfo<v8::Value>& info);
   static void Round(CFXJSE_Value* pThis,
-                    const v8::FunctionCallbackInfo<v8::Value>& info,
-                    CFXJSE_Value* pRetValue);
+                    const v8::FunctionCallbackInfo<v8::Value>& info);
   static void Sum(CFXJSE_Value* pThis,
-                  const v8::FunctionCallbackInfo<v8::Value>& info,
-                  CFXJSE_Value* pRetValue);
+                  const v8::FunctionCallbackInfo<v8::Value>& info);
   static void Date(CFXJSE_Value* pThis,
-                   const v8::FunctionCallbackInfo<v8::Value>& info,
-                   CFXJSE_Value* pRetValue);
+                   const v8::FunctionCallbackInfo<v8::Value>& info);
   static void Date2Num(CFXJSE_Value* pThis,
-                       const v8::FunctionCallbackInfo<v8::Value>& info,
-                       CFXJSE_Value* pRetValue);
+                       const v8::FunctionCallbackInfo<v8::Value>& info);
   static void DateFmt(CFXJSE_Value* pThis,
-                      const v8::FunctionCallbackInfo<v8::Value>& info,
-                      CFXJSE_Value* pRetValue);
+                      const v8::FunctionCallbackInfo<v8::Value>& info);
   static void IsoDate2Num(CFXJSE_Value* pThis,
-                          const v8::FunctionCallbackInfo<v8::Value>& info,
-                          CFXJSE_Value* pRetValue);
+                          const v8::FunctionCallbackInfo<v8::Value>& info);
   static void IsoTime2Num(CFXJSE_Value* pThis,
-                          const v8::FunctionCallbackInfo<v8::Value>& info,
-                          CFXJSE_Value* pRetValue);
+                          const v8::FunctionCallbackInfo<v8::Value>& info);
   static void LocalDateFmt(CFXJSE_Value* pThis,
-                           const v8::FunctionCallbackInfo<v8::Value>& info,
-                           CFXJSE_Value* pRetValue);
+                           const v8::FunctionCallbackInfo<v8::Value>& info);
   static void LocalTimeFmt(CFXJSE_Value* pThis,
-                           const v8::FunctionCallbackInfo<v8::Value>& info,
-                           CFXJSE_Value* pRetValue);
+                           const v8::FunctionCallbackInfo<v8::Value>& info);
   static void Num2Date(CFXJSE_Value* pThis,
-                       const v8::FunctionCallbackInfo<v8::Value>& info,
-                       CFXJSE_Value* pRetValue);
+                       const v8::FunctionCallbackInfo<v8::Value>& info);
   static void Num2GMTime(CFXJSE_Value* pThis,
-                         const v8::FunctionCallbackInfo<v8::Value>& info,
-                         CFXJSE_Value* pRetValue);
+                         const v8::FunctionCallbackInfo<v8::Value>& info);
   static void Num2Time(CFXJSE_Value* pThis,
-                       const v8::FunctionCallbackInfo<v8::Value>& info,
-                       CFXJSE_Value* pRetValue);
+                       const v8::FunctionCallbackInfo<v8::Value>& info);
   static void Time(CFXJSE_Value* pThis,
-                   const v8::FunctionCallbackInfo<v8::Value>& info,
-                   CFXJSE_Value* pRetValue);
+                   const v8::FunctionCallbackInfo<v8::Value>& info);
   static void Time2Num(CFXJSE_Value* pThis,
-                       const v8::FunctionCallbackInfo<v8::Value>& info,
-                       CFXJSE_Value* pRetValue);
+                       const v8::FunctionCallbackInfo<v8::Value>& info);
   static void TimeFmt(CFXJSE_Value* pThis,
-                      const v8::FunctionCallbackInfo<v8::Value>& info,
-                      CFXJSE_Value* pRetValue);
+                      const v8::FunctionCallbackInfo<v8::Value>& info);
 
   static ByteString Local2IsoDate(CFXJSE_Value* pThis,
                                   ByteStringView bsDate,
@@ -131,220 +108,156 @@
                                 bool bGM);
 
   static void Apr(CFXJSE_Value* pThis,
-                  const v8::FunctionCallbackInfo<v8::Value>& info,
-                  CFXJSE_Value* pRetValue);
+                  const v8::FunctionCallbackInfo<v8::Value>& info);
   static void CTerm(CFXJSE_Value* pThis,
-                    const v8::FunctionCallbackInfo<v8::Value>& info,
-                    CFXJSE_Value* pRetValue);
+                    const v8::FunctionCallbackInfo<v8::Value>& info);
   static void FV(CFXJSE_Value* pThis,
-                 const v8::FunctionCallbackInfo<v8::Value>& info,
-                 CFXJSE_Value* pRetValue);
+                 const v8::FunctionCallbackInfo<v8::Value>& info);
   static void IPmt(CFXJSE_Value* pThis,
-                   const v8::FunctionCallbackInfo<v8::Value>& info,
-                   CFXJSE_Value* pRetValue);
+                   const v8::FunctionCallbackInfo<v8::Value>& info);
   static void NPV(CFXJSE_Value* pThis,
-                  const v8::FunctionCallbackInfo<v8::Value>& info,
-                  CFXJSE_Value* pRetValue);
+                  const v8::FunctionCallbackInfo<v8::Value>& info);
   static void Pmt(CFXJSE_Value* pThis,
-                  const v8::FunctionCallbackInfo<v8::Value>& info,
-                  CFXJSE_Value* pRetValue);
+                  const v8::FunctionCallbackInfo<v8::Value>& info);
   static void PPmt(CFXJSE_Value* pThis,
-                   const v8::FunctionCallbackInfo<v8::Value>& info,
-                   CFXJSE_Value* pRetValue);
+                   const v8::FunctionCallbackInfo<v8::Value>& info);
   static void PV(CFXJSE_Value* pThis,
-                 const v8::FunctionCallbackInfo<v8::Value>& info,
-                 CFXJSE_Value* pRetValue);
+                 const v8::FunctionCallbackInfo<v8::Value>& info);
   static void Rate(CFXJSE_Value* pThis,
-                   const v8::FunctionCallbackInfo<v8::Value>& info,
-                   CFXJSE_Value* pRetValue);
+                   const v8::FunctionCallbackInfo<v8::Value>& info);
   static void Term(CFXJSE_Value* pThis,
-                   const v8::FunctionCallbackInfo<v8::Value>& info,
-                   CFXJSE_Value* pRetValue);
+                   const v8::FunctionCallbackInfo<v8::Value>& info);
   static void Choose(CFXJSE_Value* pThis,
-                     const v8::FunctionCallbackInfo<v8::Value>& info,
-                     CFXJSE_Value* pRetValue);
+                     const v8::FunctionCallbackInfo<v8::Value>& info);
   static void Exists(CFXJSE_Value* pThis,
-                     const v8::FunctionCallbackInfo<v8::Value>& info,
-                     CFXJSE_Value* pRetValue);
+                     const v8::FunctionCallbackInfo<v8::Value>& info);
   static void HasValue(CFXJSE_Value* pThis,
-                       const v8::FunctionCallbackInfo<v8::Value>& info,
-                       CFXJSE_Value* pRetValue);
+                       const v8::FunctionCallbackInfo<v8::Value>& info);
   static void Oneof(CFXJSE_Value* pThis,
-                    const v8::FunctionCallbackInfo<v8::Value>& info,
-                    CFXJSE_Value* pRetValue);
+                    const v8::FunctionCallbackInfo<v8::Value>& info);
   static void Within(CFXJSE_Value* pThis,
-                     const v8::FunctionCallbackInfo<v8::Value>& info,
-                     CFXJSE_Value* pRetValue);
+                     const v8::FunctionCallbackInfo<v8::Value>& info);
   static void If(CFXJSE_Value* pThis,
-                 const v8::FunctionCallbackInfo<v8::Value>& info,
-                 CFXJSE_Value* pRetValue);
+                 const v8::FunctionCallbackInfo<v8::Value>& info);
   static void Eval(CFXJSE_Value* pThis,
-                   const v8::FunctionCallbackInfo<v8::Value>& info,
-                   CFXJSE_Value* pRetValue);
+                   const v8::FunctionCallbackInfo<v8::Value>& info);
   static void Ref(CFXJSE_Value* pThis,
-                  const v8::FunctionCallbackInfo<v8::Value>& info,
-                  CFXJSE_Value* pRetValue);
+                  const v8::FunctionCallbackInfo<v8::Value>& info);
   static void UnitType(CFXJSE_Value* pThis,
-                       const v8::FunctionCallbackInfo<v8::Value>& info,
-                       CFXJSE_Value* pRetValue);
+                       const v8::FunctionCallbackInfo<v8::Value>& info);
   static void UnitValue(CFXJSE_Value* pThis,
-                        const v8::FunctionCallbackInfo<v8::Value>& info,
-                        CFXJSE_Value* pRetValue);
+                        const v8::FunctionCallbackInfo<v8::Value>& info);
 
   static void At(CFXJSE_Value* pThis,
-                 const v8::FunctionCallbackInfo<v8::Value>& info,
-                 CFXJSE_Value* pRetValue);
+                 const v8::FunctionCallbackInfo<v8::Value>& info);
   static void Concat(CFXJSE_Value* pThis,
-                     const v8::FunctionCallbackInfo<v8::Value>& info,
-                     CFXJSE_Value* pRetValue);
+                     const v8::FunctionCallbackInfo<v8::Value>& info);
   static void Decode(CFXJSE_Value* pThis,
-                     const v8::FunctionCallbackInfo<v8::Value>& info,
-                     CFXJSE_Value* pRetValue);
+                     const v8::FunctionCallbackInfo<v8::Value>& info);
   static void Encode(CFXJSE_Value* pThis,
-                     const v8::FunctionCallbackInfo<v8::Value>& info,
-                     CFXJSE_Value* pRetValue);
+                     const v8::FunctionCallbackInfo<v8::Value>& info);
   static void Format(CFXJSE_Value* pThis,
-                     const v8::FunctionCallbackInfo<v8::Value>& info,
-                     CFXJSE_Value* pRetValue);
+                     const v8::FunctionCallbackInfo<v8::Value>& info);
   static void Left(CFXJSE_Value* pThis,
-                   const v8::FunctionCallbackInfo<v8::Value>& info,
-                   CFXJSE_Value* pRetValue);
+                   const v8::FunctionCallbackInfo<v8::Value>& info);
   static void Len(CFXJSE_Value* pThis,
-                  const v8::FunctionCallbackInfo<v8::Value>& info,
-                  CFXJSE_Value* pRetValue);
+                  const v8::FunctionCallbackInfo<v8::Value>& info);
   static void Lower(CFXJSE_Value* pThis,
-                    const v8::FunctionCallbackInfo<v8::Value>& info,
-                    CFXJSE_Value* pRetValue);
+                    const v8::FunctionCallbackInfo<v8::Value>& info);
   static void Ltrim(CFXJSE_Value* pThis,
-                    const v8::FunctionCallbackInfo<v8::Value>& info,
-                    CFXJSE_Value* pRetValue);
+                    const v8::FunctionCallbackInfo<v8::Value>& info);
   static void Parse(CFXJSE_Value* pThis,
-                    const v8::FunctionCallbackInfo<v8::Value>& info,
-                    CFXJSE_Value* pRetValue);
+                    const v8::FunctionCallbackInfo<v8::Value>& info);
   static void Replace(CFXJSE_Value* pThis,
-                      const v8::FunctionCallbackInfo<v8::Value>& info,
-                      CFXJSE_Value* pRetValue);
+                      const v8::FunctionCallbackInfo<v8::Value>& info);
   static void Right(CFXJSE_Value* pThis,
-                    const v8::FunctionCallbackInfo<v8::Value>& info,
-                    CFXJSE_Value* pRetValue);
+                    const v8::FunctionCallbackInfo<v8::Value>& info);
   static void Rtrim(CFXJSE_Value* pThis,
-                    const v8::FunctionCallbackInfo<v8::Value>& info,
-                    CFXJSE_Value* pRetValue);
+                    const v8::FunctionCallbackInfo<v8::Value>& info);
   static void Space(CFXJSE_Value* pThis,
-                    const v8::FunctionCallbackInfo<v8::Value>& info,
-                    CFXJSE_Value* pRetValue);
+                    const v8::FunctionCallbackInfo<v8::Value>& info);
   static void Str(CFXJSE_Value* pThis,
-                  const v8::FunctionCallbackInfo<v8::Value>& info,
-                  CFXJSE_Value* pRetValue);
+                  const v8::FunctionCallbackInfo<v8::Value>& info);
   static void Stuff(CFXJSE_Value* pThis,
-                    const v8::FunctionCallbackInfo<v8::Value>& info,
-                    CFXJSE_Value* pRetValue);
+                    const v8::FunctionCallbackInfo<v8::Value>& info);
   static void Substr(CFXJSE_Value* pThis,
-                     const v8::FunctionCallbackInfo<v8::Value>& info,
-                     CFXJSE_Value* pRetValue);
+                     const v8::FunctionCallbackInfo<v8::Value>& info);
   static void Uuid(CFXJSE_Value* pThis,
-                   const v8::FunctionCallbackInfo<v8::Value>& info,
-                   CFXJSE_Value* pRetValue);
+                   const v8::FunctionCallbackInfo<v8::Value>& info);
   static void Upper(CFXJSE_Value* pThis,
-                    const v8::FunctionCallbackInfo<v8::Value>& info,
-                    CFXJSE_Value* pRetValue);
+                    const v8::FunctionCallbackInfo<v8::Value>& info);
   static void WordNum(CFXJSE_Value* pThis,
-                      const v8::FunctionCallbackInfo<v8::Value>& info,
-                      CFXJSE_Value* pRetValue);
+                      const v8::FunctionCallbackInfo<v8::Value>& info);
 
   static void Get(CFXJSE_Value* pThis,
-                  const v8::FunctionCallbackInfo<v8::Value>& info,
-                  CFXJSE_Value* pRetValue);
+                  const v8::FunctionCallbackInfo<v8::Value>& info);
   static void Post(CFXJSE_Value* pThis,
-                   const v8::FunctionCallbackInfo<v8::Value>& info,
-                   CFXJSE_Value* pRetValue);
+                   const v8::FunctionCallbackInfo<v8::Value>& info);
   static void Put(CFXJSE_Value* pThis,
-                  const v8::FunctionCallbackInfo<v8::Value>& info,
-                  CFXJSE_Value* pRetValue);
+                  const v8::FunctionCallbackInfo<v8::Value>& info);
   static void assign_value_operator(
       CFXJSE_Value* pThis,
-      const v8::FunctionCallbackInfo<v8::Value>& info,
-      CFXJSE_Value* pRetValue);
+      const v8::FunctionCallbackInfo<v8::Value>& info);
   static void logical_or_operator(
       CFXJSE_Value* pThis,
-      const v8::FunctionCallbackInfo<v8::Value>& info,
-      CFXJSE_Value* pRetValue);
+      const v8::FunctionCallbackInfo<v8::Value>& info);
   static void logical_and_operator(
       CFXJSE_Value* pThis,
-      const v8::FunctionCallbackInfo<v8::Value>& info,
-      CFXJSE_Value* pRetValue);
-  static void equality_operator(CFXJSE_Value* pThis,
-                                const v8::FunctionCallbackInfo<v8::Value>& info,
-                                CFXJSE_Value* pRetValue);
+      const v8::FunctionCallbackInfo<v8::Value>& info);
+  static void equality_operator(
+      CFXJSE_Value* pThis,
+      const v8::FunctionCallbackInfo<v8::Value>& info);
   static void notequality_operator(
       CFXJSE_Value* pThis,
-      const v8::FunctionCallbackInfo<v8::Value>& info,
-      CFXJSE_Value* pRetValue);
+      const v8::FunctionCallbackInfo<v8::Value>& info);
   static bool fm_ref_equal(CFXJSE_Value* pThis,
                            const v8::FunctionCallbackInfo<v8::Value>& info);
   static void less_operator(CFXJSE_Value* pThis,
-                            const v8::FunctionCallbackInfo<v8::Value>& info,
-                            CFXJSE_Value* pRetValue);
+                            const v8::FunctionCallbackInfo<v8::Value>& info);
   static void lessequal_operator(
       CFXJSE_Value* pThis,
-      const v8::FunctionCallbackInfo<v8::Value>& info,
-      CFXJSE_Value* pRetValue);
+      const v8::FunctionCallbackInfo<v8::Value>& info);
   static void greater_operator(CFXJSE_Value* pThis,
-                               const v8::FunctionCallbackInfo<v8::Value>& info,
-                               CFXJSE_Value* pRetValue);
+                               const v8::FunctionCallbackInfo<v8::Value>& info);
   static void greaterequal_operator(
       CFXJSE_Value* pThis,
-      const v8::FunctionCallbackInfo<v8::Value>& info,
-      CFXJSE_Value* pRetValue);
+      const v8::FunctionCallbackInfo<v8::Value>& info);
   static void plus_operator(CFXJSE_Value* pThis,
-                            const v8::FunctionCallbackInfo<v8::Value>& info,
-                            CFXJSE_Value* pRetValue);
+                            const v8::FunctionCallbackInfo<v8::Value>& info);
   static void minus_operator(CFXJSE_Value* pThis,
-                             const v8::FunctionCallbackInfo<v8::Value>& info,
-                             CFXJSE_Value* pRetValue);
-  static void multiple_operator(CFXJSE_Value* pThis,
-                                const v8::FunctionCallbackInfo<v8::Value>& info,
-                                CFXJSE_Value* pRetValue);
+                             const v8::FunctionCallbackInfo<v8::Value>& info);
+  static void multiple_operator(
+      CFXJSE_Value* pThis,
+      const v8::FunctionCallbackInfo<v8::Value>& info);
   static void divide_operator(CFXJSE_Value* pThis,
-                              const v8::FunctionCallbackInfo<v8::Value>& info,
-                              CFXJSE_Value* pRetValue);
-  static void positive_operator(CFXJSE_Value* pThis,
-                                const v8::FunctionCallbackInfo<v8::Value>& info,
-                                CFXJSE_Value* pRetValue);
-  static void negative_operator(CFXJSE_Value* pThis,
-                                const v8::FunctionCallbackInfo<v8::Value>& info,
-                                CFXJSE_Value* pRetValue);
+                              const v8::FunctionCallbackInfo<v8::Value>& info);
+  static void positive_operator(
+      CFXJSE_Value* pThis,
+      const v8::FunctionCallbackInfo<v8::Value>& info);
+  static void negative_operator(
+      CFXJSE_Value* pThis,
+      const v8::FunctionCallbackInfo<v8::Value>& info);
   static void logical_not_operator(
       CFXJSE_Value* pThis,
-      const v8::FunctionCallbackInfo<v8::Value>& info,
-      CFXJSE_Value* pRetValue);
+      const v8::FunctionCallbackInfo<v8::Value>& info);
   static void dot_accessor(CFXJSE_Value* pThis,
-                           const v8::FunctionCallbackInfo<v8::Value>& info,
-                           CFXJSE_Value* pRetValue);
+                           const v8::FunctionCallbackInfo<v8::Value>& info);
   static void dotdot_accessor(CFXJSE_Value* pThis,
-                              const v8::FunctionCallbackInfo<v8::Value>& info,
-                              CFXJSE_Value* pRetValue);
+                              const v8::FunctionCallbackInfo<v8::Value>& info);
   static void eval_translation(CFXJSE_Value* pThis,
-                               const v8::FunctionCallbackInfo<v8::Value>& info,
-                               CFXJSE_Value* pRetValue);
+                               const v8::FunctionCallbackInfo<v8::Value>& info);
   static void is_fm_object(CFXJSE_Value* pThis,
-                           const v8::FunctionCallbackInfo<v8::Value>& info,
-                           CFXJSE_Value* pRetValue);
+                           const v8::FunctionCallbackInfo<v8::Value>& info);
   static void is_fm_array(CFXJSE_Value* pThis,
-                          const v8::FunctionCallbackInfo<v8::Value>& info,
-                          CFXJSE_Value* pRetValue);
+                          const v8::FunctionCallbackInfo<v8::Value>& info);
   static void get_fm_value(CFXJSE_Value* pThis,
-                           const v8::FunctionCallbackInfo<v8::Value>& info,
-                           CFXJSE_Value* pRetValue);
+                           const v8::FunctionCallbackInfo<v8::Value>& info);
   static void get_fm_jsobj(CFXJSE_Value* pThis,
-                           const v8::FunctionCallbackInfo<v8::Value>& info,
-                           CFXJSE_Value* pRetValue);
+                           const v8::FunctionCallbackInfo<v8::Value>& info);
   static void fm_var_filter(CFXJSE_Value* pThis,
-                            const v8::FunctionCallbackInfo<v8::Value>& info,
-                            CFXJSE_Value* pRetValue);
+                            const v8::FunctionCallbackInfo<v8::Value>& info);
   static void concat_fm_object(CFXJSE_Value* pThis,
-                               const v8::FunctionCallbackInfo<v8::Value>& info,
-                               CFXJSE_Value* pRetValue);
+                               const v8::FunctionCallbackInfo<v8::Value>& info);
 
   static int32_t hvalue_get_array_length(CFXJSE_Value* pThis,
                                          CFXJSE_Value* arg);
@@ -395,7 +308,6 @@
  private:
   static void DotAccessorCommon(CFXJSE_Value* pThis,
                                 const v8::FunctionCallbackInfo<v8::Value>& info,
-                                CFXJSE_Value* pRetValue,
                                 bool bDotAccessor);
 
   v8::Isolate* GetScriptRuntime() const { return m_pIsolate.Get(); }
diff --git a/fxjs/xfa/fxjse.h b/fxjs/xfa/fxjse.h
index ca6fea8..9a64259 100644
--- a/fxjs/xfa/fxjse.h
+++ b/fxjs/xfa/fxjse.h
@@ -43,8 +43,7 @@
     const WideString& functionName);
 typedef void (*FXJSE_FuncCallback)(
     CFXJSE_Value* pThis,
-    const v8::FunctionCallbackInfo<v8::Value>& info,
-    CFXJSE_Value* pRetValue);
+    const v8::FunctionCallbackInfo<v8::Value>& info);
 typedef void (*FXJSE_PropAccessor)(CFXJSE_Value* pObject,
                                    ByteStringView szPropName,
                                    CFXJSE_Value* pValue);
