diff options
Diffstat (limited to 'components/script_bindings')
-rw-r--r-- | components/script_bindings/codegen/Bindings.conf | 1 | ||||
-rw-r--r-- | components/script_bindings/codegen/CodegenRust.py | 52 | ||||
-rw-r--r-- | components/script_bindings/codegen/Configuration.py | 4 |
3 files changed, 28 insertions, 29 deletions
diff --git a/components/script_bindings/codegen/Bindings.conf b/components/script_bindings/codegen/Bindings.conf index ae6ee4a5617..23a26d98f39 100644 --- a/components/script_bindings/codegen/Bindings.conf +++ b/components/script_bindings/codegen/Bindings.conf @@ -96,6 +96,7 @@ DOMInterfaces = { }, 'Document': { + 'additionalTraits': ["crate::dom::document::DocumentHelpers<Self>"], 'canGc': ['Close', 'CreateElement', 'CreateElementNS', 'ImportNode', 'SetTitle', 'Write', 'Writeln', 'CreateEvent', 'CreateRange', 'Open', 'Open_', 'CreateComment', 'CreateAttribute', 'CreateAttributeNS', 'CreateDocumentFragment', 'CreateTextNode', 'CreateCDATASection', 'CreateProcessingInstruction', 'Prepend', 'Append', 'ReplaceChildren', 'SetBgColor', 'SetFgColor', 'Fonts', 'ElementFromPoint', 'ElementsFromPoint', 'ExitFullscreen', 'CreateExpression', 'CreateNSResolver', 'Evaluate'], }, diff --git a/components/script_bindings/codegen/CodegenRust.py b/components/script_bindings/codegen/CodegenRust.py index b6c223ff53a..06f993d8b5d 100644 --- a/components/script_bindings/codegen/CodegenRust.py +++ b/components/script_bindings/codegen/CodegenRust.py @@ -75,7 +75,7 @@ def isDomInterface(t, logging=False): if isinstance(t, IDLInterface): return True if t.isCallback(): - return False + return True return t.isInterface() and (t.isGeckoInterface() or (t.isSpiderMonkeyInterface() and not t.isBufferSource())) @@ -866,7 +866,7 @@ def getJSToNativeConversionInfo(type, descriptorProvider, failureCode=None, if descriptor.interface.isCallback(): name = descriptor.nativeType - declType = CGWrapper(CGGeneric(name), pre="Rc<", post=">") + declType = CGWrapper(CGGeneric(f"{name}<D>"), pre="Rc<", post=">") template = f"{name}::new(cx, ${{val}}.get().to_object())" if type.nullable(): declType = CGWrapper(declType, pre="Option<", post=">") @@ -1078,7 +1078,7 @@ def getJSToNativeConversionInfo(type, descriptorProvider, failureCode=None, assert not type.treatNonObjectAsNull() or not type.treatNonCallableAsNull() callback = type.unroll().callback - declType = CGGeneric(callback.identifier.name) + declType = CGGeneric(f"{callback.identifier.name}<D>") finalDeclType = CGTemplatedType("Rc", declType) conversion = CGCallbackTempRoot(declType.define()) @@ -1508,7 +1508,7 @@ def getRetvalDeclarationForType(returnType, descriptorProvider): return result if returnType.isCallback(): callback = returnType.unroll().callback - result = CGGeneric(f'Rc<{getModuleFromObject(callback)}::{callback.identifier.name}>') + result = CGGeneric(f'Rc<{getModuleFromObject(callback)}::{callback.identifier.name}<D>>') if returnType.nullable(): result = CGWrapper(result, pre="Option<", post=">") return result @@ -2611,7 +2611,7 @@ class CGGeneric(CGThing): class CGCallbackTempRoot(CGGeneric): def __init__(self, name): - CGGeneric.__init__(self, f"{name}::new(cx, ${{val}}.get().to_object())") + CGGeneric.__init__(self, f"{name.replace('<D>', '::<D>')}::new(cx, ${{val}}.get().to_object())") def getAllTypes(descriptors, dictionaries, callbacks, typedefs): @@ -5100,7 +5100,7 @@ def getUnionTypeTemplateVars(type, descriptorProvider): typeName = f"typedarray::Heap{name}" elif type.isCallback(): name = type.name - typeName = name + typeName = f"{name}<D>" else: raise TypeError(f"Can't handle {type} in unions yet") @@ -5571,8 +5571,9 @@ class ClassConstructor(ClassItem): body += '\n' body = f' {{\n{body}}}' + name = cgClass.getNameString().replace(': DomTypes', '') return f""" -pub(crate) unsafe fn {self.getDecorators(True)}new({args}) -> Rc<{cgClass.getNameString()}>{body} +pub(crate) unsafe fn {self.getDecorators(True)}new({args}) -> Rc<{name}>{body} """ def define(self, cgClass): @@ -5710,7 +5711,7 @@ class CGClass(CGThing): result = f"{result}{memberString}" result += f'{self.indent}}}\n\n' - result += f'impl {self.name} {{\n' + result += f'impl{specialization} {self.name}{specialization.replace(": DomTypes", "")} {{\n' order = [(self.constructors + disallowedCopyConstructors, '\n'), (self.destructors, '\n'), (self.methods, '\n)')] @@ -7561,7 +7562,7 @@ class CGConcreteBindingRoot(CGThing): cgthings += [CGGeneric( f"pub(crate) type {c.identifier.name} = " - f"{originalBinding}::{c.identifier.name};" + f"{originalBinding}::{c.identifier.name}<crate::DomTypeHolder>;" ) for c in mainCallbacks] cgthings += [CGGeneric(f"pub(crate) use {originalBinding} as GenericBindings;")] @@ -7595,7 +7596,9 @@ pub(crate) fn GetConstructorObject( for c in callbackDescriptors: ifaceName = c.interface.identifier.name - cgthings += [CGGeneric(f"pub(crate) type {ifaceName} = {originalBinding}::{ifaceName};")] + cgthings += [CGGeneric( + f"pub(crate) type {ifaceName} = {originalBinding}::{ifaceName}<crate::DomTypeHolder>;" + )] # And make sure we have the right number of newlines at the end curr = CGWrapper(CGList(cgthings, "\n\n"), post="\n\n") @@ -7889,6 +7892,7 @@ class CGCallback(CGClass): bases=[ClassBase(baseName)], constructors=self.getConstructors(), methods=realMethods, + templateSpecialization=['D: DomTypes'], decorators="#[derive(JSTraceable, PartialEq)]\n" "#[cfg_attr(crown, allow(crown::unrooted_must_root))]\n" "#[cfg_attr(crown, crown::unrooted_must_root_lint::allow_unrooted_interior)]") @@ -7906,11 +7910,6 @@ class CGCallback(CGClass): def getMethodImpls(self, method): assert method.needThisHandling args = list(method.args) - # Callbacks are not generic over DomTypes yet, so we need to manually - # re-specialize any use of generics within these generated methods. - for arg in args: - arg.argType = arg.argType.replace('D::', '').replace('<D>', '<crate::DomTypeHolder>') - method.returnType = method.returnType.replace('D::', '') # Strip out the JSContext*/JSObject* args # that got added. assert args[0].name == "cx" and args[0].argType == "SafeJSContext" @@ -7936,7 +7935,7 @@ class CGCallback(CGClass): args.insert(0, Argument(None, "&self")) argsWithoutThis.insert(0, Argument(None, "&self")) - setupCall = "let s = CallSetup::new(self, aExceptionHandling);\n" + setupCall = "let s = CallSetup::<D>::new(self, aExceptionHandling);\n" bodyWithThis = ( f"{setupCall}rooted!(in(*s.get_context()) let mut thisValue: JSVal);\n" @@ -7948,15 +7947,14 @@ class CGCallback(CGClass): bodyWithoutThis = ( f"{setupCall}\n" f"unsafe {{ self.{method.name}({', '.join(argnamesWithoutThis)}) }}") - method.body = method.body.replace('D::', '').replace('<D as DomHelpers<D>>::', '') return [ClassMethod(f'{method.name}_', method.returnType, args, bodyInHeader=True, templateArgs=["T: ThisReflector"], - body=bodyWithThis.replace('D::', ''), + body=bodyWithThis, visibility='pub'), ClassMethod(f'{method.name}__', method.returnType, argsWithoutThis, bodyInHeader=True, - body=bodyWithoutThis.replace('D::', ''), + body=bodyWithoutThis, visibility='pub'), method] @@ -7976,7 +7974,7 @@ def callbackSetterName(attr, descriptor): class CGCallbackFunction(CGCallback): def __init__(self, callback, descriptorProvider): CGCallback.__init__(self, callback, descriptorProvider, - "CallbackFunction", + "CallbackFunction<D>", methods=[CallCallback(callback, descriptorProvider)]) def getConstructors(self): @@ -7985,23 +7983,23 @@ class CGCallbackFunction(CGCallback): class CGCallbackFunctionImpl(CGGeneric): def __init__(self, callback): - type = callback.identifier.name + type = f"{callback.identifier.name}<D>" impl = (f""" -impl CallbackContainer for {type} {{ +impl<D: DomTypes> CallbackContainer<D> for {type} {{ unsafe fn new(cx: SafeJSContext, callback: *mut JSObject) -> Rc<{type}> {{ - {type}::new(cx, callback) + {type.replace('<D>', '')}::new(cx, callback) }} - fn callback_holder(&self) -> &CallbackObject {{ + fn callback_holder(&self) -> &CallbackObject<D> {{ self.parent.callback_holder() }} }} -impl ToJSValConvertible for {type} {{ +impl<D: DomTypes> ToJSValConvertible for {type} {{ unsafe fn to_jsval(&self, cx: *mut JSContext, rval: MutableHandleValue) {{ self.callback().to_jsval(cx, rval); }} -}}\ +}} """) CGGeneric.__init__(self, impl) @@ -8016,7 +8014,7 @@ class CGCallbackInterface(CGCallback): methods = [CallbackOperation(m, sig, descriptor) for m in methods for sig in m.signatures()] assert not iface.isJSImplemented() or not iface.ctor() - CGCallback.__init__(self, iface, descriptor, "CallbackInterface", methods) + CGCallback.__init__(self, iface, descriptor, "CallbackInterface<D>", methods) class FakeMember(): diff --git a/components/script_bindings/codegen/Configuration.py b/components/script_bindings/codegen/Configuration.py index 3f7b9ad6d9b..a4a6a538fdc 100644 --- a/components/script_bindings/codegen/Configuration.py +++ b/components/script_bindings/codegen/Configuration.py @@ -228,9 +228,9 @@ class Descriptor(DescriptorProvider): self.nativeType = typeName pathDefault = 'crate::dom::types::%s' % typeName elif self.interface.isCallback(): - ty = 'crate::dom::bindings::codegen::Bindings::%sBinding::%s' % (ifaceName, ifaceName) + ty = 'crate::dom::bindings::codegen::GenericBindings::%sBinding::%s' % (ifaceName, ifaceName) pathDefault = ty - self.returnType = "Rc<%s>" % ty + self.returnType = "Rc<%s<D>>" % ty self.argumentType = "???" self.nativeType = ty else: |