mirror of
https://github.com/servo/servo.git
synced 2025-07-22 23:03:42 +01:00
parent
b26c7bd7ea
commit
4ad1a8ddcc
3 changed files with 42 additions and 21 deletions
|
@ -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 = []
|
||||
|
||||
def get_name(memberType):
|
||||
if self.type.isGeckoInterface():
|
||||
return memberType.inner.identifier.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)
|
||||
|
||||
interfaceMemberTypes = filter(lambda t: t.isNonCallbackInterface(), memberTypes)
|
||||
if len(interfaceMemberTypes) > 0:
|
||||
def get_name(memberType):
|
||||
if self.type.isGeckoInterface():
|
||||
return memberType.inner.identifier.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)
|
||||
|
||||
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 = [
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue