auto merge of #2154 : Ms2ger/servo/enumerated-codegen, r=jdm

This commit is contained in:
bors-servo 2014-04-18 09:16:16 -04:00
commit 15e0b48728
4 changed files with 37 additions and 32 deletions

View file

@ -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():

View file

@ -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))
} }
} }

View file

@ -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 {

View file

@ -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");
}; };