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
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
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