Return Optional<CFX_WideTextBuf> from CFXJSE_FormcalcContext::Translate()
Avoid more out-parameters.
-- add more const
-- pass string to CXFA_IsTooBig() by const-ref while at it.
Change-Id: I49a4621d45779cce8226e4c79fde4c9380416ee0
Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/73550
Commit-Queue: Tom Sepez <tsepez@chromium.org>
Reviewed-by: Lei Zhang <thestig@chromium.org>
diff --git a/fxjs/xfa/cfxjse_engine.cpp b/fxjs/xfa/cfxjse_engine.cpp
index 4155d6d..adc6e68 100644
--- a/fxjs/xfa/cfxjse_engine.cpp
+++ b/fxjs/xfa/cfxjse_engine.cpp
@@ -139,12 +139,13 @@
m_FM2JSContext = std::make_unique<CFXJSE_FormCalcContext>(
GetIsolate(), m_JsContext.get(), m_pDocument.Get());
}
- CFX_WideTextBuf wsJavaScript;
- if (!CFXJSE_FormCalcContext::Translate(wsScript, &wsJavaScript)) {
+ Optional<CFX_WideTextBuf> wsJavaScript =
+ CFXJSE_FormCalcContext::Translate(wsScript);
+ if (!wsJavaScript.has_value()) {
hRetValue->SetUndefined();
return false;
}
- btScript = FX_UTF8Encode(wsJavaScript.AsStringView());
+ btScript = FX_UTF8Encode(wsJavaScript.value().AsStringView());
} else {
btScript = FX_UTF8Encode(wsScript);
}
diff --git a/fxjs/xfa/cfxjse_formcalc_context.cpp b/fxjs/xfa/cfxjse_formcalc_context.cpp
index f25c263..886820a 100644
--- a/fxjs/xfa/cfxjse_formcalc_context.cpp
+++ b/fxjs/xfa/cfxjse_formcalc_context.cpp
@@ -3200,10 +3200,10 @@
return;
}
- CFX_WideTextBuf wsJavaScriptBuf;
- if (!CFXJSE_FormCalcContext::Translate(
- WideString::FromUTF8(bsUtf8Script.AsStringView()).AsStringView(),
- &wsJavaScriptBuf)) {
+ WideString wsCalcScript = WideString::FromUTF8(bsUtf8Script.AsStringView());
+ Optional<CFX_WideTextBuf> wsJavaScriptBuf =
+ CFXJSE_FormCalcContext::Translate(wsCalcScript.AsStringView());
+ if (!wsJavaScriptBuf.has_value()) {
pContext->ThrowCompilerErrorException();
return;
}
@@ -3213,8 +3213,8 @@
auto returnValue = std::make_unique<CFXJSE_Value>(pIsolate);
pNewContext->ExecuteScript(
- FX_UTF8Encode(wsJavaScriptBuf.AsStringView()).c_str(), returnValue.get(),
- nullptr);
+ FX_UTF8Encode(wsJavaScriptBuf.value().AsStringView()).c_str(),
+ returnValue.get(), nullptr);
info.GetReturnValue().Set(returnValue->DirectGetValue());
}
@@ -5010,16 +5010,16 @@
return;
}
- WideString wsScript = WideString::FromUTF8(bsArg.AsStringView());
- CFX_WideTextBuf wsJavaScriptBuf;
- if (!CFXJSE_FormCalcContext::Translate(wsScript.AsStringView(),
- &wsJavaScriptBuf)) {
+ WideString wsCalcScript = WideString::FromUTF8(bsArg.AsStringView());
+ Optional<CFX_WideTextBuf> wsJavaScriptBuf =
+ CFXJSE_FormCalcContext::Translate(wsCalcScript.AsStringView());
+ if (!wsJavaScriptBuf.has_value()) {
pContext->ThrowCompilerErrorException();
return;
}
info.GetReturnValue().Set(fxv8::NewStringHelper(
info.GetIsolate(),
- FX_UTF8Encode(wsJavaScriptBuf.AsStringView()).AsStringView()));
+ FX_UTF8Encode(wsJavaScriptBuf.value().AsStringView()).AsStringView()));
}
// static
@@ -5648,23 +5648,25 @@
}
// static.
-bool CFXJSE_FormCalcContext::Translate(WideStringView wsFormcalc,
- CFX_WideTextBuf* wsJavascript) {
- if (wsFormcalc.IsEmpty()) {
- wsJavascript->Clear();
- return true;
- }
+Optional<CFX_WideTextBuf> CFXJSE_FormCalcContext::Translate(
+ WideStringView wsFormcalc) {
+ if (wsFormcalc.IsEmpty())
+ return CFX_WideTextBuf();
CXFA_FMParser parser(wsFormcalc);
std::unique_ptr<CXFA_FMAST> ast = parser.Parse();
if (!ast || parser.HasError())
- return false;
+ return pdfium::nullopt;
CXFA_FMToJavaScriptDepth::Reset();
- if (!ast->ToJavaScript(wsJavascript))
- return false;
+ Optional<CFX_WideTextBuf> wsJavaScript = ast->ToJavaScript();
+ if (!wsJavaScript.has_value())
+ return pdfium::nullopt;
- return !CXFA_IsTooBig(wsJavascript);
+ if (CXFA_IsTooBig(wsJavaScript.value()))
+ return pdfium::nullopt;
+
+ return wsJavaScript;
}
CFXJSE_FormCalcContext::CFXJSE_FormCalcContext(v8::Isolate* pScriptIsolate,
diff --git a/fxjs/xfa/cfxjse_formcalc_context.h b/fxjs/xfa/cfxjse_formcalc_context.h
index 13085ea..8858d0e 100644
--- a/fxjs/xfa/cfxjse_formcalc_context.h
+++ b/fxjs/xfa/cfxjse_formcalc_context.h
@@ -12,6 +12,7 @@
#include "core/fxcrt/unowned_ptr.h"
#include "fxjs/xfa/fxjse.h"
+#include "third_party/base/optional.h"
#include "xfa/fxfa/parser/xfa_resolvenode_rs.h"
class CFXJSE_Context;
@@ -299,9 +300,7 @@
static double ExtractDouble(CFXJSE_HostObject* pThis,
CFXJSE_Value* src,
bool* ret);
-
- static bool Translate(WideStringView wsFormcalc,
- CFX_WideTextBuf* wsJavascript);
+ static Optional<CFX_WideTextBuf> Translate(WideStringView wsFormcalc);
void GlobalPropertyGetter(CFXJSE_Value* pValue);
diff --git a/testing/fuzzers/pdf_fm2js_fuzzer.cc b/testing/fuzzers/pdf_fm2js_fuzzer.cc
index 67daa46..929b811 100644
--- a/testing/fuzzers/pdf_fm2js_fuzzer.cc
+++ b/testing/fuzzers/pdf_fm2js_fuzzer.cc
@@ -11,13 +11,7 @@
#include "fxjs/xfa/cfxjse_formcalc_context.h"
extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {
- FX_SAFE_SIZE_T safe_size = size;
- if (!safe_size.IsValid())
- return 0;
-
- CFX_WideTextBuf js;
- WideString input =
- WideString::FromUTF8(ByteStringView(data, safe_size.ValueOrDie()));
- CFXJSE_FormCalcContext::Translate(input.AsStringView(), &js);
+ WideString input = WideString::FromUTF8(ByteStringView(data, size));
+ CFXJSE_FormCalcContext::Translate(input.AsStringView());
return 0;
}
diff --git a/xfa/fxfa/fm2js/cxfa_fmexpression.cpp b/xfa/fxfa/fm2js/cxfa_fmexpression.cpp
index a87ecca..98be02b 100644
--- a/xfa/fxfa/fm2js/cxfa_fmexpression.cpp
+++ b/xfa/fxfa/fm2js/cxfa_fmexpression.cpp
@@ -45,9 +45,9 @@
CXFA_FMFunctionDefinition::~CXFA_FMFunctionDefinition() = default;
bool CXFA_FMFunctionDefinition::ToJavaScript(CFX_WideTextBuf* js,
- ReturnType type) {
+ ReturnType type) const {
CXFA_FMToJavaScriptDepth depthManager;
- if (CXFA_IsTooBig(js) || !depthManager.IsWithinMaxDepth())
+ if (CXFA_IsTooBig(*js) || !depthManager.IsWithinMaxDepth())
return false;
if (m_wsName.IsEmpty())
@@ -73,7 +73,7 @@
*js << "return pfm_ret;\n";
*js << "}\n";
- return !CXFA_IsTooBig(js);
+ return !CXFA_IsTooBig(*js);
}
CXFA_FMAST::CXFA_FMAST(
@@ -82,35 +82,38 @@
CXFA_FMAST::~CXFA_FMAST() = default;
-bool CXFA_FMAST::ToJavaScript(CFX_WideTextBuf* js) {
+Optional<CFX_WideTextBuf> CXFA_FMAST::ToJavaScript() const {
+ CFX_WideTextBuf js;
if (expressions_.empty()) {
- *js << "// comments only";
- return !CXFA_IsTooBig(js);
+ js << "// comments only";
+ return js;
}
- *js << "(function() {\n";
- *js << "let pfm_method_runner = function(obj, cb) {\n";
- *js << " if (pfm_rt.is_ary(obj)) {\n";
- *js << " let pfm_method_return = null;\n";
- *js << " for (var idx = obj.length -1; idx > 1; idx--) {\n";
- *js << " pfm_method_return = cb(obj[idx]);\n";
- *js << " }\n";
- *js << " return pfm_method_return;\n";
- *js << " }\n";
- *js << " return cb(obj);\n";
- *js << "};\n";
- *js << "var pfm_ret = null;\n";
-
+ js << "(function() {\n";
+ js << "let pfm_method_runner = function(obj, cb) {\n";
+ js << " if (pfm_rt.is_ary(obj)) {\n";
+ js << " let pfm_method_return = null;\n";
+ js << " for (var idx = obj.length -1; idx > 1; idx--) {\n";
+ js << " pfm_method_return = cb(obj[idx]);\n";
+ js << " }\n";
+ js << " return pfm_method_return;\n";
+ js << " }\n";
+ js << " return cb(obj);\n";
+ js << "};\n";
+ js << "var pfm_ret = null;\n";
for (const auto& expr : expressions_) {
ReturnType ret_type = expr == expressions_.back() ? ReturnType::kImplied
: ReturnType::kInfered;
- if (!expr->ToJavaScript(js, ret_type))
- return false;
+ if (!expr->ToJavaScript(&js, ret_type))
+ return pdfium::nullopt;
}
+ js << "return pfm_rt.get_val(pfm_ret);\n";
+ js << "}).call(this);";
- *js << "return pfm_rt.get_val(pfm_ret);\n";
- *js << "}).call(this);";
- return !CXFA_IsTooBig(js);
+ if (CXFA_IsTooBig(js))
+ return pdfium::nullopt;
+
+ return js;
}
CXFA_FMVarExpression::CXFA_FMVarExpression(
@@ -120,9 +123,10 @@
CXFA_FMVarExpression::~CXFA_FMVarExpression() = default;
-bool CXFA_FMVarExpression::ToJavaScript(CFX_WideTextBuf* js, ReturnType type) {
+bool CXFA_FMVarExpression::ToJavaScript(CFX_WideTextBuf* js,
+ ReturnType type) const {
CXFA_FMToJavaScriptDepth depthManager;
- if (CXFA_IsTooBig(js) || !depthManager.IsWithinMaxDepth())
+ if (CXFA_IsTooBig(*js) || !depthManager.IsWithinMaxDepth())
return false;
WideString tempName = IdentifierToName(m_wsName);
@@ -140,7 +144,7 @@
if (type == ReturnType::kImplied)
*js << "pfm_ret = " << tempName << ";\n";
- return !CXFA_IsTooBig(js);
+ return !CXFA_IsTooBig(*js);
}
CXFA_FMExpExpression::CXFA_FMExpExpression(
@@ -149,9 +153,10 @@
CXFA_FMExpExpression::~CXFA_FMExpExpression() = default;
-bool CXFA_FMExpExpression::ToJavaScript(CFX_WideTextBuf* js, ReturnType type) {
+bool CXFA_FMExpExpression::ToJavaScript(CFX_WideTextBuf* js,
+ ReturnType type) const {
CXFA_FMToJavaScriptDepth depthManager;
- if (CXFA_IsTooBig(js) || !depthManager.IsWithinMaxDepth())
+ if (CXFA_IsTooBig(*js) || !depthManager.IsWithinMaxDepth())
return false;
if (type == ReturnType::kInfered) {
@@ -175,7 +180,7 @@
return false;
*js << ");\n";
- return !CXFA_IsTooBig(js);
+ return !CXFA_IsTooBig(*js);
}
*js << "pfm_ret = ";
@@ -183,7 +188,7 @@
return false;
*js << ";\n";
- return !CXFA_IsTooBig(js);
+ return !CXFA_IsTooBig(*js);
}
CXFA_FMBlockExpression::CXFA_FMBlockExpression(
@@ -193,9 +198,9 @@
CXFA_FMBlockExpression::~CXFA_FMBlockExpression() = default;
bool CXFA_FMBlockExpression::ToJavaScript(CFX_WideTextBuf* js,
- ReturnType type) {
+ ReturnType type) const {
CXFA_FMToJavaScriptDepth depthManager;
- if (CXFA_IsTooBig(js) || !depthManager.IsWithinMaxDepth())
+ if (CXFA_IsTooBig(*js) || !depthManager.IsWithinMaxDepth())
return false;
*js << "{\n";
@@ -213,7 +218,7 @@
}
*js << "}\n";
- return !CXFA_IsTooBig(js);
+ return !CXFA_IsTooBig(*js);
}
CXFA_FMDoExpression::CXFA_FMDoExpression(
@@ -222,9 +227,10 @@
CXFA_FMDoExpression::~CXFA_FMDoExpression() = default;
-bool CXFA_FMDoExpression::ToJavaScript(CFX_WideTextBuf* js, ReturnType type) {
+bool CXFA_FMDoExpression::ToJavaScript(CFX_WideTextBuf* js,
+ ReturnType type) const {
CXFA_FMToJavaScriptDepth depthManager;
- if (CXFA_IsTooBig(js) || !depthManager.IsWithinMaxDepth())
+ if (CXFA_IsTooBig(*js) || !depthManager.IsWithinMaxDepth())
return false;
return m_pList->ToJavaScript(js, type);
@@ -245,9 +251,10 @@
CXFA_FMIfExpression::~CXFA_FMIfExpression() = default;
-bool CXFA_FMIfExpression::ToJavaScript(CFX_WideTextBuf* js, ReturnType type) {
+bool CXFA_FMIfExpression::ToJavaScript(CFX_WideTextBuf* js,
+ ReturnType type) const {
CXFA_FMToJavaScriptDepth depthManager;
- if (CXFA_IsTooBig(js) || !depthManager.IsWithinMaxDepth())
+ if (CXFA_IsTooBig(*js) || !depthManager.IsWithinMaxDepth())
return false;
if (type == ReturnType::kImplied)
@@ -258,13 +265,13 @@
return false;
*js << "))\n";
- if (CXFA_IsTooBig(js))
+ if (CXFA_IsTooBig(*js))
return false;
if (m_pIfExpression) {
if (!m_pIfExpression->ToJavaScript(js, type))
return false;
- if (CXFA_IsTooBig(js))
+ if (CXFA_IsTooBig(*js))
return false;
}
@@ -279,7 +286,7 @@
if (!m_pElseExpression->ToJavaScript(js, type))
return false;
}
- return !CXFA_IsTooBig(js);
+ return !CXFA_IsTooBig(*js);
}
CXFA_FMWhileExpression::CXFA_FMWhileExpression(
@@ -292,9 +299,9 @@
CXFA_FMWhileExpression::~CXFA_FMWhileExpression() = default;
bool CXFA_FMWhileExpression::ToJavaScript(CFX_WideTextBuf* js,
- ReturnType type) {
+ ReturnType type) const {
CXFA_FMToJavaScriptDepth depthManager;
- if (CXFA_IsTooBig(js) || !depthManager.IsWithinMaxDepth())
+ if (CXFA_IsTooBig(*js) || !depthManager.IsWithinMaxDepth())
return false;
if (type == ReturnType::kImplied)
@@ -305,13 +312,13 @@
return false;
*js << ")\n";
- if (CXFA_IsTooBig(js))
+ if (CXFA_IsTooBig(*js))
return false;
if (!m_pExpression->ToJavaScript(js, type))
return false;
- return !CXFA_IsTooBig(js);
+ return !CXFA_IsTooBig(*js);
}
CXFA_FMBreakExpression::CXFA_FMBreakExpression() : CXFA_FMExpression() {}
@@ -319,13 +326,13 @@
CXFA_FMBreakExpression::~CXFA_FMBreakExpression() = default;
bool CXFA_FMBreakExpression::ToJavaScript(CFX_WideTextBuf* js,
- ReturnType type) {
+ ReturnType type) const {
CXFA_FMToJavaScriptDepth depthManager;
- if (CXFA_IsTooBig(js) || !depthManager.IsWithinMaxDepth())
+ if (CXFA_IsTooBig(*js) || !depthManager.IsWithinMaxDepth())
return false;
*js << "pfm_ret = 0;\nbreak;\n";
- return !CXFA_IsTooBig(js);
+ return !CXFA_IsTooBig(*js);
}
CXFA_FMContinueExpression::CXFA_FMContinueExpression() : CXFA_FMExpression() {}
@@ -333,13 +340,13 @@
CXFA_FMContinueExpression::~CXFA_FMContinueExpression() = default;
bool CXFA_FMContinueExpression::ToJavaScript(CFX_WideTextBuf* js,
- ReturnType type) {
+ ReturnType type) const {
CXFA_FMToJavaScriptDepth depthManager;
- if (CXFA_IsTooBig(js) || !depthManager.IsWithinMaxDepth())
+ if (CXFA_IsTooBig(*js) || !depthManager.IsWithinMaxDepth())
return false;
*js << "pfm_ret = 0;\ncontinue;\n";
- return !CXFA_IsTooBig(js);
+ return !CXFA_IsTooBig(*js);
}
CXFA_FMForExpression::CXFA_FMForExpression(
@@ -359,9 +366,10 @@
CXFA_FMForExpression::~CXFA_FMForExpression() = default;
-bool CXFA_FMForExpression::ToJavaScript(CFX_WideTextBuf* js, ReturnType type) {
+bool CXFA_FMForExpression::ToJavaScript(CFX_WideTextBuf* js,
+ ReturnType type) const {
CXFA_FMToJavaScriptDepth depthManager;
- if (CXFA_IsTooBig(js) || !depthManager.IsWithinMaxDepth())
+ if (CXFA_IsTooBig(*js) || !depthManager.IsWithinMaxDepth())
return false;
if (type == ReturnType::kImplied)
@@ -393,14 +401,14 @@
*js << "1";
}
*js << ")\n";
- if (CXFA_IsTooBig(js))
+ if (CXFA_IsTooBig(*js))
return false;
if (!m_pList->ToJavaScript(js, type))
return false;
*js << "}\n";
- return !CXFA_IsTooBig(js);
+ return !CXFA_IsTooBig(*js);
}
CXFA_FMForeachExpression::CXFA_FMForeachExpression(
@@ -415,9 +423,9 @@
CXFA_FMForeachExpression::~CXFA_FMForeachExpression() = default;
bool CXFA_FMForeachExpression::ToJavaScript(CFX_WideTextBuf* js,
- ReturnType type) {
+ ReturnType type) const {
CXFA_FMToJavaScriptDepth depthManager;
- if (CXFA_IsTooBig(js) || !depthManager.IsWithinMaxDepth())
+ if (CXFA_IsTooBig(*js) || !depthManager.IsWithinMaxDepth())
return false;
if (type == ReturnType::kImplied)
@@ -441,8 +449,8 @@
*js << tmpName << " = pfm_ary[pfm_ary_idx++];\n";
if (!m_pList->ToJavaScript(js, type))
return false;
- *js << "}\n"; // while
+ *js << "}\n"; // while
*js << "}\n"; // block
- return !CXFA_IsTooBig(js);
+ return !CXFA_IsTooBig(*js);
}
diff --git a/xfa/fxfa/fm2js/cxfa_fmexpression.h b/xfa/fxfa/fm2js/cxfa_fmexpression.h
index 8b5bd78..f8f54b8 100644
--- a/xfa/fxfa/fm2js/cxfa_fmexpression.h
+++ b/xfa/fxfa/fm2js/cxfa_fmexpression.h
@@ -10,6 +10,7 @@
#include <memory>
#include <vector>
+#include "third_party/base/optional.h"
#include "xfa/fxfa/fm2js/cxfa_fmsimpleexpression.h"
class CFX_WideTextBuf;
@@ -17,7 +18,7 @@
class CXFA_FMExpression {
public:
virtual ~CXFA_FMExpression() = default;
- virtual bool ToJavaScript(CFX_WideTextBuf* js, ReturnType type) = 0;
+ virtual bool ToJavaScript(CFX_WideTextBuf* js, ReturnType type) const = 0;
protected:
CXFA_FMExpression();
@@ -31,7 +32,7 @@
std::vector<std::unique_ptr<CXFA_FMExpression>>&& expressions);
~CXFA_FMFunctionDefinition() override;
- bool ToJavaScript(CFX_WideTextBuf* js, ReturnType type) override;
+ bool ToJavaScript(CFX_WideTextBuf* js, ReturnType type) const override;
private:
const WideStringView m_wsName;
@@ -45,7 +46,7 @@
std::unique_ptr<CXFA_FMSimpleExpression> pInit);
~CXFA_FMVarExpression() override;
- bool ToJavaScript(CFX_WideTextBuf* js, ReturnType type) override;
+ bool ToJavaScript(CFX_WideTextBuf* js, ReturnType type) const override;
private:
WideStringView const m_wsName;
@@ -58,7 +59,7 @@
std::unique_ptr<CXFA_FMSimpleExpression> pExpression);
~CXFA_FMExpExpression() override;
- bool ToJavaScript(CFX_WideTextBuf* js, ReturnType type) override;
+ bool ToJavaScript(CFX_WideTextBuf* js, ReturnType type) const override;
private:
std::unique_ptr<CXFA_FMSimpleExpression> const m_pExpression;
@@ -70,7 +71,7 @@
std::vector<std::unique_ptr<CXFA_FMExpression>>&& pExpressionList);
~CXFA_FMBlockExpression() override;
- bool ToJavaScript(CFX_WideTextBuf* js, ReturnType type) override;
+ bool ToJavaScript(CFX_WideTextBuf* js, ReturnType type) const override;
private:
std::vector<std::unique_ptr<CXFA_FMExpression>> const m_ExpressionList;
@@ -81,7 +82,7 @@
explicit CXFA_FMDoExpression(std::unique_ptr<CXFA_FMExpression> pList);
~CXFA_FMDoExpression() override;
- bool ToJavaScript(CFX_WideTextBuf* js, ReturnType type) override;
+ bool ToJavaScript(CFX_WideTextBuf* js, ReturnType type) const override;
private:
std::unique_ptr<CXFA_FMExpression> const m_pList;
@@ -96,7 +97,7 @@
std::unique_ptr<CXFA_FMExpression> pElseExpression);
~CXFA_FMIfExpression() override;
- bool ToJavaScript(CFX_WideTextBuf* js, ReturnType type) override;
+ bool ToJavaScript(CFX_WideTextBuf* js, ReturnType type) const override;
private:
std::unique_ptr<CXFA_FMSimpleExpression> const m_pExpression;
@@ -111,7 +112,7 @@
std::unique_ptr<CXFA_FMExpression> pExpression);
~CXFA_FMWhileExpression() override;
- bool ToJavaScript(CFX_WideTextBuf* js, ReturnType type) override;
+ bool ToJavaScript(CFX_WideTextBuf* js, ReturnType type) const override;
private:
std::unique_ptr<CXFA_FMSimpleExpression> const m_pCondition;
@@ -123,7 +124,7 @@
CXFA_FMBreakExpression();
~CXFA_FMBreakExpression() override;
- bool ToJavaScript(CFX_WideTextBuf* js, ReturnType type) override;
+ bool ToJavaScript(CFX_WideTextBuf* js, ReturnType type) const override;
};
class CXFA_FMContinueExpression final : public CXFA_FMExpression {
@@ -131,7 +132,7 @@
CXFA_FMContinueExpression();
~CXFA_FMContinueExpression() override;
- bool ToJavaScript(CFX_WideTextBuf* js, ReturnType type) override;
+ bool ToJavaScript(CFX_WideTextBuf* js, ReturnType type) const override;
};
class CXFA_FMForExpression final : public CXFA_FMExpression {
@@ -144,7 +145,7 @@
std::unique_ptr<CXFA_FMExpression> pList);
~CXFA_FMForExpression() override;
- bool ToJavaScript(CFX_WideTextBuf* js, ReturnType type) override;
+ bool ToJavaScript(CFX_WideTextBuf* js, ReturnType type) const override;
private:
const WideStringView m_wsVariant;
@@ -164,7 +165,7 @@
std::unique_ptr<CXFA_FMExpression> pList);
~CXFA_FMForeachExpression() override;
- bool ToJavaScript(CFX_WideTextBuf* js, ReturnType type) override;
+ bool ToJavaScript(CFX_WideTextBuf* js, ReturnType type) const override;
private:
const WideStringView m_wsIdentifier;
@@ -178,7 +179,7 @@
std::vector<std::unique_ptr<CXFA_FMExpression>> expressions);
~CXFA_FMAST();
- bool ToJavaScript(CFX_WideTextBuf* js);
+ Optional<CFX_WideTextBuf> ToJavaScript() const;
private:
std::vector<std::unique_ptr<CXFA_FMExpression>> const expressions_;
diff --git a/xfa/fxfa/fm2js/cxfa_fmparser_unittest.cpp b/xfa/fxfa/fm2js/cxfa_fmparser_unittest.cpp
index 50fa577..64f1a0b 100644
--- a/xfa/fxfa/fm2js/cxfa_fmparser_unittest.cpp
+++ b/xfa/fxfa/fm2js/cxfa_fmparser_unittest.cpp
@@ -15,10 +15,10 @@
EXPECT_FALSE(parser->HasError());
CXFA_FMToJavaScriptDepth::Reset();
- CFX_WideTextBuf buf;
- EXPECT_TRUE(ast->ToJavaScript(&buf));
+ Optional<CFX_WideTextBuf> buf = ast->ToJavaScript();
+ ASSERT_TRUE(buf.has_value());
// TODO(dsinclair): This is a little weird .....
- EXPECT_STREQ(L"// comments only", buf.MakeString().c_str());
+ EXPECT_STREQ(L"// comments only", buf.value().MakeString().c_str());
}
TEST(CXFA_FMParserTest, CommentOnlyIsError) {
@@ -30,9 +30,9 @@
// EXPECT_TRUE(parser->HasError());
CXFA_FMToJavaScriptDepth::Reset();
- CFX_WideTextBuf buf;
- EXPECT_TRUE(ast->ToJavaScript(&buf));
- EXPECT_STREQ(L"// comments only", buf.MakeString().c_str());
+ Optional<CFX_WideTextBuf> buf = ast->ToJavaScript();
+ ASSERT_TRUE(buf.has_value());
+ EXPECT_STREQ(L"// comments only", buf.value().MakeString().c_str());
}
TEST(CXFA_FMParserTest, CommentThenValue) {
@@ -59,9 +59,9 @@
EXPECT_FALSE(parser->HasError());
CXFA_FMToJavaScriptDepth::Reset();
- CFX_WideTextBuf buf;
- EXPECT_TRUE(ast->ToJavaScript(&buf));
- EXPECT_STREQ(ret, buf.MakeString().c_str());
+ Optional<CFX_WideTextBuf> buf = ast->ToJavaScript();
+ ASSERT_TRUE(buf.has_value());
+ EXPECT_STREQ(ret, buf.value().MakeString().c_str());
}
TEST(CXFA_FMParserTest, Parse) {
@@ -128,9 +128,9 @@
EXPECT_FALSE(parser->HasError());
CXFA_FMToJavaScriptDepth::Reset();
- CFX_WideTextBuf buf;
- EXPECT_TRUE(ast->ToJavaScript(&buf));
- EXPECT_EQ(ret, buf.AsStringView());
+ Optional<CFX_WideTextBuf> buf = ast->ToJavaScript();
+ ASSERT_TRUE(buf.has_value());
+ EXPECT_EQ(ret, buf.value().AsStringView());
}
TEST(CXFA_FMParserTest, MaxParseDepth) {
@@ -190,9 +190,9 @@
EXPECT_FALSE(parser->HasError());
CXFA_FMToJavaScriptDepth::Reset();
- CFX_WideTextBuf buf;
- EXPECT_TRUE(ast->ToJavaScript(&buf));
- EXPECT_STREQ(ret, buf.MakeString().c_str());
+ Optional<CFX_WideTextBuf> buf = ast->ToJavaScript();
+ ASSERT_TRUE(buf.has_value());
+ EXPECT_STREQ(ret, buf.value().MakeString().c_str());
}
TEST(CXFA_FMParserTest, ParseFuncWithoutParams) {
@@ -228,9 +228,9 @@
EXPECT_FALSE(parser->HasError());
CXFA_FMToJavaScriptDepth::Reset();
- CFX_WideTextBuf buf;
- EXPECT_TRUE(ast->ToJavaScript(&buf));
- EXPECT_STREQ(ret, buf.MakeString().c_str());
+ Optional<CFX_WideTextBuf> buf = ast->ToJavaScript();
+ ASSERT_TRUE(buf.has_value());
+ EXPECT_STREQ(ret, buf.value().MakeString().c_str());
}
TEST(CXFA_FMParserTest, ParseFuncWithBadParamsList) {
@@ -312,9 +312,9 @@
EXPECT_FALSE(parser->HasError());
CXFA_FMToJavaScriptDepth::Reset();
- CFX_WideTextBuf buf;
- EXPECT_TRUE(ast->ToJavaScript(&buf));
- EXPECT_STREQ(ret, buf.MakeString().c_str());
+ Optional<CFX_WideTextBuf> buf = ast->ToJavaScript();
+ ASSERT_TRUE(buf.has_value());
+ EXPECT_STREQ(ret, buf.value().MakeString().c_str());
}
TEST(CXFA_FMParserTest, ParseCallBig) {
@@ -353,9 +353,9 @@
EXPECT_FALSE(parser->HasError());
CXFA_FMToJavaScriptDepth::Reset();
- CFX_WideTextBuf buf;
- EXPECT_TRUE(ast->ToJavaScript(&buf));
- EXPECT_STREQ(ret, buf.MakeString().c_str());
+ Optional<CFX_WideTextBuf> buf = ast->ToJavaScript();
+ ASSERT_TRUE(buf.has_value());
+ EXPECT_STREQ(ret, buf.value().MakeString().c_str());
}
TEST(CXFA_FMParserTest, ParseVar) {
@@ -384,9 +384,9 @@
EXPECT_FALSE(parser->HasError());
CXFA_FMToJavaScriptDepth::Reset();
- CFX_WideTextBuf buf;
- EXPECT_TRUE(ast->ToJavaScript(&buf));
- EXPECT_STREQ(ret, buf.MakeString().c_str());
+ Optional<CFX_WideTextBuf> buf = ast->ToJavaScript();
+ ASSERT_TRUE(buf.has_value());
+ EXPECT_STREQ(ret, buf.value().MakeString().c_str());
}
TEST(CXFA_FMParserTest, ParseFunctionCallNoArguments) {
@@ -416,9 +416,9 @@
std::unique_ptr<CXFA_FMAST> ast = parser->Parse();
EXPECT_FALSE(parser->HasError());
CXFA_FMToJavaScriptDepth::Reset();
- CFX_WideTextBuf buf;
- EXPECT_TRUE(ast->ToJavaScript(&buf));
- EXPECT_STREQ(ret, buf.MakeString().c_str());
+ Optional<CFX_WideTextBuf> buf = ast->ToJavaScript();
+ ASSERT_TRUE(buf.has_value());
+ EXPECT_STREQ(ret, buf.value().MakeString().c_str());
}
TEST(CXFA_FMParserTest, ParseFunctionCallSingleArgument) {
@@ -448,9 +448,9 @@
std::unique_ptr<CXFA_FMAST> ast = parser->Parse();
EXPECT_FALSE(parser->HasError());
CXFA_FMToJavaScriptDepth::Reset();
- CFX_WideTextBuf buf;
- EXPECT_TRUE(ast->ToJavaScript(&buf));
- EXPECT_STREQ(ret, buf.MakeString().c_str());
+ Optional<CFX_WideTextBuf> buf = ast->ToJavaScript();
+ ASSERT_TRUE(buf.has_value());
+ EXPECT_STREQ(ret, buf.value().MakeString().c_str());
}
TEST(CXFA_FMParserTest, ParseFunctionCallMultipleArguments) {
@@ -480,9 +480,9 @@
std::unique_ptr<CXFA_FMAST> ast = parser->Parse();
EXPECT_FALSE(parser->HasError());
CXFA_FMToJavaScriptDepth::Reset();
- CFX_WideTextBuf buf;
- EXPECT_TRUE(ast->ToJavaScript(&buf));
- EXPECT_STREQ(ret, buf.MakeString().c_str());
+ Optional<CFX_WideTextBuf> buf = ast->ToJavaScript();
+ ASSERT_TRUE(buf.has_value());
+ EXPECT_STREQ(ret, buf.value().MakeString().c_str());
}
TEST(CXFA_FMParserTest, ParseFunctionCallMissingCommas) {
diff --git a/xfa/fxfa/fm2js/cxfa_fmsimpleexpression.cpp b/xfa/fxfa/fm2js/cxfa_fmsimpleexpression.cpp
index db3cd11..2371c44 100644
--- a/xfa/fxfa/fm2js/cxfa_fmsimpleexpression.cpp
+++ b/xfa/fxfa/fm2js/cxfa_fmsimpleexpression.cpp
@@ -141,11 +141,11 @@
bool CXFA_FMNullExpression::ToJavaScript(CFX_WideTextBuf* js, ReturnType type) {
CXFA_FMToJavaScriptDepth depthManager;
- if (CXFA_IsTooBig(js) || !depthManager.IsWithinMaxDepth())
+ if (CXFA_IsTooBig(*js) || !depthManager.IsWithinMaxDepth())
return false;
*js << "null";
- return !CXFA_IsTooBig(js);
+ return !CXFA_IsTooBig(*js);
}
CXFA_FMNumberExpression::CXFA_FMNumberExpression(WideStringView wsNumber)
@@ -156,11 +156,11 @@
bool CXFA_FMNumberExpression::ToJavaScript(CFX_WideTextBuf* js,
ReturnType type) {
CXFA_FMToJavaScriptDepth depthManager;
- if (CXFA_IsTooBig(js) || !depthManager.IsWithinMaxDepth())
+ if (CXFA_IsTooBig(*js) || !depthManager.IsWithinMaxDepth())
return false;
*js << m_wsNumber;
- return !CXFA_IsTooBig(js);
+ return !CXFA_IsTooBig(*js);
}
CXFA_FMStringExpression::CXFA_FMStringExpression(WideStringView wsString)
@@ -171,13 +171,13 @@
bool CXFA_FMStringExpression::ToJavaScript(CFX_WideTextBuf* js,
ReturnType type) {
CXFA_FMToJavaScriptDepth depthManager;
- if (CXFA_IsTooBig(js) || !depthManager.IsWithinMaxDepth())
+ if (CXFA_IsTooBig(*js) || !depthManager.IsWithinMaxDepth())
return false;
WideString tempStr(m_wsString);
if (tempStr.GetLength() <= 2) {
*js << tempStr;
- return !CXFA_IsTooBig(js);
+ return !CXFA_IsTooBig(*js);
}
*js << "\"";
@@ -199,7 +199,7 @@
}
}
*js << "\"";
- return !CXFA_IsTooBig(js);
+ return !CXFA_IsTooBig(*js);
}
CXFA_FMIdentifierExpression::CXFA_FMIdentifierExpression(
@@ -211,7 +211,7 @@
bool CXFA_FMIdentifierExpression::ToJavaScript(CFX_WideTextBuf* js,
ReturnType type) {
CXFA_FMToJavaScriptDepth depthManager;
- if (CXFA_IsTooBig(js) || !depthManager.IsWithinMaxDepth())
+ if (CXFA_IsTooBig(*js) || !depthManager.IsWithinMaxDepth())
return false;
if (m_wsIdentifier.EqualsASCII("$"))
@@ -235,7 +235,7 @@
else
*js << m_wsIdentifier;
- return !CXFA_IsTooBig(js);
+ return !CXFA_IsTooBig(*js);
}
CXFA_FMAssignExpression::CXFA_FMAssignExpression(
@@ -249,7 +249,7 @@
bool CXFA_FMAssignExpression::ToJavaScript(CFX_WideTextBuf* js,
ReturnType type) {
CXFA_FMToJavaScriptDepth depthManager;
- if (CXFA_IsTooBig(js) || !depthManager.IsWithinMaxDepth())
+ if (CXFA_IsTooBig(*js) || !depthManager.IsWithinMaxDepth())
return false;
CFX_WideTextBuf tempExp1;
@@ -278,7 +278,7 @@
*js << "(" << tempExp1 << ", " << tempExp2 << ");\n";
*js << "}\n";
}
- return !CXFA_IsTooBig(js);
+ return !CXFA_IsTooBig(*js);
}
CXFA_FMBinExpression::CXFA_FMBinExpression(
@@ -293,7 +293,7 @@
bool CXFA_FMBinExpression::ToJavaScript(CFX_WideTextBuf* js, ReturnType type) {
CXFA_FMToJavaScriptDepth depthManager;
- if (CXFA_IsTooBig(js) || !depthManager.IsWithinMaxDepth())
+ if (CXFA_IsTooBig(*js) || !depthManager.IsWithinMaxDepth())
return false;
*js << "pfm_rt." << m_OpName << "(";
@@ -303,7 +303,7 @@
if (!GetSecondExpression()->ToJavaScript(js, ReturnType::kInfered))
return false;
*js << ")";
- return !CXFA_IsTooBig(js);
+ return !CXFA_IsTooBig(*js);
}
CXFA_FMLogicalOrExpression::CXFA_FMLogicalOrExpression(
@@ -399,14 +399,14 @@
bool CXFA_FMUnaryExpression::ToJavaScript(CFX_WideTextBuf* js,
ReturnType type) {
CXFA_FMToJavaScriptDepth depthManager;
- if (CXFA_IsTooBig(js) || !depthManager.IsWithinMaxDepth())
+ if (CXFA_IsTooBig(*js) || !depthManager.IsWithinMaxDepth())
return false;
*js << "pfm_rt." << m_OpName.c_str() << "(";
if (!m_pExp->ToJavaScript(js, ReturnType::kInfered))
return false;
*js << ")";
- return !CXFA_IsTooBig(js);
+ return !CXFA_IsTooBig(*js);
}
CXFA_FMPosExpression::CXFA_FMPosExpression(
@@ -467,7 +467,7 @@
bool CXFA_FMCallExpression::ToJavaScript(CFX_WideTextBuf* js, ReturnType type) {
CXFA_FMToJavaScriptDepth depthManager;
- if (CXFA_IsTooBig(js) || !depthManager.IsWithinMaxDepth())
+ if (CXFA_IsTooBig(*js) || !depthManager.IsWithinMaxDepth())
return false;
CFX_WideTextBuf funcName;
@@ -506,7 +506,7 @@
}
}
*js << ")";
- return !CXFA_IsTooBig(js);
+ return !CXFA_IsTooBig(*js);
}
bool isEvalFunc = false;
@@ -554,7 +554,7 @@
if (isEvalFunc)
*js << ")";
- return !CXFA_IsTooBig(js);
+ return !CXFA_IsTooBig(*js);
}
CXFA_FMDotAccessorExpression::CXFA_FMDotAccessorExpression(
@@ -572,7 +572,7 @@
bool CXFA_FMDotAccessorExpression::ToJavaScript(CFX_WideTextBuf* js,
ReturnType type) {
CXFA_FMToJavaScriptDepth depthManager;
- if (CXFA_IsTooBig(js) || !depthManager.IsWithinMaxDepth())
+ if (CXFA_IsTooBig(*js) || !depthManager.IsWithinMaxDepth())
return false;
*js << "pfm_rt.dot_acc(";
@@ -607,7 +607,7 @@
return false;
*js << ")";
- return !CXFA_IsTooBig(js);
+ return !CXFA_IsTooBig(*js);
}
CXFA_FMIndexExpression::CXFA_FMIndexExpression(
@@ -624,7 +624,7 @@
bool CXFA_FMIndexExpression::ToJavaScript(CFX_WideTextBuf* js,
ReturnType type) {
CXFA_FMToJavaScriptDepth depthManager;
- if (CXFA_IsTooBig(js) || !depthManager.IsWithinMaxDepth())
+ if (CXFA_IsTooBig(*js) || !depthManager.IsWithinMaxDepth())
return false;
switch (m_accessorIndex) {
@@ -644,7 +644,7 @@
*js << "0";
}
if (m_bIsStarIndex)
- return !CXFA_IsTooBig(js);
+ return !CXFA_IsTooBig(*js);
*js << ", ";
if (m_pExp) {
@@ -653,7 +653,7 @@
} else {
*js << "0";
}
- return !CXFA_IsTooBig(js);
+ return !CXFA_IsTooBig(*js);
}
CXFA_FMDotDotAccessorExpression::CXFA_FMDotDotAccessorExpression(
@@ -671,7 +671,7 @@
bool CXFA_FMDotDotAccessorExpression::ToJavaScript(CFX_WideTextBuf* js,
ReturnType type) {
CXFA_FMToJavaScriptDepth depthManager;
- if (CXFA_IsTooBig(js) || !depthManager.IsWithinMaxDepth())
+ if (CXFA_IsTooBig(*js) || !depthManager.IsWithinMaxDepth())
return false;
CXFA_FMSimpleExpression* exp1 = GetFirstExpression();
@@ -690,7 +690,7 @@
if (!exp2->ToJavaScript(js, ReturnType::kInfered))
return false;
*js << ")";
- return !CXFA_IsTooBig(js);
+ return !CXFA_IsTooBig(*js);
}
CXFA_FMMethodCallExpression::CXFA_FMMethodCallExpression(
@@ -705,7 +705,7 @@
bool CXFA_FMMethodCallExpression::ToJavaScript(CFX_WideTextBuf* js,
ReturnType type) {
CXFA_FMToJavaScriptDepth depthManager;
- if (CXFA_IsTooBig(js) || !depthManager.IsWithinMaxDepth())
+ if (CXFA_IsTooBig(*js) || !depthManager.IsWithinMaxDepth())
return false;
CFX_WideTextBuf buf;
@@ -720,9 +720,9 @@
*js << ";\n";
*js << " });\n";
*js << "}).call(this)";
- return !CXFA_IsTooBig(js);
+ return !CXFA_IsTooBig(*js);
}
-bool CXFA_IsTooBig(const CFX_WideTextBuf* js) {
- return js->GetSize() >= 256 * 1024 * 1024;
+bool CXFA_IsTooBig(const CFX_WideTextBuf& js) {
+ return js.GetSize() >= 256 * 1024 * 1024;
}
diff --git a/xfa/fxfa/fm2js/cxfa_fmsimpleexpression.h b/xfa/fxfa/fm2js/cxfa_fmsimpleexpression.h
index 6657b56..81c341c 100644
--- a/xfa/fxfa/fm2js/cxfa_fmsimpleexpression.h
+++ b/xfa/fxfa/fm2js/cxfa_fmsimpleexpression.h
@@ -333,6 +333,6 @@
bool ToJavaScript(CFX_WideTextBuf* js, ReturnType type) override;
};
-bool CXFA_IsTooBig(const CFX_WideTextBuf* js);
+bool CXFA_IsTooBig(const CFX_WideTextBuf& js);
#endif // XFA_FXFA_FM2JS_CXFA_FMSIMPLEEXPRESSION_H_