123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352 |
- //////////////////// ArgTypeTest.proto ////////////////////
- #define __Pyx_ArgTypeTest(obj, type, none_allowed, name, exact) \
- ((likely((Py_TYPE(obj) == type) | (none_allowed && (obj == Py_None)))) ? 1 : \
- __Pyx__ArgTypeTest(obj, type, name, exact))
- static int __Pyx__ArgTypeTest(PyObject *obj, PyTypeObject *type, const char *name, int exact); /*proto*/
- //////////////////// ArgTypeTest ////////////////////
- static int __Pyx__ArgTypeTest(PyObject *obj, PyTypeObject *type, const char *name, int exact)
- {
- if (unlikely(!type)) {
- PyErr_SetString(PyExc_SystemError, "Missing type object");
- return 0;
- }
- else if (exact) {
- #if PY_MAJOR_VERSION == 2
- if ((type == &PyBaseString_Type) && likely(__Pyx_PyBaseString_CheckExact(obj))) return 1;
- #endif
- }
- else {
- if (likely(__Pyx_TypeCheck(obj, type))) return 1;
- }
- PyErr_Format(PyExc_TypeError,
- "Argument '%.200s' has incorrect type (expected %.200s, got %.200s)",
- name, type->tp_name, Py_TYPE(obj)->tp_name);
- 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 void __Pyx_RaiseKeywordRequired(const char* func_name, PyObject* kw_name); /*proto*/
- //////////////////// RaiseKeywordRequired ////////////////////
- static 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
- }
- //////////////////// RaiseMappingExpected.proto ////////////////////
- static void __Pyx_RaiseMappingExpectedError(PyObject* arg); /*proto*/
- //////////////////// RaiseMappingExpected ////////////////////
- static void __Pyx_RaiseMappingExpectedError(PyObject* arg) {
- PyErr_Format(PyExc_TypeError, "'%.200s' object is not a mapping", Py_TYPE(arg)->tp_name);
- }
- //////////////////// KeywordStringCheck.proto ////////////////////
- static 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 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_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_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
- (__Pyx_PyUnicode_GET_LENGTH(**name) != __Pyx_PyUnicode_GET_LENGTH(key)) ? 1 :
- #endif
- // In Py2, we may need to convert the argument name from str 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
- (__Pyx_PyUnicode_GET_LENGTH(**argname) != __Pyx_PyUnicode_GET_LENGTH(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;
- }
- //////////////////// MergeKeywords.proto ////////////////////
- static int __Pyx_MergeKeywords(PyObject *kwdict, PyObject *source_mapping); /*proto*/
- //////////////////// MergeKeywords ////////////////////
- //@requires: RaiseDoubleKeywords
- //@requires: Optimize.c::dict_iter
- static int __Pyx_MergeKeywords(PyObject *kwdict, PyObject *source_mapping) {
- PyObject *iter, *key = NULL, *value = NULL;
- int source_is_dict, result;
- Py_ssize_t orig_length, ppos = 0;
- iter = __Pyx_dict_iterator(source_mapping, 0, PYIDENT("items"), &orig_length, &source_is_dict);
- if (unlikely(!iter)) {
- // slow fallback: try converting to dict, then iterate
- PyObject *args;
- if (!PyErr_ExceptionMatches(PyExc_AttributeError)) goto bad;
- PyErr_Clear();
- args = PyTuple_Pack(1, source_mapping);
- if (likely(args)) {
- PyObject *fallback = PyObject_Call((PyObject*)&PyDict_Type, args, NULL);
- Py_DECREF(args);
- if (likely(fallback)) {
- iter = __Pyx_dict_iterator(fallback, 1, PYIDENT("items"), &orig_length, &source_is_dict);
- Py_DECREF(fallback);
- }
- }
- if (unlikely(!iter)) goto bad;
- }
- while (1) {
- result = __Pyx_dict_iter_next(iter, orig_length, &ppos, &key, &value, NULL, source_is_dict);
- if (unlikely(result < 0)) goto bad;
- if (!result) break;
- if (unlikely(PyDict_Contains(kwdict, key))) {
- __Pyx_RaiseDoubleKeywordsError("function", key);
- result = -1;
- } else {
- result = PyDict_SetItem(kwdict, key, value);
- }
- Py_DECREF(key);
- Py_DECREF(value);
- if (unlikely(result < 0)) goto bad;
- }
- Py_XDECREF(iter);
- return 0;
- bad:
- Py_XDECREF(iter);
- return -1;
- }
|