aboutsummaryrefslogtreecommitdiffstats
path: root/components/script/dom/bindings/codegen
diff options
context:
space:
mode:
authorzakorgyula <gyula.zakor@gmail.com>2016-02-09 09:20:19 +0100
committerzakorgyula <gyula.zakor@gmail.com>2016-02-18 11:08:47 +0100
commit6d6f23a69d8b2aab260c459e46b35c9780087463 (patch)
tree722fb96a92f9258314e51346647ef198ba8d79c8 /components/script/dom/bindings/codegen
parent07cb6599d0829d2eccdd8a2a0cf46ff657901593 (diff)
downloadservo-6d6f23a69d8b2aab260c459e46b35c9780087463.tar.gz
servo-6d6f23a69d8b2aab260c459e46b35c9780087463.zip
Fixing issue with uniontypes not created with primitive types
refer to #9531
Diffstat (limited to 'components/script/dom/bindings/codegen')
-rw-r--r--components/script/dom/bindings/codegen/CodegenRust.py61
1 files changed, 43 insertions, 18 deletions
diff --git a/components/script/dom/bindings/codegen/CodegenRust.py b/components/script/dom/bindings/codegen/CodegenRust.py
index b8386e19bbd..53a2fd12987 100644
--- a/components/script/dom/bindings/codegen/CodegenRust.py
+++ b/components/script/dom/bindings/codegen/CodegenRust.py
@@ -3745,25 +3745,50 @@ class CGUnionConversionStruct(CGThing):
if arrayObject:
templateBody.append(arrayObject)
conversions.append(CGIfWrapper("value.get().is_object()", templateBody))
-
- otherMemberTypes = [
- t for t in memberTypes if t.isPrimitive() or t.isString() or t.isEnum()
- ]
- if len(otherMemberTypes) > 0:
- assert len(otherMemberTypes) == 1
- memberType = otherMemberTypes[0]
- if memberType.isEnum():
- name = memberType.inner.identifier.name
+ stringTypes = [t for t in memberTypes if t.isString() or t.isEnum()]
+ numericTypes = [t for t in memberTypes if t.isNumeric()]
+ booleanTypes = [t for t in memberTypes if t.isBoolean()]
+ if stringTypes or numericTypes or booleanTypes:
+ assert len(stringTypes) <= 1
+ assert len(numericTypes) <= 1
+ assert len(booleanTypes) <= 1
+
+ def getStringOrPrimitiveConversion(memberType):
+ typename = get_name(memberType)
+ return CGGeneric(get_match(typename))
+ other = []
+ stringConversion = map(getStringOrPrimitiveConversion, stringTypes)
+ numericConversion = map(getStringOrPrimitiveConversion, numericTypes)
+ booleanConversion = map(getStringOrPrimitiveConversion, booleanTypes)
+ if stringConversion:
+ if booleanConversion:
+ other.append(CGIfWrapper("value.get().is_boolean()", booleanConversion[0]))
+ if numericConversion:
+ other.append(CGIfWrapper("value.get().is_number()", numericConversion[0]))
+ other.append(stringConversion[0])
+ elif numericConversion:
+ if booleanConversion:
+ other.append(CGIfWrapper("value.get().is_boolean()", booleanConversion[0]))
+ other.append(numericConversion[0])
else:
- name = memberType.name
- match = (
- "match %s::TryConvertTo%s(cx, value) {\n"
- " Err(_) => return Err(()),\n"
- " Ok(Some(value)) => return Ok(%s::%s(value)),\n"
- " Ok(None) => (),\n"
- "}\n") % (self.type, name, self.type, name)
- conversions.append(CGGeneric(match))
- names.append(name)
+ assert booleanConversion
+ other.append(booleanConversion[0])
+ conversions.append(CGList(other, "\n\n"))
+ conversions.append(CGGeneric(
+ "throw_not_in_union(cx, \"%s\");\n"
+ "Err(())" % ", ".join(names)))
+ method = CGWrapper(
+ CGIndenter(CGList(conversions, "\n\n")),
+ pre="unsafe fn from_jsval(cx: *mut JSContext,\n"
+ " value: HandleValue, _option: ()) -> Result<%s, ()> {\n" % self.type,
+ post="\n}")
+ return CGWrapper(
+ CGIndenter(CGList([
+ CGGeneric("type Config = ();"),
+ method,
+ ], "\n")),
+ pre="impl FromJSValConvertible for %s {\n" % self.type,
+ post="\n}")
conversions.append(CGGeneric(
"throw_not_in_union(cx, \"%s\");\n"