mirror of
https://github.com/servo/servo.git
synced 2025-06-12 18:34:39 +00:00
Implement a cleaner way of dealing with optional arguments in codegen and use it for primitive types.
This puts the Some constructor outside the match, making the actual generating code independent of the optionality of the argument.
This commit is contained in:
parent
35f6a24de7
commit
b264c65f2e
1 changed files with 13 additions and 8 deletions
|
@ -494,6 +494,16 @@ def getJSToNativeConversionTemplate(type, descriptorProvider, failureCode=None,
|
|||
if exceptionCode is None:
|
||||
exceptionCode = "return 0;"
|
||||
|
||||
def handleOptional(template, declType, isOptional):
|
||||
if isOptional:
|
||||
template = "Some(%s)" % template
|
||||
declType = CGWrapper(declType, pre="Option<", post=">")
|
||||
initialValue = "None"
|
||||
else:
|
||||
initialValue = None
|
||||
|
||||
return (template, declType, isOptional, initialValue)
|
||||
|
||||
# Unfortunately, .capitalize() on a string will lowercase things inside the
|
||||
# string, which we do not want.
|
||||
def firstCap(string):
|
||||
|
@ -800,21 +810,16 @@ def getJSToNativeConversionTemplate(type, descriptorProvider, failureCode=None,
|
|||
if failureCode is None:
|
||||
failureCode = 'return 0'
|
||||
|
||||
value = "v"
|
||||
declType = CGGeneric(builtinNames[type.tag()])
|
||||
if type.nullable():
|
||||
declType = CGWrapper(declType, pre="Option<", post=">")
|
||||
|
||||
if isOptional:
|
||||
value = "Some(%s)" % value
|
||||
declType = CGWrapper(declType, pre="Option<", post=">")
|
||||
|
||||
#XXXjdm support conversionBehavior here
|
||||
template = (
|
||||
"match FromJSValConvertible::from_jsval(cx, ${val}, ()) {\n"
|
||||
" Ok(v) => %s,\n"
|
||||
" Ok(v) => v,\n"
|
||||
" Err(_) => { %s }\n"
|
||||
"}" % (value, exceptionCode))
|
||||
"}" % exceptionCode)
|
||||
|
||||
if defaultValue is not None:
|
||||
if isinstance(defaultValue, IDLNullValue):
|
||||
|
@ -835,7 +840,7 @@ def getJSToNativeConversionTemplate(type, descriptorProvider, failureCode=None,
|
|||
CGGeneric(template),
|
||||
CGGeneric(defaultStr)).define()
|
||||
|
||||
return (template, declType, isOptional, "None" if isOptional else None)
|
||||
return handleOptional(template, declType, isOptional)
|
||||
|
||||
def instantiateJSToNativeConversionTemplate(templateTuple, replacements,
|
||||
argcAndIndex=None):
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue