}
return PyString_FromString(str);
}
+
+PyObject *pyrpc_import_union(PyTypeObject *type, TALLOC_CTX *mem_ctx, int level,
+ const void *in, const char *typename)
+{
+ static const char *mem_ctx_type = "TALLOC_CTX";
+ PyObject *mem_ctx_obj = NULL;
+ PyObject *in_obj = NULL;
+ PyObject *ret = NULL;
+
+ mem_ctx_obj = PyCObject_FromVoidPtrAndDesc(mem_ctx,
+ discard_const_p(char, mem_ctx_type),
+ NULL);
+ if (mem_ctx_obj == NULL) {
+ return NULL;
+ }
+
+ in_obj = PyCObject_FromVoidPtrAndDesc(discard_const(in),
+ discard_const_p(char, typename),
+ NULL);
+ if (in_obj == NULL) {
+ Py_XDECREF(mem_ctx_obj);
+ return NULL;
+ }
+
+ ret = PyObject_CallMethod((PyObject *)type,
+ discard_const_p(char, "__import__"),
+ discard_const_p(char, "OiO"),
+ mem_ctx_obj, level, in_obj);
+ Py_XDECREF(mem_ctx_obj);
+ Py_XDECREF(in_obj);
+ if (ret == NULL) {
+ return NULL;
+ }
+
+ return ret;
+}
+
+void *pyrpc_export_union(PyTypeObject *type, TALLOC_CTX *mem_ctx, int level,
+ PyObject *in, const char *typename)
+{
+ static const char *mem_ctx_type = "TALLOC_CTX";
+ PyObject *mem_ctx_obj = NULL;
+ PyObject *ret_obj = NULL;
+ const char *ret_desc = NULL;
+ void *ret = NULL;
+ int cmp;
+
+ mem_ctx_obj = PyCObject_FromVoidPtrAndDesc(mem_ctx,
+ discard_const_p(char, mem_ctx_type),
+ NULL);
+ if (mem_ctx_obj == NULL) {
+ return NULL;
+ }
+
+ ret_obj = PyObject_CallMethod((PyObject *)type,
+ discard_const_p(char, "__export__"),
+ discard_const_p(char, "OiO"),
+ mem_ctx_obj, level, in);
+ Py_XDECREF(mem_ctx_obj);
+ if (ret_obj == NULL) {
+ return NULL;
+ }
+
+ if (!PyCObject_Check(ret_obj)) {
+ Py_XDECREF(ret_obj);
+ PyErr_Format(PyExc_TypeError,
+ "New %s.__export__() returned no PyCObject!",
+ type->tp_name);
+ return NULL;
+ }
+
+ ret_desc = (const char *)PyCObject_GetDesc(ret_obj);
+ if (ret_desc == NULL) {
+ Py_XDECREF(ret_obj);
+ PyErr_Format(PyExc_TypeError,
+ "New %s.__export__() returned no PyCObject_GetDesc()!",
+ type->tp_name);
+ return NULL;
+ }
+
+ cmp = strncmp(typename, ret_desc, strlen(typename) + 1);
+ if (cmp != 0) {
+ Py_XDECREF(ret_obj);
+ PyErr_Format(PyExc_TypeError,
+ "New %s.__export__() returned PyCObject_GetDesc() != %s!",
+ type->tp_name, typename);
+ return NULL;
+ }
+
+ ret = PyCObject_AsVoidPtr(ret_obj);
+ Py_XDECREF(ret_obj);
+ return ret;
+}