示例#1
0
 def _simple_source_info(self):
     return transformer.EntityInfo(source_code=None,
                                   source_file=None,
                                   namespace=None,
                                   arg_values=None,
                                   arg_types=None,
                                   owner_type=None)
def function_to_graph(f, program_ctx, arg_values, arg_types, owner_type=None):
    """Specialization of `entity_to_graph` for callable functions."""

    node, source = parser.parse_entity(f)
    node = node.body[0]
    origin_info.resolve(node, source, f)
    namespace = inspect_utils.getnamespace(f)
    _add_self_references(namespace, program_ctx.autograph_module)
    namer = program_ctx.new_namer(namespace)

    entity_info = transformer.EntityInfo(source_code=source,
                                         source_file='<fragment>',
                                         namespace=namespace,
                                         arg_values=arg_values,
                                         arg_types=arg_types,
                                         owner_type=owner_type)
    context = converter.EntityContext(namer, entity_info, program_ctx)
    node = node_to_graph(node, context)

    # TODO(mdan): This somewhat duplicates the call rename logic in call_treest.py
    new_name, did_rename = namer.compiled_function_name(
        f.__name__, f, owner_type)
    if not did_rename:
        new_name = f.__name__
        if node.name != f.__name__:
            raise NotImplementedError(
                'Strange corner case. Send us offending code!')

    node.name = new_name
    program_ctx.update_name_map(namer)
    # TODO(mdan): Use this at compilation.

    return node, new_name, namespace
    def parse_and_analyze(self,
                          test_fn,
                          namespace,
                          namer=None,
                          arg_types=None,
                          include_type_analysis=True,
                          owner_type=None,
                          recursive=True,
                          autograph_decorators=()):
        node, source = parser.parse_entity(test_fn)

        if namer is None:
            namer = FakeNamer()
        program_ctx = converter.ProgramContext(
            recursive=recursive,
            autograph_decorators=autograph_decorators,
            partial_types=None,
            autograph_module=None,
            uncompiled_modules=config.DEFAULT_UNCOMPILED_MODULES)
        entity_info = transformer.EntityInfo(source_code=source,
                                             source_file='<fragment>',
                                             namespace=namespace,
                                             arg_values=None,
                                             arg_types=arg_types,
                                             owner_type=owner_type)
        ctx = converter.EntityContext(namer, entity_info, program_ctx)

        node = qual_names.resolve(node)
        node = activity.resolve(node, entity_info)
        node = live_values.resolve(node, entity_info, {})
        if include_type_analysis:
            node = type_info.resolve(node, entity_info)
            node = live_values.resolve(node, entity_info, {})
        self.ctx = ctx
        return node
示例#4
0
 def prepare(self,
             test_fn,
             namespace,
             namer=None,
             arg_types=None,
             owner_type=None,
             recursive=True,
             autograph_decorators=()):
     node, source = parser.parse_entity(test_fn)
     node = node.body[0]
     if namer is None:
         namer = FakeNamer()
     program_ctx = converter.ProgramContext(
         recursive=recursive,
         autograph_decorators=autograph_decorators,
         partial_types=None,
         autograph_module=None,
         uncompiled_modules=config.DEFAULT_UNCOMPILED_MODULES)
     entity_info = transformer.EntityInfo(source_code=source,
                                          source_file='<fragment>',
                                          namespace=namespace,
                                          arg_values=None,
                                          arg_types=arg_types,
                                          owner_type=owner_type)
     ctx = converter.EntityContext(namer, entity_info, program_ctx)
     node = converter.standard_analysis(node, ctx, is_initial=True)
     return node, ctx
 def _parse_and_analyze(self, test_fn):
     node, source = parser.parse_entity(test_fn)
     entity_info = transformer.EntityInfo(source_code=source,
                                          source_file=None,
                                          namespace={},
                                          arg_values=None,
                                          arg_types=None,
                                          owner_type=None)
     node = qual_names.resolve(node)
     node = activity.resolve(node, entity_info)
     return node, entity_info
 def _parse_and_analyze(self, test_fn):
   node, source = parser.parse_entity(test_fn)
   entity_info = transformer.EntityInfo(
       source_code=source,
       source_file=None,
       namespace={},
       arg_values=None,
       arg_types=None,
       owner_type=None)
   node = qual_names.resolve(node)
   node = activity.resolve(node, entity_info)
   graphs = cfg.build(node)
   node = reaching_definitions.resolve(node, entity_info, graphs,
                                       reaching_definitions.Definition)
   return node
示例#7
0
 def _parse_and_analyze(self,
                        test_fn,
                        namespace,
                        literals=None,
                        arg_types=None):
   literals = literals or {}
   node, source = parser.parse_entity(test_fn)
   entity_info = transformer.EntityInfo(
       source_code=source,
       source_file=None,
       namespace=namespace,
       arg_values=None,
       arg_types=arg_types,
       owner_type=None)
   node = qual_names.resolve(node)
   node = activity.resolve(node, entity_info)
   node = live_values.resolve(node, entity_info, literals)
   node = type_info.resolve(node, entity_info)
   node = live_values.resolve(node, entity_info, literals)
   return node