diff options
author | Josh Matthews <josh@joshmatthews.net> | 2016-07-21 10:09:52 -0400 |
---|---|---|
committer | Josh Matthews <josh@joshmatthews.net> | 2016-07-21 10:26:57 -0400 |
commit | 9ef848b65effd13601fbf24d53842a4b4d469006 (patch) | |
tree | b2ea32451d803e80dc2487318cd8ee73e6237a4b | |
parent | 2df5d705e13f78afc8ceeb1b5333fc886e2691fa (diff) | |
download | servo-9ef848b65effd13601fbf24d53842a4b4d469006.tar.gz servo-9ef848b65effd13601fbf24d53842a4b4d469006.zip |
Support sequences of sequences in generated bindings.
unroll recursively gets the inner type of any sequence type encountered, so it's inappropriate for codegen that only wants the immediate inner type. However, if a type identifies as a sequence and is nullable, we need to reach through the nullable wrapper first. Gecko does very similar things.
-rw-r--r-- | components/script/dom/bindings/codegen/CodegenRust.py | 12 | ||||
-rw-r--r-- | components/script/dom/testbinding.rs | 13 | ||||
-rw-r--r-- | components/script/dom/webidls/TestBinding.webidl | 4 |
3 files changed, 24 insertions, 5 deletions
diff --git a/components/script/dom/bindings/codegen/CodegenRust.py b/components/script/dom/bindings/codegen/CodegenRust.py index 2513b5b92eb..757234fdb0f 100644 --- a/components/script/dom/bindings/codegen/CodegenRust.py +++ b/components/script/dom/bindings/codegen/CodegenRust.py @@ -87,6 +87,11 @@ def stripTrailingWhitespace(text): return '\n'.join(lines) + tail +def innerSequenceType(type): + assert type.isSequence() + return type.inner.inner if type.nullable() else type.inner + + def MakeNativeName(name): return name[0].upper() + name[1:] @@ -713,7 +718,7 @@ def getJSToNativeConversionInfo(type, descriptorProvider, failureCode=None, raise TypeError("Can't handle array arguments yet") if type.isSequence(): - innerInfo = getJSToNativeConversionInfo(type.unroll(), descriptorProvider) + innerInfo = getJSToNativeConversionInfo(innerSequenceType(type), descriptorProvider) declType = CGWrapper(innerInfo.declType, pre="Vec<", post=">") config = getConversionConfigForType(type, isEnforceRange, isClamp, treatNullAs) @@ -1302,8 +1307,7 @@ def getRetvalDeclarationForType(returnType, descriptorProvider): if returnType.isObject() or returnType.isSpiderMonkeyInterface(): return CGGeneric("*mut JSObject") if returnType.isSequence(): - inner = returnType.unroll() - result = getRetvalDeclarationForType(inner, descriptorProvider) + result = getRetvalDeclarationForType(innerSequenceType(returnType), descriptorProvider) result = CGWrapper(result, pre="Vec<", post=">") if returnType.nullable(): result = CGWrapper(result, pre="Option<", post=">") @@ -3743,7 +3747,7 @@ def getUnionTypeTemplateVars(type, descriptorProvider): typeName = name elif type.isSequence(): name = type.name - inner = getUnionTypeTemplateVars(type.unroll(), descriptorProvider) + inner = getUnionTypeTemplateVars(innerSequenceType(type), descriptorProvider) typeName = "Vec<" + inner["typeName"] + ">" elif type.isArray(): name = str(type) diff --git a/components/script/dom/testbinding.rs b/components/script/dom/testbinding.rs index 64fb6fb7578..66a6f97f333 100644 --- a/components/script/dom/testbinding.rs +++ b/components/script/dom/testbinding.rs @@ -9,7 +9,7 @@ use dom::bindings::codegen::Bindings::FunctionBinding::Function; use dom::bindings::codegen::Bindings::TestBindingBinding; use dom::bindings::codegen::Bindings::TestBindingBinding::{TestBindingMethods, TestDictionary}; use dom::bindings::codegen::Bindings::TestBindingBinding::{TestDictionaryDefaults, TestEnum}; -use dom::bindings::codegen::UnionTypes::{BlobOrBoolean, BlobOrBlobSequence}; +use dom::bindings::codegen::UnionTypes::{BlobOrBoolean, BlobOrBlobSequence, LongOrLongSequenceSequence}; use dom::bindings::codegen::UnionTypes::{BlobOrString, BlobOrUnsignedLong, EventOrString}; use dom::bindings::codegen::UnionTypes::{EventOrUSVString, HTMLElementOrLong}; use dom::bindings::codegen::UnionTypes::{HTMLElementOrUnsignedLongOrStringOrBoolean, LongSequenceOrBoolean}; @@ -572,6 +572,17 @@ impl TestBindingMethods for TestBinding { fn FuncControlledMethodDisabled(&self) {} fn FuncControlledMethodEnabled(&self) {} + fn PassSequenceSequence(&self, _seq: Vec<Vec<i32>>) {} + fn ReturnSequenceSequence(&self) -> Vec<Vec<i32>> { vec![] } + fn PassUnionSequenceSequence(&self, seq: LongOrLongSequenceSequence) { + match seq { + LongOrLongSequenceSequence::Long(_) => (), + LongOrLongSequenceSequence::LongSequenceSequence(seq) => { + let _seq: Vec<Vec<i32>> = seq; + } + } + } + #[allow(unsafe_code)] fn CrashHard(&self) { static READ_ONLY_VALUE: i32 = 0; diff --git a/components/script/dom/webidls/TestBinding.webidl b/components/script/dom/webidls/TestBinding.webidl index 355141a4d92..5ead5918ecc 100644 --- a/components/script/dom/webidls/TestBinding.webidl +++ b/components/script/dom/webidls/TestBinding.webidl @@ -409,6 +409,10 @@ interface TestBinding { void passVariadicAny(any... args); void passVariadicObject(object... args); + void passSequenceSequence(sequence<sequence<long>> seq); + sequence<sequence<long>> returnSequenceSequence(); + void passUnionSequenceSequence((long or sequence<sequence<long>>) seq); + static attribute boolean booleanAttributeStatic; static void receiveVoidStatic(); boolean BooleanMozPreference(DOMString pref_name); |