aboutsummaryrefslogtreecommitdiffstats
path: root/src/components/script
diff options
context:
space:
mode:
authorbors-servo <release+servo@mozilla.com>2014-04-28 04:01:36 -0400
committerbors-servo <release+servo@mozilla.com>2014-04-28 04:01:36 -0400
commit9f742a946226edf6cd93db0c864449471b5b1325 (patch)
tree5f37e1beac445b4a35121f378ff3e0deae83ff9d /src/components/script
parent493aa2cdf30fb2ff5886c714030a20d714764b67 (diff)
parent35f6a24de79882902eaceadf6e3a8c8d60b8f704 (diff)
downloadservo-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.py37
-rw-r--r--src/components/script/dom/testbinding.rs40
-rw-r--r--src/components/script/dom/webidls/TestBinding.webidl40
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);
};