Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(234)

Side by Side Diff: third_party/WebKit/Source/platform/instrumentation/InstrumentingProbesCodeGenerator.py

Issue 2760363002: [instrumentation] Generalize instrumentation to be used beyond the core layer (Closed)
Patch Set: Created 3 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 # Copyright 2017 The Chromium Authors. All rights reserved. 1 # Copyright 2017 The Chromium Authors. All rights reserved.
2 # Use of this source code is governed by a BSD-style license that can be 2 # Use of this source code is governed by a BSD-style license that can be
3 # found in the LICENSE file. 3 # found in the LICENSE file.
4 4
5 import optparse 5 import optparse
6 import os.path 6 import os.path
7 import re 7 import re
8 import sys 8 import sys
9 9
10 # Path handling for libraries and templates 10 # Path handling for libraries and templates
(...skipping 17 matching lines...) Expand all
28 28
29 def to_lower_case(name): 29 def to_lower_case(name):
30 return name[:1].lower() + name[1:] 30 return name[:1].lower() + name[1:]
31 31
32 32
33 def agent_name_to_class(agent_name): 33 def agent_name_to_class(agent_name):
34 if agent_name == "Performance": 34 if agent_name == "Performance":
35 return "PerformanceMonitor" 35 return "PerformanceMonitor"
36 elif agent_name == "TraceEvents": 36 elif agent_name == "TraceEvents":
37 return "InspectorTraceEvents" 37 return "InspectorTraceEvents"
38 elif agent_name == "PlatformTraceEvents":
39 return "PlatformTraceEventsAgent"
38 else: 40 else:
39 return "Inspector%sAgent" % agent_name 41 return "Inspector%sAgent" % agent_name
40 42
41 43
42 def initialize_jinja_env(cache_dir): 44 def initialize_jinja_env(cache_dir):
43 jinja_env = jinja2.Environment( 45 jinja_env = jinja2.Environment(
44 loader=jinja2.FileSystemLoader(templates_dir), 46 loader=jinja2.FileSystemLoader(templates_dir),
45 # Bytecode cache is not concurrency-safe unless pre-cached: 47 # Bytecode cache is not concurrency-safe unless pre-cached:
46 # if pre-cached this is read-only, but writing creates a race condition. 48 # if pre-cached this is read-only, but writing creates a race condition.
47 bytecode_cache=jinja2.FileSystemBytecodeCache(cache_dir), 49 bytecode_cache=jinja2.FileSystemBytecodeCache(cache_dir),
(...skipping 26 matching lines...) Expand all
74 sys.stderr.write("Cannot parse %s\n" % source[:100]) 76 sys.stderr.write("Cannot parse %s\n" % source[:100])
75 sys.exit(1) 77 sys.exit(1)
76 model.append(File(match.group(1), match.group(2))) 78 model.append(File(match.group(1), match.group(2)))
77 return model 79 return model
78 80
79 81
80 class File(object): 82 class File(object):
81 def __init__(self, name, source): 83 def __init__(self, name, source):
82 self.name = name 84 self.name = name
83 self.header_name = self.name + "Inl" 85 self.header_name = self.name + "Inl"
84 self.includes = [include_inspector_header("InspectorInstrumentation")] 86 self.includes = [include_inspector_header(base_name)]
85 self.forward_declarations = [] 87 self.forward_declarations = []
86 self.declarations = [] 88 self.declarations = []
89 self.defines = []
87 for line in map(str.strip, source.split("\n")): 90 for line in map(str.strip, source.split("\n")):
88 line = re.sub(r"\s{2,}", " ", line).strip() # Collapse whitespace 91 line = re.sub(r"\s{2,}", " ", line).strip() # Collapse whitespace
89 if len(line) == 0: 92 if len(line) == 0:
90 continue 93 continue
91 if line[0] == "#": 94 if line.startswith("#define"):
95 self.defines.append(line)
96 elif line.startswith("#include"):
92 self.includes.append(line) 97 self.includes.append(line)
93 elif line.startswith("class "): 98 elif line.startswith("class ") or line.startswith("struct "):
94 self.forward_declarations.append(line) 99 self.forward_declarations.append(line)
95 else: 100 else:
96 self.declarations.append(Method(line)) 101 self.declarations.append(Method(line))
97 self.includes.sort() 102 self.includes.sort()
98 self.forward_declarations.sort() 103 self.forward_declarations.sort()
99 104
100 105
101 def include_header(name): 106 def include_header(name):
102 return "#include \"%s.h\"" % name 107 return "#include \"%s.h\"" % name
103 108
104 109
105 def include_inspector_header(name): 110 def include_inspector_header(name):
106 if name == "PerformanceMonitor": 111 if name == "PerformanceMonitor":
107 return include_header("core/frame/" + name) 112 return include_header("core/frame/" + name)
113 if name == "PlatformInstrumentation":
114 return include_header("platform/instrumentation/" + name)
108 return include_header("core/inspector/" + name) 115 return include_header("core/inspector/" + name)
109 116
110 117
111 class Method(object): 118 class Method(object):
112 def __init__(self, source): 119 def __init__(self, source):
113 match = re.match(r"(\[[\w|,|=|\s]*\])?\s?(\w*\*?) (\w*)\((.*)\)\s?;", so urce) 120 match = re.match(r"(\[[\w|,|=|\s]*\])?\s?(\w*\*?) (\w*)\((.*)\)\s?;", so urce)
114 if not match: 121 if not match:
115 sys.stderr.write("Cannot parse %s\n" % source) 122 sys.stderr.write("Cannot parse %s\n" % source)
116 sys.exit(1) 123 sys.exit(1)
117 124
(...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after
193 if not output_dirpath: 200 if not output_dirpath:
194 raise Exception("Output directory must be specified") 201 raise Exception("Output directory must be specified")
195 except Exception: 202 except Exception:
196 # Work with python 2 and 3 http://docs.python.org/py3k/howto/pyporting.html 203 # Work with python 2 and 3 http://docs.python.org/py3k/howto/pyporting.html
197 exc = sys.exc_info()[1] 204 exc = sys.exc_info()[1]
198 sys.stderr.write("Failed to parse command-line arguments: %s\n\n" % exc) 205 sys.stderr.write("Failed to parse command-line arguments: %s\n\n" % exc)
199 sys.stderr.write("Usage: <script> --output_dir <output_dir> InstrumentingPro bes.idl\n") 206 sys.stderr.write("Usage: <script> --output_dir <output_dir> InstrumentingPro bes.idl\n")
200 exit(1) 207 exit(1)
201 208
202 jinja_env = initialize_jinja_env(output_dirpath) 209 jinja_env = initialize_jinja_env(output_dirpath)
210 all_agents = set()
211 all_defines = []
212 base_name = os.path.splitext(os.path.basename(input_path))[0]
213
203 fin = open(input_path, "r") 214 fin = open(input_path, "r")
204 files = load_model_from_idl(fin.read()) 215 files = load_model_from_idl(fin.read())
205 fin.close() 216 fin.close()
206 all_agents = set()
207 217
208 for f in files: 218 for f in files:
209 for declaration in f.declarations: 219 for declaration in f.declarations:
210 for agent in declaration.agents: 220 for agent in declaration.agents:
211 all_agents.add(agent) 221 all_agents.add(agent)
222 all_defines += f.defines
212 223
213 template_context = { 224 template_context = {
214 "files": files, 225 "files": files,
215 "agents": all_agents, 226 "agents": all_agents,
227 "defines": all_defines,
228 "name": base_name,
216 "input_file": os.path.basename(input_path) 229 "input_file": os.path.basename(input_path)
217 } 230 }
218 cpp_template = jinja_env.get_template("/InstrumentingProbesImpl_cpp.template") 231 cpp_template = jinja_env.get_template("/InstrumentingProbesImpl_cpp.template")
219 cpp_file = open(output_dirpath + "/InstrumentingProbesImpl.cpp", "w") 232 cpp_file = open(output_dirpath + "/" + base_name + "Impl.cpp", "w")
220 cpp_file.write(cpp_template.render(template_context)) 233 cpp_file.write(cpp_template.render(template_context))
221 cpp_file.close() 234 cpp_file.close()
222 235
223 agents_h_template = jinja_env.get_template("/InstrumentingAgents_h.template") 236 agents_h_template = jinja_env.get_template("/InstrumentingAgents_h.template")
224 agents_h_file = open(output_dirpath + "/InstrumentingAgents.h", "w") 237 agents_h_file = open(output_dirpath + "/" + base_name + "Agents.h", "w")
225 agents_h_file.write(agents_h_template.render(template_context)) 238 agents_h_file.write(agents_h_template.render(template_context))
226 agents_h_file.close() 239 agents_h_file.close()
227 240
228 for f in files: 241 for f in files:
229 template_context["file"] = f 242 template_context["file"] = f
230 h_template = jinja_env.get_template("/InstrumentingProbesImpl_h.template") 243 h_template = jinja_env.get_template("/InstrumentingProbesImpl_h.template")
231 h_file = open(output_dirpath + "/" + f.name + "Inl.h", "w") 244 h_file = open(output_dirpath + "/" + f.header_name + ".h", "w")
232 h_file.write(h_template.render(template_context)) 245 h_file.write(h_template.render(template_context))
233 h_file.close() 246 h_file.close()
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698