blob: 5b2512055ca84ba410fcd462d759cc151abc7b37 [file] [log] [blame]
Eli Benderskya1da7fd2012-07-06 15:48:57 +03001import sys
Eli Bendersky00de62c2015-04-18 06:55:42 -07002from pycparser import parse_file
Eli Benderskya1da7fd2012-07-06 15:48:57 +03003from pycparser.c_ast import *
4from pycparser.c_parser import CParser, Coord, ParseError
5from pycparser.c_lexer import CLexer
6
7
8def expand_decl(decl):
9 """ Converts the declaration into a nested list.
10 """
11 typ = type(decl)
Eli Bendersky685818d2013-06-11 18:44:05 -070012
Eli Benderskya1da7fd2012-07-06 15:48:57 +030013 if typ == TypeDecl:
14 return ['TypeDecl', expand_decl(decl.type)]
15 elif typ == IdentifierType:
16 return ['IdentifierType', decl.names]
17 elif typ == ID:
18 return ['ID', decl.name]
19 elif typ in [Struct, Union]:
20 decls = [expand_decl(d) for d in decl.decls or []]
21 return [typ.__name__, decl.name, decls]
Eli Bendersky685818d2013-06-11 18:44:05 -070022 else:
Eli Benderskya1da7fd2012-07-06 15:48:57 +030023 nested = expand_decl(decl.type)
Eli Bendersky685818d2013-06-11 18:44:05 -070024
Eli Benderskya1da7fd2012-07-06 15:48:57 +030025 if typ == Decl:
26 if decl.quals:
27 return ['Decl', decl.quals, decl.name, nested]
28 else:
29 return ['Decl', decl.name, nested]
30 elif typ == Typename: # for function parameters
31 if decl.quals:
32 return ['Typename', decl.quals, nested]
33 else:
34 return ['Typename', nested]
35 elif typ == ArrayDecl:
36 dimval = decl.dim.value if decl.dim else ''
37 return ['ArrayDecl', dimval, nested]
38 elif typ == PtrDecl:
39 return ['PtrDecl', nested]
40 elif typ == Typedef:
41 return ['Typedef', decl.name, nested]
42 elif typ == FuncDecl:
43 if decl.args:
44 params = [expand_decl(param) for param in decl.args.params]
45 else:
46 params = []
47 return ['FuncDecl', params, nested]
48
49#-----------------------------------------------------------------
50class NodeVisitor(object):
eli.bendersky724b1cc2011-03-05 10:45:08 +020051 def __init__(self):
Eli Benderskya1da7fd2012-07-06 15:48:57 +030052 self.current_parent = None
Eli Bendersky685818d2013-06-11 18:44:05 -070053
Eli Benderskya1da7fd2012-07-06 15:48:57 +030054 def visit(self, node):
Eli Bendersky685818d2013-06-11 18:44:05 -070055 """ Visit a node.
Eli Benderskya1da7fd2012-07-06 15:48:57 +030056 """
57 method = 'visit_' + node.__class__.__name__
58 visitor = getattr(self, method, self.generic_visit)
59 return visitor(node)
Eli Bendersky685818d2013-06-11 18:44:05 -070060
eli.bendersky3b52ac02011-03-18 06:32:23 +020061 def visit_FuncCall(self, node):
Eli Benderskya1da7fd2012-07-06 15:48:57 +030062 print("Visiting FuncCall")
63 print(node.show())
64 print('---- parent ----')
65 print(self.current_parent.show())
Eli Bendersky685818d2013-06-11 18:44:05 -070066
Eli Benderskya1da7fd2012-07-06 15:48:57 +030067 def generic_visit(self, node):
Eli Bendersky685818d2013-06-11 18:44:05 -070068 """ Called if no explicit visitor function exists for a
Eli Benderskya1da7fd2012-07-06 15:48:57 +030069 node. Implements preorder visiting of the node.
70 """
71 oldparent = self.current_parent
72 self.current_parent = node
73 for c in node.children():
74 self.visit(c)
75 self.current_parent = oldparent
76
77
Eli Bendersky08744122015-04-18 07:03:40 -070078def heapyprofile():
Eli Benderskye6a05f82015-04-18 07:07:47 -070079 # pip install guppy
80 # [works on python 2.7, AFAIK]
Eli Bendersky08744122015-04-18 07:03:40 -070081 from guppy import hpy
82 import gc
83
84 hp = hpy()
85 ast = parse_file('/tmp/197.c')
86 gc.collect()
87 h = hp.heap()
Eli Benderskye6a05f82015-04-18 07:07:47 -070088 print(h)
Eli Bendersky08744122015-04-18 07:03:40 -070089
90
Eli Bendersky00de62c2015-04-18 06:55:42 -070091def memprofile():
92 import resource
93 import tracemalloc
94
95 tracemalloc.start()
96
97 ast = parse_file('/tmp/197.c')
98
99 print('Memory usage: %s (kb)' %
100 resource.getrusage(resource.RUSAGE_SELF).ru_maxrss)
101
102 snapshot = tracemalloc.take_snapshot()
103 print("[ tracemalloc stats ]")
104 for stat in snapshot.statistics('lineno')[:20]:
105 print(stat)
106
107
Eli Bendersky685818d2013-06-11 18:44:05 -0700108if __name__ == "__main__":
Eli Bendersky8e5d3a92014-03-15 14:06:00 -0700109 source_code = r'''void foo() {
Eli Benderskyc9f1a382014-03-15 14:12:00 -0700110 L"hi" L"there";
Eli Bendersky8e5d3a92014-03-15 14:06:00 -0700111}
Even13ad2192011-11-06 16:02:43 +0100112 '''
Eli Benderskya1da7fd2012-07-06 15:48:57 +0300113
Eli Benderskye6a05f82015-04-18 07:07:47 -0700114 memprofile()
115 #heapyprofile()
Eli Bendersky00de62c2015-04-18 06:55:42 -0700116
117 #parser = CParser()
118 #ast = parser.parse(source_code, filename='zz')
119 #ast.show(showcoord=True, attrnames=True, nodenames=True)
120
121