summaryrefslogtreecommitdiff
path: root/xfa/fxfa/fm2js/cxfa_fmexpression.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'xfa/fxfa/fm2js/cxfa_fmexpression.cpp')
-rw-r--r--xfa/fxfa/fm2js/cxfa_fmexpression.cpp681
1 files changed, 681 insertions, 0 deletions
diff --git a/xfa/fxfa/fm2js/cxfa_fmexpression.cpp b/xfa/fxfa/fm2js/cxfa_fmexpression.cpp
new file mode 100644
index 0000000000..78f6a1f340
--- /dev/null
+++ b/xfa/fxfa/fm2js/cxfa_fmexpression.cpp
@@ -0,0 +1,681 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "xfa/fxfa/fm2js/cxfa_fmexpression.h"
+
+#include <utility>
+
+#include "core/fxcrt/fx_basic.h"
+
+namespace {
+
+const wchar_t RUNTIMEBLOCKTEMPARRAY[] =
+ L"foxit_xfa_formcalc_runtime_block_temp_array";
+
+const wchar_t RUNTIMEBLOCKTEMPARRAYINDEX[] =
+ L"foxit_xfa_formcalc_runtime_block_temp_array_index";
+
+const wchar_t kLessEqual[] = L" <= ";
+const wchar_t kGreaterEqual[] = L" >= ";
+const wchar_t kPlusEqual[] = L" += ";
+const wchar_t kMinusEqual[] = L" -= ";
+
+} // namespace
+
+CXFA_FMExpression::CXFA_FMExpression(uint32_t line)
+ : m_type(XFA_FM_EXPTYPE_UNKNOWN), m_line(line) {}
+
+CXFA_FMExpression::CXFA_FMExpression(uint32_t line, XFA_FM_EXPTYPE type)
+ : m_type(type), m_line(line) {}
+
+bool CXFA_FMExpression::ToJavaScript(CFX_WideTextBuf& javascript) {
+ return true;
+}
+
+bool CXFA_FMExpression::ToImpliedReturnJS(CFX_WideTextBuf& javascript) {
+ return true;
+}
+
+CXFA_FMFunctionDefinition::CXFA_FMFunctionDefinition(
+ uint32_t line,
+ bool isGlobal,
+ const CFX_WideStringC& wsName,
+ std::vector<CFX_WideStringC>&& arguments,
+ std::vector<std::unique_ptr<CXFA_FMExpression>>&& expressions)
+ : CXFA_FMExpression(line, XFA_FM_EXPTYPE_FUNC),
+ m_wsName(wsName),
+ m_pArguments(std::move(arguments)),
+ m_pExpressions(std::move(expressions)),
+ m_isGlobal(isGlobal) {}
+
+CXFA_FMFunctionDefinition::~CXFA_FMFunctionDefinition() {}
+
+bool CXFA_FMFunctionDefinition::ToJavaScript(CFX_WideTextBuf& javascript) {
+ if (m_isGlobal && m_pExpressions.empty()) {
+ javascript << L"// comments only";
+ return true;
+ }
+ if (m_isGlobal) {
+ javascript << L"(\n";
+ }
+ javascript << L"function ";
+ if (m_wsName.GetAt(0) == L'!') {
+ CFX_WideString tempName = EXCLAMATION_IN_IDENTIFIER + m_wsName.Mid(1);
+ javascript << tempName;
+ } else {
+ javascript << m_wsName;
+ }
+ javascript << L"(";
+ bool bNeedComma = false;
+ for (const auto& identifier : m_pArguments) {
+ if (bNeedComma)
+ javascript << L", ";
+ if (identifier.GetAt(0) == L'!') {
+ CFX_WideString tempIdentifier =
+ EXCLAMATION_IN_IDENTIFIER + identifier.Mid(1);
+ javascript << tempIdentifier;
+ } else {
+ javascript << identifier;
+ }
+ bNeedComma = true;
+ }
+ javascript << L")\n{\n";
+ javascript << L"var ";
+ javascript << RUNTIMEFUNCTIONRETURNVALUE;
+ javascript << L" = null;\n";
+ for (const auto& expr : m_pExpressions) {
+ bool ret;
+ if (expr == m_pExpressions.back())
+ ret = expr->ToImpliedReturnJS(javascript);
+ else
+ ret = expr->ToJavaScript(javascript);
+ if (!ret || CFXA_IsTooBig(javascript))
+ return false;
+ }
+ javascript << L"return ";
+ if (m_isGlobal) {
+ javascript << XFA_FM_EXPTypeToString(GETFMVALUE);
+ javascript << L"(";
+ javascript << RUNTIMEFUNCTIONRETURNVALUE;
+ javascript << L")";
+ } else {
+ javascript << RUNTIMEFUNCTIONRETURNVALUE;
+ }
+ javascript << L";\n}\n";
+ if (m_isGlobal) {
+ javascript << L").call(this);\n";
+ }
+ return true;
+}
+
+bool CXFA_FMFunctionDefinition::ToImpliedReturnJS(CFX_WideTextBuf&) {
+ return true;
+}
+
+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(std::move(pInit)) {}
+
+CXFA_FMVarExpression::~CXFA_FMVarExpression() {}
+
+bool CXFA_FMVarExpression::ToJavaScript(CFX_WideTextBuf& javascript) {
+ javascript << L"var ";
+ CFX_WideString tempName(m_wsName);
+ if (m_wsName.GetAt(0) == L'!') {
+ tempName = EXCLAMATION_IN_IDENTIFIER + m_wsName.Mid(1);
+ }
+ javascript << tempName;
+ javascript << L" = ";
+ if (m_pInit) {
+ if (!m_pInit->ToJavaScript(javascript))
+ return false;
+ javascript << tempName;
+ javascript << L" = ";
+ javascript << XFA_FM_EXPTypeToString(VARFILTER);
+ javascript << L"(";
+ javascript << tempName;
+ javascript << L");\n";
+ } else {
+ javascript << L"\"\";\n";
+ }
+ return true;
+}
+
+bool CXFA_FMVarExpression::ToImpliedReturnJS(CFX_WideTextBuf& javascript) {
+ javascript << L"var ";
+ CFX_WideString tempName(m_wsName);
+ if (m_wsName.GetAt(0) == L'!') {
+ tempName = EXCLAMATION_IN_IDENTIFIER + m_wsName.Mid(1);
+ }
+ javascript << tempName;
+ javascript << L" = ";
+ if (m_pInit) {
+ if (!m_pInit->ToJavaScript(javascript))
+ return false;
+ javascript << tempName;
+ javascript << L" = ";
+ javascript << XFA_FM_EXPTypeToString(VARFILTER);
+ javascript << L"(";
+ javascript << tempName;
+ javascript << L");\n";
+ } else {
+ javascript << L"\"\";\n";
+ }
+ javascript << RUNTIMEFUNCTIONRETURNVALUE;
+ javascript << L" = ";
+ javascript << tempName;
+ javascript << L";\n";
+ return true;
+}
+
+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() {}
+
+bool CXFA_FMExpExpression::ToJavaScript(CFX_WideTextBuf& javascript) {
+ bool ret = m_pExpression->ToJavaScript(javascript);
+ if (m_pExpression->GetOperatorToken() != TOKassign)
+ javascript << L";\n";
+ return ret;
+}
+
+bool CXFA_FMExpExpression::ToImpliedReturnJS(CFX_WideTextBuf& javascript) {
+ if (m_pExpression->GetOperatorToken() == TOKassign)
+ return m_pExpression->ToImpliedReturnJS(javascript);
+
+ if (m_pExpression->GetOperatorToken() == TOKstar ||
+ m_pExpression->GetOperatorToken() == TOKdotstar ||
+ m_pExpression->GetOperatorToken() == TOKdotscream ||
+ m_pExpression->GetOperatorToken() == TOKdotdot ||
+ m_pExpression->GetOperatorToken() == TOKdot) {
+ javascript << RUNTIMEFUNCTIONRETURNVALUE;
+ javascript << L" = ";
+ javascript << XFA_FM_EXPTypeToString(GETFMVALUE);
+ javascript << L"(";
+ if (!m_pExpression->ToJavaScript(javascript))
+ return false;
+ javascript << L");\n";
+ return true;
+ }
+
+ javascript << RUNTIMEFUNCTIONRETURNVALUE;
+ javascript << L" = ";
+ if (!m_pExpression->ToJavaScript(javascript))
+ return false;
+ javascript << L";\n";
+ return true;
+}
+
+CXFA_FMBlockExpression::CXFA_FMBlockExpression(
+ uint32_t line,
+ std::vector<std::unique_ptr<CXFA_FMExpression>>&& pExpressionList)
+ : CXFA_FMExpression(line, XFA_FM_EXPTYPE_BLOCK),
+ m_ExpressionList(std::move(pExpressionList)) {}
+
+CXFA_FMBlockExpression::~CXFA_FMBlockExpression() {}
+
+bool CXFA_FMBlockExpression::ToJavaScript(CFX_WideTextBuf& javascript) {
+ javascript << L"{\n";
+ for (const auto& expr : m_ExpressionList) {
+ if (!expr->ToJavaScript(javascript) || CFXA_IsTooBig(javascript))
+ return false;
+ }
+ javascript << L"}\n";
+ return true;
+}
+
+bool CXFA_FMBlockExpression::ToImpliedReturnJS(CFX_WideTextBuf& javascript) {
+ javascript << L"{\n";
+ for (const auto& expr : m_ExpressionList) {
+ bool ret;
+ if (expr == m_ExpressionList.back())
+ ret = expr->ToImpliedReturnJS(javascript);
+ else
+ ret = expr->ToJavaScript(javascript);
+ if (!ret || CFXA_IsTooBig(javascript))
+ return false;
+ }
+ javascript << L"}\n";
+ return true;
+}
+
+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() {}
+
+bool CXFA_FMDoExpression::ToJavaScript(CFX_WideTextBuf& javascript) {
+ return m_pList->ToJavaScript(javascript);
+}
+
+bool CXFA_FMDoExpression::ToImpliedReturnJS(CFX_WideTextBuf& javascript) {
+ return m_pList->ToImpliedReturnJS(javascript);
+}
+
+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(std::move(pExpression)),
+ m_pIfExpression(std::move(pIfExpression)),
+ m_pElseExpression(std::move(pElseExpression)) {}
+
+CXFA_FMIfExpression::~CXFA_FMIfExpression() {}
+
+bool CXFA_FMIfExpression::ToJavaScript(CFX_WideTextBuf& javascript) {
+ javascript << L"if (";
+ if (m_pExpression) {
+ javascript << XFA_FM_EXPTypeToString(GETFMVALUE);
+ javascript << L"(";
+ if (!m_pExpression->ToJavaScript(javascript))
+ return false;
+ javascript << L")";
+ }
+ javascript << L")\n";
+ if (CFXA_IsTooBig(javascript))
+ return false;
+
+ if (m_pIfExpression) {
+ if (!m_pIfExpression->ToJavaScript(javascript))
+ return false;
+ if (CFXA_IsTooBig(javascript))
+ return false;
+ }
+
+ if (m_pElseExpression) {
+ if (m_pElseExpression->GetExpType() == XFA_FM_EXPTYPE_IF) {
+ javascript << L"else\n";
+ javascript << L"{\n";
+ if (!m_pElseExpression->ToJavaScript(javascript))
+ return false;
+ javascript << L"}\n";
+ } else {
+ javascript << L"else\n";
+ if (!m_pElseExpression->ToJavaScript(javascript))
+ return false;
+ }
+ }
+ return !CFXA_IsTooBig(javascript);
+}
+
+bool CXFA_FMIfExpression::ToImpliedReturnJS(CFX_WideTextBuf& javascript) {
+ javascript << RUNTIMEFUNCTIONRETURNVALUE;
+ javascript << L" = 0;\n";
+ javascript << L"if (";
+ if (m_pExpression) {
+ javascript << XFA_FM_EXPTypeToString(GETFMVALUE);
+ javascript << L"(";
+ if (!m_pExpression->ToJavaScript(javascript))
+ return false;
+ javascript << L")";
+ }
+ javascript << L")\n";
+ if (CFXA_IsTooBig(javascript))
+ return false;
+
+ if (m_pIfExpression) {
+ if (!m_pIfExpression->ToImpliedReturnJS(javascript))
+ return false;
+ if (CFXA_IsTooBig(javascript))
+ return false;
+ }
+ if (m_pElseExpression) {
+ if (m_pElseExpression->GetExpType() == XFA_FM_EXPTYPE_IF) {
+ javascript << L"else\n";
+ javascript << L"{\n";
+ if (!m_pElseExpression->ToImpliedReturnJS(javascript))
+ return false;
+ javascript << L"}\n";
+ } else {
+ javascript << L"else\n";
+ if (!m_pElseExpression->ToImpliedReturnJS(javascript))
+ return false;
+ }
+ }
+ return !CFXA_IsTooBig(javascript);
+}
+
+CXFA_FMLoopExpression::~CXFA_FMLoopExpression() {}
+
+bool CXFA_FMLoopExpression::ToJavaScript(CFX_WideTextBuf& javascript) {
+ return true;
+}
+
+bool CXFA_FMLoopExpression::ToImpliedReturnJS(CFX_WideTextBuf&) {
+ return true;
+}
+
+CXFA_FMWhileExpression::CXFA_FMWhileExpression(
+ uint32_t line,
+ std::unique_ptr<CXFA_FMSimpleExpression> pCondition,
+ std::unique_ptr<CXFA_FMExpression> pExpression)
+ : CXFA_FMLoopExpression(line),
+ m_pCondition(std::move(pCondition)),
+ m_pExpression(std::move(pExpression)) {}
+
+CXFA_FMWhileExpression::~CXFA_FMWhileExpression() {}
+
+bool CXFA_FMWhileExpression::ToJavaScript(CFX_WideTextBuf& javascript) {
+ javascript << L"while (";
+ if (!m_pCondition->ToJavaScript(javascript))
+ return false;
+ javascript << L")\n";
+ if (CFXA_IsTooBig(javascript))
+ return false;
+
+ if (!m_pExpression->ToJavaScript(javascript))
+ return false;
+ return !CFXA_IsTooBig(javascript);
+}
+
+bool CXFA_FMWhileExpression::ToImpliedReturnJS(CFX_WideTextBuf& javascript) {
+ javascript << RUNTIMEFUNCTIONRETURNVALUE;
+ javascript << L" = 0;\n";
+ javascript << L"while (";
+ if (!m_pCondition->ToJavaScript(javascript))
+ return false;
+ javascript << L")\n";
+ if (CFXA_IsTooBig(javascript))
+ return false;
+
+ if (!m_pExpression->ToImpliedReturnJS(javascript))
+ return false;
+ return !CFXA_IsTooBig(javascript);
+}
+
+CXFA_FMBreakExpression::CXFA_FMBreakExpression(uint32_t line)
+ : CXFA_FMExpression(line, XFA_FM_EXPTYPE_BREAK) {}
+
+CXFA_FMBreakExpression::~CXFA_FMBreakExpression() {}
+
+bool CXFA_FMBreakExpression::ToJavaScript(CFX_WideTextBuf& javascript) {
+ javascript << RUNTIMEFUNCTIONRETURNVALUE;
+ javascript << L" = 0;\n";
+ javascript << L"break;\n";
+ return true;
+}
+
+bool CXFA_FMBreakExpression::ToImpliedReturnJS(CFX_WideTextBuf& javascript) {
+ javascript << RUNTIMEFUNCTIONRETURNVALUE;
+ javascript << L" = 0;\n";
+ javascript << L"break;\n";
+ return true;
+}
+
+CXFA_FMContinueExpression::CXFA_FMContinueExpression(uint32_t line)
+ : CXFA_FMExpression(line, XFA_FM_EXPTYPE_CONTINUE) {}
+
+CXFA_FMContinueExpression::~CXFA_FMContinueExpression() {}
+
+bool CXFA_FMContinueExpression::ToJavaScript(CFX_WideTextBuf& javascript) {
+ javascript << RUNTIMEFUNCTIONRETURNVALUE;
+ javascript << L" = 0;\n";
+ javascript << L"continue;\n";
+ return true;
+}
+
+bool CXFA_FMContinueExpression::ToImpliedReturnJS(CFX_WideTextBuf& javascript) {
+ javascript << RUNTIMEFUNCTIONRETURNVALUE;
+ javascript << L" = 0;\n";
+ javascript << L"continue;\n";
+ return true;
+}
+
+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(std::move(pAssignment)),
+ m_pAccessor(std::move(pAccessor)),
+ m_bDirection(iDirection == 1),
+ m_pStep(std::move(pStep)),
+ m_pList(std::move(pList)) {}
+
+CXFA_FMForExpression::~CXFA_FMForExpression() {}
+
+bool CXFA_FMForExpression::ToJavaScript(CFX_WideTextBuf& javascript) {
+ javascript << L"{\nvar ";
+ CFX_WideString tempVariant;
+ if (m_wsVariant.GetAt(0) == L'!') {
+ tempVariant = EXCLAMATION_IN_IDENTIFIER + m_wsVariant.Mid(1);
+ javascript << tempVariant;
+ } else {
+ tempVariant = m_wsVariant;
+ javascript << m_wsVariant;
+ }
+ javascript << L" = null;\n";
+ javascript << L"for (";
+ javascript << tempVariant;
+ javascript << L" = ";
+ javascript << XFA_FM_EXPTypeToString(GETFMVALUE);
+ javascript << L"(";
+ if (!m_pAssignment->ToJavaScript(javascript))
+ return false;
+ javascript << L"); ";
+ javascript << tempVariant;
+ if (CFXA_IsTooBig(javascript))
+ return false;
+
+ javascript << (m_bDirection ? kLessEqual : kGreaterEqual);
+ javascript << XFA_FM_EXPTypeToString(GETFMVALUE);
+ javascript << L"(";
+ if (!m_pAccessor->ToJavaScript(javascript))
+ return false;
+ javascript << L"); ";
+ javascript << tempVariant;
+ javascript << (m_bDirection ? kPlusEqual : kMinusEqual);
+ if (CFXA_IsTooBig(javascript))
+ return false;
+
+ if (m_pStep) {
+ javascript << XFA_FM_EXPTypeToString(GETFMVALUE);
+ javascript << L"(";
+ if (!m_pStep->ToJavaScript(javascript))
+ return false;
+ javascript << L")";
+ if (CFXA_IsTooBig(javascript))
+ return false;
+ } else {
+ javascript << L"1";
+ }
+ javascript << L")\n";
+ if (!m_pList->ToJavaScript(javascript))
+ return false;
+ javascript << L"}\n";
+ return !CFXA_IsTooBig(javascript);
+}
+
+bool CXFA_FMForExpression::ToImpliedReturnJS(CFX_WideTextBuf& javascript) {
+ javascript << RUNTIMEFUNCTIONRETURNVALUE;
+ javascript << L" = 0;\n";
+ javascript << L"{\nvar ";
+ CFX_WideString tempVariant;
+ if (m_wsVariant.GetAt(0) == L'!') {
+ tempVariant = EXCLAMATION_IN_IDENTIFIER + m_wsVariant.Mid(1);
+ javascript << tempVariant;
+ } else {
+ tempVariant = m_wsVariant;
+ javascript << m_wsVariant;
+ }
+ javascript << L" = null;\n";
+ javascript << L"for (";
+ javascript << tempVariant;
+ javascript << L" = ";
+ javascript << XFA_FM_EXPTypeToString(GETFMVALUE);
+ javascript << L"(";
+ if (!m_pAssignment->ToJavaScript(javascript))
+ return false;
+ javascript << L"); ";
+ javascript << tempVariant;
+ if (CFXA_IsTooBig(javascript))
+ return false;
+
+ javascript << (m_bDirection ? kLessEqual : kGreaterEqual);
+ javascript << XFA_FM_EXPTypeToString(GETFMVALUE);
+ javascript << L"(";
+ if (!m_pAccessor->ToJavaScript(javascript))
+ return false;
+ javascript << L"); ";
+ javascript << tempVariant;
+ javascript << L" += ";
+ javascript << (m_bDirection ? kPlusEqual : kMinusEqual);
+ if (CFXA_IsTooBig(javascript))
+ return false;
+
+ if (m_pStep) {
+ javascript << XFA_FM_EXPTypeToString(GETFMVALUE);
+ javascript << L"(";
+ if (!m_pStep->ToJavaScript(javascript))
+ return false;
+ javascript << L")";
+ if (CFXA_IsTooBig(javascript))
+ return false;
+ } else {
+ javascript << L"1";
+ }
+ javascript << L")\n";
+ if (!m_pList->ToImpliedReturnJS(javascript))
+ return false;
+ javascript << L"}\n";
+ return !CFXA_IsTooBig(javascript);
+}
+
+CXFA_FMForeachExpression::CXFA_FMForeachExpression(
+ uint32_t line,
+ const CFX_WideStringC& wsIdentifier,
+ std::vector<std::unique_ptr<CXFA_FMSimpleExpression>>&& pAccessors,
+ std::unique_ptr<CXFA_FMExpression> pList)
+ : CXFA_FMLoopExpression(line),
+ m_wsIdentifier(wsIdentifier),
+ m_pAccessors(std::move(pAccessors)),
+ m_pList(std::move(pList)) {}
+
+CXFA_FMForeachExpression::~CXFA_FMForeachExpression() {}
+
+bool CXFA_FMForeachExpression::ToJavaScript(CFX_WideTextBuf& javascript) {
+ javascript << L"{\n";
+ javascript << L"var ";
+ if (m_wsIdentifier.GetAt(0) == L'!') {
+ CFX_WideString tempIdentifier =
+ EXCLAMATION_IN_IDENTIFIER + m_wsIdentifier.Mid(1);
+ javascript << tempIdentifier;
+ } else {
+ javascript << m_wsIdentifier;
+ }
+ javascript << L" = null;\n";
+ javascript << L"var ";
+ javascript << RUNTIMEBLOCKTEMPARRAY;
+ javascript << L" = ";
+ javascript << XFA_FM_EXPTypeToString(CONCATFMOBJECT);
+ javascript << L"(";
+
+ for (const auto& expr : m_pAccessors) {
+ if (!expr->ToJavaScript(javascript))
+ return false;
+ if (expr != m_pAccessors.back())
+ javascript << L", ";
+ if (CFXA_IsTooBig(javascript))
+ return false;
+ }
+ javascript << L");\n";
+ javascript << L"var ";
+ javascript << RUNTIMEBLOCKTEMPARRAYINDEX;
+ javascript << (L" = 0;\n");
+ javascript << L"while(";
+ javascript << RUNTIMEBLOCKTEMPARRAYINDEX;
+ javascript << L" < ";
+ javascript << RUNTIMEBLOCKTEMPARRAY;
+ javascript << L".length)\n{\n";
+ if (m_wsIdentifier.GetAt(0) == L'!') {
+ CFX_WideString tempIdentifier =
+ EXCLAMATION_IN_IDENTIFIER + m_wsIdentifier.Mid(1);
+ javascript << tempIdentifier;
+ } else {
+ javascript << m_wsIdentifier;
+ }
+ javascript << L" = ";
+ javascript << RUNTIMEBLOCKTEMPARRAY;
+ javascript << L"[";
+ javascript << RUNTIMEBLOCKTEMPARRAYINDEX;
+ javascript << L"++];\n";
+ if (!m_pList->ToJavaScript(javascript))
+ return false;
+ javascript << L"}\n";
+ javascript << L"}\n";
+ return !CFXA_IsTooBig(javascript);
+}
+
+bool CXFA_FMForeachExpression::ToImpliedReturnJS(CFX_WideTextBuf& javascript) {
+ javascript << RUNTIMEFUNCTIONRETURNVALUE;
+ javascript << L" = 0;\n";
+ javascript << L"{\n";
+ javascript << L"var ";
+ if (m_wsIdentifier.GetAt(0) == L'!') {
+ CFX_WideString tempIdentifier =
+ EXCLAMATION_IN_IDENTIFIER + m_wsIdentifier.Mid(1);
+ javascript << tempIdentifier;
+ } else {
+ javascript << m_wsIdentifier;
+ }
+ javascript << L" = null;\n";
+ javascript << L"var ";
+ javascript << RUNTIMEBLOCKTEMPARRAY;
+ javascript << L" = ";
+ javascript << XFA_FM_EXPTypeToString(CONCATFMOBJECT);
+ javascript << L"(";
+ for (const auto& expr : m_pAccessors) {
+ if (!expr->ToJavaScript(javascript))
+ return false;
+ if (expr != m_pAccessors.back())
+ javascript << L", ";
+ if (CFXA_IsTooBig(javascript))
+ return false;
+ }
+ javascript << L");\n";
+ javascript << L"var ";
+ javascript << RUNTIMEBLOCKTEMPARRAYINDEX;
+ javascript << L" = 0;\n";
+ javascript << L"while(";
+ javascript << RUNTIMEBLOCKTEMPARRAYINDEX;
+ javascript << L" < ";
+ javascript << RUNTIMEBLOCKTEMPARRAY;
+ javascript << L".length)\n{\n";
+ if (m_wsIdentifier.GetAt(0) == L'!') {
+ CFX_WideString tempIdentifier =
+ EXCLAMATION_IN_IDENTIFIER + m_wsIdentifier.Mid(1);
+ javascript << tempIdentifier;
+ } else {
+ javascript << m_wsIdentifier;
+ }
+ javascript << L" = ";
+ javascript << RUNTIMEBLOCKTEMPARRAY;
+ javascript << L"[";
+ javascript << RUNTIMEBLOCKTEMPARRAYINDEX;
+ javascript << L"++];\n";
+ if (!m_pList->ToImpliedReturnJS(javascript))
+ return false;
+ javascript << L"}\n";
+ javascript << L"}\n";
+ return !CFXA_IsTooBig(javascript);
+}