7#include "xfa/fxfa/formcalc/cxfa_fmexpression.h"
12#include "core/fxcrt/autorestorer.h"
13#include "core/fxcrt/fx_extension.h"
14#include "core/fxcrt/widetext_buffer.h"
15#include "fxjs/gc/container_trace.h"
16#include "third_party/base/check.h"
17#include "v8/include/cppgc/visitor.h"
18#include "xfa/fxfa/formcalc/cxfa_fmtojavascriptdepth.h"
22const wchar_t kLessEqual[] = L" <= ";
23const wchar_t kGreaterEqual[] = L" >= ";
24const wchar_t kPlusEqual[] = L" += ";
25const wchar_t kMinusEqual[] = L" -= ";
27const wchar_t*
const kBuiltInFuncs[] = {
28 L"Abs", L"Apr", L"At", L"Avg",
29 L"Ceil", L"Choose", L"Concat", L"Count",
30 L"Cterm", L"Date", L"Date2Num", L"DateFmt",
31 L"Decode", L"Encode", L"Eval", L"Exists",
32 L"Floor", L"Format", L"FV", L"Get",
33 L"HasValue", L"If", L"Ipmt", L"IsoDate2Num",
34 L"IsoTime2Num", L"Left", L"Len", L"LocalDateFmt",
35 L"LocalTimeFmt", L"Lower", L"Ltrim", L"Max",
36 L"Min", L"Mod", L"NPV", L"Num2Date",
37 L"Num2GMTime", L"Num2Time", L"Oneof", L"Parse",
38 L"Pmt", L"Post", L"PPmt", L"Put",
39 L"PV", L"Rate", L"Ref", L"Replace",
40 L"Right", L"Round", L"Rtrim", L"Space",
41 L"Str", L"Stuff", L"Substr", L"Sum",
42 L"Term", L"Time", L"Time2Num", L"TimeFmt",
43 L"UnitType", L"UnitValue", L"Upper", L"Uuid",
44 L"Within", L"WordNum",
47const size_t kBuiltInFuncsMaxLen = 12;
49struct XFA_FMSOMMethod {
50 const wchar_t* m_wsSomMethodName;
51 uint32_t m_dParameters;
54const XFA_FMSOMMethod kFMSomMethods[] = {
56 {L"absPageInBatch", 0x01},
57 {L"absPageSpan", 0x01},
63 {L"isRecordGroup", 0x01},
67 {L"saveFilteredXML", 0x01},
68 {L"setElement", 0x01},
70 {L"sheetInBatch", 0x01},
78WideString IdentifierToName(
const WideString& ident) {
81 return L"pfm__excl__" + ident.Last(ident.GetLength() - 1);
105 CXFA_FMSimpleExpression::Trace(visitor);
106 visitor->Trace(m_pExp1);
107 visitor->Trace(m_pExp2);
110CXFA_FMNullExpression::CXFA_FMNullExpression()
125CXFA_FMNumberExpression::CXFA_FMNumberExpression(WideString wsNumber)
140CXFA_FMStringExpression::CXFA_FMStringExpression(WideString wsString)
151 WideString tempStr(m_wsString);
152 if (tempStr.GetLength() <= 2) {
158 for (size_t i = 1; i < tempStr.GetLength() - 1; i++) {
159 wchar_t oneChar = tempStr[i];
179CXFA_FMIdentifierExpression::CXFA_FMIdentifierExpression(
180 WideString wsIdentifier)
182 m_wsIdentifier(std::move(wsIdentifier)) {}
192 if (m_wsIdentifier.EqualsASCII(
"$"))
194 else if (m_wsIdentifier.EqualsASCII(
"!"))
195 *js <<
"xfa.datasets";
196 else if (m_wsIdentifier.EqualsASCII(
"$data"))
197 *js <<
"xfa.datasets.data";
198 else if (m_wsIdentifier.EqualsASCII(
"$event"))
200 else if (m_wsIdentifier.EqualsASCII(
"$form"))
202 else if (m_wsIdentifier.EqualsASCII(
"$host"))
204 else if (m_wsIdentifier.EqualsASCII(
"$layout"))
206 else if (m_wsIdentifier.EqualsASCII(
"$template"))
207 *js <<
"xfa.template";
208 else if (m_wsIdentifier[0] == L'!')
209 *js <<
"pfm__excl__" << m_wsIdentifier.Last(m_wsIdentifier.GetLength() - 1);
211 *js << m_wsIdentifier;
216CXFA_FMAssignExpression::CXFA_FMAssignExpression(
XFA_FM_TOKEN op,
229 WideTextBuffer tempExp1;
234 *js <<
"if (pfm_rt.is_obj(" << tempExp1 <<
"))\n{\n";
238 WideTextBuffer tempExp2;
243 *js <<
"pfm_rt.asgn_val_op(" << tempExp1 <<
", " << tempExp2 <<
");\n}\n";
251 *js << tempExp1 <<
" = pfm_rt.asgn_val_op";
252 *js <<
"(" << tempExp1 <<
", " << tempExp2 <<
");\n";
272 *js <<
"pfm_rt." << m_OpName <<
"(";
282CXFA_FMLogicalOrExpression::CXFA_FMLogicalOrExpression(
290CXFA_FMLogicalAndExpression::CXFA_FMLogicalAndExpression(
298CXFA_FMEqualExpression::CXFA_FMEqualExpression(
XFA_FM_TOKEN op,
305CXFA_FMNotEqualExpression::CXFA_FMNotEqualExpression(
313CXFA_FMGtExpression::CXFA_FMGtExpression(
XFA_FM_TOKEN op,
320CXFA_FMGeExpression::CXFA_FMGeExpression(
XFA_FM_TOKEN op,
327CXFA_FMLtExpression::CXFA_FMLtExpression(
XFA_FM_TOKEN op,
334CXFA_FMLeExpression::CXFA_FMLeExpression(
XFA_FM_TOKEN op,
341CXFA_FMPlusExpression::CXFA_FMPlusExpression(
XFA_FM_TOKEN op,
348CXFA_FMMinusExpression::CXFA_FMMinusExpression(
XFA_FM_TOKEN op,
355CXFA_FMMulExpression::CXFA_FMMulExpression(
XFA_FM_TOKEN op,
362CXFA_FMDivExpression::CXFA_FMDivExpression(
XFA_FM_TOKEN op,
377 CXFA_FMSimpleExpression::Trace(visitor);
378 visitor->Trace(m_pExp);
387 *js <<
"pfm_rt." << m_OpName <<
"(";
388 if (!m_pExp->ToJavaScript(js, ReturnType::kInferred))
409CXFA_FMCallExpression::CXFA_FMCallExpression(
411 std::vector<cppgc::Member<CXFA_FMSimpleExpression>>&& pArguments,
415 m_Arguments(std::move(pArguments)),
416 m_bIsSomMethod(bIsSomMethod) {}
420void CXFA_FMCallExpression::
Trace(cppgc::Visitor* visitor)
const {
421 CXFA_FMSimpleExpression::Trace(visitor);
422 visitor->Trace(m_pExp);
423 ContainerTrace(visitor, m_Arguments);
427 if (funcName->GetLength() > kBuiltInFuncsMaxLen)
431 const wchar_t*
const* pMatchResult =
432 std::lower_bound(
std::begin(kBuiltInFuncs),
std::end(kBuiltInFuncs), str,
433 [](
const wchar_t* iter,
const WideString& val) ->
bool {
436 if (pMatchResult !=
std::end(kBuiltInFuncs) &&
439 *funcName << *pMatchResult;
446 const WideString& methodName)
const {
447 const XFA_FMSOMMethod* result =
std::lower_bound(
448 std::begin(kFMSomMethods),
std::end(kFMSomMethods), methodName,
449 [](
const XFA_FMSOMMethod iter,
const WideString& val) {
450 return val
.Compare(iter.m_wsSomMethodName
) > 0;
452 if (result !=
std::end(kFMSomMethods) &&
453 methodName
== result->m_wsSomMethodName) {
454 return result->m_dParameters;
465 WideTextBuffer funcName;
466 if (!m_pExp->ToJavaScript(&funcName, ReturnType::kInferred))
469 if (m_bIsSomMethod) {
470 *js << funcName <<
"(";
472 if (methodPara > 0) {
473 for (size_t i = 0; i < m_Arguments.size(); ++i) {
477 *js <<
"pfm_rt.get_";
478 if (i < 32 && (methodPara & (0x01 << i)) > 0)
484 if (!m_Arguments[i]->ToJavaScript(js, ReturnType::kInferred))
487 if (i + 1 < m_Arguments.size())
491 for (
const auto& expr : m_Arguments) {
492 *js <<
"pfm_rt.get_val(";
493 if (!expr->ToJavaScript(js, ReturnType::kInferred))
496 if (expr != m_Arguments.back())
504 bool isEvalFunc =
false;
505 bool isExistsFunc =
false;
516 *js <<
"eval.call(this, pfm_rt.Translate";
521 *js <<
"pfm_rt." << funcName;
526 *js <<
"\n(\nfunction ()\n{\ntry\n{\n";
527 if (!m_Arguments.empty()) {
529 if (!m_Arguments[0]->ToJavaScript(js, ReturnType::kInferred))
533 *js <<
"return 0;\n}\n";
535 *js <<
"catch(accessExceptions)\n";
536 *js <<
"{\nreturn 0;\n}\n}\n).call(this)\n";
538 for (
const auto& expr : m_Arguments) {
539 if (!expr->ToJavaScript(js, ReturnType::kInferred))
541 if (expr != m_Arguments.back())
552CXFA_FMDotAccessorExpression::CXFA_FMDotAccessorExpression(
555 WideString wsIdentifier,
558 m_wsIdentifier(std::move(wsIdentifier)) {}
568 *js <<
"pfm_rt.dot_acc(";
588 *js <<
"\"#" << m_wsIdentifier <<
"\", ";
594 *js <<
"\"" << m_wsIdentifier <<
"\", ";
604CXFA_FMIndexExpression::CXFA_FMIndexExpression(
610 m_accessorIndex(accessorIndex),
611 m_bIsStarIndex(bIsStarIndex) {}
615void CXFA_FMIndexExpression::
Trace(cppgc::Visitor* visitor)
const {
616 CXFA_FMSimpleExpression::Trace(visitor);
617 visitor->Trace(m_pExp);
626 switch (m_accessorIndex) {
645 if (!m_pExp->ToJavaScript(js, ReturnType::kInferred))
653CXFA_FMDotDotAccessorExpression::CXFA_FMDotDotAccessorExpression(
656 WideString wsIdentifier,
659 m_wsIdentifier(std::move(wsIdentifier)) {}
670 *js <<
"pfm_rt.dotdot_acc(";
681 *js <<
"\", \"" << m_wsIdentifier <<
"\", ";
688CXFA_FMMethodCallExpression::CXFA_FMMethodCallExpression(
701 *js <<
"(function() {\n";
702 *js <<
" return pfm_method_runner(";
706 *js <<
", function(obj) {\n";
707 *js <<
" return obj.";
713 *js <<
"}).call(this)";
717CXFA_FMFunctionDefinition::CXFA_FMFunctionDefinition(
719 std::vector<WideString>&& arguments,
720 std::vector<cppgc::Member<CXFA_FMExpression>>&& expressions)
721 : m_wsName(std::move(wsName)),
722 m_pArguments(std::move(arguments)),
723 m_pExpressions(std::move(expressions)) {
724 DCHECK(!m_wsName.IsEmpty());
729void CXFA_FMFunctionDefinition::
Trace(cppgc::Visitor* visitor)
const {
730 CXFA_FMExpression::Trace(visitor);
731 ContainerTrace(visitor, m_pExpressions);
740 if (m_wsName.IsEmpty())
743 *js <<
"function " << IdentifierToName(m_wsName) <<
"(";
744 for (
const auto& identifier : m_pArguments) {
745 if (identifier != m_pArguments.front())
748 *js << IdentifierToName(identifier);
752 *js <<
"var pfm_ret = null;\n";
753 for (
const auto& expr : m_pExpressions) {
754 ReturnType ret_type = expr == m_pExpressions.back() ? ReturnType::kImplied
755 : ReturnType::kInferred;
756 if (!expr->ToJavaScript(js, ret_type))
760 *js <<
"return pfm_ret;\n";
767 std::vector<cppgc::Member<CXFA_FMExpression>> expressions)
768 : expressions_(std::move(expressions)) {}
773 ContainerTrace(visitor, expressions_);
778 if (expressions_.empty()) {
779 js <<
"// comments only";
783 js <<
"(function() {\n";
784 js <<
"let pfm_method_runner = function(obj, cb) {\n";
785 js <<
" if (pfm_rt.is_ary(obj)) {\n";
786 js <<
" let pfm_method_return = null;\n";
787 js <<
" for (var idx = obj.length -1; idx > 1; idx--) {\n";
788 js <<
" pfm_method_return = cb(obj[idx]);\n";
790 js <<
" return pfm_method_return;\n";
792 js <<
" return cb(obj);\n";
794 js <<
"var pfm_ret = null;\n";
795 for (
const auto& expr : expressions_) {
796 CXFA_FMAssignExpression::ReturnType ret_type =
797 expr == expressions_.back()
798 ? CXFA_FMAssignExpression::ReturnType::kImplied
799 : CXFA_FMAssignExpression::ReturnType::kInferred;
800 if (!expr->ToJavaScript(&js, ret_type))
801 return absl::nullopt;
803 js <<
"return pfm_rt.get_val(pfm_ret);\n";
804 js <<
"}).call(this);";
806 if (CXFA_IsTooBig(js))
807 return absl::nullopt;
812CXFA_FMVarExpression::CXFA_FMVarExpression(WideString wsName,
814 : m_wsName(std::move(wsName)), m_pInit(pInit) {}
818void CXFA_FMVarExpression::
Trace(cppgc::Visitor* visitor)
const {
819 CXFA_FMExpression::Trace(visitor);
820 visitor->Trace(m_pInit);
829 WideString tempName = IdentifierToName(m_wsName);
830 *js <<
"var " << tempName <<
" = ";
832 if (!m_pInit->ToJavaScript(js, ReturnType::kInferred))
836 *js << tempName <<
" = pfm_rt.var_filter(" << tempName <<
");\n";
842 *js <<
"pfm_ret = " << tempName <<
";\n";
848 : m_pExpression(pExpression) {}
852void CXFA_FMExpExpression::
Trace(cppgc::Visitor* visitor)
const {
853 CXFA_FMExpression::Trace(visitor);
854 visitor->Trace(m_pExpression);
864 bool ret = m_pExpression->ToJavaScript(js, ReturnType::kInferred);
865 if (m_pExpression->GetOperatorToken() != TOKassign)
871 if (m_pExpression->GetOperatorToken() == TOKassign)
872 return m_pExpression->ToJavaScript(js, ReturnType::kImplied);
874 if (m_pExpression->GetOperatorToken() == TOKstar ||
875 m_pExpression->GetOperatorToken() == TOKdotstar ||
876 m_pExpression->GetOperatorToken() == TOKdotscream ||
877 m_pExpression->GetOperatorToken() == TOKdotdot ||
878 m_pExpression->GetOperatorToken() == TOKdot) {
879 *js <<
"pfm_ret = pfm_rt.get_val(";
880 if (!m_pExpression->ToJavaScript(js, ReturnType::kInferred))
888 if (!m_pExpression->ToJavaScript(js, ReturnType::kInferred))
895CXFA_FMBlockExpression::CXFA_FMBlockExpression(
896 std::vector<cppgc::Member<CXFA_FMExpression>>&& pExpressionList)
897 : m_ExpressionList(std::move(pExpressionList)) {}
901void CXFA_FMBlockExpression::
Trace(cppgc::Visitor* visitor)
const {
902 CXFA_FMExpression::Trace(visitor);
903 ContainerTrace(visitor, m_ExpressionList);
913 for (
const auto& expr : m_ExpressionList) {
914 if (type == ReturnType::kInferred) {
915 if (!expr->ToJavaScript(js, ReturnType::kInferred))
918 ReturnType ret_type = expr == m_ExpressionList.back()
919 ? ReturnType::kImplied
920 : ReturnType::kInferred;
921 if (!expr->ToJavaScript(js, ret_type))
935void CXFA_FMDoExpression::
Trace(cppgc::Visitor* visitor)
const {
936 CXFA_FMExpression::Trace(visitor);
937 visitor->Trace(m_pList);
946 return m_pList->ToJavaScript(js, type);
949CXFA_FMIfExpression::CXFA_FMIfExpression(
952 std::vector<cppgc::Member<CXFA_FMIfExpression>>&& pElseIfExpressions,
953 CXFA_FMExpression* pElseExpression)
954 : m_pExpression(pExpression),
955 m_pIfExpression(pIfExpression),
956 m_pElseIfExpressions(std::move(pElseIfExpressions)),
957 m_pElseExpression(pElseExpression) {
958 DCHECK(m_pExpression);
963void CXFA_FMIfExpression::
Trace(cppgc::Visitor* visitor)
const {
964 CXFA_FMExpression::Trace(visitor);
965 visitor->Trace(m_pExpression);
966 visitor->Trace(m_pIfExpression);
967 ContainerTrace(visitor, m_pElseIfExpressions);
968 visitor->Trace(m_pElseExpression);
978 *js <<
"pfm_ret = 0;\n";
980 *js <<
"if (pfm_rt.get_val(";
981 if (!m_pExpression->ToJavaScript(js, ReturnType::kInferred))
988 if (m_pIfExpression) {
989 if (!m_pIfExpression->ToJavaScript(js, type))
995 for (
auto& expr : m_pElseIfExpressions) {
997 if (!expr->ToJavaScript(js, ReturnType::kInferred))
1001 if (m_pElseExpression) {
1003 if (!m_pElseExpression->ToJavaScript(js, type))
1009CXFA_FMWhileExpression::CXFA_FMWhileExpression(
1012 : m_pCondition(pCondition), m_pExpression(pExpression) {}
1016void CXFA_FMWhileExpression::
Trace(cppgc::Visitor* visitor)
const {
1017 CXFA_FMExpression::Trace(visitor);
1018 visitor->Trace(m_pCondition);
1019 visitor->Trace(m_pExpression);
1029 *js <<
"pfm_ret = 0;\n";
1032 if (!m_pCondition->ToJavaScript(js, ReturnType::kInferred))
1039 if (!m_pExpression->ToJavaScript(js, type))
1045CXFA_FMBreakExpression::CXFA_FMBreakExpression() =
default;
1055 *js <<
"pfm_ret = 0;\nbreak;\n";
1059CXFA_FMContinueExpression::CXFA_FMContinueExpression() =
default;
1069 *js <<
"pfm_ret = 0;\ncontinue;\n";
1073CXFA_FMForExpression::CXFA_FMForExpression(WideString wsVariant,
1079 : m_wsVariant(std::move(wsVariant)),
1080 m_bDirection(iDirection == 1),
1081 m_pAssignment(pAssignment),
1082 m_pAccessor(pAccessor),
1088void CXFA_FMForExpression::
Trace(cppgc::Visitor* visitor)
const {
1089 CXFA_FMExpression::Trace(visitor);
1090 visitor->Trace(m_pAssignment);
1091 visitor->Trace(m_pAccessor);
1092 visitor->Trace(m_pStep);
1093 visitor->Trace(m_pList);
1103 *js <<
"pfm_ret = 0;\n";
1107 WideString tmpName = IdentifierToName(m_wsVariant);
1108 *js <<
"var " << tmpName <<
" = null;\n";
1110 *js <<
"for (" << tmpName <<
" = pfm_rt.get_val(";
1111 if (!m_pAssignment->ToJavaScript(js, ReturnType::kInferred))
1115 *js << tmpName << (m_bDirection ? kLessEqual : kGreaterEqual);
1116 *js <<
"pfm_rt.get_val(";
1117 if (!m_pAccessor->ToJavaScript(js, ReturnType::kInferred))
1121 *js << tmpName << (m_bDirection ? kPlusEqual : kMinusEqual);
1123 *js <<
"pfm_rt.get_val(";
1124 if (!m_pStep->ToJavaScript(js, ReturnType::kInferred))
1134 if (!m_pList->ToJavaScript(js, type))
1141CXFA_FMForeachExpression::CXFA_FMForeachExpression(
1142 WideString wsIdentifier,
1143 std::vector<cppgc::Member<CXFA_FMSimpleExpression>>&& pAccessors,
1144 CXFA_FMExpression* pList)
1145 : m_wsIdentifier(std::move(wsIdentifier)),
1146 m_pAccessors(std::move(pAccessors)),
1151void CXFA_FMForeachExpression::
Trace(cppgc::Visitor* visitor)
const {
1152 CXFA_FMExpression::Trace(visitor);
1153 ContainerTrace(visitor, m_pAccessors);
1154 visitor->Trace(m_pList);
1164 *js <<
"pfm_ret = 0;\n";
1168 WideString tmpName = IdentifierToName(m_wsIdentifier);
1169 *js <<
"var " << tmpName <<
" = null;\n";
1170 *js <<
"var pfm_ary = pfm_rt.concat_obj(";
1171 for (
const auto& expr : m_pAccessors) {
1172 if (!expr->ToJavaScript(js, ReturnType::kInferred))
1174 if (expr != m_pAccessors.back())
1179 *js <<
"var pfm_ary_idx = 0;\n";
1180 *js <<
"while(pfm_ary_idx < pfm_ary.length)\n{\n";
1181 *js << tmpName <<
" = pfm_ary[pfm_ary_idx++];\n";
1182 if (!m_pList->ToJavaScript(js, type))
1191 return js.GetSize() >= 256 * 1024 * 1024;
absl::optional< WideTextBuffer > ToJavaScript() const
void Trace(cppgc::Visitor *visitor) const
bool ToJavaScript(WideTextBuffer *js, ReturnType type) const override
~CXFA_FMAssignExpression() override
~CXFA_FMBinExpression() override
bool ToJavaScript(WideTextBuffer *js, ReturnType type) const override
CXFA_FMBinExpression(const WideString &opName, XFA_FM_TOKEN op, CXFA_FMSimpleExpression *pExp1, CXFA_FMSimpleExpression *pExp2)
bool ToJavaScript(WideTextBuffer *js, ReturnType type) const override
void Trace(cppgc::Visitor *visitor) const override
~CXFA_FMBlockExpression() override
~CXFA_FMBreakExpression() override
bool ToJavaScript(WideTextBuffer *js, ReturnType type) const override
bool ToJavaScript(WideTextBuffer *js, ReturnType type) const override
~CXFA_FMCallExpression() override
uint32_t IsMethodWithObjParam(const WideString &methodName) const
bool IsBuiltInFunc(WideTextBuffer *funcName) const
void Trace(cppgc::Visitor *visitor) const override
void Trace(cppgc::Visitor *visitor) const override
~CXFA_FMChainableExpression() override
CXFA_FMSimpleExpression * GetSecondExpression() const
CXFA_FMChainableExpression(XFA_FM_TOKEN op, CXFA_FMSimpleExpression *pExp1, CXFA_FMSimpleExpression *pExp2)
CXFA_FMSimpleExpression * GetFirstExpression() const
bool ToJavaScript(WideTextBuffer *js, ReturnType type) const override
~CXFA_FMContinueExpression() override
~CXFA_FMDivExpression() override
~CXFA_FMDoExpression() override
void Trace(cppgc::Visitor *visitor) const override
bool ToJavaScript(WideTextBuffer *js, ReturnType type) const override
bool ToJavaScript(WideTextBuffer *js, ReturnType type) const override
~CXFA_FMDotAccessorExpression() override
bool ToJavaScript(WideTextBuffer *js, ReturnType type) const override
~CXFA_FMDotDotAccessorExpression() override
~CXFA_FMEqualExpression() override
void Trace(cppgc::Visitor *visitor) const override
bool ToJavaScript(WideTextBuffer *js, ReturnType type) const override
~CXFA_FMExpExpression() override
virtual void Trace(cppgc::Visitor *visitor) const
virtual ~CXFA_FMExpression()
virtual bool ToJavaScript(WideTextBuffer *js, ReturnType type) const =0
~CXFA_FMForExpression() override
bool ToJavaScript(WideTextBuffer *js, ReturnType type) const override
void Trace(cppgc::Visitor *visitor) const override
bool ToJavaScript(WideTextBuffer *js, ReturnType type) const override
void Trace(cppgc::Visitor *visitor) const override
~CXFA_FMForeachExpression() override
bool ToJavaScript(WideTextBuffer *js, ReturnType type) const override
void Trace(cppgc::Visitor *visitor) const override
~CXFA_FMFunctionDefinition() override
~CXFA_FMGeExpression() override
~CXFA_FMGtExpression() override
bool ToJavaScript(WideTextBuffer *js, ReturnType type) const override
~CXFA_FMIdentifierExpression() override
~CXFA_FMIfExpression() override
bool ToJavaScript(WideTextBuffer *js, ReturnType type) const override
void Trace(cppgc::Visitor *visitor) const override
bool ToJavaScript(WideTextBuffer *js, ReturnType type) const override
~CXFA_FMIndexExpression() override
void Trace(cppgc::Visitor *visitor) const override
~CXFA_FMLeExpression() override
~CXFA_FMLogicalAndExpression() override
~CXFA_FMLogicalOrExpression() override
~CXFA_FMLtExpression() override
~CXFA_FMMethodCallExpression() override
bool ToJavaScript(WideTextBuffer *js, ReturnType type) const override
~CXFA_FMMinusExpression() override
~CXFA_FMMulExpression() override
~CXFA_FMNegExpression() override
~CXFA_FMNotEqualExpression() override
~CXFA_FMNotExpression() override
bool ToJavaScript(WideTextBuffer *js, ReturnType type) const override
~CXFA_FMNullExpression() override
~CXFA_FMNumberExpression() override
bool ToJavaScript(WideTextBuffer *js, ReturnType type) const override
~CXFA_FMPlusExpression() override
~CXFA_FMPosExpression() override
CXFA_FMSimpleExpression(XFA_FM_TOKEN op)
~CXFA_FMSimpleExpression() override
XFA_FM_TOKEN GetOperatorToken() const
bool ToJavaScript(WideTextBuffer *js, ReturnType type) const override
~CXFA_FMStringExpression() override
bool IsWithinMaxDepth() const
~CXFA_FMUnaryExpression() override
CXFA_FMUnaryExpression(const WideString &opName, XFA_FM_TOKEN op, CXFA_FMSimpleExpression *pExp)
void Trace(cppgc::Visitor *visitor) const override
bool ToJavaScript(WideTextBuffer *js, ReturnType type) const override
~CXFA_FMVarExpression() override
bool ToJavaScript(WideTextBuffer *js, ReturnType type) const override
void Trace(cppgc::Visitor *visitor) const override
void Trace(cppgc::Visitor *visitor) const override
bool ToJavaScript(WideTextBuffer *js, ReturnType type) const override
~CXFA_FMWhileExpression() override
bool operator==(const wchar_t *ptr) const
CharType operator[](const size_t index) const
int CompareNoCase(const wchar_t *str) const
int Compare(const wchar_t *str) const
void AppendChar(wchar_t wch)
WideString MakeString() const
WideStringView AsStringView() const
bool CXFA_IsTooBig(const WideTextBuffer &js)