10#include "nuitka/prelude.h"
13#if PYTHON_VERSION >= 0x300
16#define PyBytesObject_SIZE (offsetof(PyBytesObject, ob_sval) + 1)
18#if NUITKA_BYTES_HAS_FREELIST
20#if PYTHON_VERSION < 0x3b0
21static struct _Py_bytes_state *Nuitka_Py_get_bytes_state(
void) {
22 PyInterpreterState *interp = _PyInterpreterState_GET();
23 return &interp->bytes;
26#define BYTES_CHARACTERS _Py_SINGLETON(bytes_characters)
27#define BYTES_CHARACTER(ch) ((PyBytesObject *)&(BYTES_CHARACTERS[ch]));
28#define BYTES_EMPTY (&_Py_SINGLETON(bytes_empty))
31PyObject *Nuitka_Bytes_FromStringAndSize(
const char *data, Py_ssize_t size) {
37#if PYTHON_VERSION < 0x3b0
38 struct _Py_bytes_state *state = Nuitka_Py_get_bytes_state();
40 op = state->characters[*data & UCHAR_MAX];
44 return (PyObject *)op;
47 op = BYTES_CHARACTER(*data & 255);
49 return (PyObject *)op;
54#if PYTHON_VERSION < 0x3b0
55 struct _Py_bytes_state *state = Nuitka_Py_get_bytes_state();
57 assert(state->empty_string != NULL);
58 Py_INCREF(state->empty_string);
60 return state->empty_string;
62 Py_INCREF(BYTES_EMPTY);
63 return (PyObject *)BYTES_EMPTY;
68 op = (PyBytesObject *)NuitkaObject_Malloc(PyBytesObject_SIZE + size);
70 Py_SET_TYPE(op, &PyBytes_Type);
71 Py_SET_SIZE(op, size);
73 Nuitka_Py_NewReference((PyObject *)op);
76 memcpy(op->ob_sval, data, size);
77 op->ob_sval[size] =
'\0';
79#if PYTHON_VERSION < 0x3b0
82 struct _Py_bytes_state *state = Nuitka_Py_get_bytes_state();
84 state->characters[*data & UCHAR_MAX] = op;
88 return (PyObject *)op;