[Numpy-svn] r5886 - trunk/numpy/distutils
numpy-svn at scipy.org
numpy-svn at scipy.org
Wed Oct 1 14:05:31 EDT 2008
Author: charris
Date: 2008-10-01 13:05:29 -0500 (Wed, 01 Oct 2008)
New Revision: 5886
Modified:
trunk/numpy/distutils/conv_template.py
Log:
Make some error messages more informative.
Improve error handling.
Make continuation lines work.
Modified: trunk/numpy/distutils/conv_template.py
===================================================================
--- trunk/numpy/distutils/conv_template.py 2008-10-01 17:16:05 UTC (rev 5885)
+++ trunk/numpy/distutils/conv_template.py 2008-10-01 18:05:29 UTC (rev 5886)
@@ -128,19 +128,22 @@
numrep = obj.group(2)
return ','.join([torep]*int(numrep))
-parenrep = re.compile(r"[(]([^)]*?)[)]\*(\d+)")
+parenrep = re.compile(r"[(]([^)]*)[)]\*(\d+)")
plainrep = re.compile(r"([^*]+)\*(\d+)")
-def conv(astr):
+def parse_values(astr):
# replaces all occurrences of '(a,b,c)*4' in astr
- # with 'a,b,c,a,b,c,a,b,c,a,b,c'. The result is
+ # with 'a,b,c,a,b,c,a,b,c,a,b,c'. Empty braces generate
+ # empty values, i.e., ()*4 yields ',,,'. The result is
# split at ',' and a list of values returned.
- astr = parenrep.sub(paren_repl,astr)
+ astr = parenrep.sub(paren_repl, astr)
# replaces occurences of xxx*3 with xxx, xxx, xxx
astr = ','.join([plainrep.sub(paren_repl,x.strip())
for x in astr.split(',')])
return astr.split(',')
-named_re = re.compile(r"#\s*([\w]*)\s*=\s*([^#]*)#")
+
+stripast = re.compile(r"\n\s*\*?")
+named_re = re.compile(r"#\s*(\w*)\s*=([^#]*)#")
def parse_loop_header(loophead) :
"""Find all named replacements in the header
@@ -149,23 +152,29 @@
value is the replacement string.
"""
+ # Strip out '\n' and leading '*', if any, in continuation lines.
+ # This should not effect code previous to this change as
+ # continuation lines were not allowed.
+ loophead = stripast.sub("", loophead)
# parse out the names and lists of values
names = []
reps = named_re.findall(loophead)
nsub = None
for rep in reps:
- name = rep[0].strip()
- vals = conv(rep[1])
+ name = rep[0]
+ vals = parse_values(rep[1])
size = len(vals)
if nsub is None :
nsub = size
elif nsub != size :
- msg = "Mismatch in number: %s - %s" % (name, vals)
+ msg = "Mismatch in number of values:\n%s = %s" % (name, vals)
raise ValueError, msg
names.append((name,vals))
# generate list of dictionaries, one for each template iteration
dlist = []
+ if nsub is None :
+ raise ValueError, "No substitution variables found"
for i in range(nsub) :
tmp = {}
for name,vals in names :
@@ -183,8 +192,8 @@
try :
val = env[name]
except KeyError, e :
- msg = '%s: %s'%(lineno, e)
- raise KeyError, msg
+ msg = 'line %d: %s'%(line, e)
+ raise ValueError, msg
return val
code = [lineno]
@@ -203,7 +212,7 @@
try :
envlist = parse_loop_header(head)
except ValueError, e :
- msg = "%s: %s" % (lineno, e)
+ msg = "line %d: %s" % (newline, e)
raise ValueError, msg
for newenv in envlist :
newenv.update(env)
@@ -249,7 +258,10 @@
def process_file(source):
lines = resolve_includes(source)
sourcefile = os.path.normcase(source).replace("\\","\\\\")
- code = process_str(''.join(lines))
+ try:
+ code = process_str(''.join(lines))
+ except ValueError, e:
+ raise ValueError, '"%s", %s' % (sourcefile, e)
return '#line 1 "%s"\n%s' % (sourcefile, code)
@@ -284,5 +296,8 @@
outfile = open(newname,'w')
allstr = fid.read()
- writestr = process_str(allstr)
+ try:
+ writestr = process_str(allstr)
+ except ValueError, e:
+ raise ValueError, "file %s, %s" % (file, e)
outfile.write(writestr)
More information about the Numpy-svn
mailing list