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; |
+} |