diff options
Diffstat (limited to 'components/script/dom/bindings/codegen')
-rw-r--r-- | components/script/dom/bindings/codegen/CodegenRust.py | 40 |
1 files changed, 40 insertions, 0 deletions
diff --git a/components/script/dom/bindings/codegen/CodegenRust.py b/components/script/dom/bindings/codegen/CodegenRust.py index 832dd564736..2847401e65c 100644 --- a/components/script/dom/bindings/codegen/CodegenRust.py +++ b/components/script/dom/bindings/codegen/CodegenRust.py @@ -2286,11 +2286,25 @@ class CGCreateInterfaceObjectsMethod(CGAbstractMethod): call = """\ do_create_interface_objects(cx, receiver, parent_proto.handle(), %s, %s, + &named_constructors, %s, &sNativeProperties, rval);""" % (protoClass, constructor, domClass) + createArray = """\ +let named_constructors: [(NonNullJSNative, &'static str, u32); %d] = [ +""" % len(self.descriptor.interface.namedConstructors) + for ctor in self.descriptor.interface.namedConstructors: + constructHook = CONSTRUCT_HOOK_NAME + "_" + ctor.identifier.name; + constructArgs = methodLength(ctor) + constructor = '(%s as NonNullJSNative, "%s", %d)' % ( + constructHook, ctor.identifier.name, constructArgs) + createArray += constructor + createArray += "," + createArray += "];" + return CGList([ CGGeneric(getParentProto), + CGGeneric(createArray), CGGeneric(call % self.properties.variableNames()) ], "\n") @@ -4422,6 +4436,30 @@ let args = CallArgs::from_vp(vp, argc); self.descriptor, self._ctor) return CGList([preamble, callGenerator]) +class CGClassNameConstructHook(CGAbstractExternMethod): + """ + JS-visible named constructor for our objects + """ + def __init__(self, descriptor, ctor): + args = [Argument('*mut JSContext', 'cx'), Argument('u32', 'argc'), Argument('*mut JSVal', 'vp')] + self._ctor = ctor + CGAbstractExternMethod.__init__(self, descriptor, + CONSTRUCT_HOOK_NAME + "_" + + self._ctor.identifier.name, + 'u8', args) + + def definition_body(self): + preamble = CGGeneric("""\ +let global = global_object_for_js_object(JS_CALLEE(cx, vp).to_object()); +let args = CallArgs::from_vp(vp, argc); +""") + name = self._ctor.identifier.name + nativeName = MakeNativeName(self.descriptor.binaryNameFor(name)) + callGenerator = CGMethodCall(["global.r()"], nativeName, True, + self.descriptor, self._ctor) + return CGList([preamble, callGenerator]) + + class CGClassFinalizeHook(CGAbstractClassHook): """ A hook for finalize, used to release our native object. @@ -4568,6 +4606,8 @@ class CGDescriptor(CGThing): if descriptor.interface.hasInterfaceObject(): cgThings.append(CGClassConstructHook(descriptor)) + for ctor in descriptor.interface.namedConstructors: + cgThings.append(CGClassNameConstructHook(descriptor, ctor)) cgThings.append(CGInterfaceObjectJSClass(descriptor)) if not descriptor.interface.isCallback(): |