diff options
Diffstat (limited to 'components/script/dom/bindings/codegen/CodegenRust.py')
-rw-r--r-- | components/script/dom/bindings/codegen/CodegenRust.py | 50 |
1 files changed, 30 insertions, 20 deletions
diff --git a/components/script/dom/bindings/codegen/CodegenRust.py b/components/script/dom/bindings/codegen/CodegenRust.py index 2a04db77cc9..643c396febc 100644 --- a/components/script/dom/bindings/codegen/CodegenRust.py +++ b/components/script/dom/bindings/codegen/CodegenRust.py @@ -1221,7 +1221,7 @@ def getConversionConfigForType(type, isEnforceRange, isClamp, treatNullAs): return "StringificationBehavior::Default" else: return treatAs[treatNullAs] - if type.isInteger(): + if type.isPrimitive() and type.isInteger(): if isEnforceRange: return "ConversionBehavior::EnforceRange" elif isClamp: @@ -3571,8 +3571,8 @@ def getUnionTypeTemplateVars(type, descriptorProvider): # for getJSToNativeConversionInfo. # Also, for dictionaries we would need to handle conversion of # null/undefined to the dictionary correctly. - if type.isDictionary() or type.isSequence(): - raise TypeError("Can't handle dictionaries or sequences in unions") + if type.isDictionary(): + raise TypeError("Can't handle dictionaries in unions") if type.isGeckoInterface(): name = type.inner.identifier.name @@ -3580,7 +3580,11 @@ def getUnionTypeTemplateVars(type, descriptorProvider): elif type.isEnum(): name = type.inner.identifier.name typeName = name - elif type.isArray() or type.isSequence(): + elif type.isSequence(): + name = type.name + inner = getUnionTypeTemplateVars(type.unroll(), descriptorProvider) + typeName = "Vec<" + inner["typeName"] + ">" + elif type.isArray(): name = str(type) # XXXjdm dunno about typeName here typeName = "/*" + type.name + "*/" @@ -3664,22 +3668,22 @@ class CGUnionConversionStruct(CGThing): names = [] conversions = [] - interfaceMemberTypes = filter(lambda t: t.isNonCallbackInterface(), memberTypes) - if len(interfaceMemberTypes) > 0: - def get_name(memberType): - if self.type.isGeckoInterface(): - return memberType.inner.identifier.name + def get_name(memberType): + if self.type.isGeckoInterface(): + return memberType.inner.identifier.name - return memberType.name + return memberType.name - def get_match(name): - return ( - "match %s::TryConvertTo%s(cx, value) {\n" - " Err(_) => return Err(()),\n" - " Ok(Some(value)) => return Ok(%s::e%s(value)),\n" - " Ok(None) => (),\n" - "}\n") % (self.type, name, self.type, name) + def get_match(name): + return ( + "match %s::TryConvertTo%s(cx, value) {\n" + " Err(_) => return Err(()),\n" + " Ok(Some(value)) => return Ok(%s::e%s(value)),\n" + " Ok(None) => (),\n" + "}\n") % (self.type, name, self.type, name) + interfaceMemberTypes = filter(lambda t: t.isNonCallbackInterface(), memberTypes) + if len(interfaceMemberTypes) > 0: typeNames = [get_name(memberType) for memberType in interfaceMemberTypes] interfaceObject = CGList(CGGeneric(get_match(typeName)) for typeName in typeNames) names.extend(typeNames) @@ -3689,7 +3693,9 @@ class CGUnionConversionStruct(CGThing): arrayObjectMemberTypes = filter(lambda t: t.isArray() or t.isSequence(), memberTypes) if len(arrayObjectMemberTypes) > 0: assert len(arrayObjectMemberTypes) == 1 - raise TypeError("Can't handle arrays or sequences in unions.") + typeName = arrayObjectMemberTypes[0].name + arrayObject = CGGeneric(get_match(typeName)) + names.append(typeName) else: arrayObject = None @@ -3727,8 +3733,12 @@ class CGUnionConversionStruct(CGThing): hasObjectTypes = interfaceObject or arrayObject or dateObject or nonPlatformObject or object if hasObjectTypes: - assert interfaceObject - templateBody = CGList([interfaceObject], "\n") + assert interfaceObject or arrayObject + templateBody = CGList([], "\n") + if interfaceObject: + templateBody.append(interfaceObject) + if arrayObject: + templateBody.append(arrayObject) conversions.append(CGIfWrapper("value.get().is_object()", templateBody)) otherMemberTypes = [ |