Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(423)

Side by Side Diff: xfa/fxfa/fm2js/xfa_simpleexpression.cpp

Issue 2530933002: Use unique pointers in CXFA_FMParse (Closed)
Patch Set: Address comments Created 4 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « xfa/fxfa/fm2js/xfa_simpleexpression.h ('k') | xfa/fxfa/fm2js/xfa_simpleexpression_unittest.cpp » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2014 PDFium Authors. All rights reserved. 1 // Copyright 2014 PDFium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com 5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
6 6
7 #include "xfa/fxfa/fm2js/xfa_simpleexpression.h" 7 #include "xfa/fxfa/fm2js/xfa_simpleexpression.h"
8 8
9 #include <utility>
10
9 #include "core/fxcrt/fx_ext.h" 11 #include "core/fxcrt/fx_ext.h"
10 12
11 namespace { 13 namespace {
12 14
13 const FX_WCHAR* const gs_lpStrExpFuncName[] = { 15 const FX_WCHAR* const gs_lpStrExpFuncName[] = {
14 L"foxit_xfa_formcalc_runtime.assign_value_operator", 16 L"foxit_xfa_formcalc_runtime.assign_value_operator",
15 L"foxit_xfa_formcalc_runtime.logical_or_operator", 17 L"foxit_xfa_formcalc_runtime.logical_or_operator",
16 L"foxit_xfa_formcalc_runtime.logical_and_operator", 18 L"foxit_xfa_formcalc_runtime.logical_and_operator",
17 L"foxit_xfa_formcalc_runtime.equality_operator", 19 L"foxit_xfa_formcalc_runtime.equality_operator",
18 L"foxit_xfa_formcalc_runtime.notequality_operator", 20 L"foxit_xfa_formcalc_runtime.notequality_operator",
(...skipping 451 matching lines...) Expand 10 before | Expand all | Expand 10 after
470 void CXFA_FMNotExpression::ToJavaScript(CFX_WideTextBuf& javascript) { 472 void CXFA_FMNotExpression::ToJavaScript(CFX_WideTextBuf& javascript) {
471 javascript << gs_lpStrExpFuncName[NOT]; 473 javascript << gs_lpStrExpFuncName[NOT];
472 javascript << FX_WSTRC(L"("); 474 javascript << FX_WSTRC(L"(");
473 m_pExp->ToJavaScript(javascript); 475 m_pExp->ToJavaScript(javascript);
474 javascript << FX_WSTRC(L")"); 476 javascript << FX_WSTRC(L")");
475 } 477 }
476 478
477 CXFA_FMCallExpression::CXFA_FMCallExpression( 479 CXFA_FMCallExpression::CXFA_FMCallExpression(
478 uint32_t line, 480 uint32_t line,
479 CXFA_FMSimpleExpression* pExp, 481 CXFA_FMSimpleExpression* pExp,
480 CFX_ArrayTemplate<CXFA_FMSimpleExpression*>* pArguments, 482 std::vector<std::unique_ptr<CXFA_FMSimpleExpression>>&& pArguments,
481 bool bIsSomMethod) 483 bool bIsSomMethod)
482 : CXFA_FMUnaryExpression(line, TOKcall, pExp), 484 : CXFA_FMUnaryExpression(line, TOKcall, pExp),
483 m_bIsSomMethod(bIsSomMethod), 485 m_bIsSomMethod(bIsSomMethod),
484 m_pArguments(pArguments) {} 486 m_Arguments(std::move(pArguments)) {}
485 487
486 CXFA_FMCallExpression::~CXFA_FMCallExpression() { 488 CXFA_FMCallExpression::~CXFA_FMCallExpression() {}
487 if (m_pArguments) {
488 for (int i = 0; i < m_pArguments->GetSize(); ++i)
489 delete m_pArguments->GetAt(i);
490
491 delete m_pArguments;
492 }
493 }
494 489
495 bool CXFA_FMCallExpression::IsBuildInFunc(CFX_WideTextBuf* funcName) { 490 bool CXFA_FMCallExpression::IsBuildInFunc(CFX_WideTextBuf* funcName) {
496 uint32_t uHash = FX_HashCode_GetW(funcName->AsStringC(), true); 491 uint32_t uHash = FX_HashCode_GetW(funcName->AsStringC(), true);
497 const XFA_FMBuildInFunc* pEnd = g_BuildInFuncs + FX_ArraySize(g_BuildInFuncs); 492 const XFA_FMBuildInFunc* pEnd = g_BuildInFuncs + FX_ArraySize(g_BuildInFuncs);
498 const XFA_FMBuildInFunc* pFunc = 493 const XFA_FMBuildInFunc* pFunc =
499 std::lower_bound(g_BuildInFuncs, pEnd, uHash, 494 std::lower_bound(g_BuildInFuncs, pEnd, uHash,
500 [](const XFA_FMBuildInFunc& func, uint32_t hash) { 495 [](const XFA_FMBuildInFunc& func, uint32_t hash) {
501 return func.m_uHash < hash; 496 return func.m_uHash < hash;
502 }); 497 });
503 if (pFunc < pEnd && uHash == pFunc->m_uHash) { 498 if (pFunc < pEnd && uHash == pFunc->m_uHash) {
(...skipping 25 matching lines...) Expand all
529 } 524 }
530 } while (iStart <= iEnd); 525 } while (iStart <= iEnd);
531 return parameters; 526 return parameters;
532 } 527 }
533 528
534 void CXFA_FMCallExpression::ToJavaScript(CFX_WideTextBuf& javascript) { 529 void CXFA_FMCallExpression::ToJavaScript(CFX_WideTextBuf& javascript) {
535 CFX_WideTextBuf funcName; 530 CFX_WideTextBuf funcName;
536 m_pExp->ToJavaScript(funcName); 531 m_pExp->ToJavaScript(funcName);
537 if (m_bIsSomMethod) { 532 if (m_bIsSomMethod) {
538 javascript << funcName; 533 javascript << funcName;
539 javascript << FX_WSTRC(L"("); 534 javascript << L"(";
540 if (m_pArguments) { 535 uint32_t methodPara = IsMethodWithObjParam(funcName.AsStringC());
541 uint32_t methodPara = IsMethodWithObjParam(funcName.AsStringC()); 536 if (methodPara > 0) {
542 if (methodPara > 0) { 537 for (size_t i = 0; i < m_Arguments.size(); ++i) {
543 for (int i = 0; i < m_pArguments->GetSize(); ++i) { 538 // Currently none of our expressions use objects for a parameter over
544 // Currently none of our expressions use objects for a parameter over 539 // the 6th. Make sure we don't overflow the shift when doing this
545 // the 6th. Make sure we don't overflow the shift when doing this 540 // check. If we ever need more the 32 object params we can revisit.
546 // check. If we ever need more the 32 object params we can revisit. 541 if (i < 32 && (methodPara & (0x01 << i)) > 0) {
547 if (i < 32 && (methodPara & (0x01 << i)) > 0) { 542 javascript << gs_lpStrExpFuncName[GETFMJSOBJ];
548 javascript << gs_lpStrExpFuncName[GETFMJSOBJ]; 543 } else {
549 } else { 544 javascript << gs_lpStrExpFuncName[GETFMVALUE];
550 javascript << gs_lpStrExpFuncName[GETFMVALUE];
551 }
552 javascript << FX_WSTRC(L"(");
553 CXFA_FMSimpleExpression* e = m_pArguments->GetAt(i);
554 e->ToJavaScript(javascript);
555 javascript << FX_WSTRC(L")");
556 if (i + 1 < m_pArguments->GetSize()) {
557 javascript << FX_WSTRC(L", ");
558 }
559 } 545 }
560 } else { 546 javascript << L"(";
561 for (int i = 0; i < m_pArguments->GetSize(); ++i) { 547 const auto& expr = m_Arguments[i];
562 javascript << gs_lpStrExpFuncName[GETFMVALUE]; 548 expr->ToJavaScript(javascript);
563 javascript << FX_WSTRC(L"("); 549 javascript << L")";
564 CXFA_FMSimpleExpression* e = m_pArguments->GetAt(i); 550 if (i + 1 < m_Arguments.size()) {
565 e->ToJavaScript(javascript); 551 javascript << L", ";
566 javascript << FX_WSTRC(L")");
567 if (i + 1 < m_pArguments->GetSize()) {
568 javascript << FX_WSTRC(L", ");
569 }
570 } 552 }
571 } 553 }
554 } else {
555 for (const auto& expr : m_Arguments) {
556 javascript << gs_lpStrExpFuncName[GETFMVALUE];
557 javascript << L"(";
558 expr->ToJavaScript(javascript);
559 javascript << L")";
560 if (expr != m_Arguments.back())
561 javascript << L", ";
562 }
572 } 563 }
573 javascript << FX_WSTRC(L")"); 564 javascript << L")";
574 } else { 565 } else {
575 bool isEvalFunc = false; 566 bool isEvalFunc = false;
576 bool isExistsFunc = false; 567 bool isExistsFunc = false;
577 if (IsBuildInFunc(&funcName)) { 568 if (IsBuildInFunc(&funcName)) {
578 if (funcName.AsStringC() == FX_WSTRC(L"Eval")) { 569 if (funcName.AsStringC() == FX_WSTRC(L"Eval")) {
579 isEvalFunc = true; 570 isEvalFunc = true;
580 javascript << FX_WSTRC(L"eval.call(this, "); 571 javascript << FX_WSTRC(L"eval.call(this, ");
581 javascript << gs_lpStrExpFuncName[CALL]; 572 javascript << gs_lpStrExpFuncName[CALL];
582 javascript << FX_WSTRC(L"Translate"); 573 javascript << FX_WSTRC(L"Translate");
583 } else if (funcName.AsStringC() == FX_WSTRC(L"Exists")) { 574 } else if (funcName.AsStringC() == FX_WSTRC(L"Exists")) {
584 isExistsFunc = true; 575 isExistsFunc = true;
585 javascript << gs_lpStrExpFuncName[CALL]; 576 javascript << gs_lpStrExpFuncName[CALL];
586 javascript << funcName; 577 javascript << funcName;
587 } else { 578 } else {
588 javascript << gs_lpStrExpFuncName[CALL]; 579 javascript << gs_lpStrExpFuncName[CALL];
589 javascript << funcName; 580 javascript << funcName;
590 } 581 }
591 } else { 582 } else {
592 javascript << funcName; 583 javascript << funcName;
593 } 584 }
594 javascript << FX_WSTRC(L"("); 585 javascript << FX_WSTRC(L"(");
595 if (isExistsFunc) { 586 if (isExistsFunc) {
596 javascript << FX_WSTRC(L"\n(\nfunction ()\n{\ntry\n{\n"); 587 javascript << FX_WSTRC(L"\n(\nfunction ()\n{\ntry\n{\n");
597 if (m_pArguments && m_pArguments->GetSize() > 0) { 588 if (!m_Arguments.empty()) {
598 CXFA_FMSimpleExpression* e = m_pArguments->GetAt(0); 589 const auto& expr = m_Arguments[0];
599 javascript << FX_WSTRC(L"return "); 590 javascript << FX_WSTRC(L"return ");
600 e->ToJavaScript(javascript); 591 expr->ToJavaScript(javascript);
601 javascript << FX_WSTRC(L";\n}\n"); 592 javascript << FX_WSTRC(L";\n}\n");
602 } else { 593 } else {
603 javascript << FX_WSTRC(L"return 0;\n}\n"); 594 javascript << FX_WSTRC(L"return 0;\n}\n");
604 } 595 }
605 javascript << FX_WSTRC( 596 javascript << FX_WSTRC(
606 L"catch(accessExceptions)\n{\nreturn 0;\n}\n}\n).call(this)\n"); 597 L"catch(accessExceptions)\n{\nreturn 0;\n}\n}\n).call(this)\n");
607 } else if (m_pArguments) { 598 } else {
608 for (int i = 0; i < m_pArguments->GetSize(); ++i) { 599 for (const auto& expr : m_Arguments) {
609 CXFA_FMSimpleExpression* e = m_pArguments->GetAt(i); 600 expr->ToJavaScript(javascript);
610 e->ToJavaScript(javascript); 601 if (expr != m_Arguments.back())
611 if (i + 1 < m_pArguments->GetSize()) { 602 javascript << L", ";
612 javascript << FX_WSTRC(L", ");
613 }
614 } 603 }
615 } 604 }
616 javascript << FX_WSTRC(L")"); 605 javascript << L")";
617 if (isEvalFunc) { 606 if (isEvalFunc) {
618 javascript << FX_WSTRC(L")"); 607 javascript << L")";
619 } 608 }
620 } 609 }
621 } 610 }
622 611
623 CXFA_FMDotAccessorExpression::CXFA_FMDotAccessorExpression( 612 CXFA_FMDotAccessorExpression::CXFA_FMDotAccessorExpression(
624 uint32_t line, 613 uint32_t line,
625 CXFA_FMSimpleExpression* pAccessor, 614 CXFA_FMSimpleExpression* pAccessor,
626 XFA_FM_TOKEN op, 615 XFA_FM_TOKEN op,
627 CFX_WideStringC wsIdentifier, 616 CFX_WideStringC wsIdentifier,
628 CXFA_FMSimpleExpression* pIndexExp) 617 CXFA_FMSimpleExpression* pIndexExp)
(...skipping 117 matching lines...) Expand 10 before | Expand all | Expand 10 after
746 L"for(var index = accessor_object.length - 1; index > 1; index--)\n{\n"); 735 L"for(var index = accessor_object.length - 1; index > 1; index--)\n{\n");
747 javascript << FX_WSTRC(L"method_return_value = accessor_object[index]."); 736 javascript << FX_WSTRC(L"method_return_value = accessor_object[index].");
748 m_pExp2->ToJavaScript(javascript); 737 m_pExp2->ToJavaScript(javascript);
749 javascript << FX_WSTRC(L";\n}\n}\n"); 738 javascript << FX_WSTRC(L";\n}\n}\n");
750 javascript << FX_WSTRC(L"else\n{\nmethod_return_value = accessor_object."); 739 javascript << FX_WSTRC(L"else\n{\nmethod_return_value = accessor_object.");
751 m_pExp2->ToJavaScript(javascript); 740 m_pExp2->ToJavaScript(javascript);
752 javascript << FX_WSTRC(L";\n}\n"); 741 javascript << FX_WSTRC(L";\n}\n");
753 javascript << FX_WSTRC(L"return method_return_value;\n"); 742 javascript << FX_WSTRC(L"return method_return_value;\n");
754 javascript << FX_WSTRC(L"}\n).call(this)"); 743 javascript << FX_WSTRC(L"}\n).call(this)");
755 } 744 }
OLDNEW
« no previous file with comments | « xfa/fxfa/fm2js/xfa_simpleexpression.h ('k') | xfa/fxfa/fm2js/xfa_simpleexpression_unittest.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698