+++ /dev/null
-\r
-/* Module support implementation */\r
-\r
-#include "Python.h"\r
-\r
-#define FLAG_SIZE_T 1\r
-typedef double va_double;\r
-\r
-static PyObject *va_build_value(const char *, va_list, int);\r
-\r
-/* Package context -- the full module name for package imports */\r
-char *_Py_PackageContext = NULL;\r
-\r
-/* Py_InitModule4() parameters:\r
- - name is the module name\r
- - methods is the list of top-level functions\r
- - doc is the documentation string\r
- - passthrough is passed as self to functions defined in the module\r
- - api_version is the value of PYTHON_API_VERSION at the time the\r
- module was compiled\r
-\r
- Return value is a borrowed reference to the module object; or NULL\r
- if an error occurred (in Python 1.4 and before, errors were fatal).\r
- Errors may still leak memory.\r
-*/\r
-\r
-static char api_version_warning[] =\r
-"Python C API version mismatch for module %.100s:\\r
- This Python has API version %d, module %.100s has version %d.";\r
-\r
-PyObject *\r
-Py_InitModule4(const char *name, PyMethodDef *methods, const char *doc,\r
- PyObject *passthrough, int module_api_version)\r
-{\r
- PyObject *m, *d, *v, *n;\r
- PyMethodDef *ml;\r
- PyInterpreterState *interp = PyThreadState_Get()->interp;\r
- if (interp->modules == NULL)\r
- Py_FatalError("Python import machinery not initialized");\r
- if (module_api_version != PYTHON_API_VERSION) {\r
- char message[512];\r
- PyOS_snprintf(message, sizeof(message),\r
- api_version_warning, name,\r
- PYTHON_API_VERSION, name,\r
- module_api_version);\r
- if (PyErr_Warn(PyExc_RuntimeWarning, message))\r
- return NULL;\r
- }\r
- /* Make sure name is fully qualified.\r
-\r
- This is a bit of a hack: when the shared library is loaded,\r
- the module name is "package.module", but the module calls\r
- Py_InitModule*() with just "module" for the name. The shared\r
- library loader squirrels away the true name of the module in\r
- _Py_PackageContext, and Py_InitModule*() will substitute this\r
- (if the name actually matches).\r
- */\r
- if (_Py_PackageContext != NULL) {\r
- char *p = strrchr(_Py_PackageContext, '.');\r
- if (p != NULL && strcmp(name, p+1) == 0) {\r
- name = _Py_PackageContext;\r
- _Py_PackageContext = NULL;\r
- }\r
- }\r
- if ((m = PyImport_AddModule(name)) == NULL)\r
- return NULL;\r
- d = PyModule_GetDict(m);\r
- if (methods != NULL) {\r
- n = PyString_FromString(name);\r
- if (n == NULL)\r
- return NULL;\r
- for (ml = methods; ml->ml_name != NULL; ml++) {\r
- if ((ml->ml_flags & METH_CLASS) ||\r
- (ml->ml_flags & METH_STATIC)) {\r
- PyErr_SetString(PyExc_ValueError,\r
- "module functions cannot set"\r
- " METH_CLASS or METH_STATIC");\r
- Py_DECREF(n);\r
- return NULL;\r
- }\r
- v = PyCFunction_NewEx(ml, passthrough, n);\r
- if (v == NULL) {\r
- Py_DECREF(n);\r
- return NULL;\r
- }\r
- if (PyDict_SetItemString(d, ml->ml_name, v) != 0) {\r
- Py_DECREF(v);\r
- Py_DECREF(n);\r
- return NULL;\r
- }\r
- Py_DECREF(v);\r
- }\r
- Py_DECREF(n);\r
- }\r
- if (doc != NULL) {\r
- v = PyString_FromString(doc);\r
- if (v == NULL || PyDict_SetItemString(d, "__doc__", v) != 0) {\r
- Py_XDECREF(v);\r
- return NULL;\r
- }\r
- Py_DECREF(v);\r
- }\r
- return m;\r
-}\r
-\r
-\r
-/* Helper for mkvalue() to scan the length of a format */\r
-\r
-static int\r
-countformat(const char *format, int endchar)\r
-{\r
- int count = 0;\r
- int level = 0;\r
- while (level > 0 || *format != endchar) {\r
- switch (*format) {\r
- case '\0':\r
- /* Premature end */\r
- PyErr_SetString(PyExc_SystemError,\r
- "unmatched paren in format");\r
- return -1;\r
- case '(':\r
- case '[':\r
- case '{':\r
- if (level == 0)\r
- count++;\r
- level++;\r
- break;\r
- case ')':\r
- case ']':\r
- case '}':\r
- level--;\r
- break;\r
- case '#':\r
- case '&':\r
- case ',':\r
- case ':':\r
- case ' ':\r
- case '\t':\r
- break;\r
- default:\r
- if (level == 0)\r
- count++;\r
- }\r
- format++;\r
- }\r
- return count;\r
-}\r
-\r
-\r
-/* Generic function to create a value -- the inverse of getargs() */\r
-/* After an original idea and first implementation by Steven Miale */\r
-\r
-static PyObject *do_mktuple(const char**, va_list *, int, int, int);\r
-static PyObject *do_mklist(const char**, va_list *, int, int, int);\r
-static PyObject *do_mkdict(const char**, va_list *, int, int, int);\r
-static PyObject *do_mkvalue(const char**, va_list *, int);\r
-\r
-\r
-static PyObject *\r
-do_mkdict(const char **p_format, va_list *p_va, int endchar, int n, int flags)\r
-{\r
- PyObject *d;\r
- int i;\r
- int itemfailed = 0;\r
- if (n < 0)\r
- return NULL;\r
- if ((d = PyDict_New()) == NULL)\r
- return NULL;\r
- /* Note that we can't bail immediately on error as this will leak\r
- refcounts on any 'N' arguments. */\r
- for (i = 0; i < n; i+= 2) {\r
- PyObject *k, *v;\r
- int err;\r
- k = do_mkvalue(p_format, p_va, flags);\r
- if (k == NULL) {\r
- itemfailed = 1;\r
- Py_INCREF(Py_None);\r
- k = Py_None;\r
- }\r
- v = do_mkvalue(p_format, p_va, flags);\r
- if (v == NULL) {\r
- itemfailed = 1;\r
- Py_INCREF(Py_None);\r
- v = Py_None;\r
- }\r
- err = PyDict_SetItem(d, k, v);\r
- Py_DECREF(k);\r
- Py_DECREF(v);\r
- if (err < 0 || itemfailed) {\r
- Py_DECREF(d);\r
- return NULL;\r
- }\r
- }\r
- if (d != NULL && **p_format != endchar) {\r
- Py_DECREF(d);\r
- d = NULL;\r
- PyErr_SetString(PyExc_SystemError,\r
- "Unmatched paren in format");\r
- }\r
- else if (endchar)\r
- ++*p_format;\r
- return d;\r
-}\r
-\r
-static PyObject *\r
-do_mklist(const char **p_format, va_list *p_va, int endchar, int n, int flags)\r
-{\r
- PyObject *v;\r
- int i;\r
- int itemfailed = 0;\r
- if (n < 0)\r
- return NULL;\r
- v = PyList_New(n);\r
- if (v == NULL)\r
- return NULL;\r
- /* Note that we can't bail immediately on error as this will leak\r
- refcounts on any 'N' arguments. */\r
- for (i = 0; i < n; i++) {\r
- PyObject *w = do_mkvalue(p_format, p_va, flags);\r
- if (w == NULL) {\r
- itemfailed = 1;\r
- Py_INCREF(Py_None);\r
- w = Py_None;\r
- }\r
- PyList_SET_ITEM(v, i, w);\r
- }\r
-\r
- if (itemfailed) {\r
- /* do_mkvalue() should have already set an error */\r
- Py_DECREF(v);\r
- return NULL;\r
- }\r
- if (**p_format != endchar) {\r
- Py_DECREF(v);\r
- PyErr_SetString(PyExc_SystemError,\r
- "Unmatched paren in format");\r
- return NULL;\r
- }\r
- if (endchar)\r
- ++*p_format;\r
- return v;\r
-}\r
-\r
-#ifdef Py_USING_UNICODE\r
-static int\r
-_ustrlen(Py_UNICODE *u)\r
-{\r
- int i = 0;\r
- Py_UNICODE *v = u;\r
- while (*v != 0) { i++; v++; }\r
- return i;\r
-}\r
-#endif\r
-\r
-static PyObject *\r
-do_mktuple(const char **p_format, va_list *p_va, int endchar, int n, int flags)\r
-{\r
- PyObject *v;\r
- int i;\r
- int itemfailed = 0;\r
- if (n < 0)\r
- return NULL;\r
- if ((v = PyTuple_New(n)) == NULL)\r
- return NULL;\r
- /* Note that we can't bail immediately on error as this will leak\r
- refcounts on any 'N' arguments. */\r
- for (i = 0; i < n; i++) {\r
- PyObject *w = do_mkvalue(p_format, p_va, flags);\r
- if (w == NULL) {\r
- itemfailed = 1;\r
- Py_INCREF(Py_None);\r
- w = Py_None;\r
- }\r
- PyTuple_SET_ITEM(v, i, w);\r
- }\r
- if (itemfailed) {\r
- /* do_mkvalue() should have already set an error */\r
- Py_DECREF(v);\r
- return NULL;\r
- }\r
- if (**p_format != endchar) {\r
- Py_DECREF(v);\r
- PyErr_SetString(PyExc_SystemError,\r
- "Unmatched paren in format");\r
- return NULL;\r
- }\r
- if (endchar)\r
- ++*p_format;\r
- return v;\r
-}\r
-\r
-static PyObject *\r
-do_mkvalue(const char **p_format, va_list *p_va, int flags)\r
-{\r
- for (;;) {\r
- switch (*(*p_format)++) {\r
- case '(':\r
- return do_mktuple(p_format, p_va, ')',\r
- countformat(*p_format, ')'), flags);\r
-\r
- case '[':\r
- return do_mklist(p_format, p_va, ']',\r
- countformat(*p_format, ']'), flags);\r
-\r
- case '{':\r
- return do_mkdict(p_format, p_va, '}',\r
- countformat(*p_format, '}'), flags);\r
-\r
- case 'b':\r
- case 'B':\r
- case 'h':\r
- case 'i':\r
- return PyInt_FromLong((long)va_arg(*p_va, int));\r
-\r
- case 'H':\r
- return PyInt_FromLong((long)va_arg(*p_va, unsigned int));\r
-\r
- case 'I':\r
- {\r
- unsigned int n;\r
- n = va_arg(*p_va, unsigned int);\r
- if (n > (unsigned long)PyInt_GetMax())\r
- return PyLong_FromUnsignedLong((unsigned long)n);\r
- else\r
- return PyInt_FromLong(n);\r
- }\r
-\r
- case 'n':\r
-#if SIZEOF_SIZE_T!=SIZEOF_LONG\r
- return PyInt_FromSsize_t(va_arg(*p_va, Py_ssize_t));\r
-#endif\r
- /* Fall through from 'n' to 'l' if Py_ssize_t is long */\r
- case 'l':\r
- return PyInt_FromLong(va_arg(*p_va, long));\r
-\r
- case 'k':\r
- {\r
- unsigned long n;\r
- n = va_arg(*p_va, unsigned long);\r
- if (n > (unsigned long)PyInt_GetMax())\r
- return PyLong_FromUnsignedLong(n);\r
- else\r
- return PyInt_FromLong(n);\r
- }\r
-\r
-#ifdef HAVE_LONG_LONG\r
- case 'L':\r
- return PyLong_FromLongLong((PY_LONG_LONG)va_arg(*p_va, PY_LONG_LONG));\r
-\r
- case 'K':\r
- return PyLong_FromUnsignedLongLong((PY_LONG_LONG)va_arg(*p_va, unsigned PY_LONG_LONG));\r
-#endif\r
-#ifdef Py_USING_UNICODE\r
- case 'u':\r
- {\r
- PyObject *v;\r
- Py_UNICODE *u = va_arg(*p_va, Py_UNICODE *);\r
- Py_ssize_t n;\r
- if (**p_format == '#') {\r
- ++*p_format;\r
- if (flags & FLAG_SIZE_T)\r
- n = va_arg(*p_va, Py_ssize_t);\r
- else\r
- n = va_arg(*p_va, int);\r
- }\r
- else\r
- n = -1;\r
- if (u == NULL) {\r
- v = Py_None;\r
- Py_INCREF(v);\r
- }\r
- else {\r
- if (n < 0)\r
- n = _ustrlen(u);\r
- v = PyUnicode_FromUnicode(u, n);\r
- }\r
- return v;\r
- }\r
-#endif\r
- case 'f':\r
- case 'd':\r
- return PyFloat_FromDouble(\r
- (double)va_arg(*p_va, va_double));\r
-\r
-#ifndef WITHOUT_COMPLEX\r
- case 'D':\r
- return PyComplex_FromCComplex(\r
- *((Py_complex *)va_arg(*p_va, Py_complex *)));\r
-#endif /* WITHOUT_COMPLEX */\r
-\r
- case 'c':\r
- {\r
- char p[1];\r
- p[0] = (char)va_arg(*p_va, int);\r
- return PyString_FromStringAndSize(p, 1);\r
- }\r
-\r
- case 's':\r
- case 'z':\r
- {\r
- PyObject *v;\r
- char *str = va_arg(*p_va, char *);\r
- Py_ssize_t n;\r
- if (**p_format == '#') {\r
- ++*p_format;\r
- if (flags & FLAG_SIZE_T)\r
- n = va_arg(*p_va, Py_ssize_t);\r
- else\r
- n = va_arg(*p_va, int);\r
- }\r
- else\r
- n = -1;\r
- if (str == NULL) {\r
- v = Py_None;\r
- Py_INCREF(v);\r
- }\r
- else {\r
- if (n < 0) {\r
- size_t m = strlen(str);\r
- if (m > PY_SSIZE_T_MAX) {\r
- PyErr_SetString(PyExc_OverflowError,\r
- "string too long for Python string");\r
- return NULL;\r
- }\r
- n = (Py_ssize_t)m;\r
- }\r
- v = PyString_FromStringAndSize(str, n);\r
- }\r
- return v;\r
- }\r
-\r
- case 'N':\r
- case 'S':\r
- case 'O':\r
- if (**p_format == '&') {\r
- typedef PyObject *(*converter)(void *);\r
- converter func = va_arg(*p_va, converter);\r
- void *arg = va_arg(*p_va, void *);\r
- ++*p_format;\r
- return (*func)(arg);\r
- }\r
- else {\r
- PyObject *v;\r
- v = va_arg(*p_va, PyObject *);\r
- if (v != NULL) {\r
- if (*(*p_format - 1) != 'N')\r
- Py_INCREF(v);\r
- }\r
- else if (!PyErr_Occurred())\r
- /* If a NULL was passed\r
- * because a call that should\r
- * have constructed a value\r
- * failed, that's OK, and we\r
- * pass the error on; but if\r
- * no error occurred it's not\r
- * clear that the caller knew\r
- * what she was doing. */\r
- PyErr_SetString(PyExc_SystemError,\r
- "NULL object passed to Py_BuildValue");\r
- return v;\r
- }\r
-\r
- case ':':\r
- case ',':\r
- case ' ':\r
- case '\t':\r
- break;\r
-\r
- default:\r
- PyErr_SetString(PyExc_SystemError,\r
- "bad format char passed to Py_BuildValue");\r
- return NULL;\r
-\r
- }\r
- }\r
-}\r
-\r
-\r
-PyObject *\r
-Py_BuildValue(const char *format, ...)\r
-{\r
- va_list va;\r
- PyObject* retval;\r
- va_start(va, format);\r
- retval = va_build_value(format, va, 0);\r
- va_end(va);\r
- return retval;\r
-}\r
-\r
-PyObject *\r
-_Py_BuildValue_SizeT(const char *format, ...)\r
-{\r
- va_list va;\r
- PyObject* retval;\r
- va_start(va, format);\r
- retval = va_build_value(format, va, FLAG_SIZE_T);\r
- va_end(va);\r
- return retval;\r
-}\r
-\r
-PyObject *\r
-Py_VaBuildValue(const char *format, va_list va)\r
-{\r
- return va_build_value(format, va, 0);\r
-}\r
-\r
-PyObject *\r
-_Py_VaBuildValue_SizeT(const char *format, va_list va)\r
-{\r
- return va_build_value(format, va, FLAG_SIZE_T);\r
-}\r
-\r
-static PyObject *\r
-va_build_value(const char *format, va_list va, int flags)\r
-{\r
- const char *f = format;\r
- int n = countformat(f, '\0');\r
- va_list lva;\r
-\r
-#ifdef VA_LIST_IS_ARRAY\r
- memcpy(lva, va, sizeof(va_list));\r
-#else\r
-#ifdef __va_copy\r
- __va_copy(lva, va);\r
-#else\r
- lva = va;\r
-#endif\r
-#endif\r
-\r
- if (n < 0)\r
- return NULL;\r
- if (n == 0) {\r
- Py_INCREF(Py_None);\r
- return Py_None;\r
- }\r
- if (n == 1)\r
- return do_mkvalue(&f, &lva, flags);\r
- return do_mktuple(&f, &lva, '\0', n, flags);\r
-}\r
-\r
-\r
-PyObject *\r
-PyEval_CallFunction(PyObject *obj, const char *format, ...)\r
-{\r
- va_list vargs;\r
- PyObject *args;\r
- PyObject *res;\r
-\r
- va_start(vargs, format);\r
-\r
- args = Py_VaBuildValue(format, vargs);\r
- va_end(vargs);\r
-\r
- if (args == NULL)\r
- return NULL;\r
-\r
- res = PyEval_CallObject(obj, args);\r
- Py_DECREF(args);\r
-\r
- return res;\r
-}\r
-\r
-\r
-PyObject *\r
-PyEval_CallMethod(PyObject *obj, const char *methodname, const char *format, ...)\r
-{\r
- va_list vargs;\r
- PyObject *meth;\r
- PyObject *args;\r
- PyObject *res;\r
-\r
- meth = PyObject_GetAttrString(obj, methodname);\r
- if (meth == NULL)\r
- return NULL;\r
-\r
- va_start(vargs, format);\r
-\r
- args = Py_VaBuildValue(format, vargs);\r
- va_end(vargs);\r
-\r
- if (args == NULL) {\r
- Py_DECREF(meth);\r
- return NULL;\r
- }\r
-\r
- res = PyEval_CallObject(meth, args);\r
- Py_DECREF(meth);\r
- Py_DECREF(args);\r
-\r
- return res;\r
-}\r
-\r
-int\r
-PyModule_AddObject(PyObject *m, const char *name, PyObject *o)\r
-{\r
- PyObject *dict;\r
- if (!PyModule_Check(m)) {\r
- PyErr_SetString(PyExc_TypeError,\r
- "PyModule_AddObject() needs module as first arg");\r
- return -1;\r
- }\r
- if (!o) {\r
- if (!PyErr_Occurred())\r
- PyErr_SetString(PyExc_TypeError,\r
- "PyModule_AddObject() needs non-NULL value");\r
- return -1;\r
- }\r
-\r
- dict = PyModule_GetDict(m);\r
- if (dict == NULL) {\r
- /* Internal error -- modules must have a dict! */\r
- PyErr_Format(PyExc_SystemError, "module '%s' has no __dict__",\r
- PyModule_GetName(m));\r
- return -1;\r
- }\r
- if (PyDict_SetItemString(dict, name, o))\r
- return -1;\r
- Py_DECREF(o);\r
- return 0;\r
-}\r
-\r
-int\r
-PyModule_AddIntConstant(PyObject *m, const char *name, long value)\r
-{\r
- PyObject *o = PyInt_FromLong(value);\r
- if (!o)\r
- return -1;\r
- if (PyModule_AddObject(m, name, o) == 0)\r
- return 0;\r
- Py_DECREF(o);\r
- return -1;\r
-}\r
-\r
-int\r
-PyModule_AddStringConstant(PyObject *m, const char *name, const char *value)\r
-{\r
- PyObject *o = PyString_FromString(value);\r
- if (!o)\r
- return -1;\r
- if (PyModule_AddObject(m, name, o) == 0)\r
- return 0;\r
- Py_DECREF(o);\r
- return -1;\r
-}\r