コード例 #1
0
def veval_ast_subscript(astc : 'AstContext', local_field : 'values.Field', graph : 'Graph'):
    '''
    Ex. x[1], x[y,z]
    '''
    assert(isinstance(astc.nast, gast.gast.Subscript))

    value = veval_ast(astc.c(astc.nast.value), local_field, graph)

    if isinstance(astc.nast.slice, gast.gast.Index):
        slice_value = veval_ast(astc.c(astc.nast.slice.value), local_field, graph)
        node = nodes.NodeGetItem(value.get_value(), slice_value.get_value())
        ret_value = values.Value()
        node.set_outputs([ret_value])
        graph.add_node(node)
        return ret_value

    elif isinstance(astc.nast.slice, gast.gast.Slice):
        lower = veval_ast(astc.c(astc.nast.slice.lower), local_field, graph)
        upper = veval_ast(astc.c(astc.nast.slice.upper), local_field, graph)
        node = nodes.NodeSlice(value.get_value(), lower.get_value(), upper.get_value())
        ret_value = values.Value()
        node.set_outputs([ret_value])
        graph.add_node(node)
        return ret_value

    return None
コード例 #2
0
def veval_ast_subscript(astc: 'AstContext', local_field: 'values.Field',
                        graph: 'Graph'):
    '''
    Ex. x[1], x[y,z]
    '''
    assert (isinstance(astc.nast, gast.gast.Subscript))
    lineprop = utils.LineProperty(astc.lineno)

    def veval_with_default(nast, default_value):
        if nast is None:
            ret = values.NumberValue(default_value)
            ret.name = '@SliceDefault'
            return ret
        obj = veval_ast(astc.c(nast), local_field, graph)
        return try_get_value(obj, 'subscript', lineprop)

    def get_slice_indices(slice):
        if slice.lower is None and slice.upper is None and slice.step is None:
            return []
        indices = [
            veval_with_default(slice.lower, 0),
            veval_with_default(slice.upper, utils.slice_int_max)
        ]
        if slice.step is not None:
            indices.append(veval_with_default(slice.step, 1))
        return indices

    value = veval_ast(astc.c(astc.nast.value), local_field, graph)
    value_value = try_get_value(value, 'subscript', lineprop)

    if isinstance(astc.nast.slice, gast.gast.Index):
        slice_ = veval_ast(astc.c(astc.nast.slice.value), local_field, graph)
        slice_value = try_get_value(slice_, 'subscript', lineprop)

        if isinstance(slice_value, values.TupleValue):
            # ex. x[1,2]
            if slice_value.has_constant_value():
                values_ = [
                    try_get_value(x, 'subscript', lineprop)
                    for x in slice_value.get_constant_value()
                ]
                node = nodes.NodeGetItem(value_value, values_, line=lineprop)
            else:
                if config.show_warnings:
                    print('This subscript is not supported. in L.{}'.format(
                        astc.lineno))
                node = nodes.NodeInvalid(line=lineprop)
        else:
            # ex. x[1]
            node = nodes.NodeGetItem(value_value, [slice_value])
        ret_value = values.Value()
        node.set_outputs([ret_value])
        graph.add_node(node)
        return values.ValueRef(ret_value)

    elif isinstance(astc.nast.slice, gast.gast.Slice):

        indices = get_slice_indices(astc.nast.slice)

        node = nodes.NodeSlice(value_value, indices, [len(indices)])
        ret_value = functions.generate_value_with_same_type(value_value)
        node.set_outputs([ret_value])
        graph.add_node(node)
        return values.ValueRef(ret_value)

    elif isinstance(astc.nast.slice, gast.gast.ExtSlice):
        indices = []
        slice_specs = []
        for dim in astc.nast.slice.dims:
            if isinstance(dim, gast.gast.Index):
                indices.append(
                    try_get_value(
                        veval_ast(astc.c(dim.value), local_field, graph),
                        'subscript', lineprop))
                slice_specs.append(1)
            elif isinstance(dim, gast.gast.Slice):
                ni = get_slice_indices(dim)
                indices.extend(ni)
                slice_specs.append(len(ni))
            else:
                assert False, 'Unknown slice: %s in %s' % (dim, nast.slice)

        node = nodes.NodeSlice(value_value, indices, slice_specs)
        ret_value = functions.generate_value_with_same_type(value_value)
        node.set_outputs([ret_value])
        graph.add_node(node)
        return values.ValueRef(ret_value)

    return None
コード例 #3
0
ファイル: vevaluator.py プロジェクト: gwtnb/chainer-compiler
def veval_ast_subscript(astc: 'AstContext', local_field: 'values.Field',
                        graph: 'Graph'):
    '''
    Ex. x[1], x[y,z]
    '''
    assert (isinstance(astc.nast, gast.gast.Subscript))
    lineprop = utils.LineProperty(astc.lineno)

    def veval_with_default(nast, default_value):
        if nast is None:
            return values.NumberValue(default_value)
        obj = veval_ast(astc.c(nast), local_field, graph)
        return try_get_value(obj, 'subscript', lineprop)

    def get_slice_indices(slice):
        if slice.lower is None and slice.upper is None and slice.step is None:
            return []
        indices = [
            veval_with_default(slice.lower, 0),
            veval_with_default(slice.upper, utils.slice_int_max)
        ]
        if slice.step is not None:
            indices.append(veval_with_default(slice.step, 1))
        return indices

    value = veval_ast(astc.c(astc.nast.value), local_field, graph)
    value_value = try_get_value(value, 'subscript', lineprop)

    if isinstance(astc.nast.slice, gast.gast.Index):
        slice_ = veval_ast(astc.c(astc.nast.slice.value), local_field, graph)
        slice_value = try_get_value(slice_, 'subscript', lineprop)

        if isinstance(slice_value, values.TupleValue):
            # ex. x[1,2]
            values_ = [
                try_get_value(x, 'subscript', lineprop)
                for x in slice_value.values
            ]
            node = nodes.NodeGetItem(value_value, values_)
        else:
            # ex. x[1]
            node = nodes.NodeGetItem(value_value, [slice_value])
        ret_value = values.Value()
        node.set_outputs([ret_value])
        graph.add_node(node)
        return values.Object(ret_value)

    elif isinstance(astc.nast.slice, gast.gast.Slice):

        indices = get_slice_indices(astc.nast.slice)

        node = nodes.NodeSlice(value_value, indices, [len(indices)])
        ret_value = values.Value()
        node.set_outputs([ret_value])
        graph.add_node(node)
        return values.Object(ret_value)

    elif isinstance(astc.nast.slice, gast.gast.ExtSlice):
        indices = []
        slice_specs = []
        for dim in astc.nast.slice.dims:
            if isinstance(dim, gast.gast.Index):
                indices.append(
                    try_get_value(
                        veval_ast(astc.c(dim.value), local_field, graph),
                        'subscript', lineprop))
                slice_specs.append(1)
            elif isinstance(dim, gast.gast.Slice):
                ni = get_slice_indices(dim)
                indices.extend(ni)
                slice_specs.append(len(ni))
            else:
                assert False, 'Unknown slice: %s in %s' % (dim, nast.slice)

        node = nodes.NodeSlice(value_value, indices, slice_specs)
        ret_value = values.Value()
        node.set_outputs([ret_value])
        graph.add_node(node)
        return values.Object(ret_value)

    return None