Use unique_ptr in CFXA_FM expressions constructors

Review-Url: https://codereview.chromium.org/2534143003
diff --git a/xfa/fxfa/fm2js/xfa_expression.cpp b/xfa/fxfa/fm2js/xfa_expression.cpp
index 8d1888a..a668fc9 100644
--- a/xfa/fxfa/fm2js/xfa_expression.cpp
+++ b/xfa/fxfa/fm2js/xfa_expression.cpp
@@ -103,12 +103,13 @@
 
 void CXFA_FMFunctionDefinition::ToImpliedReturnJS(CFX_WideTextBuf&) {}
 
-CXFA_FMVarExpression::CXFA_FMVarExpression(uint32_t line,
-                                           const CFX_WideStringC& wsName,
-                                           CXFA_FMExpression* pInit)
+CXFA_FMVarExpression::CXFA_FMVarExpression(
+    uint32_t line,
+    const CFX_WideStringC& wsName,
+    std::unique_ptr<CXFA_FMExpression> pInit)
     : CXFA_FMExpression(line, XFA_FM_EXPTYPE_VAR),
       m_wsName(wsName),
-      m_pInit(pInit) {}
+      m_pInit(std::move(pInit)) {}
 
 CXFA_FMVarExpression::~CXFA_FMVarExpression() {}
 
@@ -158,9 +159,11 @@
   javascript << FX_WSTRC(L";\n");
 }
 
-CXFA_FMExpExpression::CXFA_FMExpExpression(uint32_t line,
-                                           CXFA_FMSimpleExpression* pExpression)
-    : CXFA_FMExpression(line, XFA_FM_EXPTYPE_EXP), m_pExpression(pExpression) {}
+CXFA_FMExpExpression::CXFA_FMExpExpression(
+    uint32_t line,
+    std::unique_ptr<CXFA_FMSimpleExpression> pExpression)
+    : CXFA_FMExpression(line, XFA_FM_EXPTYPE_EXP),
+      m_pExpression(std::move(pExpression)) {}
 
 CXFA_FMExpExpression::~CXFA_FMExpExpression() {}
 
@@ -223,9 +226,10 @@
   javascript << FX_WSTRC(L"}\n");
 }
 
-CXFA_FMDoExpression::CXFA_FMDoExpression(uint32_t line,
-                                         CXFA_FMExpression* pList)
-    : CXFA_FMExpression(line), m_pList(pList) {}
+CXFA_FMDoExpression::CXFA_FMDoExpression(
+    uint32_t line,
+    std::unique_ptr<CXFA_FMExpression> pList)
+    : CXFA_FMExpression(line), m_pList(std::move(pList)) {}
 
 CXFA_FMDoExpression::~CXFA_FMDoExpression() {}
 
@@ -237,14 +241,15 @@
   m_pList->ToImpliedReturnJS(javascript);
 }
 
-CXFA_FMIfExpression::CXFA_FMIfExpression(uint32_t line,
-                                         CXFA_FMSimpleExpression* pExpression,
-                                         CXFA_FMExpression* pIfExpression,
-                                         CXFA_FMExpression* pElseExpression)
+CXFA_FMIfExpression::CXFA_FMIfExpression(
+    uint32_t line,
+    std::unique_ptr<CXFA_FMSimpleExpression> pExpression,
+    std::unique_ptr<CXFA_FMExpression> pIfExpression,
+    std::unique_ptr<CXFA_FMExpression> pElseExpression)
     : CXFA_FMExpression(line, XFA_FM_EXPTYPE_IF),
-      m_pExpression(pExpression),
-      m_pIfExpression(pIfExpression),
-      m_pElseExpression(pElseExpression) {}
+      m_pExpression(std::move(pExpression)),
+      m_pIfExpression(std::move(pIfExpression)),
+      m_pElseExpression(std::move(pElseExpression)) {}
 
 CXFA_FMIfExpression::~CXFA_FMIfExpression() {}
 
@@ -308,11 +313,11 @@
 
 CXFA_FMWhileExpression::CXFA_FMWhileExpression(
     uint32_t line,
-    CXFA_FMSimpleExpression* pCondition,
-    CXFA_FMExpression* pExpression)
+    std::unique_ptr<CXFA_FMSimpleExpression> pCondition,
+    std::unique_ptr<CXFA_FMExpression> pExpression)
     : CXFA_FMLoopExpression(line),
-      m_pCondition(pCondition),
-      m_pExpression(pExpression) {}
+      m_pCondition(std::move(pCondition)),
+      m_pExpression(std::move(pExpression)) {}
 
 CXFA_FMWhileExpression::~CXFA_FMWhileExpression() {}
 
@@ -366,20 +371,21 @@
   javascript << FX_WSTRC(L"continue;\n");
 }
 
-CXFA_FMForExpression::CXFA_FMForExpression(uint32_t line,
-                                           const CFX_WideStringC& wsVariant,
-                                           CXFA_FMSimpleExpression* pAssignment,
-                                           CXFA_FMSimpleExpression* pAccessor,
-                                           int32_t iDirection,
-                                           CXFA_FMSimpleExpression* pStep,
-                                           CXFA_FMExpression* pList)
+CXFA_FMForExpression::CXFA_FMForExpression(
+    uint32_t line,
+    const CFX_WideStringC& wsVariant,
+    std::unique_ptr<CXFA_FMSimpleExpression> pAssignment,
+    std::unique_ptr<CXFA_FMSimpleExpression> pAccessor,
+    int32_t iDirection,
+    std::unique_ptr<CXFA_FMSimpleExpression> pStep,
+    std::unique_ptr<CXFA_FMExpression> pList)
     : CXFA_FMLoopExpression(line),
       m_wsVariant(wsVariant),
-      m_pAssignment(pAssignment),
-      m_pAccessor(pAccessor),
+      m_pAssignment(std::move(pAssignment)),
+      m_pAccessor(std::move(pAccessor)),
       m_iDirection(iDirection),
-      m_pStep(pStep),
-      m_pList(pList) {}
+      m_pStep(std::move(pStep)),
+      m_pList(std::move(pList)) {}
 
 CXFA_FMForExpression::~CXFA_FMForExpression() {}
 
@@ -487,11 +493,11 @@
     uint32_t line,
     const CFX_WideStringC& wsIdentifier,
     std::vector<std::unique_ptr<CXFA_FMSimpleExpression>>&& pAccessors,
-    CXFA_FMExpression* pList)
+    std::unique_ptr<CXFA_FMExpression> pList)
     : CXFA_FMLoopExpression(line),
       m_wsIdentifier(wsIdentifier),
       m_pAccessors(std::move(pAccessors)),
-      m_pList(pList) {}
+      m_pList(std::move(pList)) {}
 
 CXFA_FMForeachExpression::~CXFA_FMForeachExpression() {}
 
diff --git a/xfa/fxfa/fm2js/xfa_expression.h b/xfa/fxfa/fm2js/xfa_expression.h
index f89a923..a19df26 100644
--- a/xfa/fxfa/fm2js/xfa_expression.h
+++ b/xfa/fxfa/fm2js/xfa_expression.h
@@ -63,7 +63,7 @@
  public:
   CXFA_FMVarExpression(uint32_t line,
                        const CFX_WideStringC& wsName,
-                       CXFA_FMExpression* pInit);
+                       std::unique_ptr<CXFA_FMExpression> pInit);
   ~CXFA_FMVarExpression() override;
 
   void ToJavaScript(CFX_WideTextBuf& javascript) override;
@@ -76,7 +76,8 @@
 
 class CXFA_FMExpExpression : public CXFA_FMExpression {
  public:
-  CXFA_FMExpExpression(uint32_t line, CXFA_FMSimpleExpression* pExpression);
+  CXFA_FMExpExpression(uint32_t line,
+                       std::unique_ptr<CXFA_FMSimpleExpression> pExpression);
   ~CXFA_FMExpExpression() override;
 
   void ToJavaScript(CFX_WideTextBuf& javascript) override;
@@ -102,7 +103,7 @@
 
 class CXFA_FMDoExpression : public CXFA_FMExpression {
  public:
-  CXFA_FMDoExpression(uint32_t line, CXFA_FMExpression* pList);
+  CXFA_FMDoExpression(uint32_t line, std::unique_ptr<CXFA_FMExpression> pList);
   ~CXFA_FMDoExpression() override;
 
   void ToJavaScript(CFX_WideTextBuf& javascript) override;
@@ -115,9 +116,9 @@
 class CXFA_FMIfExpression : public CXFA_FMExpression {
  public:
   CXFA_FMIfExpression(uint32_t line,
-                      CXFA_FMSimpleExpression* pExpression,
-                      CXFA_FMExpression* pIfExpression,
-                      CXFA_FMExpression* pElseExpression);
+                      std::unique_ptr<CXFA_FMSimpleExpression> pExpression,
+                      std::unique_ptr<CXFA_FMExpression> pIfExpression,
+                      std::unique_ptr<CXFA_FMExpression> pElseExpression);
   ~CXFA_FMIfExpression() override;
 
   void ToJavaScript(CFX_WideTextBuf& javascript) override;
@@ -140,8 +141,8 @@
 class CXFA_FMWhileExpression : public CXFA_FMLoopExpression {
  public:
   CXFA_FMWhileExpression(uint32_t line,
-                         CXFA_FMSimpleExpression* pCodition,
-                         CXFA_FMExpression* pExpression);
+                         std::unique_ptr<CXFA_FMSimpleExpression> pCodition,
+                         std::unique_ptr<CXFA_FMExpression> pExpression);
   ~CXFA_FMWhileExpression() override;
 
   void ToJavaScript(CFX_WideTextBuf& javascript) override;
@@ -172,11 +173,11 @@
  public:
   CXFA_FMForExpression(uint32_t line,
                        const CFX_WideStringC& wsVariant,
-                       CXFA_FMSimpleExpression* pAssignment,
-                       CXFA_FMSimpleExpression* pAccessor,
+                       std::unique_ptr<CXFA_FMSimpleExpression> pAssignment,
+                       std::unique_ptr<CXFA_FMSimpleExpression> pAccessor,
                        int32_t iDirection,
-                       CXFA_FMSimpleExpression* pStep,
-                       CXFA_FMExpression* pList);
+                       std::unique_ptr<CXFA_FMSimpleExpression> pStep,
+                       std::unique_ptr<CXFA_FMExpression> pList);
   ~CXFA_FMForExpression() override;
 
   void ToJavaScript(CFX_WideTextBuf& javascript) override;
@@ -198,7 +199,7 @@
       uint32_t line,
       const CFX_WideStringC& wsIdentifier,
       std::vector<std::unique_ptr<CXFA_FMSimpleExpression>>&& pAccessors,
-      CXFA_FMExpression* pList);
+      std::unique_ptr<CXFA_FMExpression> pList);
   ~CXFA_FMForeachExpression() override;
 
   void ToJavaScript(CFX_WideTextBuf& javascript) override;
diff --git a/xfa/fxfa/fm2js/xfa_fmparse.cpp b/xfa/fxfa/fm2js/xfa_fmparse.cpp
index 07edc32..2d287da 100644
--- a/xfa/fxfa/fm2js/xfa_fmparse.cpp
+++ b/xfa/fxfa/fm2js/xfa_fmparse.cpp
@@ -192,7 +192,6 @@
 }
 
 std::unique_ptr<CXFA_FMExpression> CXFA_FMParse::ParseVarExpression() {
-  std::unique_ptr<CXFA_FMExpression> expr;
   CFX_WideStringC ident;
   uint32_t line = m_pToken->m_uLinenum;
   NextToken();
@@ -204,17 +203,15 @@
     ident = m_pToken->m_wstring;
     NextToken();
   }
+  std::unique_ptr<CXFA_FMExpression> expr;
   if (m_pToken->m_type == TOKassign) {
     NextToken();
     expr = ParseExpExpression();
   }
-  if (m_pErrorInfo->message.IsEmpty()) {
-    expr =
-        pdfium::MakeUnique<CXFA_FMVarExpression>(line, ident, expr.release());
-  } else {
-    expr.reset();
-  }
-  return expr;
+  if (!m_pErrorInfo->message.IsEmpty())
+    return nullptr;
+
+  return pdfium::MakeUnique<CXFA_FMVarExpression>(line, ident, std::move(expr));
 }
 
 std::unique_ptr<CXFA_FMSimpleExpression> CXFA_FMParse::ParseSimpleExpression() {
@@ -225,7 +222,7 @@
     std::unique_ptr<CXFA_FMSimpleExpression> pExp2 = ParseLogicalOrExpression();
     if (m_pErrorInfo->message.IsEmpty()) {
       pExp1 = pdfium::MakeUnique<CXFA_FMAssignExpression>(
-          line, TOKassign, pExp1.release(), pExp2.release());
+          line, TOKassign, std::move(pExp1), std::move(pExp2));
     } else {
       pExp1.reset();
     }
@@ -236,13 +233,10 @@
 std::unique_ptr<CXFA_FMExpression> CXFA_FMParse::ParseExpExpression() {
   uint32_t line = m_pToken->m_uLinenum;
   std::unique_ptr<CXFA_FMSimpleExpression> pExp1 = ParseSimpleExpression();
-  std::unique_ptr<CXFA_FMExpression> expr;
-  if (m_pErrorInfo->message.IsEmpty()) {
-    expr = pdfium::MakeUnique<CXFA_FMExpExpression>(line, pExp1.release());
-  } else {
-    expr.reset();
-  }
-  return expr;
+  if (!m_pErrorInfo->message.IsEmpty())
+    return nullptr;
+
+  return pdfium::MakeUnique<CXFA_FMExpExpression>(line, std::move(pExp1));
 }
 
 std::unique_ptr<CXFA_FMSimpleExpression>
@@ -258,7 +252,7 @@
             ParseLogicalAndExpression());
         if (m_pErrorInfo->message.IsEmpty()) {
           e1 = pdfium::MakeUnique<CXFA_FMLogicalOrExpression>(
-              line, TOKor, e1.release(), e2.release());
+              line, TOKor, std::move(e1), std::move(e2));
         } else {
           e1.reset();
         }
@@ -284,7 +278,7 @@
         std::unique_ptr<CXFA_FMSimpleExpression> e2 = ParseEqualityExpression();
         if (m_pErrorInfo->message.IsEmpty()) {
           e1 = pdfium::MakeUnique<CXFA_FMLogicalAndExpression>(
-              line, TOKand, e1.release(), e2.release());
+              line, TOKand, std::move(e1), std::move(e2));
         } else {
           e1.reset();
         }
@@ -311,7 +305,7 @@
         e2 = ParseRelationalExpression();
         if (m_pErrorInfo->message.IsEmpty()) {
           e1 = pdfium::MakeUnique<CXFA_FMEqualityExpression>(
-              line, TOKeq, e1.release(), e2.release());
+              line, TOKeq, std::move(e1), std::move(e2));
         } else {
           e1.reset();
         }
@@ -322,7 +316,7 @@
         e2 = ParseRelationalExpression();
         if (m_pErrorInfo->message.IsEmpty()) {
           e1 = pdfium::MakeUnique<CXFA_FMEqualityExpression>(
-              line, TOKne, e1.release(), e2.release());
+              line, TOKne, std::move(e1), std::move(e2));
         } else {
           e1.reset();
         }
@@ -348,7 +342,7 @@
         e2 = ParseAddtiveExpression();
         if (m_pErrorInfo->message.IsEmpty()) {
           e1 = pdfium::MakeUnique<CXFA_FMRelationalExpression>(
-              line, TOKlt, e1.release(), e2.release());
+              line, TOKlt, std::move(e1), std::move(e2));
         } else {
           e1.reset();
         }
@@ -359,7 +353,7 @@
         e2 = ParseAddtiveExpression();
         if (m_pErrorInfo->message.IsEmpty()) {
           e1 = pdfium::MakeUnique<CXFA_FMRelationalExpression>(
-              line, TOKgt, e1.release(), e2.release());
+              line, TOKgt, std::move(e1), std::move(e2));
         } else {
           e1.reset();
         }
@@ -370,7 +364,7 @@
         e2 = ParseAddtiveExpression();
         if (m_pErrorInfo->message.IsEmpty()) {
           e1 = pdfium::MakeUnique<CXFA_FMRelationalExpression>(
-              line, TOKle, e1.release(), e2.release());
+              line, TOKle, std::move(e1), std::move(e2));
         } else {
           e1.reset();
         }
@@ -381,7 +375,7 @@
         e2 = ParseAddtiveExpression();
         if (m_pErrorInfo->message.IsEmpty()) {
           e1 = pdfium::MakeUnique<CXFA_FMRelationalExpression>(
-              line, TOKge, e1.release(), e2.release());
+              line, TOKge, std::move(e1), std::move(e2));
         } else {
           e1.reset();
         }
@@ -406,7 +400,7 @@
         e2 = ParseMultiplicativeExpression();
         if (m_pErrorInfo->message.IsEmpty()) {
           e1 = pdfium::MakeUnique<CXFA_FMAdditiveExpression>(
-              line, TOKplus, e1.release(), e2.release());
+              line, TOKplus, std::move(e1), std::move(e2));
         } else {
           e1.reset();
         }
@@ -416,7 +410,7 @@
         e2 = ParseMultiplicativeExpression();
         if (m_pErrorInfo->message.IsEmpty()) {
           e1 = pdfium::MakeUnique<CXFA_FMAdditiveExpression>(
-              line, TOKminus, e1.release(), e2.release());
+              line, TOKminus, std::move(e1), std::move(e2));
         } else {
           e1.reset();
         }
@@ -441,7 +435,7 @@
         e2 = ParseUnaryExpression();
         if (m_pErrorInfo->message.IsEmpty()) {
           e1 = pdfium::MakeUnique<CXFA_FMMultiplicativeExpression>(
-              line, TOKmul, e1.release(), e2.release());
+              line, TOKmul, std::move(e1), std::move(e2));
         } else {
           e1.reset();
         }
@@ -451,7 +445,7 @@
         e2 = ParseUnaryExpression();
         if (m_pErrorInfo->message.IsEmpty()) {
           e1 = pdfium::MakeUnique<CXFA_FMMultiplicativeExpression>(
-              line, TOKdiv, e1.release(), e2.release());
+              line, TOKdiv, std::move(e1), std::move(e2));
         } else {
           e1.reset();
         }
@@ -471,29 +465,26 @@
     case TOKplus:
       NextToken();
       expr = ParseUnaryExpression();
-      if (m_pErrorInfo->message.IsEmpty()) {
-        expr = pdfium::MakeUnique<CXFA_FMPosExpression>(line, expr.release());
-      } else {
+      if (m_pErrorInfo->message.IsEmpty())
+        expr = pdfium::MakeUnique<CXFA_FMPosExpression>(line, std::move(expr));
+      else
         expr.reset();
-      }
       break;
     case TOKminus:
       NextToken();
       expr = ParseUnaryExpression();
-      if (m_pErrorInfo->message.IsEmpty()) {
-        expr = pdfium::MakeUnique<CXFA_FMNegExpression>(line, expr.release());
-      } else {
+      if (m_pErrorInfo->message.IsEmpty())
+        expr = pdfium::MakeUnique<CXFA_FMNegExpression>(line, std::move(expr));
+      else
         expr.reset();
-      }
       break;
     case TOKksnot:
       NextToken();
       expr = ParseUnaryExpression();
-      if (m_pErrorInfo->message.IsEmpty()) {
-        expr = pdfium::MakeUnique<CXFA_FMNotExpression>(line, expr.release());
-      } else {
+      if (m_pErrorInfo->message.IsEmpty())
+        expr = pdfium::MakeUnique<CXFA_FMNotExpression>(line, std::move(expr));
+      else
         expr.reset();
-      }
       break;
     default:
       expr = ParsePrimaryExpression();
@@ -524,7 +515,7 @@
         std::unique_ptr<CXFA_FMSimpleExpression> s = ParseIndexExpression();
         if (s) {
           expr = pdfium::MakeUnique<CXFA_FMDotAccessorExpression>(
-              line, nullptr, TOKdot, wsIdentifier, s.release());
+              line, nullptr, TOKdot, wsIdentifier, std::move(s));
         }
         NextToken();
       } else {
@@ -552,7 +543,7 @@
       break;
   }
   expr = ParsePostExpression(std::move(expr));
-  if (!(m_pErrorInfo->message.IsEmpty()))
+  if (!m_pErrorInfo->message.IsEmpty())
     expr.reset();
   return expr;
 }
@@ -585,7 +576,7 @@
         }
         if (m_pErrorInfo->message.IsEmpty()) {
           expr = pdfium::MakeUnique<CXFA_FMCallExpression>(
-              line, expr.release(), std::move(expressions), false);
+              line, std::move(expr), std::move(expressions), false);
           NextToken();
           if (m_pToken->m_type != TOKlbracket)
             continue;
@@ -593,7 +584,7 @@
           std::unique_ptr<CXFA_FMSimpleExpression> s = ParseIndexExpression();
           if (s) {
             expr = pdfium::MakeUnique<CXFA_FMDotAccessorExpression>(
-                line, expr.release(), TOKcall, FX_WSTRC(L""), s.release());
+                line, std::move(expr), TOKcall, L"", std::move(s));
           } else {
             expr.reset();
           }
@@ -634,9 +625,9 @@
                   pdfium::MakeUnique<CXFA_FMIdentifierExpression>(tempLine,
                                                                   tempStr);
               pExpCall = pdfium::MakeUnique<CXFA_FMCallExpression>(
-                  line, pIdentifier.release(), std::move(expressions), true);
+                  line, std::move(pIdentifier), std::move(expressions), true);
               expr = pdfium::MakeUnique<CXFA_FMMethodCallExpression>(
-                  line, expr.release(), pExpCall.release());
+                  line, std::move(expr), std::move(pExpCall));
               NextToken();
               if (m_pToken->m_type != TOKlbracket)
                 continue;
@@ -645,7 +636,7 @@
                   ParseIndexExpression();
               if (s) {
                 expr = pdfium::MakeUnique<CXFA_FMDotAccessorExpression>(
-                    line, expr.release(), TOKcall, FX_WSTRC(L""), s.release());
+                    line, std::move(expr), TOKcall, L"", std::move(s));
               } else {
                 expr.reset();
               }
@@ -658,13 +649,13 @@
               return nullptr;
 
             expr = pdfium::MakeUnique<CXFA_FMDotAccessorExpression>(
-                tempLine, expr.release(), TOKdot, tempStr, s.release());
+                tempLine, std::move(expr), TOKdot, tempStr, std::move(s));
           } else {
             std::unique_ptr<CXFA_FMSimpleExpression> s =
                 pdfium::MakeUnique<CXFA_FMIndexExpression>(
                     tempLine, ACCESSOR_NO_INDEX, nullptr, false);
             expr = pdfium::MakeUnique<CXFA_FMDotAccessorExpression>(
-                line, expr.release(), TOKdot, tempStr, s.release());
+                line, std::move(expr), TOKdot, tempStr, std::move(s));
             continue;
           }
         } else {
@@ -686,13 +677,13 @@
               return nullptr;
             }
             expr = pdfium::MakeUnique<CXFA_FMDotDotAccessorExpression>(
-                tempLine, expr.release(), TOKdotdot, tempStr, s.release());
+                tempLine, std::move(expr), TOKdotdot, tempStr, std::move(s));
           } else {
             std::unique_ptr<CXFA_FMSimpleExpression> s =
                 pdfium::MakeUnique<CXFA_FMIndexExpression>(
                     tempLine, ACCESSOR_NO_INDEX, nullptr, false);
             expr = pdfium::MakeUnique<CXFA_FMDotDotAccessorExpression>(
-                line, expr.release(), TOKdotdot, tempStr, s.release());
+                line, std::move(expr), TOKdotdot, tempStr, std::move(s));
             continue;
           }
         } else {
@@ -714,13 +705,13 @@
               return nullptr;
 
             expr = pdfium::MakeUnique<CXFA_FMDotAccessorExpression>(
-                tempLine, expr.release(), TOKdotscream, tempStr, s.release());
+                tempLine, std::move(expr), TOKdotscream, tempStr, std::move(s));
           } else {
             std::unique_ptr<CXFA_FMSimpleExpression> s =
                 pdfium::MakeUnique<CXFA_FMIndexExpression>(
                     tempLine, ACCESSOR_NO_INDEX, nullptr, false);
             expr = pdfium::MakeUnique<CXFA_FMDotAccessorExpression>(
-                line, expr.release(), TOKdotscream, tempStr, s.release());
+                line, std::move(expr), TOKdotscream, tempStr, std::move(s));
             continue;
           }
         } else {
@@ -735,7 +726,7 @@
             pdfium::MakeUnique<CXFA_FMIndexExpression>(line, ACCESSOR_NO_INDEX,
                                                        nullptr, false);
         expr = pdfium::MakeUnique<CXFA_FMDotAccessorExpression>(
-            line, expr.release(), TOKdotstar, FX_WSTRC(L"*"), s.release());
+            line, std::move(expr), TOKdotstar, L"*", std::move(s));
       } break;
       default:
         return expr;
@@ -753,7 +744,7 @@
   XFA_FM_AccessorIndex accessorIndex = ACCESSOR_NO_RELATIVEINDEX;
   if (m_pToken->m_type == TOKmul) {
     pExp = pdfium::MakeUnique<CXFA_FMIndexExpression>(line, accessorIndex,
-                                                      s.release(), true);
+                                                      std::move(s), true);
     NextToken();
     if (m_pToken->m_type != TOKrbracket) {
       CFX_WideString ws_TempString(m_pToken->m_wstring);
@@ -777,7 +768,7 @@
           XFA_FM_KeywordToString(TOKrparen), ws_TempString.c_str());
   } else {
     pExp = pdfium::MakeUnique<CXFA_FMIndexExpression>(line, accessorIndex,
-                                                      s.release(), false);
+                                                      std::move(s), false);
   }
   return pExp;
 }
@@ -799,7 +790,7 @@
     std::unique_ptr<CXFA_FMSimpleExpression> pExp2 = ParseLogicalOrExpression();
     if (m_pErrorInfo->message.IsEmpty()) {
       pExp1 = pdfium::MakeUnique<CXFA_FMAssignExpression>(
-          line, TOKassign, pExp1.release(), pExp2.release());
+          line, TOKassign, std::move(pExp1), std::move(pExp2));
     } else {
       pExp1.reset();
     }
@@ -898,9 +889,9 @@
   }
   std::unique_ptr<CXFA_FMIfExpression> pExp;
   if (m_pErrorInfo->message.IsEmpty()) {
-    pExp = pdfium::MakeUnique<CXFA_FMIfExpression>(line, pExpression.release(),
-                                                   pIfExpression.release(),
-                                                   pElseExpression.release());
+    pExp = pdfium::MakeUnique<CXFA_FMIfExpression>(line, std::move(pExpression),
+                                                   std::move(pIfExpression),
+                                                   std::move(pElseExpression));
   }
   return pExp;
 }
@@ -915,7 +906,7 @@
   std::unique_ptr<CXFA_FMExpression> expr;
   if (m_pErrorInfo->message.IsEmpty()) {
     expr = pdfium::MakeUnique<CXFA_FMWhileExpression>(
-        line, pCondition.release(), pExpression.release());
+        line, std::move(pCondition), std::move(pExpression));
   }
   return expr;
 }
@@ -980,8 +971,8 @@
   std::unique_ptr<CXFA_FMExpression> expr;
   if (m_pErrorInfo->message.IsEmpty()) {
     expr = pdfium::MakeUnique<CXFA_FMForExpression>(
-        line, wsVariant, pAssignment.release(), pAccessor.release(), iDirection,
-        pStep.release(), pList.release());
+        line, wsVariant, std::move(pAssignment), std::move(pAccessor),
+        iDirection, std::move(pStep), std::move(pList));
   }
   return expr;
 }
@@ -1023,7 +1014,7 @@
   Check(TOKendfor);
   if (m_pErrorInfo->message.IsEmpty()) {
     expr = pdfium::MakeUnique<CXFA_FMForeachExpression>(
-        line, wsIdentifier, std::move(pAccessors), pList.release());
+        line, wsIdentifier, std::move(pAccessors), std::move(pList));
   }
   return expr;
 }
@@ -1033,10 +1024,8 @@
   NextToken();
   std::unique_ptr<CXFA_FMExpression> expr = ParseBlockExpression();
   Check(TOKend);
-  if (m_pErrorInfo->message.IsEmpty()) {
-    expr = pdfium::MakeUnique<CXFA_FMDoExpression>(line, expr.release());
-  } else {
-    expr.reset();
-  }
-  return expr;
+  if (!m_pErrorInfo->message.IsEmpty())
+    return nullptr;
+
+  return pdfium::MakeUnique<CXFA_FMDoExpression>(line, std::move(expr));
 }
diff --git a/xfa/fxfa/fm2js/xfa_simpleexpression.cpp b/xfa/fxfa/fm2js/xfa_simpleexpression.cpp
index e52cd88..342fe9f 100644
--- a/xfa/fxfa/fm2js/xfa_simpleexpression.cpp
+++ b/xfa/fxfa/fm2js/xfa_simpleexpression.cpp
@@ -209,30 +209,35 @@
   javascript << tempStr;
 }
 
-CXFA_FMUnaryExpression::CXFA_FMUnaryExpression(uint32_t line,
-                                               XFA_FM_TOKEN op,
-                                               CXFA_FMSimpleExpression* pExp)
-    : CXFA_FMSimpleExpression(line, op), m_pExp(pExp) {}
+CXFA_FMUnaryExpression::CXFA_FMUnaryExpression(
+    uint32_t line,
+    XFA_FM_TOKEN op,
+    std::unique_ptr<CXFA_FMSimpleExpression> pExp)
+    : CXFA_FMSimpleExpression(line, op), m_pExp(std::move(pExp)) {}
 
 CXFA_FMUnaryExpression::~CXFA_FMUnaryExpression() {}
 
 void CXFA_FMUnaryExpression::ToJavaScript(CFX_WideTextBuf& javascript) {}
 
-CXFA_FMBinExpression::CXFA_FMBinExpression(uint32_t line,
-                                           XFA_FM_TOKEN op,
-                                           CXFA_FMSimpleExpression* pExp1,
-                                           CXFA_FMSimpleExpression* pExp2)
-    : CXFA_FMSimpleExpression(line, op), m_pExp1(pExp1), m_pExp2(pExp2) {}
+CXFA_FMBinExpression::CXFA_FMBinExpression(
+    uint32_t line,
+    XFA_FM_TOKEN op,
+    std::unique_ptr<CXFA_FMSimpleExpression> pExp1,
+    std::unique_ptr<CXFA_FMSimpleExpression> pExp2)
+    : CXFA_FMSimpleExpression(line, op),
+      m_pExp1(std::move(pExp1)),
+      m_pExp2(std::move(pExp2)) {}
 
 CXFA_FMBinExpression::~CXFA_FMBinExpression() {}
 
 void CXFA_FMBinExpression::ToJavaScript(CFX_WideTextBuf& javascript) {}
 
-CXFA_FMAssignExpression::CXFA_FMAssignExpression(uint32_t line,
-                                                 XFA_FM_TOKEN op,
-                                                 CXFA_FMSimpleExpression* pExp1,
-                                                 CXFA_FMSimpleExpression* pExp2)
-    : CXFA_FMBinExpression(line, op, pExp1, pExp2) {}
+CXFA_FMAssignExpression::CXFA_FMAssignExpression(
+    uint32_t line,
+    XFA_FM_TOKEN op,
+    std::unique_ptr<CXFA_FMSimpleExpression> pExp1,
+    std::unique_ptr<CXFA_FMSimpleExpression> pExp2)
+    : CXFA_FMBinExpression(line, op, std::move(pExp1), std::move(pExp2)) {}
 
 void CXFA_FMAssignExpression::ToJavaScript(CFX_WideTextBuf& javascript) {
   javascript << FX_WSTRC(L"if (");
@@ -297,9 +302,9 @@
 CXFA_FMLogicalOrExpression::CXFA_FMLogicalOrExpression(
     uint32_t line,
     XFA_FM_TOKEN op,
-    CXFA_FMSimpleExpression* pExp1,
-    CXFA_FMSimpleExpression* pExp2)
-    : CXFA_FMBinExpression(line, op, pExp1, pExp2) {}
+    std::unique_ptr<CXFA_FMSimpleExpression> pExp1,
+    std::unique_ptr<CXFA_FMSimpleExpression> pExp2)
+    : CXFA_FMBinExpression(line, op, std::move(pExp1), std::move(pExp2)) {}
 
 void CXFA_FMLogicalOrExpression::ToJavaScript(CFX_WideTextBuf& javascript) {
   javascript << gs_lpStrExpFuncName[LOGICALOR];
@@ -313,9 +318,9 @@
 CXFA_FMLogicalAndExpression::CXFA_FMLogicalAndExpression(
     uint32_t line,
     XFA_FM_TOKEN op,
-    CXFA_FMSimpleExpression* pExp1,
-    CXFA_FMSimpleExpression* pExp2)
-    : CXFA_FMBinExpression(line, op, pExp1, pExp2) {}
+    std::unique_ptr<CXFA_FMSimpleExpression> pExp1,
+    std::unique_ptr<CXFA_FMSimpleExpression> pExp2)
+    : CXFA_FMBinExpression(line, op, std::move(pExp1), std::move(pExp2)) {}
 
 void CXFA_FMLogicalAndExpression::ToJavaScript(CFX_WideTextBuf& javascript) {
   javascript << gs_lpStrExpFuncName[LOGICALAND];
@@ -329,9 +334,9 @@
 CXFA_FMEqualityExpression::CXFA_FMEqualityExpression(
     uint32_t line,
     XFA_FM_TOKEN op,
-    CXFA_FMSimpleExpression* pExp1,
-    CXFA_FMSimpleExpression* pExp2)
-    : CXFA_FMBinExpression(line, op, pExp1, pExp2) {}
+    std::unique_ptr<CXFA_FMSimpleExpression> pExp1,
+    std::unique_ptr<CXFA_FMSimpleExpression> pExp2)
+    : CXFA_FMBinExpression(line, op, std::move(pExp1), std::move(pExp2)) {}
 
 void CXFA_FMEqualityExpression::ToJavaScript(CFX_WideTextBuf& javascript) {
   switch (m_op) {
@@ -357,9 +362,9 @@
 CXFA_FMRelationalExpression::CXFA_FMRelationalExpression(
     uint32_t line,
     XFA_FM_TOKEN op,
-    CXFA_FMSimpleExpression* pExp1,
-    CXFA_FMSimpleExpression* pExp2)
-    : CXFA_FMBinExpression(line, op, pExp1, pExp2) {}
+    std::unique_ptr<CXFA_FMSimpleExpression> pExp1,
+    std::unique_ptr<CXFA_FMSimpleExpression> pExp2)
+    : CXFA_FMBinExpression(line, op, std::move(pExp1), std::move(pExp2)) {}
 
 void CXFA_FMRelationalExpression::ToJavaScript(CFX_WideTextBuf& javascript) {
   switch (m_op) {
@@ -393,9 +398,9 @@
 CXFA_FMAdditiveExpression::CXFA_FMAdditiveExpression(
     uint32_t line,
     XFA_FM_TOKEN op,
-    CXFA_FMSimpleExpression* pExp1,
-    CXFA_FMSimpleExpression* pExp2)
-    : CXFA_FMBinExpression(line, op, pExp1, pExp2) {}
+    std::unique_ptr<CXFA_FMSimpleExpression> pExp1,
+    std::unique_ptr<CXFA_FMSimpleExpression> pExp2)
+    : CXFA_FMBinExpression(line, op, std::move(pExp1), std::move(pExp2)) {}
 
 void CXFA_FMAdditiveExpression::ToJavaScript(CFX_WideTextBuf& javascript) {
   switch (m_op) {
@@ -419,9 +424,9 @@
 CXFA_FMMultiplicativeExpression::CXFA_FMMultiplicativeExpression(
     uint32_t line,
     XFA_FM_TOKEN op,
-    CXFA_FMSimpleExpression* pExp1,
-    CXFA_FMSimpleExpression* pExp2)
-    : CXFA_FMBinExpression(line, op, pExp1, pExp2) {}
+    std::unique_ptr<CXFA_FMSimpleExpression> pExp1,
+    std::unique_ptr<CXFA_FMSimpleExpression> pExp2)
+    : CXFA_FMBinExpression(line, op, std::move(pExp1), std::move(pExp2)) {}
 
 void CXFA_FMMultiplicativeExpression::ToJavaScript(
     CFX_WideTextBuf& javascript) {
@@ -443,9 +448,10 @@
   javascript << FX_WSTRC(L")");
 }
 
-CXFA_FMPosExpression::CXFA_FMPosExpression(uint32_t line,
-                                           CXFA_FMSimpleExpression* pExp)
-    : CXFA_FMUnaryExpression(line, TOKplus, pExp) {}
+CXFA_FMPosExpression::CXFA_FMPosExpression(
+    uint32_t line,
+    std::unique_ptr<CXFA_FMSimpleExpression> pExp)
+    : CXFA_FMUnaryExpression(line, TOKplus, std::move(pExp)) {}
 
 void CXFA_FMPosExpression::ToJavaScript(CFX_WideTextBuf& javascript) {
   javascript << gs_lpStrExpFuncName[POSITIVE];
@@ -454,9 +460,10 @@
   javascript << FX_WSTRC(L")");
 }
 
-CXFA_FMNegExpression::CXFA_FMNegExpression(uint32_t line,
-                                           CXFA_FMSimpleExpression* pExp)
-    : CXFA_FMUnaryExpression(line, TOKminus, pExp) {}
+CXFA_FMNegExpression::CXFA_FMNegExpression(
+    uint32_t line,
+    std::unique_ptr<CXFA_FMSimpleExpression> pExp)
+    : CXFA_FMUnaryExpression(line, TOKminus, std::move(pExp)) {}
 
 void CXFA_FMNegExpression::ToJavaScript(CFX_WideTextBuf& javascript) {
   javascript << gs_lpStrExpFuncName[NEGATIVE];
@@ -465,9 +472,10 @@
   javascript << FX_WSTRC(L")");
 }
 
-CXFA_FMNotExpression::CXFA_FMNotExpression(uint32_t line,
-                                           CXFA_FMSimpleExpression* pExp)
-    : CXFA_FMUnaryExpression(line, TOKksnot, pExp) {}
+CXFA_FMNotExpression::CXFA_FMNotExpression(
+    uint32_t line,
+    std::unique_ptr<CXFA_FMSimpleExpression> pExp)
+    : CXFA_FMUnaryExpression(line, TOKksnot, std::move(pExp)) {}
 
 void CXFA_FMNotExpression::ToJavaScript(CFX_WideTextBuf& javascript) {
   javascript << gs_lpStrExpFuncName[NOT];
@@ -478,10 +486,10 @@
 
 CXFA_FMCallExpression::CXFA_FMCallExpression(
     uint32_t line,
-    CXFA_FMSimpleExpression* pExp,
+    std::unique_ptr<CXFA_FMSimpleExpression> pExp,
     std::vector<std::unique_ptr<CXFA_FMSimpleExpression>>&& pArguments,
     bool bIsSomMethod)
-    : CXFA_FMUnaryExpression(line, TOKcall, pExp),
+    : CXFA_FMUnaryExpression(line, TOKcall, std::move(pExp)),
       m_bIsSomMethod(bIsSomMethod),
       m_Arguments(std::move(pArguments)) {}
 
@@ -611,11 +619,14 @@
 
 CXFA_FMDotAccessorExpression::CXFA_FMDotAccessorExpression(
     uint32_t line,
-    CXFA_FMSimpleExpression* pAccessor,
+    std::unique_ptr<CXFA_FMSimpleExpression> pAccessor,
     XFA_FM_TOKEN op,
     CFX_WideStringC wsIdentifier,
-    CXFA_FMSimpleExpression* pIndexExp)
-    : CXFA_FMBinExpression(line, op, pAccessor, pIndexExp),
+    std::unique_ptr<CXFA_FMSimpleExpression> pIndexExp)
+    : CXFA_FMBinExpression(line,
+                           op,
+                           std::move(pAccessor),
+                           std::move(pIndexExp)),
       m_wsIdentifier(wsIdentifier) {}
 
 CXFA_FMDotAccessorExpression::~CXFA_FMDotAccessorExpression() {}
@@ -654,9 +665,9 @@
 CXFA_FMIndexExpression::CXFA_FMIndexExpression(
     uint32_t line,
     XFA_FM_AccessorIndex accessorIndex,
-    CXFA_FMSimpleExpression* pIndexExp,
+    std::unique_ptr<CXFA_FMSimpleExpression> pIndexExp,
     bool bIsStarIndex)
-    : CXFA_FMUnaryExpression(line, TOKlbracket, pIndexExp),
+    : CXFA_FMUnaryExpression(line, TOKlbracket, std::move(pIndexExp)),
       m_accessorIndex(accessorIndex),
       m_bIsStarIndex(bIsStarIndex) {}
 
@@ -689,11 +700,14 @@
 
 CXFA_FMDotDotAccessorExpression::CXFA_FMDotDotAccessorExpression(
     uint32_t line,
-    CXFA_FMSimpleExpression* pAccessor,
+    std::unique_ptr<CXFA_FMSimpleExpression> pAccessor,
     XFA_FM_TOKEN op,
     CFX_WideStringC wsIdentifier,
-    CXFA_FMSimpleExpression* pIndexExp)
-    : CXFA_FMBinExpression(line, op, pAccessor, pIndexExp),
+    std::unique_ptr<CXFA_FMSimpleExpression> pIndexExp)
+    : CXFA_FMBinExpression(line,
+                           op,
+                           std::move(pAccessor),
+                           std::move(pIndexExp)),
       m_wsIdentifier(wsIdentifier) {}
 
 CXFA_FMDotDotAccessorExpression::~CXFA_FMDotDotAccessorExpression() {}
@@ -718,9 +732,12 @@
 
 CXFA_FMMethodCallExpression::CXFA_FMMethodCallExpression(
     uint32_t line,
-    CXFA_FMSimpleExpression* pAccessorExp1,
-    CXFA_FMSimpleExpression* pCallExp)
-    : CXFA_FMBinExpression(line, TOKdot, pAccessorExp1, pCallExp) {}
+    std::unique_ptr<CXFA_FMSimpleExpression> pAccessorExp1,
+    std::unique_ptr<CXFA_FMSimpleExpression> pCallExp)
+    : CXFA_FMBinExpression(line,
+                           TOKdot,
+                           std::move(pAccessorExp1),
+                           std::move(pCallExp)) {}
 
 void CXFA_FMMethodCallExpression::ToJavaScript(CFX_WideTextBuf& javascript) {
   javascript << FX_WSTRC(L"(\nfunction ()\n{\n");
diff --git a/xfa/fxfa/fm2js/xfa_simpleexpression.h b/xfa/fxfa/fm2js/xfa_simpleexpression.h
index c96d990..28c37ed 100644
--- a/xfa/fxfa/fm2js/xfa_simpleexpression.h
+++ b/xfa/fxfa/fm2js/xfa_simpleexpression.h
@@ -111,7 +111,7 @@
  public:
   CXFA_FMUnaryExpression(uint32_t line,
                          XFA_FM_TOKEN op,
-                         CXFA_FMSimpleExpression* pExp);
+                         std::unique_ptr<CXFA_FMSimpleExpression> pExp);
   ~CXFA_FMUnaryExpression() override;
 
   void ToJavaScript(CFX_WideTextBuf& javascript) override;
@@ -124,8 +124,8 @@
  public:
   CXFA_FMBinExpression(uint32_t line,
                        XFA_FM_TOKEN op,
-                       CXFA_FMSimpleExpression* pExp1,
-                       CXFA_FMSimpleExpression* pExp2);
+                       std::unique_ptr<CXFA_FMSimpleExpression> pExp1,
+                       std::unique_ptr<CXFA_FMSimpleExpression> pExp2);
   ~CXFA_FMBinExpression() override;
 
   void ToJavaScript(CFX_WideTextBuf& javascript) override;
@@ -139,8 +139,8 @@
  public:
   CXFA_FMAssignExpression(uint32_t line,
                           XFA_FM_TOKEN op,
-                          CXFA_FMSimpleExpression* pExp1,
-                          CXFA_FMSimpleExpression* pExp2);
+                          std::unique_ptr<CXFA_FMSimpleExpression> pExp1,
+                          std::unique_ptr<CXFA_FMSimpleExpression> pExp2);
   ~CXFA_FMAssignExpression() override {}
   void ToJavaScript(CFX_WideTextBuf& javascript) override;
   void ToImpliedReturnJS(CFX_WideTextBuf& javascript) override;
@@ -150,8 +150,8 @@
  public:
   CXFA_FMLogicalOrExpression(uint32_t line,
                              XFA_FM_TOKEN op,
-                             CXFA_FMSimpleExpression* pExp1,
-                             CXFA_FMSimpleExpression* pExp2);
+                             std::unique_ptr<CXFA_FMSimpleExpression> pExp1,
+                             std::unique_ptr<CXFA_FMSimpleExpression> pExp2);
   ~CXFA_FMLogicalOrExpression() override {}
   void ToJavaScript(CFX_WideTextBuf& javascript) override;
 };
@@ -160,8 +160,8 @@
  public:
   CXFA_FMLogicalAndExpression(uint32_t line,
                               XFA_FM_TOKEN op,
-                              CXFA_FMSimpleExpression* pExp1,
-                              CXFA_FMSimpleExpression* pExp2);
+                              std::unique_ptr<CXFA_FMSimpleExpression> pExp1,
+                              std::unique_ptr<CXFA_FMSimpleExpression> pExp2);
   ~CXFA_FMLogicalAndExpression() override {}
   void ToJavaScript(CFX_WideTextBuf& javascript) override;
 };
@@ -170,8 +170,8 @@
  public:
   CXFA_FMEqualityExpression(uint32_t line,
                             XFA_FM_TOKEN op,
-                            CXFA_FMSimpleExpression* pExp1,
-                            CXFA_FMSimpleExpression* pExp2);
+                            std::unique_ptr<CXFA_FMSimpleExpression> pExp1,
+                            std::unique_ptr<CXFA_FMSimpleExpression> pExp2);
   ~CXFA_FMEqualityExpression() override {}
   void ToJavaScript(CFX_WideTextBuf& javascript) override;
 };
@@ -180,8 +180,8 @@
  public:
   CXFA_FMRelationalExpression(uint32_t line,
                               XFA_FM_TOKEN op,
-                              CXFA_FMSimpleExpression* pExp1,
-                              CXFA_FMSimpleExpression* pExp2);
+                              std::unique_ptr<CXFA_FMSimpleExpression> pExp1,
+                              std::unique_ptr<CXFA_FMSimpleExpression> pExp2);
   ~CXFA_FMRelationalExpression() override {}
   void ToJavaScript(CFX_WideTextBuf& javascript) override;
 };
@@ -190,39 +190,43 @@
  public:
   CXFA_FMAdditiveExpression(uint32_t line,
                             XFA_FM_TOKEN op,
-                            CXFA_FMSimpleExpression* pExp1,
-                            CXFA_FMSimpleExpression* pExp2);
+                            std::unique_ptr<CXFA_FMSimpleExpression> pExp1,
+                            std::unique_ptr<CXFA_FMSimpleExpression> pExp2);
   ~CXFA_FMAdditiveExpression() override {}
   void ToJavaScript(CFX_WideTextBuf& javascript) override;
 };
 
 class CXFA_FMMultiplicativeExpression : public CXFA_FMBinExpression {
  public:
-  CXFA_FMMultiplicativeExpression(uint32_t line,
-                                  XFA_FM_TOKEN op,
-                                  CXFA_FMSimpleExpression* pExp1,
-                                  CXFA_FMSimpleExpression* pExp2);
+  CXFA_FMMultiplicativeExpression(
+      uint32_t line,
+      XFA_FM_TOKEN op,
+      std::unique_ptr<CXFA_FMSimpleExpression> pExp1,
+      std::unique_ptr<CXFA_FMSimpleExpression> pExp2);
   ~CXFA_FMMultiplicativeExpression() override {}
   void ToJavaScript(CFX_WideTextBuf& javascript) override;
 };
 
 class CXFA_FMPosExpression : public CXFA_FMUnaryExpression {
  public:
-  CXFA_FMPosExpression(uint32_t line, CXFA_FMSimpleExpression* pExp);
+  CXFA_FMPosExpression(uint32_t line,
+                       std::unique_ptr<CXFA_FMSimpleExpression> pExp);
   ~CXFA_FMPosExpression() override {}
   void ToJavaScript(CFX_WideTextBuf& javascript) override;
 };
 
 class CXFA_FMNegExpression : public CXFA_FMUnaryExpression {
  public:
-  CXFA_FMNegExpression(uint32_t line, CXFA_FMSimpleExpression* pExp);
+  CXFA_FMNegExpression(uint32_t line,
+                       std::unique_ptr<CXFA_FMSimpleExpression> pExp);
   ~CXFA_FMNegExpression() override {}
   void ToJavaScript(CFX_WideTextBuf& javascript) override;
 };
 
 class CXFA_FMNotExpression : public CXFA_FMUnaryExpression {
  public:
-  CXFA_FMNotExpression(uint32_t line, CXFA_FMSimpleExpression* pExp);
+  CXFA_FMNotExpression(uint32_t line,
+                       std::unique_ptr<CXFA_FMSimpleExpression> pExp);
   ~CXFA_FMNotExpression() override {}
   void ToJavaScript(CFX_WideTextBuf& javascript) override;
 };
@@ -231,7 +235,7 @@
  public:
   CXFA_FMCallExpression(
       uint32_t line,
-      CXFA_FMSimpleExpression* pExp,
+      std::unique_ptr<CXFA_FMSimpleExpression> pExp,
       std::vector<std::unique_ptr<CXFA_FMSimpleExpression>>&& pArguments,
       bool bIsSomMethod);
   ~CXFA_FMCallExpression() override;
@@ -247,11 +251,12 @@
 
 class CXFA_FMDotAccessorExpression : public CXFA_FMBinExpression {
  public:
-  CXFA_FMDotAccessorExpression(uint32_t line,
-                               CXFA_FMSimpleExpression* pAccessor,
-                               XFA_FM_TOKEN op,
-                               CFX_WideStringC wsIdentifier,
-                               CXFA_FMSimpleExpression* pIndexExp);
+  CXFA_FMDotAccessorExpression(
+      uint32_t line,
+      std::unique_ptr<CXFA_FMSimpleExpression> pAccessor,
+      XFA_FM_TOKEN op,
+      CFX_WideStringC wsIdentifier,
+      std::unique_ptr<CXFA_FMSimpleExpression> pIndexExp);
   ~CXFA_FMDotAccessorExpression() override;
   void ToJavaScript(CFX_WideTextBuf& javascript) override;
 
@@ -263,7 +268,7 @@
  public:
   CXFA_FMIndexExpression(uint32_t line,
                          XFA_FM_AccessorIndex accessorIndex,
-                         CXFA_FMSimpleExpression* pIndexExp,
+                         std::unique_ptr<CXFA_FMSimpleExpression> pIndexExp,
                          bool bIsStarIndex);
   ~CXFA_FMIndexExpression() override {}
   void ToJavaScript(CFX_WideTextBuf& javascript) override;
@@ -275,11 +280,12 @@
 
 class CXFA_FMDotDotAccessorExpression : public CXFA_FMBinExpression {
  public:
-  CXFA_FMDotDotAccessorExpression(uint32_t line,
-                                  CXFA_FMSimpleExpression* pAccessor,
-                                  XFA_FM_TOKEN op,
-                                  CFX_WideStringC wsIdentifier,
-                                  CXFA_FMSimpleExpression* pIndexExp);
+  CXFA_FMDotDotAccessorExpression(
+      uint32_t line,
+      std::unique_ptr<CXFA_FMSimpleExpression> pAccessor,
+      XFA_FM_TOKEN op,
+      CFX_WideStringC wsIdentifier,
+      std::unique_ptr<CXFA_FMSimpleExpression> pIndexExp);
   ~CXFA_FMDotDotAccessorExpression() override;
 
   void ToJavaScript(CFX_WideTextBuf& javascript) override;
@@ -290,9 +296,10 @@
 
 class CXFA_FMMethodCallExpression : public CXFA_FMBinExpression {
  public:
-  CXFA_FMMethodCallExpression(uint32_t line,
-                              CXFA_FMSimpleExpression* pAccessorExp1,
-                              CXFA_FMSimpleExpression* pCallExp);
+  CXFA_FMMethodCallExpression(
+      uint32_t line,
+      std::unique_ptr<CXFA_FMSimpleExpression> pAccessorExp1,
+      std::unique_ptr<CXFA_FMSimpleExpression> pCallExp);
   ~CXFA_FMMethodCallExpression() override {}
   void ToJavaScript(CFX_WideTextBuf& javascript) override;
 };
diff --git a/xfa/fxfa/fm2js/xfa_simpleexpression_unittest.cpp b/xfa/fxfa/fm2js/xfa_simpleexpression_unittest.cpp
index d54921f..7826d9b 100644
--- a/xfa/fxfa/fm2js/xfa_simpleexpression_unittest.cpp
+++ b/xfa/fxfa/fm2js/xfa_simpleexpression_unittest.cpp
@@ -19,7 +19,7 @@
   for (size_t i = 0; i < 50; i++)
     args.push_back(pdfium::MakeUnique<CXFA_FMSimpleExpression>(0, TOKnan));
 
-  CXFA_FMCallExpression callExp(0, exp.release(), std::move(args), true);
+  CXFA_FMCallExpression callExp(0, std::move(exp), std::move(args), true);
   CFX_WideTextBuf js;
   callExp.ToJavaScript(js);