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