Skip to content

Commit 8f10ad0

Browse files
Statically initialize the small ints.
1 parent fca595b commit 8f10ad0

File tree

4 files changed

+270
-32
lines changed

4 files changed

+270
-32
lines changed

Include/internal/pycore_global_objects.h

Lines changed: 270 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,12 @@ extern "C" {
1212
#define _PY_NSMALLPOSINTS 257
1313
#define _PY_NSMALLNEGINTS 5
1414

15+
#define _PyLong_NEG_INIT(val) \
16+
{ PyVarObject_HEAD_INIT(&PyLong_Type, -1) .ob_digit = { -(val) }, }
17+
#define _PyLong_ZERO_INIT \
18+
{ PyVarObject_HEAD_INIT(&PyLong_Type, 0) .ob_digit = { 0 }, }
19+
#define _PyLong_POS_INIT(val) \
20+
{ PyVarObject_HEAD_INIT(&PyLong_Type, 1) .ob_digit = { val }, }
1521

1622

1723
// Only immutable objects should be considered runtime-global.
@@ -35,6 +41,270 @@ struct _Py_global_objects {
3541

3642
#define _Py_global_objects_INIT { \
3743
.singletons = { \
44+
.small_ints = { \
45+
_PyLong_NEG_INIT(-5), \
46+
_PyLong_NEG_INIT(-4), \
47+
_PyLong_NEG_INIT(-3), \
48+
_PyLong_NEG_INIT(-2), \
49+
_PyLong_NEG_INIT(-1), \
50+
_PyLong_ZERO_INIT, \
51+
_PyLong_POS_INIT(1), \
52+
_PyLong_POS_INIT(2), \
53+
_PyLong_POS_INIT(3), \
54+
_PyLong_POS_INIT(4), \
55+
_PyLong_POS_INIT(5), \
56+
_PyLong_POS_INIT(6), \
57+
_PyLong_POS_INIT(7), \
58+
_PyLong_POS_INIT(8), \
59+
_PyLong_POS_INIT(9), \
60+
_PyLong_POS_INIT(10), \
61+
_PyLong_POS_INIT(11), \
62+
_PyLong_POS_INIT(12), \
63+
_PyLong_POS_INIT(13), \
64+
_PyLong_POS_INIT(14), \
65+
_PyLong_POS_INIT(15), \
66+
_PyLong_POS_INIT(16), \
67+
_PyLong_POS_INIT(17), \
68+
_PyLong_POS_INIT(18), \
69+
_PyLong_POS_INIT(19), \
70+
_PyLong_POS_INIT(20), \
71+
_PyLong_POS_INIT(21), \
72+
_PyLong_POS_INIT(22), \
73+
_PyLong_POS_INIT(23), \
74+
_PyLong_POS_INIT(24), \
75+
_PyLong_POS_INIT(25), \
76+
_PyLong_POS_INIT(26), \
77+
_PyLong_POS_INIT(27), \
78+
_PyLong_POS_INIT(28), \
79+
_PyLong_POS_INIT(29), \
80+
_PyLong_POS_INIT(30), \
81+
_PyLong_POS_INIT(31), \
82+
_PyLong_POS_INIT(32), \
83+
_PyLong_POS_INIT(33), \
84+
_PyLong_POS_INIT(34), \
85+
_PyLong_POS_INIT(35), \
86+
_PyLong_POS_INIT(36), \
87+
_PyLong_POS_INIT(37), \
88+
_PyLong_POS_INIT(38), \
89+
_PyLong_POS_INIT(39), \
90+
_PyLong_POS_INIT(40), \
91+
_PyLong_POS_INIT(41), \
92+
_PyLong_POS_INIT(42), \
93+
_PyLong_POS_INIT(43), \
94+
_PyLong_POS_INIT(44), \
95+
_PyLong_POS_INIT(45), \
96+
_PyLong_POS_INIT(46), \
97+
_PyLong_POS_INIT(47), \
98+
_PyLong_POS_INIT(48), \
99+
_PyLong_POS_INIT(49), \
100+
_PyLong_POS_INIT(50), \
101+
_PyLong_POS_INIT(51), \
102+
_PyLong_POS_INIT(52), \
103+
_PyLong_POS_INIT(53), \
104+
_PyLong_POS_INIT(54), \
105+
_PyLong_POS_INIT(55), \
106+
_PyLong_POS_INIT(56), \
107+
_PyLong_POS_INIT(57), \
108+
_PyLong_POS_INIT(58), \
109+
_PyLong_POS_INIT(59), \
110+
_PyLong_POS_INIT(60), \
111+
_PyLong_POS_INIT(61), \
112+
_PyLong_POS_INIT(62), \
113+
_PyLong_POS_INIT(63), \
114+
_PyLong_POS_INIT(64), \
115+
_PyLong_POS_INIT(65), \
116+
_PyLong_POS_INIT(66), \
117+
_PyLong_POS_INIT(67), \
118+
_PyLong_POS_INIT(68), \
119+
_PyLong_POS_INIT(69), \
120+
_PyLong_POS_INIT(70), \
121+
_PyLong_POS_INIT(71), \
122+
_PyLong_POS_INIT(72), \
123+
_PyLong_POS_INIT(73), \
124+
_PyLong_POS_INIT(74), \
125+
_PyLong_POS_INIT(75), \
126+
_PyLong_POS_INIT(76), \
127+
_PyLong_POS_INIT(77), \
128+
_PyLong_POS_INIT(78), \
129+
_PyLong_POS_INIT(79), \
130+
_PyLong_POS_INIT(80), \
131+
_PyLong_POS_INIT(81), \
132+
_PyLong_POS_INIT(82), \
133+
_PyLong_POS_INIT(83), \
134+
_PyLong_POS_INIT(84), \
135+
_PyLong_POS_INIT(85), \
136+
_PyLong_POS_INIT(86), \
137+
_PyLong_POS_INIT(87), \
138+
_PyLong_POS_INIT(88), \
139+
_PyLong_POS_INIT(89), \
140+
_PyLong_POS_INIT(90), \
141+
_PyLong_POS_INIT(91), \
142+
_PyLong_POS_INIT(92), \
143+
_PyLong_POS_INIT(93), \
144+
_PyLong_POS_INIT(94), \
145+
_PyLong_POS_INIT(95), \
146+
_PyLong_POS_INIT(96), \
147+
_PyLong_POS_INIT(97), \
148+
_PyLong_POS_INIT(98), \
149+
_PyLong_POS_INIT(99), \
150+
_PyLong_POS_INIT(100), \
151+
_PyLong_POS_INIT(101), \
152+
_PyLong_POS_INIT(102), \
153+
_PyLong_POS_INIT(103), \
154+
_PyLong_POS_INIT(104), \
155+
_PyLong_POS_INIT(105), \
156+
_PyLong_POS_INIT(106), \
157+
_PyLong_POS_INIT(107), \
158+
_PyLong_POS_INIT(108), \
159+
_PyLong_POS_INIT(109), \
160+
_PyLong_POS_INIT(110), \
161+
_PyLong_POS_INIT(111), \
162+
_PyLong_POS_INIT(112), \
163+
_PyLong_POS_INIT(113), \
164+
_PyLong_POS_INIT(114), \
165+
_PyLong_POS_INIT(115), \
166+
_PyLong_POS_INIT(116), \
167+
_PyLong_POS_INIT(117), \
168+
_PyLong_POS_INIT(118), \
169+
_PyLong_POS_INIT(119), \
170+
_PyLong_POS_INIT(120), \
171+
_PyLong_POS_INIT(121), \
172+
_PyLong_POS_INIT(122), \
173+
_PyLong_POS_INIT(123), \
174+
_PyLong_POS_INIT(124), \
175+
_PyLong_POS_INIT(125), \
176+
_PyLong_POS_INIT(126), \
177+
_PyLong_POS_INIT(127), \
178+
_PyLong_POS_INIT(128), \
179+
_PyLong_POS_INIT(129), \
180+
_PyLong_POS_INIT(130), \
181+
_PyLong_POS_INIT(131), \
182+
_PyLong_POS_INIT(132), \
183+
_PyLong_POS_INIT(133), \
184+
_PyLong_POS_INIT(134), \
185+
_PyLong_POS_INIT(135), \
186+
_PyLong_POS_INIT(136), \
187+
_PyLong_POS_INIT(137), \
188+
_PyLong_POS_INIT(138), \
189+
_PyLong_POS_INIT(139), \
190+
_PyLong_POS_INIT(140), \
191+
_PyLong_POS_INIT(141), \
192+
_PyLong_POS_INIT(142), \
193+
_PyLong_POS_INIT(143), \
194+
_PyLong_POS_INIT(144), \
195+
_PyLong_POS_INIT(145), \
196+
_PyLong_POS_INIT(146), \
197+
_PyLong_POS_INIT(147), \
198+
_PyLong_POS_INIT(148), \
199+
_PyLong_POS_INIT(149), \
200+
_PyLong_POS_INIT(150), \
201+
_PyLong_POS_INIT(151), \
202+
_PyLong_POS_INIT(152), \
203+
_PyLong_POS_INIT(153), \
204+
_PyLong_POS_INIT(154), \
205+
_PyLong_POS_INIT(155), \
206+
_PyLong_POS_INIT(156), \
207+
_PyLong_POS_INIT(157), \
208+
_PyLong_POS_INIT(158), \
209+
_PyLong_POS_INIT(159), \
210+
_PyLong_POS_INIT(160), \
211+
_PyLong_POS_INIT(161), \
212+
_PyLong_POS_INIT(162), \
213+
_PyLong_POS_INIT(163), \
214+
_PyLong_POS_INIT(164), \
215+
_PyLong_POS_INIT(165), \
216+
_PyLong_POS_INIT(166), \
217+
_PyLong_POS_INIT(167), \
218+
_PyLong_POS_INIT(168), \
219+
_PyLong_POS_INIT(169), \
220+
_PyLong_POS_INIT(170), \
221+
_PyLong_POS_INIT(171), \
222+
_PyLong_POS_INIT(172), \
223+
_PyLong_POS_INIT(173), \
224+
_PyLong_POS_INIT(174), \
225+
_PyLong_POS_INIT(175), \
226+
_PyLong_POS_INIT(176), \
227+
_PyLong_POS_INIT(177), \
228+
_PyLong_POS_INIT(178), \
229+
_PyLong_POS_INIT(179), \
230+
_PyLong_POS_INIT(180), \
231+
_PyLong_POS_INIT(181), \
232+
_PyLong_POS_INIT(182), \
233+
_PyLong_POS_INIT(183), \
234+
_PyLong_POS_INIT(184), \
235+
_PyLong_POS_INIT(185), \
236+
_PyLong_POS_INIT(186), \
237+
_PyLong_POS_INIT(187), \
238+
_PyLong_POS_INIT(188), \
239+
_PyLong_POS_INIT(189), \
240+
_PyLong_POS_INIT(190), \
241+
_PyLong_POS_INIT(191), \
242+
_PyLong_POS_INIT(192), \
243+
_PyLong_POS_INIT(193), \
244+
_PyLong_POS_INIT(194), \
245+
_PyLong_POS_INIT(195), \
246+
_PyLong_POS_INIT(196), \
247+
_PyLong_POS_INIT(197), \
248+
_PyLong_POS_INIT(198), \
249+
_PyLong_POS_INIT(199), \
250+
_PyLong_POS_INIT(200), \
251+
_PyLong_POS_INIT(201), \
252+
_PyLong_POS_INIT(202), \
253+
_PyLong_POS_INIT(203), \
254+
_PyLong_POS_INIT(204), \
255+
_PyLong_POS_INIT(205), \
256+
_PyLong_POS_INIT(206), \
257+
_PyLong_POS_INIT(207), \
258+
_PyLong_POS_INIT(208), \
259+
_PyLong_POS_INIT(209), \
260+
_PyLong_POS_INIT(210), \
261+
_PyLong_POS_INIT(211), \
262+
_PyLong_POS_INIT(212), \
263+
_PyLong_POS_INIT(213), \
264+
_PyLong_POS_INIT(214), \
265+
_PyLong_POS_INIT(215), \
266+
_PyLong_POS_INIT(216), \
267+
_PyLong_POS_INIT(217), \
268+
_PyLong_POS_INIT(218), \
269+
_PyLong_POS_INIT(219), \
270+
_PyLong_POS_INIT(220), \
271+
_PyLong_POS_INIT(221), \
272+
_PyLong_POS_INIT(222), \
273+
_PyLong_POS_INIT(223), \
274+
_PyLong_POS_INIT(224), \
275+
_PyLong_POS_INIT(225), \
276+
_PyLong_POS_INIT(226), \
277+
_PyLong_POS_INIT(227), \
278+
_PyLong_POS_INIT(228), \
279+
_PyLong_POS_INIT(229), \
280+
_PyLong_POS_INIT(230), \
281+
_PyLong_POS_INIT(231), \
282+
_PyLong_POS_INIT(232), \
283+
_PyLong_POS_INIT(233), \
284+
_PyLong_POS_INIT(234), \
285+
_PyLong_POS_INIT(235), \
286+
_PyLong_POS_INIT(236), \
287+
_PyLong_POS_INIT(237), \
288+
_PyLong_POS_INIT(238), \
289+
_PyLong_POS_INIT(239), \
290+
_PyLong_POS_INIT(240), \
291+
_PyLong_POS_INIT(241), \
292+
_PyLong_POS_INIT(242), \
293+
_PyLong_POS_INIT(243), \
294+
_PyLong_POS_INIT(244), \
295+
_PyLong_POS_INIT(245), \
296+
_PyLong_POS_INIT(246), \
297+
_PyLong_POS_INIT(247), \
298+
_PyLong_POS_INIT(248), \
299+
_PyLong_POS_INIT(249), \
300+
_PyLong_POS_INIT(250), \
301+
_PyLong_POS_INIT(251), \
302+
_PyLong_POS_INIT(252), \
303+
_PyLong_POS_INIT(253), \
304+
_PyLong_POS_INIT(254), \
305+
_PyLong_POS_INIT(255), \
306+
_PyLong_POS_INIT(256), \
307+
}, \
38308
}, \
39309
}
40310

Include/internal/pycore_long.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,6 @@ extern "C" {
1414

1515
/* runtime lifecycle */
1616

17-
extern void _PyLong_InitGlobalObjects(PyInterpreterState *);
1817
extern PyStatus _PyLong_InitTypes(PyInterpreterState *);
1918

2019

Objects/longobject.c

Lines changed: 0 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -5832,29 +5832,6 @@ PyLong_GetInfo(void)
58325832

58335833
/* runtime lifecycle */
58345834

5835-
void
5836-
_PyLong_InitGlobalObjects(PyInterpreterState *interp)
5837-
{
5838-
if (!_Py_IsMainInterpreter(interp)) {
5839-
return;
5840-
}
5841-
5842-
PyLongObject *small_ints = _PyLong_SMALL_INTS;
5843-
if (small_ints[0].ob_base.ob_base.ob_refcnt != 0) {
5844-
// Py_Initialize() must be running a second time.
5845-
return;
5846-
}
5847-
5848-
for (Py_ssize_t i=0; i < _PY_NSMALLNEGINTS + _PY_NSMALLPOSINTS; i++) {
5849-
sdigit ival = (sdigit)i - _PY_NSMALLNEGINTS;
5850-
int size = (ival < 0) ? -1 : ((ival == 0) ? 0 : 1);
5851-
small_ints[i].ob_base.ob_base.ob_refcnt = 1;
5852-
small_ints[i].ob_base.ob_base.ob_type = &PyLong_Type;
5853-
small_ints[i].ob_base.ob_size = size;
5854-
small_ints[i].ob_digit[0] = (digit)abs(ival);
5855-
}
5856-
}
5857-
58585835
PyStatus
58595836
_PyLong_InitTypes(PyInterpreterState *interp)
58605837
{
@@ -5875,9 +5852,3 @@ _PyLong_InitTypes(PyInterpreterState *interp)
58755852

58765853
return _PyStatus_OK();
58775854
}
5878-
5879-
void
5880-
_PyLong_Fini(PyInterpreterState *interp)
5881-
{
5882-
(void)interp;
5883-
}

Python/pylifecycle.c

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -676,8 +676,6 @@ pycore_init_global_objects(PyInterpreterState *interp)
676676
{
677677
PyStatus status;
678678

679-
_PyLong_InitGlobalObjects(interp);
680-
681679
_PyFloat_InitState(interp);
682680

683681
status = _PyBytes_InitGlobalObjects(interp);

0 commit comments

Comments
 (0)