Skip to content

Commit 121f1f8

Browse files
bpo-45953: Statically initialize the small ints. (gh-30092)
The array of small PyLong objects has been statically declared. Here I also statically initialize them. Consequently they are no longer initialized dynamically during runtime init. I've also moved them under a new sub-struct in _PyRuntimeState, in preparation for static allocation and initialization of other global objects. https://bugs.python.org/issue45953
1 parent cb589d1 commit 121f1f8

File tree

9 files changed

+360
-81
lines changed

9 files changed

+360
-81
lines changed
Lines changed: 337 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,337 @@
1+
#ifndef Py_INTERNAL_GLOBAL_OBJECTS_H
2+
#define Py_INTERNAL_GLOBAL_OBJECTS_H
3+
#ifdef __cplusplus
4+
extern "C" {
5+
#endif
6+
7+
#ifndef Py_BUILD_CORE
8+
# error "this header requires Py_BUILD_CORE define"
9+
#endif
10+
11+
12+
#define _PyObject_IMMORTAL_INIT(type) \
13+
{ \
14+
.ob_refcnt = 999999999, \
15+
.ob_type = type, \
16+
}
17+
#define _PyVarObject_IMMORTAL_INIT(type, size) \
18+
{ \
19+
.ob_base = _PyObject_IMMORTAL_INIT(type), \
20+
.ob_size = size, \
21+
}
22+
23+
24+
/* int objects */
25+
26+
#define _PY_NSMALLPOSINTS 257
27+
#define _PY_NSMALLNEGINTS 5
28+
29+
#define _PyLong_DIGIT_INIT(val) \
30+
{ \
31+
_PyVarObject_IMMORTAL_INIT(&PyLong_Type, \
32+
((val) == 0 ? 0 : ((val) > 0 ? 1 : -1))), \
33+
.ob_digit = { ((val) >= 0 ? (val) : -(val)) }, \
34+
}
35+
36+
37+
/**********************
38+
* the global objects *
39+
**********************/
40+
41+
// Only immutable objects should be considered runtime-global.
42+
// All others must be per-interpreter.
43+
44+
#define _Py_GLOBAL_OBJECT(NAME) \
45+
_PyRuntime.global_objects.NAME
46+
#define _Py_SINGLETON(NAME) \
47+
_Py_GLOBAL_OBJECT(singletons.NAME)
48+
49+
struct _Py_global_objects {
50+
struct {
51+
/* Small integers are preallocated in this array so that they
52+
* can be shared.
53+
* The integers that are preallocated are those in the range
54+
* -_PY_NSMALLNEGINTS (inclusive) to _PY_NSMALLPOSINTS (exclusive).
55+
*/
56+
PyLongObject small_ints[_PY_NSMALLNEGINTS + _PY_NSMALLPOSINTS];
57+
} singletons;
58+
};
59+
60+
#define _Py_global_objects_INIT { \
61+
.singletons = { \
62+
.small_ints = { \
63+
_PyLong_DIGIT_INIT(-5), \
64+
_PyLong_DIGIT_INIT(-4), \
65+
_PyLong_DIGIT_INIT(-3), \
66+
_PyLong_DIGIT_INIT(-2), \
67+
_PyLong_DIGIT_INIT(-1), \
68+
_PyLong_DIGIT_INIT(0), \
69+
_PyLong_DIGIT_INIT(1), \
70+
_PyLong_DIGIT_INIT(2), \
71+
_PyLong_DIGIT_INIT(3), \
72+
_PyLong_DIGIT_INIT(4), \
73+
_PyLong_DIGIT_INIT(5), \
74+
_PyLong_DIGIT_INIT(6), \
75+
_PyLong_DIGIT_INIT(7), \
76+
_PyLong_DIGIT_INIT(8), \
77+
_PyLong_DIGIT_INIT(9), \
78+
_PyLong_DIGIT_INIT(10), \
79+
_PyLong_DIGIT_INIT(11), \
80+
_PyLong_DIGIT_INIT(12), \
81+
_PyLong_DIGIT_INIT(13), \
82+
_PyLong_DIGIT_INIT(14), \
83+
_PyLong_DIGIT_INIT(15), \
84+
_PyLong_DIGIT_INIT(16), \
85+
_PyLong_DIGIT_INIT(17), \
86+
_PyLong_DIGIT_INIT(18), \
87+
_PyLong_DIGIT_INIT(19), \
88+
_PyLong_DIGIT_INIT(20), \
89+
_PyLong_DIGIT_INIT(21), \
90+
_PyLong_DIGIT_INIT(22), \
91+
_PyLong_DIGIT_INIT(23), \
92+
_PyLong_DIGIT_INIT(24), \
93+
_PyLong_DIGIT_INIT(25), \
94+
_PyLong_DIGIT_INIT(26), \
95+
_PyLong_DIGIT_INIT(27), \
96+
_PyLong_DIGIT_INIT(28), \
97+
_PyLong_DIGIT_INIT(29), \
98+
_PyLong_DIGIT_INIT(30), \
99+
_PyLong_DIGIT_INIT(31), \
100+
_PyLong_DIGIT_INIT(32), \
101+
_PyLong_DIGIT_INIT(33), \
102+
_PyLong_DIGIT_INIT(34), \
103+
_PyLong_DIGIT_INIT(35), \
104+
_PyLong_DIGIT_INIT(36), \
105+
_PyLong_DIGIT_INIT(37), \
106+
_PyLong_DIGIT_INIT(38), \
107+
_PyLong_DIGIT_INIT(39), \
108+
_PyLong_DIGIT_INIT(40), \
109+
_PyLong_DIGIT_INIT(41), \
110+
_PyLong_DIGIT_INIT(42), \
111+
_PyLong_DIGIT_INIT(43), \
112+
_PyLong_DIGIT_INIT(44), \
113+
_PyLong_DIGIT_INIT(45), \
114+
_PyLong_DIGIT_INIT(46), \
115+
_PyLong_DIGIT_INIT(47), \
116+
_PyLong_DIGIT_INIT(48), \
117+
_PyLong_DIGIT_INIT(49), \
118+
_PyLong_DIGIT_INIT(50), \
119+
_PyLong_DIGIT_INIT(51), \
120+
_PyLong_DIGIT_INIT(52), \
121+
_PyLong_DIGIT_INIT(53), \
122+
_PyLong_DIGIT_INIT(54), \
123+
_PyLong_DIGIT_INIT(55), \
124+
_PyLong_DIGIT_INIT(56), \
125+
_PyLong_DIGIT_INIT(57), \
126+
_PyLong_DIGIT_INIT(58), \
127+
_PyLong_DIGIT_INIT(59), \
128+
_PyLong_DIGIT_INIT(60), \
129+
_PyLong_DIGIT_INIT(61), \
130+
_PyLong_DIGIT_INIT(62), \
131+
_PyLong_DIGIT_INIT(63), \
132+
_PyLong_DIGIT_INIT(64), \
133+
_PyLong_DIGIT_INIT(65), \
134+
_PyLong_DIGIT_INIT(66), \
135+
_PyLong_DIGIT_INIT(67), \
136+
_PyLong_DIGIT_INIT(68), \
137+
_PyLong_DIGIT_INIT(69), \
138+
_PyLong_DIGIT_INIT(70), \
139+
_PyLong_DIGIT_INIT(71), \
140+
_PyLong_DIGIT_INIT(72), \
141+
_PyLong_DIGIT_INIT(73), \
142+
_PyLong_DIGIT_INIT(74), \
143+
_PyLong_DIGIT_INIT(75), \
144+
_PyLong_DIGIT_INIT(76), \
145+
_PyLong_DIGIT_INIT(77), \
146+
_PyLong_DIGIT_INIT(78), \
147+
_PyLong_DIGIT_INIT(79), \
148+
_PyLong_DIGIT_INIT(80), \
149+
_PyLong_DIGIT_INIT(81), \
150+
_PyLong_DIGIT_INIT(82), \
151+
_PyLong_DIGIT_INIT(83), \
152+
_PyLong_DIGIT_INIT(84), \
153+
_PyLong_DIGIT_INIT(85), \
154+
_PyLong_DIGIT_INIT(86), \
155+
_PyLong_DIGIT_INIT(87), \
156+
_PyLong_DIGIT_INIT(88), \
157+
_PyLong_DIGIT_INIT(89), \
158+
_PyLong_DIGIT_INIT(90), \
159+
_PyLong_DIGIT_INIT(91), \
160+
_PyLong_DIGIT_INIT(92), \
161+
_PyLong_DIGIT_INIT(93), \
162+
_PyLong_DIGIT_INIT(94), \
163+
_PyLong_DIGIT_INIT(95), \
164+
_PyLong_DIGIT_INIT(96), \
165+
_PyLong_DIGIT_INIT(97), \
166+
_PyLong_DIGIT_INIT(98), \
167+
_PyLong_DIGIT_INIT(99), \
168+
_PyLong_DIGIT_INIT(100), \
169+
_PyLong_DIGIT_INIT(101), \
170+
_PyLong_DIGIT_INIT(102), \
171+
_PyLong_DIGIT_INIT(103), \
172+
_PyLong_DIGIT_INIT(104), \
173+
_PyLong_DIGIT_INIT(105), \
174+
_PyLong_DIGIT_INIT(106), \
175+
_PyLong_DIGIT_INIT(107), \
176+
_PyLong_DIGIT_INIT(108), \
177+
_PyLong_DIGIT_INIT(109), \
178+
_PyLong_DIGIT_INIT(110), \
179+
_PyLong_DIGIT_INIT(111), \
180+
_PyLong_DIGIT_INIT(112), \
181+
_PyLong_DIGIT_INIT(113), \
182+
_PyLong_DIGIT_INIT(114), \
183+
_PyLong_DIGIT_INIT(115), \
184+
_PyLong_DIGIT_INIT(116), \
185+
_PyLong_DIGIT_INIT(117), \
186+
_PyLong_DIGIT_INIT(118), \
187+
_PyLong_DIGIT_INIT(119), \
188+
_PyLong_DIGIT_INIT(120), \
189+
_PyLong_DIGIT_INIT(121), \
190+
_PyLong_DIGIT_INIT(122), \
191+
_PyLong_DIGIT_INIT(123), \
192+
_PyLong_DIGIT_INIT(124), \
193+
_PyLong_DIGIT_INIT(125), \
194+
_PyLong_DIGIT_INIT(126), \
195+
_PyLong_DIGIT_INIT(127), \
196+
_PyLong_DIGIT_INIT(128), \
197+
_PyLong_DIGIT_INIT(129), \
198+
_PyLong_DIGIT_INIT(130), \
199+
_PyLong_DIGIT_INIT(131), \
200+
_PyLong_DIGIT_INIT(132), \
201+
_PyLong_DIGIT_INIT(133), \
202+
_PyLong_DIGIT_INIT(134), \
203+
_PyLong_DIGIT_INIT(135), \
204+
_PyLong_DIGIT_INIT(136), \
205+
_PyLong_DIGIT_INIT(137), \
206+
_PyLong_DIGIT_INIT(138), \
207+
_PyLong_DIGIT_INIT(139), \
208+
_PyLong_DIGIT_INIT(140), \
209+
_PyLong_DIGIT_INIT(141), \
210+
_PyLong_DIGIT_INIT(142), \
211+
_PyLong_DIGIT_INIT(143), \
212+
_PyLong_DIGIT_INIT(144), \
213+
_PyLong_DIGIT_INIT(145), \
214+
_PyLong_DIGIT_INIT(146), \
215+
_PyLong_DIGIT_INIT(147), \
216+
_PyLong_DIGIT_INIT(148), \
217+
_PyLong_DIGIT_INIT(149), \
218+
_PyLong_DIGIT_INIT(150), \
219+
_PyLong_DIGIT_INIT(151), \
220+
_PyLong_DIGIT_INIT(152), \
221+
_PyLong_DIGIT_INIT(153), \
222+
_PyLong_DIGIT_INIT(154), \
223+
_PyLong_DIGIT_INIT(155), \
224+
_PyLong_DIGIT_INIT(156), \
225+
_PyLong_DIGIT_INIT(157), \
226+
_PyLong_DIGIT_INIT(158), \
227+
_PyLong_DIGIT_INIT(159), \
228+
_PyLong_DIGIT_INIT(160), \
229+
_PyLong_DIGIT_INIT(161), \
230+
_PyLong_DIGIT_INIT(162), \
231+
_PyLong_DIGIT_INIT(163), \
232+
_PyLong_DIGIT_INIT(164), \
233+
_PyLong_DIGIT_INIT(165), \
234+
_PyLong_DIGIT_INIT(166), \
235+
_PyLong_DIGIT_INIT(167), \
236+
_PyLong_DIGIT_INIT(168), \
237+
_PyLong_DIGIT_INIT(169), \
238+
_PyLong_DIGIT_INIT(170), \
239+
_PyLong_DIGIT_INIT(171), \
240+
_PyLong_DIGIT_INIT(172), \
241+
_PyLong_DIGIT_INIT(173), \
242+
_PyLong_DIGIT_INIT(174), \
243+
_PyLong_DIGIT_INIT(175), \
244+
_PyLong_DIGIT_INIT(176), \
245+
_PyLong_DIGIT_INIT(177), \
246+
_PyLong_DIGIT_INIT(178), \
247+
_PyLong_DIGIT_INIT(179), \
248+
_PyLong_DIGIT_INIT(180), \
249+
_PyLong_DIGIT_INIT(181), \
250+
_PyLong_DIGIT_INIT(182), \
251+
_PyLong_DIGIT_INIT(183), \
252+
_PyLong_DIGIT_INIT(184), \
253+
_PyLong_DIGIT_INIT(185), \
254+
_PyLong_DIGIT_INIT(186), \
255+
_PyLong_DIGIT_INIT(187), \
256+
_PyLong_DIGIT_INIT(188), \
257+
_PyLong_DIGIT_INIT(189), \
258+
_PyLong_DIGIT_INIT(190), \
259+
_PyLong_DIGIT_INIT(191), \
260+
_PyLong_DIGIT_INIT(192), \
261+
_PyLong_DIGIT_INIT(193), \
262+
_PyLong_DIGIT_INIT(194), \
263+
_PyLong_DIGIT_INIT(195), \
264+
_PyLong_DIGIT_INIT(196), \
265+
_PyLong_DIGIT_INIT(197), \
266+
_PyLong_DIGIT_INIT(198), \
267+
_PyLong_DIGIT_INIT(199), \
268+
_PyLong_DIGIT_INIT(200), \
269+
_PyLong_DIGIT_INIT(201), \
270+
_PyLong_DIGIT_INIT(202), \
271+
_PyLong_DIGIT_INIT(203), \
272+
_PyLong_DIGIT_INIT(204), \
273+
_PyLong_DIGIT_INIT(205), \
274+
_PyLong_DIGIT_INIT(206), \
275+
_PyLong_DIGIT_INIT(207), \
276+
_PyLong_DIGIT_INIT(208), \
277+
_PyLong_DIGIT_INIT(209), \
278+
_PyLong_DIGIT_INIT(210), \
279+
_PyLong_DIGIT_INIT(211), \
280+
_PyLong_DIGIT_INIT(212), \
281+
_PyLong_DIGIT_INIT(213), \
282+
_PyLong_DIGIT_INIT(214), \
283+
_PyLong_DIGIT_INIT(215), \
284+
_PyLong_DIGIT_INIT(216), \
285+
_PyLong_DIGIT_INIT(217), \
286+
_PyLong_DIGIT_INIT(218), \
287+
_PyLong_DIGIT_INIT(219), \
288+
_PyLong_DIGIT_INIT(220), \
289+
_PyLong_DIGIT_INIT(221), \
290+
_PyLong_DIGIT_INIT(222), \
291+
_PyLong_DIGIT_INIT(223), \
292+
_PyLong_DIGIT_INIT(224), \
293+
_PyLong_DIGIT_INIT(225), \
294+
_PyLong_DIGIT_INIT(226), \
295+
_PyLong_DIGIT_INIT(227), \
296+
_PyLong_DIGIT_INIT(228), \
297+
_PyLong_DIGIT_INIT(229), \
298+
_PyLong_DIGIT_INIT(230), \
299+
_PyLong_DIGIT_INIT(231), \
300+
_PyLong_DIGIT_INIT(232), \
301+
_PyLong_DIGIT_INIT(233), \
302+
_PyLong_DIGIT_INIT(234), \
303+
_PyLong_DIGIT_INIT(235), \
304+
_PyLong_DIGIT_INIT(236), \
305+
_PyLong_DIGIT_INIT(237), \
306+
_PyLong_DIGIT_INIT(238), \
307+
_PyLong_DIGIT_INIT(239), \
308+
_PyLong_DIGIT_INIT(240), \
309+
_PyLong_DIGIT_INIT(241), \
310+
_PyLong_DIGIT_INIT(242), \
311+
_PyLong_DIGIT_INIT(243), \
312+
_PyLong_DIGIT_INIT(244), \
313+
_PyLong_DIGIT_INIT(245), \
314+
_PyLong_DIGIT_INIT(246), \
315+
_PyLong_DIGIT_INIT(247), \
316+
_PyLong_DIGIT_INIT(248), \
317+
_PyLong_DIGIT_INIT(249), \
318+
_PyLong_DIGIT_INIT(250), \
319+
_PyLong_DIGIT_INIT(251), \
320+
_PyLong_DIGIT_INIT(252), \
321+
_PyLong_DIGIT_INIT(253), \
322+
_PyLong_DIGIT_INIT(254), \
323+
_PyLong_DIGIT_INIT(255), \
324+
_PyLong_DIGIT_INIT(256), \
325+
}, \
326+
}, \
327+
}
328+
329+
static inline void
330+
_Py_global_objects_reset(struct _Py_global_objects *objects)
331+
{
332+
}
333+
334+
#ifdef __cplusplus
335+
}
336+
#endif
337+
#endif /* !Py_INTERNAL_GLOBAL_OBJECTS_H */

Include/internal/pycore_long.h

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,19 +8,24 @@ extern "C" {
88
# error "this header requires Py_BUILD_CORE define"
99
#endif
1010

11-
#include "pycore_long_state.h" // _PyLong_SMALL_INTS
12-
#include "pycore_pystate.h" // _PyThreadState_GET()
11+
#include "pycore_global_objects.h" // _PY_NSMALLNEGINTS
1312
#include "pycore_runtime.h" // _PyRuntime
1413

1514

1615
/* runtime lifecycle */
1716

18-
extern void _PyLong_InitGlobalObjects(PyInterpreterState *);
1917
extern PyStatus _PyLong_InitTypes(PyInterpreterState *);
2018

2119

2220
/* other API */
2321

22+
#define _PyLong_SMALL_INTS _Py_SINGLETON(small_ints)
23+
24+
// _PyLong_GetZero() and _PyLong_GetOne() must always be available
25+
#if _PY_NSMALLPOSINTS < 2
26+
# error "_PY_NSMALLPOSINTS must be greater than 1"
27+
#endif
28+
2429
// Return a borrowed reference to the zero singleton.
2530
// The function cannot return NULL.
2631
static inline PyObject* _PyLong_GetZero(void)

Include/internal/pycore_long_state.h

Lines changed: 0 additions & 33 deletions
This file was deleted.

0 commit comments

Comments
 (0)