Created
March 20, 2014 22:04
-
-
Save jorendorff/9674925 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
if returnType is None or returnType.isVoid(): | |
# Nothing to declare | |
return None, False, None, None | |
if returnType.isPrimitive() and returnType.tag() in builtinNames: | |
result = CGGeneric(builtinNames[returnType.tag()]) | |
if returnType.nullable(): | |
result = CGTemplatedType("Nullable", result) | |
return result, False, None, None | |
if returnType.isDOMString(): | |
if isMember: | |
return CGGeneric("nsString"), True, None, None | |
return CGGeneric("DOMString"), True, None, None | |
if returnType.isByteString(): | |
return CGGeneric("nsCString"), True, None, None | |
if returnType.isEnum(): | |
result = CGGeneric(returnType.unroll().inner.identifier.name) | |
if returnType.nullable(): | |
result = CGTemplatedType("Nullable", result) | |
return result, False, None, None | |
if returnType.isGeckoInterface(): | |
result = CGGeneric(descriptorProvider.getDescriptor( | |
returnType.unroll().inner.identifier.name).nativeType) | |
if descriptorProvider.getDescriptor( | |
returnType.unroll().inner.identifier.name).nativeOwnership == 'owned': | |
result = CGTemplatedType("nsAutoPtr", result) | |
elif resultAlreadyAddRefed: | |
result = CGTemplatedType("nsRefPtr", result) | |
else: | |
result = CGWrapper(result, post="*") | |
return result, False, None, None | |
if returnType.isCallback(): | |
name = returnType.unroll().identifier.name | |
return CGGeneric("nsRefPtr<%s>" % name), False, None, None | |
if returnType.isAny(): | |
return CGGeneric("JS::Value"), False, None, None | |
if returnType.isObject() or returnType.isSpiderMonkeyInterface(): | |
return CGGeneric("JSObject*"), False, None, None | |
if returnType.isSequence(): | |
nullable = returnType.nullable() | |
if nullable: | |
returnType = returnType.inner | |
# If our result is already addrefed, use the right type in the | |
# sequence argument here. | |
(result, _, _, _) = getRetvalDeclarationForType(returnType.inner, | |
descriptorProvider, | |
resultAlreadyAddRefed, | |
isMember="Sequence") | |
# While we have our inner type, set up our rooter, if needed | |
if not isMember and typeNeedsRooting(returnType): | |
rooter = CGGeneric("SequenceRooter<%s > resultRooter(cx, &result);\n" % | |
result.define()) | |
else: | |
rooter = None | |
result = CGTemplatedType("nsTArray", result) | |
if nullable: | |
result = CGTemplatedType("Nullable", result) | |
return result, True, rooter, None | |
if returnType.isDictionary(): | |
nullable = returnType.nullable() | |
dictName = CGDictionary.makeDictionaryName(returnType.unroll().inner) | |
result = CGGeneric(dictName) | |
if not isMember and typeNeedsRooting(returnType): | |
if nullable: | |
result = CGTemplatedType("NullableRootedDictionary", result) | |
else: | |
result = CGTemplatedType("RootedDictionary", result) | |
resultArgs = "cx" | |
else: | |
if nullable: | |
result = CGTemplatedType("Nullable", result) | |
resultArgs = None | |
return result, True, None, resultArgs | |
if returnType.isUnion(): | |
result = CGGeneric(CGUnionStruct.unionTypeName(returnType.unroll(), True)) | |
if not isMember and typeNeedsRooting(returnType): | |
if returnType.nullable(): | |
result = CGTemplatedType("NullableRootedUnion", result) | |
else: | |
result = CGTemplatedType("RootedUnion", result) | |
resultArgs = "cx" | |
else: | |
if returnType.nullable(): | |
result = CGTemplatedType("Nullable", result) | |
resultArgs = None | |
return result, True, None, resultArgs | |
if returnType.isDate(): | |
result = CGGeneric("Date") | |
if returnType.nullable(): | |
result = CGTemplatedType("Nullable", result) | |
return result, False, None, None | |
raise TypeError("Don't know how to declare return value for %s" % | |
returnType) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment