%PDF- %PDF-
| Direktori : /lib/python3/dist-packages/pythran/ |
| Current File : //lib/python3/dist-packages/pythran/middlend.py |
"""This module turns a python AST into an optimized, pythran compatible ast."""
from pythran.analyses import ExtendedSyntaxCheck
from pythran.optimizations import (ComprehensionPatterns, ListCompToGenexp,
RemoveDeadFunctions)
from pythran.transformations import (ExpandBuiltins, ExpandImports,
ExpandImportAll, FalsePolymorphism,
NormalizeCompare, NormalizeException,
NormalizeMethodCalls, NormalizeReturn,
NormalizeTuples, RemoveComprehension,
RemoveNestedFunctions, RemoveLambdas,
UnshadowParameters, RemoveNamedArguments,
ExpandGlobals, NormalizeIsNone,
NormalizeIfElse,
NormalizeStaticIf, SplitStaticExpression,
RemoveFStrings)
def refine(pm, node, optimizations):
""" Refine node in place until it matches pythran's expectations. """
# Sanitize input
pm.apply(RemoveDeadFunctions, node)
pm.apply(ExpandGlobals, node)
pm.apply(ExpandImportAll, node)
pm.apply(NormalizeTuples, node)
pm.apply(RemoveFStrings, node)
pm.apply(ExpandBuiltins, node)
pm.apply(ExpandImports, node)
pm.apply(NormalizeMethodCalls, node)
pm.apply(NormalizeIfElse, node)
pm.apply(NormalizeIsNone, node)
pm.apply(SplitStaticExpression, node)
pm.apply(NormalizeStaticIf, node)
pm.apply(NormalizeTuples, node)
pm.apply(NormalizeException, node)
pm.apply(NormalizeMethodCalls, node)
# Some early optimizations
pm.apply(ComprehensionPatterns, node)
pm.apply(RemoveLambdas, node)
pm.apply(RemoveNestedFunctions, node)
pm.apply(NormalizeCompare, node)
pm.gather(ExtendedSyntaxCheck, node)
pm.apply(ListCompToGenexp, node)
pm.apply(RemoveComprehension, node)
pm.apply(RemoveNamedArguments, node)
# sanitize input
pm.apply(NormalizeReturn, node)
pm.apply(UnshadowParameters, node)
pm.apply(FalsePolymorphism, node)
# some extra optimizations
apply_optimisation = True
while apply_optimisation:
apply_optimisation = False
for optimization in optimizations:
apply_optimisation |= pm.apply(optimization, node)[0]
def mark_unexported_functions(ir, exported_functions):
from pythran.metadata import add as MDadd, Local as MDLocal
for node in ir.body:
if hasattr(node, 'name'):
if node.name not in exported_functions:
MDadd(node, MDLocal())
return ir