Skip to content

Commit c7b3b87

Browse files
committed
Intra specific constructor and init functions
1 parent 1b322e3 commit c7b3b87

File tree

1 file changed

+79
-0
lines changed

1 file changed

+79
-0
lines changed

pyt/intraprocedural_cfg.py

+79
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
import ast
2+
from collections import namedtuple
3+
4+
from base_cfg import Visitor, Node
5+
from label_visitor import LabelVisitor
6+
from right_hand_side_visitor import RHSVisitor
7+
from ast_helper import generate_ast, get_call_names_as_string, Arguments
8+
9+
10+
class IntraproceduralVisitor(Visitor):
11+
12+
def __init__(self, node, filename):
13+
"""Create an empty CFG."""
14+
self.nodes = list()
15+
self.undecided = False # Check if needed in intraprocedural
16+
17+
self.function_names = list() # Probably not necessary check https://github.com/SW10IoT/pyt/issues/23
18+
self.function_return_stack = list() # Same as above
19+
20+
self.filenames = [filename]
21+
22+
try:
23+
# FunctionDef ast node
24+
self.init_function_cfg()
25+
except: # Error?!
26+
# Module ast node
27+
self.init_module_cfg()
28+
29+
30+
def init_module_cfg(self, node):
31+
entry_node = self.append_node(EntryExitNode("Entry module"))
32+
33+
module_statements = self.visit(node)
34+
35+
if not module_statements:
36+
raise Exception('Empty module. It seems that your file is empty, there is nothing to analyse.')
37+
38+
if not isinstance(module_statements, IgnoredNode):
39+
first_node = module_statements.first_statement
40+
41+
if CALL_IDENTIFIER not in first_node.label:
42+
entry_node.connect(first_node)
43+
44+
exit_node = self.append_node(EntryExitNode("Exit module"))
45+
46+
last_nodes = module_statements.last_statements
47+
exit_node.connect_predecessors(last_nodes)
48+
else:
49+
exit_node = self.append_node(EntryExitNode("Exit module"))
50+
entry_node.connect(exit_node)
51+
52+
def init_function_cfg(self, node):
53+
self.function_names.append(node.name)
54+
self.function_return_stack.append(node.name)
55+
56+
entry_node = self.append_node(EntryExitNode("Entry module"))
57+
58+
module_statements = self.stmt_star_handler(node.body)
59+
if isinstance(module_statements, IgnoredNode):
60+
exit_node = self.append_node(EntryExitNode("Exit module"))
61+
entry_node.connect(exit_node)
62+
return
63+
64+
first_node = module_statements.first_statement
65+
if CALL_IDENTIFIER not in first_node.label:
66+
entry_node.connect(first_node)
67+
68+
exit_node = self.append_node(EntryExitNode("Exit module"))
69+
70+
last_nodes = module_statements.last_statements
71+
exit_node.connect_predecessors(last_nodes)
72+
73+
def visit_ClassDef(self, node):
74+
# Something here? y or n ?
75+
pass
76+
77+
def visit_FunctionDef(self, node):
78+
# Something here? y or n ?
79+
pass

0 commit comments

Comments
 (0)