Secure your code as it's written. Use Snyk Code to scan source code in minutes - no build needed - and fix issues immediately.
raise UndefinedSymbolError("Symbol %s does not seem to be defined yet. Make sure you apply "
"`compile_fun` *after* all required symbols have been defined." % name)
try:
value = cell.cell_contents
except ValueError:
# empty cell
continue
else:
# non-empty cell
try:
# note : not sure the compilation will be made in the appropriate order of dependencies...
# if not, users will have to do it manually
_evaldict[name] = compile_fun_manually(value,
recurse=recurse, except_names=except_names,
_evaldict=_evaldict)
except (UnsupportedForCompilation, SourceUnavailable):
pass
# now compile from sources
lines = dedent(lines)
source_lines = lines
if lines.startswith('@compile_fun'):
lines = '\n'.join(lines.splitlines()[1:])
if '@compile_fun' in lines:
raise ValueError("@compile_fun seems to appear several times in the function source")
if lines[-1] != '\n':
lines += '\n'
# print("compiling: ")
# print(lines)
new_f = _make(target.__name__, (), lines, _evaldict)
new_f.__source__ = source_lines
def compile_fun_manually(target,
recurse=True, # type: Union[bool, Callable]
except_names=(), # type: Iterable[str]
_evaldict=None # type: Union[bool, Dict]
):
"""
:param target:
:return:
"""
if not isinstance(target, FunctionType):
raise UnsupportedForCompilation("Only functions can be compiled by this decorator")
if _evaldict is None or _evaldict is True:
if _evaldict is True:
frame = _get_callerframe(offset=1)
else:
frame = _get_callerframe()
_evaldict, _ = extract_module_and_evaldict(frame)
# first make sure that source code is available for compilation
try:
lines = getsource(target)
except (OSError, IOError) as e:
if 'could not get source code' in str(e):
raise SourceUnavailable(target, e)
else:
raise