Skip to content

Commit 9c18256

Browse files
committed
autogeneration of paridecl.pxd
1 parent 83ea7d2 commit 9c18256

File tree

3 files changed

+63
-35
lines changed

3 files changed

+63
-35
lines changed

.gitignore

+2-2
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,8 @@ cypari2/auto_gen.pxi.tmp
44
cypari2/auto_gen.pxi
55
cypari2/auto_instance.pxi.tmp
66
cypari2/auto_instance.pxi
7-
cypari2/auto_paridecl.pxd.tmp
8-
cypari2/auto_paridecl.pxd
7+
cypari2/paridecl.pxd.tmp
8+
cypari2/paridecl.pxd
99
cypari2/closure.c
1010
cypari2/convert.c
1111
cypari2/gen.c

autogen/generator.py

+53-25
Original file line numberDiff line numberDiff line change
@@ -44,12 +44,6 @@
4444
"""
4545
'''
4646

47-
decl_banner = autogen_top + '''
48-
from .types cimport *
49-
50-
cdef extern from *:
51-
'''
52-
5347

5448
function_re = re.compile(r"^[A-Za-z][A-Za-z0-9_]*$")
5549
function_blacklist = {"O", # O(p^e) needs special parser support
@@ -75,7 +69,27 @@ class PariFunctionGenerator(object):
7569
def __init__(self):
7670
self.gen_filename = os.path.join('cypari2', 'auto_gen.pxi')
7771
self.instance_filename = os.path.join('cypari2', 'auto_instance.pxi')
78-
self.decl_filename = os.path.join('cypari2', 'auto_paridecl.pxd')
72+
self.decl_filename = os.path.join('cypari2', 'paridecl.pxd')
73+
74+
def write_paridecl_no_desc(self, D):
75+
r"""
76+
Write the template ``template_paridecl.pxd`` into the declaration file
77+
after removing all functions from ``D`` (that are obtained from
78+
``pari.desc``).
79+
"""
80+
fnc = re.compile(" (int|long|void|GEN) +([A-Za-z][0-9A-Za-z_]*)\(.*\)")
81+
82+
functions = set(f.get('cname') for f in D)
83+
84+
with open('autogen/template_paridecl.pxd') as template:
85+
for line in template.read().split('\n'):
86+
match = fnc.match(line)
87+
if match:
88+
out_type, fname = match.groups()
89+
if fname in functions:
90+
continue
91+
self.decl_file.write(line)
92+
self.decl_file.write("\n")
7993

8094
def can_handle_function(self, function, cname="", **kwds):
8195
"""
@@ -107,9 +121,10 @@ def can_handle_function(self, function, cname="", **kwds):
107121
if sec == "programming/control":
108122
# Skip if, return, break, ...
109123
return False
124+
110125
return True
111126

112-
def handle_pari_function(self, function, cname, prototype="", help="", obsolete=None, **kwds):
127+
def handle_pari_function(self, function, cname, prototype, help, args=None, ret=None, obsolete=None, **kwds):
113128
r"""
114129
Handle one PARI function: decide whether or not to add the
115130
function, in which file (as method of :class:`Gen` or
@@ -118,8 +133,8 @@ def handle_pari_function(self, function, cname, prototype="", help="", obsolete=
118133
119134
EXAMPLES::
120135
121-
>>> from autogen.parser import read_pari_desc
122136
>>> from autogen.generator import PariFunctionGenerator
137+
>>> import sys
123138
>>> G = PariFunctionGenerator()
124139
>>> G.gen_file = sys.stdout
125140
>>> G.instance_file = sys.stdout
@@ -201,13 +216,10 @@ def bernvec(self, long x):
201216
return new_gen(_ret)
202217
<BLANKLINE>
203218
"""
204-
try:
219+
if args is None or ret is None:
205220
args, ret = parse_prototype(prototype, help)
206-
except NotImplementedError:
207-
return # Skip unsupported prototype codes
208-
221+
sys.stdout.flush()
209222
doc = get_rest_doc(function)
210-
211223
self.write_declaration(cname, args, ret, self.decl_file)
212224

213225
if len(args) > 0 and isinstance(args[0], PariArgumentGEN):
@@ -222,6 +234,8 @@ def bernvec(self, long x):
222234
self.write_method(function, cname, args, ret, args[1:],
223235
self.instance_file, doc, obsolete)
224236

237+
return 0
238+
225239
def write_declaration(self, cname, args, ret, file):
226240
"""
227241
Write a .pxd declaration of a PARI library function.
@@ -293,29 +307,43 @@ def __call__(self):
293307
"""
294308
D = read_pari_desc()
295309
D = sorted(D.values(), key=lambda d: d['function'])
296-
sys.stdout.write("Generating PARI functions:")
297310

298311
self.gen_file = io.open(self.gen_filename + '.tmp', 'w', encoding='utf-8')
299312
self.gen_file.write(gen_banner)
300313
self.instance_file = io.open(self.instance_filename + '.tmp', 'w', encoding='utf-8')
301314
self.instance_file.write(instance_banner)
302315
self.decl_file = io.open(self.decl_filename + '.tmp', 'w', encoding='utf-8')
303-
self.decl_file.write(decl_banner)
316+
317+
DD = []
318+
sys.stdout.write("Unhandled PARI function:\n")
319+
for v in D:
320+
func = v["function"]
321+
if not self.can_handle_function(**v):
322+
sys.stdout.write(" (%s)" % func)
323+
else:
324+
try:
325+
args, ret = parse_prototype(v["prototype"], v["help"])
326+
v["args"] = args
327+
v["ret"] = ret
328+
DD.append(v)
329+
except NotImplementedError:
330+
sys.stdout.write(" ((%s))" % func)
331+
sys.stdout.write("\n")
332+
333+
self.write_paridecl_no_desc(DD)
304334

305335
# Check for availability of hi-res SVG plotting. This requires
306336
# PARI-2.10 or later.
307337
have_plot_svg = False
308338

309-
for v in D:
339+
sys.stdout.write("Generating PARI functions:\n")
340+
for v in DD:
310341
func = v["function"]
311-
if self.can_handle_function(**v):
312-
sys.stdout.write(" %s" % func)
313-
sys.stdout.flush()
314-
self.handle_pari_function(**v)
315-
if func == "plothraw":
316-
have_plot_svg = True
317-
else:
318-
sys.stdout.write(" (%s)" % func)
342+
sys.stdout.write(" %s" % func)
343+
self.handle_pari_function(**v)
344+
sys.stdout.flush()
345+
if func == "plothraw":
346+
have_plot_svg = True
319347
sys.stdout.write("\n")
320348

321349
self.instance_file.write("DEF HAVE_PLOT_SVG = {}".format(have_plot_svg))

autogen/template_paridecl.pxd

+8-8
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,9 @@
11
# distutils: libraries = gmp pari
22
"""
3-
Declarations for non-inline functions from PARI.
3+
Declarations of PARI functions.
44
55
This file contains all declarations from headers/paridecl.h from
6-
the PARI distribution, except the inline functions which are in
7-
declinl.pxi (that file is automatically included by this file).
8-
6+
the PARI distribution.
97
108
AUTHORS:
119
@@ -20,6 +18,9 @@ AUTHORS:
2018
2119
- Jeroen Demeyer (2014-09-19): upgrade to PARI 2.8 (:trac:`16997`)
2220
21+
- Vincent Delecroix (2017-2018): auto-generate part of the declarations
22+
from ``pari.desc``
23+
2324
"""
2425

2526
#*****************************************************************************
@@ -5168,7 +5169,6 @@ cdef extern from *: # PARI headers already included by types.pxd
51685169
void pari_err_VAR(const char *f, GEN x, GEN y)
51695170
void pari_err_ROOTS0(const char *f)
51705171

5171-
# Auto-generated declarations. There are taken from the PARI version
5172-
# on the system, so they more up-to-date than the above. In case of
5173-
# conflicting declarations, auto_paridecl should have priority.
5174-
from .auto_paridecl cimport *
5172+
#########################################################
5173+
# All functions below are auto-generated from pari.desc #
5174+
#########################################################

0 commit comments

Comments
 (0)