mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-11-24 13:21:05 +00:00
964834abba
The 'U' flag represents "universal newline". It has been deprecated since Python3.3. Since then "universal newline" is the default when a file is opened in text mode (not bytes). In Python3.11 using the 'U' flag throws errors. There should be no harm in removing 'U' from 'open' everywhere it is used, and doing allows the use of Python3.11. For more reading see: https://docs.python.org/3.11/whatsnew/3.11.html#changes-in-the-python-api Differential Revision: https://phabricator.services.mozilla.com/D147721
90 lines
3.3 KiB
Python
90 lines
3.3 KiB
Python
# This Source Code Form is subject to the terms of the Mozilla Public
|
|
# License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
|
|
|
import collections
|
|
import re
|
|
|
|
|
|
def read_conf(conf_filename):
|
|
# Can't read/write from a single StringIO, so make a new one for reading.
|
|
stream = open(conf_filename, "r")
|
|
|
|
def parse_counters(stream):
|
|
for line_num, line in enumerate(stream):
|
|
line = line.rstrip("\n")
|
|
if not line or line.startswith("//"):
|
|
# empty line or comment
|
|
continue
|
|
m = re.match(r"method ([A-Za-z0-9]+)\.([A-Za-z0-9]+)$", line)
|
|
if m:
|
|
interface_name, method_name = m.groups()
|
|
yield {
|
|
"type": "method",
|
|
"interface_name": interface_name,
|
|
"method_name": method_name,
|
|
}
|
|
continue
|
|
m = re.match(r"attribute ([A-Za-z0-9]+)\.([A-Za-z0-9]+)$", line)
|
|
if m:
|
|
interface_name, attribute_name = m.groups()
|
|
yield {
|
|
"type": "attribute",
|
|
"interface_name": interface_name,
|
|
"attribute_name": attribute_name,
|
|
}
|
|
continue
|
|
m = re.match(r"custom ([A-Za-z0-9_]+) (.*)$", line)
|
|
if m:
|
|
name, desc = m.groups()
|
|
yield {"type": "custom", "name": name, "desc": desc}
|
|
continue
|
|
raise ValueError(
|
|
"error parsing %s at line %d" % (conf_filename, line_num + 1)
|
|
)
|
|
|
|
return parse_counters(stream)
|
|
|
|
|
|
def generate_histograms(filename, is_for_worker=False):
|
|
# The mapping for use counters to telemetry histograms depends on the
|
|
# ordering of items in the dictionary.
|
|
|
|
# The ordering of the ending for workers depends on the WorkerType defined
|
|
# in WorkerPrivate.h.
|
|
endings = (
|
|
["DEDICATED_WORKER", "SHARED_WORKER", "SERVICE_WORKER"]
|
|
if is_for_worker
|
|
else ["DOCUMENT", "PAGE"]
|
|
)
|
|
|
|
items = collections.OrderedDict()
|
|
for counter in read_conf(filename):
|
|
|
|
def append_counter(name, desc):
|
|
items[name] = {
|
|
"expires_in_version": "never",
|
|
"kind": "boolean",
|
|
"description": desc,
|
|
}
|
|
|
|
def append_counters(name, desc):
|
|
for ending in endings:
|
|
append_counter(
|
|
"USE_COUNTER2_%s_%s" % (name, ending),
|
|
"Whether a %s %s" % (ending.replace("_", " ").lower(), desc),
|
|
)
|
|
|
|
if counter["type"] == "method":
|
|
method = "%s.%s" % (counter["interface_name"], counter["method_name"])
|
|
append_counters(method.replace(".", "_").upper(), "called %s" % method)
|
|
elif counter["type"] == "attribute":
|
|
attr = "%s.%s" % (counter["interface_name"], counter["attribute_name"])
|
|
counter_name = attr.replace(".", "_").upper()
|
|
append_counters("%s_getter" % counter_name, "got %s" % attr)
|
|
append_counters("%s_setter" % counter_name, "set %s" % attr)
|
|
elif counter["type"] == "custom":
|
|
append_counters(counter["name"].upper(), counter["desc"])
|
|
|
|
return items
|