| 335 | } |
| 336 | |
| 337 | py::tuple py_context::tuple_from_message( |
| 338 | const message_id mid, const strong_actor_ptr sender, const message &msg) { |
| 339 | py::tuple result(msg.size() + 2); |
| 340 | // spdlog::warn("is_async {}, is_request {}, is_response {} msg size {}", |
| 341 | // mid.is_async(), mid.is_request(), mid.is_response(), msg.size()); |
| 342 | // spdlog::warn("Request id {}", std::to_string(mid.response_id().integer_value())); |
| 343 | // spdlog::warn("Response answered {} id |
| 344 | // {}", mid.is_answered(), std::to_string(mid.request_id().integer_value())); |
| 345 | |
| 346 | for (size_t i = 0; i < msg.size(); ++i) { |
| 347 | auto tid = msg.type_at(i); |
| 348 | if (auto meta_obj = detail::global_meta_object(tid); not meta_obj.type_name.empty()) { |
| 349 | auto kvp = portable_bindings().find(std::string(meta_obj.type_name)); |
| 350 | if (kvp == portable_bindings().end()) { |
| 351 | set_py_exception( |
| 352 | R"(Unable to add element of type C ")", |
| 353 | std::string(meta_obj.type_name), |
| 354 | R"(" to message: type is unknown to CAF)"); |
| 355 | return py::tuple{}; |
| 356 | } |
| 357 | auto obj = kvp->second->to_object(msg, i); |
| 358 | PyTuple_SetItem(result.ptr(), static_cast<int>(i), obj.release().ptr()); |
| 359 | } else { |
| 360 | set_py_exception( |
| 361 | "Unable to extract element #", |
| 362 | i, |
| 363 | " from message: ", |
| 364 | "could not get portable name of ", |
| 365 | tid); |
| 366 | return py::tuple{}; |
| 367 | } |
| 368 | } |
| 369 | if (mid.is_response()) |
| 370 | PyTuple_SetItem( |
| 371 | result.ptr(), msg.size(), PyLong_FromSize_t(mid.request_id().integer_value())); |
| 372 | else if (mid.is_async()) |
| 373 | PyTuple_SetItem( |
| 374 | result.ptr(), msg.size(), PyLong_FromSize_t(mid.response_id().integer_value())); |
| 375 | else |
| 376 | PyTuple_SetItem(result.ptr(), msg.size(), PyLong_FromSize_t(0)); |
| 377 | |
| 378 | PyTuple_SetItem( |
| 379 | result.ptr(), |
| 380 | msg.size() + 1, |
| 381 | py::cast(caf::actor_cast<caf::actor>(sender)).release().ptr()); |
| 382 | |
| 383 | return result; |
| 384 | } |
| 385 | |
| 386 | py::tuple py_context::py_dequeue() { |
| 387 | mailbox_element_ptr ptr = nullptr; |