Clean up TrySetTo interface to avoid mutable outrefs.

This commit is contained in:
Josh Matthews 2014-02-19 13:20:04 -05:00
parent d590a327bd
commit 9f05f70754

View file

@ -726,7 +726,7 @@ for (uint32_t i = 0; i < length; ++i) {
name = memberType.inner.identifier.name name = memberType.inner.identifier.name
else: else:
name = memberType.name name = memberType.name
interfaceObject.append(CGGeneric("({failed = !%s.TrySetTo%s(cx, ${val}, ${valPtr}, &mut tryNext); failed}) || !tryNext" % (unionArgumentObj, name))) interfaceObject.append(CGGeneric("{res = %s.TrySetTo%s(cx, ${val}, ${valPtr}); res.is_err() || !res.unwrap()}" % (unionArgumentObj, name)))
names.append(name) names.append(name)
interfaceObject = CGWrapper(CGList(interfaceObject, " ||\n"), pre="done = ", post=";\n", reindent=True) interfaceObject = CGWrapper(CGList(interfaceObject, " ||\n"), pre="done = ", post=";\n", reindent=True)
else: else:
@ -737,7 +737,7 @@ for (uint32_t i = 0; i < length; ++i) {
assert len(arrayObjectMemberTypes) == 1 assert len(arrayObjectMemberTypes) == 1
memberType = arrayObjectMemberTypes[0] memberType = arrayObjectMemberTypes[0]
name = memberType.name name = memberType.name
arrayObject = CGGeneric("done = ({failed = !%s.TrySetTo%s(cx, ${val}, ${valPtr}, &mut tryNext); failed}) || !tryNext;" % (unionArgumentObj, name)) arrayObject = CGGeneric("done = {res = %s.TrySetTo%s(cx, ${val}, ${valPtr}); res.is_err() || !res.unwrap()};" % (unionArgumentObj, name))
# XXX Now we're supposed to check for an array or a platform object # XXX Now we're supposed to check for an array or a platform object
# that supports indexed properties... skip that last for now. It's a # that supports indexed properties... skip that last for now. It's a
# bit of a pain. # bit of a pain.
@ -767,7 +767,7 @@ for (uint32_t i = 0; i < length; ++i) {
assert len(callbackMemberTypes) == 1 assert len(callbackMemberTypes) == 1
memberType = callbackMemberTypes[0] memberType = callbackMemberTypes[0]
name = memberType.name name = memberType.name
callbackObject = CGGeneric("done = ({failed = !%s.TrySetTo%s(cx, ${val}, ${valPtr}, &mut tryNext); failed}) || !tryNext;" % (unionArgumentObj, name)) callbackObject = CGGeneric("done = {res = %s.TrySetTo%s(cx, ${val}, ${valPtr}); res.is_err() || !res.unwrap()};" % (unionArgumentObj, name))
names.append(name) names.append(name)
else: else:
callbackObject = None callbackObject = None
@ -837,7 +837,7 @@ for (uint32_t i = 0; i < length; ++i) {
name = memberType.inner.identifier.name name = memberType.inner.identifier.name
else: else:
name = memberType.name name = memberType.name
other = CGGeneric("done = ({failed = !%s.TrySetTo%s(cx, ${val}, ${valPtr}, &mut tryNext); failed}) || !tryNext;" % (unionArgumentObj, name)) other = CGGeneric("done = {res = %s.TrySetTo%s(cx, ${val}, ${valPtr}); res.is_err() || !res.unwrap()};" % (unionArgumentObj, name))
names.append(name) names.append(name)
if hasObjectTypes: if hasObjectTypes:
other = CGWrapper(CGIndenter(other), "{\n", post="\n}") other = CGWrapper(CGIndenter(other), "{\n", post="\n}")
@ -851,9 +851,8 @@ for (uint32_t i = 0; i < length; ++i) {
other = None other = None
templateBody = CGWrapper(templateBody, pre="let mut done = false;\n" templateBody = CGWrapper(templateBody, pre="let mut done = false;\n"
"let mut failed = false;\n" "let mut res = Ok(true);\n")
"let mut tryNext = false;\n") throw = CGGeneric("if res.is_err() {\n"
throw = CGGeneric("if failed {\n"
" return 0;\n" " return 0;\n"
"}\n" "}\n"
"if !done {\n" "if !done {\n"
@ -3784,8 +3783,7 @@ def getUnionTypeTemplateVars(type, descriptorProvider):
typeName = "/*" + type.name + "*/" typeName = "/*" + type.name + "*/"
tryNextCode = """{ tryNextCode = """{
*tryNext = true; return Ok(true);
return true;
}""" }"""
if type.isGeckoInterface(): if type.isGeckoInterface():
tryNextCode = ("""/*if (mUnion.mType != mUnion.eUninitialized) { tryNextCode = ("""/*if (mUnion.mType != mUnion.eUninitialized) {
@ -3818,10 +3816,9 @@ def getUnionTypeTemplateVars(type, descriptorProvider):
) )
jsConversion = CGWrapper(CGGeneric(jsConversion), jsConversion = CGWrapper(CGGeneric(jsConversion),
post="\n" post="\n"
"return true;") "return Ok(true);")
setter = CGWrapper(CGIndenter(jsConversion), setter = CGWrapper(CGIndenter(jsConversion),
pre="pub fn TrySetTo" + name + "(&mut self, cx: *JSContext, value: JSVal, pvalue: *JSVal, tryNext: &mut bool) -> bool {\n" pre="pub fn TrySetTo" + name + "(&mut self, cx: *JSContext, value: JSVal, pvalue: *JSVal) -> Result<bool,()> {\n",
" *tryNext = false;\n",
post="\n" post="\n"
"}") "}")