| OLD | NEW |
| (Empty) |
| 1 // Copyright 2014 PDFium Authors. All rights reserved. | |
| 2 // Use of this source code is governed by a BSD-style license that can be | |
| 3 // found in the LICENSE file. | |
| 4 | |
| 5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com | |
| 6 | |
| 7 #include "xfa/src/fxfa/fm2js/xfa_expression.h" | |
| 8 | |
| 9 #include "core/include/fxcrt/fx_basic.h" | |
| 10 | |
| 11 namespace { | |
| 12 | |
| 13 const CFX_WideStringC RUNTIMEBLOCKTEMPARRAY = | |
| 14 FX_WSTRC(L"foxit_xfa_formcalc_runtime_block_temp_array"); | |
| 15 | |
| 16 const CFX_WideStringC RUNTIMEBLOCKTEMPARRAYINDEX = | |
| 17 FX_WSTRC(L"foxit_xfa_formcalc_runtime_block_temp_array_index"); | |
| 18 | |
| 19 } // namespace | |
| 20 | |
| 21 CXFA_FMExpression::CXFA_FMExpression(FX_DWORD line) | |
| 22 : m_type(XFA_FM_EXPTYPE_UNKNOWN), m_line(line) {} | |
| 23 | |
| 24 CXFA_FMExpression::CXFA_FMExpression(FX_DWORD line, XFA_FM_EXPTYPE type) | |
| 25 : m_type(type), m_line(line) {} | |
| 26 | |
| 27 void CXFA_FMExpression::ToJavaScript(CFX_WideTextBuf& javascript) {} | |
| 28 | |
| 29 void CXFA_FMExpression::ToImpliedReturnJS(CFX_WideTextBuf& javascript) {} | |
| 30 | |
| 31 CXFA_FMFunctionDefinition::CXFA_FMFunctionDefinition( | |
| 32 FX_DWORD line, | |
| 33 FX_BOOL isGlobal, | |
| 34 const CFX_WideStringC& wsName, | |
| 35 CFX_WideStringCArray* pArguments, | |
| 36 CFX_PtrArray* pExpressions) | |
| 37 : CXFA_FMExpression(line, XFA_FM_EXPTYPE_FUNC), | |
| 38 m_wsName(wsName), | |
| 39 m_pArguments(pArguments), | |
| 40 m_pExpressions(pExpressions), | |
| 41 m_isGlobal(isGlobal) {} | |
| 42 | |
| 43 CXFA_FMFunctionDefinition::~CXFA_FMFunctionDefinition() { | |
| 44 if (m_pArguments) { | |
| 45 m_pArguments->RemoveAll(); | |
| 46 delete m_pArguments; | |
| 47 } | |
| 48 if (m_pExpressions) { | |
| 49 for (int i = 0; i < m_pExpressions->GetSize(); ++i) { | |
| 50 delete reinterpret_cast<CXFA_FMExpression*>(m_pExpressions->GetAt(i)); | |
| 51 } | |
| 52 m_pExpressions->RemoveAll(); | |
| 53 delete m_pExpressions; | |
| 54 } | |
| 55 } | |
| 56 | |
| 57 void CXFA_FMFunctionDefinition::ToJavaScript(CFX_WideTextBuf& javascript) { | |
| 58 if (m_isGlobal && (!m_pExpressions || m_pExpressions->GetSize() == 0)) { | |
| 59 javascript << FX_WSTRC(L"// comments only"); | |
| 60 return; | |
| 61 } | |
| 62 if (m_isGlobal) { | |
| 63 javascript << FX_WSTRC(L"(\n"); | |
| 64 } | |
| 65 javascript << FX_WSTRC(L"function "); | |
| 66 if (m_wsName.GetAt(0) == L'!') { | |
| 67 CFX_WideString tempName = EXCLAMATION_IN_IDENTIFIER + m_wsName.Mid(1); | |
| 68 javascript << tempName; | |
| 69 } else { | |
| 70 javascript << m_wsName; | |
| 71 } | |
| 72 javascript << FX_WSTRC(L"("); | |
| 73 if (m_pArguments != 0) { | |
| 74 CFX_WideStringC identifier = 0; | |
| 75 for (int i = 0; i < m_pArguments->GetSize(); ++i) { | |
| 76 identifier = m_pArguments->GetAt(i); | |
| 77 if (identifier.GetAt(0) == L'!') { | |
| 78 CFX_WideString tempIdentifier = | |
| 79 EXCLAMATION_IN_IDENTIFIER + identifier.Mid(1); | |
| 80 javascript << tempIdentifier; | |
| 81 } else { | |
| 82 javascript << identifier; | |
| 83 } | |
| 84 if (i + 1 < m_pArguments->GetSize()) { | |
| 85 javascript << FX_WSTRC(L", "); | |
| 86 } | |
| 87 } | |
| 88 } | |
| 89 javascript << FX_WSTRC(L")\n{\n"); | |
| 90 javascript << FX_WSTRC(L"var "); | |
| 91 javascript << RUNTIMEFUNCTIONRETURNVALUE; | |
| 92 javascript << FX_WSTRC(L" = null;\n"); | |
| 93 if (m_pExpressions) { | |
| 94 for (int i = 0; i < m_pExpressions->GetSize(); ++i) { | |
| 95 CXFA_FMExpression* e = | |
| 96 reinterpret_cast<CXFA_FMExpression*>(m_pExpressions->GetAt(i)); | |
| 97 if (i + 1 < m_pExpressions->GetSize()) { | |
| 98 e->ToJavaScript(javascript); | |
| 99 } else { | |
| 100 e->ToImpliedReturnJS(javascript); | |
| 101 } | |
| 102 } | |
| 103 } | |
| 104 javascript << FX_WSTRC(L"return "); | |
| 105 if (m_isGlobal) { | |
| 106 javascript << XFA_FM_EXPTypeToString(GETFMVALUE); | |
| 107 javascript << FX_WSTRC(L"("); | |
| 108 javascript << RUNTIMEFUNCTIONRETURNVALUE; | |
| 109 javascript << FX_WSTRC(L")"); | |
| 110 } else { | |
| 111 javascript << RUNTIMEFUNCTIONRETURNVALUE; | |
| 112 } | |
| 113 javascript << FX_WSTRC(L";\n}\n"); | |
| 114 if (m_isGlobal) { | |
| 115 javascript << FX_WSTRC(L").call(this);\n"); | |
| 116 } | |
| 117 } | |
| 118 | |
| 119 void CXFA_FMFunctionDefinition::ToImpliedReturnJS(CFX_WideTextBuf&) {} | |
| 120 | |
| 121 CXFA_FMVarExpression::CXFA_FMVarExpression(FX_DWORD line, | |
| 122 const CFX_WideStringC& wsName, | |
| 123 CXFA_FMExpression* pInit) | |
| 124 : CXFA_FMExpression(line, XFA_FM_EXPTYPE_VAR), | |
| 125 m_wsName(wsName), | |
| 126 m_pInit(pInit) {} | |
| 127 | |
| 128 void CXFA_FMVarExpression::ToJavaScript(CFX_WideTextBuf& javascript) { | |
| 129 javascript << FX_WSTRC(L"var "); | |
| 130 CFX_WideString tempName = m_wsName; | |
| 131 if (m_wsName.GetAt(0) == L'!') { | |
| 132 tempName = EXCLAMATION_IN_IDENTIFIER + m_wsName.Mid(1); | |
| 133 } | |
| 134 javascript << tempName; | |
| 135 javascript << FX_WSTRC(L" = "); | |
| 136 if (m_pInit) { | |
| 137 m_pInit->ToJavaScript(javascript); | |
| 138 javascript << tempName; | |
| 139 javascript << FX_WSTRC(L" = "); | |
| 140 javascript << XFA_FM_EXPTypeToString(VARFILTER); | |
| 141 javascript << FX_WSTRC(L"("); | |
| 142 javascript << tempName; | |
| 143 javascript << FX_WSTRC(L");\n"); | |
| 144 } else { | |
| 145 javascript << FX_WSTRC(L"\"\";\n"); | |
| 146 } | |
| 147 } | |
| 148 | |
| 149 void CXFA_FMVarExpression::ToImpliedReturnJS(CFX_WideTextBuf& javascript) { | |
| 150 javascript << FX_WSTRC(L"var "); | |
| 151 CFX_WideString tempName = m_wsName; | |
| 152 if (m_wsName.GetAt(0) == L'!') { | |
| 153 tempName = EXCLAMATION_IN_IDENTIFIER + m_wsName.Mid(1); | |
| 154 } | |
| 155 javascript << tempName; | |
| 156 javascript << FX_WSTRC(L" = "); | |
| 157 if (m_pInit) { | |
| 158 m_pInit->ToJavaScript(javascript); | |
| 159 javascript << tempName; | |
| 160 javascript << FX_WSTRC(L" = "); | |
| 161 javascript << XFA_FM_EXPTypeToString(VARFILTER); | |
| 162 javascript << FX_WSTRC(L"("); | |
| 163 javascript << tempName; | |
| 164 javascript << FX_WSTRC(L");\n"); | |
| 165 } else { | |
| 166 javascript << FX_WSTRC(L"\"\";\n"); | |
| 167 } | |
| 168 javascript << RUNTIMEFUNCTIONRETURNVALUE; | |
| 169 javascript << FX_WSTRC(L" = "); | |
| 170 javascript << tempName; | |
| 171 javascript << FX_WSTRC(L";\n"); | |
| 172 } | |
| 173 | |
| 174 CXFA_FMExpExpression::CXFA_FMExpExpression(FX_DWORD line, | |
| 175 CXFA_FMSimpleExpression* pExpression) | |
| 176 : CXFA_FMExpression(line, XFA_FM_EXPTYPE_EXP), m_pExpression(pExpression) {} | |
| 177 | |
| 178 void CXFA_FMExpExpression::ToJavaScript(CFX_WideTextBuf& javascript) { | |
| 179 if (m_pExpression->GetOperatorToken() == TOKassign) { | |
| 180 m_pExpression->ToJavaScript(javascript); | |
| 181 } else { | |
| 182 m_pExpression->ToJavaScript(javascript); | |
| 183 javascript << FX_WSTRC(L";\n"); | |
| 184 } | |
| 185 } | |
| 186 | |
| 187 void CXFA_FMExpExpression::ToImpliedReturnJS(CFX_WideTextBuf& javascript) { | |
| 188 if (m_pExpression->GetOperatorToken() == TOKassign) { | |
| 189 m_pExpression->ToImpliedReturnJS(javascript); | |
| 190 } else { | |
| 191 if (m_pExpression->GetOperatorToken() == TOKstar || | |
| 192 m_pExpression->GetOperatorToken() == TOKdotstar || | |
| 193 m_pExpression->GetOperatorToken() == TOKdotscream || | |
| 194 m_pExpression->GetOperatorToken() == TOKdotdot || | |
| 195 m_pExpression->GetOperatorToken() == TOKdot) { | |
| 196 javascript << RUNTIMEFUNCTIONRETURNVALUE; | |
| 197 javascript << FX_WSTRC(L" = "); | |
| 198 javascript << XFA_FM_EXPTypeToString(GETFMVALUE); | |
| 199 javascript << FX_WSTRC(L"("); | |
| 200 m_pExpression->ToJavaScript(javascript); | |
| 201 javascript << FX_WSTRC(L");\n"); | |
| 202 } else { | |
| 203 javascript << RUNTIMEFUNCTIONRETURNVALUE; | |
| 204 javascript << FX_WSTRC(L" = "); | |
| 205 m_pExpression->ToJavaScript(javascript); | |
| 206 javascript << FX_WSTRC(L";\n"); | |
| 207 } | |
| 208 } | |
| 209 } | |
| 210 | |
| 211 CXFA_FMBlockExpression::CXFA_FMBlockExpression(FX_DWORD line, | |
| 212 CFX_PtrArray* pExpressionList) | |
| 213 : CXFA_FMExpression(line, XFA_FM_EXPTYPE_BLOCK), | |
| 214 m_pExpressionList(pExpressionList) {} | |
| 215 | |
| 216 CXFA_FMBlockExpression::~CXFA_FMBlockExpression() { | |
| 217 if (m_pExpressionList) { | |
| 218 for (int i = 0; i < m_pExpressionList->GetSize(); ++i) { | |
| 219 delete reinterpret_cast<CXFA_FMExpression*>(m_pExpressionList->GetAt(i)); | |
| 220 } | |
| 221 m_pExpressionList->RemoveAll(); | |
| 222 delete m_pExpressionList; | |
| 223 } | |
| 224 } | |
| 225 | |
| 226 void CXFA_FMBlockExpression::ToJavaScript(CFX_WideTextBuf& javascript) { | |
| 227 javascript << FX_WSTRC(L"{\n"); | |
| 228 if (m_pExpressionList) { | |
| 229 for (int i = 0; i < m_pExpressionList->GetSize(); ++i) { | |
| 230 CXFA_FMExpression* e = | |
| 231 reinterpret_cast<CXFA_FMExpression*>(m_pExpressionList->GetAt(i)); | |
| 232 e->ToJavaScript(javascript); | |
| 233 } | |
| 234 } | |
| 235 javascript << FX_WSTRC(L"}\n"); | |
| 236 } | |
| 237 | |
| 238 void CXFA_FMBlockExpression::ToImpliedReturnJS(CFX_WideTextBuf& javascript) { | |
| 239 javascript << FX_WSTRC(L"{\n"); | |
| 240 if (m_pExpressionList) { | |
| 241 for (int i = 0; i < m_pExpressionList->GetSize(); ++i) { | |
| 242 CXFA_FMExpression* e = | |
| 243 reinterpret_cast<CXFA_FMExpression*>(m_pExpressionList->GetAt(i)); | |
| 244 if (i + 1 == m_pExpressionList->GetSize()) { | |
| 245 e->ToImpliedReturnJS(javascript); | |
| 246 } else { | |
| 247 e->ToJavaScript(javascript); | |
| 248 } | |
| 249 } | |
| 250 } | |
| 251 javascript << FX_WSTRC(L"}\n"); | |
| 252 } | |
| 253 | |
| 254 CXFA_FMDoExpression::CXFA_FMDoExpression(FX_DWORD line, | |
| 255 CXFA_FMExpression* pList) | |
| 256 : CXFA_FMExpression(line), m_pList(pList) {} | |
| 257 | |
| 258 void CXFA_FMDoExpression::ToJavaScript(CFX_WideTextBuf& javascript) { | |
| 259 m_pList->ToJavaScript(javascript); | |
| 260 } | |
| 261 | |
| 262 void CXFA_FMDoExpression::ToImpliedReturnJS(CFX_WideTextBuf& javascript) { | |
| 263 m_pList->ToImpliedReturnJS(javascript); | |
| 264 } | |
| 265 | |
| 266 CXFA_FMIfExpression::CXFA_FMIfExpression(FX_DWORD line, | |
| 267 CXFA_FMSimpleExpression* pExpression, | |
| 268 CXFA_FMExpression* pIfExpression, | |
| 269 CXFA_FMExpression* pElseExpression) | |
| 270 : CXFA_FMExpression(line, XFA_FM_EXPTYPE_IF), | |
| 271 m_pExpression(pExpression), | |
| 272 m_pIfExpression(pIfExpression), | |
| 273 m_pElseExpression(pElseExpression) {} | |
| 274 | |
| 275 void CXFA_FMIfExpression::ToJavaScript(CFX_WideTextBuf& javascript) { | |
| 276 javascript << FX_WSTRC(L"if ("); | |
| 277 if (m_pExpression) { | |
| 278 javascript << XFA_FM_EXPTypeToString(GETFMVALUE); | |
| 279 javascript << FX_WSTRC(L"("); | |
| 280 m_pExpression->ToJavaScript(javascript); | |
| 281 javascript << FX_WSTRC(L")"); | |
| 282 } | |
| 283 javascript << FX_WSTRC(L")\n"); | |
| 284 if (m_pIfExpression) { | |
| 285 m_pIfExpression->ToJavaScript(javascript); | |
| 286 } | |
| 287 if (m_pElseExpression) { | |
| 288 if (m_pElseExpression->GetExpType() == XFA_FM_EXPTYPE_IF) { | |
| 289 javascript << FX_WSTRC(L"else\n"); | |
| 290 javascript << FX_WSTRC(L"{\n"); | |
| 291 m_pElseExpression->ToJavaScript(javascript); | |
| 292 javascript << FX_WSTRC(L"}\n"); | |
| 293 } else { | |
| 294 javascript << FX_WSTRC(L"else\n"); | |
| 295 m_pElseExpression->ToJavaScript(javascript); | |
| 296 } | |
| 297 } | |
| 298 } | |
| 299 | |
| 300 void CXFA_FMIfExpression::ToImpliedReturnJS(CFX_WideTextBuf& javascript) { | |
| 301 javascript << RUNTIMEFUNCTIONRETURNVALUE; | |
| 302 javascript << FX_WSTRC(L" = 0;\n"); | |
| 303 javascript << FX_WSTRC(L"if ("); | |
| 304 if (m_pExpression) { | |
| 305 javascript << XFA_FM_EXPTypeToString(GETFMVALUE); | |
| 306 javascript << FX_WSTRC(L"("); | |
| 307 m_pExpression->ToJavaScript(javascript); | |
| 308 javascript << FX_WSTRC(L")"); | |
| 309 } | |
| 310 javascript << FX_WSTRC(L")\n"); | |
| 311 if (m_pIfExpression) { | |
| 312 m_pIfExpression->ToImpliedReturnJS(javascript); | |
| 313 } | |
| 314 if (m_pElseExpression) { | |
| 315 if (m_pElseExpression->GetExpType() == XFA_FM_EXPTYPE_IF) { | |
| 316 javascript << FX_WSTRC(L"else\n"); | |
| 317 javascript << FX_WSTRC(L"{\n"); | |
| 318 m_pElseExpression->ToImpliedReturnJS(javascript); | |
| 319 javascript << FX_WSTRC(L"}\n"); | |
| 320 } else { | |
| 321 javascript << FX_WSTRC(L"else\n"); | |
| 322 m_pElseExpression->ToImpliedReturnJS(javascript); | |
| 323 } | |
| 324 } | |
| 325 } | |
| 326 | |
| 327 CXFA_FMLoopExpression::~CXFA_FMLoopExpression() {} | |
| 328 | |
| 329 void CXFA_FMLoopExpression::ToJavaScript(CFX_WideTextBuf& javascript) {} | |
| 330 | |
| 331 void CXFA_FMLoopExpression::ToImpliedReturnJS(CFX_WideTextBuf&) {} | |
| 332 | |
| 333 CXFA_FMWhileExpression::CXFA_FMWhileExpression( | |
| 334 FX_DWORD line, | |
| 335 CXFA_FMSimpleExpression* pCondition, | |
| 336 CXFA_FMExpression* pExpression) | |
| 337 : CXFA_FMLoopExpression(line), | |
| 338 m_pCondition(pCondition), | |
| 339 m_pExpression(pExpression) {} | |
| 340 | |
| 341 void CXFA_FMWhileExpression::ToJavaScript(CFX_WideTextBuf& javascript) { | |
| 342 javascript << FX_WSTRC(L"while ("); | |
| 343 m_pCondition->ToJavaScript(javascript); | |
| 344 javascript << FX_WSTRC(L")\n"); | |
| 345 m_pExpression->ToJavaScript(javascript); | |
| 346 } | |
| 347 | |
| 348 void CXFA_FMWhileExpression::ToImpliedReturnJS(CFX_WideTextBuf& javascript) { | |
| 349 javascript << RUNTIMEFUNCTIONRETURNVALUE; | |
| 350 javascript << FX_WSTRC(L" = 0;\n"); | |
| 351 javascript << FX_WSTRC(L"while ("); | |
| 352 m_pCondition->ToJavaScript(javascript); | |
| 353 javascript << FX_WSTRC(L")\n"); | |
| 354 m_pExpression->ToImpliedReturnJS(javascript); | |
| 355 } | |
| 356 | |
| 357 CXFA_FMBreakExpression::CXFA_FMBreakExpression(FX_DWORD line) | |
| 358 : CXFA_FMExpression(line, XFA_FM_EXPTYPE_BREAK) {} | |
| 359 | |
| 360 CXFA_FMBreakExpression::~CXFA_FMBreakExpression() {} | |
| 361 | |
| 362 void CXFA_FMBreakExpression::ToJavaScript(CFX_WideTextBuf& javascript) { | |
| 363 javascript << RUNTIMEFUNCTIONRETURNVALUE; | |
| 364 javascript << FX_WSTRC(L" = 0;\n"); | |
| 365 javascript << FX_WSTRC(L"break;\n"); | |
| 366 } | |
| 367 | |
| 368 void CXFA_FMBreakExpression::ToImpliedReturnJS(CFX_WideTextBuf& javascript) { | |
| 369 javascript << RUNTIMEFUNCTIONRETURNVALUE; | |
| 370 javascript << FX_WSTRC(L" = 0;\n"); | |
| 371 javascript << FX_WSTRC(L"break;\n"); | |
| 372 } | |
| 373 | |
| 374 CXFA_FMContinueExpression::CXFA_FMContinueExpression(FX_DWORD line) | |
| 375 : CXFA_FMExpression(line, XFA_FM_EXPTYPE_CONTINUE) {} | |
| 376 | |
| 377 CXFA_FMContinueExpression::~CXFA_FMContinueExpression() {} | |
| 378 | |
| 379 void CXFA_FMContinueExpression::ToJavaScript(CFX_WideTextBuf& javascript) { | |
| 380 javascript << RUNTIMEFUNCTIONRETURNVALUE; | |
| 381 javascript << FX_WSTRC(L" = 0;\n"); | |
| 382 javascript << FX_WSTRC(L"continue;\n"); | |
| 383 } | |
| 384 | |
| 385 void CXFA_FMContinueExpression::ToImpliedReturnJS(CFX_WideTextBuf& javascript) { | |
| 386 javascript << RUNTIMEFUNCTIONRETURNVALUE; | |
| 387 javascript << FX_WSTRC(L" = 0;\n"); | |
| 388 javascript << FX_WSTRC(L"continue;\n"); | |
| 389 } | |
| 390 | |
| 391 CXFA_FMForExpression::CXFA_FMForExpression(FX_DWORD line, | |
| 392 const CFX_WideStringC& wsVariant, | |
| 393 CXFA_FMSimpleExpression* pAssignment, | |
| 394 CXFA_FMSimpleExpression* pAccessor, | |
| 395 int32_t iDirection, | |
| 396 CXFA_FMSimpleExpression* pStep, | |
| 397 CXFA_FMExpression* pList) | |
| 398 : CXFA_FMLoopExpression(line), | |
| 399 m_wsVariant(wsVariant), | |
| 400 m_pAssignment(pAssignment), | |
| 401 m_pAccessor(pAccessor), | |
| 402 m_iDirection(iDirection), | |
| 403 m_pStep(pStep), | |
| 404 m_pList(pList) {} | |
| 405 | |
| 406 void CXFA_FMForExpression::ToJavaScript(CFX_WideTextBuf& javascript) { | |
| 407 javascript << FX_WSTRC(L"{\nvar "); | |
| 408 CFX_WideString tempVariant; | |
| 409 if (m_wsVariant.GetAt(0) == L'!') { | |
| 410 tempVariant = EXCLAMATION_IN_IDENTIFIER + m_wsVariant.Mid(1); | |
| 411 javascript << tempVariant; | |
| 412 } else { | |
| 413 tempVariant = m_wsVariant; | |
| 414 javascript << m_wsVariant; | |
| 415 } | |
| 416 javascript << FX_WSTRC(L" = null;\n"); | |
| 417 javascript << FX_WSTRC(L"for ("); | |
| 418 javascript << tempVariant; | |
| 419 javascript << FX_WSTRC(L" = "); | |
| 420 javascript << XFA_FM_EXPTypeToString(GETFMVALUE); | |
| 421 javascript << FX_WSTRC(L"("); | |
| 422 m_pAssignment->ToJavaScript(javascript); | |
| 423 javascript << FX_WSTRC(L"); "); | |
| 424 javascript << tempVariant; | |
| 425 if (m_iDirection == 1) { | |
| 426 javascript << FX_WSTRC(L" <= "); | |
| 427 javascript << XFA_FM_EXPTypeToString(GETFMVALUE); | |
| 428 javascript << FX_WSTRC(L"("); | |
| 429 m_pAccessor->ToJavaScript(javascript); | |
| 430 javascript << FX_WSTRC(L"); "); | |
| 431 javascript << tempVariant; | |
| 432 javascript << FX_WSTRC(L" += "); | |
| 433 } else { | |
| 434 javascript << FX_WSTRC(L" >= "); | |
| 435 javascript << XFA_FM_EXPTypeToString(GETFMVALUE); | |
| 436 javascript << FX_WSTRC(L"("); | |
| 437 m_pAccessor->ToJavaScript(javascript); | |
| 438 javascript << FX_WSTRC(L"); "); | |
| 439 javascript << tempVariant; | |
| 440 javascript << FX_WSTRC(L" -= "); | |
| 441 } | |
| 442 if (m_pStep) { | |
| 443 javascript << XFA_FM_EXPTypeToString(GETFMVALUE); | |
| 444 javascript << FX_WSTRC(L"("); | |
| 445 m_pStep->ToJavaScript(javascript); | |
| 446 javascript << FX_WSTRC(L")"); | |
| 447 } else { | |
| 448 javascript << FX_WSTRC(L"1"); | |
| 449 } | |
| 450 javascript << FX_WSTRC(L")\n"); | |
| 451 m_pList->ToJavaScript(javascript); | |
| 452 javascript << FX_WSTRC(L"}\n"); | |
| 453 } | |
| 454 | |
| 455 void CXFA_FMForExpression::ToImpliedReturnJS(CFX_WideTextBuf& javascript) { | |
| 456 javascript << RUNTIMEFUNCTIONRETURNVALUE; | |
| 457 javascript << FX_WSTRC(L" = 0;\n"); | |
| 458 javascript << FX_WSTRC(L"{\nvar "); | |
| 459 CFX_WideString tempVariant; | |
| 460 if (m_wsVariant.GetAt(0) == L'!') { | |
| 461 tempVariant = EXCLAMATION_IN_IDENTIFIER + m_wsVariant.Mid(1); | |
| 462 javascript << tempVariant; | |
| 463 } else { | |
| 464 tempVariant = m_wsVariant; | |
| 465 javascript << m_wsVariant; | |
| 466 } | |
| 467 javascript << FX_WSTRC(L" = null;\n"); | |
| 468 javascript << FX_WSTRC(L"for ("); | |
| 469 javascript << tempVariant; | |
| 470 javascript << FX_WSTRC(L" = "); | |
| 471 javascript << XFA_FM_EXPTypeToString(GETFMVALUE); | |
| 472 javascript << FX_WSTRC(L"("); | |
| 473 m_pAssignment->ToJavaScript(javascript); | |
| 474 javascript << FX_WSTRC(L"); "); | |
| 475 javascript << tempVariant; | |
| 476 if (m_iDirection == 1) { | |
| 477 javascript << FX_WSTRC(L" <= "); | |
| 478 javascript << XFA_FM_EXPTypeToString(GETFMVALUE); | |
| 479 javascript << FX_WSTRC(L"("); | |
| 480 m_pAccessor->ToJavaScript(javascript); | |
| 481 javascript << FX_WSTRC(L"); "); | |
| 482 javascript << tempVariant; | |
| 483 javascript << FX_WSTRC(L" += "); | |
| 484 } else { | |
| 485 javascript << FX_WSTRC(L" >= "); | |
| 486 javascript << XFA_FM_EXPTypeToString(GETFMVALUE); | |
| 487 javascript << FX_WSTRC(L"("); | |
| 488 m_pAccessor->ToJavaScript(javascript); | |
| 489 javascript << FX_WSTRC(L"); "); | |
| 490 javascript << tempVariant; | |
| 491 javascript << FX_WSTRC(L" -= "); | |
| 492 } | |
| 493 if (m_pStep) { | |
| 494 javascript << XFA_FM_EXPTypeToString(GETFMVALUE); | |
| 495 javascript << FX_WSTRC(L"("); | |
| 496 m_pStep->ToJavaScript(javascript); | |
| 497 javascript << FX_WSTRC(L")"); | |
| 498 } else { | |
| 499 javascript << FX_WSTRC(L"1"); | |
| 500 } | |
| 501 javascript << FX_WSTRC(L")\n"); | |
| 502 m_pList->ToImpliedReturnJS(javascript); | |
| 503 javascript << FX_WSTRC(L"}\n"); | |
| 504 } | |
| 505 | |
| 506 CXFA_FMForeachExpression::CXFA_FMForeachExpression( | |
| 507 FX_DWORD line, | |
| 508 const CFX_WideStringC& wsIdentifier, | |
| 509 CFX_PtrArray* pAccessors, | |
| 510 CXFA_FMExpression* pList) | |
| 511 : CXFA_FMLoopExpression(line), | |
| 512 m_wsIdentifier(wsIdentifier), | |
| 513 m_pAccessors(pAccessors), | |
| 514 m_pList(pList) {} | |
| 515 | |
| 516 CXFA_FMForeachExpression::~CXFA_FMForeachExpression() { | |
| 517 if (m_pAccessors) { | |
| 518 for (int i = 0; i < m_pAccessors->GetSize(); ++i) { | |
| 519 delete reinterpret_cast<CXFA_FMSimpleExpression*>(m_pAccessors->GetAt(i)); | |
| 520 } | |
| 521 m_pAccessors->RemoveAll(); | |
| 522 delete m_pAccessors; | |
| 523 } | |
| 524 } | |
| 525 | |
| 526 void CXFA_FMForeachExpression::ToJavaScript(CFX_WideTextBuf& javascript) { | |
| 527 javascript << FX_WSTRC(L"{\n"); | |
| 528 javascript << FX_WSTRC(L"var "); | |
| 529 if (m_wsIdentifier.GetAt(0) == L'!') { | |
| 530 CFX_WideString tempIdentifier = | |
| 531 EXCLAMATION_IN_IDENTIFIER + m_wsIdentifier.Mid(1); | |
| 532 javascript << tempIdentifier; | |
| 533 } else { | |
| 534 javascript << m_wsIdentifier; | |
| 535 } | |
| 536 javascript << FX_WSTRC(L" = null;\n"); | |
| 537 javascript << FX_WSTRC(L"var "); | |
| 538 javascript << RUNTIMEBLOCKTEMPARRAY; | |
| 539 javascript << FX_WSTRC(L" = "); | |
| 540 javascript << XFA_FM_EXPTypeToString(CONCATFMOBJECT); | |
| 541 javascript << FX_WSTRC(L"("); | |
| 542 | |
| 543 for (int i = 0; i < m_pAccessors->GetSize(); ++i) { | |
| 544 CXFA_FMSimpleExpression* s = | |
| 545 reinterpret_cast<CXFA_FMSimpleExpression*>(m_pAccessors->GetAt(i)); | |
| 546 s->ToJavaScript(javascript); | |
| 547 if (i + 1 < m_pAccessors->GetSize()) { | |
| 548 javascript << FX_WSTRC(L", "); | |
| 549 } | |
| 550 } | |
| 551 javascript << FX_WSTRC(L");\n"); | |
| 552 javascript << FX_WSTRC(L"var "); | |
| 553 javascript << RUNTIMEBLOCKTEMPARRAYINDEX; | |
| 554 javascript << FX_WSTRC(L" = 0;\n"); | |
| 555 javascript << FX_WSTRC(L"while("); | |
| 556 javascript << RUNTIMEBLOCKTEMPARRAYINDEX; | |
| 557 javascript << FX_WSTRC(L" < "); | |
| 558 javascript << RUNTIMEBLOCKTEMPARRAY; | |
| 559 javascript << FX_WSTRC(L".length)\n{\n"); | |
| 560 if (m_wsIdentifier.GetAt(0) == L'!') { | |
| 561 CFX_WideString tempIdentifier = | |
| 562 EXCLAMATION_IN_IDENTIFIER + m_wsIdentifier.Mid(1); | |
| 563 javascript << tempIdentifier; | |
| 564 } else { | |
| 565 javascript << m_wsIdentifier; | |
| 566 } | |
| 567 javascript << FX_WSTRC(L" = "); | |
| 568 javascript << RUNTIMEBLOCKTEMPARRAY; | |
| 569 javascript << FX_WSTRC(L"["); | |
| 570 javascript << RUNTIMEBLOCKTEMPARRAYINDEX; | |
| 571 javascript << FX_WSTRC(L"++];\n"); | |
| 572 m_pList->ToJavaScript(javascript); | |
| 573 javascript << FX_WSTRC(L"}\n"); | |
| 574 javascript << FX_WSTRC(L"}\n"); | |
| 575 } | |
| 576 | |
| 577 void CXFA_FMForeachExpression::ToImpliedReturnJS(CFX_WideTextBuf& javascript) { | |
| 578 javascript << RUNTIMEFUNCTIONRETURNVALUE; | |
| 579 javascript << FX_WSTRC(L" = 0;\n"); | |
| 580 javascript << FX_WSTRC(L"{\n"); | |
| 581 javascript << FX_WSTRC(L"var "); | |
| 582 if (m_wsIdentifier.GetAt(0) == L'!') { | |
| 583 CFX_WideString tempIdentifier = | |
| 584 EXCLAMATION_IN_IDENTIFIER + m_wsIdentifier.Mid(1); | |
| 585 javascript << tempIdentifier; | |
| 586 } else { | |
| 587 javascript << m_wsIdentifier; | |
| 588 } | |
| 589 javascript << FX_WSTRC(L" = null;\n"); | |
| 590 javascript << FX_WSTRC(L"var "); | |
| 591 javascript << RUNTIMEBLOCKTEMPARRAY; | |
| 592 javascript << FX_WSTRC(L" = "); | |
| 593 javascript << XFA_FM_EXPTypeToString(CONCATFMOBJECT); | |
| 594 javascript << FX_WSTRC(L"("); | |
| 595 for (int i = 0; i < m_pAccessors->GetSize(); ++i) { | |
| 596 CXFA_FMSimpleExpression* s = | |
| 597 reinterpret_cast<CXFA_FMSimpleExpression*>(m_pAccessors->GetAt(i)); | |
| 598 s->ToJavaScript(javascript); | |
| 599 if (i + 1 < m_pAccessors->GetSize()) { | |
| 600 javascript << FX_WSTRC(L", "); | |
| 601 } | |
| 602 } | |
| 603 javascript << FX_WSTRC(L");\n"); | |
| 604 javascript << FX_WSTRC(L"var "); | |
| 605 javascript << RUNTIMEBLOCKTEMPARRAYINDEX; | |
| 606 javascript << FX_WSTRC(L" = 0;\n"); | |
| 607 javascript << FX_WSTRC(L"while("); | |
| 608 javascript << RUNTIMEBLOCKTEMPARRAYINDEX; | |
| 609 javascript << FX_WSTRC(L" < "); | |
| 610 javascript << RUNTIMEBLOCKTEMPARRAY; | |
| 611 javascript << FX_WSTRC(L".length)\n{\n"); | |
| 612 if (m_wsIdentifier.GetAt(0) == L'!') { | |
| 613 CFX_WideString tempIdentifier = | |
| 614 EXCLAMATION_IN_IDENTIFIER + m_wsIdentifier.Mid(1); | |
| 615 javascript << tempIdentifier; | |
| 616 } else { | |
| 617 javascript << m_wsIdentifier; | |
| 618 } | |
| 619 javascript << FX_WSTRC(L" = "); | |
| 620 javascript << RUNTIMEBLOCKTEMPARRAY; | |
| 621 javascript << FX_WSTRC(L"["); | |
| 622 javascript << RUNTIMEBLOCKTEMPARRAYINDEX; | |
| 623 javascript << FX_WSTRC(L"++];\n"); | |
| 624 m_pList->ToImpliedReturnJS(javascript); | |
| 625 javascript << FX_WSTRC(L"}\n"); | |
| 626 javascript << FX_WSTRC(L"}\n"); | |
| 627 } | |
| OLD | NEW |