Commit d0a66db8 authored by Robert Bradshaw's avatar Robert Bradshaw

Strip common indentation in inline code.

parent 799bf36b
...@@ -34,7 +34,7 @@ def cython_inline(code, types='aggressive', lib_dir=os.path.expanduser('~/.cytho ...@@ -34,7 +34,7 @@ def cython_inline(code, types='aggressive', lib_dir=os.path.expanduser('~/.cytho
key = code, arg_sigs key = code, arg_sigs
module = code_cache.get(key) module = code_cache.get(key)
if not module: if not module:
module_body, extract_func_code = extract_bodies(code) module_body, func_body = extract_func_code(code)
params = ', '.join('%s %s' % a for a in arg_sigs) params = ', '.join('%s %s' % a for a in arg_sigs)
module_code = """ module_code = """
%(module_body)s %(module_body)s
...@@ -58,13 +58,39 @@ def __invoke(%(params)s): ...@@ -58,13 +58,39 @@ def __invoke(%(params)s):
arg_list = [kwds[arg] for arg in arg_names] arg_list = [kwds[arg] for arg in arg_names]
return __import__(module).__invoke(*arg_list) return __import__(module).__invoke(*arg_list)
non_space = re.compile('[^ ]')
def strip_common_indent(lines):
min_indent = None
for line in lines:
if not line:
continue # empty
indent = non_space.search(line).start()
if indent == len(line):
continue # blank
elif line[indent] == '#':
continue # comment
elif min_indent is None or min_indent > indent:
min_indent = indent
for line in lines:
if not line:
continue
indent = non_space.search(line).start()
if indent == len(line):
continue
elif line[indent] == '#':
yield line
else:
yield line[min_indent:]
module_statement = re.compile(r'^((cdef +(extern|class))|cimport|(from .+ cimport)|(from .+ import +[*]))') module_statement = re.compile(r'^((cdef +(extern|class))|cimport|(from .+ cimport)|(from .+ import +[*]))')
def extract_func_code(code): def extract_func_code(code):
module = [] module = []
function = [] function = []
# TODO: string literals, backslash # TODO: string literals, backslash
current = function current = function
for line in code.split('\n'): code = code.replace('\t', ' ')
lines = strip_common_indent(code.split('\n'))
for line in lines:
if not line.startswith(' '): if not line.startswith(' '):
if module_statement.match(line): if module_statement.match(line):
current = module current = module
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment