From baa384536282ba042fe40e1e9e862e9cdcf01060 Mon Sep 17 00:00:00 2001 From: Ms2ger Date: Fri, 18 Apr 2014 10:09:43 +0200 Subject: [PATCH] Rewrite FindEnumStringIndex to distinguish 'value not found' and 'exception raised'. This is in preparation for handling those cases differently. --- .../dom/bindings/codegen/CodegenRust.py | 25 ++++++++----------- src/components/script/dom/bindings/utils.rs | 20 ++++++--------- 2 files changed, 19 insertions(+), 26 deletions(-) diff --git a/src/components/script/dom/bindings/codegen/CodegenRust.py b/src/components/script/dom/bindings/codegen/CodegenRust.py index 8d89fe1b879..23ad1ecd9af 100644 --- a/src/components/script/dom/bindings/codegen/CodegenRust.py +++ b/src/components/script/dom/bindings/codegen/CodegenRust.py @@ -733,23 +733,20 @@ def getJSToNativeConversionTemplate(type, descriptorProvider, failureCode=None, "yet") enum = type.inner.identifier.name if invalidEnumValueFatal: - handleInvalidEnumValueCode = " return 0;\n" + handleInvalidEnumValueCode = "return 0;" else: - handleInvalidEnumValueCode = " return 1;\n" + handleInvalidEnumValueCode = "return 1;" template = ( - "{\n" - #" int index = FindEnumStringIndex<%(invalidEnumValueFatal)s>(cx, ${val}, %(values)s, \"%(enumtype)s\", &ok);\n" - " let result = FindEnumStringIndex(cx, ${val}, %(values)s);\n" - " if result.is_err() {\n" - "%(handleInvalidEnumValueCode)s" - " }\n" - " let index = result.unwrap();\n" - " ${declName} = cast::transmute(index); //XXXjdm need some range checks up in here\n" - "}" % { "enumtype" : enum, - "values" : enum + "Values::strings", - "invalidEnumValueFatal" : toStringBool(invalidEnumValueFatal), - "handleInvalidEnumValueCode" : handleInvalidEnumValueCode }) + "match FindEnumStringIndex(cx, ${val}, %(values)s) {\n" + " Err(_) => { %(handleInvalidEnumValueCode)s },\n" + " Ok(None) => { %(handleInvalidEnumValueCode)s },\n" + " Ok(Some(index)) => {\n" + " //XXXjdm need some range checks up in here.\n" + " ${declName} = cast::transmute(index);\n" + " },\n" + "}" % { "values" : enum + "Values::strings", +"handleInvalidEnumValueCode" : handleInvalidEnumValueCode }) if defaultValue is not None: assert(defaultValue.type.tag() == IDLType.Tags.domstring) diff --git a/src/components/script/dom/bindings/utils.rs b/src/components/script/dom/bindings/utils.rs index 71c82ae86dc..05d84c2f451 100644 --- a/src/components/script/dom/bindings/utils.rs +++ b/src/components/script/dom/bindings/utils.rs @@ -470,29 +470,25 @@ pub fn InitIds(cx: *JSContext, specs: &[JSPropertySpec], ids: &mut [jsid]) -> bo pub fn FindEnumStringIndex(cx: *JSContext, v: JSVal, - values: &[&'static str]) -> Result { + values: &[&'static str]) -> Result, ()> { unsafe { let jsstr = JS_ValueToString(cx, v); if jsstr.is_null() { return Err(()); } + let length = 0; let chars = JS_GetStringCharsAndLength(cx, jsstr, &length); if chars.is_null() { 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 { - return Ok(i); - } - } - - return Err(()); //XXX pass in behaviour for value not found + Ok(values.iter().enumerate().find(|&(_, value)| { + value.len() == length as uint && + range(0, length as int).all(|j| { + value[j] as u16 == *chars.offset(j) + }) + }).map(|(i, _)| i)) } }