def processIdenticalStmt(src_ast_list, cluster, id): caller = {} merged_list = [] merged_code = [] for i in cluster: filename = i.getSourceFile().getFileName() # src_ast_list[str(filename)].output("./sandbox/test.out") lines = tagging(i)[1:] code_snippet = generateCodeSnippet(i) merged = type1_dealer.generateNewCode(id, code_snippet, lines, src_ast_list[str(filename)], tagging(i)) merged_list.append(merged) merged_code.append(merged.get_code()) caller[tagging(i)] = merged.caller merged.tag = tagging(i) for i in range(1, len(merged_list)): cur_merge = merged_list[i] cur_code = merged_code[i] if cur_code != merged_code[0]: print "DIFFERENT!" if cur_merge.code_lines[1:-1] != merged_list[0].code_lines[1:-1]: print "STILL_DIFF" stat["ErrorStmt"] += 1 return False else: merged_list = type1_dealer.mergeDiffResults(merged_list) merged_code = [] for i in merged_list: merged_code.append(i.get_code()) line_len = len(i.code_lines) caller[i.tag] = i.caller for i in range(1, len(merged_list)): cur_merge = merged_list[i] cur_code = merged_code[i] if cur_code != merged_code[0]: print "DIFFERENT AGAIN!" stat["ErrorStmt"] += 1 return False code = merged_code[0] m = Result() m.add_code(code) m.lines = line_len for s in cluster: tag = tagging(s) m.add_tag(tag) m.add_caller(tag, caller[tag]) m.check_diff_pak() m.external = (len(merged_list[0].param), len(merged_list[0].return_vars)) mergeResults.append(m) return True
def processNonIdenticalStmt(src_ast_list, cluster, id): # raw_input() caller = {} merged_list = [] merged_code = [] for i in cluster: filename = i.getSourceFile().getFileName() # src_ast_list[str(filename)].output("./sandbox/test.out") lines = tagging(i)[1:] code_snippet = generateCodeSnippet(i) merged = type3_dealer.generateNewCode(id, code_snippet, lines, src_ast_list[str(filename)], tagging(i)) merged_list.append(merged) if type3_dealer.checkMergable(merged_list): type3_dealer.generateCommonCode(merged_list) for i in range(len(merged_list)): line_len = len(merged_list[i].code_lines) merged_code.append(merged_list[i].get_code()) caller[tagging(cluster[i])] = merged_list[i].caller merged_list[i].tag = tagging(cluster[i]) else: print "NOT MERGABLE" stat["DiffStmt"] += 1 return False for i in range(1, len(merged_list)): cur_code = merged_code[i] if cur_code != merged_code[0]: print "UNMERGABLELY DIFFERENT!" stat["DiffStmt"] += 1 # for m in merged_list: # m.output() return False code = merged_code[0] m = Result() m.lines = line_len m.add_code(code) for s in cluster: tag = tagging(s) m.add_tag(tag) m.add_caller(tag, caller[tag]) m.check_diff_pak() m.external = (len(merged_list[0].param), len(merged_list[0].return_vars)) mergeResults.append(m) return True
def processIdenticalDef(src_ast_list, cluster): caller = {} merged_code = [] unreach_num = [] for i in cluster: filename = i.getSourceFile().getFileName() # src_ast_list[str(filename)].output("./sandbox/test.out") lines = tagging(i)[1:] code_snippet = generateCodeSnippet(i) merged = type0_dealer.generateNewCode(code_snippet, lines, src_ast_list[str(filename)], tagging(i)) line_len = len(merged.code_lines) if merged.unreachable: unreach_num.append(len(merged.unreachable)) else: unreach_num.append(0) merged_code.append(merged.get_code()) caller[tagging(i)] = merged.caller for i in merged_code[1:]: if i != merged_code[0]: stat["ErrorDef"] += 1 return False code = merged_code[0] # print code m = Result() m.lines = line_len + len(caller) m.add_code(code) for s in cluster: tag = tagging(s) m.add_tag(tag) m.add_caller(tag, caller[tag]) m.check_diff_pak() m.external = (max(unreach_num), 0) mergeResults.append(m) return True