diff --git a/fxbarcode/common/reedsolomon/BC_ReedSolomon.cpp b/fxbarcode/common/reedsolomon/BC_ReedSolomon.cpp
index 8ce4ebf..71d5dd9 100644
--- a/fxbarcode/common/reedsolomon/BC_ReedSolomon.cpp
+++ b/fxbarcode/common/reedsolomon/BC_ReedSolomon.cpp
@@ -44,8 +44,7 @@
     for (size_t d = m_cachedGenerators.size(); d <= degree; ++d) {
       std::vector<int32_t> temp = {1, m_field->Exp(d - 1)};
       CBC_ReedSolomonGF256Poly temp_poly;
-      if (!temp_poly.Init(m_field.Get(), &temp))
-        return nullptr;
+      temp_poly.Init(m_field.Get(), temp);
 
       auto nextGenerator = lastGenerator->Multiply(&temp_poly);
       if (!nextGenerator)
@@ -76,8 +75,7 @@
     infoCoefficients[x] = (*toEncode)[x];
 
   CBC_ReedSolomonGF256Poly info;
-  if (!info.Init(m_field.Get(), &infoCoefficients))
-    return false;
+  info.Init(m_field.Get(), infoCoefficients);
 
   auto infoTemp = info.MultiplyByMonomial(ecBytes, 1);
   if (!infoTemp)
diff --git a/fxbarcode/common/reedsolomon/BC_ReedSolomonGF256.cpp b/fxbarcode/common/reedsolomon/BC_ReedSolomonGF256.cpp
index a5657e1..ec7878c 100644
--- a/fxbarcode/common/reedsolomon/BC_ReedSolomonGF256.cpp
+++ b/fxbarcode/common/reedsolomon/BC_ReedSolomonGF256.cpp
@@ -86,8 +86,7 @@
   std::vector<int32_t> coefficients(degree + 1);
   coefficients[0] = coefficient;
   auto temp = pdfium::MakeUnique<CBC_ReedSolomonGF256Poly>();
-  if (!temp->Init(this, &coefficients))
-    return nullptr;
+  temp->Init(this, coefficients);
   return temp;
 }
 
diff --git a/fxbarcode/common/reedsolomon/BC_ReedSolomonGF256Poly.cpp b/fxbarcode/common/reedsolomon/BC_ReedSolomonGF256Poly.cpp
index af6472a..59e239e 100644
--- a/fxbarcode/common/reedsolomon/BC_ReedSolomonGF256Poly.cpp
+++ b/fxbarcode/common/reedsolomon/BC_ReedSolomonGF256Poly.cpp
@@ -25,6 +25,7 @@
 #include <memory>
 #include <utility>
 
+#include "core/fxcrt/fx_system.h"
 #include "fxbarcode/common/reedsolomon/BC_ReedSolomonGF256.h"
 #include "third_party/base/ptr_util.h"
 #include "third_party/base/stl_util.h"
@@ -42,30 +43,30 @@
   m_field = nullptr;
 }
 
-bool CBC_ReedSolomonGF256Poly::Init(CBC_ReedSolomonGF256* field,
-                                    const std::vector<int32_t>* coefficients) {
-  if (!coefficients || coefficients->empty())
-    return false;
+CBC_ReedSolomonGF256Poly::~CBC_ReedSolomonGF256Poly() = default;
+
+void CBC_ReedSolomonGF256Poly::Init(CBC_ReedSolomonGF256* field,
+                                    const std::vector<int32_t>& coefficients) {
+  ASSERT(!coefficients.empty());
 
   m_field = field;
-  size_t coefficientsLength = coefficients->size();
-  if (coefficientsLength > 1 && coefficients->front() == 0) {
-    size_t firstNonZero = 1;
-    while (firstNonZero < coefficientsLength &&
-           (*coefficients)[firstNonZero] == 0) {
-      firstNonZero++;
-    }
-    if (firstNonZero == coefficientsLength) {
-      m_coefficients = m_field->GetZero()->GetCoefficients();
-    } else {
-      m_coefficients.resize(coefficientsLength - firstNonZero);
-      for (size_t i = firstNonZero, j = 0; i < coefficientsLength; i++, j++)
-        m_coefficients[j] = (*coefficients)[i];
-    }
-  } else {
-    m_coefficients = *coefficients;
+  if (coefficients.size() == 1 || coefficients.front() != 0) {
+    m_coefficients = coefficients;
+    return;
   }
-  return true;
+
+  size_t firstNonZero = 1;
+  while (firstNonZero < coefficients.size() &&
+         coefficients[firstNonZero] == 0) {
+    firstNonZero++;
+  }
+  if (firstNonZero == coefficients.size()) {
+    m_coefficients = m_field->GetZero()->GetCoefficients();
+  } else {
+    m_coefficients.resize(coefficients.size() - firstNonZero);
+    for (size_t i = firstNonZero, j = 0; i < coefficients.size(); i++, j++)
+      m_coefficients[j] = coefficients[i];
+  }
 }
 
 const std::vector<int32_t>& CBC_ReedSolomonGF256Poly::GetCoefficients() const {
@@ -87,8 +88,7 @@
 std::unique_ptr<CBC_ReedSolomonGF256Poly> CBC_ReedSolomonGF256Poly::Clone()
     const {
   auto temp = pdfium::MakeUnique<CBC_ReedSolomonGF256Poly>();
-  if (!temp->Init(m_field.Get(), &m_coefficients))
-    return nullptr;
+  temp->Init(m_field.Get(), m_coefficients);
   return temp;
 }
 
@@ -114,8 +114,7 @@
         smallerCoefficients[j - lengthDiff], largerCoefficients[j]);
   }
   auto temp = pdfium::MakeUnique<CBC_ReedSolomonGF256Poly>();
-  if (!temp->Init(m_field.Get(), &sumDiff))
-    return nullptr;
+  temp->Init(m_field.Get(), sumDiff);
   return temp;
 }
 
@@ -137,8 +136,7 @@
     }
   }
   auto temp = pdfium::MakeUnique<CBC_ReedSolomonGF256Poly>();
-  if (!temp->Init(m_field.Get(), &product))
-    return nullptr;
+  temp->Init(m_field.Get(), product);
   return temp;
 }
 
@@ -155,8 +153,7 @@
     product[i] = m_field->Multiply(m_coefficients[i], scalar);
 
   auto temp = pdfium::MakeUnique<CBC_ReedSolomonGF256Poly>();
-  if (!temp->Init(m_field.Get(), &product))
-    return nullptr;
+  temp->Init(m_field.Get(), product);
   return temp;
 }
 
@@ -174,8 +171,7 @@
     product[i] = m_field->Multiply(m_coefficients[i], coefficient);
 
   auto temp = pdfium::MakeUnique<CBC_ReedSolomonGF256Poly>();
-  if (!temp->Init(m_field.Get(), &product))
-    return nullptr;
+  temp->Init(m_field.Get(), product);
   return temp;
 }
 
@@ -217,5 +213,3 @@
   }
   return remainder;
 }
-
-CBC_ReedSolomonGF256Poly::~CBC_ReedSolomonGF256Poly() {}
diff --git a/fxbarcode/common/reedsolomon/BC_ReedSolomonGF256Poly.h b/fxbarcode/common/reedsolomon/BC_ReedSolomonGF256Poly.h
index 5cd6b85..c3a3370c 100644
--- a/fxbarcode/common/reedsolomon/BC_ReedSolomonGF256Poly.h
+++ b/fxbarcode/common/reedsolomon/BC_ReedSolomonGF256Poly.h
@@ -19,8 +19,9 @@
   CBC_ReedSolomonGF256Poly(CBC_ReedSolomonGF256* field, int32_t coefficients);
   CBC_ReedSolomonGF256Poly();
   ~CBC_ReedSolomonGF256Poly();
-  bool Init(CBC_ReedSolomonGF256* field,
-            const std::vector<int32_t>* coefficients);
+
+  void Init(CBC_ReedSolomonGF256* field,
+            const std::vector<int32_t>& coefficients);
 
   int32_t GetCoefficients(int32_t degree) const;
   const std::vector<int32_t>& GetCoefficients() const;
