diff options
Diffstat (limited to 'src/components/script/dom/bindings/codegen/CodegenRust.py')
-rw-r--r-- | src/components/script/dom/bindings/codegen/CodegenRust.py | 46 |
1 files changed, 22 insertions, 24 deletions
diff --git a/src/components/script/dom/bindings/codegen/CodegenRust.py b/src/components/script/dom/bindings/codegen/CodegenRust.py index 8cf3766619b..6fa9fd2ff88 100644 --- a/src/components/script/dom/bindings/codegen/CodegenRust.py +++ b/src/components/script/dom/bindings/codegen/CodegenRust.py @@ -794,7 +794,6 @@ def getJSToNativeConversionTemplate(type, descriptorProvider, failureCode=None, assert not isOptional typeName = CGDictionary.makeDictionaryName(type.inner) - selfRef = "${declName}" declType = CGGeneric(typeName) @@ -806,10 +805,10 @@ def getJSToNativeConversionTemplate(type, descriptorProvider, failureCode=None, else: val = "${val}" - template = ("%s = %s::new();\n" - "if %s.Init(cx, %s) == 0 {\n" - " return 0;\n" - "}" % (selfRef, typeName, selfRef, val)) + template = ("${declName} = match %s::new(cx, %s) {\n" + " Ok(dictionary) => dictionary,\n" + " Err(_) => return 0,\n" + "};" % (typeName, val)) return (template, declType, None, False, None) @@ -4143,7 +4142,9 @@ class CGDictionary(CGThing): descriptorProvider, isMember=True, isOptional=(not member.defaultValue), - defaultValue=member.defaultValue)) + defaultValue=member.defaultValue, + failureCode="return Err(());", + exceptionCode="return Err(());")) for member in dictionary.members ] def define(self): @@ -4172,10 +4173,11 @@ class CGDictionary(CGThing): def impl(self): d = self.dictionary if d.parent: - initParent = ("// Per spec, we init the parent's members first\n" - "if self.parent.Init(cx, val) == 0 {\n" - " return 0;\n" - "}\n") + initParent = ("parent: match %s::%s::new(cx, val) {\n" + " Ok(parent) => parent,\n" + " Err(_) => return Err(()),\n" + "},\n") % (self.makeModuleName(d.parent), + self.makeClassName(d.parent)) else: initParent = "" @@ -4196,27 +4198,23 @@ class CGDictionary(CGThing): return string.Template( "impl ${selfName} {\n" - " pub fn new() -> ${selfName} {\n" - " ${selfName} {\n" + - ((" parent: %s::%s::new(),\n" % (self.makeModuleName(d.parent), - self.makeClassName(d.parent))) if d.parent else "") + + " pub fn new(cx: *JSContext, val: JSVal) -> Result<${selfName}, ()> {\n" + " let mut result = ${selfName} {\n" + "${initParent}" + "\n".join(" %s: %s," % (self.makeMemberName(m[0].identifier.name), defaultValue(self.getMemberType(m))) for m in self.memberInfo) + "\n" - " }\n" - " }\n" + " };\n" "\n" - " pub fn Init(&mut self, cx: *JSContext, val: JSVal) -> JSBool {\n" " unsafe {\n" - "${initParent}" " let mut found: JSBool = 0;\n" " let temp: JSVal = NullValue();\n" " let isNull = val.is_null_or_undefined();\n" " if !isNull && val.is_primitive() {\n" - " return 0; //XXXjdm throw properly here\n" + " return Err(()); //XXXjdm throw properly here\n" " //return Throw(cx, NS_ERROR_XPC_BAD_CONVERT_JS);\n" " }\n" "\n" "${initMembers}\n" - " return 1;\n" + " Ok(result)\n" " }\n" " }\n" "}").substitute({ @@ -4255,7 +4253,7 @@ class CGDictionary(CGThing): holderType, dealWithOptional, initialValue)) = memberInfo replacements = { "val": "temp", "valPtr": "&temp", - "declName": ("self.%s" % self.makeMemberName(member.identifier.name)), + "declName": ("result.%s" % self.makeMemberName(member.identifier.name)), # We need a holder name for external interfaces, but # it's scoped down to the conversion so we can just use # anything we want. @@ -4282,13 +4280,13 @@ class CGDictionary(CGThing): conversion = ("if isNull {\n" " found = 0;\n" "} else if ${propCheck} == 0 {\n" - " return 0;\n" + " return Err(());\n" "}\n") if member.defaultValue: conversion += ( "if found != 0 {\n" " if ${propGet} == 0 {\n" - " return 0;\n" + " return Err(());\n" " }\n" "}\n" "${convert}") @@ -4297,7 +4295,7 @@ class CGDictionary(CGThing): "if found != 0 {\n" " ${prop}.Construct();\n" " if ${propGet} == 0 {\n" - " return 0;\n" + " return Err(());\n" " }\n" "${convert}\n" "}") |