Remove the isOptional argument and the dealWithOptional return value from getJSToNativeConversionTemplate.

Note that dictionaries currently don't support members without default values
right now.

This commit does not change the generated code.
This commit is contained in:
Ms2ger 2014-05-03 15:56:30 +02:00
parent 6ed924f515
commit 30fcf7ed61

View file

@ -275,7 +275,7 @@ class CGMethodCall(CGThing):
# The argument at index distinguishingIndex can't possibly
# be unset here, because we've already checked that argc is
# large enough that we can examine this argument.
template, declType, _, needsRooting = getJSToNativeConversionTemplate(
template, declType, needsRooting = getJSToNativeConversionTemplate(
type, descriptor, failureCode="break;", isDefinitelyObject=True)
testCode = instantiateJSToNativeConversionTemplate(
@ -400,7 +400,6 @@ def typeNeedsRooting(type, descriptorProvider):
def getJSToNativeConversionTemplate(type, descriptorProvider, failureCode=None,
isDefinitelyObject=False,
isMember=False,
isOptional=False,
invalidEnumValueFatal=True,
defaultValue=None,
treatNullAs="Default",
@ -428,9 +427,6 @@ def getJSToNativeConversionTemplate(type, descriptorProvider, failureCode=None,
passing true needs to ensure that it is handled correctly in
typeIsSequenceOrHasSequenceMember.
If isOptional is true, then we are doing conversion of an optional
argument with no default value.
invalidEnumValueFatal controls whether an invalid enum value conversion
attempt will throw (if true) or simply return without doing anything (if
false).
@ -459,11 +455,7 @@ def getJSToNativeConversionTemplate(type, descriptorProvider, failureCode=None,
3) A boolean indicating whether the caller has to do optional-argument handling.
"""
# If we have a defaultValue then we're not actually optional for
# purposes of what we need to be declared as.
assert(defaultValue is None or not isOptional)
# Also, we should not have a defaultValue if we know we're an object
# We should not have a defaultValue if we know we're an object
assert(not isDefinitelyObject or defaultValue is None)
# If exceptionCode is not set, we'll just rethrow the exception we got.
@ -475,18 +467,14 @@ def getJSToNativeConversionTemplate(type, descriptorProvider, failureCode=None,
needsRooting = typeNeedsRooting(type, descriptorProvider)
def handleOptional(template, declType, isOptional, default):
def handleOptional(template, declType, default):
assert (defaultValue is None) == (default is None)
if isOptional:
template = "Some(%s)" % template
declType = CGWrapper(declType, pre="Option<", post=">")
if default is not None:
template = CGIfElseWrapper("${haveValue}",
CGGeneric(template),
CGGeneric(default)).define()
return (template, declType, isOptional, needsRooting)
return (template, declType, needsRooting)
# Unfortunately, .capitalize() on a string will lowercase things inside the
# string, which we do not want.
@ -568,7 +556,7 @@ def getJSToNativeConversionTemplate(type, descriptorProvider, failureCode=None,
" Err(()) => { %s },\n"
"}" % exceptionCode)
return handleOptional(templateBody, declType, isOptional, handleDefaultNull("None"))
return handleOptional(templateBody, declType, handleDefaultNull("None"))
if type.isGeckoInterface():
assert not isEnforceRange and not isClamp
@ -583,7 +571,7 @@ def getJSToNativeConversionTemplate(type, descriptorProvider, failureCode=None,
template = wrapObjectTemplate(conversion, isDefinitelyObject, type,
failureCode)
return handleOptional(template, declType, isOptional, handleDefaultNull("None"))
return handleOptional(template, declType, handleDefaultNull("None"))
descriptorType = descriptor.memberType if isMember else descriptor.nativeType
@ -613,7 +601,7 @@ def getJSToNativeConversionTemplate(type, descriptorProvider, failureCode=None,
templateBody = wrapObjectTemplate(templateBody, isDefinitelyObject,
type, failureCode)
return handleOptional(templateBody, declType, isOptional, handleDefaultNull("None"))
return handleOptional(templateBody, declType, handleDefaultNull("None"))
if type.isSpiderMonkeyInterface():
raise TypeError("Can't handle SpiderMonkey interface arguments yet")
@ -660,7 +648,7 @@ def getJSToNativeConversionTemplate(type, descriptorProvider, failureCode=None,
if type.nullable():
declType = "Option<%s>" % declType
return handleOptional(conversionCode, CGGeneric(declType), isOptional, default)
return handleOptional(conversionCode, CGGeneric(declType), default)
if type.isByteString():
assert not isEnforceRange and not isClamp
@ -675,7 +663,7 @@ def getJSToNativeConversionTemplate(type, descriptorProvider, failureCode=None,
if type.nullable():
declType = CGWrapper(declType, pre="Option<", post=">")
return handleOptional(conversionCode, declType, isOptional, handleDefaultNull("None"))
return handleOptional(conversionCode, declType, handleDefaultNull("None"))
if type.isEnum():
assert not isEnforceRange and not isClamp
@ -707,7 +695,7 @@ def getJSToNativeConversionTemplate(type, descriptorProvider, failureCode=None,
else:
default = None
return handleOptional(template, CGGeneric(enum), isOptional, default)
return handleOptional(template, CGGeneric(enum), default)
if type.isCallback():
assert not isEnforceRange and not isClamp
@ -727,13 +715,13 @@ def getJSToNativeConversionTemplate(type, descriptorProvider, failureCode=None,
"} else {\n"
" ${declName} = NULL;\n"
"}" % haveCallable,
CGGeneric("JSObject*"), isOptional, None, needsRooting)
CGGeneric("JSObject*"), None, needsRooting)
if type.isAny():
assert not isEnforceRange and not isClamp
declType = CGGeneric("JSVal")
return handleOptional("${val}", declType, isOptional, handleDefaultNull("NullValue()"))
return handleOptional("${val}", declType, handleDefaultNull("NullValue()"))
if type.isObject():
raise TypeError("Can't handle object arguments yet")
@ -743,9 +731,6 @@ def getJSToNativeConversionTemplate(type, descriptorProvider, failureCode=None,
raise TypeError("Can't handle dictionaries when failureCode is not None")
# There are no nullable dictionaries
assert not type.nullable()
# All optional dictionaries always have default values, so we
# should be able to assume not isOptional here.
assert not isOptional
typeName = CGDictionary.makeDictionaryName(type.inner)
declType = CGGeneric(typeName)
@ -754,13 +739,12 @@ def getJSToNativeConversionTemplate(type, descriptorProvider, failureCode=None,
" Err(_) => return 0,\n"
"}" % typeName)
return handleOptional(template, declType, isOptional, handleDefaultNull("%s::empty()" % typeName))
return handleOptional(template, declType, handleDefaultNull("%s::empty()" % typeName))
if type.isVoid():
assert not isOptional
# This one only happens for return values, and its easy: Just
# ignore the jsval.
return ("", None, False, False)
return ("", None, False)
if not type.isPrimitive():
raise TypeError("Need conversion for argument type '%s'" % str(type))
@ -798,7 +782,7 @@ def getJSToNativeConversionTemplate(type, descriptorProvider, failureCode=None,
else:
defaultStr = None
return handleOptional(template, declType, isOptional, defaultStr)
return handleOptional(template, declType, defaultStr)
def instantiateJSToNativeConversionTemplate(templateBody, replacements,
declType, declName, needsRooting):
@ -883,19 +867,19 @@ class CGArgumentConverter(CGThing):
if argument.defaultValue:
replacementVariables["haveValue"] = condition
template, declType, dealWithOptional, needsRooting = getJSToNativeConversionTemplate(
template, declType, needsRooting = getJSToNativeConversionTemplate(
argument.type,
descriptorProvider,
isOptional=argument.optional and not argument.defaultValue,
invalidEnumValueFatal=invalidEnumValueFatal,
defaultValue=argument.defaultValue,
treatNullAs=argument.treatNullAs,
isEnforceRange=argument.enforceRange,
isClamp=argument.clamp)
if dealWithOptional:
if argument.optional and not argument.defaultValue:
declType = CGWrapper(declType, pre="Option<", post=">")
template = CGIfElseWrapper(condition,
CGGeneric(template),
CGGeneric("Some(%s)" % template),
CGGeneric("None")).define()
self.converter = instantiateJSToNativeConversionTemplate(
@ -2693,10 +2677,10 @@ def getUnionTypeTemplateVars(type, descriptorProvider):
name = type.name
typeName = "/*" + type.name + "*/"
template, _, _, _ = getJSToNativeConversionTemplate(
template, _, _ = getJSToNativeConversionTemplate(
type, descriptorProvider, failureCode="return Ok(None);",
exceptionCode='return Err(());',
isDefinitelyObject=True, isOptional=False)
isDefinitelyObject=True)
assert not type.isObject()
jsConversion = string.Template(template).substitute({
@ -3344,7 +3328,7 @@ class CGProxySpecialOperation(CGPerSignatureCall):
if operation.isSetter() or operation.isCreator():
# arguments[0] is the index or name of the item that we're setting.
argument = arguments[1]
template, declType, _, needsRooting = getJSToNativeConversionTemplate(
template, declType, needsRooting = getJSToNativeConversionTemplate(
argument.type, descriptor, treatNullAs=argument.treatNullAs)
templateValues = {
"val": "(*desc).value",
@ -3984,7 +3968,6 @@ class CGDictionary(CGThing):
getJSToNativeConversionTemplate(member.type,
descriptorProvider,
isMember=True,
isOptional=(not member.defaultValue),
defaultValue=member.defaultValue,
failureCode="return Err(());",
exceptionCode="return Err(());"))
@ -4074,13 +4057,11 @@ class CGDictionary(CGThing):
return "/* uh oh */ %s" % name
def getMemberType(self, memberInfo):
(member, (templateBody, declType, dealWithOptional, _)) = memberInfo
if dealWithOptional:
declType = CGWrapper(declType, pre="Optional< ", post=" >")
_, (_, declType, _) = memberInfo
return declType.define()
def getMemberConversion(self, memberInfo):
(member, (templateBody, declType, dealWithOptional, _)) = memberInfo
member, (templateBody, declType, _) = memberInfo
replacements = { "val": "value.unwrap()" }
if member.defaultValue:
replacements["haveValue"] = "value.is_some()"
@ -4870,7 +4851,7 @@ class CallbackMember(CGNativeMember):
isCallbackReturnValue = "JSImpl"
else:
isCallbackReturnValue = "Callback"
template, declType, _, needsRooting = getJSToNativeConversionTemplate(
template, declType, needsRooting = getJSToNativeConversionTemplate(
self.retvalType,
self.descriptorProvider,
exceptionCode=self.exceptionCode,