From 35bc171a05ea430b3c6bb6887e5135a6dd9908d1 Mon Sep 17 00:00:00 2001 From: Ms2ger Date: Wed, 8 Feb 2017 12:18:24 +0100 Subject: [PATCH 1/6] Support using typedefs with nullable unions. --- components/script/dom/bindings/codegen/CodegenRust.py | 3 ++- components/script/dom/webidls/TestBinding.webidl | 1 + 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/components/script/dom/bindings/codegen/CodegenRust.py b/components/script/dom/bindings/codegen/CodegenRust.py index 79479363acd..e5c3761edfe 100644 --- a/components/script/dom/bindings/codegen/CodegenRust.py +++ b/components/script/dom/bindings/codegen/CodegenRust.py @@ -6122,7 +6122,8 @@ class CGBindingRoot(CGThing): # Do codegen for all the typdefs for t in typedefs: - if t.innerType.isUnion(): + if t.innerType.isUnion() and not t.innerType.nullable(): + # Allow using the typedef's name for accessing variants. cgthings.extend([CGGeneric("\npub use dom::bindings::codegen::UnionTypes::%s as %s;\n\n" % (t.innerType, t.identifier.name))]) else: diff --git a/components/script/dom/webidls/TestBinding.webidl b/components/script/dom/webidls/TestBinding.webidl index 6920ded6301..59d4fb35466 100644 --- a/components/script/dom/webidls/TestBinding.webidl +++ b/components/script/dom/webidls/TestBinding.webidl @@ -7,6 +7,7 @@ enum TestEnum { "", "foo", "bar" }; typedef (DOMString or URL or Blob) TestTypedef; +typedef (DOMString or URL or Blob)? TestTypedefNullableUnion; dictionary TestDictionary { required boolean requiredValue; From 8a5987c1dba4f31c176eb4a55b9afc45debb2388 Mon Sep 17 00:00:00 2001 From: Ms2ger Date: Wed, 8 Feb 2017 12:28:51 +0100 Subject: [PATCH 2/6] Fix typo in the non-union code path for typedefs. --- components/script/dom/bindings/codegen/CodegenRust.py | 2 +- components/script/dom/webidls/TestBinding.webidl | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/components/script/dom/bindings/codegen/CodegenRust.py b/components/script/dom/bindings/codegen/CodegenRust.py index e5c3761edfe..9846cdd7b97 100644 --- a/components/script/dom/bindings/codegen/CodegenRust.py +++ b/components/script/dom/bindings/codegen/CodegenRust.py @@ -6127,7 +6127,7 @@ class CGBindingRoot(CGThing): cgthings.extend([CGGeneric("\npub use dom::bindings::codegen::UnionTypes::%s as %s;\n\n" % (t.innerType, t.identifier.name))]) else: - assert not typeNeedsRooting(t.innerType, config.getDescriptorProvider) + assert not typeNeedsRooting(t.innerType, config.getDescriptorProvider()) cgthings.extend([CGGeneric("\npub type %s = " % (t.identifier.name)), getRetvalDeclarationForType(t.innerType, config.getDescriptorProvider()), CGGeneric(";\n\n")]) diff --git a/components/script/dom/webidls/TestBinding.webidl b/components/script/dom/webidls/TestBinding.webidl index 59d4fb35466..d688c0d96b6 100644 --- a/components/script/dom/webidls/TestBinding.webidl +++ b/components/script/dom/webidls/TestBinding.webidl @@ -8,6 +8,7 @@ enum TestEnum { "", "foo", "bar" }; typedef (DOMString or URL or Blob) TestTypedef; typedef (DOMString or URL or Blob)? TestTypedefNullableUnion; +typedef DOMString TestTypedefString; dictionary TestDictionary { required boolean requiredValue; From 507b4bf05e594c42a38abfdd478b76cd06b4d272 Mon Sep 17 00:00:00 2001 From: Ms2ger Date: Wed, 8 Feb 2017 12:31:56 +0100 Subject: [PATCH 3/6] Cleanup formatting for typedefs. --- .../script/dom/bindings/codegen/CodegenRust.py | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/components/script/dom/bindings/codegen/CodegenRust.py b/components/script/dom/bindings/codegen/CodegenRust.py index 9846cdd7b97..5df915a9e17 100644 --- a/components/script/dom/bindings/codegen/CodegenRust.py +++ b/components/script/dom/bindings/codegen/CodegenRust.py @@ -6122,15 +6122,20 @@ class CGBindingRoot(CGThing): # Do codegen for all the typdefs for t in typedefs: + typeName = getRetvalDeclarationForType(t.innerType, config.getDescriptorProvider()) + substs = { + "name": t.identifier.name, + "type": typeName.define(), + } + if t.innerType.isUnion() and not t.innerType.nullable(): # Allow using the typedef's name for accessing variants. - cgthings.extend([CGGeneric("\npub use dom::bindings::codegen::UnionTypes::%s as %s;\n\n" % - (t.innerType, t.identifier.name))]) + template = "pub use self::%(type)s as %(name)s;" else: assert not typeNeedsRooting(t.innerType, config.getDescriptorProvider()) - cgthings.extend([CGGeneric("\npub type %s = " % (t.identifier.name)), - getRetvalDeclarationForType(t.innerType, config.getDescriptorProvider()), - CGGeneric(";\n\n")]) + template = "pub type %(name)s = %(type)s;" + + cgthings.append(CGGeneric(template % substs)) # Do codegen for all the dictionaries. cgthings.extend([CGDictionary(d, config.getDescriptorProvider()) From 7d5320f419bd423bdab7c645c08ea3e57d031ab3 Mon Sep 17 00:00:00 2001 From: Ms2ger Date: Wed, 8 Feb 2017 12:37:17 +0100 Subject: [PATCH 4/6] Remove pointless assertion in the typedef code. --- components/script/dom/bindings/codegen/CodegenRust.py | 1 - components/script/dom/webidls/TestBinding.webidl | 1 + 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/components/script/dom/bindings/codegen/CodegenRust.py b/components/script/dom/bindings/codegen/CodegenRust.py index 5df915a9e17..9e96c932f48 100644 --- a/components/script/dom/bindings/codegen/CodegenRust.py +++ b/components/script/dom/bindings/codegen/CodegenRust.py @@ -6132,7 +6132,6 @@ class CGBindingRoot(CGThing): # Allow using the typedef's name for accessing variants. template = "pub use self::%(type)s as %(name)s;" else: - assert not typeNeedsRooting(t.innerType, config.getDescriptorProvider()) template = "pub type %(name)s = %(type)s;" cgthings.append(CGGeneric(template % substs)) diff --git a/components/script/dom/webidls/TestBinding.webidl b/components/script/dom/webidls/TestBinding.webidl index d688c0d96b6..fc6d4771366 100644 --- a/components/script/dom/webidls/TestBinding.webidl +++ b/components/script/dom/webidls/TestBinding.webidl @@ -9,6 +9,7 @@ enum TestEnum { "", "foo", "bar" }; typedef (DOMString or URL or Blob) TestTypedef; typedef (DOMString or URL or Blob)? TestTypedefNullableUnion; typedef DOMString TestTypedefString; +typedef Blob TestTypedefInterface; dictionary TestDictionary { required boolean requiredValue; From 5230ad2c61cec18034bb58a8745b7f330f2049da Mon Sep 17 00:00:00 2001 From: Ms2ger Date: Wed, 8 Feb 2017 12:39:38 +0100 Subject: [PATCH 5/6] Remove typeNeedsRooting(). It is only used once, in a case where it can never have an effect: in case for it to do something, both returnType.isDictionary() and returnType.isGeckoInterface() would need to be true at the same time. --- components/script/dom/bindings/codegen/CodegenRust.py | 7 ------- 1 file changed, 7 deletions(-) diff --git a/components/script/dom/bindings/codegen/CodegenRust.py b/components/script/dom/bindings/codegen/CodegenRust.py index 9e96c932f48..b46d44c5982 100644 --- a/components/script/dom/bindings/codegen/CodegenRust.py +++ b/components/script/dom/bindings/codegen/CodegenRust.py @@ -548,11 +548,6 @@ def typeIsSequenceOrHasSequenceMember(type): return False -def typeNeedsRooting(type, descriptorProvider): - return (type.isGeckoInterface() and - descriptorProvider.getDescriptor(type.unroll().inner.identifier.name).needsRooting) - - def union_native_type(t): name = t.unroll().name return 'UnionTypes::%s' % name @@ -1422,8 +1417,6 @@ def getRetvalDeclarationForType(returnType, descriptorProvider): nullable = returnType.nullable() dictName = returnType.inner.name if nullable else returnType.name result = CGGeneric(dictName) - if typeNeedsRooting(returnType, descriptorProvider): - raise TypeError("We don't support rootable dictionaries return values") if nullable: result = CGWrapper(result, pre="Option<", post=">") return result From 85585d93345be93588545c2c7c6766421c12602f Mon Sep 17 00:00:00 2001 From: Ms2ger Date: Wed, 8 Feb 2017 12:40:19 +0100 Subject: [PATCH 6/6] Remove unused Descriptor.needsRooting field. --- components/script/dom/bindings/codegen/Configuration.py | 3 --- 1 file changed, 3 deletions(-) diff --git a/components/script/dom/bindings/codegen/Configuration.py b/components/script/dom/bindings/codegen/Configuration.py index 14a11c139a9..0fe9bf6c004 100644 --- a/components/script/dom/bindings/codegen/Configuration.py +++ b/components/script/dom/bindings/codegen/Configuration.py @@ -201,20 +201,17 @@ class Descriptor(DescriptorProvider): # Callback and SpiderMonkey types do not use JS smart pointers, so we should not use the # built-in rooting mechanisms for them. if spiderMonkeyInterface: - self.needsRooting = False self.returnType = 'Rc<%s>' % typeName self.argumentType = '&%s' % typeName self.nativeType = typeName pathDefault = 'dom::types::%s' % typeName elif self.interface.isCallback(): - self.needsRooting = False ty = 'dom::bindings::codegen::Bindings::%sBinding::%s' % (ifaceName, ifaceName) pathDefault = ty self.returnType = "Rc<%s>" % ty self.argumentType = "???" self.nativeType = ty else: - self.needsRooting = True self.returnType = "Root<%s>" % typeName self.argumentType = "&%s" % typeName self.nativeType = "*const %s" % typeName