123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179 |
- # Copyright (c) Microsoft Corporation.
- # Licensed under the MIT license.
- from tree_sitter import Language, Parser
- from .utils import (remove_comments_and_docstrings,
- tree_to_token_index,
- index_to_code_token,
- tree_to_variable_index)
- def DFG_python(root_node, index_to_code, states):
- assignment = ['assignment', 'augmented_assignment', 'for_in_clause']
- if_statement = ['if_statement']
- for_statement = ['for_statement']
- while_statement = ['while_statement']
- do_first_statement = ['for_in_clause']
- def_statement = ['default_parameter']
- states = states.copy()
- if (len(root_node.children) == 0 or root_node.type == 'string') and root_node.type != 'comment':
- idx, code = index_to_code[(root_node.start_point, root_node.end_point)]
- if root_node.type == code:
- return [], states
- elif code in states:
- return [(code, idx, 'comesFrom', [code], states[code].copy())], states
- else:
- if root_node.type == 'identifier':
- states[code] = [idx]
- return [(code, idx, 'comesFrom', [], [])], states
- elif root_node.type in def_statement:
- name = root_node.child_by_field_name('name')
- value = root_node.child_by_field_name('value')
- DFG = []
- if value is None:
- indexs = tree_to_variable_index(name, index_to_code)
- for index in indexs:
- idx, code = index_to_code[index]
- DFG.append((code, idx, 'comesFrom', [], []))
- states[code] = [idx]
- return sorted(DFG, key=lambda x: x[1]), states
- else:
- name_indexs = tree_to_variable_index(name, index_to_code)
- value_indexs = tree_to_variable_index(value, index_to_code)
- temp, states = DFG_python(value, index_to_code, states)
- DFG += temp
- for index1 in name_indexs:
- idx1, code1 = index_to_code[index1]
- for index2 in value_indexs:
- idx2, code2 = index_to_code[index2]
- DFG.append((code1, idx1, 'comesFrom', [code2], [idx2]))
- states[code1] = [idx1]
- return sorted(DFG, key=lambda x: x[1]), states
- elif root_node.type in assignment:
- if root_node.type == 'for_in_clause':
- right_nodes = [root_node.children[-1]]
- left_nodes = [root_node.child_by_field_name('left')]
- else:
- if root_node.child_by_field_name('right') is None:
- return [], states
- left_nodes = [x for x in root_node.child_by_field_name('left').children if x.type != ',']
- right_nodes = [x for x in root_node.child_by_field_name('right').children if x.type != ',']
- if len(right_nodes) != len(left_nodes):
- left_nodes = [root_node.child_by_field_name('left')]
- right_nodes = [root_node.child_by_field_name('right')]
- if len(left_nodes) == 0:
- left_nodes = [root_node.child_by_field_name('left')]
- if len(right_nodes) == 0:
- right_nodes = [root_node.child_by_field_name('right')]
- DFG = []
- for node in right_nodes:
- temp, states = DFG_python(node, index_to_code, states)
- DFG += temp
- for left_node, right_node in zip(left_nodes, right_nodes):
- left_tokens_index = tree_to_variable_index(left_node, index_to_code)
- right_tokens_index = tree_to_variable_index(right_node, index_to_code)
- temp = []
- for token1_index in left_tokens_index:
- idx1, code1 = index_to_code[token1_index]
- temp.append((code1, idx1, 'computedFrom', [index_to_code[x][1] for x in right_tokens_index],
- [index_to_code[x][0] for x in right_tokens_index]))
- states[code1] = [idx1]
- DFG += temp
- return sorted(DFG, key=lambda x: x[1]), states
- elif root_node.type in if_statement:
- DFG = []
- current_states = states.copy()
- others_states = []
- tag = False
- if 'else' in root_node.type:
- tag = True
- for child in root_node.children:
- if 'else' in child.type:
- tag = True
- if child.type not in ['elif_clause', 'else_clause']:
- temp, current_states = DFG_python(child, index_to_code, current_states)
- DFG += temp
- else:
- temp, new_states = DFG_python(child, index_to_code, states)
- DFG += temp
- others_states.append(new_states)
- others_states.append(current_states)
- if tag is False:
- others_states.append(states)
- new_states = {}
- for dic in others_states:
- for key in dic:
- if key not in new_states:
- new_states[key] = dic[key].copy()
- else:
- new_states[key] += dic[key]
- for key in new_states:
- new_states[key] = sorted(list(set(new_states[key])))
- return sorted(DFG, key=lambda x: x[1]), new_states
- elif root_node.type in for_statement:
- DFG = []
- for i in range(2):
- right_nodes = [x for x in root_node.child_by_field_name('right').children if x.type != ',']
- left_nodes = [x for x in root_node.child_by_field_name('left').children if x.type != ',']
- if len(right_nodes) != len(left_nodes):
- left_nodes = [root_node.child_by_field_name('left')]
- right_nodes = [root_node.child_by_field_name('right')]
- if len(left_nodes) == 0:
- left_nodes = [root_node.child_by_field_name('left')]
- if len(right_nodes) == 0:
- right_nodes = [root_node.child_by_field_name('right')]
- for node in right_nodes:
- temp, states = DFG_python(node, index_to_code, states)
- DFG += temp
- for left_node, right_node in zip(left_nodes, right_nodes):
- left_tokens_index = tree_to_variable_index(left_node, index_to_code)
- right_tokens_index = tree_to_variable_index(right_node, index_to_code)
- temp = []
- for token1_index in left_tokens_index:
- idx1, code1 = index_to_code[token1_index]
- temp.append((code1, idx1, 'computedFrom', [index_to_code[x][1] for x in right_tokens_index],
- [index_to_code[x][0] for x in right_tokens_index]))
- states[code1] = [idx1]
- DFG += temp
- if root_node.children[-1].type == "block":
- temp, states = DFG_python(root_node.children[-1], index_to_code, states)
- DFG += temp
- dic = {}
- for x in DFG:
- if (x[0], x[1], x[2]) not in dic:
- dic[(x[0], x[1], x[2])] = [x[3], x[4]]
- else:
- dic[(x[0], x[1], x[2])][0] = list(set(dic[(x[0], x[1], x[2])][0] + x[3]))
- dic[(x[0], x[1], x[2])][1] = sorted(list(set(dic[(x[0], x[1], x[2])][1] + x[4])))
- DFG = [(x[0], x[1], x[2], y[0], y[1]) for x, y in sorted(dic.items(), key=lambda t: t[0][1])]
- return sorted(DFG, key=lambda x: x[1]), states
- elif root_node.type in while_statement:
- DFG = []
- for i in range(2):
- for child in root_node.children:
- temp, states = DFG_python(child, index_to_code, states)
- DFG += temp
- dic = {}
- for x in DFG:
- if (x[0], x[1], x[2]) not in dic:
- dic[(x[0], x[1], x[2])] = [x[3], x[4]]
- else:
- dic[(x[0], x[1], x[2])][0] = list(set(dic[(x[0], x[1], x[2])][0] + x[3]))
- dic[(x[0], x[1], x[2])][1] = sorted(list(set(dic[(x[0], x[1], x[2])][1] + x[4])))
- DFG = [(x[0], x[1], x[2], y[0], y[1]) for x, y in sorted(dic.items(), key=lambda t: t[0][1])]
- return sorted(DFG, key=lambda x: x[1]), states
- else:
- DFG = []
- for child in root_node.children:
- if child.type in do_first_statement:
- temp, states = DFG_python(child, index_to_code, states)
- DFG += temp
- for child in root_node.children:
- if child.type not in do_first_statement:
- temp, states = DFG_python(child, index_to_code, states)
- DFG += temp
- return sorted(DFG, key=lambda x: x[1]), states
- def DFG_java(root_node, index_to_code, states):
- assignment = ['assignment_expression']
- def_statement = ['variable_declarator']
- increment_statement = ['update_expression']
- if_statement = ['if_statement', 'else']
- for_statement = ['for_statement']
- enhanced_for_statement = ['enhanced_for_statement']
- while_statement = ['while_statement']
- do_first_statement = []
- states = states.copy()
- if (len(root_node.children) == 0 or root_node.type == 'string') and root_node.type != 'comment':
- idx, code = index_to_code[(root_node.start_point, root_node.end_point)]
- if root_node.type == code:
- return [], states
- elif code in states:
- return [(code, idx, 'comesFrom', [code], states[code].copy())], states
- else:
- if root_node.type == 'identifier':
- states[code] = [idx]
- return [(code, idx, 'comesFrom', [], [])], states
- elif root_node.type in def_statement:
- name = root_node.child_by_field_name('name')
- value = root_node.child_by_field_name('value')
- DFG = []
- if value is None:
- indexs = tree_to_variable_index(name, index_to_code)
- for index in indexs:
- idx, code = index_to_code[index]
- DFG.append((code, idx, 'comesFrom', [], []))
- states[code] = [idx]
- return sorted(DFG, key=lambda x: x[1]), states
- else:
- name_indexs = tree_to_variable_index(name, index_to_code)
- value_indexs = tree_to_variable_index(value, index_to_code)
- temp, states = DFG_java(value, index_to_code, states)
- DFG += temp
- for index1 in name_indexs:
- idx1, code1 = index_to_code[index1]
- for index2 in value_indexs:
- idx2, code2 = index_to_code[index2]
- DFG.append((code1, idx1, 'comesFrom', [code2], [idx2]))
- states[code1] = [idx1]
- return sorted(DFG, key=lambda x: x[1]), states
- elif root_node.type in assignment:
- left_nodes = root_node.child_by_field_name('left')
- right_nodes = root_node.child_by_field_name('right')
- DFG = []
- temp, states = DFG_java(right_nodes, index_to_code, states)
- DFG += temp
- name_indexs = tree_to_variable_index(left_nodes, index_to_code)
- value_indexs = tree_to_variable_index(right_nodes, index_to_code)
- for index1 in name_indexs:
- idx1, code1 = index_to_code[index1]
- for index2 in value_indexs:
- idx2, code2 = index_to_code[index2]
- DFG.append((code1, idx1, 'computedFrom', [code2], [idx2]))
- states[code1] = [idx1]
- return sorted(DFG, key=lambda x: x[1]), states
- elif root_node.type in increment_statement:
- DFG = []
- indexs = tree_to_variable_index(root_node, index_to_code)
- for index1 in indexs:
- idx1, code1 = index_to_code[index1]
- for index2 in indexs:
- idx2, code2 = index_to_code[index2]
- DFG.append((code1, idx1, 'computedFrom', [code2], [idx2]))
- states[code1] = [idx1]
- return sorted(DFG, key=lambda x: x[1]), states
- elif root_node.type in if_statement:
- DFG = []
- current_states = states.copy()
- others_states = []
- flag = False
- tag = False
- if 'else' in root_node.type:
- tag = True
- for child in root_node.children:
- if 'else' in child.type:
- tag = True
- if child.type not in if_statement and flag is False:
- temp, current_states = DFG_java(child, index_to_code, current_states)
- DFG += temp
- else:
- flag = True
- temp, new_states = DFG_java(child, index_to_code, states)
- DFG += temp
- others_states.append(new_states)
- others_states.append(current_states)
- if tag is False:
- others_states.append(states)
- new_states = {}
- for dic in others_states:
- for key in dic:
- if key not in new_states:
- new_states[key] = dic[key].copy()
- else:
- new_states[key] += dic[key]
- for key in new_states:
- new_states[key] = sorted(list(set(new_states[key])))
- return sorted(DFG, key=lambda x: x[1]), new_states
- elif root_node.type in for_statement:
- DFG = []
- for child in root_node.children:
- temp, states = DFG_java(child, index_to_code, states)
- DFG += temp
- flag = False
- for child in root_node.children:
- if flag:
- temp, states = DFG_java(child, index_to_code, states)
- DFG += temp
- elif child.type == "local_variable_declaration":
- flag = True
- dic = {}
- for x in DFG:
- if (x[0], x[1], x[2]) not in dic:
- dic[(x[0], x[1], x[2])] = [x[3], x[4]]
- else:
- dic[(x[0], x[1], x[2])][0] = list(set(dic[(x[0], x[1], x[2])][0] + x[3]))
- dic[(x[0], x[1], x[2])][1] = sorted(list(set(dic[(x[0], x[1], x[2])][1] + x[4])))
- DFG = [(x[0], x[1], x[2], y[0], y[1]) for x, y in sorted(dic.items(), key=lambda t: t[0][1])]
- return sorted(DFG, key=lambda x: x[1]), states
- elif root_node.type in enhanced_for_statement:
- name = root_node.child_by_field_name('name')
- value = root_node.child_by_field_name('value')
- body = root_node.child_by_field_name('body')
- DFG = []
- for i in range(2):
- temp, states = DFG_java(value, index_to_code, states)
- DFG += temp
- name_indexs = tree_to_variable_index(name, index_to_code)
- value_indexs = tree_to_variable_index(value, index_to_code)
- for index1 in name_indexs:
- idx1, code1 = index_to_code[index1]
- for index2 in value_indexs:
- idx2, code2 = index_to_code[index2]
- DFG.append((code1, idx1, 'computedFrom', [code2], [idx2]))
- states[code1] = [idx1]
- temp, states = DFG_java(body, index_to_code, states)
- DFG += temp
- dic = {}
- for x in DFG:
- if (x[0], x[1], x[2]) not in dic:
- dic[(x[0], x[1], x[2])] = [x[3], x[4]]
- else:
- dic[(x[0], x[1], x[2])][0] = list(set(dic[(x[0], x[1], x[2])][0] + x[3]))
- dic[(x[0], x[1], x[2])][1] = sorted(list(set(dic[(x[0], x[1], x[2])][1] + x[4])))
- DFG = [(x[0], x[1], x[2], y[0], y[1]) for x, y in sorted(dic.items(), key=lambda t: t[0][1])]
- return sorted(DFG, key=lambda x: x[1]), states
- elif root_node.type in while_statement:
- DFG = []
- for i in range(2):
- for child in root_node.children:
- temp, states = DFG_java(child, index_to_code, states)
- DFG += temp
- dic = {}
- for x in DFG:
- if (x[0], x[1], x[2]) not in dic:
- dic[(x[0], x[1], x[2])] = [x[3], x[4]]
- else:
- dic[(x[0], x[1], x[2])][0] = list(set(dic[(x[0], x[1], x[2])][0] + x[3]))
- dic[(x[0], x[1], x[2])][1] = sorted(list(set(dic[(x[0], x[1], x[2])][1] + x[4])))
- DFG = [(x[0], x[1], x[2], y[0], y[1]) for x, y in sorted(dic.items(), key=lambda t: t[0][1])]
- return sorted(DFG, key=lambda x: x[1]), states
- else:
- DFG = []
- for child in root_node.children:
- if child.type in do_first_statement:
- temp, states = DFG_java(child, index_to_code, states)
- DFG += temp
- for child in root_node.children:
- if child.type not in do_first_statement:
- temp, states = DFG_java(child, index_to_code, states)
- DFG += temp
- return sorted(DFG, key=lambda x: x[1]), states
- def DFG_csharp(root_node, index_to_code, states):
- assignment = ['assignment_expression']
- def_statement = ['variable_declarator']
- increment_statement = ['postfix_unary_expression']
- if_statement = ['if_statement', 'else']
- for_statement = ['for_statement']
- enhanced_for_statement = ['for_each_statement']
- while_statement = ['while_statement']
- do_first_statement = []
- states = states.copy()
- if (len(root_node.children) == 0 or root_node.type == 'string') and root_node.type != 'comment':
- idx, code = index_to_code[(root_node.start_point, root_node.end_point)]
- if root_node.type == code:
- return [], states
- elif code in states:
- return [(code, idx, 'comesFrom', [code], states[code].copy())], states
- else:
- if root_node.type == 'identifier':
- states[code] = [idx]
- return [(code, idx, 'comesFrom', [], [])], states
- elif root_node.type in def_statement:
- if len(root_node.children) == 2:
- name = root_node.children[0]
- value = root_node.children[1]
- else:
- name = root_node.children[0]
- value = None
- DFG = []
- if value is None:
- indexs = tree_to_variable_index(name, index_to_code)
- for index in indexs:
- idx, code = index_to_code[index]
- DFG.append((code, idx, 'comesFrom', [], []))
- states[code] = [idx]
- return sorted(DFG, key=lambda x: x[1]), states
- else:
- name_indexs = tree_to_variable_index(name, index_to_code)
- value_indexs = tree_to_variable_index(value, index_to_code)
- temp, states = DFG_csharp(value, index_to_code, states)
- DFG += temp
- for index1 in name_indexs:
- idx1, code1 = index_to_code[index1]
- for index2 in value_indexs:
- idx2, code2 = index_to_code[index2]
- DFG.append((code1, idx1, 'comesFrom', [code2], [idx2]))
- states[code1] = [idx1]
- return sorted(DFG, key=lambda x: x[1]), states
- elif root_node.type in assignment:
- left_nodes = root_node.child_by_field_name('left')
- right_nodes = root_node.child_by_field_name('right')
- DFG = []
- temp, states = DFG_csharp(right_nodes, index_to_code, states)
- DFG += temp
- name_indexs = tree_to_variable_index(left_nodes, index_to_code)
- value_indexs = tree_to_variable_index(right_nodes, index_to_code)
- for index1 in name_indexs:
- idx1, code1 = index_to_code[index1]
- for index2 in value_indexs:
- idx2, code2 = index_to_code[index2]
- DFG.append((code1, idx1, 'computedFrom', [code2], [idx2]))
- states[code1] = [idx1]
- return sorted(DFG, key=lambda x: x[1]), states
- elif root_node.type in increment_statement:
- DFG = []
- indexs = tree_to_variable_index(root_node, index_to_code)
- for index1 in indexs:
- idx1, code1 = index_to_code[index1]
- for index2 in indexs:
- idx2, code2 = index_to_code[index2]
- DFG.append((code1, idx1, 'computedFrom', [code2], [idx2]))
- states[code1] = [idx1]
- return sorted(DFG, key=lambda x: x[1]), states
- elif root_node.type in if_statement:
- DFG = []
- current_states = states.copy()
- others_states = []
- flag = False
- tag = False
- if 'else' in root_node.type:
- tag = True
- for child in root_node.children:
- if 'else' in child.type:
- tag = True
- if child.type not in if_statement and flag is False:
- temp, current_states = DFG_csharp(child, index_to_code, current_states)
- DFG += temp
- else:
- flag = True
- temp, new_states = DFG_csharp(child, index_to_code, states)
- DFG += temp
- others_states.append(new_states)
- others_states.append(current_states)
- if tag is False:
- others_states.append(states)
- new_states = {}
- for dic in others_states:
- for key in dic:
- if key not in new_states:
- new_states[key] = dic[key].copy()
- else:
- new_states[key] += dic[key]
- for key in new_states:
- new_states[key] = sorted(list(set(new_states[key])))
- return sorted(DFG, key=lambda x: x[1]), new_states
- elif root_node.type in for_statement:
- DFG = []
- for child in root_node.children:
- temp, states = DFG_csharp(child, index_to_code, states)
- DFG += temp
- flag = False
- for child in root_node.children:
- if flag:
- temp, states = DFG_csharp(child, index_to_code, states)
- DFG += temp
- elif child.type == "local_variable_declaration":
- flag = True
- dic = {}
- for x in DFG:
- if (x[0], x[1], x[2]) not in dic:
- dic[(x[0], x[1], x[2])] = [x[3], x[4]]
- else:
- dic[(x[0], x[1], x[2])][0] = list(set(dic[(x[0], x[1], x[2])][0] + x[3]))
- dic[(x[0], x[1], x[2])][1] = sorted(list(set(dic[(x[0], x[1], x[2])][1] + x[4])))
- DFG = [(x[0], x[1], x[2], y[0], y[1]) for x, y in sorted(dic.items(), key=lambda t: t[0][1])]
- return sorted(DFG, key=lambda x: x[1]), states
- elif root_node.type in enhanced_for_statement:
- name = root_node.child_by_field_name('left')
- value = root_node.child_by_field_name('right')
- body = root_node.child_by_field_name('body')
- DFG = []
- for i in range(2):
- temp, states = DFG_csharp(value, index_to_code, states)
- DFG += temp
- name_indexs = tree_to_variable_index(name, index_to_code)
- value_indexs = tree_to_variable_index(value, index_to_code)
- for index1 in name_indexs:
- idx1, code1 = index_to_code[index1]
- for index2 in value_indexs:
- idx2, code2 = index_to_code[index2]
- DFG.append((code1, idx1, 'computedFrom', [code2], [idx2]))
- states[code1] = [idx1]
- temp, states = DFG_csharp(body, index_to_code, states)
- DFG += temp
- dic = {}
- for x in DFG:
- if (x[0], x[1], x[2]) not in dic:
- dic[(x[0], x[1], x[2])] = [x[3], x[4]]
- else:
- dic[(x[0], x[1], x[2])][0] = list(set(dic[(x[0], x[1], x[2])][0] + x[3]))
- dic[(x[0], x[1], x[2])][1] = sorted(list(set(dic[(x[0], x[1], x[2])][1] + x[4])))
- DFG = [(x[0], x[1], x[2], y[0], y[1]) for x, y in sorted(dic.items(), key=lambda t: t[0][1])]
- return sorted(DFG, key=lambda x: x[1]), states
- elif root_node.type in while_statement:
- DFG = []
- for i in range(2):
- for child in root_node.children:
- temp, states = DFG_csharp(child, index_to_code, states)
- DFG += temp
- dic = {}
- for x in DFG:
- if (x[0], x[1], x[2]) not in dic:
- dic[(x[0], x[1], x[2])] = [x[3], x[4]]
- else:
- dic[(x[0], x[1], x[2])][0] = list(set(dic[(x[0], x[1], x[2])][0] + x[3]))
- dic[(x[0], x[1], x[2])][1] = sorted(list(set(dic[(x[0], x[1], x[2])][1] + x[4])))
- DFG = [(x[0], x[1], x[2], y[0], y[1]) for x, y in sorted(dic.items(), key=lambda t: t[0][1])]
- return sorted(DFG, key=lambda x: x[1]), states
- else:
- DFG = []
- for child in root_node.children:
- if child.type in do_first_statement:
- temp, states = DFG_csharp(child, index_to_code, states)
- DFG += temp
- for child in root_node.children:
- if child.type not in do_first_statement:
- temp, states = DFG_csharp(child, index_to_code, states)
- DFG += temp
- return sorted(DFG, key=lambda x: x[1]), states
- def DFG_ruby(root_node, index_to_code, states):
- assignment = ['assignment', 'operator_assignment']
- if_statement = ['if', 'elsif', 'else', 'unless', 'when']
- for_statement = ['for']
- while_statement = ['while_modifier', 'until']
- do_first_statement = []
- def_statement = ['keyword_parameter']
- if (len(root_node.children) == 0 or root_node.type == 'string') and root_node.type != 'comment':
- states = states.copy()
- idx, code = index_to_code[(root_node.start_point, root_node.end_point)]
- if root_node.type == code:
- return [], states
- elif code in states:
- return [(code, idx, 'comesFrom', [code], states[code].copy())], states
- else:
- if root_node.type == 'identifier':
- states[code] = [idx]
- return [(code, idx, 'comesFrom', [], [])], states
- elif root_node.type in def_statement:
- name = root_node.child_by_field_name('name')
- value = root_node.child_by_field_name('value')
- DFG = []
- if value is None:
- indexs = tree_to_variable_index(name, index_to_code)
- for index in indexs:
- idx, code = index_to_code[index]
- DFG.append((code, idx, 'comesFrom', [], []))
- states[code] = [idx]
- return sorted(DFG, key=lambda x: x[1]), states
- else:
- name_indexs = tree_to_variable_index(name, index_to_code)
- value_indexs = tree_to_variable_index(value, index_to_code)
- temp, states = DFG_ruby(value, index_to_code, states)
- DFG += temp
- for index1 in name_indexs:
- idx1, code1 = index_to_code[index1]
- for index2 in value_indexs:
- idx2, code2 = index_to_code[index2]
- DFG.append((code1, idx1, 'comesFrom', [code2], [idx2]))
- states[code1] = [idx1]
- return sorted(DFG, key=lambda x: x[1]), states
- elif root_node.type in assignment:
- left_nodes = [x for x in root_node.child_by_field_name('left').children if x.type != ',']
- right_nodes = [x for x in root_node.child_by_field_name('right').children if x.type != ',']
- if len(right_nodes) != len(left_nodes):
- left_nodes = [root_node.child_by_field_name('left')]
- right_nodes = [root_node.child_by_field_name('right')]
- if len(left_nodes) == 0:
- left_nodes = [root_node.child_by_field_name('left')]
- if len(right_nodes) == 0:
- right_nodes = [root_node.child_by_field_name('right')]
- if root_node.type == "operator_assignment":
- left_nodes = [root_node.children[0]]
- right_nodes = [root_node.children[-1]]
- DFG = []
- for node in right_nodes:
- temp, states = DFG_ruby(node, index_to_code, states)
- DFG += temp
- for left_node, right_node in zip(left_nodes, right_nodes):
- left_tokens_index = tree_to_variable_index(left_node, index_to_code)
- right_tokens_index = tree_to_variable_index(right_node, index_to_code)
- temp = []
- for token1_index in left_tokens_index:
- idx1, code1 = index_to_code[token1_index]
- temp.append((code1, idx1, 'computedFrom', [index_to_code[x][1] for x in right_tokens_index],
- [index_to_code[x][0] for x in right_tokens_index]))
- states[code1] = [idx1]
- DFG += temp
- return sorted(DFG, key=lambda x: x[1]), states
- elif root_node.type in if_statement:
- DFG = []
- current_states = states.copy()
- others_states = []
- tag = False
- if 'else' in root_node.type:
- tag = True
- for child in root_node.children:
- if 'else' in child.type:
- tag = True
- if child.type not in if_statement:
- temp, current_states = DFG_ruby(child, index_to_code, current_states)
- DFG += temp
- else:
- temp, new_states = DFG_ruby(child, index_to_code, states)
- DFG += temp
- others_states.append(new_states)
- others_states.append(current_states)
- if tag is False:
- others_states.append(states)
- new_states = {}
- for dic in others_states:
- for key in dic:
- if key not in new_states:
- new_states[key] = dic[key].copy()
- else:
- new_states[key] += dic[key]
- for key in new_states:
- new_states[key] = sorted(list(set(new_states[key])))
- return sorted(DFG, key=lambda x: x[1]), new_states
- elif root_node.type in for_statement:
- DFG = []
- for i in range(2):
- left_nodes = [root_node.child_by_field_name('pattern')]
- right_nodes = [root_node.child_by_field_name('value')]
- assert len(right_nodes) == len(left_nodes)
- for node in right_nodes:
- temp, states = DFG_ruby(node, index_to_code, states)
- DFG += temp
- for left_node, right_node in zip(left_nodes, right_nodes):
- left_tokens_index = tree_to_variable_index(left_node, index_to_code)
- right_tokens_index = tree_to_variable_index(right_node, index_to_code)
- temp = []
- for token1_index in left_tokens_index:
- idx1, code1 = index_to_code[token1_index]
- temp.append((code1, idx1, 'computedFrom', [index_to_code[x][1] for x in right_tokens_index],
- [index_to_code[x][0] for x in right_tokens_index]))
- states[code1] = [idx1]
- DFG += temp
- temp, states = DFG_ruby(root_node.child_by_field_name('body'), index_to_code, states)
- DFG += temp
- dic = {}
- for x in DFG:
- if (x[0], x[1], x[2]) not in dic:
- dic[(x[0], x[1], x[2])] = [x[3], x[4]]
- else:
- dic[(x[0], x[1], x[2])][0] = list(set(dic[(x[0], x[1], x[2])][0] + x[3]))
- dic[(x[0], x[1], x[2])][1] = sorted(list(set(dic[(x[0], x[1], x[2])][1] + x[4])))
- DFG = [(x[0], x[1], x[2], y[0], y[1]) for x, y in sorted(dic.items(), key=lambda t: t[0][1])]
- return sorted(DFG, key=lambda x: x[1]), states
- elif root_node.type in while_statement:
- DFG = []
- for i in range(2):
- for child in root_node.children:
- temp, states = DFG_ruby(child, index_to_code, states)
- DFG += temp
- dic = {}
- for x in DFG:
- if (x[0], x[1], x[2]) not in dic:
- dic[(x[0], x[1], x[2])] = [x[3], x[4]]
- else:
- dic[(x[0], x[1], x[2])][0] = list(set(dic[(x[0], x[1], x[2])][0] + x[3]))
- dic[(x[0], x[1], x[2])][1] = sorted(list(set(dic[(x[0], x[1], x[2])][1] + x[4])))
- DFG = [(x[0], x[1], x[2], y[0], y[1]) for x, y in sorted(dic.items(), key=lambda t: t[0][1])]
- return sorted(DFG, key=lambda x: x[1]), states
- else:
- DFG = []
- for child in root_node.children:
- if child.type in do_first_statement:
- temp, states = DFG_ruby(child, index_to_code, states)
- DFG += temp
- for child in root_node.children:
- if child.type not in do_first_statement:
- temp, states = DFG_ruby(child, index_to_code, states)
- DFG += temp
- return sorted(DFG, key=lambda x: x[1]), states
- def DFG_go(root_node, index_to_code, states):
- assignment = ['assignment_statement', ]
- def_statement = ['var_spec']
- increment_statement = ['inc_statement']
- if_statement = ['if_statement', 'else']
- for_statement = ['for_statement']
- enhanced_for_statement = []
- while_statement = []
- do_first_statement = []
- states = states.copy()
- if (len(root_node.children) == 0 or root_node.type == 'string') and root_node.type != 'comment':
- idx, code = index_to_code[(root_node.start_point, root_node.end_point)]
- if root_node.type == code:
- return [], states
- elif code in states:
- return [(code, idx, 'comesFrom', [code], states[code].copy())], states
- else:
- if root_node.type == 'identifier':
- states[code] = [idx]
- return [(code, idx, 'comesFrom', [], [])], states
- elif root_node.type in def_statement:
- name = root_node.child_by_field_name('name')
- value = root_node.child_by_field_name('value')
- DFG = []
- if value is None:
- indexs = tree_to_variable_index(name, index_to_code)
- for index in indexs:
- idx, code = index_to_code[index]
- DFG.append((code, idx, 'comesFrom', [], []))
- states[code] = [idx]
- return sorted(DFG, key=lambda x: x[1]), states
- else:
- name_indexs = tree_to_variable_index(name, index_to_code)
- value_indexs = tree_to_variable_index(value, index_to_code)
- temp, states = DFG_go(value, index_to_code, states)
- DFG += temp
- for index1 in name_indexs:
- idx1, code1 = index_to_code[index1]
- for index2 in value_indexs:
- idx2, code2 = index_to_code[index2]
- DFG.append((code1, idx1, 'comesFrom', [code2], [idx2]))
- states[code1] = [idx1]
- return sorted(DFG, key=lambda x: x[1]), states
- elif root_node.type in assignment:
- left_nodes = root_node.child_by_field_name('left')
- right_nodes = root_node.child_by_field_name('right')
- DFG = []
- temp, states = DFG_go(right_nodes, index_to_code, states)
- DFG += temp
- name_indexs = tree_to_variable_index(left_nodes, index_to_code)
- value_indexs = tree_to_variable_index(right_nodes, index_to_code)
- for index1 in name_indexs:
- idx1, code1 = index_to_code[index1]
- for index2 in value_indexs:
- idx2, code2 = index_to_code[index2]
- DFG.append((code1, idx1, 'computedFrom', [code2], [idx2]))
- states[code1] = [idx1]
- return sorted(DFG, key=lambda x: x[1]), states
- elif root_node.type in increment_statement:
- DFG = []
- indexs = tree_to_variable_index(root_node, index_to_code)
- for index1 in indexs:
- idx1, code1 = index_to_code[index1]
- for index2 in indexs:
- idx2, code2 = index_to_code[index2]
- DFG.append((code1, idx1, 'computedFrom', [code2], [idx2]))
- states[code1] = [idx1]
- return sorted(DFG, key=lambda x: x[1]), states
- elif root_node.type in if_statement:
- DFG = []
- current_states = states.copy()
- others_states = []
- flag = False
- tag = False
- if 'else' in root_node.type:
- tag = True
- for child in root_node.children:
- if 'else' in child.type:
- tag = True
- if child.type not in if_statement and flag is False:
- temp, current_states = DFG_go(child, index_to_code, current_states)
- DFG += temp
- else:
- flag = True
- temp, new_states = DFG_go(child, index_to_code, states)
- DFG += temp
- others_states.append(new_states)
- others_states.append(current_states)
- if tag is False:
- others_states.append(states)
- new_states = {}
- for dic in others_states:
- for key in dic:
- if key not in new_states:
- new_states[key] = dic[key].copy()
- else:
- new_states[key] += dic[key]
- for key in states:
- if key not in new_states:
- new_states[key] = states[key]
- else:
- new_states[key] += states[key]
- for key in new_states:
- new_states[key] = sorted(list(set(new_states[key])))
- return sorted(DFG, key=lambda x: x[1]), new_states
- elif root_node.type in for_statement:
- DFG = []
- for child in root_node.children:
- temp, states = DFG_go(child, index_to_code, states)
- DFG += temp
- flag = False
- for child in root_node.children:
- if flag:
- temp, states = DFG_go(child, index_to_code, states)
- DFG += temp
- elif child.type == "for_clause":
- if child.child_by_field_name('update') is not None:
- temp, states = DFG_go(child.child_by_field_name('update'), index_to_code, states)
- DFG += temp
- flag = True
- dic = {}
- for x in DFG:
- if (x[0], x[1], x[2]) not in dic:
- dic[(x[0], x[1], x[2])] = [x[3], x[4]]
- else:
- dic[(x[0], x[1], x[2])][0] = list(set(dic[(x[0], x[1], x[2])][0] + x[3]))
- dic[(x[0], x[1], x[2])][1] = sorted(list(set(dic[(x[0], x[1], x[2])][1] + x[4])))
- DFG = [(x[0], x[1], x[2], y[0], y[1]) for x, y in sorted(dic.items(), key=lambda t: t[0][1])]
- return sorted(DFG, key=lambda x: x[1]), states
- else:
- DFG = []
- for child in root_node.children:
- if child.type in do_first_statement:
- temp, states = DFG_go(child, index_to_code, states)
- DFG += temp
- for child in root_node.children:
- if child.type not in do_first_statement:
- temp, states = DFG_go(child, index_to_code, states)
- DFG += temp
- return sorted(DFG, key=lambda x: x[1]), states
- def DFG_php(root_node, index_to_code, states):
- assignment = ['assignment_expression', 'augmented_assignment_expression']
- def_statement = ['simple_parameter']
- increment_statement = ['update_expression']
- if_statement = ['if_statement', 'else_clause']
- for_statement = ['for_statement']
- enhanced_for_statement = ['foreach_statement']
- while_statement = ['while_statement']
- do_first_statement = []
- states = states.copy()
- if (len(root_node.children) == 0 or root_node.type == 'string') and root_node.type != 'comment':
- idx, code = index_to_code[(root_node.start_point, root_node.end_point)]
- if root_node.type == code:
- return [], states
- elif code in states:
- return [(code, idx, 'comesFrom', [code], states[code].copy())], states
- else:
- if root_node.type == 'identifier':
- states[code] = [idx]
- return [(code, idx, 'comesFrom', [], [])], states
- elif root_node.type in def_statement:
- name = root_node.child_by_field_name('name')
- value = root_node.child_by_field_name('default_value')
- DFG = []
- if value is None:
- indexs = tree_to_variable_index(name, index_to_code)
- for index in indexs:
- idx, code = index_to_code[index]
- DFG.append((code, idx, 'comesFrom', [], []))
- states[code] = [idx]
- return sorted(DFG, key=lambda x: x[1]), states
- else:
- name_indexs = tree_to_variable_index(name, index_to_code)
- value_indexs = tree_to_variable_index(value, index_to_code)
- temp, states = DFG_php(value, index_to_code, states)
- DFG += temp
- for index1 in name_indexs:
- idx1, code1 = index_to_code[index1]
- for index2 in value_indexs:
- idx2, code2 = index_to_code[index2]
- DFG.append((code1, idx1, 'comesFrom', [code2], [idx2]))
- states[code1] = [idx1]
- return sorted(DFG, key=lambda x: x[1]), states
- elif root_node.type in assignment:
- left_nodes = root_node.child_by_field_name('left')
- right_nodes = root_node.child_by_field_name('right')
- DFG = []
- temp, states = DFG_php(right_nodes, index_to_code, states)
- DFG += temp
- name_indexs = tree_to_variable_index(left_nodes, index_to_code)
- value_indexs = tree_to_variable_index(right_nodes, index_to_code)
- for index1 in name_indexs:
- idx1, code1 = index_to_code[index1]
- for index2 in value_indexs:
- idx2, code2 = index_to_code[index2]
- DFG.append((code1, idx1, 'computedFrom', [code2], [idx2]))
- states[code1] = [idx1]
- return sorted(DFG, key=lambda x: x[1]), states
- elif root_node.type in increment_statement:
- DFG = []
- indexs = tree_to_variable_index(root_node, index_to_code)
- for index1 in indexs:
- idx1, code1 = index_to_code[index1]
- for index2 in indexs:
- idx2, code2 = index_to_code[index2]
- DFG.append((code1, idx1, 'computedFrom', [code2], [idx2]))
- states[code1] = [idx1]
- return sorted(DFG, key=lambda x: x[1]), states
- elif root_node.type in if_statement:
- DFG = []
- current_states = states.copy()
- others_states = []
- flag = False
- tag = False
- if 'else' in root_node.type:
- tag = True
- for child in root_node.children:
- if 'else' in child.type:
- tag = True
- if child.type not in if_statement and flag is False:
- temp, current_states = DFG_php(child, index_to_code, current_states)
- DFG += temp
- else:
- flag = True
- temp, new_states = DFG_php(child, index_to_code, states)
- DFG += temp
- others_states.append(new_states)
- others_states.append(current_states)
- new_states = {}
- for dic in others_states:
- for key in dic:
- if key not in new_states:
- new_states[key] = dic[key].copy()
- else:
- new_states[key] += dic[key]
- for key in states:
- if key not in new_states:
- new_states[key] = states[key]
- else:
- new_states[key] += states[key]
- for key in new_states:
- new_states[key] = sorted(list(set(new_states[key])))
- return sorted(DFG, key=lambda x: x[1]), new_states
- elif root_node.type in for_statement:
- DFG = []
- for child in root_node.children:
- temp, states = DFG_php(child, index_to_code, states)
- DFG += temp
- flag = False
- for child in root_node.children:
- if flag:
- temp, states = DFG_php(child, index_to_code, states)
- DFG += temp
- elif child.type == "assignment_expression":
- flag = True
- dic = {}
- for x in DFG:
- if (x[0], x[1], x[2]) not in dic:
- dic[(x[0], x[1], x[2])] = [x[3], x[4]]
- else:
- dic[(x[0], x[1], x[2])][0] = list(set(dic[(x[0], x[1], x[2])][0] + x[3]))
- dic[(x[0], x[1], x[2])][1] = sorted(list(set(dic[(x[0], x[1], x[2])][1] + x[4])))
- DFG = [(x[0], x[1], x[2], y[0], y[1]) for x, y in sorted(dic.items(), key=lambda t: t[0][1])]
- return sorted(DFG, key=lambda x: x[1]), states
- elif root_node.type in enhanced_for_statement:
- name = None
- value = None
- for child in root_node.children:
- if child.type == 'variable_name' and value is None:
- value = child
- elif child.type == 'variable_name' and name is None:
- name = child
- break
- body = root_node.child_by_field_name('body')
- DFG = []
- for i in range(2):
- temp, states = DFG_php(value, index_to_code, states)
- DFG += temp
- name_indexs = tree_to_variable_index(name, index_to_code)
- value_indexs = tree_to_variable_index(value, index_to_code)
- for index1 in name_indexs:
- idx1, code1 = index_to_code[index1]
- for index2 in value_indexs:
- idx2, code2 = index_to_code[index2]
- DFG.append((code1, idx1, 'computedFrom', [code2], [idx2]))
- states[code1] = [idx1]
- temp, states = DFG_php(body, index_to_code, states)
- DFG += temp
- dic = {}
- for x in DFG:
- if (x[0], x[1], x[2]) not in dic:
- dic[(x[0], x[1], x[2])] = [x[3], x[4]]
- else:
- dic[(x[0], x[1], x[2])][0] = list(set(dic[(x[0], x[1], x[2])][0] + x[3]))
- dic[(x[0], x[1], x[2])][1] = sorted(list(set(dic[(x[0], x[1], x[2])][1] + x[4])))
- DFG = [(x[0], x[1], x[2], y[0], y[1]) for x, y in sorted(dic.items(), key=lambda t: t[0][1])]
- return sorted(DFG, key=lambda x: x[1]), states
- elif root_node.type in while_statement:
- DFG = []
- for i in range(2):
- for child in root_node.children:
- temp, states = DFG_php(child, index_to_code, states)
- DFG += temp
- dic = {}
- for x in DFG:
- if (x[0], x[1], x[2]) not in dic:
- dic[(x[0], x[1], x[2])] = [x[3], x[4]]
- else:
- dic[(x[0], x[1], x[2])][0] = list(set(dic[(x[0], x[1], x[2])][0] + x[3]))
- dic[(x[0], x[1], x[2])][1] = sorted(list(set(dic[(x[0], x[1], x[2])][1] + x[4])))
- DFG = [(x[0], x[1], x[2], y[0], y[1]) for x, y in sorted(dic.items(), key=lambda t: t[0][1])]
- return sorted(DFG, key=lambda x: x[1]), states
- else:
- DFG = []
- for child in root_node.children:
- if child.type in do_first_statement:
- temp, states = DFG_php(child, index_to_code, states)
- DFG += temp
- for child in root_node.children:
- if child.type not in do_first_statement:
- temp, states = DFG_php(child, index_to_code, states)
- DFG += temp
- return sorted(DFG, key=lambda x: x[1]), states
- def DFG_javascript(root_node, index_to_code, states):
- assignment = ['assignment_pattern', 'augmented_assignment_expression']
- def_statement = ['variable_declarator']
- increment_statement = ['update_expression']
- if_statement = ['if_statement', 'else']
- for_statement = ['for_statement']
- enhanced_for_statement = []
- while_statement = ['while_statement']
- do_first_statement = []
- states = states.copy()
- if (len(root_node.children) == 0 or root_node.type == 'string') and root_node.type != 'comment':
- idx, code = index_to_code[(root_node.start_point, root_node.end_point)]
- if root_node.type == code:
- return [], states
- elif code in states:
- return [(code, idx, 'comesFrom', [code], states[code].copy())], states
- else:
- if root_node.type == 'identifier':
- states[code] = [idx]
- return [(code, idx, 'comesFrom', [], [])], states
- elif root_node.type in def_statement:
- name = root_node.child_by_field_name('name')
- value = root_node.child_by_field_name('value')
- DFG = []
- if value is None:
- indexs = tree_to_variable_index(name, index_to_code)
- for index in indexs:
- idx, code = index_to_code[index]
- DFG.append((code, idx, 'comesFrom', [], []))
- states[code] = [idx]
- return sorted(DFG, key=lambda x: x[1]), states
- else:
- name_indexs = tree_to_variable_index(name, index_to_code)
- value_indexs = tree_to_variable_index(value, index_to_code)
- temp, states = DFG_javascript(value, index_to_code, states)
- DFG += temp
- for index1 in name_indexs:
- idx1, code1 = index_to_code[index1]
- for index2 in value_indexs:
- idx2, code2 = index_to_code[index2]
- DFG.append((code1, idx1, 'comesFrom', [code2], [idx2]))
- states[code1] = [idx1]
- return sorted(DFG, key=lambda x: x[1]), states
- elif root_node.type in assignment:
- left_nodes = root_node.child_by_field_name('left')
- right_nodes = root_node.child_by_field_name('right')
- DFG = []
- temp, states = DFG_javascript(right_nodes, index_to_code, states)
- DFG += temp
- name_indexs = tree_to_variable_index(left_nodes, index_to_code)
- value_indexs = tree_to_variable_index(right_nodes, index_to_code)
- for index1 in name_indexs:
- idx1, code1 = index_to_code[index1]
- for index2 in value_indexs:
- idx2, code2 = index_to_code[index2]
- DFG.append((code1, idx1, 'computedFrom', [code2], [idx2]))
- states[code1] = [idx1]
- return sorted(DFG, key=lambda x: x[1]), states
- elif root_node.type in increment_statement:
- DFG = []
- indexs = tree_to_variable_index(root_node, index_to_code)
- for index1 in indexs:
- idx1, code1 = index_to_code[index1]
- for index2 in indexs:
- idx2, code2 = index_to_code[index2]
- DFG.append((code1, idx1, 'computedFrom', [code2], [idx2]))
- states[code1] = [idx1]
- return sorted(DFG, key=lambda x: x[1]), states
- elif root_node.type in if_statement:
- DFG = []
- current_states = states.copy()
- others_states = []
- flag = False
- tag = False
- if 'else' in root_node.type:
- tag = True
- for child in root_node.children:
- if 'else' in child.type:
- tag = True
- if child.type not in if_statement and flag is False:
- temp, current_states = DFG_javascript(child, index_to_code, current_states)
- DFG += temp
- else:
- flag = True
- temp, new_states = DFG_javascript(child, index_to_code, states)
- DFG += temp
- others_states.append(new_states)
- others_states.append(current_states)
- if tag is False:
- others_states.append(states)
- new_states = {}
- for dic in others_states:
- for key in dic:
- if key not in new_states:
- new_states[key] = dic[key].copy()
- else:
- new_states[key] += dic[key]
- for key in states:
- if key not in new_states:
- new_states[key] = states[key]
- else:
- new_states[key] += states[key]
- for key in new_states:
- new_states[key] = sorted(list(set(new_states[key])))
- return sorted(DFG, key=lambda x: x[1]), new_states
- elif root_node.type in for_statement:
- DFG = []
- for child in root_node.children:
- temp, states = DFG_javascript(child, index_to_code, states)
- DFG += temp
- flag = False
- for child in root_node.children:
- if flag:
- temp, states = DFG_javascript(child, index_to_code, states)
- DFG += temp
- elif child.type == "variable_declaration":
- flag = True
- dic = {}
- for x in DFG:
- if (x[0], x[1], x[2]) not in dic:
- dic[(x[0], x[1], x[2])] = [x[3], x[4]]
- else:
- dic[(x[0], x[1], x[2])][0] = list(set(dic[(x[0], x[1], x[2])][0] + x[3]))
- dic[(x[0], x[1], x[2])][1] = sorted(list(set(dic[(x[0], x[1], x[2])][1] + x[4])))
- DFG = [(x[0], x[1], x[2], y[0], y[1]) for x, y in sorted(dic.items(), key=lambda t: t[0][1])]
- return sorted(DFG, key=lambda x: x[1]), states
- elif root_node.type in while_statement:
- DFG = []
- for i in range(2):
- for child in root_node.children:
- temp, states = DFG_javascript(child, index_to_code, states)
- DFG += temp
- dic = {}
- for x in DFG:
- if (x[0], x[1], x[2]) not in dic:
- dic[(x[0], x[1], x[2])] = [x[3], x[4]]
- else:
- dic[(x[0], x[1], x[2])][0] = list(set(dic[(x[0], x[1], x[2])][0] + x[3]))
- dic[(x[0], x[1], x[2])][1] = sorted(list(set(dic[(x[0], x[1], x[2])][1] + x[4])))
- DFG = [(x[0], x[1], x[2], y[0], y[1]) for x, y in sorted(dic.items(), key=lambda t: t[0][1])]
- return sorted(DFG, key=lambda x: x[1]), states
- else:
- DFG = []
- for child in root_node.children:
- if child.type in do_first_statement:
- temp, states = DFG_javascript(child, index_to_code, states)
- DFG += temp
- for child in root_node.children:
- if child.type not in do_first_statement:
- temp, states = DFG_javascript(child, index_to_code, states)
- DFG += temp
- return sorted(DFG, key=lambda x: x[1]), states
|