annotate Tools/scripts/abitype.py @ 70817:dd775b1561ba

Fix markup.
author Georg Brandl <georg@python.org>
date Tue, 14 Jun 2011 21:09:55 +0200
parents 20d82873aa97
children 65d5ecefd50d
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
66664
62b61abd02b8 Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1 # This script converts a C file to use the PEP 384 type definition API
62b61abd02b8 Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
2 # Usage: abitype.py < old_code > new_code
62b61abd02b8 Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
3 import re, sys
62b61abd02b8 Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
4
62b61abd02b8 Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
5 ############ Simplistic C scanner ##################################
62b61abd02b8 Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
6 tokenizer = re.compile(
62b61abd02b8 Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
7 r"(?P<preproc>#.*\n)"
62b61abd02b8 Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
8 r"|(?P<comment>/\*.*?\*/)"
62b61abd02b8 Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
9 r"|(?P<ident>[a-zA-Z_][a-zA-Z0-9_]*)"
62b61abd02b8 Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
10 r"|(?P<ws>[ \t\n]+)"
62b61abd02b8 Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
11 r"|(?P<other>.)",
62b61abd02b8 Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
12 re.MULTILINE)
62b61abd02b8 Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
13
62b61abd02b8 Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
14 tokens = []
62b61abd02b8 Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
15 source = sys.stdin.read()
62b61abd02b8 Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
16 pos = 0
62b61abd02b8 Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
17 while pos != len(source):
62b61abd02b8 Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
18 m = tokenizer.match(source, pos)
62b61abd02b8 Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
19 tokens.append([m.lastgroup, m.group()])
62b61abd02b8 Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
20 pos += len(tokens[-1][1])
62b61abd02b8 Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
21 if tokens[-1][0] == 'preproc':
62b61abd02b8 Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
22 # continuation lines are considered
62b61abd02b8 Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
23 # only in preprocess statements
62b61abd02b8 Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
24 while tokens[-1][1].endswith('\\\n'):
62b61abd02b8 Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
25 nl = source.find('\n', pos)
62b61abd02b8 Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
26 if nl == -1:
62b61abd02b8 Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
27 line = source[pos:]
62b61abd02b8 Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
28 else:
62b61abd02b8 Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
29 line = source[pos:nl+1]
62b61abd02b8 Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
30 tokens[-1][1] += line
62b61abd02b8 Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
31 pos += len(line)
62b61abd02b8 Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
32
62b61abd02b8 Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
33 ###### Replacement of PyTypeObject static instances ##############
62b61abd02b8 Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
34
62b61abd02b8 Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
35 # classify each token, giving it a one-letter code:
62b61abd02b8 Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
36 # S: static
62b61abd02b8 Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
37 # T: PyTypeObject
62b61abd02b8 Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
38 # I: ident
62b61abd02b8 Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
39 # W: whitespace
62b61abd02b8 Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
40 # =, {, }, ; : themselves
62b61abd02b8 Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
41 def classify():
62b61abd02b8 Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
42 res = []
62b61abd02b8 Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
43 for t,v in tokens:
62b61abd02b8 Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
44 if t == 'other' and v in "={};":
62b61abd02b8 Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
45 res.append(v)
62b61abd02b8 Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
46 elif t == 'ident':
62b61abd02b8 Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
47 if v == 'PyTypeObject':
62b61abd02b8 Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
48 res.append('T')
62b61abd02b8 Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
49 elif v == 'static':
62b61abd02b8 Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
50 res.append('S')
62b61abd02b8 Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
51 else:
62b61abd02b8 Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
52 res.append('I')
62b61abd02b8 Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
53 elif t == 'ws':
62b61abd02b8 Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
54 res.append('W')
62b61abd02b8 Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
55 else:
62b61abd02b8 Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
56 res.append('.')
62b61abd02b8 Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
57 return ''.join(res)
62b61abd02b8 Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
58
62b61abd02b8 Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
59 # Obtain a list of fields of a PyTypeObject, in declaration order,
62b61abd02b8 Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
60 # skipping ob_base
62b61abd02b8 Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
61 # All comments are dropped from the variable (which are typically
62b61abd02b8 Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
62 # just the slot names, anyway), and information is discarded whether
62b61abd02b8 Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
63 # the original type was static.
62b61abd02b8 Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
64 def get_fields(start, real_end):
62b61abd02b8 Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
65 pos = start
62b61abd02b8 Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
66 # static?
62b61abd02b8 Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
67 if tokens[pos][1] == 'static':
62b61abd02b8 Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
68 pos += 2
62b61abd02b8 Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
69 # PyTypeObject
62b61abd02b8 Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
70 pos += 2
62b61abd02b8 Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
71 # name
62b61abd02b8 Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
72 name = tokens[pos][1]
62b61abd02b8 Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
73 pos += 1
62b61abd02b8 Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
74 while tokens[pos][1] != '{':
62b61abd02b8 Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
75 pos += 1
62b61abd02b8 Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
76 pos += 1
62b61abd02b8 Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
77 # PyVarObject_HEAD_INIT
62b61abd02b8 Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
78 while tokens[pos][0] in ('ws', 'comment'):
62b61abd02b8 Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
79 pos += 1
62b61abd02b8 Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
80 if tokens[pos][1] != 'PyVarObject_HEAD_INIT':
62b61abd02b8 Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
81 raise Exception, '%s has no PyVarObject_HEAD_INIT' % name
62b61abd02b8 Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
82 while tokens[pos][1] != ')':
62b61abd02b8 Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
83 pos += 1
62b61abd02b8 Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
84 pos += 1
62b61abd02b8 Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
85 # field definitions: various tokens, comma-separated
62b61abd02b8 Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
86 fields = []
62b61abd02b8 Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
87 while True:
62b61abd02b8 Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
88 while tokens[pos][0] in ('ws', 'comment'):
62b61abd02b8 Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
89 pos += 1
62b61abd02b8 Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
90 end = pos
62b61abd02b8 Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
91 while tokens[end][1] not in ',}':
62b61abd02b8 Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
92 if tokens[end][1] == '(':
62b61abd02b8 Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
93 nesting = 1
62b61abd02b8 Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
94 while nesting:
62b61abd02b8 Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
95 end += 1
62b61abd02b8 Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
96 if tokens[end][1] == '(': nesting+=1
62b61abd02b8 Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
97 if tokens[end][1] == ')': nesting-=1
62b61abd02b8 Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
98 end += 1
62b61abd02b8 Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
99 assert end < real_end
62b61abd02b8 Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
100 # join field, excluding separator and trailing ws
62b61abd02b8 Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
101 end1 = end-1
62b61abd02b8 Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
102 while tokens[end1][0] in ('ws', 'comment'):
62b61abd02b8 Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
103 end1 -= 1
62b61abd02b8 Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
104 fields.append(''.join(t[1] for t in tokens[pos:end1+1]))
62b61abd02b8 Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
105 if tokens[end][1] == '}':
62b61abd02b8 Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
106 break
62b61abd02b8 Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
107 pos = end+1
62b61abd02b8 Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
108 return name, fields
62b61abd02b8 Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
109
62b61abd02b8 Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
110 # List of type slots as of Python 3.2, omitting ob_base
62b61abd02b8 Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
111 typeslots = [
62b61abd02b8 Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
112 'tp_name',
62b61abd02b8 Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
113 'tp_basicsize',
62b61abd02b8 Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
114 'tp_itemsize',
62b61abd02b8 Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
115 'tp_dealloc',
62b61abd02b8 Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
116 'tp_print',
62b61abd02b8 Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
117 'tp_getattr',
62b61abd02b8 Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
118 'tp_setattr',
62b61abd02b8 Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
119 'tp_reserved',
62b61abd02b8 Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
120 'tp_repr',
62b61abd02b8 Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
121 'tp_as_number',
62b61abd02b8 Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
122 'tp_as_sequence',
62b61abd02b8 Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
123 'tp_as_mapping',
62b61abd02b8 Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
124 'tp_hash',
62b61abd02b8 Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
125 'tp_call',
62b61abd02b8 Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
126 'tp_str',
62b61abd02b8 Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
127 'tp_getattro',
62b61abd02b8 Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
128 'tp_setattro',
62b61abd02b8 Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
129 'tp_as_buffer',
62b61abd02b8 Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
130 'tp_flags',
62b61abd02b8 Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
131 'tp_doc',
62b61abd02b8 Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
132 'tp_traverse',
62b61abd02b8 Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
133 'tp_clear',
62b61abd02b8 Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
134 'tp_richcompare',
62b61abd02b8 Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
135 'tp_weaklistoffset',
62b61abd02b8 Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
136 'tp_iter',
62b61abd02b8 Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
137 'iternextfunc',
62b61abd02b8 Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
138 'tp_methods',
62b61abd02b8 Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
139 'tp_members',
62b61abd02b8 Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
140 'tp_getset',
62b61abd02b8 Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
141 'tp_base',
62b61abd02b8 Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
142 'tp_dict',
62b61abd02b8 Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
143 'tp_descr_get',
62b61abd02b8 Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
144 'tp_descr_set',
62b61abd02b8 Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
145 'tp_dictoffset',
62b61abd02b8 Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
146 'tp_init',
62b61abd02b8 Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
147 'tp_alloc',
62b61abd02b8 Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
148 'tp_new',
62b61abd02b8 Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
149 'tp_free',
62b61abd02b8 Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
150 'tp_is_gc',
62b61abd02b8 Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
151 'tp_bases',
62b61abd02b8 Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
152 'tp_mro',
62b61abd02b8 Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
153 'tp_cache',
62b61abd02b8 Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
154 'tp_subclasses',
62b61abd02b8 Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
155 'tp_weaklist',
62b61abd02b8 Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
156 'tp_del'
62b61abd02b8 Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
157 'tp_version_tag'
62b61abd02b8 Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
158 ]
62b61abd02b8 Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
159
62b61abd02b8 Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
160 # Generate a PyType_Spec definition
62b61abd02b8 Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
161 def make_slots(name, fields):
62b61abd02b8 Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
162 res = []
62b61abd02b8 Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
163 res.append('static PyType_Slot %s_slots[] = {' % name)
62b61abd02b8 Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
164 # defaults for spec
67924
20d82873aa97 Issue #11135: Remove redundant doc field from PyType_Spec.
Martin v. Löwis <martin@v.loewis.de>
parents: 66664
diff changeset
165 spec = { 'tp_itemsize':'0' }
66664
62b61abd02b8 Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
166 for i, val in enumerate(fields):
62b61abd02b8 Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
167 if val.endswith('0'):
62b61abd02b8 Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
168 continue
62b61abd02b8 Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
169 if typeslots[i] in ('tp_name', 'tp_doc', 'tp_basicsize',
62b61abd02b8 Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
170 'tp_itemsize', 'tp_flags'):
62b61abd02b8 Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
171 spec[typeslots[i]] = val
62b61abd02b8 Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
172 continue
62b61abd02b8 Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
173 res.append(' {Py_%s, %s},' % (typeslots[i], val))
62b61abd02b8 Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
174 res.append('};')
62b61abd02b8 Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
175 res.append('static PyType_Spec %s_spec = {' % name)
62b61abd02b8 Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
176 res.append(' %s,' % spec['tp_name'])
62b61abd02b8 Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
177 res.append(' %s,' % spec['tp_basicsize'])
62b61abd02b8 Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
178 res.append(' %s,' % spec['tp_itemsize'])
62b61abd02b8 Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
179 res.append(' %s,' % spec['tp_flags'])
62b61abd02b8 Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
180 res.append(' %s_slots,' % name)
62b61abd02b8 Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
181 res.append('};\n')
62b61abd02b8 Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
182 return '\n'.join(res)
62b61abd02b8 Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
183
62b61abd02b8 Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
184
62b61abd02b8 Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
185 # Main loop: replace all static PyTypeObjects until
62b61abd02b8 Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
186 # there are none left.
62b61abd02b8 Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
187 while 1:
62b61abd02b8 Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
188 c = classify()
62b61abd02b8 Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
189 m = re.search('(SW)?TWIW?=W?{.*?};', c)
62b61abd02b8 Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
190 if not m:
62b61abd02b8 Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
191 break
62b61abd02b8 Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
192 start = m.start()
62b61abd02b8 Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
193 end = m.end()
62b61abd02b8 Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
194 name, fields = get_fields(start, m)
62b61abd02b8 Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
195 tokens[start:end] = [('',make_slots(name, fields))]
62b61abd02b8 Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
196
62b61abd02b8 Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
197 # Output result to stdout
62b61abd02b8 Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
198 for t, v in tokens:
62b61abd02b8 Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
199 sys.stdout.write(v)