示例#1
0
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
示例#2
0
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
示例#3
0
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