aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJosh Matthews <josh@joshmatthews.net>2016-07-21 10:09:52 -0400
committerJosh Matthews <josh@joshmatthews.net>2016-07-21 10:26:57 -0400
commit9ef848b65effd13601fbf24d53842a4b4d469006 (patch)
treeb2ea32451d803e80dc2487318cd8ee73e6237a4b
parent2df5d705e13f78afc8ceeb1b5333fc886e2691fa (diff)
downloadservo-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.py12
-rw-r--r--components/script/dom/testbinding.rs13
-rw-r--r--components/script/dom/webidls/TestBinding.webidl4
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);