| 597 | } |
| 598 | |
| 599 | bool load_single_plugin_locked(const std::string& name) { |
| 600 | PyObject* lf = import_lichtfeld_module("Failed to import lichtfeld while loading plugin"); |
| 601 | if (!lf) |
| 602 | return false; |
| 603 | |
| 604 | PyObject* plugins = PyObject_GetAttrString(lf, "plugins"); |
| 605 | if (!plugins) { |
| 606 | Py_DECREF(lf); |
| 607 | return false; |
| 608 | } |
| 609 | |
| 610 | PyObject* py_name = PyUnicode_FromString(name.c_str()); |
| 611 | PyObject* result = PyObject_CallMethod(plugins, "load", "O", py_name); |
| 612 | const bool success = result && PyObject_IsTrue(result); |
| 613 | |
| 614 | if (!success) { |
| 615 | PyObject* get_traceback = PyObject_GetAttrString(plugins, "get_traceback"); |
| 616 | if (get_traceback) { |
| 617 | PyObject* tb = PyObject_CallOneArg(get_traceback, py_name); |
| 618 | if (tb && !Py_IsNone(tb) && PyUnicode_Check(tb)) { |
| 619 | LOG_ERROR("Plugin '{}' traceback:\n{}", name, PyUnicode_AsUTF8(tb)); |
| 620 | } |
| 621 | Py_XDECREF(tb); |
| 622 | Py_DECREF(get_traceback); |
| 623 | } |
| 624 | } |
| 625 | |
| 626 | Py_XDECREF(result); |
| 627 | Py_DECREF(py_name); |
| 628 | Py_DECREF(plugins); |
| 629 | Py_DECREF(lf); |
| 630 | return success; |
| 631 | } |
| 632 | |
| 633 | } // namespace |
| 634 |
no test coverage detected