Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
wiseplat
GitHub Repository: wiseplat/python-code
Path: blob/master/ invest-robot-contest_TinkoffBotTwitch-main/venv/lib/python3.8/site-packages/aiohttp/_websocket.pyx
7762 views
1
from cpython cimport PyBytes_AsString
2
3
4
#from cpython cimport PyByteArray_AsString # cython still not exports that
5
cdef extern from "Python.h":
6
char* PyByteArray_AsString(bytearray ba) except NULL
7
8
from libc.stdint cimport uint32_t, uint64_t, uintmax_t
9
10
11
def _websocket_mask_cython(object mask, object data):
12
"""Note, this function mutates its `data` argument
13
"""
14
cdef:
15
Py_ssize_t data_len, i
16
# bit operations on signed integers are implementation-specific
17
unsigned char * in_buf
18
const unsigned char * mask_buf
19
uint32_t uint32_msk
20
uint64_t uint64_msk
21
22
assert len(mask) == 4
23
24
if not isinstance(mask, bytes):
25
mask = bytes(mask)
26
27
if isinstance(data, bytearray):
28
data = <bytearray>data
29
else:
30
data = bytearray(data)
31
32
data_len = len(data)
33
in_buf = <unsigned char*>PyByteArray_AsString(data)
34
mask_buf = <const unsigned char*>PyBytes_AsString(mask)
35
uint32_msk = (<uint32_t*>mask_buf)[0]
36
37
# TODO: align in_data ptr to achieve even faster speeds
38
# does it need in python ?! malloc() always aligns to sizeof(long) bytes
39
40
if sizeof(size_t) >= 8:
41
uint64_msk = uint32_msk
42
uint64_msk = (uint64_msk << 32) | uint32_msk
43
44
while data_len >= 8:
45
(<uint64_t*>in_buf)[0] ^= uint64_msk
46
in_buf += 8
47
data_len -= 8
48
49
50
while data_len >= 4:
51
(<uint32_t*>in_buf)[0] ^= uint32_msk
52
in_buf += 4
53
data_len -= 4
54
55
for i in range(0, data_len):
56
in_buf[i] ^= mask_buf[i]
57
58