| Index: third_party/cython/src/Cython/Utility/FunctionArguments.c
|
| diff --git a/third_party/cython/src/Cython/Utility/FunctionArguments.c b/third_party/cython/src/Cython/Utility/FunctionArguments.c
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..d0ea7b86f95fb2974d5115354013162e2d121930
|
| --- /dev/null
|
| +++ b/third_party/cython/src/Cython/Utility/FunctionArguments.c
|
| @@ -0,0 +1,292 @@
|
| +//////////////////// ArgTypeTest.proto ////////////////////
|
| +
|
| +static CYTHON_INLINE int __Pyx_ArgTypeTest(PyObject *obj, PyTypeObject *type, int none_allowed,
|
| + const char *name, int exact); /*proto*/
|
| +
|
| +//////////////////// ArgTypeTest ////////////////////
|
| +
|
| +static void __Pyx_RaiseArgumentTypeInvalid(const char* name, PyObject *obj, PyTypeObject *type) {
|
| + PyErr_Format(PyExc_TypeError,
|
| + "Argument '%.200s' has incorrect type (expected %.200s, got %.200s)",
|
| + name, type->tp_name, Py_TYPE(obj)->tp_name);
|
| +}
|
| +
|
| +static CYTHON_INLINE int __Pyx_ArgTypeTest(PyObject *obj, PyTypeObject *type, int none_allowed,
|
| + const char *name, int exact)
|
| +{
|
| + if (unlikely(!type)) {
|
| + PyErr_SetString(PyExc_SystemError, "Missing type object");
|
| + return 0;
|
| + }
|
| + if (none_allowed && obj == Py_None) return 1;
|
| + else if (exact) {
|
| + if (likely(Py_TYPE(obj) == type)) return 1;
|
| + #if PY_MAJOR_VERSION == 2
|
| + else if ((type == &PyBaseString_Type) && likely(__Pyx_PyBaseString_CheckExact(obj))) return 1;
|
| + #endif
|
| + }
|
| + else {
|
| + if (likely(PyObject_TypeCheck(obj, type))) return 1;
|
| + }
|
| + __Pyx_RaiseArgumentTypeInvalid(name, obj, type);
|
| + return 0;
|
| +}
|
| +
|
| +//////////////////// RaiseArgTupleInvalid.proto ////////////////////
|
| +
|
| +static void __Pyx_RaiseArgtupleInvalid(const char* func_name, int exact,
|
| + Py_ssize_t num_min, Py_ssize_t num_max, Py_ssize_t num_found); /*proto*/
|
| +
|
| +//////////////////// RaiseArgTupleInvalid ////////////////////
|
| +
|
| +// __Pyx_RaiseArgtupleInvalid raises the correct exception when too
|
| +// many or too few positional arguments were found. This handles
|
| +// Py_ssize_t formatting correctly.
|
| +
|
| +static void __Pyx_RaiseArgtupleInvalid(
|
| + const char* func_name,
|
| + int exact,
|
| + Py_ssize_t num_min,
|
| + Py_ssize_t num_max,
|
| + Py_ssize_t num_found)
|
| +{
|
| + Py_ssize_t num_expected;
|
| + const char *more_or_less;
|
| +
|
| + if (num_found < num_min) {
|
| + num_expected = num_min;
|
| + more_or_less = "at least";
|
| + } else {
|
| + num_expected = num_max;
|
| + more_or_less = "at most";
|
| + }
|
| + if (exact) {
|
| + more_or_less = "exactly";
|
| + }
|
| + PyErr_Format(PyExc_TypeError,
|
| + "%.200s() takes %.8s %" CYTHON_FORMAT_SSIZE_T "d positional argument%.1s (%" CYTHON_FORMAT_SSIZE_T "d given)",
|
| + func_name, more_or_less, num_expected,
|
| + (num_expected == 1) ? "" : "s", num_found);
|
| +}
|
| +
|
| +
|
| +//////////////////// RaiseKeywordRequired.proto ////////////////////
|
| +
|
| +static CYTHON_INLINE void __Pyx_RaiseKeywordRequired(const char* func_name, PyObject* kw_name); /*proto*/
|
| +
|
| +//////////////////// RaiseKeywordRequired ////////////////////
|
| +
|
| +static CYTHON_INLINE void __Pyx_RaiseKeywordRequired(
|
| + const char* func_name,
|
| + PyObject* kw_name)
|
| +{
|
| + PyErr_Format(PyExc_TypeError,
|
| + #if PY_MAJOR_VERSION >= 3
|
| + "%s() needs keyword-only argument %U", func_name, kw_name);
|
| + #else
|
| + "%s() needs keyword-only argument %s", func_name,
|
| + PyString_AS_STRING(kw_name));
|
| + #endif
|
| +}
|
| +
|
| +
|
| +//////////////////// RaiseDoubleKeywords.proto ////////////////////
|
| +
|
| +static void __Pyx_RaiseDoubleKeywordsError(const char* func_name, PyObject* kw_name); /*proto*/
|
| +
|
| +//////////////////// RaiseDoubleKeywords ////////////////////
|
| +
|
| +static void __Pyx_RaiseDoubleKeywordsError(
|
| + const char* func_name,
|
| + PyObject* kw_name)
|
| +{
|
| + PyErr_Format(PyExc_TypeError,
|
| + #if PY_MAJOR_VERSION >= 3
|
| + "%s() got multiple values for keyword argument '%U'", func_name, kw_name);
|
| + #else
|
| + "%s() got multiple values for keyword argument '%s'", func_name,
|
| + PyString_AsString(kw_name));
|
| + #endif
|
| +}
|
| +
|
| +
|
| +//////////////////// KeywordStringCheck.proto ////////////////////
|
| +
|
| +static CYTHON_INLINE int __Pyx_CheckKeywordStrings(PyObject *kwdict, const char* function_name, int kw_allowed); /*proto*/
|
| +
|
| +//////////////////// KeywordStringCheck ////////////////////
|
| +
|
| +// __Pyx_CheckKeywordStrings raises an error if non-string keywords
|
| +// were passed to a function, or if any keywords were passed to a
|
| +// function that does not accept them.
|
| +
|
| +static CYTHON_INLINE int __Pyx_CheckKeywordStrings(
|
| + PyObject *kwdict,
|
| + const char* function_name,
|
| + int kw_allowed)
|
| +{
|
| + PyObject* key = 0;
|
| + Py_ssize_t pos = 0;
|
| +#if CYTHON_COMPILING_IN_PYPY
|
| + /* PyPy appears to check keywords at call time, not at unpacking time => not much to do here */
|
| + if (!kw_allowed && PyDict_Next(kwdict, &pos, &key, 0))
|
| + goto invalid_keyword;
|
| + return 1;
|
| +#else
|
| + while (PyDict_Next(kwdict, &pos, &key, 0)) {
|
| + #if PY_MAJOR_VERSION < 3
|
| + if (unlikely(!PyString_CheckExact(key)) && unlikely(!PyString_Check(key)))
|
| + #endif
|
| + if (unlikely(!PyUnicode_Check(key)))
|
| + goto invalid_keyword_type;
|
| + }
|
| + if ((!kw_allowed) && unlikely(key))
|
| + goto invalid_keyword;
|
| + return 1;
|
| +invalid_keyword_type:
|
| + PyErr_Format(PyExc_TypeError,
|
| + "%.200s() keywords must be strings", function_name);
|
| + return 0;
|
| +#endif
|
| +invalid_keyword:
|
| + PyErr_Format(PyExc_TypeError,
|
| + #if PY_MAJOR_VERSION < 3
|
| + "%.200s() got an unexpected keyword argument '%.200s'",
|
| + function_name, PyString_AsString(key));
|
| + #else
|
| + "%s() got an unexpected keyword argument '%U'",
|
| + function_name, key);
|
| + #endif
|
| + return 0;
|
| +}
|
| +
|
| +
|
| +//////////////////// ParseKeywords.proto ////////////////////
|
| +
|
| +static int __Pyx_ParseOptionalKeywords(PyObject *kwds, PyObject **argnames[], \
|
| + PyObject *kwds2, PyObject *values[], Py_ssize_t num_pos_args, \
|
| + const char* function_name); /*proto*/
|
| +
|
| +//////////////////// ParseKeywords ////////////////////
|
| +//@requires: RaiseDoubleKeywords
|
| +
|
| +// __Pyx_ParseOptionalKeywords copies the optional/unknown keyword
|
| +// arguments from the kwds dict into kwds2. If kwds2 is NULL, unknown
|
| +// keywords will raise an invalid keyword error.
|
| +//
|
| +// Three kinds of errors are checked: 1) non-string keywords, 2)
|
| +// unexpected keywords and 3) overlap with positional arguments.
|
| +//
|
| +// If num_posargs is greater 0, it denotes the number of positional
|
| +// arguments that were passed and that must therefore not appear
|
| +// amongst the keywords as well.
|
| +//
|
| +// This method does not check for required keyword arguments.
|
| +
|
| +static int __Pyx_ParseOptionalKeywords(
|
| + PyObject *kwds,
|
| + PyObject **argnames[],
|
| + PyObject *kwds2,
|
| + PyObject *values[],
|
| + Py_ssize_t num_pos_args,
|
| + const char* function_name)
|
| +{
|
| + PyObject *key = 0, *value = 0;
|
| + Py_ssize_t pos = 0;
|
| + PyObject*** name;
|
| + PyObject*** first_kw_arg = argnames + num_pos_args;
|
| +
|
| + while (PyDict_Next(kwds, &pos, &key, &value)) {
|
| + name = first_kw_arg;
|
| + while (*name && (**name != key)) name++;
|
| + if (*name) {
|
| + values[name-argnames] = value;
|
| + continue;
|
| + }
|
| +
|
| + name = first_kw_arg;
|
| + #if PY_MAJOR_VERSION < 3
|
| + if (likely(PyString_CheckExact(key)) || likely(PyString_Check(key))) {
|
| + while (*name) {
|
| + if ((CYTHON_COMPILING_IN_PYPY || PyString_GET_SIZE(**name) == PyString_GET_SIZE(key))
|
| + && _PyString_Eq(**name, key)) {
|
| + values[name-argnames] = value;
|
| + break;
|
| + }
|
| + name++;
|
| + }
|
| + if (*name) continue;
|
| + else {
|
| + // not found after positional args, check for duplicate
|
| + PyObject*** argname = argnames;
|
| + while (argname != first_kw_arg) {
|
| + if ((**argname == key) || (
|
| + (CYTHON_COMPILING_IN_PYPY || PyString_GET_SIZE(**argname) == PyString_GET_SIZE(key))
|
| + && _PyString_Eq(**argname, key))) {
|
| + goto arg_passed_twice;
|
| + }
|
| + argname++;
|
| + }
|
| + }
|
| + } else
|
| + #endif
|
| + if (likely(PyUnicode_Check(key))) {
|
| + while (*name) {
|
| + int cmp = (**name == key) ? 0 :
|
| + #if !CYTHON_COMPILING_IN_PYPY && PY_MAJOR_VERSION >= 3
|
| + (PyUnicode_GET_SIZE(**name) != PyUnicode_GET_SIZE(key)) ? 1 :
|
| + #endif
|
| + // need to convert argument name from bytes to unicode for comparison
|
| + PyUnicode_Compare(**name, key);
|
| + if (cmp < 0 && unlikely(PyErr_Occurred())) goto bad;
|
| + if (cmp == 0) {
|
| + values[name-argnames] = value;
|
| + break;
|
| + }
|
| + name++;
|
| + }
|
| + if (*name) continue;
|
| + else {
|
| + // not found after positional args, check for duplicate
|
| + PyObject*** argname = argnames;
|
| + while (argname != first_kw_arg) {
|
| + int cmp = (**argname == key) ? 0 :
|
| + #if !CYTHON_COMPILING_IN_PYPY && PY_MAJOR_VERSION >= 3
|
| + (PyUnicode_GET_SIZE(**argname) != PyUnicode_GET_SIZE(key)) ? 1 :
|
| + #endif
|
| + // need to convert argument name from bytes to unicode for comparison
|
| + PyUnicode_Compare(**argname, key);
|
| + if (cmp < 0 && unlikely(PyErr_Occurred())) goto bad;
|
| + if (cmp == 0) goto arg_passed_twice;
|
| + argname++;
|
| + }
|
| + }
|
| + } else
|
| + goto invalid_keyword_type;
|
| +
|
| + if (kwds2) {
|
| + if (unlikely(PyDict_SetItem(kwds2, key, value))) goto bad;
|
| + } else {
|
| + goto invalid_keyword;
|
| + }
|
| + }
|
| + return 0;
|
| +arg_passed_twice:
|
| + __Pyx_RaiseDoubleKeywordsError(function_name, key);
|
| + goto bad;
|
| +invalid_keyword_type:
|
| + PyErr_Format(PyExc_TypeError,
|
| + "%.200s() keywords must be strings", function_name);
|
| + goto bad;
|
| +invalid_keyword:
|
| + PyErr_Format(PyExc_TypeError,
|
| + #if PY_MAJOR_VERSION < 3
|
| + "%.200s() got an unexpected keyword argument '%.200s'",
|
| + function_name, PyString_AsString(key));
|
| + #else
|
| + "%s() got an unexpected keyword argument '%U'",
|
| + function_name, key);
|
| + #endif
|
| +bad:
|
| + return -1;
|
| +}
|
|
|