Пример #1
0
    def vcall(self,
              module: 'values.Field',
              graph: 'graphs.Graph',
              inst: 'values.Object',
              args=[],
              line=-1):
        ret = values.Object(
            values.UserDefinedInstance(module, None, self.classinfo))
        inst = ret

        func_field = values.Field()
        func_field.set_module(module)

        # add self
        if inst is not None:
            self_func_arg = FunctionArg()
            self_func_arg.obj = inst
            args = [self_func_arg] + args

        # add args
        funcArgs = self.parse_args(args)

        for fa in funcArgs:
            func_field.get_field().get_attribute(fa.name).revise(fa.obj)

        astc = vevaluator.AstContext(self.ast.body, self.lineno - 1)
        vevaluator.veval_ast(astc, func_field, graph)

        return ret
Пример #2
0
    def vcall(self,
              module: 'values.Field',
              graph: 'core.Graph',
              inst: 'values.ValueRef',
              args: 'FunctionArgInput',
              line=-1):
        func_field = values.Field()
        func_field.set_module(module)

        # add args
        funcArgs = self.args.merge_inputs(inst, args)

        for k, v in funcArgs.keywords.items():
            func_field.get_field().get_attribute(k).revise(v)

        astc = vevaluator.AstContext(self.ast.body, self.lineno - 1)
        return vevaluator.veval_ast(astc, func_field, graph)
Пример #3
0
    def vcall(self, module : 'values.Field', graph : 'core.Graph', inst : 'Value', args = [], line = -1):
        func_field = values.Field()
        func_field.set_module(module)

        # add self
        if inst is not None:
            self_func_arg = FunctionArg()
            self_func_arg.value = inst
            args = [self_func_arg] + args

        # add args
        funcArgs = self.parse_args(args)

        for fa in funcArgs:
            func_field.get_field().get_attribute(fa.name).revise(fa.value)

        astc = vevaluator.AstContext(self.ast.body, self.lineno - 1)
        return vevaluator.veval_ast(astc, func_field, graph)
Пример #4
0
    def vcall(self,
              module: 'values.Field',
              graph: 'core.Graph',
              inst: 'values.Object',
              args: 'FunctionArgInput',
              line=-1):
        func_field = values.Field()
        func_field.set_module(module)

        # add self
        if inst is not None:
            args.inputs = [inst] + args.inputs

        # add args
        funcArgs = self.args.merge_inputs(args)

        for fa in funcArgs.get_args():
            func_field.get_field().get_attribute(fa.name).revise(fa.obj)

        astc = vevaluator.AstContext(self.ast.body, self.lineno - 1)
        return vevaluator.veval_ast(astc, func_field, graph)
Пример #5
0
    def vcall(self,
              module: 'values.Field',
              graph: 'graphs.Graph',
              inst: 'values.ValueRef',
              args: 'FunctionArgInput',
              line=-1):
        ret = values.ValueRef(
            values.UserDefinedInstance(module, None, self.classinfo))
        inst = ret

        func_field = values.Field()
        func_field.set_module(module)

        # add args
        funcArgs = self.args.merge_inputs(inst, args)

        for k, v in funcArgs.keywords.items():
            func_field.get_field().get_attribute(k).revise(v)

        astc = vevaluator.AstContext(self.ast.body, self.lineno - 1)
        vevaluator.veval_ast(astc, func_field, graph)

        return ret
Пример #6
0
def veval_ast_listcomp(astc: 'AstContext', local_field: 'values.Field',
                       graph: 'Graph'):
    '''
    Ex. [x for x in xx]
    [elt for target in iter]
    '''
    assert (isinstance(astc.nast, gast.gast.ListComp))
    lineprop = utils.LineProperty(astc.lineno)

    listcomp_guid = str(utils.get_guid())
    listcomp_id = 'listcomp_' + listcomp_guid
    body_id = 'listcomp_body_' + listcomp_guid
    internal_iter_id = '@internal/iter_' + listcomp_guid

    generator = astc.nast.generators[0]
    iter_value = try_get_value(
        veval_ast(astc.c(generator.iter), local_field, graph), 'generator',
        lineprop)
    list_value = values.ListValue()
    list_obj = values.Object(list_value)

    node_generate_list = nodes.NodeGenerate('List', [], lineprop)
    node_generate_list.set_outputs([list_value])
    graph.add_node(node_generate_list)

    # body
    target_name = ''
    if isinstance(generator.target, gast.gast.Name):
        target_name = generator.target.id
    else:
        if config.show_warnings:
            print('This for is not supported. in L.{}'.format(astc.lineno))
        return None

    counter_value = values.NumberValue(0)
    counter_value.name = 'listcomp_counter_' + listcomp_guid

    cond_value = values.BoolValue(True)
    cond_value.name = 'listcomp_cond_' + listcomp_guid

    body_field = values.Field()
    body_field.set_module(local_field.module)
    body_field.set_parent(local_field)

    # set iter with internal name
    body_field.get_attribute(internal_iter_id).revise(list_obj)

    values.commit(listcomp_id)

    body_graph = Graph()
    body_graph.name = 'Body_' + listcomp_guid

    node_forgen = nodes.NodeForGenerator(counter_value, iter_value)
    target_value = values.Value()
    target_obj = values.Object(target_value)
    node_forgen.set_outputs([target_value])

    body_field.get_attribute(target_name).revise(target_obj)

    body_graph.add_node(node_forgen)

    elt = veval_ast(astc.c(astc.nast.elt), body_field, body_graph)
    elt_obj = try_get_obj(elt, 'listcomp', lineprop)

    farg = functions.FunctionArg()
    farg.name = ''
    farg.obj = elt_obj
    append_value = list_obj.get_field().get_attribute(
        'append').get_obj().get_value()
    append_value.func.vcall(local_field.module, body_graph, list_obj, [farg],
                            lineprop)

    values.commit(body_id)

    body_input_attributes = get_input_attritubtes(
        body_field, listcomp_id, body_id) + get_input_attritubtes(
            local_field, listcomp_id, body_id)
    body_output_attributes = get_output_attritubtes(
        body_field, listcomp_id, body_id) + get_output_attritubtes(
            local_field, listcomp_id, body_id)
    body_input_attributes = filter_attributes(body_input_attributes)
    body_output_attributes = filter_attributes(body_output_attributes)

    # get objects whose values are changed
    value_changed_objs = get_output_objs(body_field, listcomp_id,
                                         body_id) + get_output_objs(
                                             local_field, listcomp_id, body_id)

    changed_values = {}

    for obj in value_changed_objs:
        in_value = obj.get_value_log(listcomp_id)
        out_value = obj.get_value_log(body_id)
        changed_values[in_value] = (obj, out_value)

    output_attributes_2_values = {}

    for attribute in body_output_attributes:
        output_attributes_2_values[attribute] = attribute.get_obj().get_value()

    # get inputs
    values.checkout(listcomp_id)

    input_attributes_2_values = {}

    for attribute in body_input_attributes:
        input_attributes_2_values[attribute] = attribute.get_obj().get_value()

    # Exports
    values.checkout(listcomp_id)

    # generate attribute pairs
    name2attributes = {}

    for attribute in body_input_attributes:
        key = str(attribute.parent.id) + '_' + attribute.name

        if key in name2attributes.keys():
            name2attributes[key][0] = attribute
        else:
            name2attributes[key] = [attribute, None]

    for attribute in body_output_attributes:
        key = str(attribute.parent.id) + '_' + attribute.name

        if key in name2attributes.keys():
            name2attributes[key][1] = attribute
        else:
            name2attributes[key] = [None, attribute]

    # remove defaule values
    name_removing = []
    defaule_values = [counter_value, cond_value, iter_value]
    for k, v in name2attributes.items():
        if v[0] is not None and input_attributes_2_values[
                v[0]] in defaule_values:
            name_removing.append(k)

        if v[1] is not None and output_attributes_2_values[
                v[1]] in defaule_values:
            name_removing.append(k)

    for nr in name_removing:
        if nr in name2attributes.keys():
            name2attributes.pop(nr)

    #
    inputs = []
    outputs = []
    non_volatiles = []

    # default input for subgraph's input
    body_graph.add_input_value(counter_value)
    body_graph.add_input_value(cond_value)
    body_graph.add_input_value(iter_value)

    # default output for subgrap's output
    body_graph.add_output_value(cond_value)
    body_graph.add_output_value(iter_value)

    # default output
    outputs.append(functions.generate_value_with_same_type(iter_value))

    for attributes in name2attributes.values():
        name = ''
        parent = None
        input_value = None
        output_value = None

        if attributes[0] is not None:
            name = attributes[0].name
            parent = attributes[0].parent

        if attributes[1] is not None:
            name = attributes[1].name
            parent = attributes[1].parent

        if attributes[0] is not None:
            input_value = input_attributes_2_values[attributes[0]]
        else:
            # value with same type
            input_value = functions.generate_value_with_same_type(
                output_attributes_2_values[attributes[1]])

        if attributes[1] is not None:
            output_value = output_attributes_2_values[attributes[1]]
        else:
            if input_attributes_2_values[
                    attributes[0]] in changed_values.keys():
                # change only values
                output_value = changed_values[input_attributes_2_values[
                    attributes[0]]]
            else:
                # copy value
                output_value = input_attributes_2_values[attributes[0]]

        output_value_in_node = functions.generate_value_with_same_type(
            output_value)

        inputs.append(input_value)
        outputs.append(output_value_in_node)
        body_graph.add_input_value(input_value)
        body_graph.add_output_value(output_value)

        if attributes[1] is not None and attributes[1].is_non_volatile:
            non_volatiles.append(
                (attribute[1].initial_obj.get_value(), output_value_in_node))

        output_obj_in_node = values.Object(output_value_in_node)
        parent.get_attribute(name).revise(output_obj_in_node)

    for changed_value_in, changed_obj_value_out in changed_values.items():
        if changed_value_in is None:
            continue
        if changed_value_in in inputs:
            continue
        inputs.append(changed_value_in)
        body_graph.add_input_value(changed_value_in)
        body_graph.add_output_value(changed_obj_value_out[1])
        value = functions.generate_value_with_same_type(
            changed_obj_value_out[1])
        changed_obj_value_out[0].revise(value)
        outputs.append(value)

    node = nodes.NodeListcomp(iter_value, inputs, body_graph, astc.lineno)
    node.set_outputs(outputs)

    graph.add_node(node)

    # add non-volatiles
    for tv, v in non_volatiles:
        node_nv = nodes.NodeNonVolatileAssign(tv, v)
        graph.add_node(node_nv)

    if body_field.get_attribute(internal_iter_id).has_obj():
        return body_field.get_attribute(internal_iter_id).get_obj()
    else:
        return list_obj
Пример #7
0
def veval_ast_listcomp(astc: 'AstContext', local_field: 'values.Field',
                       graph: 'Graph'):
    '''
    Ex. [x for x in xx]
    [elt for target in iter]
    '''
    assert (isinstance(astc.nast, gast.gast.ListComp))
    lineprop = utils.LineProperty(astc.lineno)

    listcomp_id = 'listcomp_' + str(utils.get_guid())
    body_id = 'listcomp_body_' + str(utils.get_guid())

    values.commit(listcomp_id)

    generator = astc.nast.generators[0]
    iter_value = try_get_value(
        veval_ast(astc.c(generator.iter), local_field, graph), 'generator',
        lineprop)
    list_value = values.ListValue()

    node_generate_list = nodes.NodeGenerate('List', [], lineprop)
    graph.add_node(node_generate_list)
    node_generate_list.set_outputs([list_value])

    # body
    target_name = ''
    if isinstance(generator.target, gast.gast.Name):
        target_name = generator.target.id
    else:
        if config.show_warnings:
            print('This for is not supported. in L.{}'.format(astc.lineno))
        return None

    counter_value = values.NumberValue(0)
    counter_value.name = 'for_counter'

    node_forgen = nodes.NodeForGenerator(counter_value, iter_value)
    target_value = values.Value()
    node_forgen.set_outputs([target_value])

    body_field = values.Field()
    body_field.set_module(local_field.module)
    body_field.set_parent(local_field)
    body_field.get_attribute(target_name).revise(target_value)
    body_graph = Graph()
    body_graph.name = 'Body'

    body_graph.add_node(node_forgen)

    elt = veval_ast(astc.c(astc.nast.elt), body_field, body_graph)
    farg = functions.FunctionArg()
    farg.name = ''
    farg.value = elt
    list_value.append_func.func.vcall(local_field.module, body_graph,
                                      list_value, [farg], lineprop)

    values.commit(body_id)

    body_output_attributes = get_input_attritubtes(body_field, listcomp_id,
                                                   body_id)
    body_intput_attributes = get_output_attritubtes(body_field, listcomp_id,
                                                    body_id)

    # Exports
    values.checkout(listcomp_id)

    input_attributes = set(body_intput_attributes)
    inputs = [i.get_value() for i in input_attributes]

    output_attributes = set(body_output_attributes)
    outputs = []

    for attribute in output_attributes:
        value = values.Value()
        outputs.append(value)
        attribute.revise(value)

    node = nodes.NodeListcomp(iter_value, inputs, body_graph, astc.lineno)
    node.set_outputs(outputs)

    graph.add_node(node)

    # compare

    return list_value