| Index: third_party/WebKit/Source/build/scripts/make_instrumenting_probes.py
|
| diff --git a/third_party/WebKit/Source/build/scripts/make_instrumenting_probes.py b/third_party/WebKit/Source/build/scripts/make_instrumenting_probes.py
|
| index 9fe8a1586fe49406294f844d13895d8c79b11c27..5ed7f9da47435d2fe1b578e7c91718380475e5f5 100644
|
| --- a/third_party/WebKit/Source/build/scripts/make_instrumenting_probes.py
|
| +++ b/third_party/WebKit/Source/build/scripts/make_instrumenting_probes.py
|
| @@ -103,11 +103,15 @@ def load_model_from_idl(source):
|
| return model
|
|
|
|
|
| +def include_probes_header():
|
| + return "#include \"%s\"" % config["settings"]["probes_header"]
|
| +
|
| +
|
| class File(object):
|
| def __init__(self, name, source):
|
| self.name = name
|
| self.header_name = self.name + "Inl"
|
| - self.includes = [include_inspector_header(base_name)]
|
| + self.includes = [include_probes_header()]
|
| self.forward_declarations = []
|
| self.declarations = []
|
| for line in map(str.strip, source.split("\n")):
|
| @@ -124,39 +128,19 @@ class File(object):
|
| self.forward_declarations.sort()
|
|
|
|
|
| -def include_header(name):
|
| - return "#include \"%s.h\"" % name
|
| -
|
| -
|
| -def include_inspector_header(name):
|
| - if name == "PerformanceMonitor":
|
| - return include_header("core/frame/" + name)
|
| - if name == "PlatformProbes":
|
| - return include_header("platform/probe/" + name)
|
| - if name == "CoreProbes":
|
| - return include_header("core/probe/" + name)
|
| - return include_header("core/inspector/" + name)
|
| -
|
| -
|
| class Method(object):
|
| def __init__(self, source):
|
| - match = re.match(r"(\[[\w|,|=|\s]*\])?\s?(\w*\*?) (\w*)\((.*)\)\s?;", source)
|
| + match = re.match(r"(?:(\w+\*?)\s+)?(\w+)\s*\((.*)\)\s*;", source)
|
| if not match:
|
| sys.stderr.write("Cannot parse %s\n" % source)
|
| sys.exit(1)
|
|
|
| - self.options = []
|
| - if match.group(1):
|
| - options_str = re.sub(r"\s", "", match.group(1)[1:-1])
|
| - if len(options_str) != 0:
|
| - self.options = options_str.split(",")
|
| -
|
| - self.return_type = match.group(2)
|
| - self.name = match.group(3)
|
| + self.return_type = match.group(1) or ""
|
| + self.name = match.group(2)
|
| self.is_scoped = self.return_type == ""
|
|
|
| # Splitting parameters by a comma, assuming that attribute lists contain no more than one attribute.
|
| - self.params = map(Parameter, map(str.strip, match.group(4).split(",")))
|
| + self.params = map(Parameter, map(str.strip, match.group(3).split(",")))
|
|
|
| self.returns_value = self.return_type != "" and self.return_type != "void"
|
| if self.return_type == "bool":
|
| @@ -165,12 +149,6 @@ class Method(object):
|
| sys.stderr.write("Can only return bool: %s\n" % self.name)
|
| sys.exit(1)
|
|
|
| - self.agents = [option for option in self.options if "=" not in option]
|
| -
|
| - if self.returns_value and len(self.agents) > 1:
|
| - sys.stderr.write("Can only return value from a single agent: %s\n" % self.name)
|
| - sys.exit(1)
|
| -
|
|
|
| class Parameter(object):
|
| def __init__(self, source):
|
| @@ -221,6 +199,38 @@ def load_config(file_name):
|
| return _json5_loads(config_file.read()) or default_config
|
|
|
|
|
| +def build_observers():
|
| + all_pidl_probes = set()
|
| + for f in files:
|
| + probes = set([probe.name for probe in f.declarations])
|
| + if all_pidl_probes & probes:
|
| + raise Exception("Multiple probe declarations: %s" % all_pidl_probes & probes)
|
| + all_pidl_probes |= probes
|
| +
|
| + all_observers = set()
|
| + observers_by_probe = {}
|
| + unused_probes = set(all_pidl_probes)
|
| + for observer_name in config["observers"]:
|
| + all_observers.add(observer_name)
|
| + observer = config["observers"][observer_name]
|
| + for probe in observer["probes"]:
|
| + unused_probes.discard(probe)
|
| + if probe not in all_pidl_probes:
|
| + raise Exception('Probe %s is not declared in PIDL file' % probe)
|
| + if probe not in observers_by_probe:
|
| + observers_by_probe[probe] = set()
|
| + observers_by_probe[probe].add(observer_name)
|
| + if unused_probes:
|
| + raise Exception("Unused probes: %s" % unused_probes)
|
| +
|
| + for f in files:
|
| + for probe in f.declarations:
|
| + probe.agents = observers_by_probe[probe.name]
|
| + if probe.returns_value and len(probe.agents) > 1:
|
| + raise Exception("Can only return value from a single observer: %s\n" % probe.name)
|
| + return all_observers
|
| +
|
| +
|
| cmdline_parser = optparse.OptionParser()
|
| cmdline_parser.add_option("--output_dir")
|
| cmdline_parser.add_option("--config")
|
| @@ -246,21 +256,15 @@ except Exception:
|
|
|
| config = load_config(config_file_name)
|
| jinja_env = initialize_jinja_env(output_dirpath)
|
| -all_agents = set()
|
| base_name = os.path.splitext(os.path.basename(input_path))[0]
|
|
|
| fin = open(input_path, "r")
|
| files = load_model_from_idl(fin.read())
|
| fin.close()
|
|
|
| -for f in files:
|
| - for declaration in f.declarations:
|
| - for agent in declaration.agents:
|
| - all_agents.add(agent)
|
| -
|
| template_context = {
|
| "files": files,
|
| - "agents": all_agents,
|
| + "agents": build_observers(),
|
| "config": config,
|
| "name": base_name,
|
| "input_file": os.path.basename(input_path)
|
|
|