diff options
author | Emilio Cobos Álvarez <ecoal95@gmail.com> | 2016-01-10 17:36:59 +0100 |
---|---|---|
committer | Emilio Cobos Álvarez <ecoal95@gmail.com> | 2016-01-12 18:25:46 +0100 |
commit | 2f1eee599cd56a4533db731f8cdd81ecf939563a (patch) | |
tree | 3f9b1ea5ab1c968528f59da67a6466b6fb0f4b27 /components/script/dom/bindings/codegen | |
parent | e977a6e69a06ad69e87cc235b4ede60f8fb3eca3 (diff) | |
download | servo-2f1eee599cd56a4533db731f8cdd81ecf939563a.tar.gz servo-2f1eee599cd56a4533db731f8cdd81ecf939563a.zip |
codegen: Move conversion behaviour to a common function
Diffstat (limited to 'components/script/dom/bindings/codegen')
-rw-r--r-- | components/script/dom/bindings/codegen/CodegenRust.py | 56 |
1 files changed, 32 insertions, 24 deletions
diff --git a/components/script/dom/bindings/codegen/CodegenRust.py b/components/script/dom/bindings/codegen/CodegenRust.py index 82fcc4581d5..db60cd55459 100644 --- a/components/script/dom/bindings/codegen/CodegenRust.py +++ b/components/script/dom/bindings/codegen/CodegenRust.py @@ -775,20 +775,7 @@ def getJSToNativeConversionInfo(type, descriptorProvider, failureCode=None, raise TypeError("Can't handle SpiderMonkey interface arguments yet") if type.isDOMString(): - assert not isEnforceRange and not isClamp - - treatAs = { - "Default": "StringificationBehavior::Default", - "EmptyString": "StringificationBehavior::Empty", - } - if treatNullAs not in treatAs: - raise TypeError("We don't support [TreatNullAs=%s]" % treatNullAs) - if type.nullable(): - # Note: the actual behavior passed here doesn't matter for nullable - # strings. - nullBehavior = "StringificationBehavior::Default" - else: - nullBehavior = treatAs[treatNullAs] + nullBehavior = getConversionConfigForType(type, isEnforceRange, isClamp, treatNullAs) conversionCode = ( "match FromJSValConvertible::from_jsval(cx, ${val}, %s) {\n" @@ -1002,16 +989,7 @@ def getJSToNativeConversionInfo(type, descriptorProvider, failureCode=None, if not type.isPrimitive(): raise TypeError("Need conversion for argument type '%s'" % str(type)) - if type.isInteger(): - if isEnforceRange: - conversionBehavior = "ConversionBehavior::EnforceRange" - elif isClamp: - conversionBehavior = "ConversionBehavior::Clamp" - else: - conversionBehavior = "ConversionBehavior::Default" - else: - assert not isEnforceRange and not isClamp - conversionBehavior = "()" + conversionBehavior = getConversionConfigForType(type, isEnforceRange, isClamp, treatNullAs) if failureCode is None: failureCode = 'return false' @@ -1215,6 +1193,36 @@ def typeNeedsCx(type, retVal=False): return type.isAny() or type.isObject() +# Returns a conversion behavior suitable for a type +def getConversionConfigForType(type, isEnforceRange, isClamp, treatNullAs): + if type.isSequence(): + return getConversionConfigForType(type.unroll(), isEnforceRange, isClamp, treatNullAs) + if type.isDOMString(): + assert not isEnforceRange and not isClamp + + treatAs = { + "Default": "StringificationBehavior::Default", + "EmptyString": "StringificationBehavior::Empty", + } + if treatNullAs not in treatAs: + raise TypeError("We don't support [TreatNullAs=%s]" % treatNullAs) + if type.nullable(): + # Note: the actual behavior passed here doesn't matter for nullable + # strings. + return "StringificationBehavior::Default" + else: + return treatAs[treatNullAs] + if type.isInteger(): + if isEnforceRange: + return "ConversionBehavior::EnforceRange" + elif isClamp: + return "ConversionBehavior::Clamp" + else: + return "ConversionBehavior::Default" + assert not isEnforceRange and not isClamp + return "()" + + # Returns a CGThing containing the type of the return value. def getRetvalDeclarationForType(returnType, descriptorProvider): if returnType is None or returnType.isVoid(): |