summaryrefslogtreecommitdiffstats
path: root/src/python/global.cpp
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--src/python/global.cpp65
1 files changed, 65 insertions, 0 deletions
diff --git a/src/python/global.cpp b/src/python/global.cpp
new file mode 100644
index 0000000..f8623e0
--- /dev/null
+++ b/src/python/global.cpp
@@ -0,0 +1,65 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include "global.hpp"
+#include "memory.hpp"
+
+#include <sstream>
+
+namespace orcus { namespace python {
+
+void set_python_exception(PyObject* type, const std::exception& e)
+{
+ std::ostringstream os;
+ os << "C++ exception caught: " << e.what();
+ PyErr_SetString(type, os.str().data());
+}
+
+PyObject* get_python_enum_value(const char* enum_class_name, const char* value_name)
+{
+ py_scoped_ref orcus_mod = PyImport_ImportModule("orcus");
+ if (!orcus_mod)
+ {
+ PyErr_SetString(PyExc_RuntimeError, "failed to import orcus module.");
+ return nullptr;
+ }
+
+ py_scoped_ref cls = PyObject_GetAttrString(orcus_mod.get(), enum_class_name);
+ if (!cls)
+ {
+ std::ostringstream os;
+ os << "failed to find class orcus." << enum_class_name << ".";
+ PyErr_SetString(PyExc_RuntimeError, os.str().data());
+ return nullptr;
+ }
+
+ return PyObject_GetAttrString(cls.get(), value_name);
+}
+
+PyObject* create_object_from_type(PyTypeObject* type)
+{
+ if (!type)
+ {
+ PyErr_SetString(PyExc_RuntimeError, "Type object is null.");
+ return nullptr;
+ }
+
+ PyObject* obj = type->tp_new(type, nullptr, nullptr);
+ if (!obj)
+ {
+ std::ostringstream os;
+ os << "Failed to instantiate an object of type " << type->tp_name << ".";
+ PyErr_SetString(PyExc_RuntimeError, os.str().data());
+ return nullptr;
+ }
+
+ return obj;
+}
+
+}}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */