| Index: xfa/src/fxfa/src/fm2js/xfa_simpleexpression.cpp
|
| diff --git a/xfa/src/fxfa/src/fm2js/xfa_simpleexpression.cpp b/xfa/src/fxfa/src/fm2js/xfa_simpleexpression.cpp
|
| index b0ce3ad4ca4184b934b8186e52becdcf401bb95d..68faa7ae0cf646a45688872d601be0c9a13c557b 100644
|
| --- a/xfa/src/fxfa/src/fm2js/xfa_simpleexpression.cpp
|
| +++ b/xfa/src/fxfa/src/fm2js/xfa_simpleexpression.cpp
|
| @@ -5,7 +5,10 @@
|
| // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
|
|
|
| #include "xfa/src/fxfa/src/fm2js/xfa_fm2js.h"
|
| -static CFX_WideStringC gs_lpStrExpFuncName[] = {
|
| +
|
| +namespace {
|
| +
|
| +const CFX_WideStringC gs_lpStrExpFuncName[] = {
|
| FX_WSTRC(L"foxit_xfa_formcalc_runtime.assign_value_operator"),
|
| FX_WSTRC(L"foxit_xfa_formcalc_runtime.logical_or_operator"),
|
| FX_WSTRC(L"foxit_xfa_formcalc_runtime.logical_and_operator"),
|
| @@ -32,11 +35,12 @@ static CFX_WideStringC gs_lpStrExpFuncName[] = {
|
| FX_WSTRC(L"foxit_xfa_formcalc_runtime.get_fm_jsobj"),
|
| FX_WSTRC(L"foxit_xfa_formcalc_runtime.fm_var_filter"),
|
| };
|
| -CFX_WideStringC XFA_FM_EXPTypeToString(
|
| - XFA_FM_SimpleExpressionType simpleExpType) {
|
| - return gs_lpStrExpFuncName[simpleExpType];
|
| -}
|
| -static XFA_FMBuildInFunc buildInFuncs[] = {
|
| +
|
| +struct XFA_FMBuildInFunc {
|
| + uint32_t m_uHash;
|
| + const FX_WCHAR* m_buildinfunc;
|
| +};
|
| +const XFA_FMBuildInFunc g_BuildInFuncs[] = {
|
| {0x0001f1f5, L"At"}, {0x00020b9c, L"FV"},
|
| {0x00021aef, L"If"}, {0x00023ee6, L"PV"},
|
| {0x04b5c9ee, L"Encode"}, {0x08e96685, L"DateFmt"},
|
| @@ -71,7 +75,13 @@ static XFA_FMBuildInFunc buildInFuncs[] = {
|
| {0xea18d121, L"Choose"}, {0xebfef69c, L"Replace"},
|
| {0xf5ad782b, L"Left"}, {0xf7bb2248, L"Ltrim"},
|
| };
|
| -static const XFA_FMSOMMethod gs_FMSomMethods[] = {
|
| +
|
| +struct XFA_FMSOMMethod {
|
| + uint32_t m_uHash;
|
| + const FX_WCHAR* m_wsSomMethodName;
|
| + FX_DWORD m_dParameters;
|
| +};
|
| +const XFA_FMSOMMethod gs_FMSomMethods[] = {
|
| {0x00000068, L"h", 0x01},
|
| {0x00000077, L"w", 0x01},
|
| {0x00000078, L"x", 0x01},
|
| @@ -94,6 +104,14 @@ static const XFA_FMSOMMethod gs_FMSomMethods[] = {
|
| {0xda12e518, L"append", 0x01},
|
| {0xe74f0653, L"absPage", 0x01},
|
| };
|
| +
|
| +} // namespace
|
| +
|
| +CFX_WideStringC XFA_FM_EXPTypeToString(
|
| + XFA_FM_SimpleExpressionType simpleExpType) {
|
| + return gs_lpStrExpFuncName[simpleExpType];
|
| +}
|
| +
|
| CXFA_FMSimpleExpression::CXFA_FMSimpleExpression(FX_DWORD line, XFA_FM_TOKEN op)
|
| : m_line(line), m_op(op) {}
|
| void CXFA_FMSimpleExpression::ToJavaScript(CFX_WideTextBuf& javascript) {}
|
| @@ -174,10 +192,7 @@ CXFA_FMUnaryExpression::CXFA_FMUnaryExpression(FX_DWORD line,
|
| CXFA_FMSimpleExpression* pExp)
|
| : CXFA_FMSimpleExpression(line, op), m_pExp(pExp) {}
|
| CXFA_FMUnaryExpression::~CXFA_FMUnaryExpression() {
|
| - if (m_pExp != 0) {
|
| - delete m_pExp;
|
| - m_pExp = 0;
|
| - }
|
| + delete m_pExp;
|
| }
|
| void CXFA_FMUnaryExpression::ToJavaScript(CFX_WideTextBuf& javascript) {}
|
| CXFA_FMBinExpression::CXFA_FMBinExpression(FX_DWORD line,
|
| @@ -186,14 +201,8 @@ CXFA_FMBinExpression::CXFA_FMBinExpression(FX_DWORD line,
|
| CXFA_FMSimpleExpression* pExp2)
|
| : CXFA_FMSimpleExpression(line, op), m_pExp1(pExp1), m_pExp2(pExp2) {}
|
| CXFA_FMBinExpression::~CXFA_FMBinExpression() {
|
| - if (m_pExp1 != 0) {
|
| - delete m_pExp1;
|
| - m_pExp1 = 0;
|
| - }
|
| - if (m_pExp2 != 0) {
|
| - delete m_pExp2;
|
| - m_pExp2 = 0;
|
| - }
|
| + delete m_pExp1;
|
| + delete m_pExp2;
|
| }
|
| void CXFA_FMBinExpression::ToJavaScript(CFX_WideTextBuf& javascript) {}
|
| CXFA_FMAssignExpression::CXFA_FMAssignExpression(FX_DWORD line,
|
| @@ -446,29 +455,25 @@ CXFA_FMCallExpression::~CXFA_FMCallExpression() {
|
| m_pArguments = 0;
|
| }
|
| }
|
| -FX_BOOL CXFA_FMCallExpression::IsBuildInFunc(CFX_WideTextBuf& funcName) {
|
| - uint32_t uHash =
|
| - FX_HashCode_String_GetW(funcName.GetBuffer(), funcName.GetLength(), TRUE);
|
| - XFA_FMBuildInFunc buildinfunction;
|
| - int32_t iStart = 0,
|
| - iEnd = (sizeof(buildInFuncs) / sizeof(buildInFuncs[0])) - 1;
|
| - int32_t iMid = (iStart + iEnd) / 2;
|
| - do {
|
| - iMid = (iStart + iEnd) / 2;
|
| - buildinfunction = buildInFuncs[iMid];
|
| - if (uHash == buildinfunction.m_uHash) {
|
| - funcName.Clear();
|
| - funcName << buildinfunction.m_buildinfunc;
|
| - return TRUE;
|
| - } else if (uHash < buildinfunction.m_uHash) {
|
| - iEnd = iMid - 1;
|
| - } else {
|
| - iStart = iMid + 1;
|
| - }
|
| - } while (iStart <= iEnd);
|
| - return FALSE;
|
| +
|
| +bool CXFA_FMCallExpression::IsBuildInFunc(CFX_WideTextBuf* funcName) {
|
| + uint32_t uHash = FX_HashCode_String_GetW(funcName->GetBuffer(),
|
| + funcName->GetLength(), TRUE);
|
| + const XFA_FMBuildInFunc* pEnd = g_BuildInFuncs + FX_ArraySize(g_BuildInFuncs);
|
| + const XFA_FMBuildInFunc* pFunc =
|
| + std::lower_bound(g_BuildInFuncs, pEnd, uHash,
|
| + [](const XFA_FMBuildInFunc& func, uint32_t hash) {
|
| + return func.m_uHash < hash;
|
| + });
|
| + if (pFunc < pEnd && uHash == pFunc->m_uHash) {
|
| + funcName->Clear();
|
| + *funcName << pFunc->m_buildinfunc;
|
| + return true;
|
| + }
|
| + return false;
|
| }
|
| -FX_DWORD CXFA_FMCallExpression::IsSomMethodWithObjPara(
|
| +
|
| +FX_DWORD CXFA_FMCallExpression::IsMethodWithObjParam(
|
| const CFX_WideStringC& methodName) {
|
| int32_t iLength = methodName.GetLength();
|
| uint32_t uHash = FX_HashCode_String_GetW(methodName.GetPtr(), iLength);
|
| @@ -500,7 +505,7 @@ void CXFA_FMCallExpression::ToJavaScript(CFX_WideTextBuf& javascript) {
|
| if (m_pArguments) {
|
| int32_t argc = m_pArguments->GetSize();
|
| int32_t index = 0;
|
| - FX_DWORD methodPara = IsSomMethodWithObjPara(funcName.GetWideString());
|
| + FX_DWORD methodPara = IsMethodWithObjParam(funcName.GetWideString());
|
| if (methodPara > 0) {
|
| CXFA_FMSimpleExpression* e = 0;
|
| while (index < argc) {
|
| @@ -535,16 +540,16 @@ void CXFA_FMCallExpression::ToJavaScript(CFX_WideTextBuf& javascript) {
|
| }
|
| javascript << FX_WSTRC(L")");
|
| } else {
|
| - FX_BOOL isEvalFunc = FALSE;
|
| - FX_BOOL isExistsFunc = FALSE;
|
| - if (IsBuildInFunc(funcName)) {
|
| + bool isEvalFunc = false;
|
| + bool isExistsFunc = false;
|
| + if (IsBuildInFunc(&funcName)) {
|
| if (funcName.GetWideString() == FX_WSTRC(L"Eval")) {
|
| - isEvalFunc = TRUE;
|
| + isEvalFunc = true;
|
| javascript << FX_WSTRC(L"eval.call(this, ");
|
| javascript << gs_lpStrExpFuncName[CALL];
|
| javascript << FX_WSTRC(L"Translate");
|
| } else if (funcName.GetWideString() == FX_WSTRC(L"Exists")) {
|
| - isExistsFunc = TRUE;
|
| + isExistsFunc = true;
|
| javascript << gs_lpStrExpFuncName[CALL];
|
| javascript << funcName;
|
| } else {
|
|
|