Skip to content

Instantly share code, notes, and snippets.

@jorendorff
Created March 20, 2014 22:04
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save jorendorff/9674925 to your computer and use it in GitHub Desktop.
Save jorendorff/9674925 to your computer and use it in GitHub Desktop.
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