mirror of
https://github.com/servo/servo.git
synced 2025-08-06 22:15:33 +01:00
auto merge of #2154 : Ms2ger/servo/enumerated-codegen, r=jdm
This commit is contained in:
commit
15e0b48728
4 changed files with 37 additions and 32 deletions
|
@ -733,31 +733,29 @@ def getJSToNativeConversionTemplate(type, descriptorProvider, failureCode=None,
|
||||||
"yet")
|
"yet")
|
||||||
enum = type.inner.identifier.name
|
enum = type.inner.identifier.name
|
||||||
if invalidEnumValueFatal:
|
if invalidEnumValueFatal:
|
||||||
handleInvalidEnumValueCode = " return 0;\n"
|
handleInvalidEnumValueCode = "return 0;"
|
||||||
else:
|
else:
|
||||||
handleInvalidEnumValueCode = " return 1;\n"
|
handleInvalidEnumValueCode = "return 1;"
|
||||||
|
|
||||||
template = (
|
template = (
|
||||||
"{\n"
|
"match FindEnumStringIndex(cx, ${val}, %(values)s) {\n"
|
||||||
#" int index = FindEnumStringIndex<%(invalidEnumValueFatal)s>(cx, ${val}, %(values)s, \"%(enumtype)s\", &ok);\n"
|
" Err(_) => { %(exceptionCode)s },\n"
|
||||||
" let result = FindEnumStringIndex(cx, ${val}, %(values)s);\n"
|
" Ok(None) => { %(handleInvalidEnumValueCode)s },\n"
|
||||||
" if result.is_err() {\n"
|
" Ok(Some(index)) => {\n"
|
||||||
"%(handleInvalidEnumValueCode)s"
|
" //XXXjdm need some range checks up in here.\n"
|
||||||
" }\n"
|
" ${declName} = cast::transmute(index);\n"
|
||||||
" let index = result.unwrap();\n"
|
" },\n"
|
||||||
" ${declName} = cast::transmute(index); //XXXjdm need some range checks up in here\n"
|
"}" % { "values" : enum + "Values::strings",
|
||||||
"}" % { "enumtype" : enum,
|
"exceptionCode" : exceptionCode,
|
||||||
"values" : enum + "Values::strings",
|
"handleInvalidEnumValueCode" : handleInvalidEnumValueCode })
|
||||||
"invalidEnumValueFatal" : toStringBool(invalidEnumValueFatal),
|
|
||||||
"handleInvalidEnumValueCode" : handleInvalidEnumValueCode })
|
|
||||||
|
|
||||||
if defaultValue is not None:
|
if defaultValue is not None:
|
||||||
assert(defaultValue.type.tag() == IDLType.Tags.domstring)
|
assert(defaultValue.type.tag() == IDLType.Tags.domstring)
|
||||||
template = "" #XXXjdm unfinished
|
template = handleDefault(template,
|
||||||
#template = handleDefault(template,
|
("${declName} = %sValues::%s;" %
|
||||||
# ("${declName} = %sValues::%s;" %
|
(enum,
|
||||||
# (enum,
|
getEnumValueName(defaultValue.value))))
|
||||||
# getEnumValueName(defaultValue.value))))
|
|
||||||
return (template, CGGeneric(enum), None, isOptional, None)
|
return (template, CGGeneric(enum), None, isOptional, None)
|
||||||
|
|
||||||
if type.isCallback():
|
if type.isCallback():
|
||||||
|
|
|
@ -470,29 +470,25 @@ pub fn InitIds(cx: *JSContext, specs: &[JSPropertySpec], ids: &mut [jsid]) -> bo
|
||||||
|
|
||||||
pub fn FindEnumStringIndex(cx: *JSContext,
|
pub fn FindEnumStringIndex(cx: *JSContext,
|
||||||
v: JSVal,
|
v: JSVal,
|
||||||
values: &[&'static str]) -> Result<uint, ()> {
|
values: &[&'static str]) -> Result<Option<uint>, ()> {
|
||||||
unsafe {
|
unsafe {
|
||||||
let jsstr = JS_ValueToString(cx, v);
|
let jsstr = JS_ValueToString(cx, v);
|
||||||
if jsstr.is_null() {
|
if jsstr.is_null() {
|
||||||
return Err(());
|
return Err(());
|
||||||
}
|
}
|
||||||
|
|
||||||
let length = 0;
|
let length = 0;
|
||||||
let chars = JS_GetStringCharsAndLength(cx, jsstr, &length);
|
let chars = JS_GetStringCharsAndLength(cx, jsstr, &length);
|
||||||
if chars.is_null() {
|
if chars.is_null() {
|
||||||
return Err(());
|
return Err(());
|
||||||
}
|
}
|
||||||
for (i, value) in values.iter().enumerate() {
|
|
||||||
let equal = value.len() == length as uint &&
|
|
||||||
range(0, length as int).all(|j| {
|
|
||||||
value[j] as u16 == *chars.offset(j)
|
|
||||||
});
|
|
||||||
|
|
||||||
if equal {
|
Ok(values.iter().enumerate().find(|&(_, value)| {
|
||||||
return Ok(i);
|
value.len() == length as uint &&
|
||||||
}
|
range(0, length as int).all(|j| {
|
||||||
}
|
value[j] as u16 == *chars.offset(j)
|
||||||
|
})
|
||||||
return Err(()); //XXX pass in behaviour for value not found
|
}).map(|(i, _)| i))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -45,6 +45,7 @@ impl TestBinding {
|
||||||
pub fn StringAttribute(&self) -> DOMString { ~"" }
|
pub fn StringAttribute(&self) -> DOMString { ~"" }
|
||||||
pub fn SetStringAttribute(&self, _: DOMString) {}
|
pub fn SetStringAttribute(&self, _: DOMString) {}
|
||||||
pub fn EnumAttribute(&self) -> TestEnum { _empty }
|
pub fn EnumAttribute(&self) -> TestEnum { _empty }
|
||||||
|
pub fn SetEnumAttribute(&self, _: TestEnum) {}
|
||||||
pub fn InterfaceAttribute(&self) -> JS<Blob> { Blob::new(&self.window) }
|
pub fn InterfaceAttribute(&self) -> JS<Blob> { Blob::new(&self.window) }
|
||||||
pub fn SetInterfaceAttribute(&self, _: &JS<Blob>) {}
|
pub fn SetInterfaceAttribute(&self, _: &JS<Blob>) {}
|
||||||
pub fn AnyAttribute(&self, _: *JSContext) -> JSVal { NullValue() }
|
pub fn AnyAttribute(&self, _: *JSContext) -> JSVal { NullValue() }
|
||||||
|
@ -90,6 +91,7 @@ impl TestBinding {
|
||||||
pub fn PassOptionalFloat(&self, _: Option<f32>) {}
|
pub fn PassOptionalFloat(&self, _: Option<f32>) {}
|
||||||
pub fn PassOptionalDouble(&self, _: Option<f64>) {}
|
pub fn PassOptionalDouble(&self, _: Option<f64>) {}
|
||||||
pub fn PassOptionalString(&self, _: Option<DOMString>) {}
|
pub fn PassOptionalString(&self, _: Option<DOMString>) {}
|
||||||
|
// pub fn PassOptionalEnum(&self, _: Option<TestEnum>) {}
|
||||||
pub fn PassOptionalInterface(&self, _: Option<JS<Blob>>) {}
|
pub fn PassOptionalInterface(&self, _: Option<JS<Blob>>) {}
|
||||||
pub fn PassOptionalAny(&self, _: *JSContext, _: Option<JSVal>) {}
|
pub fn PassOptionalAny(&self, _: *JSContext, _: Option<JSVal>) {}
|
||||||
|
|
||||||
|
@ -105,6 +107,7 @@ impl TestBinding {
|
||||||
pub fn PassOptionalNullableFloat(&self, _: Option<Option<f32>>) {}
|
pub fn PassOptionalNullableFloat(&self, _: Option<Option<f32>>) {}
|
||||||
pub fn PassOptionalNullableDouble(&self, _: Option<Option<f64>>) {}
|
pub fn PassOptionalNullableDouble(&self, _: Option<Option<f64>>) {}
|
||||||
pub fn PassOptionalNullableString(&self, _: Option<Option<DOMString>>) {}
|
pub fn PassOptionalNullableString(&self, _: Option<Option<DOMString>>) {}
|
||||||
|
// pub fn PassOptionalNullableEnum(&self, _: Option<Option<TestEnum>>) {}
|
||||||
// pub fn PassOptionalNullableInterface(&self, _: Option<Option<JS<Blob>>>) {}
|
// pub fn PassOptionalNullableInterface(&self, _: Option<Option<JS<Blob>>>) {}
|
||||||
|
|
||||||
pub fn PassOptionalBooleanWithDefault(&self, _: bool) {}
|
pub fn PassOptionalBooleanWithDefault(&self, _: bool) {}
|
||||||
|
@ -117,6 +120,7 @@ impl TestBinding {
|
||||||
pub fn PassOptionalLongLongWithDefault(&self, _: i64) {}
|
pub fn PassOptionalLongLongWithDefault(&self, _: i64) {}
|
||||||
pub fn PassOptionalUnsignedLongLongWithDefault(&self, _: u64) {}
|
pub fn PassOptionalUnsignedLongLongWithDefault(&self, _: u64) {}
|
||||||
pub fn PassOptionalStringWithDefault(&self, _: DOMString) {}
|
pub fn PassOptionalStringWithDefault(&self, _: DOMString) {}
|
||||||
|
pub fn PassOptionalEnumWithDefault(&self, _: TestEnum) {}
|
||||||
|
|
||||||
pub fn PassOptionalNullableBooleanWithDefault(&self, _: Option<bool>) {}
|
pub fn PassOptionalNullableBooleanWithDefault(&self, _: Option<bool>) {}
|
||||||
pub fn PassOptionalNullableByteWithDefault(&self, _: Option<i8>) {}
|
pub fn PassOptionalNullableByteWithDefault(&self, _: Option<i8>) {}
|
||||||
|
@ -130,6 +134,7 @@ impl TestBinding {
|
||||||
pub fn PassOptionalNullableFloatWithDefault(&self, _: Option<f32>) {}
|
pub fn PassOptionalNullableFloatWithDefault(&self, _: Option<f32>) {}
|
||||||
pub fn PassOptionalNullableDoubleWithDefault(&self, _: Option<f64>) {}
|
pub fn PassOptionalNullableDoubleWithDefault(&self, _: Option<f64>) {}
|
||||||
pub fn PassOptionalNullableStringWithDefault(&self, _: Option<DOMString>) {}
|
pub fn PassOptionalNullableStringWithDefault(&self, _: Option<DOMString>) {}
|
||||||
|
// pub fn PassOptionalNullableEnumWithDefault(&self, _: Option<TestEnum>) {}
|
||||||
pub fn PassOptionalNullableInterfaceWithDefault(&self, _: Option<JS<Blob>>) {}
|
pub fn PassOptionalNullableInterfaceWithDefault(&self, _: Option<JS<Blob>>) {}
|
||||||
pub fn PassOptionalAnyWithDefault(&self, _: *JSContext, _: JSVal) {}
|
pub fn PassOptionalAnyWithDefault(&self, _: *JSContext, _: JSVal) {}
|
||||||
|
|
||||||
|
@ -145,6 +150,7 @@ impl TestBinding {
|
||||||
// pub fn PassOptionalNullableFloatWithNonNullDefault(&self, _: Option<f32>) {}
|
// pub fn PassOptionalNullableFloatWithNonNullDefault(&self, _: Option<f32>) {}
|
||||||
// pub fn PassOptionalNullableDoubleWithNonNullDefault(&self, _: Option<f64>) {}
|
// pub fn PassOptionalNullableDoubleWithNonNullDefault(&self, _: Option<f64>) {}
|
||||||
pub fn PassOptionalNullableStringWithNonNullDefault(&self, _: Option<DOMString>) {}
|
pub fn PassOptionalNullableStringWithNonNullDefault(&self, _: Option<DOMString>) {}
|
||||||
|
// pub fn PassOptionalNullableEnumWithNonNullDefault(&self, _: Option<TestEnum>) {}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Reflectable for TestBinding {
|
impl Reflectable for TestBinding {
|
||||||
|
|
|
@ -17,7 +17,7 @@ interface TestBinding {
|
||||||
attribute float floatAttribute;
|
attribute float floatAttribute;
|
||||||
attribute double doubleAttribute;
|
attribute double doubleAttribute;
|
||||||
attribute DOMString stringAttribute;
|
attribute DOMString stringAttribute;
|
||||||
readonly attribute TestEnum enumAttribute;
|
attribute TestEnum enumAttribute;
|
||||||
attribute Blob interfaceAttribute;
|
attribute Blob interfaceAttribute;
|
||||||
attribute any anyAttribute;
|
attribute any anyAttribute;
|
||||||
|
|
||||||
|
@ -48,6 +48,7 @@ interface TestBinding {
|
||||||
void passOptionalFloat(optional float arg);
|
void passOptionalFloat(optional float arg);
|
||||||
void passOptionalDouble(optional double arg);
|
void passOptionalDouble(optional double arg);
|
||||||
void passOptionalString(optional DOMString arg);
|
void passOptionalString(optional DOMString arg);
|
||||||
|
// void passOptionalEnum(optional TestEnum arg);
|
||||||
void passOptionalInterface(optional Blob arg);
|
void passOptionalInterface(optional Blob arg);
|
||||||
void passOptionalAny(optional any arg);
|
void passOptionalAny(optional any arg);
|
||||||
|
|
||||||
|
@ -63,6 +64,7 @@ interface TestBinding {
|
||||||
void passOptionalNullableFloat(optional float? arg);
|
void passOptionalNullableFloat(optional float? arg);
|
||||||
void passOptionalNullableDouble(optional double? arg);
|
void passOptionalNullableDouble(optional double? arg);
|
||||||
void passOptionalNullableString(optional DOMString? arg);
|
void passOptionalNullableString(optional DOMString? arg);
|
||||||
|
// void passOptionalNullableEnum(optional TestEnum? arg);
|
||||||
// void passOptionalNullableInterface(optional Blob? arg);
|
// void passOptionalNullableInterface(optional Blob? arg);
|
||||||
|
|
||||||
void passOptionalBooleanWithDefault(optional boolean arg = false);
|
void passOptionalBooleanWithDefault(optional boolean arg = false);
|
||||||
|
@ -75,6 +77,7 @@ interface TestBinding {
|
||||||
void passOptionalLongLongWithDefault(optional long long arg = -12);
|
void passOptionalLongLongWithDefault(optional long long arg = -12);
|
||||||
void passOptionalUnsignedLongLongWithDefault(optional unsigned long long arg = 17);
|
void passOptionalUnsignedLongLongWithDefault(optional unsigned long long arg = 17);
|
||||||
void passOptionalStringWithDefault(optional DOMString arg = "");
|
void passOptionalStringWithDefault(optional DOMString arg = "");
|
||||||
|
void passOptionalEnumWithDefault(optional TestEnum arg = "foo");
|
||||||
|
|
||||||
void passOptionalNullableBooleanWithDefault(optional boolean? arg = null);
|
void passOptionalNullableBooleanWithDefault(optional boolean? arg = null);
|
||||||
void passOptionalNullableByteWithDefault(optional byte? arg = null);
|
void passOptionalNullableByteWithDefault(optional byte? arg = null);
|
||||||
|
@ -86,6 +89,7 @@ interface TestBinding {
|
||||||
void passOptionalNullableLongLongWithDefault(optional long long? arg = null);
|
void passOptionalNullableLongLongWithDefault(optional long long? arg = null);
|
||||||
void passOptionalNullableUnsignedLongLongWithDefault(optional unsigned long long? arg = null);
|
void passOptionalNullableUnsignedLongLongWithDefault(optional unsigned long long? arg = null);
|
||||||
void passOptionalNullableStringWithDefault(optional DOMString? arg = null);
|
void passOptionalNullableStringWithDefault(optional DOMString? arg = null);
|
||||||
|
// void passOptionalNullableEnumWithDefault(optional TestEnum? arg = null);
|
||||||
void passOptionalNullableInterfaceWithDefault(optional Blob? arg = null);
|
void passOptionalNullableInterfaceWithDefault(optional Blob? arg = null);
|
||||||
void passOptionalAnyWithDefault(optional any arg = null);
|
void passOptionalAnyWithDefault(optional any arg = null);
|
||||||
|
|
||||||
|
@ -101,4 +105,5 @@ interface TestBinding {
|
||||||
// void passOptionalNullableFloatWithNonNullDefault(optional float? arg = 0.0);
|
// void passOptionalNullableFloatWithNonNullDefault(optional float? arg = 0.0);
|
||||||
// void passOptionalNullableDoubleWithNonNullDefault(optional double? arg = 0.0);
|
// void passOptionalNullableDoubleWithNonNullDefault(optional double? arg = 0.0);
|
||||||
void passOptionalNullableStringWithNonNullDefault(optional DOMString? arg = "");
|
void passOptionalNullableStringWithNonNullDefault(optional DOMString? arg = "");
|
||||||
|
// void passOptionalNullableEnumWithNonNullDefault(optional TestEnum? arg = "foo");
|
||||||
};
|
};
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue