| 674 | } |
| 675 | |
| 676 | ResultCode Debugger::EvaluateInServerThread(uint32_t seq, EvalType type, uint32_t nodeId, MsgTuple const & params, |
| 677 | bool & querySucceeded) |
| 678 | { |
| 679 | Debug("Debugger::EvaluateInServerThread(): Type %d, node %d", type, nodeId); |
| 680 | |
| 681 | if (nodeId == 0 || nodeId > (*globals_.Nodes)->Db.Size) { |
| 682 | Debug("Debugger::EvaluateInServerThread(): Tried to call nonexistent node %d", nodeId); |
| 683 | return ResultCode::InvalidNodeId; |
| 684 | } |
| 685 | |
| 686 | auto node = (*globals_.Nodes)->Db.Start[nodeId - 1]; |
| 687 | if (node->Function == nullptr) { |
| 688 | Debug("Debugger::EvaluateInServerThread(): Node has no function!"); |
| 689 | return ResultCode::NotCallable; |
| 690 | } |
| 691 | |
| 692 | auto const & sig = node->Function->Signature; |
| 693 | if (params.column_size() != sig->Params->Params.Size) { |
| 694 | Debug("Debugger::EvaluateInServerThread(): Got %d params, but node %d has %d!", |
| 695 | params.column_size(), nodeId, sig->Params->Params.Size); |
| 696 | return ResultCode::InvalidParamTupleArity; |
| 697 | } |
| 698 | |
| 699 | auto typeNode = sig->Params->Params.Head->Next; |
| 700 | for (unsigned i = 0; i < sig->Params->Params.Size; i++) { |
| 701 | auto typeId = params.column()[i].type_id(); |
| 702 | if (typeId != (uint32_t)ValueType::None |
| 703 | && !AreTypesCompatible(typeNode->Item.Type, typeId)) { |
| 704 | Debug("Debugger::EvaluateInServerThread(): Parameter %d type mismatch; expected %d, got %d!", |
| 705 | i, typeNode->Item.Type, typeId); |
| 706 | return ResultCode::InvalidParamType; |
| 707 | } |
| 708 | typeNode = typeNode->Next; |
| 709 | |
| 710 | if (typeId == (uint32_t)ValueType::None |
| 711 | && type != EvalType::Pushdown |
| 712 | && !sig->OutParamList.isOutParam(i)) { |
| 713 | Debug("Debugger::EvaluateInServerThread(): Got a null value for IN parameter %d!", i); |
| 714 | return ResultCode::MissingRequiredParam; |
| 715 | } |
| 716 | } |
| 717 | |
| 718 | auto adapter = debugAdapters_.FindAdapter(params.column_size()); |
| 719 | if (adapter == nullptr) { |
| 720 | Debug("Debugger::EvaluateInServerThread(): No debug adapter available for %d columns!", params.column_size()); |
| 721 | return ResultCode::NoAdapter; |
| 722 | } |
| 723 | |
| 724 | if (globals_.TypedValueVMT == nullptr) { |
| 725 | Debug("Debugger::EvaluateInServerThread(): TypedValue VMT not available"); |
| 726 | return ResultCode::EvalEngineNotReady; |
| 727 | } |
| 728 | |
| 729 | AdapterRef adapterRef; |
| 730 | adapterRef.Id = adapter->Id; |
| 731 | adapterRef.Manager = adapter->Db; |
| 732 | |
| 733 | breakpoints_.SetDebuggingDisabled(true); |
no test coverage detected