py_set_utility_code = UtilityCode( proto = """ #if PY_VERSION_HEX < 0x02050000 #ifndef PyAnySet_CheckExact #define PyAnySet_CheckExact(ob) \\ ((ob)->ob_type == &PySet_Type || \\ (ob)->ob_type == &PyFrozenSet_Type) #define PySet_New(iterable) \\ PyObject_CallFunctionObjArgs((PyObject *)&PySet_Type, (iterable), NULL) #define Pyx_PyFrozenSet_New(iterable) \\ PyObject_CallFunctionObjArgs((PyObject *)&PyFrozenSet_Type, (iterable), NULL) #define PySet_Size(anyset) \\ PyObject_Size((anyset)) #define PySet_Contains(anyset, key) \\ PySequence_Contains((anyset), (key)) #define PySet_Pop(set) \\ PyObject_CallMethod(set, (char *)"pop", NULL) static CYTHON_INLINE int PySet_Clear(PyObject *set) { PyObject *ret = PyObject_CallMethod(set, (char *)"clear", NULL); if (!ret) return -1; Py_DECREF(ret); return 0; } static CYTHON_INLINE int PySet_Discard(PyObject *set, PyObject *key) { PyObject *ret = PyObject_CallMethod(set, (char *)"discard", (char *)"O", key); if (!ret) return -1; Py_DECREF(ret); return 0; } static CYTHON_INLINE int PySet_Add(PyObject *set, PyObject *key) { PyObject *ret = PyObject_CallMethod(set, (char *)"add", (char *)"O", key); if (!ret) return -1; Py_DECREF(ret); return 0; } #endif /* PyAnySet_CheckExact (<= Py2.4) */ #endif /* < Py2.5 */ """, )
# # Pyrex - Builtin Definitions # from Symtab import BuiltinScope, StructOrUnionScope from Code import UtilityCode from TypeSlots import Signature import PyrexTypes import Naming # C-level implementations of builtin types, functions and methods pow2_utility_code = UtilityCode(proto=""" #define __Pyx_PyNumber_Power2(a, b) PyNumber_Power(a, b, Py_None) """) include_string_h_utility_code = UtilityCode(proto=""" #include <string.h> """) iter_next_utility_code = UtilityCode( proto=""" #define __Pyx_PyIter_Next(obj) __Pyx_PyIter_Next2(obj, NULL); static CYTHON_INLINE PyObject *__Pyx_PyIter_Next2(PyObject *, PyObject *); /*proto*/ """, # copied from Py3's builtin_next() impl=''' static CYTHON_INLINE PyObject *__Pyx_PyIter_Next2(PyObject* iterator, PyObject* defval) { PyObject* next; if (unlikely(!PyIter_Check(iterator))) { PyErr_Format(PyExc_TypeError,
def use_empty_bufstruct_code(env, max_ndim): code = dedent(""" Py_ssize_t __Pyx_zeros[] = {%s}; Py_ssize_t __Pyx_minusones[] = {%s}; """) % (", ".join(["0"] * max_ndim), ", ".join(["-1"] * max_ndim)) env.use_utility_code(UtilityCode(proto=code))
def use_py2_buffer_functions(env): # Emulation of PyObject_GetBuffer and PyBuffer_Release for Python 2. # For >= 2.6 we do double mode -- use the new buffer interface on objects # which has the right tp_flags set, but emulation otherwise. # Search all types for __getbuffer__ overloads types = [] visited_scopes = set() def find_buffer_types(scope): if scope in visited_scopes: return visited_scopes.add(scope) for m in scope.cimported_modules: find_buffer_types(m) for e in scope.type_entries: t = e.type if t.is_extension_type: release = get = None for x in t.scope.pyfunc_entries: if x.name == u"__getbuffer__": get = x.func_cname elif x.name == u"__releasebuffer__": release = x.func_cname if get: types.append((t.typeptr_cname, get, release)) find_buffer_types(env) code = dedent(""" #if PY_MAJOR_VERSION < 3 static int __Pyx_GetBuffer(PyObject *obj, Py_buffer *view, int flags) { #if PY_VERSION_HEX >= 0x02060000 if (PyObject_CheckBuffer(obj)) return PyObject_GetBuffer(obj, view, flags); #endif """) if len(types) > 0: clause = "if" for t, get, release in types: code += " %s (PyObject_TypeCheck(obj, %s)) return %s(obj, view, flags);\n" % (clause, t, get) clause = "else if" code += " else {\n" code += dedent("""\ PyErr_Format(PyExc_TypeError, "'%100s' does not have the buffer interface", Py_TYPE(obj)->tp_name); return -1; """, 2) if len(types) > 0: code += " }" code += dedent(""" } static void __Pyx_ReleaseBuffer(Py_buffer *view) { PyObject* obj = view->obj; if (obj) { #if PY_VERSION_HEX >= 0x02060000 if (PyObject_CheckBuffer(obj)) {PyBuffer_Release(view); return;} #endif """) if len(types) > 0: clause = "if" for t, get, release in types: if release: code += " " code += "%s (PyObject_TypeCheck(obj, %s)) %s(obj, view);" % (clause, t, release) clause = "else if" code += dedent(""" Py_DECREF(obj); view->obj = NULL; } } #endif """) env.use_utility_code(UtilityCode( proto = dedent("""\ #if PY_MAJOR_VERSION < 3 static int __Pyx_GetBuffer(PyObject *obj, Py_buffer *view, int flags); static void __Pyx_ReleaseBuffer(Py_buffer *view); #else #define __Pyx_GetBuffer PyObject_GetBuffer #define __Pyx_ReleaseBuffer PyBuffer_Release #endif """), impl = code))
rep, structinfo_name, declcode, typegroup, ), safe=True) return name # Utility function to set the right exception # The caller should immediately goto_error raise_indexerror_code = UtilityCode( proto = """\ static void __Pyx_RaiseBufferIndexError(int axis); /*proto*/ """, impl = """\ static void __Pyx_RaiseBufferIndexError(int axis) { PyErr_Format(PyExc_IndexError, "Out of bounds on buffer access (axis %d)", axis); } """) parse_typestring_repeat_code = UtilityCode( proto = """ """, impl = """ """) raise_buffer_fallback_code = UtilityCode( proto = """ static void __Pyx_RaiseBufferFallbackError(void); /*proto*/
def get_empty_bufstruct_code(max_ndim): code = dedent(""" static Py_ssize_t __Pyx_zeros[] = {%s}; static Py_ssize_t __Pyx_minusones[] = {%s}; """) % (", ".join(["0"] * max_ndim), ", ".join(["-1"] * max_ndim)) return UtilityCode(proto=code)
# # Builtin Definitions # from Symtab import BuiltinScope, StructOrUnionScope from Code import UtilityCode from TypeSlots import Signature import PyrexTypes import Naming import Options # C-level implementations of builtin types, functions and methods pow2_utility_code = UtilityCode( proto = """ #define __Pyx_PyNumber_Power2(a, b) PyNumber_Power(a, b, Py_None) """) abs_int_utility_code = UtilityCode( proto = ''' #if HAVE_LONG_LONG && defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L #define __Pyx_abs_int(x) \ ((sizeof(x) <= sizeof(int)) ? ((unsigned int)abs(x)) : \ ((sizeof(x) <= sizeof(long)) ? ((unsigned long)labs(x)) : \ ((unsigned PY_LONG_LONG)llabs(x)))) #else #define __Pyx_abs_int(x) \ ((sizeof(x) <= sizeof(int)) ? ((unsigned int)abs(x)) : ((unsigned long)labs(x))) #endif #define __Pyx_abs_long(x) __Pyx_abs_int(x) ''')
# # Builtin Definitions # from Symtab import BuiltinScope, StructOrUnionScope from Code import UtilityCode from TypeSlots import Signature import PyrexTypes import Naming import Options # C-level implementations of builtin types, functions and methods pow2_utility_code = UtilityCode(proto=""" #define __Pyx_PyNumber_Power2(a, b) PyNumber_Power(a, b, Py_None) """) abs_int_utility_code = UtilityCode(proto=''' #if HAVE_LONG_LONG && defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L #define __Pyx_abs_int(x) \ ((sizeof(x) <= sizeof(int)) ? ((unsigned int)abs(x)) : \ ((sizeof(x) <= sizeof(long)) ? ((unsigned long)labs(x)) : \ ((unsigned PY_LONG_LONG)llabs(x)))) #else #define __Pyx_abs_int(x) \ ((sizeof(x) <= sizeof(int)) ? ((unsigned int)abs(x)) : ((unsigned long)labs(x))) #endif #define __Pyx_abs_long(x) __Pyx_abs_int(x) ''') iter_next_utility_code = UtilityCode.load_cached("IterNext",
safe=True) return name def load_buffer_utility(util_code_name, **kwargs): return UtilityCode.load(util_code_name, "Buffer.c", **kwargs) context = dict(max_dims=str(Options.buffer_max_dims)) buffer_struct_declare_code = load_buffer_utility("BufferStructDeclare", context=context) # Utility function to set the right exception # The caller should immediately goto_error raise_indexerror_code = load_buffer_utility("BufferIndexError") parse_typestring_repeat_code = UtilityCode(proto=""" """, impl=""" """) raise_buffer_fallback_code = load_buffer_utility("BufferFallbackError") buffer_structs_code = load_buffer_utility("BufferFormatStructs") acquire_utility_code = load_buffer_utility("BufferFormatCheck", context=context, requires=[buffer_structs_code]) # See utility code BufferFormatFromTypeInfo _typeinfo_to_format_code = load_buffer_utility("TypeInfoToFormat", context={}, requires=[buffer_structs_code])