auto merge of #2228 : Ms2ger/servo/object-unwrapping-expressionify, r=jdm

This commit is contained in:
bors-servo 2014-04-25 09:19:14 -04:00
commit 691d82a92f

View file

@ -553,13 +553,13 @@ def getJSToNativeConversionTemplate(type, descriptorProvider, failureCode=None,
if type.nullable(): if type.nullable():
templateBody += ( templateBody += (
"} else if (${val}).is_null_or_undefined() {\n" "} else if (${val}).is_null_or_undefined() {\n"
" ${declName} = None;\n") " None\n")
templateBody += ( templateBody += (
"} else {\n" + "} else {\n" +
CGIndenter(onFailureNotAnObject(failureCode)).define() + CGIndenter(onFailureNotAnObject(failureCode)).define() +
"}") "}")
if type.nullable(): if type.nullable():
templateBody = handleDefaultNull(templateBody, "${declName} = None;") templateBody = handleDefaultNull(templateBody, "None")
else: else:
assert(defaultValue is None) assert(defaultValue is None)
@ -584,19 +584,19 @@ def getJSToNativeConversionTemplate(type, descriptorProvider, failureCode=None,
declType = CGWrapper(declType, pre="Option<", post=" >") declType = CGWrapper(declType, pre="Option<", post=" >")
value = CGWrapper(value, pre="Some(", post=")") value = CGWrapper(value, pre="Some(", post=")")
templateBody = CGGeneric("${declName} = match %s::from_value(cx, ${val}) {\n" templateBody = CGGeneric("match %s::from_value(cx, ${val}) {\n"
" Err(()) => { %s },\n" " Err(()) => { %s },\n"
" Ok(value) => %s,\n" " Ok(value) => %s,\n"
"};" % (type.name, exceptionCode, value.define())) "}" % (type.name, exceptionCode, value.define()))
if type.nullable(): if type.nullable():
templateBody = CGIfElseWrapper( templateBody = CGIfElseWrapper(
"(${val}).is_null_or_undefined()", "(${val}).is_null_or_undefined()",
CGGeneric("${declName} = None;"), CGGeneric("None"),
templateBody) templateBody)
templateBody = handleDefaultNull(templateBody.define(), templateBody = handleDefaultNull(templateBody.define(),
"${declName} = None;") "None")
return (templateBody, declType, None, isOptional, "None" if isOptional else None) return (templateBody, declType, None, isOptional, "None" if isOptional else None)
@ -609,7 +609,7 @@ def getJSToNativeConversionTemplate(type, descriptorProvider, failureCode=None,
if descriptor.interface.isCallback(): if descriptor.interface.isCallback():
name = descriptor.nativeType name = descriptor.nativeType
declType = CGGeneric("Option<%s>" % name); declType = CGGeneric("Option<%s>" % name);
conversion = ("${declName} = Some(%s::new((${val}).to_object()));" % name) conversion = ("Some(%s::new((${val}).to_object()))" % name)
template = wrapObjectTemplate(conversion, isDefinitelyObject, type, template = wrapObjectTemplate(conversion, isDefinitelyObject, type,
failureCode) failureCode)
@ -621,19 +621,17 @@ def getJSToNativeConversionTemplate(type, descriptorProvider, failureCode=None,
"argument" % descriptor.interface.identifier.name) "argument" % descriptor.interface.identifier.name)
templateBody = "${declName} = "
if failureCode is not None: if failureCode is not None:
templateBody += str(CastableObjectUnwrapper( templateBody = str(CastableObjectUnwrapper(
descriptor, descriptor,
"(${val}).to_object()", "(${val}).to_object()",
failureCode, failureCode,
isOptional or type.nullable())) isOptional or type.nullable()))
else: else:
templateBody += str(FailureFatalCastableObjectUnwrapper( templateBody = str(FailureFatalCastableObjectUnwrapper(
descriptor, descriptor,
"(${val}).to_object()", "(${val}).to_object()",
isOptional or type.nullable())) isOptional or type.nullable()))
templateBody += ";\n"
templateBody = wrapObjectTemplate(templateBody, isDefinitelyObject, templateBody = wrapObjectTemplate(templateBody, isDefinitelyObject,
type, failureCode) type, failureCode)
@ -667,17 +665,17 @@ def getJSToNativeConversionTemplate(type, descriptorProvider, failureCode=None,
strval = "Some(%s)" % strval strval = "Some(%s)" % strval
conversionCode = ( conversionCode = (
"${declName} = match FromJSValConvertible::from_jsval(cx, ${val}, %s) {\n" "match FromJSValConvertible::from_jsval(cx, ${val}, %s) {\n"
" Ok(strval) => %s,\n" " Ok(strval) => %s,\n"
" Err(_) => { %s },\n" " Err(_) => { %s },\n"
"};" % (nullBehavior, strval, exceptionCode)) "}" % (nullBehavior, strval, exceptionCode))
if defaultValue is None: if defaultValue is None:
return conversionCode return conversionCode
if isinstance(defaultValue, IDLNullValue): if isinstance(defaultValue, IDLNullValue):
assert(type.nullable()) assert(type.nullable())
return handleDefault(conversionCode, "${declName} = None;") return handleDefault(conversionCode, "None")
value = "str::from_utf8(data).unwrap().to_owned()" value = "str::from_utf8(data).unwrap().to_owned()"
if type.nullable(): if type.nullable():
@ -685,7 +683,7 @@ def getJSToNativeConversionTemplate(type, descriptorProvider, failureCode=None,
default = ( default = (
"static data: [u8, ..%s] = [ %s ];\n" "static data: [u8, ..%s] = [ %s ];\n"
"${declName} = %s;" % "%s" %
(len(defaultValue.value) + 1, (len(defaultValue.value) + 1,
", ".join(["'" + char + "' as u8" for char in defaultValue.value] + ["0"]), ", ".join(["'" + char + "' as u8" for char in defaultValue.value] + ["0"]),
value)) value))
@ -702,8 +700,7 @@ def getJSToNativeConversionTemplate(type, descriptorProvider, failureCode=None,
initialValue = "None" initialValue = "None"
return ( return (
"%s\n" % getConversionCode(isOptional),
(getConversionCode(isOptional)),
CGGeneric(declType), None, #CGGeneric("FakeDependentString"), CGGeneric(declType), None, #CGGeneric("FakeDependentString"),
False, False,
initialValue) initialValue)
@ -726,7 +723,7 @@ def getJSToNativeConversionTemplate(type, descriptorProvider, failureCode=None,
" Ok(None) => { %(handleInvalidEnumValueCode)s },\n" " Ok(None) => { %(handleInvalidEnumValueCode)s },\n"
" Ok(Some(index)) => {\n" " Ok(Some(index)) => {\n"
" //XXXjdm need some range checks up in here.\n" " //XXXjdm need some range checks up in here.\n"
" ${declName} = cast::transmute(index);\n" " cast::transmute(index)\n"
" },\n" " },\n"
"}" % { "values" : enum + "Values::strings", "}" % { "values" : enum + "Values::strings",
"exceptionCode" : exceptionCode, "exceptionCode" : exceptionCode,
@ -735,7 +732,7 @@ def getJSToNativeConversionTemplate(type, descriptorProvider, failureCode=None,
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 = handleDefault(template, template = handleDefault(template,
("${declName} = %sValues::%s;" % ("%sValues::%s" %
(enum, (enum,
getEnumValueName(defaultValue.value)))) getEnumValueName(defaultValue.value))))
@ -770,10 +767,7 @@ def getJSToNativeConversionTemplate(type, descriptorProvider, failureCode=None,
declType = CGWrapper(declType, pre="Option<", post=">") declType = CGWrapper(declType, pre="Option<", post=">")
value = CGWrapper(value, pre="Some(", post=")") value = CGWrapper(value, pre="Some(", post=")")
templateBody = "${declName} = %s;" % value.define() templateBody = handleDefaultNull(value.define(), "NullValue()")
templateBody = handleDefaultNull(templateBody,
"${declName} = NullValue();")
return (templateBody, declType, None, isOptional, "None" if isOptional else None) return (templateBody, declType, None, isOptional, "None" if isOptional else None)
if type.isObject(): if type.isObject():
@ -800,10 +794,10 @@ def getJSToNativeConversionTemplate(type, descriptorProvider, failureCode=None,
else: else:
val = "${val}" val = "${val}"
template = ("${declName} = match %s::new(cx, %s) {\n" template = ("match %s::new(cx, %s) {\n"
" Ok(dictionary) => dictionary,\n" " Ok(dictionary) => dictionary,\n"
" Err(_) => return 0,\n" " Err(_) => return 0,\n"
"};" % (typeName, val)) "}" % (typeName, val))
return (template, declType, None, False, None) return (template, declType, None, False, None)
@ -832,10 +826,10 @@ def getJSToNativeConversionTemplate(type, descriptorProvider, failureCode=None,
#XXXjdm support conversionBehavior here #XXXjdm support conversionBehavior here
template = ( template = (
"${declName} = match FromJSValConvertible::from_jsval(cx, ${val}, ()) {\n" "match FromJSValConvertible::from_jsval(cx, ${val}, ()) {\n"
" Ok(v) => %s,\n" " Ok(v) => %s,\n"
" Err(_) => { %s }\n" " Err(_) => { %s }\n"
"};" % (value, exceptionCode)) "}" % (value, exceptionCode))
if defaultValue is not None: if defaultValue is not None:
if isinstance(defaultValue, IDLNullValue): if isinstance(defaultValue, IDLNullValue):
@ -844,7 +838,7 @@ def getJSToNativeConversionTemplate(type, descriptorProvider, failureCode=None,
else: else:
tag = defaultValue.type.tag() tag = defaultValue.type.tag()
if tag in numericTags: if tag in numericTags:
defaultStr = defaultValue.value defaultStr = str(defaultValue.value)
else: else:
assert(tag == IDLType.Tags.bool) assert(tag == IDLType.Tags.bool)
defaultStr = toStringBool(defaultValue.value) defaultStr = toStringBool(defaultValue.value)
@ -854,7 +848,7 @@ def getJSToNativeConversionTemplate(type, descriptorProvider, failureCode=None,
template = CGIfElseWrapper("${haveValue}", template = CGIfElseWrapper("${haveValue}",
CGGeneric(template), CGGeneric(template),
CGGeneric("${declName} = %s;" % defaultStr)).define() CGGeneric(defaultStr)).define()
return (template, declType, None, isOptional, "None" if isOptional else None) return (template, declType, None, isOptional, "None" if isOptional else None)
@ -898,20 +892,22 @@ def instantiateJSToNativeConversionTemplate(templateTuple, replacements,
tmpresult += [CGGeneric(";")] tmpresult += [CGGeneric(";")]
result.append(CGList(tmpresult)) result.append(CGList(tmpresult))
originalDeclName = replacements["declName"] conversion = CGGeneric(
string.Template(templateBody).substitute(replacements)
)
if declType is not None: if declType is not None:
newDecl = [CGGeneric("let mut "), newDecl = [CGGeneric("let mut "),
CGGeneric(originalDeclName), CGGeneric(replacements["declName"]),
CGGeneric(": "), CGGeneric(": "),
declType] declType]
if initialValue: if initialValue:
newDecl.append(CGGeneric(" = " + initialValue)) newDecl.append(CGGeneric(" = " + initialValue))
newDecl.append(CGGeneric(";")) newDecl.append(CGGeneric(";"))
result.append(CGList(newDecl)) result.append(CGList(newDecl))
conversion = CGWrapper(conversion,
conversion = CGGeneric( pre="%s = " % replacements["declName"],
string.Template(templateBody).substitute(replacements) post=";")
)
if argcAndIndex is not None: if argcAndIndex is not None:
declConstruct = None declConstruct = None
@ -2839,12 +2835,9 @@ def getUnionTypeTemplateVars(type, descriptorProvider):
jsConversion = string.Template(template).substitute({ jsConversion = string.Template(template).substitute({
"val": "value", "val": "value",
"valPtr": None, "valPtr": None,
"declName": "retval",
"holderName": None, "holderName": None,
}) })
jsConversion = CGWrapper(CGGeneric(jsConversion), jsConversion = CGWrapper(CGGeneric(jsConversion), pre="Ok(Some(", post="))")
pre="let retval;\n",
post="\nOk(Some(retval))")
return { return {
"name": name, "name": name,
@ -4136,31 +4129,17 @@ class CGDictionary(CGThing):
else: else:
initParent = "" initParent = ""
memberInits = [CGIndenter(self.getMemberConversion(m), indentLevel=6).define() def memberInit(memberInfo):
for m in self.memberInfo] member, _ = memberInfo
name = self.makeMemberName(member.identifier.name)
conversion = self.getMemberConversion(memberInfo)
return CGGeneric("%s: %s,\n" % (name, conversion.define()))
def defaultValue(ty): memberInits = CGList([memberInit(m) for m in self.memberInfo])
if ty is "bool":
return "false"
elif ty in ["i32", "u32", "i16", "u16"]:
return "0"
elif ty == "DOMString":
return '~""'
elif ty.startswith("Option"):
return "None"
elif ty == "JSVal":
return "UndefinedValue()"
else:
return "/* uh oh: %s */" % ty
return string.Template( return string.Template(
"impl ${selfName} {\n" "impl ${selfName} {\n"
" pub fn new(cx: *JSContext, val: JSVal) -> Result<${selfName}, ()> {\n" " pub fn new(cx: *JSContext, val: JSVal) -> Result<${selfName}, ()> {\n"
" let mut result = ${selfName} {\n"
"${initParent}" +
"\n".join(" %s: %s," % (self.makeMemberName(m[0].identifier.name), defaultValue(self.getMemberType(m))) for m in self.memberInfo) + "\n"
" };\n"
"\n"
" let object = if val.is_null_or_undefined() {\n" " let object = if val.is_null_or_undefined() {\n"
" ptr::null()\n" " ptr::null()\n"
" } else if val.is_object() {\n" " } else if val.is_object() {\n"
@ -4169,15 +4148,15 @@ class CGDictionary(CGThing):
" //XXXjdm throw properly here\n" " //XXXjdm throw properly here\n"
" return Err(());\n" " return Err(());\n"
" };\n" " };\n"
" unsafe {\n" " Ok(${selfName} {\n"
"${initMembers}\n" "${initParent}"
" }\n" "${initMembers}"
" Ok(result)\n" " })\n"
" }\n" " }\n"
"}").substitute({ "}").substitute({
"selfName": self.makeClassName(d), "selfName": self.makeClassName(d),
"initParent": CGIndenter(CGGeneric(initParent), indentLevel=6).define(), "initParent": CGIndenter(CGGeneric(initParent), indentLevel=6).define(),
"initMembers": "\n\n".join(memberInits), "initMembers": CGIndenter(memberInits, indentLevel=6).define(),
}) })
@staticmethod @staticmethod
@ -4208,16 +4187,9 @@ class CGDictionary(CGThing):
def getMemberConversion(self, memberInfo): def getMemberConversion(self, memberInfo):
(member, (templateBody, declType, (member, (templateBody, declType,
holderType, dealWithOptional, initialValue)) = memberInfo holderType, dealWithOptional, initialValue)) = memberInfo
replacements = { "val": "value.unwrap()", replacements = { "val": "value.unwrap()" }
"declName": ("result.%s" % self.makeMemberName(member.identifier.name)),
# We need a holder name for external interfaces, but
# it's scoped down to the conversion so we can just use
# anything we want.
"holderName": "holder"}
# We can't handle having a holderType here # We can't handle having a holderType here
assert holderType is None assert holderType is None
if dealWithOptional:
replacements["declName"] = "(" + replacements["declName"] + ".Value())"
if member.defaultValue: if member.defaultValue:
replacements["haveValue"] = "value.is_some()" replacements["haveValue"] = "value.is_some()"
@ -4235,7 +4207,7 @@ class CGDictionary(CGThing):
" Ok(value) => {\n" " Ok(value) => {\n"
"%s\n" "%s\n"
" },\n" " },\n"
"}\n") % (propName, conversion) "}") % (propName, conversion)
return CGGeneric(conversion) return CGGeneric(conversion)