%PDF- %PDF-
| Direktori : /lib/python3/dist-packages/pythran/ |
| Current File : //lib/python3/dist-packages/pythran/metadata.py |
"""
This module provides a way to pass information between passes as metadata.
* add attaches a metadata to a node
* get retrieves all metadata from a particular class attached to a node
"""
from gast import AST # so that metadata are walkable as regular ast nodes
class Metadata(AST):
""" Base class to add information on a node to improve code generation. """
def __init__(self):
""" Initialize content of these metadata. """
self.data = list()
self._fields = ('data',)
super(Metadata, self).__init__()
def __iter__(self):
""" Enable iteration over every metadata informations. """
return iter(self.data)
def append(self, data):
""" Add a metadata information. """
self.data.append(data)
class Lazy(AST):
""" Metadata to mark variable which doesn't need to be evaluated now. """
class Comprehension(AST):
def __init__(self, *args): # no positional argument to be deep copyable
super(Comprehension, self).__init__()
if args:
self.target = args[0]
class StaticReturn(AST):
""" Metadata to mark return with a constant value. """
class Local(AST):
""" Metadata to mark function as non exported. """
def add(node, data):
if not hasattr(node, 'metadata'):
node.metadata = Metadata()
node._fields += ('metadata',)
node.metadata.append(data)
def get(node, class_):
if hasattr(node, 'metadata'):
return [s for s in node.metadata if isinstance(s, class_)]
else:
return []
def clear(node, class_):
if hasattr(node, 'metadata'):
node.metadata.data = [s for s in node.metadata
if not isinstance(s, class_)]
if not node.metadata.data:
del node.metadata
assert node._fields[-1] == 'metadata'
node._fields = node._fields[:-1]
def visit(self, node):
if hasattr(node, 'metadata'):
self.visit(node.metadata)