diff options
author | bors-servo <release+servo@mozilla.com> | 2014-04-28 04:01:36 -0400 |
---|---|---|
committer | bors-servo <release+servo@mozilla.com> | 2014-04-28 04:01:36 -0400 |
commit | 9f742a946226edf6cd93db0c864449471b5b1325 (patch) | |
tree | 5f37e1beac445b4a35121f378ff3e0deae83ff9d /src/components/script | |
parent | 493aa2cdf30fb2ff5886c714030a20d714764b67 (diff) | |
parent | 35f6a24de79882902eaceadf6e3a8c8d60b8f704 (diff) | |
download | servo-9f742a946226edf6cd93db0c864449471b5b1325.tar.gz servo-9f742a946226edf6cd93db0c864449471b5b1325.zip |
auto merge of #2237 : Ms2ger/servo/union-fromjsvalconvertible, r=jdm
With bonus codegen tests.
Diffstat (limited to 'src/components/script')
-rw-r--r-- | src/components/script/dom/bindings/codegen/CodegenRust.py | 37 | ||||
-rw-r--r-- | src/components/script/dom/testbinding.rs | 40 | ||||
-rw-r--r-- | src/components/script/dom/webidls/TestBinding.webidl | 40 |
3 files changed, 98 insertions, 19 deletions
diff --git a/src/components/script/dom/bindings/codegen/CodegenRust.py b/src/components/script/dom/bindings/codegen/CodegenRust.py index cc56c606e0b..0912c6fdf96 100644 --- a/src/components/script/dom/bindings/codegen/CodegenRust.py +++ b/src/components/script/dom/bindings/codegen/CodegenRust.py @@ -576,21 +576,13 @@ def getJSToNativeConversionTemplate(type, descriptorProvider, failureCode=None, "holderType") declType = CGGeneric(type.name) - value = CGGeneric("value") if type.nullable(): declType = CGWrapper(declType, pre="Option<", post=" >") - value = CGWrapper(value, pre="Some(", post=")") - templateBody = CGGeneric("match %s::from_value(cx, ${val}) {\n" + templateBody = CGGeneric("match FromJSValConvertible::from_jsval(cx, ${val}, ()) {\n" + " Ok(value) => value,\n" " Err(()) => { %s },\n" - " Ok(value) => %s,\n" - "}" % (type.name, exceptionCode, value.define())) - - if type.nullable(): - templateBody = CGIfElseWrapper( - "(${val}).is_null_or_undefined()", - CGGeneric("None"), - templateBody) + "}" % exceptionCode) templateBody = handleDefaultNull(templateBody.define(), "None") @@ -2847,7 +2839,7 @@ class CGUnionConversionStruct(CGThing): self.type = type self.descriptorProvider = descriptorProvider - def from_value_method(self): + def from_jsval(self): memberTypes = self.type.flatMemberTypes names = [] conversions = [] @@ -2941,9 +2933,13 @@ class CGUnionConversionStruct(CGThing): conversions.append(CGGeneric( "throw_not_in_union(cx, \"%s\");\n" "Err(())" % ", ".join(names))) - return CGWrapper( + method = CGWrapper( CGIndenter(CGList(conversions, "\n\n")), - pre="pub fn from_value(cx: *JSContext, value: JSVal) -> Result<%s, ()> {\n" % self.type, + pre="fn from_jsval(cx: *JSContext, value: JSVal, _option: ()) -> Result<%s, ()> {\n" % self.type, + post="\n}") + return CGWrapper( + CGIndenter(method), + pre="impl FromJSValConvertible<()> for %s {\n" % self.type, post="\n}") def try_method(self, t): @@ -2953,16 +2949,21 @@ class CGUnionConversionStruct(CGThing): return CGWrapper( CGIndenter(jsConversion, 4), - pre="pub fn TryConvertTo%s(cx: *JSContext, value: JSVal) -> %s {\n" % (t.name, returnType), + pre="fn TryConvertTo%s(cx: *JSContext, value: JSVal) -> %s {\n" % (t.name, returnType), post="\n}") def define(self): - methods = [self.from_value_method()] - methods.extend(self.try_method(t) for t in self.type.flatMemberTypes) + from_jsval = self.from_jsval() + methods = CGIndenter(CGList([ + self.try_method(t) for t in self.type.flatMemberTypes + ], "\n\n")) return """ +%s + impl %s { %s -}""" % (self.type, CGIndenter(CGList(methods, "\n\n")).define()) +} +""" % (from_jsval.define(), self.type, methods.define()) class ClassItem: diff --git a/src/components/script/dom/testbinding.rs b/src/components/script/dom/testbinding.rs index 1995221ddc9..ade79ec93b3 100644 --- a/src/components/script/dom/testbinding.rs +++ b/src/components/script/dom/testbinding.rs @@ -3,10 +3,11 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ use dom::bindings::js::JS; -use dom::bindings::utils::{Reflector, Reflectable}; use dom::bindings::codegen::TestBindingBinding; +use dom::bindings::codegen::UnionTypes::HTMLElementOrLong; use self::TestBindingBinding::TestEnum; use self::TestBindingBinding::TestEnumValues::_empty; +use dom::bindings::utils::{Reflector, Reflectable}; use dom::blob::Blob; use dom::window::Window; use servo_util::str::DOMString; @@ -80,6 +81,40 @@ impl TestBinding { pub fn GetInterfaceAttributeNullable(&self) -> Option<JS<Blob>> { Some(Blob::new(&self.window)) } pub fn SetInterfaceAttributeNullable(&self, _: Option<JS<Blob>>) {} + pub fn PassBoolean(&self, _: bool) {} + pub fn PassByte(&self, _: i8) {} + pub fn PassOctet(&self, _: u8) {} + pub fn PassShort(&self, _: i16) {} + pub fn PassUnsignedShort(&self, _: u16) {} + pub fn PassLong(&self, _: i32) {} + pub fn PassUnsignedLong(&self, _: u32) {} + pub fn PassLongLong(&self, _: i64) {} + pub fn PassUnsignedLongLong(&self, _: u64) {} + pub fn PassFloat(&self, _: f32) {} + pub fn PassDouble(&self, _: f64) {} + pub fn PassString(&self, _: DOMString) {} + pub fn PassEnum(&self, _: TestEnum) {} + pub fn PassInterface(&self, _: &JS<Blob>) {} + pub fn PassUnion(&self, _: HTMLElementOrLong) {} + pub fn PassAny(&self, _: *JSContext, _: JSVal) {} + + pub fn PassNullableBoolean(&self, _: Option<bool>) {} + pub fn PassNullableByte(&self, _: Option<i8>) {} + pub fn PassNullableOctet(&self, _: Option<u8>) {} + pub fn PassNullableShort(&self, _: Option<i16>) {} + pub fn PassNullableUnsignedShort(&self, _: Option<u16>) {} + pub fn PassNullableLong(&self, _: Option<i32>) {} + pub fn PassNullableUnsignedLong(&self, _: Option<u32>) {} + pub fn PassNullableLongLong(&self, _: Option<i64>) {} + pub fn PassNullableUnsignedLongLong(&self, _: Option<u64>) {} + pub fn PassNullableFloat(&self, _: Option<f32>) {} + pub fn PassNullableDouble(&self, _: Option<f64>) {} + pub fn PassNullableString(&self, _: Option<DOMString>) {} + // pub fn PassNullableEnum(&self, _: Option<TestEnum>) {} + pub fn PassNullableInterface(&self, _: Option<JS<Blob>>) {} + pub fn PassNullableUnion(&self, _: Option<HTMLElementOrLong>) {} + pub fn PassNullableAny(&self, _: *JSContext, _: Option<JSVal>) {} + pub fn PassOptionalBoolean(&self, _: Option<bool>) {} pub fn PassOptionalByte(&self, _: Option<i8>) {} pub fn PassOptionalOctet(&self, _: Option<u8>) {} @@ -94,6 +129,7 @@ impl TestBinding { pub fn PassOptionalString(&self, _: Option<DOMString>) {} // pub fn PassOptionalEnum(&self, _: Option<TestEnum>) {} pub fn PassOptionalInterface(&self, _: Option<JS<Blob>>) {} + // pub fn PassOptionalUnion(&self, _: Option<HTMLElementOrLong>) {} pub fn PassOptionalAny(&self, _: *JSContext, _: Option<JSVal>) {} pub fn PassOptionalNullableBoolean(&self, _: Option<Option<bool>>) {} @@ -110,6 +146,7 @@ impl TestBinding { pub fn PassOptionalNullableString(&self, _: Option<Option<DOMString>>) {} // pub fn PassOptionalNullableEnum(&self, _: Option<Option<TestEnum>>) {} // pub fn PassOptionalNullableInterface(&self, _: Option<Option<JS<Blob>>>) {} + // pub fn PassOptionalNullableUnion(&self, _: Option<Option<HTMLElementOrLong>>) {} pub fn PassOptionalBooleanWithDefault(&self, _: bool) {} pub fn PassOptionalByteWithDefault(&self, _: i8) {} @@ -137,6 +174,7 @@ impl TestBinding { pub fn PassOptionalNullableStringWithDefault(&self, _: Option<DOMString>) {} // pub fn PassOptionalNullableEnumWithDefault(&self, _: Option<TestEnum>) {} pub fn PassOptionalNullableInterfaceWithDefault(&self, _: Option<JS<Blob>>) {} + pub fn PassOptionalNullableUnionWithDefault(&self, _: Option<HTMLElementOrLong>) {} pub fn PassOptionalAnyWithDefault(&self, _: *JSContext, _: JSVal) {} pub fn PassOptionalNullableBooleanWithNonNullDefault(&self, _: Option<bool>) {} diff --git a/src/components/script/dom/webidls/TestBinding.webidl b/src/components/script/dom/webidls/TestBinding.webidl index 3c5962a5030..78e4d146897 100644 --- a/src/components/script/dom/webidls/TestBinding.webidl +++ b/src/components/script/dom/webidls/TestBinding.webidl @@ -68,6 +68,7 @@ interface TestBinding { attribute DOMString stringAttribute; attribute TestEnum enumAttribute; attribute Blob interfaceAttribute; + // attribute (HTMLElement or long) unionAttribute; attribute any anyAttribute; attribute boolean? booleanAttributeNullable; @@ -84,6 +85,40 @@ interface TestBinding { attribute DOMString? stringAttributeNullable; readonly attribute TestEnum? enumAttributeNullable; attribute Blob? interfaceAttributeNullable; + // attribute (HTMLElement or long)? unionAttributeNullable; + + void passBoolean(boolean arg); + void passByte(byte arg); + void passOctet(octet arg); + void passShort(short arg); + void passUnsignedShort(unsigned short arg); + void passLong(long arg); + void passUnsignedLong(unsigned long arg); + void passLongLong(long long arg); + void passUnsignedLongLong(unsigned long long arg); + void passFloat(float arg); + void passDouble(double arg); + void passString(DOMString arg); + void passEnum(TestEnum arg); + void passInterface(Blob arg); + void passUnion((HTMLElement or long) arg); + void passAny(any arg); + + void passNullableBoolean(boolean? arg); + void passNullableByte(byte? arg); + void passNullableOctet(octet? arg); + void passNullableShort(short? arg); + void passNullableUnsignedShort(unsigned short? arg); + void passNullableLong(long? arg); + void passNullableUnsignedLong(unsigned long? arg); + void passNullableLongLong(long long? arg); + void passNullableUnsignedLongLong(unsigned long long? arg); + void passNullableFloat(float? arg); + void passNullableDouble(double? arg); + void passNullableString(DOMString? arg); + // void passNullableEnum(TestEnum? arg); + void passNullableInterface(Blob? arg); + void passNullableUnion((HTMLElement or long)? arg); void passOptionalBoolean(optional boolean arg); void passOptionalByte(optional byte arg); @@ -99,6 +134,7 @@ interface TestBinding { void passOptionalString(optional DOMString arg); // void passOptionalEnum(optional TestEnum arg); void passOptionalInterface(optional Blob arg); + // void passOptionalUnion(optional (HTMLElement or long) arg); void passOptionalAny(optional any arg); void passOptionalNullableBoolean(optional boolean? arg); @@ -115,6 +151,7 @@ interface TestBinding { void passOptionalNullableString(optional DOMString? arg); // void passOptionalNullableEnum(optional TestEnum? arg); // void passOptionalNullableInterface(optional Blob? arg); + // void passOptionalNullableUnion(optional (HTMLElement or long)? arg); void passOptionalBooleanWithDefault(optional boolean arg = false); void passOptionalByteWithDefault(optional byte arg = 0); @@ -127,6 +164,7 @@ interface TestBinding { void passOptionalUnsignedLongLongWithDefault(optional unsigned long long arg = 17); void passOptionalStringWithDefault(optional DOMString arg = ""); void passOptionalEnumWithDefault(optional TestEnum arg = "foo"); + // void passOptionalUnionWithDefault(optional (HTMLElement or long) arg = 9); void passOptionalNullableBooleanWithDefault(optional boolean? arg = null); void passOptionalNullableByteWithDefault(optional byte? arg = null); @@ -140,6 +178,7 @@ interface TestBinding { void passOptionalNullableStringWithDefault(optional DOMString? arg = null); // void passOptionalNullableEnumWithDefault(optional TestEnum? arg = null); void passOptionalNullableInterfaceWithDefault(optional Blob? arg = null); + void passOptionalNullableUnionWithDefault(optional (HTMLElement or long)? arg = null); void passOptionalAnyWithDefault(optional any arg = null); void passOptionalNullableBooleanWithNonNullDefault(optional boolean? arg = false); @@ -155,4 +194,5 @@ interface TestBinding { // void passOptionalNullableDoubleWithNonNullDefault(optional double? arg = 0.0); void passOptionalNullableStringWithNonNullDefault(optional DOMString? arg = ""); // void passOptionalNullableEnumWithNonNullDefault(optional TestEnum? arg = "foo"); + // void passOptionalNullableUnionWithNonNullDefault(optional (HTMLElement or long)? arg = 7); }; |