Secure your code as it's written. Use Snyk Code to scan source code in minutes - no build needed - and fix issues immediately.
@wraps(func)
def wrapper(*args, **kwargs):
"""
This wrapper returns the address of the resulting object as a
python integer which is then converted to a pointer by ctypes
"""
try:
return func(*args, **kwargs)
except NotImplementedError:
return NotImplementedRet
tp_as_name, impl_method = override_dict[attr]
# get the pointer to the correct tp_as_* structure
# or create it if it doesn't exist
tyobj = PyTypeObject.from_address(id(klass))
if tp_as_name in PyTypeObject_as_types_dict:
struct_ty = PyTypeObject_as_types_dict[tp_as_name]
tp_as_ptr = getattr(tyobj, tp_as_name)
if not tp_as_ptr:
# allocate new array
tp_as_obj = struct_ty()
tp_as_dict[(klass, attr)] = tp_as_obj
tp_as_new_ptr = ctypes.cast(ctypes.addressof(tp_as_obj),
ctypes.POINTER(struct_ty))
setattr(tyobj, tp_as_name, tp_as_new_ptr)
tp_as = tp_as_ptr[0]
# find the C function type
for fname, ftype in struct_ty._fields_:
if fname == impl_method:
('sq_inplace_repeat', SSizeArgFunc_p),
]
class PyMappingMethods(ctypes.Structure):
pass
class PyTypeObject(ctypes.Structure):
pass
class PyAsyncMethods(ctypes.Structure):
pass
PyObject._fields_ = [
('ob_refcnt', Py_ssize_t),
('ob_type', ctypes.POINTER(PyTypeObject)),
]
PyTypeObject._fields_ = [
# varhead
('ob_base', PyObject),
('ob_size', Py_ssize_t),
# declaration
('tp_name', ctypes.c_char_p),
('tp_basicsize', Py_ssize_t),
('tp_itemsize', Py_ssize_t),
('tp_dealloc', ctypes.CFUNCTYPE(None, PyObject_p)),
('printfunc', ctypes.CFUNCTYPE(ctypes.c_int, PyObject_p, FILE_p, ctypes.c_int)),
('getattrfunc', ctypes.CFUNCTYPE(PyObject_p, PyObject_p, ctypes.c_char_p)),
('setattrfunc', ctypes.CFUNCTYPE(ctypes.c_int, PyObject_p, ctypes.c_char_p, PyObject_p)),
('tp_as_async', ctypes.CFUNCTYPE(PyAsyncMethods)),
('tp_repr', ctypes.CFUNCTYPE(PyObject_p, PyObject_p)),