Skip to content

Commit cf496d6

Browse files
bpo-45953: Statically allocate and initialize global bytes objects. (gh-30096)
The empty bytes object (b'') and the 256 one-character bytes objects were allocated at runtime init. Now we statically allocate and initialize them. https://bugs.python.org/issue45953
1 parent 6f05e1e commit cf496d6

File tree

5 files changed

+294
-96
lines changed

5 files changed

+294
-96
lines changed

Include/internal/pycore_bytesobject.h

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -11,17 +11,7 @@ extern "C" {
1111

1212
/* runtime lifecycle */
1313

14-
extern PyStatus _PyBytes_InitGlobalObjects(PyInterpreterState *);
1514
extern PyStatus _PyBytes_InitTypes(PyInterpreterState *);
16-
extern void _PyBytes_Fini(PyInterpreterState *);
17-
18-
19-
/* other API */
20-
21-
struct _Py_bytes_state {
22-
PyObject *empty_string;
23-
PyBytesObject *characters[256];
24-
};
2515

2616

2717
#ifdef __cplusplus

Include/internal/pycore_global_objects.h

Lines changed: 280 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,20 @@ extern "C" {
3434
}
3535

3636

37+
/* bytes objects */
38+
39+
#define _PyBytes_SIMPLE_INIT(CH, LEN) \
40+
{ \
41+
_PyVarObject_IMMORTAL_INIT(&PyBytes_Type, LEN), \
42+
.ob_shash = -1, \
43+
.ob_sval = { CH }, \
44+
}
45+
#define _PyBytes_CHAR_INIT(CH) \
46+
{ \
47+
_PyBytes_SIMPLE_INIT(CH, 1) \
48+
}
49+
50+
3751
/**********************
3852
* the global objects *
3953
**********************/
@@ -54,6 +68,12 @@ struct _Py_global_objects {
5468
* -_PY_NSMALLNEGINTS (inclusive) to _PY_NSMALLPOSINTS (exclusive).
5569
*/
5670
PyLongObject small_ints[_PY_NSMALLNEGINTS + _PY_NSMALLPOSINTS];
71+
72+
PyBytesObject bytes_empty;
73+
struct {
74+
PyBytesObject ob;
75+
char eos;
76+
} bytes_characters[256];
5777
} singletons;
5878
};
5979

@@ -323,6 +343,266 @@ struct _Py_global_objects {
323343
_PyLong_DIGIT_INIT(255), \
324344
_PyLong_DIGIT_INIT(256), \
325345
}, \
346+
\
347+
.bytes_empty = _PyBytes_SIMPLE_INIT(0, 0), \
348+
.bytes_characters = { \
349+
_PyBytes_CHAR_INIT(0), \
350+
_PyBytes_CHAR_INIT(1), \
351+
_PyBytes_CHAR_INIT(2), \
352+
_PyBytes_CHAR_INIT(3), \
353+
_PyBytes_CHAR_INIT(4), \
354+
_PyBytes_CHAR_INIT(5), \
355+
_PyBytes_CHAR_INIT(6), \
356+
_PyBytes_CHAR_INIT(7), \
357+
_PyBytes_CHAR_INIT(8), \
358+
_PyBytes_CHAR_INIT(9), \
359+
_PyBytes_CHAR_INIT(10), \
360+
_PyBytes_CHAR_INIT(11), \
361+
_PyBytes_CHAR_INIT(12), \
362+
_PyBytes_CHAR_INIT(13), \
363+
_PyBytes_CHAR_INIT(14), \
364+
_PyBytes_CHAR_INIT(15), \
365+
_PyBytes_CHAR_INIT(16), \
366+
_PyBytes_CHAR_INIT(17), \
367+
_PyBytes_CHAR_INIT(18), \
368+
_PyBytes_CHAR_INIT(19), \
369+
_PyBytes_CHAR_INIT(20), \
370+
_PyBytes_CHAR_INIT(21), \
371+
_PyBytes_CHAR_INIT(22), \
372+
_PyBytes_CHAR_INIT(23), \
373+
_PyBytes_CHAR_INIT(24), \
374+
_PyBytes_CHAR_INIT(25), \
375+
_PyBytes_CHAR_INIT(26), \
376+
_PyBytes_CHAR_INIT(27), \
377+
_PyBytes_CHAR_INIT(28), \
378+
_PyBytes_CHAR_INIT(29), \
379+
_PyBytes_CHAR_INIT(30), \
380+
_PyBytes_CHAR_INIT(31), \
381+
_PyBytes_CHAR_INIT(32), \
382+
_PyBytes_CHAR_INIT(33), \
383+
_PyBytes_CHAR_INIT(34), \
384+
_PyBytes_CHAR_INIT(35), \
385+
_PyBytes_CHAR_INIT(36), \
386+
_PyBytes_CHAR_INIT(37), \
387+
_PyBytes_CHAR_INIT(38), \
388+
_PyBytes_CHAR_INIT(39), \
389+
_PyBytes_CHAR_INIT(40), \
390+
_PyBytes_CHAR_INIT(41), \
391+
_PyBytes_CHAR_INIT(42), \
392+
_PyBytes_CHAR_INIT(43), \
393+
_PyBytes_CHAR_INIT(44), \
394+
_PyBytes_CHAR_INIT(45), \
395+
_PyBytes_CHAR_INIT(46), \
396+
_PyBytes_CHAR_INIT(47), \
397+
_PyBytes_CHAR_INIT(48), \
398+
_PyBytes_CHAR_INIT(49), \
399+
_PyBytes_CHAR_INIT(50), \
400+
_PyBytes_CHAR_INIT(51), \
401+
_PyBytes_CHAR_INIT(52), \
402+
_PyBytes_CHAR_INIT(53), \
403+
_PyBytes_CHAR_INIT(54), \
404+
_PyBytes_CHAR_INIT(55), \
405+
_PyBytes_CHAR_INIT(56), \
406+
_PyBytes_CHAR_INIT(57), \
407+
_PyBytes_CHAR_INIT(58), \
408+
_PyBytes_CHAR_INIT(59), \
409+
_PyBytes_CHAR_INIT(60), \
410+
_PyBytes_CHAR_INIT(61), \
411+
_PyBytes_CHAR_INIT(62), \
412+
_PyBytes_CHAR_INIT(63), \
413+
_PyBytes_CHAR_INIT(64), \
414+
_PyBytes_CHAR_INIT(65), \
415+
_PyBytes_CHAR_INIT(66), \
416+
_PyBytes_CHAR_INIT(67), \
417+
_PyBytes_CHAR_INIT(68), \
418+
_PyBytes_CHAR_INIT(69), \
419+
_PyBytes_CHAR_INIT(70), \
420+
_PyBytes_CHAR_INIT(71), \
421+
_PyBytes_CHAR_INIT(72), \
422+
_PyBytes_CHAR_INIT(73), \
423+
_PyBytes_CHAR_INIT(74), \
424+
_PyBytes_CHAR_INIT(75), \
425+
_PyBytes_CHAR_INIT(76), \
426+
_PyBytes_CHAR_INIT(77), \
427+
_PyBytes_CHAR_INIT(78), \
428+
_PyBytes_CHAR_INIT(79), \
429+
_PyBytes_CHAR_INIT(80), \
430+
_PyBytes_CHAR_INIT(81), \
431+
_PyBytes_CHAR_INIT(82), \
432+
_PyBytes_CHAR_INIT(83), \
433+
_PyBytes_CHAR_INIT(84), \
434+
_PyBytes_CHAR_INIT(85), \
435+
_PyBytes_CHAR_INIT(86), \
436+
_PyBytes_CHAR_INIT(87), \
437+
_PyBytes_CHAR_INIT(88), \
438+
_PyBytes_CHAR_INIT(89), \
439+
_PyBytes_CHAR_INIT(90), \
440+
_PyBytes_CHAR_INIT(91), \
441+
_PyBytes_CHAR_INIT(92), \
442+
_PyBytes_CHAR_INIT(93), \
443+
_PyBytes_CHAR_INIT(94), \
444+
_PyBytes_CHAR_INIT(95), \
445+
_PyBytes_CHAR_INIT(96), \
446+
_PyBytes_CHAR_INIT(97), \
447+
_PyBytes_CHAR_INIT(98), \
448+
_PyBytes_CHAR_INIT(99), \
449+
_PyBytes_CHAR_INIT(100), \
450+
_PyBytes_CHAR_INIT(101), \
451+
_PyBytes_CHAR_INIT(102), \
452+
_PyBytes_CHAR_INIT(103), \
453+
_PyBytes_CHAR_INIT(104), \
454+
_PyBytes_CHAR_INIT(105), \
455+
_PyBytes_CHAR_INIT(106), \
456+
_PyBytes_CHAR_INIT(107), \
457+
_PyBytes_CHAR_INIT(108), \
458+
_PyBytes_CHAR_INIT(109), \
459+
_PyBytes_CHAR_INIT(110), \
460+
_PyBytes_CHAR_INIT(111), \
461+
_PyBytes_CHAR_INIT(112), \
462+
_PyBytes_CHAR_INIT(113), \
463+
_PyBytes_CHAR_INIT(114), \
464+
_PyBytes_CHAR_INIT(115), \
465+
_PyBytes_CHAR_INIT(116), \
466+
_PyBytes_CHAR_INIT(117), \
467+
_PyBytes_CHAR_INIT(118), \
468+
_PyBytes_CHAR_INIT(119), \
469+
_PyBytes_CHAR_INIT(120), \
470+
_PyBytes_CHAR_INIT(121), \
471+
_PyBytes_CHAR_INIT(122), \
472+
_PyBytes_CHAR_INIT(123), \
473+
_PyBytes_CHAR_INIT(124), \
474+
_PyBytes_CHAR_INIT(125), \
475+
_PyBytes_CHAR_INIT(126), \
476+
_PyBytes_CHAR_INIT(127), \
477+
_PyBytes_CHAR_INIT(128), \
478+
_PyBytes_CHAR_INIT(129), \
479+
_PyBytes_CHAR_INIT(130), \
480+
_PyBytes_CHAR_INIT(131), \
481+
_PyBytes_CHAR_INIT(132), \
482+
_PyBytes_CHAR_INIT(133), \
483+
_PyBytes_CHAR_INIT(134), \
484+
_PyBytes_CHAR_INIT(135), \
485+
_PyBytes_CHAR_INIT(136), \
486+
_PyBytes_CHAR_INIT(137), \
487+
_PyBytes_CHAR_INIT(138), \
488+
_PyBytes_CHAR_INIT(139), \
489+
_PyBytes_CHAR_INIT(140), \
490+
_PyBytes_CHAR_INIT(141), \
491+
_PyBytes_CHAR_INIT(142), \
492+
_PyBytes_CHAR_INIT(143), \
493+
_PyBytes_CHAR_INIT(144), \
494+
_PyBytes_CHAR_INIT(145), \
495+
_PyBytes_CHAR_INIT(146), \
496+
_PyBytes_CHAR_INIT(147), \
497+
_PyBytes_CHAR_INIT(148), \
498+
_PyBytes_CHAR_INIT(149), \
499+
_PyBytes_CHAR_INIT(150), \
500+
_PyBytes_CHAR_INIT(151), \
501+
_PyBytes_CHAR_INIT(152), \
502+
_PyBytes_CHAR_INIT(153), \
503+
_PyBytes_CHAR_INIT(154), \
504+
_PyBytes_CHAR_INIT(155), \
505+
_PyBytes_CHAR_INIT(156), \
506+
_PyBytes_CHAR_INIT(157), \
507+
_PyBytes_CHAR_INIT(158), \
508+
_PyBytes_CHAR_INIT(159), \
509+
_PyBytes_CHAR_INIT(160), \
510+
_PyBytes_CHAR_INIT(161), \
511+
_PyBytes_CHAR_INIT(162), \
512+
_PyBytes_CHAR_INIT(163), \
513+
_PyBytes_CHAR_INIT(164), \
514+
_PyBytes_CHAR_INIT(165), \
515+
_PyBytes_CHAR_INIT(166), \
516+
_PyBytes_CHAR_INIT(167), \
517+
_PyBytes_CHAR_INIT(168), \
518+
_PyBytes_CHAR_INIT(169), \
519+
_PyBytes_CHAR_INIT(170), \
520+
_PyBytes_CHAR_INIT(171), \
521+
_PyBytes_CHAR_INIT(172), \
522+
_PyBytes_CHAR_INIT(173), \
523+
_PyBytes_CHAR_INIT(174), \
524+
_PyBytes_CHAR_INIT(175), \
525+
_PyBytes_CHAR_INIT(176), \
526+
_PyBytes_CHAR_INIT(177), \
527+
_PyBytes_CHAR_INIT(178), \
528+
_PyBytes_CHAR_INIT(179), \
529+
_PyBytes_CHAR_INIT(180), \
530+
_PyBytes_CHAR_INIT(181), \
531+
_PyBytes_CHAR_INIT(182), \
532+
_PyBytes_CHAR_INIT(183), \
533+
_PyBytes_CHAR_INIT(184), \
534+
_PyBytes_CHAR_INIT(185), \
535+
_PyBytes_CHAR_INIT(186), \
536+
_PyBytes_CHAR_INIT(187), \
537+
_PyBytes_CHAR_INIT(188), \
538+
_PyBytes_CHAR_INIT(189), \
539+
_PyBytes_CHAR_INIT(190), \
540+
_PyBytes_CHAR_INIT(191), \
541+
_PyBytes_CHAR_INIT(192), \
542+
_PyBytes_CHAR_INIT(193), \
543+
_PyBytes_CHAR_INIT(194), \
544+
_PyBytes_CHAR_INIT(195), \
545+
_PyBytes_CHAR_INIT(196), \
546+
_PyBytes_CHAR_INIT(197), \
547+
_PyBytes_CHAR_INIT(198), \
548+
_PyBytes_CHAR_INIT(199), \
549+
_PyBytes_CHAR_INIT(200), \
550+
_PyBytes_CHAR_INIT(201), \
551+
_PyBytes_CHAR_INIT(202), \
552+
_PyBytes_CHAR_INIT(203), \
553+
_PyBytes_CHAR_INIT(204), \
554+
_PyBytes_CHAR_INIT(205), \
555+
_PyBytes_CHAR_INIT(206), \
556+
_PyBytes_CHAR_INIT(207), \
557+
_PyBytes_CHAR_INIT(208), \
558+
_PyBytes_CHAR_INIT(209), \
559+
_PyBytes_CHAR_INIT(210), \
560+
_PyBytes_CHAR_INIT(211), \
561+
_PyBytes_CHAR_INIT(212), \
562+
_PyBytes_CHAR_INIT(213), \
563+
_PyBytes_CHAR_INIT(214), \
564+
_PyBytes_CHAR_INIT(215), \
565+
_PyBytes_CHAR_INIT(216), \
566+
_PyBytes_CHAR_INIT(217), \
567+
_PyBytes_CHAR_INIT(218), \
568+
_PyBytes_CHAR_INIT(219), \
569+
_PyBytes_CHAR_INIT(220), \
570+
_PyBytes_CHAR_INIT(221), \
571+
_PyBytes_CHAR_INIT(222), \
572+
_PyBytes_CHAR_INIT(223), \
573+
_PyBytes_CHAR_INIT(224), \
574+
_PyBytes_CHAR_INIT(225), \
575+
_PyBytes_CHAR_INIT(226), \
576+
_PyBytes_CHAR_INIT(227), \
577+
_PyBytes_CHAR_INIT(228), \
578+
_PyBytes_CHAR_INIT(229), \
579+
_PyBytes_CHAR_INIT(230), \
580+
_PyBytes_CHAR_INIT(231), \
581+
_PyBytes_CHAR_INIT(232), \
582+
_PyBytes_CHAR_INIT(233), \
583+
_PyBytes_CHAR_INIT(234), \
584+
_PyBytes_CHAR_INIT(235), \
585+
_PyBytes_CHAR_INIT(236), \
586+
_PyBytes_CHAR_INIT(237), \
587+
_PyBytes_CHAR_INIT(238), \
588+
_PyBytes_CHAR_INIT(239), \
589+
_PyBytes_CHAR_INIT(240), \
590+
_PyBytes_CHAR_INIT(241), \
591+
_PyBytes_CHAR_INIT(242), \
592+
_PyBytes_CHAR_INIT(243), \
593+
_PyBytes_CHAR_INIT(244), \
594+
_PyBytes_CHAR_INIT(245), \
595+
_PyBytes_CHAR_INIT(246), \
596+
_PyBytes_CHAR_INIT(247), \
597+
_PyBytes_CHAR_INIT(248), \
598+
_PyBytes_CHAR_INIT(249), \
599+
_PyBytes_CHAR_INIT(250), \
600+
_PyBytes_CHAR_INIT(251), \
601+
_PyBytes_CHAR_INIT(252), \
602+
_PyBytes_CHAR_INIT(253), \
603+
_PyBytes_CHAR_INIT(254), \
604+
_PyBytes_CHAR_INIT(255), \
605+
}, \
326606
}, \
327607
}
328608

Include/internal/pycore_interp.h

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@ extern "C" {
1010

1111
#include "pycore_atomic.h" // _Py_atomic_address
1212
#include "pycore_ast_state.h" // struct ast_state
13-
#include "pycore_bytesobject.h" // struct _Py_bytes_state
1413
#include "pycore_context.h" // struct _Py_context_state
1514
#include "pycore_dict.h" // struct _Py_dict_state
1615
#include "pycore_exceptions.h" // struct _Py_exc_state
@@ -152,7 +151,6 @@ struct _is {
152151

153152
PyObject *audit_hooks;
154153

155-
struct _Py_bytes_state bytes;
156154
struct _Py_unicode_state unicode;
157155
struct _Py_float_state float_state;
158156
/* Using a cache is very effective since typically only a single slice is

0 commit comments

Comments
 (0)