-PyObject * mkexc(PyObject *mod, PyObject *base,
- const char *name, PyMethodDef *mm)
-{
- PyObject *nameobj = 0;
- PyObject *dict = 0;
- PyObject *exc = 0;
- PyObject *func = 0;
- PyObject *meth = 0;
-
- if ((nameobj = PyString_FromFormat("%s.%s",
- PyModule_GetName(mod),
- name)) == 0 ||
- (dict = PyDict_New()) == 0 ||
- (exc = PyErr_NewException(PyString_AS_STRING(nameobj),
- base, dict)) == 0)
- goto fail;
-
- if (mm) {
- while (mm->ml_name) {
- if ((func = PyCFunction_NewEx(mm, 0, mod)) == 0 ||
- (meth = PyMethod_New(func, 0, exc)) == 0 ||
- PyDict_SetItemString(dict, mm->ml_name, meth))
- goto fail;
- Py_DECREF(func); func = 0;
- Py_DECREF(meth); meth = 0;
- mm++;
- }
- }
-
-done:
- Py_XDECREF(nameobj);
- Py_XDECREF(dict);
- return (exc);
-
-fail:
- Py_XDECREF(exc);
- Py_XDECREF(func);
- Py_XDECREF(meth);
- exc = 0;
- goto done;
-}
-
-DA_DECL(method_v, PyMethodDef);
-static method_v global_pymethods = DA_INIT;
-void addmethods(const PyMethodDef *m)
-{
- size_t n;
-
- for (n = 0; m[n].ml_name; n++);
- DA_ENSURE(&global_pymethods, n);
- memcpy(DA(&global_pymethods) + DA_LEN(&global_pymethods),
- m, n * sizeof(*m));
- DA_EXTEND(&global_pymethods, n);
-}
-
-static const PyTypeObject emptytype = { 0 };
-
-void *newtype(PyTypeObject *metaty,
- const PyTypeObject *skel,
- const char *name)
-{
- PyHeapTypeObject *ty =
- (PyHeapTypeObject *)_PyObject_GC_Malloc(_PyObject_VAR_SIZE(metaty, 0));
- if (!skel) skel = &emptytype;
- memcpy(ty, skel, sizeof(*skel));
- if (ty->type.tp_base) Py_INCREF(ty->type.tp_base);
-#define COPY(blah) do { \
- if (ty->type.tp_as_##blah) { \
- memcpy(&ty->as_##blah, \
- ty->type.tp_as_##blah, \
- sizeof(ty->as_##blah)); \
- ty->type.tp_as_##blah = &ty->as_##blah; \
- } \
- } while (0)
- COPY(number);
- COPY(sequence);
- COPY(mapping);
- COPY(buffer);
-#undef COPY
- if (name)
- ty->name = PyString_FromString(name);
- else if (ty->type.tp_name)
- ty->name = PyString_FromString(ty->type.tp_name);
- if (ty->name)
- ty->type.tp_name = PyString_AS_STRING(ty->name);
- PyObject_INIT(&ty->type, metaty);
- Py_INCREF(metaty);
- return (ty);
-}
-