From 4ba093939a741d0ce01eaa5410a1c842a2baf219 Mon Sep 17 00:00:00 2001 From: Ms2ger Date: Thu, 20 Mar 2014 09:21:59 +0100 Subject: [PATCH 1/7] Remove unused import of std::intrinsics::uninit. --- src/components/script/dom/bindings/codegen/CodegenRust.py | 1 - 1 file changed, 1 deletion(-) diff --git a/src/components/script/dom/bindings/codegen/CodegenRust.py b/src/components/script/dom/bindings/codegen/CodegenRust.py index ff6c37fd78b..598caed16ed 100644 --- a/src/components/script/dom/bindings/codegen/CodegenRust.py +++ b/src/components/script/dom/bindings/codegen/CodegenRust.py @@ -4820,7 +4820,6 @@ class CGBindingRoot(CGThing): 'std::vec', 'std::str', 'std::num', - 'std::intrinsics::uninit', ]) # Add the auto-generated comment. From 022dfa0a5efcf5452df75a366aa3c98fb6020c62 Mon Sep 17 00:00:00 2001 From: Ms2ger Date: Thu, 20 Mar 2014 09:31:10 +0100 Subject: [PATCH 2/7] Remove the preSuccess and postSuccess arguments to getJSToNativeConversionTemplate. They were used for unions until 06f9afdad52cba426aedd45d0e08a7b2bdecc8f4. --- .../dom/bindings/codegen/CodegenRust.py | 23 +++++-------------- 1 file changed, 6 insertions(+), 17 deletions(-) diff --git a/src/components/script/dom/bindings/codegen/CodegenRust.py b/src/components/script/dom/bindings/codegen/CodegenRust.py index 598caed16ed..0b0e1471777 100644 --- a/src/components/script/dom/bindings/codegen/CodegenRust.py +++ b/src/components/script/dom/bindings/codegen/CodegenRust.py @@ -92,13 +92,8 @@ class CastableObjectUnwrapper(): codeOnFailure is the code to run if unwrapping fails. """ - def __init__(self, descriptor, source, target, codeOnFailure, isOptional=False, - preUnwrapped=None, postUnwrapped=None): + def __init__(self, descriptor, source, target, codeOnFailure, isOptional=False): assert descriptor.castable - - unwrappedVal = "val" - if preUnwrapped or postUnwrapped: - unwrappedVal = preUnwrapped + unwrappedVal + postUnwrapped self.substitution = { "type" : descriptor.nativeType, "depth": descriptor.interface.inheritanceDepth(), "prototype": "PrototypeList::id::" + descriptor.name, @@ -106,7 +101,7 @@ class CastableObjectUnwrapper(): "source" : source, "target" : target, "codeOnFailure" : CGIndenter(CGGeneric(codeOnFailure), 4).define(), - "unwrapped_val" : ("Some(%s)" % unwrappedVal) if isOptional else unwrappedVal, + "unwrapped_val" : "Some(val)" if isOptional else "val", "unwrapFn": "unwrap_jsmanaged" if 'JS' in descriptor.nativeType else "unwrap_object"} def __str__(self): @@ -428,9 +423,7 @@ def getJSToNativeConversionTemplate(type, descriptorProvider, failureCode=None, isClamp=False, exceptionCode=None, isCallbackReturnValue=False, - sourceDescription="value", - preSuccess=None, - postSuccess=None): + sourceDescription="value"): """ Get a template for converting a JS value to a native object based on the given type and descriptor. If failureCode is given, then we're actually @@ -654,8 +647,7 @@ def getJSToNativeConversionTemplate(type, descriptorProvider, failureCode=None, "(${val}).to_object()", "${declName}", failureCode, - isOptional or type.nullable(), - preUnwrapped=preSuccess, postUnwrapped=postSuccess)) + isOptional or type.nullable())) else: templateBody += str(FailureFatalCastableObjectUnwrapper( descriptor, @@ -886,15 +878,12 @@ def getJSToNativeConversionTemplate(type, descriptorProvider, failureCode=None, if failureCode is None: failureCode = 'return 0' - successVal = "v" - if preSuccess or postSuccess: - successVal = preSuccess + successVal + postSuccess #XXXjdm support conversionBehavior here template = ( "match FromJSValConvertible::from_jsval(cx, ${val}, ()) {\n" - " Ok(v) => ${declName} = %s,\n" + " Ok(v) => ${declName} = v,\n" " Err(_) => { %s }\n" - "}" % (successVal, exceptionCode)) + "}" % exceptionCode) declType = CGGeneric(builtinNames[type.tag()]) if type.nullable(): From 904e8eaf17be075438ef1faf4ba6b57447135071 Mon Sep 17 00:00:00 2001 From: Ms2ger Date: Thu, 20 Mar 2014 20:27:30 +0100 Subject: [PATCH 3/7] Remove the codeToSetNull argument to wrapObjectTemplate. --- .../script/dom/bindings/codegen/CodegenRust.py | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/src/components/script/dom/bindings/codegen/CodegenRust.py b/src/components/script/dom/bindings/codegen/CodegenRust.py index 0b0e1471777..9f3974d23f1 100644 --- a/src/components/script/dom/bindings/codegen/CodegenRust.py +++ b/src/components/script/dom/bindings/codegen/CodegenRust.py @@ -556,7 +556,7 @@ def getJSToNativeConversionTemplate(type, descriptorProvider, failureCode=None, # A helper function for wrapping up the template body for # possibly-nullable objecty stuff def wrapObjectTemplate(templateBody, isDefinitelyObject, type, - codeToSetNull, failureCode=None): + failureCode=None): if not isDefinitelyObject: # Handle the non-object cases by wrapping up the whole # thing in an if cascade. @@ -566,13 +566,13 @@ def getJSToNativeConversionTemplate(type, descriptorProvider, failureCode=None, if type.nullable(): templateBody += ( "} else if (${val}).is_null_or_undefined() {\n" - " %s;\n" % codeToSetNull) + " ${declName} = None;\n") templateBody += ( "} else {\n" + CGIndenter(onFailureNotAnObject(failureCode)).define() + "}") if type.nullable(): - templateBody = handleDefaultNull(templateBody, codeToSetNull) + templateBody = handleDefaultNull(templateBody, "${declName} = None") else: assert(defaultValue is None) @@ -625,7 +625,6 @@ def getJSToNativeConversionTemplate(type, descriptorProvider, failureCode=None, conversion = ("${declName} = Some(%s::new((${val}).to_object()));" % name) template = wrapObjectTemplate(conversion, isDefinitelyObject, type, - "${declName} = None", failureCode) return (template, declType, None, isOptional, None) @@ -667,8 +666,7 @@ def getJSToNativeConversionTemplate(type, descriptorProvider, failureCode=None, "}\n") templateBody = wrapObjectTemplate(templateBody, isDefinitelyObject, - type, "${declName} = None", - failureCode) + type, failureCode) declType = CGGeneric(typePtr) if type.nullable() or isOptional: From ad086ba7daee62b96b328f3b48f733a372ccc716 Mon Sep 17 00:00:00 2001 From: Ms2ger Date: Thu, 20 Mar 2014 20:32:16 +0100 Subject: [PATCH 4/7] Use CGIfElseWrapper in a few more places. --- .../dom/bindings/codegen/CodegenRust.py | 32 +++++++------------ 1 file changed, 12 insertions(+), 20 deletions(-) diff --git a/src/components/script/dom/bindings/codegen/CodegenRust.py b/src/components/script/dom/bindings/codegen/CodegenRust.py index 9f3974d23f1..2895c66a677 100644 --- a/src/components/script/dom/bindings/codegen/CodegenRust.py +++ b/src/components/script/dom/bindings/codegen/CodegenRust.py @@ -536,14 +536,9 @@ def getJSToNativeConversionTemplate(type, descriptorProvider, failureCode=None, def handleDefault(template, setDefault): if defaultValue is None: return template - return CGWrapper( - CGIndenter(CGGeneric(template)), - pre="if ${haveValue} {\n", - post=("\n" - "} else {\n" - "%s;\n" - "}" % - CGIndenter(CGGeneric(setDefault)).define())).define() + return CGIfElseWrapper("${haveValue}", + CGGeneric(template), + CGGeneric(setDefault)).define() # A helper function for handling null default values. Much like # handleDefault, but checks that the default value, if it exists, is null. @@ -572,7 +567,7 @@ def getJSToNativeConversionTemplate(type, descriptorProvider, failureCode=None, CGIndenter(onFailureNotAnObject(failureCode)).define() + "}") if type.nullable(): - templateBody = handleDefaultNull(templateBody, "${declName} = None") + templateBody = handleDefaultNull(templateBody, "${declName} = None;") else: assert(defaultValue is None) @@ -609,7 +604,7 @@ def getJSToNativeConversionTemplate(type, descriptorProvider, failureCode=None, templateBody) templateBody = handleDefaultNull(templateBody.define(), - "${declName} = None") + "${declName} = None;") return (templateBody, declType, None, isOptional, "None" if isOptional else None) @@ -708,7 +703,7 @@ def getJSToNativeConversionTemplate(type, descriptorProvider, failureCode=None, if isinstance(defaultValue, IDLNullValue): assert(type.nullable()) return handleDefault(conversionCode, - "${declName}.SetNull()") + "${declName}.SetNull();") value = "str::from_utf8(data).unwrap().to_owned()" if type.nullable(): @@ -716,7 +711,7 @@ def getJSToNativeConversionTemplate(type, descriptorProvider, failureCode=None, default = ( "static data: [u8, ..%s] = [ %s ];\n" - "${declName} = %s" % + "${declName} = %s;" % (len(defaultValue.value) + 1, ", ".join(["'" + char + "' as u8" for char in defaultValue.value] + ["0"]), value)) @@ -776,7 +771,7 @@ def getJSToNativeConversionTemplate(type, descriptorProvider, failureCode=None, assert(defaultValue.type.tag() == IDLType.Tags.domstring) template = "" #XXXjdm unfinished #template = handleDefault(template, - # ("${declName} = %sValues::%s" % + # ("${declName} = %sValues::%s;" % # (enum, # getEnumValueName(defaultValue.value)))) return (template, CGGeneric(enum), None, isOptional, None) @@ -816,7 +811,7 @@ def getJSToNativeConversionTemplate(type, descriptorProvider, failureCode=None, templateBody = "${declName} = %s;" % value.define() templateBody = handleDefaultNull(templateBody, - "${declName} = NullValue()") + "${declName} = NullValue();") return (templateBody, declType, None, isOptional, "None" if isOptional else None) @@ -905,12 +900,9 @@ def getJSToNativeConversionTemplate(type, descriptorProvider, failureCode=None, if type.nullable(): defaultStr = "Some(%s)" % defaultStr - template = CGWrapper(CGIndenter(CGGeneric(template)), - pre="if ${haveValue} {\n", - post=("\n" - "} else {\n" - " ${declName} = %s;\n" - "}" % defaultStr)).define() + template = CGIfElseWrapper("${haveValue}", + CGGeneric(template), + CGGeneric("${declName} = %s;" % defaultStr)).define() return (template, declType, None, isOptional, "None" if isOptional else None) From eec2e10d9c4247d3a4eb52d442aea230a6f24ab0 Mon Sep 17 00:00:00 2001 From: Ms2ger Date: Thu, 20 Mar 2014 20:34:52 +0100 Subject: [PATCH 5/7] Remove the declareResult argument to CGCallGenerator's constructor. --- src/components/script/dom/bindings/codegen/CodegenRust.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/components/script/dom/bindings/codegen/CodegenRust.py b/src/components/script/dom/bindings/codegen/CodegenRust.py index 2895c66a677..2f341fcc39e 100644 --- a/src/components/script/dom/bindings/codegen/CodegenRust.py +++ b/src/components/script/dom/bindings/codegen/CodegenRust.py @@ -2386,7 +2386,7 @@ class CGCallGenerator(CGThing): """ def __init__(self, errorReport, arguments, argsPre, returnType, extendedAttributes, descriptorProvider, nativeMethodName, - static, object="this", declareResult=True): + static, object="this"): CGThing.__init__(self) assert errorReport is None or isinstance(errorReport, CGThing) @@ -2429,7 +2429,7 @@ class CGCallGenerator(CGThing): self.cgRoot.prepend(CGWrapper(result if result is not None else CGGeneric("()"), pre="let mut result_fallible: Result<", post=",Error>;")) - if result is not None and declareResult: + if result is not None: result = CGWrapper(result, pre="let mut result: ", post=";") self.cgRoot.prepend(result) From 322893009d1b306f62666863ee1bb29f86562a05 Mon Sep 17 00:00:00 2001 From: Ms2ger Date: Thu, 20 Mar 2014 21:06:55 +0100 Subject: [PATCH 6/7] Make the result and result_fallible variables immutable. --- src/components/script/dom/bindings/codegen/CodegenRust.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/components/script/dom/bindings/codegen/CodegenRust.py b/src/components/script/dom/bindings/codegen/CodegenRust.py index 2f341fcc39e..61f3cbd8e24 100644 --- a/src/components/script/dom/bindings/codegen/CodegenRust.py +++ b/src/components/script/dom/bindings/codegen/CodegenRust.py @@ -2427,10 +2427,10 @@ class CGCallGenerator(CGThing): if isFallible: self.cgRoot.prepend(CGWrapper(result if result is not None else CGGeneric("()"), - pre="let mut result_fallible: Result<", post=",Error>;")) + pre="let result_fallible: Result<", post=",Error>;")) if result is not None: - result = CGWrapper(result, pre="let mut result: ", post=";") + result = CGWrapper(result, pre="let result: ", post=";") self.cgRoot.prepend(result) if isFallible: From 077243caa7dfd4f130477f6d87262042ba9f4ce8 Mon Sep 17 00:00:00 2001 From: Ms2ger Date: Thu, 20 Mar 2014 21:14:28 +0100 Subject: [PATCH 7/7] Stop returning None from getRetvalDeclarationForType and update documentation. --- .../dom/bindings/codegen/CodegenRust.py | 20 +++++++------------ 1 file changed, 7 insertions(+), 13 deletions(-) diff --git a/src/components/script/dom/bindings/codegen/CodegenRust.py b/src/components/script/dom/bindings/codegen/CodegenRust.py index 61f3cbd8e24..7dea1ed3d6f 100644 --- a/src/components/script/dom/bindings/codegen/CodegenRust.py +++ b/src/components/script/dom/bindings/codegen/CodegenRust.py @@ -1195,13 +1195,11 @@ def typeNeedsCx(type, retVal=False): def memberIsCreator(member): return member.getExtendedAttribute("Creator") is not None -# Returns a tuple consisting of a CGThing containing the type of the return -# value, or None if there is no need for a return value, and a boolean signaling -# whether the return value is passed in an out parameter. +# Returns a CGThing containing the type of the return value. def getRetvalDeclarationForType(returnType, descriptorProvider): if returnType is None or returnType.isVoid(): # Nothing to declare - return None + return CGGeneric("()") if returnType.isPrimitive() and returnType.tag() in builtinNames: result = CGGeneric(builtinNames[returnType.tag()]) if returnType.nullable(): @@ -2426,19 +2424,16 @@ class CGCallGenerator(CGThing): call = CGList([call, CGWrapper(args, pre="(", post=");")]) if isFallible: - self.cgRoot.prepend(CGWrapper(result if result is not None else CGGeneric("()"), + self.cgRoot.prepend(CGWrapper(result, pre="let result_fallible: Result<", post=",Error>;")) - if result is not None: - result = CGWrapper(result, pre="let result: ", post=";") - self.cgRoot.prepend(result) + result = CGWrapper(result, pre="let result: ", post=";") + self.cgRoot.prepend(result) if isFallible: call = CGWrapper(call, pre="result_fallible = ") - elif result is not None: - call = CGWrapper(call, pre="result = ") else: - call = CGWrapper(call, pre="let _: () = ") + call = CGWrapper(call, pre="result = ") call = CGWrapper(call) self.cgRoot.append(call) @@ -2447,8 +2442,7 @@ class CGCallGenerator(CGThing): self.cgRoot.append(CGGeneric("if result_fallible.is_err() {")) self.cgRoot.append(CGIndenter(errorReport)) self.cgRoot.append(CGGeneric("}")) - if result is not None: - self.cgRoot.append(CGGeneric("result = result_fallible.unwrap();")) + self.cgRoot.append(CGGeneric("result = result_fallible.unwrap();")) def define(self): return self.cgRoot.define()