diff options
author | bors-servo <lbergstrom+bors@mozilla.com> | 2018-11-01 18:13:49 -0400 |
---|---|---|
committer | GitHub <noreply@github.com> | 2018-11-01 18:13:49 -0400 |
commit | 200cc8aa6b8a0c14b3390f1ff02a62f1fce9ac31 (patch) | |
tree | 5a2485e4e1f62e6bf50c937bd808cf6c965cab6a /components/script/dom | |
parent | ad32d52ba55c4c7921c0d4c3e5731289f4a9b872 (diff) | |
parent | 99589d2f2ae2c9fc87eaa23dcd2ea1bdf74a45a6 (diff) | |
download | servo-200cc8aa6b8a0c14b3390f1ff02a62f1fce9ac31.tar.gz servo-200cc8aa6b8a0c14b3390f1ff02a62f1fce9ac31.zip |
Auto merge of #22084 - KiChjang:idl-default-empty-array, r=jdm
Handle default empty sequence values
Fixes #22077.
<!-- Reviewable:start -->
---
This change is [<img src="https://reviewable.io/review_button.svg" height="34" align="absmiddle" alt="Reviewable"/>](https://reviewable.io/reviews/servo/servo/22084)
<!-- Reviewable:end -->
Diffstat (limited to 'components/script/dom')
-rw-r--r-- | components/script/dom/bindings/codegen/CodegenRust.py | 33 | ||||
-rw-r--r-- | components/script/dom/testbinding.rs | 2 | ||||
-rw-r--r-- | components/script/dom/webidls/TestBinding.webidl | 2 |
3 files changed, 22 insertions, 15 deletions
diff --git a/components/script/dom/bindings/codegen/CodegenRust.py b/components/script/dom/bindings/codegen/CodegenRust.py index c9271bb03dc..8d0b68003c5 100644 --- a/components/script/dom/bindings/codegen/CodegenRust.py +++ b/components/script/dom/bindings/codegen/CodegenRust.py @@ -17,6 +17,7 @@ import functools from WebIDL import ( BuiltinTypes, IDLBuiltinType, + IDLEmptySequenceValue, IDLInterfaceMember, IDLNullableType, IDLNullValue, @@ -673,17 +674,19 @@ def getJSToNativeConversionInfo(type, descriptorProvider, failureCode=None, ('throw_type_error(cx, \"%s is not callable.\");\n' '%s' % (firstCap(sourceDescription), exceptionCode))) - # A helper function for handling null default values. Checks that the - # default value, if it exists, is null. - def handleDefaultNull(nullValue): + # A helper function for handling default values. + def handleDefault(nullValue): if defaultValue is None: return None - if not isinstance(defaultValue, IDLNullValue): - raise TypeError("Can't handle non-null default value here") + if isinstance(defaultValue, IDLNullValue): + assert type.nullable() or type.isDictionary() + return nullValue + elif isinstance(defaultValue, IDLEmptySequenceValue): + assert type.isSequence() + return "Vec::new()" - assert type.nullable() or type.isDictionary() - return nullValue + raise TypeError("Can't handle non-null or non-empty sequence default value here") # A helper function for wrapping up the template body for # possibly-nullable objecty stuff @@ -726,7 +729,7 @@ def getJSToNativeConversionInfo(type, descriptorProvider, failureCode=None, " _ => { %s },\n" "}" % (config, indent(failOrPropagate, 8), exceptionCode)) - return handleOptional(templateBody, declType, handleDefaultNull("None")) + return handleOptional(templateBody, declType, handleDefault("None")) if type.isUnion(): declType = CGGeneric(union_native_type(type)) @@ -758,7 +761,7 @@ def getJSToNativeConversionInfo(type, descriptorProvider, failureCode=None, else: default = None else: - default = handleDefaultNull("None") + default = handleDefault("None") return handleOptional(templateBody, declType, default) @@ -810,7 +813,7 @@ def getJSToNativeConversionInfo(type, descriptorProvider, failureCode=None, declType = CGGeneric("&Promise") else: declType = CGGeneric("Rc<Promise>") - return handleOptional(templateBody, declType, handleDefaultNull("None")) + return handleOptional(templateBody, declType, handleDefault("None")) if type.isGeckoInterface(): assert not isEnforceRange and not isClamp @@ -828,7 +831,7 @@ def getJSToNativeConversionInfo(type, descriptorProvider, failureCode=None, isDefinitelyObject, type, failureCode) - return handleOptional(template, declType, handleDefaultNull("None")) + return handleOptional(template, declType, handleDefault("None")) conversionFunction = "root_from_handlevalue" descriptorType = descriptor.returnType @@ -875,7 +878,7 @@ def getJSToNativeConversionInfo(type, descriptorProvider, failureCode=None, templateBody = wrapObjectTemplate(templateBody, "None", isDefinitelyObject, type, failureCode) - return handleOptional(templateBody, declType, handleDefaultNull("None")) + return handleOptional(templateBody, declType, handleDefault("None")) if is_typed_array(type): if failureCode is None: @@ -918,7 +921,7 @@ def getJSToNativeConversionInfo(type, descriptorProvider, failureCode=None, templateBody = wrapObjectTemplate(templateBody, "None", isDefinitelyObject, type, failureCode) - return handleOptional(templateBody, declType, handleDefaultNull("None")) + return handleOptional(templateBody, declType, handleDefault("None")) elif type.isSpiderMonkeyInterface(): raise TypeError("Can't handle SpiderMonkey interface arguments other than typed arrays yet") @@ -1145,7 +1148,7 @@ def getJSToNativeConversionInfo(type, descriptorProvider, failureCode=None, isDefinitelyObject, type, failureCode) return handleOptional(templateBody, declType, - handleDefaultNull(default)) + handleDefault(default)) if type.isDictionary(): # There are no nullable dictionaries @@ -1167,7 +1170,7 @@ def getJSToNativeConversionInfo(type, descriptorProvider, failureCode=None, " _ => { %s },\n" "}" % (indent(failOrPropagate, 8), exceptionCode)) - return handleOptional(template, declType, handleDefaultNull(empty)) + return handleOptional(template, declType, handleDefault(empty)) if type.isVoid(): # This one only happens for return values, and its easy: Just diff --git a/components/script/dom/testbinding.rs b/components/script/dom/testbinding.rs index e6fbfa692c8..91ea4b8e9d0 100644 --- a/components/script/dom/testbinding.rs +++ b/components/script/dom/testbinding.rs @@ -554,6 +554,7 @@ impl TestBindingMethods for TestBinding { dict: RootedTraceableBox::new(TestDictionaryDefaults { UnrestrictedDoubleValue: 0.0, anyValue: RootedTraceableBox::new(Heap::default()), + arrayValue: Vec::new(), booleanValue: false, bytestringValue: ByteString::new(vec![]), byteValue: 0, @@ -790,6 +791,7 @@ impl TestBindingMethods for TestBinding { fn PassOptionalUsvstringWithDefault(&self, _: USVString) {} fn PassOptionalBytestringWithDefault(&self, _: ByteString) {} fn PassOptionalEnumWithDefault(&self, _: TestEnum) {} + fn PassOptionalSequenceWithDefault(&self, _: Vec<i32>) {} fn PassOptionalNullableBooleanWithDefault(&self, _: Option<bool>) {} fn PassOptionalNullableByteWithDefault(&self, _: Option<i8>) {} diff --git a/components/script/dom/webidls/TestBinding.webidl b/components/script/dom/webidls/TestBinding.webidl index f95f4505ffb..d2fdc89f2c3 100644 --- a/components/script/dom/webidls/TestBinding.webidl +++ b/components/script/dom/webidls/TestBinding.webidl @@ -64,6 +64,7 @@ dictionary TestDictionaryDefaults { USVString usvstringValue = "foo"; TestEnum enumValue = "bar"; any anyValue = null; + sequence<object> arrayValue = []; boolean? nullableBooleanValue = false; byte? nullableByteValue = 7; @@ -380,6 +381,7 @@ interface TestBinding { void passOptionalStringWithDefault(optional DOMString arg = "x"); void passOptionalUsvstringWithDefault(optional USVString arg = "x"); void passOptionalEnumWithDefault(optional TestEnum arg = "foo"); + void passOptionalSequenceWithDefault(optional sequence<long> seq = []); // void passOptionalUnionWithDefault(optional (HTMLElement or long) arg = 9); // void passOptionalUnion2WithDefault(optional(Event or DOMString)? data = "foo"); |