Chromium Code Reviews| OLD | NEW |
|---|---|
| 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_fm2jscontext.h" | 7 #include "xfa/fxfa/fm2js/xfa_fm2jscontext.h" |
| 8 | 8 |
| 9 #include <time.h> | 9 #include <time.h> |
| 10 | 10 |
| (...skipping 5500 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 5511 args.GetReturnValue()->SetInteger((first == 0.0) ? 1 : 0); | 5511 args.GetReturnValue()->SetInteger((first == 0.0) ? 1 : 0); |
| 5512 } | 5512 } |
| 5513 | 5513 |
| 5514 // static | 5514 // static |
| 5515 void CXFA_FM2JSContext::dot_accessor(CFXJSE_Value* pThis, | 5515 void CXFA_FM2JSContext::dot_accessor(CFXJSE_Value* pThis, |
| 5516 const CFX_ByteStringC& szFuncName, | 5516 const CFX_ByteStringC& szFuncName, |
| 5517 CFXJSE_Arguments& args) { | 5517 CFXJSE_Arguments& args) { |
| 5518 CXFA_FM2JSContext* pContext = ToJSContext(pThis, nullptr); | 5518 CXFA_FM2JSContext* pContext = ToJSContext(pThis, nullptr); |
| 5519 v8::Isolate* pIsolate = pContext->GetScriptRuntime(); | 5519 v8::Isolate* pIsolate = pContext->GetScriptRuntime(); |
| 5520 int32_t argc = args.GetLength(); | 5520 int32_t argc = args.GetLength(); |
| 5521 if ((argc == 4) || (argc == 5)) { | 5521 if (argc < 4 || argc > 5) { |
| 5522 FX_BOOL bIsStar = TRUE; | 5522 pContext->ThrowException(XFA_IDS_COMPILER_ERROR); |
|
Tom Sepez
2016/06/09 18:15:56
nit: Is this the right error? I thought the other
dsinclair
2016/06/09 18:23:58
I think this makes sense. In the cases above here
| |
| 5523 std::unique_ptr<CFXJSE_Value> argAccessor = args.GetValue(0); | 5523 return; |
| 5524 CFX_ByteString bsAccessorName = args.GetUTF8String(1); | 5524 } |
| 5525 CFX_ByteString szName = args.GetUTF8String(2); | |
| 5526 int32_t iIndexFlags = args.GetInt32(3); | |
| 5527 int32_t iIndexValue = 0; | |
| 5528 if (argc > 4) { | |
| 5529 bIsStar = FALSE; | |
| 5530 std::unique_ptr<CFXJSE_Value> argIndex = args.GetValue(4); | |
| 5531 iIndexValue = ValueToInteger(pThis, argIndex.get()); | |
| 5532 } | |
| 5533 CFX_ByteString szSomExp; | |
| 5534 GenerateSomExpression(szName.AsStringC(), iIndexFlags, iIndexValue, bIsStar, | |
| 5535 szSomExp); | |
| 5536 if (argAccessor->IsArray()) { | |
| 5537 std::unique_ptr<CFXJSE_Value> pLengthValue(new CFXJSE_Value(pIsolate)); | |
| 5538 argAccessor->GetObjectProperty("length", pLengthValue.get()); | |
| 5539 int32_t iLength = pLengthValue->ToInteger(); | |
| 5540 int32_t iCounter = 0; | |
| 5541 CFXJSE_Value*** hResolveValues = FX_Alloc(CFXJSE_Value**, iLength - 2); | |
| 5542 int32_t* iSizes = FX_Alloc(int32_t, iLength - 2); | |
| 5543 for (int32_t i = 0; i < (iLength - 2); i++) { | |
| 5544 iSizes[i] = 0; | |
| 5545 } | |
| 5546 std::unique_ptr<CFXJSE_Value> hJSObjValue(new CFXJSE_Value(pIsolate)); | |
| 5547 FX_BOOL bAttribute = FALSE; | |
| 5548 for (int32_t i = 2; i < iLength; i++) { | |
| 5549 argAccessor->GetObjectPropertyByIdx(i, hJSObjValue.get()); | |
| 5550 XFA_RESOLVENODE_RS resoveNodeRS; | |
| 5551 int32_t iRet = | |
| 5552 ResolveObjects(pThis, hJSObjValue.get(), szSomExp.AsStringC(), | |
| 5553 resoveNodeRS, TRUE, szName.IsEmpty()); | |
| 5554 if (iRet > 0) { | |
| 5555 ParseResolveResult(pThis, resoveNodeRS, hJSObjValue.get(), | |
| 5556 hResolveValues[i - 2], iSizes[i - 2], bAttribute); | |
| 5557 iCounter += iSizes[i - 2]; | |
| 5558 } | |
| 5559 } | |
| 5560 if (iCounter > 0) { | |
| 5561 CFXJSE_Value** rgValues = FX_Alloc(CFXJSE_Value*, iCounter + 2); | |
| 5562 for (int32_t i = 0; i < (iCounter + 2); i++) | |
| 5563 rgValues[i] = new CFXJSE_Value(pIsolate); | |
| 5564 | 5525 |
| 5565 rgValues[0]->SetInteger(1); | 5526 bool bIsStar = true; |
| 5566 if (bAttribute) { | 5527 int32_t iIndexValue = 0; |
| 5567 rgValues[1]->SetString(szName.AsStringC()); | 5528 if (argc > 4) { |
| 5568 } else { | 5529 bIsStar = false; |
| 5569 rgValues[1]->SetNull(); | 5530 std::unique_ptr<CFXJSE_Value> argIndex = args.GetValue(4); |
| 5570 } | 5531 iIndexValue = ValueToInteger(pThis, argIndex.get()); |
|
Tom Sepez
2016/06/09 18:15:56
nit: local not needed, just args.GetValue(4).get()
dsinclair
2016/06/09 18:23:58
Done.
| |
| 5571 int32_t iIndex = 2; | 5532 } |
| 5572 for (int32_t i = 0; i < iLength - 2; i++) { | |
| 5573 for (int32_t j = 0; j < iSizes[i]; j++) { | |
| 5574 rgValues[iIndex]->Assign(hResolveValues[i][j]); | |
| 5575 iIndex++; | |
| 5576 } | |
| 5577 } | |
| 5578 args.GetReturnValue()->SetArray(iCounter + 2, rgValues); | |
| 5579 for (int32_t i = 0; i < (iCounter + 2); i++) | |
| 5580 delete rgValues[i]; | |
| 5581 | 5533 |
| 5582 FX_Free(rgValues); | 5534 CFX_ByteString szName = args.GetUTF8String(2); |
| 5583 } else { | 5535 CFX_ByteString szSomExp; |
| 5584 CFX_WideString wsPropertyName = | 5536 GenerateSomExpression(szName.AsStringC(), args.GetInt32(3), iIndexValue, |
| 5585 CFX_WideString::FromUTF8(szName.AsStringC()); | 5537 bIsStar, szSomExp); |
| 5586 CFX_WideString wsSomExpression = | |
| 5587 CFX_WideString::FromUTF8(szSomExp.AsStringC()); | |
| 5588 pContext->ThrowException(XFA_IDS_ACCESS_PROPERTY_IN_NOT_OBJECT, | |
| 5589 wsPropertyName.c_str(), | |
| 5590 wsSomExpression.c_str()); | |
| 5591 } | |
| 5592 for (int32_t i = 0; i < iLength - 2; i++) { | |
| 5593 for (int32_t j = 0; j < iSizes[i]; j++) | |
| 5594 delete hResolveValues[i][j]; | |
| 5595 | 5538 |
| 5596 if (iSizes[i] > 0) { | 5539 std::unique_ptr<CFXJSE_Value> argAccessor = args.GetValue(0); |
| 5597 FX_Free(hResolveValues[i]); | 5540 if (argAccessor->IsArray()) { |
| 5598 } | 5541 std::unique_ptr<CFXJSE_Value> pLengthValue(new CFXJSE_Value(pIsolate)); |
| 5599 } | 5542 argAccessor->GetObjectProperty("length", pLengthValue.get()); |
| 5600 FX_Free(hResolveValues); | 5543 int32_t iLength = pLengthValue->ToInteger(); |
| 5601 FX_Free(iSizes); | 5544 CFXJSE_Value*** hResolveValues = FX_Alloc(CFXJSE_Value**, iLength - 2); |
| 5602 } else { | 5545 int32_t* iSizes = FX_Alloc(int32_t, iLength - 2); |
| 5546 for (int32_t i = 0; i < (iLength - 2); i++) | |
| 5547 iSizes[i] = 0; | |
| 5548 | |
| 5549 std::unique_ptr<CFXJSE_Value> hJSObjValue(new CFXJSE_Value(pIsolate)); | |
| 5550 FX_BOOL bAttribute = FALSE; | |
| 5551 int32_t iCounter = 0; | |
| 5552 for (int32_t i = 2; i < iLength; i++) { | |
| 5553 argAccessor->GetObjectPropertyByIdx(i, hJSObjValue.get()); | |
| 5554 | |
| 5603 XFA_RESOLVENODE_RS resoveNodeRS; | 5555 XFA_RESOLVENODE_RS resoveNodeRS; |
| 5604 int32_t iRet = 0; | 5556 if (ResolveObjects(pThis, hJSObjValue.get(), szSomExp.AsStringC(), |
| 5605 if (argAccessor->IsObject() || | 5557 resoveNodeRS, TRUE, szName.IsEmpty()) > 0) { |
| 5606 (argAccessor->IsNull() && bsAccessorName.IsEmpty())) { | 5558 ParseResolveResult(pThis, resoveNodeRS, hJSObjValue.get(), |
| 5607 iRet = ResolveObjects(pThis, argAccessor.get(), szSomExp.AsStringC(), | 5559 hResolveValues[i - 2], iSizes[i - 2], bAttribute); |
| 5608 resoveNodeRS, TRUE, szName.IsEmpty()); | 5560 iCounter += iSizes[i - 2]; |
| 5609 } else if (!argAccessor->IsObject() && !bsAccessorName.IsEmpty()) { | |
| 5610 FX_BOOL bGetObject = GetObjectByName(pThis, argAccessor.get(), | |
| 5611 bsAccessorName.AsStringC()); | |
| 5612 if (bGetObject) { | |
| 5613 iRet = ResolveObjects(pThis, argAccessor.get(), szSomExp.AsStringC(), | |
| 5614 resoveNodeRS, TRUE, szName.IsEmpty()); | |
| 5615 } | |
| 5616 } | |
| 5617 if (iRet > 0) { | |
| 5618 CFXJSE_Value** hResolveValues; | |
| 5619 int32_t iSize = 0; | |
| 5620 FX_BOOL bAttribute = FALSE; | |
| 5621 ParseResolveResult(pThis, resoveNodeRS, argAccessor.get(), | |
| 5622 hResolveValues, iSize, bAttribute); | |
| 5623 CFXJSE_Value** rgValues = FX_Alloc(CFXJSE_Value*, iSize + 2); | |
| 5624 for (int32_t i = 0; i < (iSize + 2); i++) | |
| 5625 rgValues[i] = new CFXJSE_Value(pIsolate); | |
| 5626 | |
| 5627 rgValues[0]->SetInteger(1); | |
| 5628 if (bAttribute) { | |
| 5629 rgValues[1]->SetString(szName.AsStringC()); | |
| 5630 } else { | |
| 5631 rgValues[1]->SetNull(); | |
| 5632 } | |
| 5633 for (int32_t i = 0; i < iSize; i++) { | |
| 5634 rgValues[i + 2]->Assign(hResolveValues[i]); | |
| 5635 } | |
| 5636 args.GetReturnValue()->SetArray(iSize + 2, rgValues); | |
| 5637 for (int32_t i = 0; i < (iSize + 2); i++) | |
| 5638 delete rgValues[i]; | |
| 5639 | |
| 5640 FX_Free(rgValues); | |
| 5641 for (int32_t i = 0; i < iSize; i++) | |
| 5642 delete hResolveValues[i]; | |
| 5643 | |
| 5644 FX_Free(hResolveValues); | |
| 5645 } else { | |
| 5646 CFX_WideString wsPropertyName = | |
| 5647 CFX_WideString::FromUTF8(szName.AsStringC()); | |
| 5648 CFX_WideString wsSomExpression = | |
| 5649 CFX_WideString::FromUTF8(szSomExp.AsStringC()); | |
| 5650 pContext->ThrowException(XFA_IDS_ACCESS_PROPERTY_IN_NOT_OBJECT, | |
| 5651 wsPropertyName.c_str(), | |
| 5652 wsSomExpression.c_str()); | |
| 5653 } | 5561 } |
| 5654 } | 5562 } |
| 5655 } else { | 5563 if (iCounter < 1) { |
| 5656 pContext->ThrowException(XFA_IDS_COMPILER_ERROR); | 5564 CFX_WideString wsPropertyName = |
| 5565 CFX_WideString::FromUTF8(szName.AsStringC()); | |
| 5566 CFX_WideString wsSomExpression = | |
| 5567 CFX_WideString::FromUTF8(szSomExp.AsStringC()); | |
| 5568 pContext->ThrowException(XFA_IDS_ACCESS_PROPERTY_IN_NOT_OBJECT, | |
| 5569 wsPropertyName.c_str(), wsSomExpression.c_str()); | |
| 5570 return; | |
| 5571 } | |
| 5572 | |
| 5573 CFXJSE_Value** rgValues = FX_Alloc(CFXJSE_Value*, iCounter + 2); | |
| 5574 for (int32_t i = 0; i < (iCounter + 2); i++) | |
| 5575 rgValues[i] = new CFXJSE_Value(pIsolate); | |
| 5576 | |
| 5577 rgValues[0]->SetInteger(1); | |
| 5578 if (bAttribute) | |
| 5579 rgValues[1]->SetString(szName.AsStringC()); | |
| 5580 else | |
| 5581 rgValues[1]->SetNull(); | |
| 5582 | |
| 5583 int32_t iIndex = 2; | |
| 5584 for (int32_t i = 0; i < iLength - 2; i++) { | |
| 5585 for (int32_t j = 0; j < iSizes[i]; j++) { | |
| 5586 rgValues[iIndex]->Assign(hResolveValues[i][j]); | |
| 5587 iIndex++; | |
| 5588 } | |
| 5589 } | |
| 5590 args.GetReturnValue()->SetArray(iCounter + 2, rgValues); | |
| 5591 | |
| 5592 for (int32_t i = 0; i < (iCounter + 2); i++) | |
| 5593 delete rgValues[i]; | |
| 5594 FX_Free(rgValues); | |
| 5595 | |
| 5596 for (int32_t i = 0; i < iLength - 2; i++) { | |
| 5597 for (int32_t j = 0; j < iSizes[i]; j++) | |
| 5598 delete hResolveValues[i][j]; | |
| 5599 | |
| 5600 if (iSizes[i] > 0) | |
| 5601 FX_Free(hResolveValues[i]); | |
| 5602 } | |
| 5603 FX_Free(hResolveValues); | |
| 5604 FX_Free(iSizes); | |
| 5605 | |
| 5606 return; | |
| 5657 } | 5607 } |
| 5608 | |
| 5609 XFA_RESOLVENODE_RS resoveNodeRS; | |
| 5610 int32_t iRet = 0; | |
| 5611 CFX_ByteString bsAccessorName = args.GetUTF8String(1); | |
| 5612 if (argAccessor->IsObject() || | |
| 5613 (argAccessor->IsNull() && bsAccessorName.IsEmpty())) { | |
| 5614 iRet = ResolveObjects(pThis, argAccessor.get(), szSomExp.AsStringC(), | |
| 5615 resoveNodeRS, TRUE, szName.IsEmpty()); | |
| 5616 } else if (!argAccessor->IsObject() && !bsAccessorName.IsEmpty() && | |
| 5617 GetObjectByName(pThis, argAccessor.get(), | |
| 5618 bsAccessorName.AsStringC())) { | |
| 5619 iRet = ResolveObjects(pThis, argAccessor.get(), szSomExp.AsStringC(), | |
| 5620 resoveNodeRS, TRUE, szName.IsEmpty()); | |
| 5621 } | |
| 5622 if (iRet < 1) { | |
| 5623 CFX_WideString wsPropertyName = | |
| 5624 CFX_WideString::FromUTF8(szName.AsStringC()); | |
| 5625 CFX_WideString wsSomExpression = | |
| 5626 CFX_WideString::FromUTF8(szSomExp.AsStringC()); | |
| 5627 pContext->ThrowException(XFA_IDS_ACCESS_PROPERTY_IN_NOT_OBJECT, | |
| 5628 wsPropertyName.c_str(), wsSomExpression.c_str()); | |
| 5629 return; | |
| 5630 } | |
| 5631 | |
| 5632 CFXJSE_Value** hResolveValues; | |
| 5633 int32_t iSize = 0; | |
| 5634 FX_BOOL bAttribute = FALSE; | |
| 5635 ParseResolveResult(pThis, resoveNodeRS, argAccessor.get(), hResolveValues, | |
| 5636 iSize, bAttribute); | |
| 5637 CFXJSE_Value** rgValues = FX_Alloc(CFXJSE_Value*, iSize + 2); | |
| 5638 for (int32_t i = 0; i < (iSize + 2); i++) | |
| 5639 rgValues[i] = new CFXJSE_Value(pIsolate); | |
| 5640 | |
| 5641 rgValues[0]->SetInteger(1); | |
| 5642 if (bAttribute) | |
| 5643 rgValues[1]->SetString(szName.AsStringC()); | |
| 5644 else | |
| 5645 rgValues[1]->SetNull(); | |
| 5646 | |
| 5647 for (int32_t i = 0; i < iSize; i++) | |
| 5648 rgValues[i + 2]->Assign(hResolveValues[i]); | |
| 5649 | |
| 5650 args.GetReturnValue()->SetArray(iSize + 2, rgValues); | |
| 5651 for (int32_t i = 0; i < (iSize + 2); i++) | |
| 5652 delete rgValues[i]; | |
| 5653 FX_Free(rgValues); | |
| 5654 | |
| 5655 for (int32_t i = 0; i < iSize; i++) | |
| 5656 delete hResolveValues[i]; | |
| 5657 FX_Free(hResolveValues); | |
| 5658 } | 5658 } |
| 5659 | 5659 |
| 5660 // static | 5660 // static |
| 5661 void CXFA_FM2JSContext::dotdot_accessor(CFXJSE_Value* pThis, | 5661 void CXFA_FM2JSContext::dotdot_accessor(CFXJSE_Value* pThis, |
| 5662 const CFX_ByteStringC& szFuncName, | 5662 const CFX_ByteStringC& szFuncName, |
| 5663 CFXJSE_Arguments& args) { | 5663 CFXJSE_Arguments& args) { |
| 5664 CXFA_FM2JSContext* pContext = ToJSContext(pThis, nullptr); | 5664 CXFA_FM2JSContext* pContext = ToJSContext(pThis, nullptr); |
| 5665 v8::Isolate* pIsolate = pContext->GetScriptRuntime(); | 5665 v8::Isolate* pIsolate = pContext->GetScriptRuntime(); |
| 5666 int32_t argc = args.GetLength(); | 5666 int32_t argc = args.GetLength(); |
| 5667 if ((argc == 4) || (argc == 5)) { | 5667 if (argc < 4 || argc > 5) { |
| 5668 FX_BOOL bIsStar = TRUE; | 5668 pContext->ThrowException(XFA_IDS_COMPILER_ERROR); |
| 5669 std::unique_ptr<CFXJSE_Value> argAccessor = args.GetValue(0); | 5669 return; |
| 5670 CFX_ByteString bsAccessorName = args.GetUTF8String(1); | 5670 } |
| 5671 CFX_ByteString szName = args.GetUTF8String(2); | |
| 5672 int32_t iIndexFlags = args.GetInt32(3); | |
| 5673 int32_t iIndexValue = 0; | |
| 5674 if (argc > 4) { | |
| 5675 bIsStar = FALSE; | |
| 5676 std::unique_ptr<CFXJSE_Value> argIndex = args.GetValue(4); | |
| 5677 iIndexValue = ValueToInteger(pThis, argIndex.get()); | |
| 5678 } | |
| 5679 CFX_ByteString szSomExp; | |
| 5680 GenerateSomExpression(szName.AsStringC(), iIndexFlags, iIndexValue, bIsStar, | |
| 5681 szSomExp); | |
| 5682 if (argAccessor->IsArray()) { | |
| 5683 std::unique_ptr<CFXJSE_Value> pLengthValue(new CFXJSE_Value(pIsolate)); | |
| 5684 argAccessor->GetObjectProperty("length", pLengthValue.get()); | |
| 5685 int32_t iLength = pLengthValue->ToInteger(); | |
| 5686 int32_t iCounter = 0; | |
| 5687 CFXJSE_Value*** hResolveValues = FX_Alloc(CFXJSE_Value**, iLength - 2); | |
| 5688 int32_t* iSizes = FX_Alloc(int32_t, iLength - 2); | |
| 5689 std::unique_ptr<CFXJSE_Value> hJSObjValue(new CFXJSE_Value(pIsolate)); | |
| 5690 FX_BOOL bAttribute = FALSE; | |
| 5691 for (int32_t i = 2; i < iLength; i++) { | |
| 5692 argAccessor->GetObjectPropertyByIdx(i, hJSObjValue.get()); | |
| 5693 XFA_RESOLVENODE_RS resoveNodeRS; | |
| 5694 int32_t iRet = | |
| 5695 ResolveObjects(pThis, hJSObjValue.get(), szSomExp.AsStringC(), | |
| 5696 resoveNodeRS, FALSE); | |
| 5697 if (iRet > 0) { | |
| 5698 ParseResolveResult(pThis, resoveNodeRS, hJSObjValue.get(), | |
| 5699 hResolveValues[i - 2], iSizes[i - 2], bAttribute); | |
| 5700 iCounter += iSizes[i - 2]; | |
| 5701 } | |
| 5702 } | |
| 5703 if (iCounter > 0) { | |
| 5704 CFXJSE_Value** rgValues = FX_Alloc(CFXJSE_Value*, iCounter + 2); | |
| 5705 for (int32_t i = 0; i < (iCounter + 2); i++) | |
| 5706 rgValues[i] = new CFXJSE_Value(pIsolate); | |
| 5707 | 5671 |
| 5708 rgValues[0]->SetInteger(1); | 5672 bool bIsStar = true; |
| 5709 if (bAttribute) { | 5673 int32_t iIndexValue = 0; |
| 5710 rgValues[1]->SetString(szName.AsStringC()); | 5674 if (argc > 4) { |
| 5711 } else { | 5675 bIsStar = false; |
| 5712 rgValues[1]->SetNull(); | 5676 std::unique_ptr<CFXJSE_Value> argIndex = args.GetValue(4); |
| 5713 } | 5677 iIndexValue = ValueToInteger(pThis, argIndex.get()); |
|
Tom Sepez
2016/06/09 18:15:56
nitto
dsinclair
2016/06/09 18:23:58
Done.
| |
| 5714 int32_t iIndex = 2; | 5678 } |
| 5715 for (int32_t i = 0; i < iLength - 2; i++) { | |
| 5716 for (int32_t j = 0; j < iSizes[i]; j++) { | |
| 5717 rgValues[iIndex]->Assign(hResolveValues[i][j]); | |
| 5718 iIndex++; | |
| 5719 } | |
| 5720 } | |
| 5721 args.GetReturnValue()->SetArray(iCounter + 2, rgValues); | |
| 5722 for (int32_t i = 0; i < (iCounter + 2); i++) | |
| 5723 delete rgValues[i]; | |
| 5724 | 5679 |
| 5725 FX_Free(rgValues); | 5680 CFX_ByteString szSomExp; |
| 5726 } else { | 5681 CFX_ByteString szName = args.GetUTF8String(2); |
| 5727 CFX_WideString wsPropertyName = | 5682 GenerateSomExpression(szName.AsStringC(), args.GetInt32(3), iIndexValue, |
| 5728 CFX_WideString::FromUTF8(szName.AsStringC()); | 5683 bIsStar, szSomExp); |
| 5729 CFX_WideString wsSomExpression = | |
| 5730 CFX_WideString::FromUTF8(szSomExp.AsStringC()); | |
| 5731 pContext->ThrowException(XFA_IDS_ACCESS_PROPERTY_IN_NOT_OBJECT, | |
| 5732 wsPropertyName.c_str(), | |
| 5733 wsSomExpression.c_str()); | |
| 5734 } | |
| 5735 for (int32_t i = 0; i < iLength - 2; i++) { | |
| 5736 for (int32_t j = 0; j < iSizes[i]; j++) | |
| 5737 delete hResolveValues[i][j]; | |
| 5738 | 5684 |
| 5739 FX_Free(hResolveValues[i]); | 5685 std::unique_ptr<CFXJSE_Value> argAccessor = args.GetValue(0); |
| 5740 } | 5686 if (argAccessor->IsArray()) { |
| 5741 FX_Free(hResolveValues); | 5687 std::unique_ptr<CFXJSE_Value> pLengthValue(new CFXJSE_Value(pIsolate)); |
| 5742 FX_Free(iSizes); | 5688 argAccessor->GetObjectProperty("length", pLengthValue.get()); |
| 5743 } else { | 5689 int32_t iLength = pLengthValue->ToInteger(); |
| 5690 int32_t iCounter = 0; | |
| 5691 | |
| 5692 CFXJSE_Value*** hResolveValues = FX_Alloc(CFXJSE_Value**, iLength - 2); | |
| 5693 int32_t* iSizes = FX_Alloc(int32_t, iLength - 2); | |
| 5694 std::unique_ptr<CFXJSE_Value> hJSObjValue(new CFXJSE_Value(pIsolate)); | |
| 5695 FX_BOOL bAttribute = FALSE; | |
| 5696 for (int32_t i = 2; i < iLength; i++) { | |
| 5697 argAccessor->GetObjectPropertyByIdx(i, hJSObjValue.get()); | |
| 5744 XFA_RESOLVENODE_RS resoveNodeRS; | 5698 XFA_RESOLVENODE_RS resoveNodeRS; |
| 5745 int32_t iRet = 0; | 5699 if (ResolveObjects(pThis, hJSObjValue.get(), szSomExp.AsStringC(), |
| 5746 if (argAccessor->IsObject() || | 5700 resoveNodeRS, FALSE) > 0) { |
| 5747 (argAccessor->IsNull() && bsAccessorName.IsEmpty())) { | 5701 ParseResolveResult(pThis, resoveNodeRS, hJSObjValue.get(), |
| 5748 iRet = ResolveObjects(pThis, argAccessor.get(), szSomExp.AsStringC(), | 5702 hResolveValues[i - 2], iSizes[i - 2], bAttribute); |
| 5749 resoveNodeRS, FALSE); | 5703 iCounter += iSizes[i - 2]; |
| 5750 } else if (!argAccessor->IsObject() && !bsAccessorName.IsEmpty()) { | |
| 5751 FX_BOOL bGetObject = GetObjectByName(pThis, argAccessor.get(), | |
| 5752 bsAccessorName.AsStringC()); | |
| 5753 if (bGetObject) { | |
| 5754 iRet = ResolveObjects(pThis, argAccessor.get(), szSomExp.AsStringC(), | |
| 5755 resoveNodeRS, FALSE); | |
| 5756 } | |
| 5757 } | |
| 5758 if (iRet > 0) { | |
| 5759 CFXJSE_Value** hResolveValues; | |
| 5760 int32_t iSize = 0; | |
| 5761 FX_BOOL bAttribute = FALSE; | |
| 5762 ParseResolveResult(pThis, resoveNodeRS, argAccessor.get(), | |
| 5763 hResolveValues, iSize, bAttribute); | |
| 5764 CFXJSE_Value** rgValues = FX_Alloc(CFXJSE_Value*, iSize + 2); | |
| 5765 for (int32_t i = 0; i < (iSize + 2); i++) | |
| 5766 rgValues[i] = new CFXJSE_Value(pIsolate); | |
| 5767 | |
| 5768 rgValues[0]->SetInteger(1); | |
| 5769 if (bAttribute) { | |
| 5770 rgValues[1]->SetString(szName.AsStringC()); | |
| 5771 } else { | |
| 5772 rgValues[1]->SetNull(); | |
| 5773 } | |
| 5774 for (int32_t i = 0; i < iSize; i++) { | |
| 5775 rgValues[i + 2]->Assign(hResolveValues[i]); | |
| 5776 } | |
| 5777 args.GetReturnValue()->SetArray(iSize + 2, rgValues); | |
| 5778 for (int32_t i = 0; i < (iSize + 2); i++) | |
| 5779 delete rgValues[i]; | |
| 5780 | |
| 5781 FX_Free(rgValues); | |
| 5782 for (int32_t i = 0; i < iSize; i++) | |
| 5783 delete hResolveValues[i]; | |
| 5784 | |
| 5785 FX_Free(hResolveValues); | |
| 5786 } else { | |
| 5787 CFX_WideString wsPropertyName = | |
| 5788 CFX_WideString::FromUTF8(szName.AsStringC()); | |
| 5789 CFX_WideString wsSomExpression = | |
| 5790 CFX_WideString::FromUTF8(szSomExp.AsStringC()); | |
| 5791 pContext->ThrowException(XFA_IDS_ACCESS_PROPERTY_IN_NOT_OBJECT, | |
| 5792 wsPropertyName.c_str(), | |
| 5793 wsSomExpression.c_str()); | |
| 5794 } | 5704 } |
| 5795 } | 5705 } |
| 5796 } else { | 5706 if (iCounter < 1) { |
| 5797 pContext->ThrowException(XFA_IDS_COMPILER_ERROR); | 5707 CFX_WideString wsPropertyName = |
| 5708 CFX_WideString::FromUTF8(szName.AsStringC()); | |
| 5709 CFX_WideString wsSomExpression = | |
| 5710 CFX_WideString::FromUTF8(szSomExp.AsStringC()); | |
| 5711 pContext->ThrowException(XFA_IDS_ACCESS_PROPERTY_IN_NOT_OBJECT, | |
| 5712 wsPropertyName.c_str(), wsSomExpression.c_str()); | |
| 5713 return; | |
| 5714 } | |
| 5715 | |
| 5716 CFXJSE_Value** rgValues = FX_Alloc(CFXJSE_Value*, iCounter + 2); | |
| 5717 for (int32_t i = 0; i < (iCounter + 2); i++) | |
| 5718 rgValues[i] = new CFXJSE_Value(pIsolate); | |
| 5719 | |
| 5720 rgValues[0]->SetInteger(1); | |
| 5721 if (bAttribute) | |
| 5722 rgValues[1]->SetString(szName.AsStringC()); | |
| 5723 else | |
| 5724 rgValues[1]->SetNull(); | |
| 5725 | |
| 5726 int32_t iIndex = 2; | |
| 5727 for (int32_t i = 0; i < iLength - 2; i++) { | |
| 5728 for (int32_t j = 0; j < iSizes[i]; j++) { | |
| 5729 rgValues[iIndex]->Assign(hResolveValues[i][j]); | |
| 5730 iIndex++; | |
| 5731 } | |
| 5732 } | |
| 5733 args.GetReturnValue()->SetArray(iCounter + 2, rgValues); | |
| 5734 for (int32_t i = 0; i < (iCounter + 2); i++) | |
| 5735 delete rgValues[i]; | |
| 5736 FX_Free(rgValues); | |
| 5737 | |
| 5738 for (int32_t i = 0; i < iLength - 2; i++) { | |
| 5739 for (int32_t j = 0; j < iSizes[i]; j++) | |
| 5740 delete hResolveValues[i][j]; | |
| 5741 FX_Free(hResolveValues[i]); | |
| 5742 } | |
| 5743 FX_Free(hResolveValues); | |
| 5744 FX_Free(iSizes); | |
| 5745 return; | |
| 5798 } | 5746 } |
| 5747 | |
| 5748 XFA_RESOLVENODE_RS resoveNodeRS; | |
| 5749 int32_t iRet = 0; | |
| 5750 CFX_ByteString bsAccessorName = args.GetUTF8String(1); | |
| 5751 if (argAccessor->IsObject() || | |
| 5752 (argAccessor->IsNull() && bsAccessorName.IsEmpty())) { | |
| 5753 iRet = ResolveObjects(pThis, argAccessor.get(), szSomExp.AsStringC(), | |
| 5754 resoveNodeRS, FALSE); | |
| 5755 } else if (!argAccessor->IsObject() && !bsAccessorName.IsEmpty() && | |
| 5756 GetObjectByName(pThis, argAccessor.get(), | |
| 5757 bsAccessorName.AsStringC())) { | |
| 5758 iRet = ResolveObjects(pThis, argAccessor.get(), szSomExp.AsStringC(), | |
| 5759 resoveNodeRS, FALSE); | |
| 5760 } | |
| 5761 if (iRet < 1) { | |
| 5762 CFX_WideString wsPropertyName = | |
| 5763 CFX_WideString::FromUTF8(szName.AsStringC()); | |
| 5764 CFX_WideString wsSomExpression = | |
| 5765 CFX_WideString::FromUTF8(szSomExp.AsStringC()); | |
| 5766 pContext->ThrowException(XFA_IDS_ACCESS_PROPERTY_IN_NOT_OBJECT, | |
| 5767 wsPropertyName.c_str(), wsSomExpression.c_str()); | |
| 5768 return; | |
| 5769 } | |
| 5770 | |
| 5771 CFXJSE_Value** hResolveValues; | |
| 5772 int32_t iSize = 0; | |
| 5773 FX_BOOL bAttribute = FALSE; | |
| 5774 ParseResolveResult(pThis, resoveNodeRS, argAccessor.get(), hResolveValues, | |
| 5775 iSize, bAttribute); | |
| 5776 CFXJSE_Value** rgValues = FX_Alloc(CFXJSE_Value*, iSize + 2); | |
| 5777 for (int32_t i = 0; i < (iSize + 2); i++) | |
| 5778 rgValues[i] = new CFXJSE_Value(pIsolate); | |
| 5779 | |
| 5780 rgValues[0]->SetInteger(1); | |
| 5781 if (bAttribute) | |
| 5782 rgValues[1]->SetString(szName.AsStringC()); | |
| 5783 else | |
| 5784 rgValues[1]->SetNull(); | |
| 5785 | |
| 5786 for (int32_t i = 0; i < iSize; i++) | |
| 5787 rgValues[i + 2]->Assign(hResolveValues[i]); | |
| 5788 | |
| 5789 args.GetReturnValue()->SetArray(iSize + 2, rgValues); | |
| 5790 | |
| 5791 for (int32_t i = 0; i < (iSize + 2); i++) | |
| 5792 delete rgValues[i]; | |
| 5793 FX_Free(rgValues); | |
| 5794 | |
| 5795 for (int32_t i = 0; i < iSize; i++) | |
| 5796 delete hResolveValues[i]; | |
| 5797 FX_Free(hResolveValues); | |
| 5799 } | 5798 } |
| 5800 | 5799 |
| 5801 // static | 5800 // static |
| 5802 void CXFA_FM2JSContext::eval_translation(CFXJSE_Value* pThis, | 5801 void CXFA_FM2JSContext::eval_translation(CFXJSE_Value* pThis, |
| 5803 const CFX_ByteStringC& szFuncName, | 5802 const CFX_ByteStringC& szFuncName, |
| 5804 CFXJSE_Arguments& args) { | 5803 CFXJSE_Arguments& args) { |
| 5805 CXFA_FM2JSContext* pContext = ToJSContext(pThis, nullptr); | 5804 CXFA_FM2JSContext* pContext = ToJSContext(pThis, nullptr); |
| 5806 if (args.GetLength() == 1) { | 5805 if (args.GetLength() != 1) { |
| 5807 std::unique_ptr<CFXJSE_Value> argOne = GetSimpleValue(pThis, args, 0); | |
| 5808 CFX_ByteString argString; | |
| 5809 ValueToUTF8String(argOne.get(), argString); | |
| 5810 if (argString.IsEmpty()) { | |
| 5811 pContext->ThrowException(XFA_IDS_ARGUMENT_MISMATCH); | |
| 5812 } else { | |
| 5813 CFX_WideString scriptString = | |
| 5814 CFX_WideString::FromUTF8(argString.AsStringC()); | |
| 5815 CFX_WideTextBuf wsJavaScriptBuf; | |
| 5816 CFX_WideString wsError; | |
| 5817 CXFA_FM2JSContext::Translate(scriptString.AsStringC(), wsJavaScriptBuf, | |
| 5818 wsError); | |
| 5819 if (wsError.IsEmpty()) { | |
| 5820 CFX_WideString javaScript = wsJavaScriptBuf.MakeString(); | |
| 5821 args.GetReturnValue()->SetString( | |
| 5822 FX_UTF8Encode(javaScript.c_str(), javaScript.GetLength()) | |
| 5823 .AsStringC()); | |
| 5824 } else { | |
| 5825 pContext->ThrowException(XFA_IDS_COMPILER_ERROR); | |
| 5826 } | |
| 5827 } | |
| 5828 } else { | |
| 5829 pContext->ThrowException(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"Eval"); | 5806 pContext->ThrowException(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"Eval"); |
| 5807 return; | |
| 5830 } | 5808 } |
| 5809 | |
| 5810 std::unique_ptr<CFXJSE_Value> argOne = GetSimpleValue(pThis, args, 0); | |
| 5811 CFX_ByteString argString; | |
| 5812 ValueToUTF8String(argOne.get(), argString); | |
| 5813 if (argString.IsEmpty()) { | |
| 5814 pContext->ThrowException(XFA_IDS_ARGUMENT_MISMATCH); | |
| 5815 return; | |
| 5816 } | |
| 5817 | |
| 5818 CFX_WideString scriptString = CFX_WideString::FromUTF8(argString.AsStringC()); | |
| 5819 CFX_WideTextBuf wsJavaScriptBuf; | |
| 5820 CFX_WideString wsError; | |
| 5821 CXFA_FM2JSContext::Translate(scriptString.AsStringC(), wsJavaScriptBuf, | |
| 5822 wsError); | |
| 5823 if (!wsError.IsEmpty()) { | |
| 5824 pContext->ThrowException(XFA_IDS_COMPILER_ERROR); | |
| 5825 return; | |
| 5826 } | |
| 5827 | |
| 5828 CFX_WideString javaScript = wsJavaScriptBuf.MakeString(); | |
| 5829 args.GetReturnValue()->SetString( | |
| 5830 FX_UTF8Encode(javaScript.c_str(), javaScript.GetLength()).AsStringC()); | |
| 5831 } | 5831 } |
| 5832 | 5832 |
| 5833 // static | 5833 // static |
| 5834 void CXFA_FM2JSContext::is_fm_object(CFXJSE_Value* pThis, | 5834 void CXFA_FM2JSContext::is_fm_object(CFXJSE_Value* pThis, |
| 5835 const CFX_ByteStringC& szFuncName, | 5835 const CFX_ByteStringC& szFuncName, |
| 5836 CFXJSE_Arguments& args) { | 5836 CFXJSE_Arguments& args) { |
| 5837 if (args.GetLength() == 1) { | 5837 if (args.GetLength() != 1) { |
| 5838 std::unique_ptr<CFXJSE_Value> argOne = args.GetValue(0); | |
| 5839 args.GetReturnValue()->SetBoolean(argOne->IsObject()); | |
| 5840 } else { | |
| 5841 args.GetReturnValue()->SetBoolean(FALSE); | 5838 args.GetReturnValue()->SetBoolean(FALSE); |
| 5839 return; | |
| 5842 } | 5840 } |
| 5841 | |
| 5842 std::unique_ptr<CFXJSE_Value> argOne = args.GetValue(0); | |
| 5843 args.GetReturnValue()->SetBoolean(argOne->IsObject()); | |
| 5843 } | 5844 } |
| 5844 | 5845 |
| 5845 // static | 5846 // static |
| 5846 void CXFA_FM2JSContext::is_fm_array(CFXJSE_Value* pThis, | 5847 void CXFA_FM2JSContext::is_fm_array(CFXJSE_Value* pThis, |
| 5847 const CFX_ByteStringC& szFuncName, | 5848 const CFX_ByteStringC& szFuncName, |
| 5848 CFXJSE_Arguments& args) { | 5849 CFXJSE_Arguments& args) { |
| 5849 if (args.GetLength() == 1) { | 5850 if (args.GetLength() != 1) { |
| 5850 std::unique_ptr<CFXJSE_Value> argOne = args.GetValue(0); | |
| 5851 args.GetReturnValue()->SetBoolean(argOne->IsArray()); | |
| 5852 } else { | |
| 5853 args.GetReturnValue()->SetBoolean(FALSE); | 5851 args.GetReturnValue()->SetBoolean(FALSE); |
| 5852 return; | |
| 5854 } | 5853 } |
| 5854 | |
| 5855 std::unique_ptr<CFXJSE_Value> argOne = args.GetValue(0); | |
| 5856 args.GetReturnValue()->SetBoolean(argOne->IsArray()); | |
| 5855 } | 5857 } |
| 5856 | 5858 |
| 5857 // static | 5859 // static |
| 5858 void CXFA_FM2JSContext::get_fm_value(CFXJSE_Value* pThis, | 5860 void CXFA_FM2JSContext::get_fm_value(CFXJSE_Value* pThis, |
| 5859 const CFX_ByteStringC& szFuncName, | 5861 const CFX_ByteStringC& szFuncName, |
| 5860 CFXJSE_Arguments& args) { | 5862 CFXJSE_Arguments& args) { |
| 5861 CXFA_FM2JSContext* pContext = ToJSContext(pThis, nullptr); | 5863 CXFA_FM2JSContext* pContext = ToJSContext(pThis, nullptr); |
| 5862 v8::Isolate* pIsolate = pContext->GetScriptRuntime(); | 5864 if (args.GetLength() != 1) { |
| 5863 if (args.GetLength() == 1) { | 5865 pContext->ThrowException(XFA_IDS_COMPILER_ERROR); |
| 5864 std::unique_ptr<CFXJSE_Value> argOne = args.GetValue(0); | 5866 return; |
| 5865 if (argOne->IsArray()) { | 5867 } |
| 5866 std::unique_ptr<CFXJSE_Value> propertyValue(new CFXJSE_Value(pIsolate)); | 5868 |
| 5867 std::unique_ptr<CFXJSE_Value> jsObjectValue(new CFXJSE_Value(pIsolate)); | 5869 std::unique_ptr<CFXJSE_Value> argOne = args.GetValue(0); |
| 5868 argOne->GetObjectPropertyByIdx(1, propertyValue.get()); | 5870 if (argOne->IsArray()) { |
| 5869 argOne->GetObjectPropertyByIdx(2, jsObjectValue.get()); | 5871 v8::Isolate* pIsolate = pContext->GetScriptRuntime(); |
| 5870 if (propertyValue->IsNull()) { | 5872 std::unique_ptr<CFXJSE_Value> propertyValue(new CFXJSE_Value(pIsolate)); |
| 5871 GetObjectDefaultValue(jsObjectValue.get(), args.GetReturnValue()); | 5873 std::unique_ptr<CFXJSE_Value> jsObjectValue(new CFXJSE_Value(pIsolate)); |
| 5872 } else { | 5874 argOne->GetObjectPropertyByIdx(1, propertyValue.get()); |
| 5873 CFX_ByteString propertyStr; | 5875 argOne->GetObjectPropertyByIdx(2, jsObjectValue.get()); |
| 5874 propertyValue->ToString(propertyStr); | 5876 if (propertyValue->IsNull()) { |
| 5875 jsObjectValue->GetObjectProperty(propertyStr.AsStringC(), | 5877 GetObjectDefaultValue(jsObjectValue.get(), args.GetReturnValue()); |
| 5876 args.GetReturnValue()); | 5878 return; |
| 5877 } | |
| 5878 } else if (argOne->IsObject()) { | |
| 5879 GetObjectDefaultValue(argOne.get(), args.GetReturnValue()); | |
| 5880 } else { | |
| 5881 args.GetReturnValue()->Assign(argOne.get()); | |
| 5882 } | 5879 } |
| 5883 } else { | 5880 |
| 5884 pContext->ThrowException(XFA_IDS_COMPILER_ERROR); | 5881 CFX_ByteString propertyStr; |
| 5882 propertyValue->ToString(propertyStr); | |
| 5883 jsObjectValue->GetObjectProperty(propertyStr.AsStringC(), | |
| 5884 args.GetReturnValue()); | |
| 5885 return; | |
| 5885 } | 5886 } |
| 5887 | |
| 5888 if (argOne->IsObject()) { | |
| 5889 GetObjectDefaultValue(argOne.get(), args.GetReturnValue()); | |
| 5890 return; | |
| 5891 } | |
| 5892 | |
| 5893 args.GetReturnValue()->Assign(argOne.get()); | |
| 5886 } | 5894 } |
| 5887 | 5895 |
| 5888 // static | 5896 // static |
| 5889 void CXFA_FM2JSContext::get_fm_jsobj(CFXJSE_Value* pThis, | 5897 void CXFA_FM2JSContext::get_fm_jsobj(CFXJSE_Value* pThis, |
| 5890 const CFX_ByteStringC& szFuncName, | 5898 const CFX_ByteStringC& szFuncName, |
| 5891 CFXJSE_Arguments& args) { | 5899 CFXJSE_Arguments& args) { |
| 5892 if (args.GetLength() == 1) { | 5900 if (args.GetLength() != 1) { |
| 5893 std::unique_ptr<CFXJSE_Value> argOne = args.GetValue(0); | 5901 ToJSContext(pThis, nullptr)->ThrowException(XFA_IDS_COMPILER_ERROR); |
| 5894 if (argOne->IsArray()) { | 5902 return; |
| 5903 } | |
| 5904 | |
| 5905 std::unique_ptr<CFXJSE_Value> argOne = args.GetValue(0); | |
| 5906 if (!argOne->IsArray()) { | |
| 5907 args.GetReturnValue()->Assign(argOne.get()); | |
| 5908 return; | |
| 5909 } | |
| 5910 | |
| 5895 #ifndef NDEBUG | 5911 #ifndef NDEBUG |
| 5896 CXFA_FM2JSContext* pContext = ToJSContext(pThis, nullptr); | 5912 CXFA_FM2JSContext* pContext = ToJSContext(pThis, nullptr); |
| 5897 v8::Isolate* pIsolate = pContext->GetScriptRuntime(); | 5913 v8::Isolate* pIsolate = pContext->GetScriptRuntime(); |
| 5898 std::unique_ptr<CFXJSE_Value> lengthValue(new CFXJSE_Value(pIsolate)); | 5914 std::unique_ptr<CFXJSE_Value> lengthValue(new CFXJSE_Value(pIsolate)); |
| 5899 argOne->GetObjectProperty("length", lengthValue.get()); | 5915 argOne->GetObjectProperty("length", lengthValue.get()); |
| 5900 ASSERT(lengthValue->ToInteger() >= 3); | 5916 ASSERT(lengthValue->ToInteger() >= 3); |
| 5901 #endif | 5917 #endif |
| 5902 argOne->GetObjectPropertyByIdx(2, args.GetReturnValue()); | 5918 |
| 5903 } else { | 5919 argOne->GetObjectPropertyByIdx(2, args.GetReturnValue()); |
| 5904 args.GetReturnValue()->Assign(argOne.get()); | |
| 5905 } | |
| 5906 } else { | |
| 5907 CXFA_FM2JSContext* pContext = ToJSContext(pThis, nullptr); | |
| 5908 pContext->ThrowException(XFA_IDS_COMPILER_ERROR); | |
| 5909 } | |
| 5910 } | 5920 } |
| 5911 | 5921 |
| 5912 // static | 5922 // static |
| 5913 void CXFA_FM2JSContext::fm_var_filter(CFXJSE_Value* pThis, | 5923 void CXFA_FM2JSContext::fm_var_filter(CFXJSE_Value* pThis, |
| 5914 const CFX_ByteStringC& szFuncName, | 5924 const CFX_ByteStringC& szFuncName, |
| 5915 CFXJSE_Arguments& args) { | 5925 CFXJSE_Arguments& args) { |
| 5916 CXFA_FM2JSContext* pContext = ToJSContext(pThis, nullptr); | 5926 CXFA_FM2JSContext* pContext = ToJSContext(pThis, nullptr); |
| 5927 if (args.GetLength() != 1) { | |
| 5928 pContext->ThrowException(XFA_IDS_COMPILER_ERROR); | |
| 5929 return; | |
| 5930 } | |
| 5931 | |
| 5917 v8::Isolate* pIsolate = pContext->GetScriptRuntime(); | 5932 v8::Isolate* pIsolate = pContext->GetScriptRuntime(); |
| 5918 if (args.GetLength() == 1) { | 5933 std::unique_ptr<CFXJSE_Value> argOne = args.GetValue(0); |
| 5919 std::unique_ptr<CFXJSE_Value> argOne = args.GetValue(0); | 5934 if (!argOne->IsArray()) { |
| 5920 if (argOne->IsArray()) { | 5935 std::unique_ptr<CFXJSE_Value> simpleValue = GetSimpleValue(pThis, args, 0); |
| 5936 args.GetReturnValue()->Assign(simpleValue.get()); | |
| 5937 return; | |
| 5938 } | |
| 5939 | |
| 5921 #ifndef NDEBUG | 5940 #ifndef NDEBUG |
| 5922 std::unique_ptr<CFXJSE_Value> lengthValue(new CFXJSE_Value(pIsolate)); | 5941 std::unique_ptr<CFXJSE_Value> lengthValue(new CFXJSE_Value(pIsolate)); |
| 5923 argOne->GetObjectProperty("length", lengthValue.get()); | 5942 argOne->GetObjectProperty("length", lengthValue.get()); |
| 5924 ASSERT(lengthValue->ToInteger() >= 3); | 5943 ASSERT(lengthValue->ToInteger() >= 3); |
| 5925 #endif | 5944 #endif |
| 5926 std::unique_ptr<CFXJSE_Value> flagsValue(new CFXJSE_Value(pIsolate)); | |
| 5927 argOne->GetObjectPropertyByIdx(0, flagsValue.get()); | |
| 5928 int32_t iFlags = flagsValue->ToInteger(); | |
| 5929 if (iFlags == 4) { | |
| 5930 CFXJSE_Value* rgValues[3]; | |
| 5931 for (int32_t i = 0; i < 3; i++) | |
| 5932 rgValues[i] = new CFXJSE_Value(pIsolate); | |
| 5933 | 5945 |
| 5934 rgValues[0]->SetInteger(3); | 5946 std::unique_ptr<CFXJSE_Value> flagsValue(new CFXJSE_Value(pIsolate)); |
| 5935 rgValues[1]->SetNull(); | 5947 argOne->GetObjectPropertyByIdx(0, flagsValue.get()); |
| 5936 rgValues[2]->SetNull(); | 5948 int32_t iFlags = flagsValue->ToInteger(); |
| 5937 args.GetReturnValue()->SetArray(3, rgValues); | 5949 if (iFlags != 3 && iFlags != 4) { |
| 5938 for (int32_t i = 0; i < 3; i++) | 5950 std::unique_ptr<CFXJSE_Value> simpleValue = GetSimpleValue(pThis, args, 0); |
| 5939 delete rgValues[i]; | 5951 args.GetReturnValue()->Assign(simpleValue.get()); |
| 5940 } else if (iFlags == 3) { | 5952 return; |
| 5941 std::unique_ptr<CFXJSE_Value> objectValue(new CFXJSE_Value(pIsolate)); | 5953 } |
| 5942 argOne->GetObjectPropertyByIdx(2, objectValue.get()); | 5954 |
| 5943 if (!objectValue->IsNull()) { | 5955 if (iFlags == 4) { |
| 5944 args.GetReturnValue()->Assign(argOne.get()); | 5956 CFXJSE_Value* rgValues[3]; |
| 5945 } else { | 5957 for (int32_t i = 0; i < 3; i++) |
| 5946 pContext->ThrowException(XFA_IDS_COMPILER_ERROR); | 5958 rgValues[i] = new CFXJSE_Value(pIsolate); |
| 5947 } | 5959 |
| 5948 } else { | 5960 rgValues[0]->SetInteger(3); |
| 5949 std::unique_ptr<CFXJSE_Value> simpleValue = | 5961 rgValues[1]->SetNull(); |
| 5950 GetSimpleValue(pThis, args, 0); | 5962 rgValues[2]->SetNull(); |
| 5951 args.GetReturnValue()->Assign(simpleValue.get()); | 5963 args.GetReturnValue()->SetArray(3, rgValues); |
| 5952 } | 5964 for (int32_t i = 0; i < 3; i++) |
| 5953 } else { | 5965 delete rgValues[i]; |
| 5954 std::unique_ptr<CFXJSE_Value> simpleValue = | 5966 |
| 5955 GetSimpleValue(pThis, args, 0); | 5967 return; |
| 5956 args.GetReturnValue()->Assign(simpleValue.get()); | 5968 } |
| 5957 } | 5969 |
| 5958 } else { | 5970 std::unique_ptr<CFXJSE_Value> objectValue(new CFXJSE_Value(pIsolate)); |
| 5971 argOne->GetObjectPropertyByIdx(2, objectValue.get()); | |
| 5972 if (objectValue->IsNull()) { | |
| 5959 pContext->ThrowException(XFA_IDS_COMPILER_ERROR); | 5973 pContext->ThrowException(XFA_IDS_COMPILER_ERROR); |
| 5974 return; | |
| 5960 } | 5975 } |
| 5976 args.GetReturnValue()->Assign(argOne.get()); | |
| 5961 } | 5977 } |
| 5962 | 5978 |
| 5963 // static | 5979 // static |
| 5964 void CXFA_FM2JSContext::concat_fm_object(CFXJSE_Value* pThis, | 5980 void CXFA_FM2JSContext::concat_fm_object(CFXJSE_Value* pThis, |
| 5965 const CFX_ByteStringC& szFuncName, | 5981 const CFX_ByteStringC& szFuncName, |
| 5966 CFXJSE_Arguments& args) { | 5982 CFXJSE_Arguments& args) { |
| 5967 v8::Isolate* pIsolate = ToJSContext(pThis, nullptr)->GetScriptRuntime(); | 5983 v8::Isolate* pIsolate = ToJSContext(pThis, nullptr)->GetScriptRuntime(); |
| 5968 uint32_t iLength = 0; | 5984 uint32_t iLength = 0; |
| 5969 int32_t argc = args.GetLength(); | 5985 int32_t argc = args.GetLength(); |
| 5970 std::vector<std::unique_ptr<CFXJSE_Value>> argValues; | 5986 std::vector<std::unique_ptr<CFXJSE_Value>> argValues; |
| 5971 for (int32_t i = 0; i < argc; i++) { | 5987 for (int32_t i = 0; i < argc; i++) { |
| 5972 argValues.push_back(args.GetValue(i)); | 5988 argValues.push_back(args.GetValue(i)); |
| 5973 if (argValues[i]->IsArray()) { | 5989 if (argValues[i]->IsArray()) { |
| 5974 std::unique_ptr<CFXJSE_Value> lengthValue(new CFXJSE_Value(pIsolate)); | 5990 std::unique_ptr<CFXJSE_Value> lengthValue(new CFXJSE_Value(pIsolate)); |
| 5975 argValues[i]->GetObjectProperty("length", lengthValue.get()); | 5991 argValues[i]->GetObjectProperty("length", lengthValue.get()); |
| 5976 int32_t length = lengthValue->ToInteger(); | 5992 int32_t length = lengthValue->ToInteger(); |
| 5977 iLength = iLength + ((length > 2) ? (length - 2) : 0); | 5993 iLength = iLength + ((length > 2) ? (length - 2) : 0); |
| 5978 } | 5994 } |
| 5979 iLength += 1; | 5995 iLength += 1; |
| 5980 } | 5996 } |
| 5997 | |
| 5981 CFXJSE_Value** returnValues = FX_Alloc(CFXJSE_Value*, iLength); | 5998 CFXJSE_Value** returnValues = FX_Alloc(CFXJSE_Value*, iLength); |
| 5982 for (int32_t i = 0; i < (int32_t)iLength; i++) | 5999 for (int32_t i = 0; i < (int32_t)iLength; i++) |
| 5983 returnValues[i] = new CFXJSE_Value(pIsolate); | 6000 returnValues[i] = new CFXJSE_Value(pIsolate); |
| 5984 | 6001 |
| 5985 int32_t index = 0; | 6002 int32_t index = 0; |
| 5986 for (int32_t i = 0; i < argc; i++) { | 6003 for (int32_t i = 0; i < argc; i++) { |
| 5987 if (argValues[i]->IsArray()) { | 6004 if (argValues[i]->IsArray()) { |
| 5988 std::unique_ptr<CFXJSE_Value> lengthValue(new CFXJSE_Value(pIsolate)); | 6005 std::unique_ptr<CFXJSE_Value> lengthValue(new CFXJSE_Value(pIsolate)); |
| 5989 argValues[i]->GetObjectProperty("length", lengthValue.get()); | 6006 argValues[i]->GetObjectProperty("length", lengthValue.get()); |
| 5990 int32_t length = lengthValue->ToInteger(); | 6007 int32_t length = lengthValue->ToInteger(); |
| (...skipping 12 matching lines...) Expand all Loading... | |
| 6003 FX_Free(returnValues); | 6020 FX_Free(returnValues); |
| 6004 } | 6021 } |
| 6005 | 6022 |
| 6006 // static | 6023 // static |
| 6007 std::unique_ptr<CFXJSE_Value> CXFA_FM2JSContext::GetSimpleValue( | 6024 std::unique_ptr<CFXJSE_Value> CXFA_FM2JSContext::GetSimpleValue( |
| 6008 CFXJSE_Value* pThis, | 6025 CFXJSE_Value* pThis, |
| 6009 CFXJSE_Arguments& args, | 6026 CFXJSE_Arguments& args, |
| 6010 uint32_t index) { | 6027 uint32_t index) { |
| 6011 v8::Isolate* pIsolate = ToJSContext(pThis, nullptr)->GetScriptRuntime(); | 6028 v8::Isolate* pIsolate = ToJSContext(pThis, nullptr)->GetScriptRuntime(); |
| 6012 ASSERT(index < (uint32_t)args.GetLength()); | 6029 ASSERT(index < (uint32_t)args.GetLength()); |
| 6030 | |
| 6013 std::unique_ptr<CFXJSE_Value> argIndex = args.GetValue(index); | 6031 std::unique_ptr<CFXJSE_Value> argIndex = args.GetValue(index); |
| 6032 if (!argIndex->IsArray() && !argIndex->IsObject()) | |
| 6033 return argIndex; | |
| 6034 | |
| 6014 if (argIndex->IsArray()) { | 6035 if (argIndex->IsArray()) { |
| 6015 std::unique_ptr<CFXJSE_Value> lengthValue(new CFXJSE_Value(pIsolate)); | 6036 std::unique_ptr<CFXJSE_Value> lengthValue(new CFXJSE_Value(pIsolate)); |
| 6016 argIndex->GetObjectProperty("length", lengthValue.get()); | 6037 argIndex->GetObjectProperty("length", lengthValue.get()); |
| 6017 int32_t iLength = lengthValue->ToInteger(); | 6038 int32_t iLength = lengthValue->ToInteger(); |
| 6018 std::unique_ptr<CFXJSE_Value> simpleValue(new CFXJSE_Value(pIsolate)); | 6039 std::unique_ptr<CFXJSE_Value> simpleValue(new CFXJSE_Value(pIsolate)); |
| 6019 if (iLength > 2) { | 6040 if (iLength < 3) { |
| 6020 std::unique_ptr<CFXJSE_Value> propertyValue(new CFXJSE_Value(pIsolate)); | |
| 6021 std::unique_ptr<CFXJSE_Value> jsObjectValue(new CFXJSE_Value(pIsolate)); | |
| 6022 argIndex->GetObjectPropertyByIdx(1, propertyValue.get()); | |
| 6023 argIndex->GetObjectPropertyByIdx(2, jsObjectValue.get()); | |
| 6024 if (propertyValue->IsNull()) { | |
| 6025 GetObjectDefaultValue(jsObjectValue.get(), simpleValue.get()); | |
| 6026 } else { | |
| 6027 CFX_ByteString propertyStr; | |
| 6028 propertyValue->ToString(propertyStr); | |
| 6029 jsObjectValue->GetObjectProperty(propertyStr.AsStringC(), | |
| 6030 simpleValue.get()); | |
| 6031 } | |
| 6032 } else { | |
| 6033 simpleValue.get()->SetUndefined(); | 6041 simpleValue.get()->SetUndefined(); |
| 6042 return simpleValue; | |
| 6034 } | 6043 } |
| 6044 | |
| 6045 std::unique_ptr<CFXJSE_Value> propertyValue(new CFXJSE_Value(pIsolate)); | |
| 6046 std::unique_ptr<CFXJSE_Value> jsObjectValue(new CFXJSE_Value(pIsolate)); | |
| 6047 argIndex->GetObjectPropertyByIdx(1, propertyValue.get()); | |
| 6048 argIndex->GetObjectPropertyByIdx(2, jsObjectValue.get()); | |
| 6049 if (propertyValue->IsNull()) { | |
| 6050 GetObjectDefaultValue(jsObjectValue.get(), simpleValue.get()); | |
| 6051 return simpleValue; | |
| 6052 } | |
| 6053 | |
| 6054 CFX_ByteString propertyStr; | |
| 6055 propertyValue->ToString(propertyStr); | |
| 6056 jsObjectValue->GetObjectProperty(propertyStr.AsStringC(), | |
| 6057 simpleValue.get()); | |
| 6035 return simpleValue; | 6058 return simpleValue; |
| 6036 } else if (argIndex->IsObject()) { | |
| 6037 std::unique_ptr<CFXJSE_Value> defaultValue(new CFXJSE_Value(pIsolate)); | |
| 6038 GetObjectDefaultValue(argIndex.get(), defaultValue.get()); | |
| 6039 return defaultValue; | |
| 6040 } else { | |
| 6041 return argIndex; | |
| 6042 } | 6059 } |
| 6060 | |
| 6061 std::unique_ptr<CFXJSE_Value> defaultValue(new CFXJSE_Value(pIsolate)); | |
| 6062 GetObjectDefaultValue(argIndex.get(), defaultValue.get()); | |
| 6063 return defaultValue; | |
| 6043 } | 6064 } |
| 6044 | 6065 |
| 6045 // static | 6066 // static |
| 6046 FX_BOOL CXFA_FM2JSContext::ValueIsNull(CFXJSE_Value* pThis, CFXJSE_Value* arg) { | 6067 FX_BOOL CXFA_FM2JSContext::ValueIsNull(CFXJSE_Value* pThis, CFXJSE_Value* arg) { |
| 6068 if (!arg || arg->IsNull()) | |
| 6069 return TRUE; | |
| 6070 | |
| 6071 if (!arg->IsArray() && !arg->IsObject()) | |
| 6072 return FALSE; | |
| 6073 | |
| 6047 v8::Isolate* pIsolate = ToJSContext(pThis, nullptr)->GetScriptRuntime(); | 6074 v8::Isolate* pIsolate = ToJSContext(pThis, nullptr)->GetScriptRuntime(); |
| 6048 FX_BOOL isNull = FALSE; | 6075 if (arg->IsArray()) { |
| 6049 if (!arg || arg->IsNull()) { | |
| 6050 isNull = TRUE; | |
| 6051 } else if (arg->IsArray()) { | |
| 6052 int32_t iLength = hvalue_get_array_length(pThis, arg); | 6076 int32_t iLength = hvalue_get_array_length(pThis, arg); |
| 6053 if (iLength > 2) { | 6077 if (iLength < 3) |
| 6054 std::unique_ptr<CFXJSE_Value> propertyValue(new CFXJSE_Value(pIsolate)); | 6078 return TRUE; |
| 6055 std::unique_ptr<CFXJSE_Value> jsObjectValue(new CFXJSE_Value(pIsolate)); | 6079 |
| 6056 arg->GetObjectPropertyByIdx(1, propertyValue.get()); | 6080 std::unique_ptr<CFXJSE_Value> propertyValue(new CFXJSE_Value(pIsolate)); |
| 6057 arg->GetObjectPropertyByIdx(2, jsObjectValue.get()); | 6081 std::unique_ptr<CFXJSE_Value> jsObjectValue(new CFXJSE_Value(pIsolate)); |
| 6058 if (propertyValue->IsNull()) { | 6082 arg->GetObjectPropertyByIdx(1, propertyValue.get()); |
| 6059 std::unique_ptr<CFXJSE_Value> defaultValue(new CFXJSE_Value(pIsolate)); | 6083 arg->GetObjectPropertyByIdx(2, jsObjectValue.get()); |
| 6060 GetObjectDefaultValue(jsObjectValue.get(), defaultValue.get()); | 6084 if (propertyValue->IsNull()) { |
| 6061 if (defaultValue->IsNull()) { | 6085 std::unique_ptr<CFXJSE_Value> defaultValue(new CFXJSE_Value(pIsolate)); |
| 6062 isNull = TRUE; | 6086 GetObjectDefaultValue(jsObjectValue.get(), defaultValue.get()); |
| 6063 } | 6087 return defaultValue->IsNull(); |
| 6064 } else { | |
| 6065 CFX_ByteString propertyStr; | |
| 6066 propertyValue->ToString(propertyStr); | |
| 6067 std::unique_ptr<CFXJSE_Value> newPropertyValue( | |
| 6068 new CFXJSE_Value(pIsolate)); | |
| 6069 jsObjectValue->GetObjectProperty(propertyStr.AsStringC(), | |
| 6070 newPropertyValue.get()); | |
| 6071 if (newPropertyValue->IsNull()) { | |
| 6072 isNull = TRUE; | |
| 6073 } | |
| 6074 } | |
| 6075 } else { | |
| 6076 isNull = TRUE; | |
| 6077 } | 6088 } |
| 6078 } else if (arg->IsObject()) { | 6089 |
| 6079 std::unique_ptr<CFXJSE_Value> defaultValue(new CFXJSE_Value(pIsolate)); | 6090 CFX_ByteString propertyStr; |
| 6080 GetObjectDefaultValue(arg, defaultValue.get()); | 6091 propertyValue->ToString(propertyStr); |
| 6081 if (defaultValue->IsNull()) { | 6092 std::unique_ptr<CFXJSE_Value> newPropertyValue(new CFXJSE_Value(pIsolate)); |
| 6082 isNull = TRUE; | 6093 jsObjectValue->GetObjectProperty(propertyStr.AsStringC(), |
| 6083 } | 6094 newPropertyValue.get()); |
| 6095 return newPropertyValue->IsNull(); | |
| 6084 } | 6096 } |
| 6085 return isNull; | 6097 |
| 6098 std::unique_ptr<CFXJSE_Value> defaultValue(new CFXJSE_Value(pIsolate)); | |
| 6099 GetObjectDefaultValue(arg, defaultValue.get()); | |
| 6100 return defaultValue->IsNull(); | |
| 6086 } | 6101 } |
| 6087 | 6102 |
| 6088 // static | 6103 // static |
| 6089 int32_t CXFA_FM2JSContext::hvalue_get_array_length(CFXJSE_Value* pThis, | 6104 int32_t CXFA_FM2JSContext::hvalue_get_array_length(CFXJSE_Value* pThis, |
| 6090 CFXJSE_Value* arg) { | 6105 CFXJSE_Value* arg) { |
| 6091 if (!arg || !arg->IsArray()) | 6106 if (!arg || !arg->IsArray()) |
| 6092 return 0; | 6107 return 0; |
| 6093 | 6108 |
| 6094 v8::Isolate* pIsolate = ToJSContext(pThis, nullptr)->GetScriptRuntime(); | 6109 v8::Isolate* pIsolate = ToJSContext(pThis, nullptr)->GetScriptRuntime(); |
| 6095 std::unique_ptr<CFXJSE_Value> lengthValue(new CFXJSE_Value(pIsolate)); | 6110 std::unique_ptr<CFXJSE_Value> lengthValue(new CFXJSE_Value(pIsolate)); |
| 6096 arg->GetObjectProperty("length", lengthValue.get()); | 6111 arg->GetObjectProperty("length", lengthValue.get()); |
| 6097 return lengthValue->ToInteger(); | 6112 return lengthValue->ToInteger(); |
| 6098 } | 6113 } |
| 6099 | 6114 |
| 6100 // static | 6115 // static |
| 6101 FX_BOOL CXFA_FM2JSContext::simpleValueCompare(CFXJSE_Value* pThis, | 6116 FX_BOOL CXFA_FM2JSContext::simpleValueCompare(CFXJSE_Value* pThis, |
| 6102 CFXJSE_Value* firstValue, | 6117 CFXJSE_Value* firstValue, |
| 6103 CFXJSE_Value* secondValue) { | 6118 CFXJSE_Value* secondValue) { |
| 6104 if (!firstValue) | 6119 if (!firstValue) |
| 6105 return FALSE; | 6120 return FALSE; |
| 6106 | 6121 |
| 6107 FX_BOOL bReturn = FALSE; | |
| 6108 if (firstValue->IsString()) { | 6122 if (firstValue->IsString()) { |
| 6109 CFX_ByteString firstString, secondString; | 6123 CFX_ByteString firstString, secondString; |
| 6110 ValueToUTF8String(firstValue, firstString); | 6124 ValueToUTF8String(firstValue, firstString); |
| 6111 ValueToUTF8String(secondValue, secondString); | 6125 ValueToUTF8String(secondValue, secondString); |
| 6112 bReturn = firstString == secondString; | 6126 return firstString == secondString; |
| 6113 } else if (firstValue->IsNumber()) { | 6127 } |
| 6128 if (firstValue->IsNumber()) { | |
| 6114 FX_FLOAT first = ValueToFloat(pThis, firstValue); | 6129 FX_FLOAT first = ValueToFloat(pThis, firstValue); |
| 6115 FX_FLOAT second = ValueToFloat(pThis, secondValue); | 6130 FX_FLOAT second = ValueToFloat(pThis, secondValue); |
| 6116 bReturn = (first == second); | 6131 return (first == second); |
| 6117 } else if (firstValue->IsBoolean()) { | |
| 6118 bReturn = (firstValue->ToBoolean() == secondValue->ToBoolean()); | |
| 6119 } else if (firstValue->IsNull() && secondValue && secondValue->IsNull()) { | |
| 6120 bReturn = TRUE; | |
| 6121 } | 6132 } |
| 6122 return bReturn; | 6133 if (firstValue->IsBoolean()) |
| 6134 return (firstValue->ToBoolean() == secondValue->ToBoolean()); | |
| 6135 | |
| 6136 return firstValue->IsNull() && secondValue && secondValue->IsNull(); | |
| 6123 } | 6137 } |
| 6124 | 6138 |
| 6125 // static | 6139 // static |
| 6126 void CXFA_FM2JSContext::unfoldArgs(CFXJSE_Value* pThis, | 6140 void CXFA_FM2JSContext::unfoldArgs(CFXJSE_Value* pThis, |
| 6127 CFXJSE_Arguments& args, | 6141 CFXJSE_Arguments& args, |
| 6128 CFXJSE_Value**& resultValues, | 6142 CFXJSE_Value**& resultValues, |
| 6129 int32_t& iCount, | 6143 int32_t& iCount, |
| 6130 int32_t iStart) { | 6144 int32_t iStart) { |
| 6145 iCount = 0; | |
| 6146 | |
| 6131 v8::Isolate* pIsolate = ToJSContext(pThis, nullptr)->GetScriptRuntime(); | 6147 v8::Isolate* pIsolate = ToJSContext(pThis, nullptr)->GetScriptRuntime(); |
| 6132 iCount = 0; | |
| 6133 int32_t argc = args.GetLength(); | 6148 int32_t argc = args.GetLength(); |
| 6134 std::vector<std::unique_ptr<CFXJSE_Value>> argsValue; | 6149 std::vector<std::unique_ptr<CFXJSE_Value>> argsValue; |
| 6135 for (int32_t i = 0; i < argc - iStart; i++) { | 6150 for (int32_t i = 0; i < argc - iStart; i++) { |
| 6136 argsValue.push_back(args.GetValue(i + iStart)); | 6151 argsValue.push_back(args.GetValue(i + iStart)); |
| 6137 if (argsValue[i]->IsArray()) { | 6152 if (argsValue[i]->IsArray()) { |
| 6138 std::unique_ptr<CFXJSE_Value> lengthValue(new CFXJSE_Value(pIsolate)); | 6153 std::unique_ptr<CFXJSE_Value> lengthValue(new CFXJSE_Value(pIsolate)); |
| 6139 argsValue[i]->GetObjectProperty("length", lengthValue.get()); | 6154 argsValue[i]->GetObjectProperty("length", lengthValue.get()); |
| 6140 int32_t iLength = lengthValue->ToInteger(); | 6155 int32_t iLength = lengthValue->ToInteger(); |
| 6141 iCount += ((iLength > 2) ? (iLength - 2) : 0); | 6156 iCount += ((iLength > 2) ? (iLength - 2) : 0); |
| 6142 } else { | 6157 } else { |
| 6143 iCount += 1; | 6158 iCount += 1; |
| 6144 } | 6159 } |
| 6145 } | 6160 } |
| 6146 resultValues = FX_Alloc(CFXJSE_Value*, iCount); | 6161 resultValues = FX_Alloc(CFXJSE_Value*, iCount); |
| 6147 for (int32_t i = 0; i < iCount; i++) | 6162 for (int32_t i = 0; i < iCount; i++) |
| 6148 resultValues[i] = new CFXJSE_Value(pIsolate); | 6163 resultValues[i] = new CFXJSE_Value(pIsolate); |
| 6149 | 6164 |
| 6150 int32_t index = 0; | 6165 int32_t index = 0; |
| 6151 for (int32_t i = 0; i < argc - iStart; i++) { | 6166 for (int32_t i = 0; i < argc - iStart; i++) { |
| 6152 if (argsValue[i]->IsArray()) { | 6167 if (argsValue[i]->IsArray()) { |
| 6153 std::unique_ptr<CFXJSE_Value> lengthValue(new CFXJSE_Value(pIsolate)); | 6168 std::unique_ptr<CFXJSE_Value> lengthValue(new CFXJSE_Value(pIsolate)); |
| 6154 argsValue[i]->GetObjectProperty("length", lengthValue.get()); | 6169 argsValue[i]->GetObjectProperty("length", lengthValue.get()); |
| 6155 int32_t iLength = lengthValue->ToInteger(); | 6170 int32_t iLength = lengthValue->ToInteger(); |
| 6156 if (iLength > 2) { | 6171 if (iLength < 3) |
| 6157 std::unique_ptr<CFXJSE_Value> propertyValue(new CFXJSE_Value(pIsolate)); | 6172 continue; |
| 6158 std::unique_ptr<CFXJSE_Value> jsObjectValue(new CFXJSE_Value(pIsolate)); | 6173 |
| 6159 argsValue[i]->GetObjectPropertyByIdx(1, propertyValue.get()); | 6174 std::unique_ptr<CFXJSE_Value> propertyValue(new CFXJSE_Value(pIsolate)); |
| 6160 if (propertyValue->IsNull()) { | 6175 std::unique_ptr<CFXJSE_Value> jsObjectValue(new CFXJSE_Value(pIsolate)); |
| 6161 for (int32_t j = 2; j < iLength; j++) { | 6176 argsValue[i]->GetObjectPropertyByIdx(1, propertyValue.get()); |
| 6162 argsValue[i]->GetObjectPropertyByIdx(j, jsObjectValue.get()); | 6177 if (propertyValue->IsNull()) { |
| 6163 GetObjectDefaultValue(jsObjectValue.get(), resultValues[index]); | 6178 for (int32_t j = 2; j < iLength; j++) { |
| 6164 index++; | 6179 argsValue[i]->GetObjectPropertyByIdx(j, jsObjectValue.get()); |
| 6165 } | 6180 GetObjectDefaultValue(jsObjectValue.get(), resultValues[index]); |
| 6166 } else { | 6181 index++; |
| 6167 CFX_ByteString propertyString; | 6182 } |
| 6168 propertyValue->ToString(propertyString); | 6183 } else { |
| 6169 for (int32_t j = 2; j < iLength; j++) { | 6184 CFX_ByteString propertyString; |
| 6170 argsValue[i]->GetObjectPropertyByIdx(j, jsObjectValue.get()); | 6185 propertyValue->ToString(propertyString); |
| 6171 jsObjectValue->GetObjectProperty(propertyString.AsStringC(), | 6186 for (int32_t j = 2; j < iLength; j++) { |
| 6172 resultValues[index]); | 6187 argsValue[i]->GetObjectPropertyByIdx(j, jsObjectValue.get()); |
| 6173 index++; | 6188 jsObjectValue->GetObjectProperty(propertyString.AsStringC(), |
| 6174 } | 6189 resultValues[index]); |
| 6190 index++; | |
| 6175 } | 6191 } |
| 6176 } | 6192 } |
| 6177 } else if (argsValue[i]->IsObject()) { | 6193 } else if (argsValue[i]->IsObject()) { |
| 6178 GetObjectDefaultValue(argsValue[i].get(), resultValues[index]); | 6194 GetObjectDefaultValue(argsValue[i].get(), resultValues[index]); |
| 6179 index++; | 6195 index++; |
| 6180 } else { | 6196 } else { |
| 6181 resultValues[index]->Assign(argsValue[i].get()); | 6197 resultValues[index]->Assign(argsValue[i].get()); |
| 6182 index++; | 6198 index++; |
| 6183 } | 6199 } |
| 6184 } | 6200 } |
| (...skipping 18 matching lines...) Expand all Loading... | |
| 6203 return FALSE; | 6219 return FALSE; |
| 6204 | 6220 |
| 6205 pNode->Script_Som_DefaultValue(hNewValue, TRUE, (XFA_ATTRIBUTE)-1); | 6221 pNode->Script_Som_DefaultValue(hNewValue, TRUE, (XFA_ATTRIBUTE)-1); |
| 6206 return TRUE; | 6222 return TRUE; |
| 6207 } | 6223 } |
| 6208 | 6224 |
| 6209 // static | 6225 // static |
| 6210 void CXFA_FM2JSContext::GenerateSomExpression(const CFX_ByteStringC& szName, | 6226 void CXFA_FM2JSContext::GenerateSomExpression(const CFX_ByteStringC& szName, |
| 6211 int32_t iIndexFlags, | 6227 int32_t iIndexFlags, |
| 6212 int32_t iIndexValue, | 6228 int32_t iIndexValue, |
| 6213 FX_BOOL bIsStar, | 6229 bool bIsStar, |
| 6214 CFX_ByteString& szSomExp) { | 6230 CFX_ByteString& szSomExp) { |
| 6215 if (bIsStar) { | 6231 if (bIsStar) { |
| 6216 szSomExp = szName + "[*]"; | 6232 szSomExp = szName + "[*]"; |
| 6217 return; | 6233 return; |
| 6218 } | 6234 } |
| 6219 if (iIndexFlags == 0) { | 6235 if (iIndexFlags == 0) { |
| 6220 szSomExp = szName; | 6236 szSomExp = szName; |
| 6221 return; | 6237 return; |
| 6222 } | 6238 } |
| 6223 if (iIndexFlags == 1 || iIndexValue == 0) { | 6239 if (iIndexFlags == 1 || iIndexValue == 0) { |
| (...skipping 11 matching lines...) Expand all Loading... | |
| 6235 szSomExp += CFX_ByteString::FormatInteger(iIndexValue); | 6251 szSomExp += CFX_ByteString::FormatInteger(iIndexValue); |
| 6236 szSomExp += "]"; | 6252 szSomExp += "]"; |
| 6237 } | 6253 } |
| 6238 } | 6254 } |
| 6239 | 6255 |
| 6240 // static | 6256 // static |
| 6241 FX_BOOL CXFA_FM2JSContext::GetObjectByName( | 6257 FX_BOOL CXFA_FM2JSContext::GetObjectByName( |
| 6242 CFXJSE_Value* pThis, | 6258 CFXJSE_Value* pThis, |
| 6243 CFXJSE_Value* accessorValue, | 6259 CFXJSE_Value* accessorValue, |
| 6244 const CFX_ByteStringC& szAccessorName) { | 6260 const CFX_ByteStringC& szAccessorName) { |
| 6245 FX_BOOL bFlags = FALSE; | |
| 6246 CXFA_Document* pDoc = ToJSContext(pThis, nullptr)->GetDocument(); | 6261 CXFA_Document* pDoc = ToJSContext(pThis, nullptr)->GetDocument(); |
| 6247 if (!pDoc) { | 6262 if (!pDoc) |
| 6248 return bFlags; | 6263 return FALSE; |
| 6249 } | 6264 |
| 6250 CXFA_ScriptContext* pScriptContext = pDoc->GetScriptContext(); | 6265 CXFA_ScriptContext* pScriptContext = pDoc->GetScriptContext(); |
| 6251 XFA_RESOLVENODE_RS resoveNodeRS; | 6266 XFA_RESOLVENODE_RS resoveNodeRS; |
| 6252 uint32_t dwFlags = XFA_RESOLVENODE_Children | XFA_RESOLVENODE_Properties | | 6267 uint32_t dwFlags = XFA_RESOLVENODE_Children | XFA_RESOLVENODE_Properties | |
| 6253 XFA_RESOLVENODE_Siblings | XFA_RESOLVENODE_Parent; | 6268 XFA_RESOLVENODE_Siblings | XFA_RESOLVENODE_Parent; |
| 6254 int32_t iRet = pScriptContext->ResolveObjects( | 6269 int32_t iRet = pScriptContext->ResolveObjects( |
| 6255 pScriptContext->GetThisObject(), | 6270 pScriptContext->GetThisObject(), |
| 6256 CFX_WideString::FromUTF8(szAccessorName).AsStringC(), resoveNodeRS, | 6271 CFX_WideString::FromUTF8(szAccessorName).AsStringC(), resoveNodeRS, |
| 6257 dwFlags); | 6272 dwFlags); |
| 6258 if (iRet >= 1 && resoveNodeRS.dwFlags == XFA_RESOVENODE_RSTYPE_Nodes) { | 6273 if (iRet >= 1 && resoveNodeRS.dwFlags == XFA_RESOVENODE_RSTYPE_Nodes) { |
| 6259 accessorValue->Assign( | 6274 accessorValue->Assign( |
| 6260 pScriptContext->GetJSValueFromMap(resoveNodeRS.nodes.GetAt(0))); | 6275 pScriptContext->GetJSValueFromMap(resoveNodeRS.nodes.GetAt(0))); |
| 6261 bFlags = TRUE; | 6276 return TRUE; |
| 6262 } | 6277 } |
| 6263 return bFlags; | 6278 return FALSE; |
| 6264 } | 6279 } |
| 6265 | 6280 |
| 6266 // static | 6281 // static |
| 6267 int32_t CXFA_FM2JSContext::ResolveObjects(CFXJSE_Value* pThis, | 6282 int32_t CXFA_FM2JSContext::ResolveObjects(CFXJSE_Value* pThis, |
| 6268 CFXJSE_Value* pRefValue, | 6283 CFXJSE_Value* pRefValue, |
| 6269 const CFX_ByteStringC& bsSomExp, | 6284 const CFX_ByteStringC& bsSomExp, |
| 6270 XFA_RESOLVENODE_RS& resoveNodeRS, | 6285 XFA_RESOLVENODE_RS& resoveNodeRS, |
| 6271 FX_BOOL bdotAccessor, | 6286 FX_BOOL bdotAccessor, |
| 6272 FX_BOOL bHasNoResolveName) { | 6287 FX_BOOL bHasNoResolveName) { |
| 6288 CXFA_Document* pDoc = ToJSContext(pThis, nullptr)->GetDocument(); | |
| 6289 if (!pDoc) | |
| 6290 return -1; | |
| 6291 | |
| 6273 CFX_WideString wsSomExpression = CFX_WideString::FromUTF8(bsSomExp); | 6292 CFX_WideString wsSomExpression = CFX_WideString::FromUTF8(bsSomExp); |
| 6274 int32_t iRet = -1; | |
| 6275 CXFA_Document* pDoc = ToJSContext(pThis, nullptr)->GetDocument(); | |
| 6276 if (!pDoc) { | |
| 6277 return iRet; | |
| 6278 } | |
| 6279 CXFA_ScriptContext* pScriptContext = pDoc->GetScriptContext(); | 6293 CXFA_ScriptContext* pScriptContext = pDoc->GetScriptContext(); |
| 6280 CXFA_Object* pNode = nullptr; | 6294 CXFA_Object* pNode = nullptr; |
| 6281 uint32_t dFlags = 0UL; | 6295 uint32_t dFlags = 0UL; |
| 6282 if (bdotAccessor) { | 6296 if (bdotAccessor) { |
| 6283 if (pRefValue && pRefValue->IsNull()) { | 6297 if (pRefValue && pRefValue->IsNull()) { |
| 6284 pNode = pScriptContext->GetThisObject(); | 6298 pNode = pScriptContext->GetThisObject(); |
| 6285 dFlags = XFA_RESOLVENODE_Siblings | XFA_RESOLVENODE_Parent; | 6299 dFlags = XFA_RESOLVENODE_Siblings | XFA_RESOLVENODE_Parent; |
| 6286 } else { | 6300 } else { |
| 6287 pNode = CXFA_ScriptContext::ToObject(pRefValue, nullptr); | 6301 pNode = CXFA_ScriptContext::ToObject(pRefValue, nullptr); |
| 6288 ASSERT(pNode); | 6302 ASSERT(pNode); |
| 6289 if (bHasNoResolveName) { | 6303 if (bHasNoResolveName) { |
| 6290 CFX_WideString wsName; | 6304 CFX_WideString wsName; |
| 6291 if (CXFA_Node* pXFANode = pNode->AsNode()) { | 6305 if (CXFA_Node* pXFANode = pNode->AsNode()) |
| 6292 pXFANode->GetAttribute(XFA_ATTRIBUTE_Name, wsName, FALSE); | 6306 pXFANode->GetAttribute(XFA_ATTRIBUTE_Name, wsName, FALSE); |
| 6293 } | 6307 |
| 6294 if (wsName.IsEmpty()) { | 6308 if (wsName.IsEmpty()) { |
| 6295 CFX_WideStringC className; | 6309 CFX_WideStringC className; |
| 6296 pNode->GetClassName(className); | 6310 pNode->GetClassName(className); |
| 6297 wsName = FX_WSTRC(L"#") + className; | 6311 wsName = FX_WSTRC(L"#") + className; |
| 6298 } | 6312 } |
| 6299 wsSomExpression = wsName + wsSomExpression; | 6313 wsSomExpression = wsName + wsSomExpression; |
| 6300 dFlags = XFA_RESOLVENODE_Siblings; | 6314 dFlags = XFA_RESOLVENODE_Siblings; |
| 6301 } else { | 6315 } else { |
| 6302 dFlags = (bsSomExp == "*") | 6316 dFlags = (bsSomExp == "*") |
| 6303 ? (XFA_RESOLVENODE_Children) | 6317 ? (XFA_RESOLVENODE_Children) |
| 6304 : (XFA_RESOLVENODE_Children | XFA_RESOLVENODE_Attributes | | 6318 : (XFA_RESOLVENODE_Children | XFA_RESOLVENODE_Attributes | |
| 6305 XFA_RESOLVENODE_Properties); | 6319 XFA_RESOLVENODE_Properties); |
| 6306 } | 6320 } |
| 6307 } | 6321 } |
| 6308 } else { | 6322 } else { |
| 6309 pNode = CXFA_ScriptContext::ToObject(pRefValue, nullptr); | 6323 pNode = CXFA_ScriptContext::ToObject(pRefValue, nullptr); |
| 6310 dFlags = XFA_RESOLVENODE_AnyChild; | 6324 dFlags = XFA_RESOLVENODE_AnyChild; |
| 6311 } | 6325 } |
| 6312 iRet = pScriptContext->ResolveObjects(pNode, wsSomExpression.AsStringC(), | 6326 return pScriptContext->ResolveObjects(pNode, wsSomExpression.AsStringC(), |
| 6313 resoveNodeRS, dFlags); | 6327 resoveNodeRS, dFlags); |
| 6314 return iRet; | |
| 6315 } | 6328 } |
| 6316 | 6329 |
| 6317 // static | 6330 // static |
| 6318 void CXFA_FM2JSContext::ParseResolveResult( | 6331 void CXFA_FM2JSContext::ParseResolveResult( |
| 6319 CFXJSE_Value* pThis, | 6332 CFXJSE_Value* pThis, |
| 6320 const XFA_RESOLVENODE_RS& resoveNodeRS, | 6333 const XFA_RESOLVENODE_RS& resoveNodeRS, |
| 6321 CFXJSE_Value* pParentValue, | 6334 CFXJSE_Value* pParentValue, |
| 6322 CFXJSE_Value**& resultValues, | 6335 CFXJSE_Value**& resultValues, |
| 6323 int32_t& iSize, | 6336 int32_t& iSize, |
| 6324 FX_BOOL& bAttribute) { | 6337 FX_BOOL& bAttribute) { |
| 6338 iSize = 0; | |
| 6339 resultValues = nullptr; | |
| 6340 | |
| 6325 CXFA_FM2JSContext* pContext = ToJSContext(pThis, nullptr); | 6341 CXFA_FM2JSContext* pContext = ToJSContext(pThis, nullptr); |
| 6326 v8::Isolate* pIsolate = pContext->GetScriptRuntime(); | 6342 v8::Isolate* pIsolate = pContext->GetScriptRuntime(); |
| 6327 iSize = 0; | |
| 6328 resultValues = nullptr; | |
| 6329 if (resoveNodeRS.dwFlags == XFA_RESOVENODE_RSTYPE_Nodes) { | 6343 if (resoveNodeRS.dwFlags == XFA_RESOVENODE_RSTYPE_Nodes) { |
| 6330 bAttribute = FALSE; | 6344 bAttribute = FALSE; |
| 6331 iSize = resoveNodeRS.nodes.GetSize(); | 6345 iSize = resoveNodeRS.nodes.GetSize(); |
| 6332 resultValues = FX_Alloc(CFXJSE_Value*, iSize); | 6346 resultValues = FX_Alloc(CFXJSE_Value*, iSize); |
| 6333 for (int32_t i = 0; i < iSize; i++) { | 6347 for (int32_t i = 0; i < iSize; i++) { |
| 6334 resultValues[i] = new CFXJSE_Value(pIsolate); | 6348 resultValues[i] = new CFXJSE_Value(pIsolate); |
| 6335 resultValues[i]->Assign( | 6349 resultValues[i]->Assign( |
| 6336 pContext->GetDocument()->GetScriptContext()->GetJSValueFromMap( | 6350 pContext->GetDocument()->GetScriptContext()->GetJSValueFromMap( |
| 6337 resoveNodeRS.nodes.GetAt(i))); | 6351 resoveNodeRS.nodes.GetAt(i))); |
| 6338 } | 6352 } |
| 6339 } else { | 6353 return; |
| 6340 CXFA_ValueArray objectProperties(pIsolate); | 6354 } |
| 6341 int32_t iRet = resoveNodeRS.GetAttributeResult(objectProperties); | 6355 |
| 6342 bAttribute = (iRet == 0); | 6356 CXFA_ValueArray objectProperties(pIsolate); |
| 6343 if (bAttribute) { | 6357 int32_t iRet = resoveNodeRS.GetAttributeResult(objectProperties); |
| 6344 if (pParentValue && pParentValue->IsObject()) { | 6358 bAttribute = (iRet == 0); |
| 6345 iSize = 1; | 6359 if (!bAttribute) { |
| 6346 resultValues = FX_Alloc(CFXJSE_Value*, 1); | 6360 iSize = iRet; |
| 6347 resultValues[0] = new CFXJSE_Value(pIsolate); | 6361 resultValues = FX_Alloc(CFXJSE_Value*, iSize); |
| 6348 resultValues[0]->Assign(pParentValue); | 6362 for (int32_t i = 0; i < iSize; i++) { |
| 6349 } | 6363 resultValues[i] = new CFXJSE_Value(pIsolate); |
| 6350 } else { | 6364 resultValues[i]->Assign(objectProperties[i]); |
| 6351 iSize = iRet; | |
| 6352 resultValues = FX_Alloc(CFXJSE_Value*, iSize); | |
| 6353 for (int32_t i = 0; i < iSize; i++) { | |
| 6354 resultValues[i] = new CFXJSE_Value(pIsolate); | |
| 6355 resultValues[i]->Assign(objectProperties[i]); | |
| 6356 } | |
| 6357 } | 6365 } |
| 6366 return; | |
| 6358 } | 6367 } |
| 6368 | |
| 6369 if (!pParentValue || !pParentValue->IsObject()) | |
| 6370 return; | |
| 6371 | |
| 6372 iSize = 1; | |
| 6373 resultValues = FX_Alloc(CFXJSE_Value*, 1); | |
| 6374 resultValues[0] = new CFXJSE_Value(pIsolate); | |
| 6375 resultValues[0]->Assign(pParentValue); | |
| 6359 } | 6376 } |
| 6360 | 6377 |
| 6361 // static | 6378 // static |
| 6362 int32_t CXFA_FM2JSContext::ValueToInteger(CFXJSE_Value* pThis, | 6379 int32_t CXFA_FM2JSContext::ValueToInteger(CFXJSE_Value* pThis, |
| 6363 CFXJSE_Value* pValue) { | 6380 CFXJSE_Value* pValue) { |
| 6364 if (!pValue) | 6381 if (!pValue) |
| 6365 return 0; | 6382 return 0; |
| 6366 | 6383 |
| 6367 v8::Isolate* pIsolate = ToJSContext(pThis, nullptr)->GetScriptRuntime(); | 6384 v8::Isolate* pIsolate = ToJSContext(pThis, nullptr)->GetScriptRuntime(); |
| 6368 int32_t iValue = 0; | |
| 6369 if (pValue->IsArray()) { | 6385 if (pValue->IsArray()) { |
| 6370 std::unique_ptr<CFXJSE_Value> propertyValue(new CFXJSE_Value(pIsolate)); | 6386 std::unique_ptr<CFXJSE_Value> propertyValue(new CFXJSE_Value(pIsolate)); |
| 6371 std::unique_ptr<CFXJSE_Value> jsObjectValue(new CFXJSE_Value(pIsolate)); | 6387 std::unique_ptr<CFXJSE_Value> jsObjectValue(new CFXJSE_Value(pIsolate)); |
| 6372 std::unique_ptr<CFXJSE_Value> newPropertyValue(new CFXJSE_Value(pIsolate)); | 6388 std::unique_ptr<CFXJSE_Value> newPropertyValue(new CFXJSE_Value(pIsolate)); |
| 6373 pValue->GetObjectPropertyByIdx(1, propertyValue.get()); | 6389 pValue->GetObjectPropertyByIdx(1, propertyValue.get()); |
| 6374 pValue->GetObjectPropertyByIdx(2, jsObjectValue.get()); | 6390 pValue->GetObjectPropertyByIdx(2, jsObjectValue.get()); |
| 6375 if (propertyValue->IsNull()) { | 6391 if (propertyValue->IsNull()) { |
| 6376 GetObjectDefaultValue(jsObjectValue.get(), newPropertyValue.get()); | 6392 GetObjectDefaultValue(jsObjectValue.get(), newPropertyValue.get()); |
| 6377 } else { | 6393 return ValueToInteger(pThis, newPropertyValue.get()); |
| 6378 CFX_ByteString propertyStr; | |
| 6379 propertyValue->ToString(propertyStr); | |
| 6380 jsObjectValue->GetObjectProperty(propertyStr.AsStringC(), | |
| 6381 newPropertyValue.get()); | |
| 6382 } | 6394 } |
| 6383 iValue = ValueToInteger(pThis, newPropertyValue.get()); | 6395 |
| 6384 return iValue; | 6396 CFX_ByteString propertyStr; |
| 6385 } else if (pValue->IsObject()) { | 6397 propertyValue->ToString(propertyStr); |
| 6398 jsObjectValue->GetObjectProperty(propertyStr.AsStringC(), | |
| 6399 newPropertyValue.get()); | |
| 6400 return ValueToInteger(pThis, newPropertyValue.get()); | |
| 6401 } | |
| 6402 if (pValue->IsObject()) { | |
| 6386 std::unique_ptr<CFXJSE_Value> newPropertyValue(new CFXJSE_Value(pIsolate)); | 6403 std::unique_ptr<CFXJSE_Value> newPropertyValue(new CFXJSE_Value(pIsolate)); |
| 6387 GetObjectDefaultValue(pValue, newPropertyValue.get()); | 6404 GetObjectDefaultValue(pValue, newPropertyValue.get()); |
| 6388 iValue = ValueToInteger(pThis, newPropertyValue.get()); | 6405 return ValueToInteger(pThis, newPropertyValue.get()); |
| 6389 return iValue; | 6406 } |
| 6390 } else if (pValue->IsString()) { | 6407 if (pValue->IsString()) { |
| 6391 CFX_ByteString szValue; | 6408 CFX_ByteString szValue; |
| 6392 pValue->ToString(szValue); | 6409 pValue->ToString(szValue); |
| 6393 iValue = FXSYS_atoi(szValue.c_str()); | 6410 return FXSYS_atoi(szValue.c_str()); |
| 6394 } else { | |
| 6395 iValue = pValue->ToInteger(); | |
| 6396 } | 6411 } |
| 6397 return iValue; | 6412 return pValue->ToInteger(); |
| 6398 } | 6413 } |
| 6399 | 6414 |
| 6400 // static | 6415 // static |
| 6401 FX_FLOAT CXFA_FM2JSContext::ValueToFloat(CFXJSE_Value* pThis, | 6416 FX_FLOAT CXFA_FM2JSContext::ValueToFloat(CFXJSE_Value* pThis, |
| 6402 CFXJSE_Value* arg) { | 6417 CFXJSE_Value* arg) { |
| 6403 if (!arg) | 6418 if (!arg) |
| 6404 return 0.0f; | 6419 return 0.0f; |
| 6405 | 6420 |
| 6406 v8::Isolate* pIsolate = ToJSContext(pThis, nullptr)->GetScriptRuntime(); | 6421 v8::Isolate* pIsolate = ToJSContext(pThis, nullptr)->GetScriptRuntime(); |
| 6407 FX_FLOAT fRet = 0.0f; | |
| 6408 if (arg->IsArray()) { | 6422 if (arg->IsArray()) { |
| 6409 std::unique_ptr<CFXJSE_Value> propertyValue(new CFXJSE_Value(pIsolate)); | 6423 std::unique_ptr<CFXJSE_Value> propertyValue(new CFXJSE_Value(pIsolate)); |
| 6410 std::unique_ptr<CFXJSE_Value> jsObjectValue(new CFXJSE_Value(pIsolate)); | 6424 std::unique_ptr<CFXJSE_Value> jsObjectValue(new CFXJSE_Value(pIsolate)); |
| 6411 std::unique_ptr<CFXJSE_Value> newPropertyValue(new CFXJSE_Value(pIsolate)); | 6425 std::unique_ptr<CFXJSE_Value> newPropertyValue(new CFXJSE_Value(pIsolate)); |
| 6412 arg->GetObjectPropertyByIdx(1, propertyValue.get()); | 6426 arg->GetObjectPropertyByIdx(1, propertyValue.get()); |
| 6413 arg->GetObjectPropertyByIdx(2, jsObjectValue.get()); | 6427 arg->GetObjectPropertyByIdx(2, jsObjectValue.get()); |
| 6414 if (propertyValue->IsNull()) { | 6428 if (propertyValue->IsNull()) { |
| 6415 GetObjectDefaultValue(jsObjectValue.get(), newPropertyValue.get()); | 6429 GetObjectDefaultValue(jsObjectValue.get(), newPropertyValue.get()); |
| 6416 } else { | 6430 return ValueToFloat(pThis, newPropertyValue.get()); |
| 6417 CFX_ByteString propertyStr; | |
| 6418 propertyValue->ToString(propertyStr); | |
| 6419 jsObjectValue->GetObjectProperty(propertyStr.AsStringC(), | |
| 6420 newPropertyValue.get()); | |
| 6421 } | 6431 } |
| 6422 fRet = ValueToFloat(pThis, newPropertyValue.get()); | 6432 CFX_ByteString propertyStr; |
| 6423 } else if (arg->IsObject()) { | 6433 propertyValue->ToString(propertyStr); |
| 6434 jsObjectValue->GetObjectProperty(propertyStr.AsStringC(), | |
| 6435 newPropertyValue.get()); | |
| 6436 return ValueToFloat(pThis, newPropertyValue.get()); | |
| 6437 } | |
| 6438 if (arg->IsObject()) { | |
| 6424 std::unique_ptr<CFXJSE_Value> newPropertyValue(new CFXJSE_Value(pIsolate)); | 6439 std::unique_ptr<CFXJSE_Value> newPropertyValue(new CFXJSE_Value(pIsolate)); |
| 6425 GetObjectDefaultValue(arg, newPropertyValue.get()); | 6440 GetObjectDefaultValue(arg, newPropertyValue.get()); |
| 6426 fRet = ValueToFloat(pThis, newPropertyValue.get()); | 6441 return ValueToFloat(pThis, newPropertyValue.get()); |
| 6427 } else if (arg->IsString()) { | 6442 } |
| 6443 if (arg->IsString()) { | |
| 6428 CFX_ByteString bsOutput; | 6444 CFX_ByteString bsOutput; |
| 6429 arg->ToString(bsOutput); | 6445 arg->ToString(bsOutput); |
| 6430 fRet = (FX_FLOAT)XFA_ByteStringToDouble(bsOutput.AsStringC()); | 6446 return (FX_FLOAT)XFA_ByteStringToDouble(bsOutput.AsStringC()); |
| 6431 } else if (arg->IsUndefined()) { | |
| 6432 fRet = 0; | |
| 6433 } else { | |
| 6434 fRet = arg->ToFloat(); | |
| 6435 } | 6447 } |
| 6436 return fRet; | 6448 if (arg->IsUndefined()) |
| 6449 return 0; | |
| 6450 | |
| 6451 return arg->ToFloat(); | |
| 6437 } | 6452 } |
| 6438 | 6453 |
| 6439 // static | 6454 // static |
| 6440 FX_DOUBLE CXFA_FM2JSContext::ValueToDouble(CFXJSE_Value* pThis, | 6455 FX_DOUBLE CXFA_FM2JSContext::ValueToDouble(CFXJSE_Value* pThis, |
| 6441 CFXJSE_Value* arg) { | 6456 CFXJSE_Value* arg) { |
| 6442 if (!arg) | 6457 if (!arg) |
| 6443 return 0; | 6458 return 0; |
| 6444 | 6459 |
| 6445 v8::Isolate* pIsolate = ToJSContext(pThis, nullptr)->GetScriptRuntime(); | 6460 v8::Isolate* pIsolate = ToJSContext(pThis, nullptr)->GetScriptRuntime(); |
| 6446 FX_DOUBLE dRet = 0; | |
| 6447 if (arg->IsArray()) { | 6461 if (arg->IsArray()) { |
| 6448 std::unique_ptr<CFXJSE_Value> propertyValue(new CFXJSE_Value(pIsolate)); | 6462 std::unique_ptr<CFXJSE_Value> propertyValue(new CFXJSE_Value(pIsolate)); |
| 6449 std::unique_ptr<CFXJSE_Value> jsObjectValue(new CFXJSE_Value(pIsolate)); | 6463 std::unique_ptr<CFXJSE_Value> jsObjectValue(new CFXJSE_Value(pIsolate)); |
| 6450 std::unique_ptr<CFXJSE_Value> newPropertyValue(new CFXJSE_Value(pIsolate)); | 6464 std::unique_ptr<CFXJSE_Value> newPropertyValue(new CFXJSE_Value(pIsolate)); |
| 6451 arg->GetObjectPropertyByIdx(1, propertyValue.get()); | 6465 arg->GetObjectPropertyByIdx(1, propertyValue.get()); |
| 6452 arg->GetObjectPropertyByIdx(2, jsObjectValue.get()); | 6466 arg->GetObjectPropertyByIdx(2, jsObjectValue.get()); |
| 6453 if (propertyValue->IsNull()) { | 6467 if (propertyValue->IsNull()) { |
| 6454 GetObjectDefaultValue(jsObjectValue.get(), newPropertyValue.get()); | 6468 GetObjectDefaultValue(jsObjectValue.get(), newPropertyValue.get()); |
| 6455 } else { | 6469 return ValueToDouble(pThis, newPropertyValue.get()); |
| 6456 CFX_ByteString propertyStr; | |
| 6457 propertyValue->ToString(propertyStr); | |
| 6458 jsObjectValue->GetObjectProperty(propertyStr.AsStringC(), | |
| 6459 newPropertyValue.get()); | |
| 6460 } | 6470 } |
| 6461 dRet = ValueToDouble(pThis, newPropertyValue.get()); | 6471 CFX_ByteString propertyStr; |
| 6462 } else if (arg->IsObject()) { | 6472 propertyValue->ToString(propertyStr); |
| 6473 jsObjectValue->GetObjectProperty(propertyStr.AsStringC(), | |
| 6474 newPropertyValue.get()); | |
| 6475 return ValueToDouble(pThis, newPropertyValue.get()); | |
| 6476 } | |
| 6477 if (arg->IsObject()) { | |
| 6463 std::unique_ptr<CFXJSE_Value> newPropertyValue(new CFXJSE_Value(pIsolate)); | 6478 std::unique_ptr<CFXJSE_Value> newPropertyValue(new CFXJSE_Value(pIsolate)); |
| 6464 GetObjectDefaultValue(arg, newPropertyValue.get()); | 6479 GetObjectDefaultValue(arg, newPropertyValue.get()); |
| 6465 dRet = ValueToDouble(pThis, newPropertyValue.get()); | 6480 return ValueToDouble(pThis, newPropertyValue.get()); |
| 6466 } else if (arg->IsString()) { | 6481 } |
| 6482 if (arg->IsString()) { | |
| 6467 CFX_ByteString bsOutput; | 6483 CFX_ByteString bsOutput; |
| 6468 arg->ToString(bsOutput); | 6484 arg->ToString(bsOutput); |
| 6469 dRet = XFA_ByteStringToDouble(bsOutput.AsStringC()); | 6485 return XFA_ByteStringToDouble(bsOutput.AsStringC()); |
| 6470 } else if (arg->IsUndefined()) { | |
| 6471 dRet = 0; | |
| 6472 } else { | |
| 6473 dRet = arg->ToDouble(); | |
| 6474 } | 6486 } |
| 6475 return dRet; | 6487 if (arg->IsUndefined()) |
| 6488 return 0; | |
| 6489 return arg->ToDouble(); | |
| 6476 } | 6490 } |
| 6477 | 6491 |
| 6478 // static. | 6492 // static. |
| 6479 double CXFA_FM2JSContext::ExtractDouble(CFXJSE_Value* pThis, | 6493 double CXFA_FM2JSContext::ExtractDouble(CFXJSE_Value* pThis, |
| 6480 CFXJSE_Value* src, | 6494 CFXJSE_Value* src, |
| 6481 bool* ret) { | 6495 bool* ret) { |
| 6482 ASSERT(ret); | 6496 ASSERT(ret); |
| 6483 | |
| 6484 v8::Isolate* pIsolate = ToJSContext(pThis, nullptr)->GetScriptRuntime(); | |
| 6485 *ret = true; | 6497 *ret = true; |
| 6486 | 6498 |
| 6487 if (!src) | 6499 if (!src) |
| 6488 return 0; | 6500 return 0; |
| 6489 | 6501 |
| 6490 if (src->IsArray()) { | 6502 if (!src->IsArray()) |
| 6491 std::unique_ptr<CFXJSE_Value> lengthValue(new CFXJSE_Value(pIsolate)); | 6503 return ValueToDouble(pThis, src); |
| 6492 src->GetObjectProperty("length", lengthValue.get()); | |
| 6493 int32_t iLength = lengthValue->ToInteger(); | |
| 6494 if (iLength <= 2) { | |
| 6495 *ret = false; | |
| 6496 return 0.0; | |
| 6497 } | |
| 6498 | 6504 |
| 6499 std::unique_ptr<CFXJSE_Value> propertyValue(new CFXJSE_Value(pIsolate)); | 6505 v8::Isolate* pIsolate = ToJSContext(pThis, nullptr)->GetScriptRuntime(); |
| 6500 std::unique_ptr<CFXJSE_Value> jsObjectValue(new CFXJSE_Value(pIsolate)); | 6506 std::unique_ptr<CFXJSE_Value> lengthValue(new CFXJSE_Value(pIsolate)); |
| 6501 src->GetObjectPropertyByIdx(1, propertyValue.get()); | 6507 src->GetObjectProperty("length", lengthValue.get()); |
| 6502 src->GetObjectPropertyByIdx(2, jsObjectValue.get()); | 6508 int32_t iLength = lengthValue->ToInteger(); |
| 6503 if (propertyValue->IsNull()) | 6509 if (iLength <= 2) { |
| 6504 return ValueToDouble(pThis, jsObjectValue.get()); | 6510 *ret = false; |
| 6511 return 0.0; | |
| 6512 } | |
| 6505 | 6513 |
| 6506 CFX_ByteString propertyStr; | 6514 std::unique_ptr<CFXJSE_Value> propertyValue(new CFXJSE_Value(pIsolate)); |
| 6507 propertyValue->ToString(propertyStr); | 6515 std::unique_ptr<CFXJSE_Value> jsObjectValue(new CFXJSE_Value(pIsolate)); |
| 6508 std::unique_ptr<CFXJSE_Value> newPropertyValue(new CFXJSE_Value(pIsolate)); | 6516 src->GetObjectPropertyByIdx(1, propertyValue.get()); |
| 6509 jsObjectValue->GetObjectProperty(propertyStr.AsStringC(), | 6517 src->GetObjectPropertyByIdx(2, jsObjectValue.get()); |
| 6510 newPropertyValue.get()); | 6518 if (propertyValue->IsNull()) |
| 6511 return ValueToDouble(pThis, newPropertyValue.get()); | 6519 return ValueToDouble(pThis, jsObjectValue.get()); |
| 6512 } | 6520 |
| 6513 return ValueToDouble(pThis, src); | 6521 CFX_ByteString propertyStr; |
| 6522 propertyValue->ToString(propertyStr); | |
| 6523 std::unique_ptr<CFXJSE_Value> newPropertyValue(new CFXJSE_Value(pIsolate)); | |
| 6524 jsObjectValue->GetObjectProperty(propertyStr.AsStringC(), | |
| 6525 newPropertyValue.get()); | |
| 6526 return ValueToDouble(pThis, newPropertyValue.get()); | |
| 6514 } | 6527 } |
| 6515 | 6528 |
| 6516 // static | 6529 // static |
| 6517 void CXFA_FM2JSContext::ValueToUTF8String(CFXJSE_Value* arg, | 6530 void CXFA_FM2JSContext::ValueToUTF8String(CFXJSE_Value* arg, |
| 6518 CFX_ByteString& szOutputString) { | 6531 CFX_ByteString& szOutputString) { |
| 6519 if (!arg) | 6532 if (!arg) |
| 6520 return; | 6533 return; |
| 6521 | 6534 |
| 6522 if (arg->IsNull() || arg->IsUndefined()) { | 6535 if (arg->IsNull() || arg->IsUndefined()) { |
| 6523 szOutputString = ""; | 6536 szOutputString = ""; |
| (...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 6578 CFX_WideString wsFormat; | 6591 CFX_WideString wsFormat; |
| 6579 pAppProvider->LoadString(iStringID, wsFormat); | 6592 pAppProvider->LoadString(iStringID, wsFormat); |
| 6580 CFX_WideString wsMessage; | 6593 CFX_WideString wsMessage; |
| 6581 va_list arg_ptr; | 6594 va_list arg_ptr; |
| 6582 va_start(arg_ptr, iStringID); | 6595 va_start(arg_ptr, iStringID); |
| 6583 wsMessage.FormatV(wsFormat.c_str(), arg_ptr); | 6596 wsMessage.FormatV(wsFormat.c_str(), arg_ptr); |
| 6584 va_end(arg_ptr); | 6597 va_end(arg_ptr); |
| 6585 FXJSE_ThrowMessage( | 6598 FXJSE_ThrowMessage( |
| 6586 FX_UTF8Encode(wsMessage.c_str(), wsMessage.GetLength()).AsStringC()); | 6599 FX_UTF8Encode(wsMessage.c_str(), wsMessage.GetLength()).AsStringC()); |
| 6587 } | 6600 } |
| OLD | NEW |