Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit121f1f8

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 parentcb589d1 commit121f1f8

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+
#ifndefPy_INTERNAL_GLOBAL_OBJECTS_H
2+
#definePy_INTERNAL_GLOBAL_OBJECTS_H
3+
#ifdef__cplusplus
4+
extern"C" {
5+
#endif
6+
7+
#ifndefPy_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+
PyLongObjectsmall_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+
staticinlinevoid
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-
externvoid_PyLong_InitGlobalObjects(PyInterpreterState*);
1917
externPyStatus_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
staticinlinePyObject*_PyLong_GetZero(void)

‎Include/internal/pycore_long_state.h

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

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp