|
|
|
|
|
|
|
|
|
|
|
#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); |
|
|
|
|
|
|
|
|
|
|
|
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; |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
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); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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); |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
static void __Pyx_RaiseKeywordRequired(const char* func_name, PyObject* kw_name); |
|
|
|
|
|
|
|
|
|
|
|
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 |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
static void __Pyx_RaiseDoubleKeywordsError(const char* func_name, PyObject* kw_name); |
|
|
|
|
|
|
|
|
|
|
|
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 |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
static void __Pyx_RaiseMappingExpectedError(PyObject* arg); |
|
|
|
|
|
|
|
|
|
|
|
static void __Pyx_RaiseMappingExpectedError(PyObject* arg) { |
|
|
PyErr_Format(PyExc_TypeError, "'%.200s' object is not a mapping", Py_TYPE(arg)->tp_name); |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
static int __Pyx_CheckKeywordStrings(PyObject *kwdict, const char* function_name, int kw_allowed); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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 |
|
|
|
|
|
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; |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
static int __Pyx_ParseOptionalKeywords(PyObject *kwds, PyObject **argnames[], \ |
|
|
PyObject *kwds2, PyObject *values[], Py_ssize_t num_pos_args, \ |
|
|
const char* function_name); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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 { |
|
|
|
|
|
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 |
|
|
|
|
|
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 { |
|
|
|
|
|
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 |
|
|
|
|
|
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; |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
static int __Pyx_MergeKeywords(PyObject *kwdict, PyObject *source_mapping); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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)) { |
|
|
|
|
|
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; |
|
|
} |
|
|
|