--- a/dom/bindings/Codegen.py
+++ b/dom/bindings/Codegen.py
@@ -1583,16 +1583,22 @@ class CGAbstractMethod(CGThing):
elif self.inline:
decorators.append('inline')
if self.static:
decorators.append('static')
decorators.append(self.returnType)
maybeNewline = " " if self.inline else "\n"
return ' '.join(decorators) + maybeNewline
+ def _auto_profiler_label(self):
+ profiler_label_and_jscontext = self.profiler_label_and_jscontext()
+ if profiler_label_and_jscontext:
+ return 'AUTO_PROFILER_LABEL_FAST("%s", OTHER, %s);' % profiler_label_and_jscontext
+ return None
+
def declare(self):
if self.inline:
return self._define(True)
return "%s%s%s(%s);\n" % (self._template(), self._decorators(), self.name, self._argstring(True))
def indent_body(self, body):
"""
Indent the code returned by self.definition_body(). Most classes
@@ -1605,25 +1611,36 @@ class CGAbstractMethod(CGThing):
return (self.definition_prologue(fromDeclare) +
self.indent_body(self.definition_body()) +
self.definition_epilogue())
def define(self):
return "" if self.inline else self._define()
def definition_prologue(self, fromDeclare):
- return "%s%s%s(%s)\n{\n" % (self._template(), self._decorators(),
- self.name, self._argstring(fromDeclare))
+ prologue = "%s%s%s(%s)\n{\n" % (self._template(), self._decorators(),
+ self.name, self._argstring(fromDeclare))
+ profiler_label = self._auto_profiler_label()
+ if profiler_label:
+ prologue += " %s\n\n" % profiler_label
+
+ return prologue
def definition_epilogue(self):
return "}\n"
def definition_body(self):
assert False # Override me!
+ """
+ Override this method to return a pair of (descriptive string, name of a
+ JSContext* variable) in order to generate a profiler label for this method.
+ """
+ def profiler_label_and_jscontext(self):
+ return None # Override me!
class CGAbstractStaticMethod(CGAbstractMethod):
"""
Abstract base class for codegen of implementation-only (no
declaration) static methods.
"""
def __init__(self, descriptor, name, returnType, args, canRunScript=False):
CGAbstractMethod.__init__(self, descriptor, name, returnType, args,
@@ -1934,16 +1951,23 @@ class CGClassConstructor(CGAbstractStati
else:
name = self._ctor.identifier.name
nativeName = MakeNativeName(self.descriptor.binaryNameFor(name))
callGenerator = CGMethodCall(nativeName, True, self.descriptor,
self._ctor, isConstructor=True,
constructorName=ctorName)
return preamble + "\n" + callGenerator.define()
+ def profiler_label_and_jscontext(self):
+ name = self._ctor.identifier.name
+ if name != "constructor":
+ ctorName = name
+ else:
+ ctorName = self.descriptor.interface.identifier.name
+ return ("%s constructor" % ctorName, "cx")
# Encapsulate the constructor in a helper method to share genConstructorBody with CGJSImplMethod.
class CGConstructNavigatorObject(CGAbstractMethod):
"""
Construct a new JS-implemented WebIDL DOM object, for use on navigator.
"""
def __init__(self, descriptor):
args = [Argument('JSContext*', 'cx'),
@@ -8789,19 +8813,27 @@ class CGAbstractStaticBindingMethod(CGAb
# later use it to wrap return values.
unwrap = dedent("""
JS::CallArgs args = JS::CallArgsFromVp(argc, vp);
JS::Rooted<JSObject*> obj(cx, &args.callee());
""")
return unwrap + self.generate_code().define()
+ def profiler_label_and_jscontext(self):
+ # Our args are JSNativeArguments() which contain a "JSContext* cx"
+ # argument. We let our subclasses choose the label.
+ return (self.profiler_label(), "cx")
+
def generate_code(self):
assert False # Override me
+ def profiler_label(self):
+ assert False # Override me
+
def MakeNativeName(name):
return name[0].upper() + IDLToCIdentifier(name[1:])
class CGGenericMethod(CGAbstractBindingMethod):
"""
A class for generating the C++ code for an IDL method.
@@ -8894,16 +8926,21 @@ class CGSpecializedMethod(CGAbstractStat
canRunScript=True)
def definition_body(self):
nativeName = CGSpecializedMethod.makeNativeName(self.descriptor,
self.method)
return CGMethodCall(nativeName, self.method.isStatic(), self.descriptor,
self.method).define()
+ def profiler_label_and_jscontext(self):
+ interface_name = self.descriptor.interface.identifier.name
+ method_name = self.method.identifier.name
+ return ("%s.%s" % (interface_name, method_name), "cx")
+
@staticmethod
def makeNativeName(descriptor, method):
name = method.identifier.name
return MakeNativeName(descriptor.binaryNameFor(name))
class CGMethodPromiseWrapper(CGAbstractStaticMethod):
"""
@@ -9153,16 +9190,21 @@ class CGStaticMethod(CGAbstractStaticBin
name = CppKeywords.checkMethodName(IDLToCIdentifier(method.identifier.name))
CGAbstractStaticBindingMethod.__init__(self, descriptor, name)
def generate_code(self):
nativeName = CGSpecializedMethod.makeNativeName(self.descriptor,
self.method)
return CGMethodCall(nativeName, True, self.descriptor, self.method)
+ def profiler_label(self):
+ interface_name = self.descriptor.interface.identifier.name
+ method_name = self.method.identifier.name
+ return "%s.%s" % (interface_name, method_name)
+
class CGGenericGetter(CGAbstractBindingMethod):
"""
A class for generating the C++ code for an IDL attribute getter.
"""
def __init__(self, descriptor, lenientThis=False, allowCrossOriginThis=False):
if lenientThis:
name = "genericLenientGetter"
@@ -9350,16 +9392,21 @@ class CGSpecializedGetter(CGAbstractStat
if self.attr.navigatorObjectGetter:
cgGetterCall = CGNavigatorGetterCall
else:
cgGetterCall = CGGetterCall
return (prefix +
cgGetterCall(self.attr.type, nativeName,
self.descriptor, self.attr).define())
+ def profiler_label_and_jscontext(self):
+ interface_name = self.descriptor.interface.identifier.name
+ attr_name = self.attr.identifier.name
+ return ("get %s.%s" % (interface_name, attr_name), "cx")
+
@staticmethod
def makeNativeName(descriptor, attr):
name = attr.identifier.name
nativeName = MakeNativeName(descriptor.binaryNameFor(name))
_, resultOutParam, _, _, _ = getRetvalDeclarationForType(attr.type,
descriptor)
extendedAttrs = descriptor.getExtendedAttributes(attr, getter=True)
canFail = ('infallible' not in extendedAttrs or
@@ -9415,16 +9462,21 @@ class CGStaticGetter(CGAbstractStaticBin
CGAbstractStaticBindingMethod.__init__(self, descriptor, name)
def generate_code(self):
nativeName = CGSpecializedGetter.makeNativeName(self.descriptor,
self.attr)
return CGGetterCall(self.attr.type, nativeName, self.descriptor,
self.attr)
+ def profiler_label(self):
+ interface_name = self.descriptor.interface.identifier.name
+ attr_name = self.attr.identifier.name
+ return "get %s.%s" % (interface_name, attr_name)
+
class CGGenericSetter(CGAbstractBindingMethod):
"""
A class for generating the C++ code for an IDL attribute setter.
"""
def __init__(self, descriptor, lenientThis=False, allowCrossOriginThis=False):
if lenientThis:
name = "genericLenientSetter"
@@ -9486,16 +9538,21 @@ class CGSpecializedSetter(CGAbstractStat
canRunScript=True)
def definition_body(self):
nativeName = CGSpecializedSetter.makeNativeName(self.descriptor,
self.attr)
return CGSetterCall(self.attr.type, nativeName, self.descriptor,
self.attr).define()
+ def profiler_label_and_jscontext(self):
+ interface_name = self.descriptor.interface.identifier.name
+ attr_name = self.attr.identifier.name
+ return ("set %s.%s" % (interface_name, attr_name), "cx")
+
@staticmethod
def makeNativeName(descriptor, attr):
name = attr.identifier.name
return "Set" + MakeNativeName(descriptor.binaryNameFor(name))
class CGStaticSetter(CGAbstractStaticBindingMethod):
"""
@@ -9515,16 +9572,21 @@ class CGStaticSetter(CGAbstractStaticBin
return ThrowErrorMessage(cx, MSG_MISSING_ARGUMENTS, "${name} setter");
}
""",
name=self.attr.identifier.name))
call = CGSetterCall(self.attr.type, nativeName, self.descriptor,
self.attr)
return CGList([checkForArg, call])
+ def profiler_label(self):
+ interface_name = self.descriptor.interface.identifier.name
+ attr_name = self.attr.identifier.name
+ return "set %s.%s" % (interface_name, attr_name)
+
class CGSpecializedForwardingSetter(CGSpecializedSetter):
"""
A class for generating the code for a specialized attribute setter with
PutForwards that the JIT can call with lower overhead.
"""
def __init__(self, descriptor, attr):
CGSpecializedSetter.__init__(self, descriptor, attr)
@@ -14226,16 +14288,17 @@ class CGBindingRoot(CGThing):
bindingHeaders = dict.fromkeys((
'mozilla/dom/NonRefcountedDOMObject.h',
),
True)
bindingDeclareHeaders = dict.fromkeys((
'mozilla/dom/BindingDeclarations.h',
'mozilla/dom/Nullable.h',
'mozilla/ErrorResult.h',
+ 'GeckoProfiler.h'
),
True)
descriptors = config.getDescriptors(webIDLFile=webIDLFile,
hasInterfaceOrInterfacePrototypeObject=True)
unionTypes = UnionsForFile(config, webIDLFile)