diff --git a/src/components/script/dom/bindings/codegen/CodegenRust.py b/src/components/script/dom/bindings/codegen/CodegenRust.py index b9bd9a54ae8..bbdd6b9420e 100644 --- a/src/components/script/dom/bindings/codegen/CodegenRust.py +++ b/src/components/script/dom/bindings/codegen/CodegenRust.py @@ -1063,13 +1063,19 @@ for (uint32_t i = 0; i < length; ++i) { assert(type.nullable()) return handleDefault(conversionCode, "%s.SetNull()" % varName) - return handleDefault( - conversionCode, - ("static data: [u8, ..%s] = [ %s ];\n" - "%s = str::from_utf8(data).to_owned()" % - (len(defaultValue.value) + 1, - ", ".join(["'" + char + "' as u8" for char in defaultValue.value] + ["0"]), - varName))) + + value = "str::from_utf8(data).to_owned()" + if type.nullable(): + value = "Some(%s)" % value + + default = ( + "static data: [u8, ..%s] = [ %s ];\n" + "%s = %s" % + (len(defaultValue.value) + 1, + ", ".join(["'" + char + "' as u8" for char in defaultValue.value] + ["0"]), + varName, value)) + + return handleDefault(conversionCode, default) if isMember: # We have to make a copy, because our jsval may well not @@ -1255,7 +1261,6 @@ for (uint32_t i = 0; i < length; ++i) { else: assert(defaultValue is None or not isinstance(defaultValue, IDLNullValue)) - dataLoc = "${declName}" #XXXjdm conversionBehavior should be used successVal = "v" if preSuccess or postSuccess: @@ -1263,8 +1268,8 @@ for (uint32_t i = 0; i < length; ++i) { template = ( "match JSValConvertible::from_jsval(cx, ${val}) {\n" " Err(_) => %s,\n" - " Ok(v) => %s = %s\n" - "}" % (failureCode, dataLoc, successVal)) + " Ok(v) => ${declName} = %s\n" + "}" % (failureCode, successVal)) declType = CGGeneric(typeName) if (defaultValue is not None and # We already handled IDLNullValue, so just deal with the other ones @@ -1275,12 +1280,16 @@ for (uint32_t i = 0; i < length; ++i) { else: assert(tag == IDLType.Tags.bool) defaultStr = toStringBool(defaultValue.value) + + if type.nullable(): + defaultStr = "Some(%s)" % defaultStr + template = CGWrapper(CGIndenter(CGGeneric(template)), pre="if ${haveValue} {\n", post=("\n" "} else {\n" - " %s = %s;\n" - "}" % (dataLoc, defaultStr))).define() + " ${declName} = %s;\n" + "}" % defaultStr)).define() initialVal = "false" if typeName == "bool" else ("0 as %s" % typeName) if type.nullable(): diff --git a/src/components/script/dom/testbinding.rs b/src/components/script/dom/testbinding.rs index 8173a9829aa..2d0d3fc58bb 100644 --- a/src/components/script/dom/testbinding.rs +++ b/src/components/script/dom/testbinding.rs @@ -122,6 +122,19 @@ impl TestBinding { pub fn PassOptionalNullableDoubleWithDefault(&self, _: Option) {} // pub fn PassOptionalNullableStringWithDefault(&self, _: Option) {} pub fn PassOptionalNullableInterfaceWithDefault(&self, _: Option>) {} + + pub fn PassOptionalNullableBooleanWithNonNullDefault(&self, _: Option) {} + pub fn PassOptionalNullableByteWithNonNullDefault(&self, _: Option) {} + pub fn PassOptionalNullableOctetWithNonNullDefault(&self, _: Option) {} + pub fn PassOptionalNullableShortWithNonNullDefault(&self, _: Option) {} + pub fn PassOptionalNullableUnsignedShortWithNonNullDefault(&self, _: Option) {} + pub fn PassOptionalNullableLongWithNonNullDefault(&self, _: Option) {} + pub fn PassOptionalNullableUnsignedLongWithNonNullDefault(&self, _: Option) {} + pub fn PassOptionalNullableLongLongWithNonNullDefault(&self, _: Option) {} + pub fn PassOptionalNullableUnsignedLongLongWithNonNullDefault(&self, _: Option) {} + // pub fn PassOptionalNullableFloatWithNonNullDefault(&self, _: Option) {} + // pub fn PassOptionalNullableDoubleWithNonNullDefault(&self, _: Option) {} + pub fn PassOptionalNullableStringWithNonNullDefault(&self, _: Option) {} } impl Reflectable for TestBinding { diff --git a/src/components/script/dom/webidls/TestBinding.webidl b/src/components/script/dom/webidls/TestBinding.webidl index 5cb5a20a02e..ae655949cde 100644 --- a/src/components/script/dom/webidls/TestBinding.webidl +++ b/src/components/script/dom/webidls/TestBinding.webidl @@ -82,4 +82,17 @@ interface TestBinding { void passOptionalNullableUnsignedLongLongWithDefault(optional unsigned long long? arg = null); // void passOptionalNullableStringWithDefault(optional DOMString? arg = null); void passOptionalNullableInterfaceWithDefault(optional Blob? arg = null); + + void passOptionalNullableBooleanWithNonNullDefault(optional boolean? arg = false); + void passOptionalNullableByteWithNonNullDefault(optional byte? arg = 7); + void passOptionalNullableOctetWithNonNullDefault(optional octet? arg = 7); + void passOptionalNullableShortWithNonNullDefault(optional short? arg = 7); + void passOptionalNullableUnsignedShortWithNonNullDefault(optional unsigned short? arg = 7); + void passOptionalNullableLongWithNonNullDefault(optional long? arg = 7); + void passOptionalNullableUnsignedLongWithNonNullDefault(optional unsigned long? arg = 7); + void passOptionalNullableLongLongWithNonNullDefault(optional long long? arg = 7); + void passOptionalNullableUnsignedLongLongWithNonNullDefault(optional unsigned long long? arg = 7); + // void passOptionalNullableFloatWithNonNullDefault(optional float? arg = 0.0); + // void passOptionalNullableDoubleWithNonNullDefault(optional double? arg = 0.0); + void passOptionalNullableStringWithNonNullDefault(optional DOMString? arg = ""); };